Merge "Better pageprops API example"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 24 Apr 2015 13:43:59 +0000 (13:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 24 Apr 2015 13:43:59 +0000 (13:43 +0000)
546 files changed:
CREDITS
HISTORY
RELEASE-NOTES-1.25
RELEASE-NOTES-1.26 [new file with mode: 0644]
api.php
api.php5
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
img_auth.php5
includes/Block.php
includes/ChangeTags.php [deleted file]
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Html.php
includes/Import.php
includes/MediaWiki.php
includes/Message.php
includes/MessageBlobStore.php [deleted file]
includes/OutputPage.php
includes/PHPVersionError.php
includes/Preferences.php
includes/ProtectionForm.php
includes/RevisionList.php
includes/Setup.php
includes/SiteStats.php
includes/Title.php
includes/User.php
includes/WatchedItem.php
includes/WebStart.php
includes/ZhConversion.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RevisiondeleteAction.php
includes/actions/SpecialPageAction.php [new file with mode: 0644]
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiContinuationManager.php [new file with mode: 0644]
includes/api/ApiCreateAccount.php
includes/api/ApiEditPage.php
includes/api/ApiErrorFormatter.php [new file with mode: 0644]
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDbg.php
includes/api/ApiFormatDump.php
includes/api/ApiFormatFeedWrapper.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiFormatRaw.php
includes/api/ApiFormatTxt.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php
includes/api/ApiMessage.php [new file with mode: 0644]
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryORM.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRsd.php
includes/api/ApiSerializable.php [new file with mode: 0644]
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTag.php [new file with mode: 0644]
includes/api/ApiTokens.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/api/i18n/ast.json [new file with mode: 0644]
includes/api/i18n/ce.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/is.json [new file with mode: 0644]
includes/api/i18n/ja.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/mk.json
includes/api/i18n/nl.json
includes/api/i18n/oc.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/ta.json [new file with mode: 0644]
includes/api/i18n/uk.json
includes/api/i18n/yi.json [new file with mode: 0644]
includes/api/i18n/zh-hans.json
includes/cache/MessageBlobStore.php [new file with mode: 0644]
includes/cache/MessageCache.php
includes/changetags/ChangeTags.php [new file with mode: 0644]
includes/changetags/ChangeTagsList.php [new file with mode: 0644]
includes/changetags/ChangeTagsLogItem.php [new file with mode: 0644]
includes/changetags/ChangeTagsLogList.php [new file with mode: 0644]
includes/changetags/ChangeTagsRevisionItem.php [new file with mode: 0644]
includes/changetags/ChangeTagsRevisionList.php [new file with mode: 0644]
includes/content/ContentHandler.php
includes/content/TextContentHandler.php
includes/db/Database.php
includes/db/DatabasePostgres.php
includes/db/LoadBalancer.php
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/Shims.php
includes/debug/logger/monolog/Shims.php [new file with mode: 0644]
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/diff/DifferenceEngine.php
includes/eventrelayer/EventRelayer.php [new file with mode: 0755]
includes/eventrelayer/EventRelayerMCRD.php [new file with mode: 0755]
includes/exception/MWExceptionHandler.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/i18n/azb.json [new file with mode: 0644]
includes/installer/i18n/ce.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/hi.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/ne.json
includes/installer/i18n/pt-br.json
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/JobSpecification.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/libs/BufferingStatsdDataFactory.php
includes/libs/MapCacheLRU.php
includes/libs/MultiHttpClient.php
includes/libs/objectcache/BagOStuff.php
includes/logging/BlockLogFormatter.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogFormatter.php
includes/logging/MergeLogFormatter.php
includes/logging/MoveLogFormatter.php
includes/logging/PatrolLogFormatter.php
includes/logging/RightsLogFormatter.php
includes/logging/TagLogFormatter.php [new file with mode: 0644]
includes/logging/UploadLogFormatter.php [new file with mode: 0644]
includes/media/SVG.php
includes/mime.info
includes/mime.types
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/WANObjectCache.php [new file with mode: 0755]
includes/page/Article.php
includes/page/CategoryPage.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/profiler/SectionProfiler.php
includes/profiler/TransactionProfiler.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/skins/Skin.php
includes/skins/SkinFallbackTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialDiff.php
includes/specials/SpecialEditTags.php [new file with mode: 0644]
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMyLanguage.php
includes/specials/SpecialMyRedirectPages.php
includes/specials/SpecialPermanentLink.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWhatlinkshere.php
index.php5
jsduck.json
languages/Language.php
languages/Names.php
languages/i18n/ace.json
languages/i18n/aeb-arab.json [new file with mode: 0644]
languages/i18n/aeb-latn.json [new file with mode: 0644]
languages/i18n/aeb.json [deleted file]
languages/i18n/af.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/awa.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/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/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/kk-cyrl.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/lb.json
languages/i18n/li.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/oc.json
languages/i18n/or.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/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rup.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/ses.json
languages/i18n/si.json
languages/i18n/sl.json
languages/i18n/so.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/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/tyv.json
languages/i18n/uk.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-tw.json
languages/messages/MessagesAeb.php
languages/messages/MessagesAeb_arab.php [new file with mode: 0644]
languages/messages/MessagesAzb.php
languages/messages/MessagesBgn.php
languages/messages/MessagesCe.php
languages/messages/MessagesEn.php
languages/messages/MessagesFa.php
languages/messages/MessagesLrc.php
languages/messages/MessagesUdm.php
load.php5
maintenance/Maintenance.php
maintenance/archives/patch-il_from_namespace.sql
maintenance/archives/patch-pl_from_namespace.sql
maintenance/archives/patch-tl_from_namespace.sql
maintenance/checkImages.php
maintenance/checkUsernames.php
maintenance/cleanupUploadStash.php
maintenance/convertExtensionToRegistration.php
maintenance/jsduck/categories.json
maintenance/language/zhtable/Makefile.py
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/simpphrases.manual
maintenance/language/zhtable/simpphrases_exclude.manual
maintenance/language/zhtable/symme_supp.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/trad2simp_noconvert.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/mergeMessageFileList.php
maintenance/populateBloomCache.php [deleted file]
maintenance/runJobs.php
maintenance/showJobs.php
maintenance/tables.sql
maintenance/update.php
opensearch_desc.php5
profileinfo.php5
resources/Resources.php
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/cu.json
resources/lib/oojs-ui/i18n/hsb.json
resources/lib/oojs-ui/i18n/or.json
resources/lib/oojs-ui/i18n/zh-hans.json
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-alerts.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-content.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-advanced.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-core.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-list.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-styling.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-interactions.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-layout.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-location.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-media.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-moderation.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-movement.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-user.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-wikimedia.css
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/history.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.svg [new file with mode: 0644]
resources/src/dom-level2-skip.js [new file with mode: 0644]
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.language/specialcharacters.json
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js [new file with mode: 0644]
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js [new file with mode: 0644]
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.edittags.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.edittags.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.version.css
resources/src/mediawiki/mediawiki.apihelp.css
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/polyfill-nodeTypes.js [new file with mode: 0644]
tests/TestsAutoLoader.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/actions/ActionTest.php
tests/phpunit/includes/api/ApiContinuationManagerTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiMessageTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiResultTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/MockApi.php
tests/phpunit/includes/api/MockApiQueryBase.php
tests/phpunit/includes/api/format/ApiFormatDbgTest.php
tests/phpunit/includes/api/format/ApiFormatDumpTest.php
tests/phpunit/includes/api/format/ApiFormatJsonTest.php
tests/phpunit/includes/api/format/ApiFormatNoneTest.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/format/ApiFormatTestBase.php
tests/phpunit/includes/api/format/ApiFormatTxtTest.php
tests/phpunit/includes/api/format/ApiFormatWddxTest.php
tests/phpunit/includes/api/format/ApiFormatXmlTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/deferred/SearchUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/file/LocalFileTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/objectcache/WANObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/utils/IPTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/mocks/content/DummyContentForTesting.php [new file with mode: 0644]
tests/phpunit/mocks/content/DummyContentHandlerForTesting.php [new file with mode: 0644]
tests/phpunit/mocks/content/DummyNonTextContent.php [new file with mode: 0644]
tests/phpunit/mocks/content/DummyNonTextContentHandler.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
thumb.php5
thumb_handler.php5

diff --git a/CREDITS b/CREDITS
index f58fabb..7725034 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.25 is a collaborative project released under the
+MediaWiki 1.26 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
@@ -56,6 +56,7 @@ following names for their contribution to the product.
 * Marius Hoch
 * Matěj Grabovský
 * Matt Johnston
+* Matthew Flaschen
 * Max Semenik
 * Meno25
 * MinuteElectron
@@ -84,6 +85,7 @@ following names for their contribution to the product.
 * Soxred93
 * SQL
 * Szymon Świerkosz
+* This, that and the other
 * Thomas Bleher
 * Thomas Gries
 * Tim Starling
diff --git a/HISTORY b/HISTORY
index 6ea5c2e..0cf6b08 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,4 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.25.
+Change notes from older releases. For current info see RELEASE-NOTES-1.26.
 
 == MediaWiki 1.24 ==
 
index 1ec8b93..9d8487c 100644 (file)
@@ -94,8 +94,7 @@ production.
 * 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.
+  tags.
 * Added 'managetags' user right and 'ChangeTagCanCreate', 'ChangeTagCanDelete',
   and 'ChangeTagCanCreate' hooks to allow for managing user-modifiable change
   tags.
@@ -119,6 +118,16 @@ production.
   proper, published library, which is now tagged as v1.0.0.
 * A new message (defaulting to blank), 'editnotice-notext', can be shown to users
   when they are editing if no edit notices apply to the page being edited.
+* (T94536) You can now make the sitenotice appear to logged-in users only by
+  editing MediaWiki:Anonnotice and replacing its content with "". Setting it to
+  "-" (default) will continue disable it and fallback to MediaWiki:Sitenotice.
+* Modifying the tagging of a revision or log entry is now available via
+  Special:EditTags, generally accessed via the revision-deletion-like interface
+  on history pages and Special:Log is likely to be more useful.
+* Added 'applychangetags' and 'changetags' user rights.
+* (T35235) LogFormatter subclasses are now responsible for formatting the
+  parameters for API log event output. Extensions should implement the new
+  getParametersForApi() method in their log formatters.
 
 ==== External libraries ====
 * MediaWiki now requires certain external libraries to be installed. In the past
@@ -181,6 +190,7 @@ production.
   HTML validation.
 * $wgUseTidy is now set when parserTests are run with the tidy option to match
   output on wiki.
+* (T37472) update.php will purge ResourceLoader cache unless --nopurge is passed to it.
 
 === Action API changes in 1.25 ===
 * (T67403) XML tag highlighting is now only performed for formats
@@ -245,6 +255,22 @@ production.
   Title::userCan() via the API.
 * Default type param for query list=watchlist and list=recentchanges has
   been changed from all types (e.g. including 'external') to 'edit|new|log'.
+* Added formatversion to format=json, still experimental.
+* (T73020) Log event details are now always under a 'params' subkey for
+  list=logevents, and a 'logparams' subkey for list=watchlist and
+  list=recentchanges.
+* Log event details are changing formatting:
+  * block events now report flags as an array rather than as a comma-separated
+    list.
+  * patrol events now report the 'auto' flag as a boolean (absent/empty string
+    for BC formats) rather than as an integer.
+  * rights events now report the old and new group lists as arrays rather than
+    as comma-separated lists.
+  * merge events use new-style formatting.
+  * delete/event and delete/revision events use new-style formatting.
+* The root node and various other nodes will now always be an object in formats
+  such as json that distinguish between arrays and objects.
+  * Except for action=opensearch where the spec requires an array.
 
 === Action API internal changes in 1.25 ===
 * ApiHelp has been rewritten to support i18n and paginated HTML output.
@@ -282,6 +308,21 @@ production.
   the current request was sent with the 'callback' parameter (or any future
   method that breaks the same-origin policy).
 * Profiling methods in ApiBase are deprecated and no longer need to be called.
+* ApiResult was greatly overhauled. See inline documentation for details.
+* ApiResult will automatically convert objects to strings or arrays (depending
+  on whether a __toString() method exists on the object), and will refuse to
+  add unsupported value types.
+  * An informal interface, ApiSerializable, exists to override the default
+    object conversion.
+* ApiResult/ApiFormatBase "raw mode" is deprecated.
+* ApiFormatXml now assumes defaults and so on instead of throwing errors when
+  metadata isn't set.
+* (T35235) LogFormatter subclasses are now responsible for formatting log event
+  parameters for the API.
+* Many modules have changed result data formats. While this shouldn't affect
+  clients not using the experimental formatversion=2015, code using
+  ApiResult::getResultData() and not using ApiResult::transformForBC() may need
+  updating.
 * The following methods have been deprecated and may be removed in a future
   release:
   * ApiBase::getDescription
@@ -298,16 +339,33 @@ production.
   * ApiBase::profileDBIn
   * ApiBase::profileDBOut
   * ApiBase::getProfileDBTime
+  * ApiBase::getResultData
   * ApiFormatBase::setUnescapeAmps
   * ApiFormatBase::getWantsHelp
   * ApiFormatBase::setHelp
   * ApiFormatBase::formatHTML
   * ApiFormatBase::setBufferResult
   * ApiFormatBase::getDescription
+  * ApiFormatBase::getNeedsRawData
   * ApiMain::setHelp
   * ApiMain::reallyMakeHelpMsg
   * ApiMain::makeHelpMsgHeader
+  * ApiResult::setRawMode
+  * ApiResult::getIsRawMode
+  * ApiResult::getData
+  * ApiResult::setElement
+  * ApiResult::setContent
+  * ApiResult::setIndexedTagName_recursive
+  * ApiResult::setIndexedTagName_internal
+  * ApiResult::setParsedLimit
+  * ApiResult::beginContinuation
+  * ApiResult::setContinueParam
+  * ApiResult::setGeneratorContinueParam
+  * ApiResult::endContinuation
+  * ApiResult::size
+  * ApiResult::convertStatusToArray
   * ApiQueryImageInfo::getPropertyDescriptions
+  * ApiQueryLogEvents::addLogParams
 * The following classes have been deprecated and may be removed in a future
   release:
   * ApiQueryDeletedrevs
@@ -360,9 +418,6 @@ changes to languages because of Bugzilla reports.
   and getInternalLinkAttributes methods in Linker, and removed
   getExternalLinkAttributes method, which was deprecated in MediaWiki 1.18.
 * Removed Sites class, which was deprecated in 1.21 and replaced by SiteSQLStore.
-* The mw.api.getToken() method now uses action=query?meta=tokens. This will now
-  fail for custom tokens registered only via the deprecated ApiTokensGetTokenTypes
-  hook. The ApiQueryTokensRegisterTypes hook should be used for this to work.
 * Added wgRelevantArticleId to the client-side config, for use on special pages.
 * Deprecated the TitleIsCssOrJsPage hook. Superseded by the
   ContentHandlerDefaultModelFor hook since MediaWiki 1.21.
@@ -424,6 +479,22 @@ changes to languages because of Bugzilla reports.
   retrievedfrom, thisisdeleted, viewsourcelink, lastmodifiedat, laggedslavemode,
   protect-summary-cascade
 * All BloomCache related code has been removed. This was largely experimental.
+* $wgResourceModuleSkinStyles no longer supports per-module local or remote paths. They
+  can only be set for the entire skin.
+* Removed global function swap(). (deprecated since 1.24)
+* Deprecated the ".php5" file extension entry points. Refer to the ".php" files
+  instead. If you want ".php5" URLs to continue to work, set up redirects. In
+  Apache, this can be done by enabling mod_rewrite and adding the following
+  rules to your configuration:
+
+    RewriteEngine On
+    RewriteBase /
+    RewriteRule ^(.*)\.php5 $1.php [R=301,L]
+
+* The global importScriptURI and importStylesheetURI functions, as well as the
+  loadedScripts object, from wikibits.js (deprecated since 1.17) now emit
+  warnings through mw.log.warn when accessed.
+
 
 == Compatibility ==
 
diff --git a/RELEASE-NOTES-1.26 b/RELEASE-NOTES-1.26
new file mode 100644 (file)
index 0000000..9426635
--- /dev/null
@@ -0,0 +1,112 @@
+Security reminder: If you have PHP's register_globals option set, you must
+turn it off. MediaWiki will not work with it enabled.
+
+== MediaWiki 1.26 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.26 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.26 ===
+
+=== New features in 1.26 ===
+* Change tags can now be hidden in the interface by disabling the associated
+  "tag-<id>" interface message.
+
+==== External libraries ====
+
+=== Bug fixes in 1.26 ===
+
+=== Action API changes in 1.26 ===
+* API action=query&list=tags: The displayname can now be boolean false if the
+  tag is meant to be hidden from user interfaces.
+* action=import no longer allows both the namespace= and rootpage= parameters
+  to be set. If they are both set, the value of rootpage= will be ignored.
+
+=== Action API internal changes in 1.26 ===
+
+=== Languages updated in 1.26 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+
+=== Other changes in 1.26 ===
+* ChangeTags::tagDescription() will return false if the interface message
+  for the tag is disabled.
+* Added PageHistoryPager::doBatchLookups hook.
+* supportsDirectEditing and supportsDirectApiEditing methods added to
+ContentHandler, to provide a way for ApiEditPage and EditPage to check
+if direct editing of content is allowed. These methods return false,
+by default for the ContentHandler base class and true for TextContentHandler
+and it's derivative classes (everything in core). For Content types that
+do not support direct editing, an alternative mechanism should be provided
+for editing, such as action overrides or specific api modules.
+
+== Compatibility ==
+
+MediaWiki 1.26 requires PHP 5.3.3 or later. There is experimental support for
+HHVM 3.3.0.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+
+1.26 has several database changes since 1.25, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.25.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/api.php b/api.php
index 9212747..ea2f60a 100644 (file)
--- a/api.php
+++ b/api.php
@@ -61,7 +61,7 @@ if ( !$wgEnableAPI ) {
 
 // Set a dummy $wgTitle, because $wgTitle == null breaks various things
 // In a perfect world this wouldn't be necessary
-$wgTitle = Title::makeTitle( NS_MAIN, 'API' );
+$wgTitle = Title::makeTitle( NS_SPECIAL, 'Badtitle/dummy title for API calls set in api.php' );
 
 // RequestContext will read from $wgTitle, but it will also whine about it.
 // In a perfect world this wouldn't be necessary either.
index 524dfd5..7512cde 100644 (file)
--- a/api.php5
+++ b/api.php5
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './api.php';
index d646a0e..754b1bb 100644 (file)
@@ -21,11 +21,14 @@ $wgAutoloadLocalClasses = array(
        'ApiCheckToken' => __DIR__ . '/includes/api/ApiCheckToken.php',
        'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
        'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
+       'ApiContinuationManager' => __DIR__ . '/includes/api/ApiContinuationManager.php',
        'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
        'ApiDelete' => __DIR__ . '/includes/api/ApiDelete.php',
        'ApiDisabled' => __DIR__ . '/includes/api/ApiDisabled.php',
        'ApiEditPage' => __DIR__ . '/includes/api/ApiEditPage.php',
        'ApiEmailUser' => __DIR__ . '/includes/api/ApiEmailUser.php',
+       'ApiErrorFormatter' => __DIR__ . '/includes/api/ApiErrorFormatter.php',
+       'ApiErrorFormatter_BackCompat' => __DIR__ . '/includes/api/ApiErrorFormatter.php',
        'ApiExpandTemplates' => __DIR__ . '/includes/api/ApiExpandTemplates.php',
        'ApiFeedContributions' => __DIR__ . '/includes/api/ApiFeedContributions.php',
        'ApiFeedRecentChanges' => __DIR__ . '/includes/api/ApiFeedRecentChanges.php',
@@ -53,6 +56,7 @@ $wgAutoloadLocalClasses = array(
        'ApiLogout' => __DIR__ . '/includes/api/ApiLogout.php',
        'ApiMain' => __DIR__ . '/includes/api/ApiMain.php',
        'ApiManageTags' => __DIR__ . '/includes/api/ApiManageTags.php',
+       'ApiMessage' => __DIR__ . '/includes/api/ApiMessage.php',
        'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
        'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
        'ApiOpenSearch' => __DIR__ . '/includes/api/ApiOpenSearch.php',
@@ -118,12 +122,15 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryUsers' => __DIR__ . '/includes/api/ApiQueryUsers.php',
        'ApiQueryWatchlist' => __DIR__ . '/includes/api/ApiQueryWatchlist.php',
        'ApiQueryWatchlistRaw' => __DIR__ . '/includes/api/ApiQueryWatchlistRaw.php',
+       'ApiRawMessage' => __DIR__ . '/includes/api/ApiMessage.php',
        'ApiResult' => __DIR__ . '/includes/api/ApiResult.php',
        'ApiRevisionDelete' => __DIR__ . '/includes/api/ApiRevisionDelete.php',
        'ApiRollback' => __DIR__ . '/includes/api/ApiRollback.php',
        'ApiRsd' => __DIR__ . '/includes/api/ApiRsd.php',
+       'ApiSerializable' => __DIR__ . '/includes/api/ApiSerializable.php',
        'ApiSetNotificationTimestamp' => __DIR__ . '/includes/api/ApiSetNotificationTimestamp.php',
        'ApiStashEdit' => __DIR__ . '/includes/api/ApiStashEdit.php',
+       'ApiTag' => __DIR__ . '/includes/api/ApiTag.php',
        'ApiTokens' => __DIR__ . '/includes/api/ApiTokens.php',
        'ApiUnblock' => __DIR__ . '/includes/api/ApiUnblock.php',
        'ApiUndelete' => __DIR__ . '/includes/api/ApiUndelete.php',
@@ -198,7 +205,12 @@ $wgAutoloadLocalClasses = array(
        'CdbWriter' => __DIR__ . '/includes/CdbCompat.php',
        'CgzCopyTransaction' => __DIR__ . '/maintenance/storage/recompressTracked.php',
        'ChangePassword' => __DIR__ . '/maintenance/changePassword.php',
-       'ChangeTags' => __DIR__ . '/includes/ChangeTags.php',
+       'ChangeTags' => __DIR__ . '/includes/changetags/ChangeTags.php',
+       'ChangeTagsList' => __DIR__ . '/includes/changetags/ChangeTagsList.php',
+       'ChangeTagsLogItem' => __DIR__ . '/includes/changetags/ChangeTagsLogItem.php',
+       'ChangeTagsLogList' => __DIR__ . '/includes/changetags/ChangeTagsLogList.php',
+       'ChangeTagsRevisionItem' => __DIR__ . '/includes/changetags/ChangeTagsRevisionItem.php',
+       'ChangeTagsRevisionList' => __DIR__ . '/includes/changetags/ChangeTagsRevisionList.php',
        'ChangesFeed' => __DIR__ . '/includes/changes/ChangesFeed.php',
        'ChangesList' => __DIR__ . '/includes/changes/ChangesList.php',
        'ChangesListSpecialPage' => __DIR__ . '/includes/specialpage/ChangesListSpecialPage.php',
@@ -370,6 +382,9 @@ $wgAutoloadLocalClasses = array(
        'EnqueueJob' => __DIR__ . '/includes/jobqueue/jobs/EnqueueJob.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'EventRelayer' => __DIR__ . '/includes/eventrelayer/EventRelayer.php',
+       'EventRelayerMCRD' => __DIR__ . '/includes/eventrelayer/EventRelayerMCRD.php',
+       'EventRelayerNull' => __DIR__ . '/includes/eventrelayer/EventRelayer.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
        'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
        'ExplodeIterator' => __DIR__ . '/includes/libs/ExplodeIterator.php',
@@ -510,6 +525,7 @@ $wgAutoloadLocalClasses = array(
        'Http' => __DIR__ . '/includes/HttpFunctions.php',
        'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
        'HttpStatus' => __DIR__ . '/includes/libs/HttpStatus.php',
+       'IApiMessage' => __DIR__ . '/includes/api/ApiMessage.php',
        'ICacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
        'IContextSource' => __DIR__ . '/includes/context/IContextSource.php',
        'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php',
@@ -698,11 +714,11 @@ $wgAutoloadLocalClasses = array(
        'MWLoggerFactory' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/Shims.php',
-       'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/Shims.php',
-       'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/Shims.php',
-       'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/Shims.php',
-       'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
-       'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
+       'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
+       'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
+       'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
+       'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/Shims.php',
        'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
@@ -757,7 +773,7 @@ $wgAutoloadLocalClasses = array(
        'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
        'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
        'Message' => __DIR__ . '/includes/Message.php',
-       'MessageBlobStore' => __DIR__ . '/includes/MessageBlobStore.php',
+       'MessageBlobStore' => __DIR__ . '/includes/cache/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
        'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
        'MessageSpecifier' => __DIR__ . '/includes/libs/MessageSpecifier.php',
@@ -886,7 +902,6 @@ $wgAutoloadLocalClasses = array(
        'PoolCounter_Stub' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
        'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
        'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
-       'PopulateBloomFilter' => __DIR__ . '/maintenance/populateBloomCache.php',
        'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
        'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
        'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
@@ -1103,6 +1118,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialContributions' => __DIR__ . '/includes/specials/SpecialContributions.php',
        'SpecialCreateAccount' => __DIR__ . '/includes/specials/SpecialCreateAccount.php',
        'SpecialDiff' => __DIR__ . '/includes/specials/SpecialDiff.php',
+       'SpecialEditTags' => __DIR__ . '/includes/specials/SpecialEditTags.php',
        'SpecialEditWatchlist' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
        'SpecialEmailUser' => __DIR__ . '/includes/specials/SpecialEmailuser.php',
        'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php',
@@ -1126,6 +1142,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialNewFiles' => __DIR__ . '/includes/specials/SpecialNewimages.php',
        'SpecialNewpages' => __DIR__ . '/includes/specials/SpecialNewpages.php',
        'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php',
+       'SpecialPageAction' => __DIR__ . '/includes/actions/SpecialPageAction.php',
        'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
        'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
        'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
@@ -1195,6 +1212,7 @@ $wgAutoloadLocalClasses = array(
        'TableCleanupTest' => __DIR__ . '/maintenance/cleanupTable.inc',
        'TableDiffFormatter' => __DIR__ . '/includes/diff/TableDiffFormatter.php',
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
+       'TagLogFormatter' => __DIR__ . '/includes/logging/TagLogFormatter.php',
        'TempFSFile' => __DIR__ . '/includes/filebackend/TempFSFile.php',
        'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
        'TemplateParser' => __DIR__ . '/includes/TemplateParser.php',
@@ -1261,6 +1279,7 @@ $wgAutoloadLocalClasses = array(
        'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
        'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
        'UploadFromUrlJob' => __DIR__ . '/includes/jobqueue/jobs/UploadFromUrlJob.php',
+       'UploadLogFormatter' => __DIR__ . '/includes/logging/UploadLogFormatter.php',
        'UploadSourceAdapter' => __DIR__ . '/includes/Import.php',
        'UploadSourceField' => __DIR__ . '/includes/specials/SpecialUpload.php',
        'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
@@ -1297,6 +1316,7 @@ $wgAutoloadLocalClasses = array(
        'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
        'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
        'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
+       'WANObjectCache' => __DIR__ . '/includes/objectcache/WANObjectCache.php',
        'WaitForSlave' => __DIR__ . '/maintenance/waitForSlave.php',
        'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
        'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
index 88ee9cf..4ea8a4e 100644 (file)
@@ -20,7 +20,7 @@
                "ext-iconv": "*",
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.12",
-               "oojs/oojs-ui": "0.9.7",
+               "oojs/oojs-ui": "0.10.0",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
index dd35d05..d1b982c 100644 (file)
@@ -8,6 +8,10 @@
                        "description": "The extension's canonical name.",
                        "required": true
                },
+               "namemsg": {
+                       "type": "string",
+                       "description": "i18n message key of the extension's name."
+               },
                "type": {
                        "type": "string",
                        "description": "The extension's type, as an index to $wgExtensionCredits.",
                                }
                        }
                },
+               "ResourceModuleSkinStyles": {
+                       "type": "object",
+                       "description": "ResourceLoader modules for custom skin styles"
+               },
                "ResourceLoaderSources": {
                        "type": "object",
                        "description": "ResourceLoader sources to register"
index 877b7ed..6f59b2d 100644 (file)
@@ -2112,6 +2112,13 @@ constructed.
 $pager: the pager
 $queryInfo: the query parameters
 
+'PageHistoryPager::doBatchLookups': Called after the pager query was run, before
+any output is generated, to allow batch lookups for prefetching information
+needed for display. If the hook handler returns false, the regular behavior of
+doBatchLookups() is skipped.
+$pager: the PageHistoryPager
+$result: a ResultWrapper representing the query result
+
 'PageRenderingHash': Alter the parser cache option hash key. A parser extension
 which depends on user options should install this hook and append its values to
 the key.
index 7aee69a..456c4f2 100644 (file)
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './img_auth.php';
index 4698f45..7666751 100644 (file)
@@ -122,11 +122,7 @@ class Block {
                $this->mAuto = $auto;
                $this->isHardblock( !$anonOnly );
                $this->prevents( 'createaccount', $createAccount );
-               if ( $expiry == 'infinity' || $expiry == wfGetDB( DB_SLAVE )->getInfinity() ) {
-                       $this->mExpiry = 'infinity';
-               } else {
-                       $this->mExpiry = wfTimestamp( TS_MW, $expiry );
-               }
+               $this->mExpiry = wfGetDB( DB_SLAVE )->decodeExpiry( $expiry );
                $this->isAutoblocking( $enableAutoblock );
                $this->mHideName = $hideName;
                $this->prevents( 'sendemail', $blockEmail );
@@ -379,12 +375,7 @@ class Block {
                $this->mParentBlockId = $row->ipb_parent_block_id;
 
                // I wish I didn't have to do this
-               $db = wfGetDB( DB_SLAVE );
-               if ( $row->ipb_expiry == $db->getInfinity() ) {
-                       $this->mExpiry = 'infinity';
-               } else {
-                       $this->mExpiry = wfTimestamp( TS_MW, $row->ipb_expiry );
-               }
+               $this->mExpiry = wfGetDB( DB_SLAVE )->decodeExpiry( $row->ipb_expiry );
 
                $this->isHardblock( !$row->ipb_anon_only );
                $this->isAutoblocking( $row->ipb_enable_autoblock );
@@ -442,21 +433,40 @@ class Block {
                        $dbw = wfGetDB( DB_MASTER );
                }
 
-               # Don't collide with expired blocks
-               Block::purgeExpired();
+               # Periodic purge via commit hooks
+               if ( mt_rand( 0, 9 ) == 0 ) {
+                       Block::purgeExpired();
+               }
 
                $row = $this->getDatabaseArray();
                $row['ipb_id'] = $dbw->nextSequenceValue( "ipblocks_ipb_id_seq" );
 
-               $dbw->insert(
-                       'ipblocks',
-                       $row,
-                       __METHOD__,
-                       array( 'IGNORE' )
-               );
+               $dbw->insert( 'ipblocks', $row, __METHOD__, array( 'IGNORE' ) );
                $affected = $dbw->affectedRows();
                $this->mId = $dbw->insertId();
 
+               # Don't collide with expired blocks.
+               # Do this after trying to insert to avoid locking.
+               if ( !$affected ) {
+                       # T96428: The ipb_address index uses a prefix on a field, so
+                       # use a standard SELECT + DELETE to avoid annoying gap locks.
+                       $ids = $dbw->selectFieldValues( 'ipblocks',
+                               'ipb_id',
+                               array(
+                                       'ipb_address' => $row['ipb_address'],
+                                       'ipb_user' => $row['ipb_user'],
+                                       'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() )
+                               ),
+                               __METHOD__
+                       );
+                       if ( $ids ) {
+                               $dbw->delete( 'ipblocks', array( 'ipb_id' => $ids ), __METHOD__ );
+                               $dbw->insert( 'ipblocks', $row, __METHOD__, array( 'IGNORE' ) );
+                               $affected = $dbw->affectedRows();
+                               $this->mId = $dbw->insertId();
+                       }
+               }
+
                if ( $affected ) {
                        $auto_ipd_ids = $this->doRetroactiveAutoblock();
                        return array( 'id' => $this->mId, 'autoIds' => $auto_ipd_ids );
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
deleted file mode 100644 (file)
index d597d6d..0000000
+++ /dev/null
@@ -1,889 +0,0 @@
-<?php
-/**
- * Recent changes tagging.
- *
- * 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 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
-        *
-        * @param string $tags Comma-separated list of tags
-        * @param string $page A label for the type of action which is being displayed,
-        *   for example: 'history', 'contributions' or 'newpages'
-        * @return array Array with two items: (html, classes)
-        *   - html: String: HTML for displaying the tags (empty string when param $tags is empty)
-        *   - classes: Array of strings: CSS classes used in the generated html, one class for each tag
-        */
-       public static function formatSummaryRow( $tags, $page ) {
-               global $wgLang;
-
-               $tags = explode( ',', $tags );
-
-               // XXX(Ori Livneh, 2014-11-08): remove once bug 73181 is resolved.
-               $tags = array_diff( $tags, array( 'HHVM', '' ) );
-
-               if ( !$tags ) {
-                       return array( '', array() );
-               }
-
-               $classes = array();
-
-               $displayTags = array();
-               foreach ( $tags as $tag ) {
-                       $displayTags[] = Xml::tags(
-                               'span',
-                               array( 'class' => 'mw-tag-marker ' .
-                                                               Sanitizer::escapeClass( "mw-tag-marker-$tag" ) ),
-                               self::tagDescription( $tag )
-                       );
-                       $classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
-               }
-               $markers = wfMessage( 'tag-list-wrapper' )
-                       ->numParams( count( $displayTags ) )
-                       ->rawParams( $wgLang->commaList( $displayTags ) )
-                       ->parse();
-               $markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
-
-               return array( $markers, $classes );
-       }
-
-       /**
-        * Get a short description for a tag
-        *
-        * @param string $tag Tag
-        *
-        * @return string Short description of the tag from "mediawiki:tag-$tag" if this message exists,
-        *   html-escaped version of $tag otherwise
-        */
-       public static function tagDescription( $tag ) {
-               $msg = wfMessage( "tag-$tag" );
-               return $msg->exists() ? $msg->parse() : htmlspecialchars( $tag );
-       }
-
-       /**
-        * Add tags to a change given its rc_id, rev_id and/or log_id
-        *
-        * @param string|array $tags Tags to add to the change
-        * @param int|null $rc_id The rc_id of the change to add the tags to
-        * @param int|null $rev_id The rev_id of the change to add the tags to
-        * @param int|null $log_id The log_id of the change to add the tags to
-        * @param string $params Params to put in the ct_params field of table 'change_tag'
-        *
-        * @throws MWException
-        * @return bool False if no changes are made, otherwise true
-        *
-        * @exception MWException When $rc_id, $rev_id and $log_id are all null
-        */
-       public static function addTags( $tags, $rc_id = null, $rev_id = null,
-               $log_id = null, $params = null
-       ) {
-               if ( !is_array( $tags ) ) {
-                       $tags = array( $tags );
-               }
-
-               $tags = array_filter( $tags ); // Make sure we're submitting all tags...
-
-               if ( !$rc_id && !$rev_id && !$log_id ) {
-                       throw new MWException( 'At least one of: RCID, revision ID, and log ID MUST be ' .
-                               'specified when adding a tag to a change!' );
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Might as well look for rcids and so on.
-               if ( !$rc_id ) {
-                       // Info might be out of date, somewhat fractionally, on slave.
-                       if ( $log_id ) {
-                               $rc_id = $dbw->selectField(
-                                       'recentchanges',
-                                       'rc_id',
-                                       array( 'rc_logid' => $log_id ),
-                                       __METHOD__
-                               );
-                       } elseif ( $rev_id ) {
-                               $rc_id = $dbw->selectField(
-                                       'recentchanges',
-                                       'rc_id',
-                                       array( 'rc_this_oldid' => $rev_id ),
-                                       __METHOD__
-                               );
-                       }
-               } elseif ( !$log_id && !$rev_id ) {
-                       // Info might be out of date, somewhat fractionally, on slave.
-                       $log_id = $dbw->selectField(
-                               'recentchanges',
-                               'rc_logid',
-                               array( 'rc_id' => $rc_id ),
-                               __METHOD__
-                       );
-                       $rev_id = $dbw->selectField(
-                               'recentchanges',
-                               'rc_this_oldid',
-                               array( 'rc_id' => $rc_id ),
-                               __METHOD__
-                       );
-               }
-
-               $tsConds = array_filter( array(
-                       'ts_rc_id' => $rc_id,
-                       'ts_rev_id' => $rev_id,
-                       'ts_log_id' => $log_id )
-               );
-
-               // Update the summary row.
-               // $prevTags can be out of date on slaves, especially when addTags is called consecutively,
-               // causing loss of tags added recently in tag_summary table.
-               $prevTags = $dbw->selectField( 'tag_summary', 'ts_tags', $tsConds, __METHOD__ );
-               $prevTags = $prevTags ? $prevTags : '';
-               $prevTags = array_filter( explode( ',', $prevTags ) );
-               $newTags = array_unique( array_merge( $prevTags, $tags ) );
-               sort( $prevTags );
-               sort( $newTags );
-
-               if ( $prevTags == $newTags ) {
-                       // No change.
-                       return false;
-               }
-
-               $dbw->replace(
-                       'tag_summary',
-                       array( 'ts_rev_id', 'ts_rc_id', 'ts_log_id' ),
-                       array_filter( array_merge( $tsConds, array( 'ts_tags' => implode( ',', $newTags ) ) ) ),
-                       __METHOD__
-               );
-
-               // Insert the tags rows.
-               $tagsRows = array();
-               foreach ( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
-                       $tagsRows[] = array_filter(
-                               array(
-                                       'ct_tag' => $tag,
-                                       'ct_rc_id' => $rc_id,
-                                       'ct_log_id' => $log_id,
-                                       'ct_rev_id' => $rev_id,
-                                       'ct_params' => $params
-                               )
-                       );
-               }
-
-               $dbw->insert( 'change_tag', $tagsRows, __METHOD__, array( 'IGNORE' ) );
-
-               self::purgeTagUsageCache();
-               return true;
-       }
-
-       /**
-        * Applies all tags-related changes to a query.
-        * Handles selecting tags, and filtering.
-        * Needs $tables to be set up properly, so we can figure out which join conditions to use.
-        *
-        * @param string|array $tables Table names, see DatabaseBase::select
-        * @param string|array $fields Fields used in query, see DatabaseBase::select
-        * @param string|array $conds Conditions used in query, see DatabaseBase::select
-        * @param array $join_conds Join conditions, see DatabaseBase::select
-        * @param array $options Options, see Database::select
-        * @param bool|string $filter_tag Tag to select on
-        *
-        * @throws MWException When unable to determine appropriate JOIN condition for tagging
-        */
-       public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
-                                                                               &$join_conds, &$options, $filter_tag = false ) {
-               global $wgRequest, $wgUseTagFilter;
-
-               if ( $filter_tag === false ) {
-                       $filter_tag = $wgRequest->getVal( 'tagfilter' );
-               }
-
-               // Figure out which conditions can be done.
-               if ( in_array( 'recentchanges', $tables ) ) {
-                       $join_cond = 'ct_rc_id=rc_id';
-               } elseif ( in_array( 'logging', $tables ) ) {
-                       $join_cond = 'ct_log_id=log_id';
-               } elseif ( in_array( 'revision', $tables ) ) {
-                       $join_cond = 'ct_rev_id=rev_id';
-               } elseif ( in_array( 'archive', $tables ) ) {
-                       $join_cond = 'ct_rev_id=ar_rev_id';
-               } else {
-                       throw new MWException( 'Unable to determine appropriate JOIN condition for tagging.' );
-               }
-
-               $fields['ts_tags'] = wfGetDB( DB_SLAVE )->buildGroupConcatField(
-                       ',', 'change_tag', 'ct_tag', $join_cond
-               );
-
-               if ( $wgUseTagFilter && $filter_tag ) {
-                       // Somebody wants to filter on a tag.
-                       // Add an INNER JOIN on change_tag
-
-                       $tables[] = 'change_tag';
-                       $join_conds['change_tag'] = array( 'INNER JOIN', $join_cond );
-                       $conds['ct_tag'] = $filter_tag;
-               }
-       }
-
-       /**
-        * Build a text box to select a change tag
-        *
-        * @param string $selected Tag to select by default
-        * @param bool $fullForm
-        *        - if false, then it returns an array of (label, form).
-        *        - if true, it returns an entire form around the selector.
-        * @param Title $title Title object to send the form to.
-        *        Used when, and only when $fullForm is true.
-        * @return string|array
-        *        - if $fullForm is false: Array with
-        *        - if $fullForm is true: String, html fragment
-        */
-       public static function buildTagFilterSelector( $selected = '',
-               $fullForm = false, Title $title = null
-       ) {
-               global $wgUseTagFilter;
-
-               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
-                       return $fullForm ? '' : array();
-               }
-
-               $data = array(
-                       Html::rawElement(
-                               'label',
-                               array( 'for' => 'tagfilter' ),
-                               wfMessage( 'tag-filter' )->parse()
-                       ),
-                       Xml::input(
-                               'tagfilter',
-                               20,
-                               $selected,
-                               array( 'class' => 'mw-tagfilter-input mw-ui-input mw-ui-input-inline', 'id' => 'tagfilter' )
-                       )
-               );
-
-               if ( !$fullForm ) {
-                       return $data;
-               }
-
-               $html = implode( '&#160;', $data );
-               $html .= "\n" .
-                       Xml::element(
-                               'input',
-                               array( 'type' => 'submit', 'value' => wfMessage( 'tag-filter-submit' )->text() )
-                       );
-               $html .= "\n" . Html::hidden( 'title', $title->getPrefixedText() );
-               $html = Xml::tags(
-                       'form',
-                       array( 'action' => $title->getLocalURL(), 'class' => 'mw-tagfilter-form', 'method' => 'get' ),
-                       $html
-               );
-
-               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.
-        * 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 listExplicitlyDefinedTags() {
-               // Caching...
-               global $wgMemc;
-               $key = wfMemcKey( 'valid-tags-db' );
-               $tags = $wgMemc->get( $key );
-               if ( $tags ) {
-                       return $tags;
-               }
-
-               $emptyTags = array();
-
-               // Some DB stuff
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'valid_tag', 'vt_tag', array(), __METHOD__ );
-               foreach ( $res as $row ) {
-                       $emptyTags[] = $row->vt_tag;
-               }
-
-               $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.
-               $wgMemc->set( $key, $emptyTags, 300 );
-               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 );
-               $res = $dbr->select(
-                       'change_tag',
-                       array( 'ct_tag', 'hitcount' => 'count(*)' ),
-                       array(),
-                       __METHOD__,
-                       array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
-               );
-
-               foreach ( $res as $row ) {
-                       $out[$row->ct_tag] = $row->hitcount;
-               }
-               foreach ( self::listDefinedTags() as $tag ) {
-                       if ( !isset( $out[$tag] ) ) {
-                               $out[$tag] = 0;
-                       }
-               }
-
-               // Cache for a very short time
-               $wgMemc->set( $key, $out, 300 );
-               return $out;
-       }
-}
index fe67adf..25f6206 100644 (file)
@@ -75,7 +75,7 @@ $wgConfigRegistry = array(
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.25alpha';
+$wgVersion = '1.26alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -1855,13 +1855,6 @@ $wgDBerrorLog = false;
  */
 $wgDBerrorLogTZ = false;
 
-/**
- * Scale load balancer polling time so that under overload conditions, the
- * database server receives a SHOW STATUS query at an average interval of this
- * many microseconds
- */
-$wgDBAvgStatusPoll = 2000;
-
 /**
  * Set to true to engage MySQL 4.1/5.0 charset-related features;
  * for now will just cause sending of 'SET NAMES=utf8' on connect.
@@ -2068,8 +2061,8 @@ $wgCacheDirectory = false;
 
 /**
  * Main cache type. This should be a cache with fast access, but it may have
- * limited space. By default, it is disabled, since the database is not fast
- * enough to make it worthwhile.
+ * limited space. By default, it is disabled, since the stock database cache
+ * is not fast enough to make it worthwhile.
  *
  * The options are:
  *
@@ -2147,6 +2140,50 @@ $wgObjectCaches = array(
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
+/**
+ * Main cache Wide-Area-Network cache type. This should be a cache with fast access,
+ * but it may have limited space. By default, it is disabled, since the basic stock
+ * cache is not fast enough to make it worthwhile. For single data-center setups, this can
+ * simply be pointed to a cache in $wgWANObjectCaches that uses a local $wgObjectCaches
+ * cache with a relayer of type EventRelayerNull.
+ *
+ * The options are:
+ *   - CACHE_NONE:       Do not cache
+ *   - (other):          A string may be used which identifies a cache
+ *                       configuration in $wgWANObjectCaches.
+ */
+$wgMainWANCache = CACHE_NONE;
+
+/**
+ * Advanced WAN object cache configuration.
+ *
+ * Each WAN cache wraps a registered object cache (for the local cluster)
+ * and it must also be configured to point to a PubSub instance. Subscribers
+ * must be configured to relay purges to the actual cache servers.
+ *
+ * The format is an associative array where the key is a cache identifier, and
+ * the value is an associative array of parameters. The "cacheId" parameter is
+ * a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
+ * array used to construct an EventRelayer object. The "pool" parameter is a
+ * string that is used as a PubSub channel prefix.
+ */
+$wgWANObjectCaches = array(
+       CACHE_NONE => array(
+               'class'         => 'WANObjectCache',
+               'pool'          => 'mediawiki-main-none',
+               'cacheId'       => CACHE_NONE,
+               'relayerConfig' => array( 'class' => 'EventRelayerNull' )
+       )
+       /* Example of a simple single data-center cache:
+       'memcached-php' => array(
+               'class'         => 'WANObjectCache',
+               'pool'          => 'mediawiki-main-memcached',
+               'cacheId'       => 'memcached-php',
+               'relayerConfig' => array( 'class' => 'EventRelayerNull' )
+       )
+       */
+);
+
 /**
  * The expiry time for the parser cache, in seconds.
  * The default is 86400 (one day).
@@ -3338,8 +3375,6 @@ $wgResourceModules = array();
  *
  * As with $wgResourceModules, paths default to being relative to the MediaWiki root.
  * You should always provide a localBasePath and remoteBasePath (or remoteExtPath/remoteSkinPath).
- * Either for all skin styles at once (first example below) or for each module separately (second
- * example).
  *
  * @par Example:
  * @code
@@ -3349,19 +3384,6 @@ $wgResourceModules = array();
  *     'remoteSkinPath' => 'Foo',
  *     'localBasePath' => __DIR__,
  *   );
- *
- *   $wgResourceModuleSkinStyles['foo'] = array(
- *     'bar' => array(
- *       'bar.css',
- *       'remoteSkinPath' => 'Foo',
- *       'localBasePath' => __DIR__,
- *     ),
- *     'quux' => array(
- *       'quux.css',
- *       'remoteSkinPath' => 'Foo',
- *       'localBasePath' => __DIR__,
- *     ),
- *   );
  * @endcode
  */
 $wgResourceModuleSkinStyles = array();
@@ -4319,6 +4341,7 @@ $wgReservedUsernames = array(
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
+       'msg:spambot_username', // Used by cleanupSpam.php
 );
 
 /**
@@ -4578,6 +4601,8 @@ $wgGroupPermissions['user']['reupload-shared'] = true;
 $wgGroupPermissions['user']['minoredit'] = true;
 $wgGroupPermissions['user']['purge'] = true; // can use ?action=purge without clicking "ok"
 $wgGroupPermissions['user']['sendemail'] = true;
+$wgGroupPermissions['user']['applychangetags'] = true;
+$wgGroupPermissions['user']['changetags'] = true;
 
 // Implicit group for accounts that pass $wgAutoConfirmAge
 $wgGroupPermissions['autoconfirmed']['autoconfirmed'] = true;
@@ -5058,7 +5083,11 @@ $wgRateLimits = array(
                'newbie' => null,
                'ip' => null,
                'subnet' => null,
-       )
+       ),
+       'changetag' => array( // adding or removing change tags
+               'user' => null,
+               'newbie' => null,
+       ),
 );
 
 /**
@@ -6489,8 +6518,7 @@ $wgJobQueueAggregator = array(
  * Expensive Querypages are already updated.
  */
 $wgSpecialPageCacheUpdates = array(
-       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' ),
-       'Activeusers' => array( 'SpecialActiveUsers', 'cacheUpdate' ),
+       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' )
 );
 
 /**
@@ -6588,6 +6616,7 @@ $wgLogTypes = array(
        'patrol',
        'merge',
        'suppress',
+       'tag',
        'managetags',
 );
 
@@ -6625,7 +6654,8 @@ $wgLogRestrictions = array(
  * for the link text.
  */
 $wgFilterLogTypes = array(
-       'patrol' => true
+       'patrol' => true,
+       'tag' => true,
 );
 
 /**
@@ -6688,7 +6718,7 @@ $wgLogActions = array(
 );
 
 /**
- * The same as above, but here values are names of functions,
+ * The same as above, but here values are names of classes,
  * not messages.
  * @see LogPage::actionText
  * @see LogFormatter
@@ -6706,10 +6736,11 @@ $wgLogActionsHandlers = array(
        'patrol/patrol' => 'PatrolLogFormatter',
        'rights/rights' => 'RightsLogFormatter',
        'rights/autopromote' => 'RightsLogFormatter',
-       'upload/upload' => 'LogFormatter',
-       'upload/overwrite' => 'LogFormatter',
-       'upload/revert' => 'LogFormatter',
+       'upload/upload' => 'UploadLogFormatter',
+       'upload/overwrite' => 'UploadLogFormatter',
+       'upload/revert' => 'UploadLogFormatter',
        'merge/merge' => 'MergeLogFormatter',
+       'tag/update' => 'TagLogFormatter',
        'managetags/create' => 'LogFormatter',
        'managetags/delete' => 'LogFormatter',
        'managetags/activate' => 'LogFormatter',
@@ -6787,6 +6818,7 @@ $wgActions = array(
        'credits' => true,
        'delete' => true,
        'edit' => true,
+       'editchangetags' => 'SpecialPageAction',
        'history' => true,
        'info' => true,
        'markpatrolled' => true,
@@ -6795,7 +6827,7 @@ $wgActions = array(
        'raw' => true,
        'render' => true,
        'revert' => true,
-       'revisiondelete' => true,
+       'revisiondelete' => 'SpecialPageAction',
        'rollback' => true,
        'submit' => true,
        'unprotect' => true,
index c9263da..262471e 100644 (file)
  * @defgroup Constants MediaWiki constants
  */
 
-/**
- * Version constants for the benefit of extensions
- */
-define( 'MW_SPECIALPAGE_VERSION', 2 );
-
 /**@{
  * Database related constants
  */
index e113426..b0da562 100644 (file)
@@ -156,6 +156,12 @@ class EditPage {
         */
        const AS_SELF_REDIRECT = 236;
 
+       /**
+        * Status: an error relating to change tagging. Look at the message key for
+        * more details
+        */
+       const AS_CHANGE_TAG_ERROR = 237;
+
        /**
         * Status: can't parse content
         */
@@ -351,6 +357,9 @@ class EditPage {
        /** @var null|string */
        public $contentFormat = null;
 
+       /** @var null|array */
+       public $changeTags = null;
+
        # Placeholders for text injection by hooks (must be HTML)
        # extensions should take care to _append_ to the present value
 
@@ -371,12 +380,14 @@ class EditPage {
 
        public $suppressIntro = false;
 
-       /** @var bool Set to true to allow editing of non-text content types. */
-       public $allowNonTextContent = false;
-
        /** @var bool */
        protected $edit;
 
+       /**
+        * @var bool Set in ApiEditPage, based on ContentHandler::allowsDirectApiEditing
+        */
+       private $enableApiEditOverride = false;
+
        /**
         * @param Article $article
         */
@@ -438,8 +449,18 @@ class EditPage {
         * @throws MWException If $modelId has no known handler
         */
        public function isSupportedContentModel( $modelId ) {
-               return $this->allowNonTextContent ||
-                       ContentHandler::getForModelID( $modelId ) instanceof TextContentHandler;
+               return $this->enableApiEditOverride === true ||
+                       ContentHandler::getForModelID( $modelId )->supportsDirectEditing();
+       }
+
+       /**
+        * Allow editing of content that supports API direct editing, but not general
+        * direct editing. Set to false by default.
+        *
+        * @param bool $enableOverride
+        */
+       public function setApiEditOverride( $enableOverride ) {
+               $this->enableApiEditOverride = $enableOverride;
        }
 
        function submit() {
@@ -844,6 +865,14 @@ class EditPage {
 
                        $this->allowBlankArticle = $request->getBool( 'wpIgnoreBlankArticle' );
                        $this->allowSelfRedirect = $request->getBool( 'wpIgnoreSelfRedirect' );
+
+                       $changeTags = $request->getVal( 'wpChangeTags' );
+                       if ( is_null( $changeTags ) || $changeTags === '' ) {
+                               $this->changeTags = array();
+                       } else {
+                               $this->changeTags = array_filter( array_map( 'trim', explode( ',',
+                                       $changeTags ) ) );
+                       }
                } else {
                        # Not a posted form? Start with nothing.
                        wfDebug( __METHOD__ . ": Not a posted form.\n" );
@@ -1642,6 +1671,15 @@ class EditPage {
                        return $status;
                }
 
+               if ( $this->changeTags ) {
+                       $changeTagsStatus = ChangeTags::canAddTagsAccompanyingChange(
+                               $this->changeTags, $wgUser );
+                       if ( !$changeTagsStatus->isOK() ) {
+                               $changeTagsStatus->value = self::AS_CHANGE_TAG_ERROR;
+                               return $changeTagsStatus;
+                       }
+               }
+
                if ( wfReadOnly() ) {
                        $status->fatal( 'readonlytext' );
                        $status->value = self::AS_READ_ONLY_PAGE;
@@ -1915,7 +1953,18 @@ class EditPage {
                        $wgUser->pingLimiter( 'linkpurge' );
                }
                $result['redirect'] = $content->isRedirect();
+
                $this->updateWatchlist();
+
+               if ( $this->changeTags && isset( $doEditStatus->value['revision'] ) ) {
+                       // If a revision was created, apply any change tags that were requested
+                       ChangeTags::addTags(
+                               $this->changeTags,
+                               isset( $doEditStatus->value['rc'] ) ? $doEditStatus->value['rc']->mAttribs['rc_id'] : null,
+                               $doEditStatus->value['revision']->getId()
+                       );
+               }
+
                return $status;
        }
 
@@ -3700,7 +3749,7 @@ HTML
                }
 
                $script .= '});';
-               $wgOut->addScript( Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( $script ) ) );
+               $wgOut->addScript( ResourceLoader::makeInlineScript( $script ) );
 
                $toolbar = '<div id="toolbar"></div>';
 
index 7c4ebc2..0287798 100644 (file)
@@ -1344,6 +1344,12 @@ function wfReadOnlyReason() {
                } else {
                        $wgReadOnly = false;
                }
+               // Callers use this method to be aware that data presented to a user
+               // may be very stale and thus allowing submissions can be problematic.
+               if ( $wgReadOnly === false && wfGetLB()->getLaggedSlaveMode() ) {
+                       $wgReadOnly = 'The database has been automatically locked ' .
+                               'while the slave database servers catch up to the master';
+               }
        }
 
        return $wgReadOnly;
@@ -2453,7 +2459,7 @@ function wfTimestampNow() {
 function wfIsWindows() {
        static $isWindows = null;
        if ( $isWindows === null ) {
-               $isWindows = substr( php_uname(), 0, 7 ) == 'Windows';
+               $isWindows = strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN';
        }
        return $isWindows;
 }
@@ -2467,20 +2473,6 @@ function wfIsHHVM() {
        return defined( 'HHVM_VERSION' );
 }
 
-/**
- * Swap two variables
- *
- * @deprecated since 1.24
- * @param mixed $x
- * @param mixed $y
- */
-function swap( &$x, &$y ) {
-       wfDeprecated( __FUNCTION__, '1.24' );
-       $z = $x;
-       $x = $y;
-       $y = $z;
-}
-
 /**
  * Tries to get the system directory for temporary files. First
  * $wgTmpDirectory is checked, and then the TMPDIR, TMP, and TEMP
@@ -2529,7 +2521,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
                wfDebug( "$caller: called wfMkdirParents($dir)\n" );
        }
 
-       if ( strval( $dir ) === '' || ( file_exists( $dir ) && is_dir( $dir ) ) ) {
+       if ( strval( $dir ) === '' || is_dir( $dir ) ) {
                return true;
        }
 
@@ -3774,20 +3766,14 @@ function wfWaitForSlaves(
        // time needed to wait on the next clusters.
        $masterPositions = array_fill( 0, count( $lbs ), false );
        foreach ( $lbs as $i => $lb ) {
-               // bug 27975 - Don't try to wait for slaves if there are none
-               // Prevents permission error when getting master position
-               if ( $lb->getServerCount() > 1 ) {
-                       if ( $ifWritesSince && !$lb->hasMasterConnection() ) {
-                               continue; // assume no writes done
-                       }
-                       // Use the empty string to not trigger selectDB() since the connection
-                       // may have been to a server that does not have a DB for the current wiki.
-                       $dbw = $lb->getConnection( DB_MASTER, array(), '' );
-                       if ( $ifWritesSince && $dbw->lastDoneWrites() < $ifWritesSince ) {
-                               continue; // no writes since the last wait
-                       }
-                       $masterPositions[$i] = $dbw->getMasterPos();
+               if ( $lb->getServerCount() <= 1 ) {
+                       // Bug 27975 - Don't try to wait for slaves if there are none
+                       // Prevents permission error when getting master position
+                       continue;
+               } elseif ( $ifWritesSince && $lb->lastMasterChangeTimestamp() < $ifWritesSince ) {
+                       continue; // no writes since the last wait
                }
+               $masterPositions[$i] = $lb->getMasterPos();
        }
 
        $ok = true;
index d312e0a..6907245 100644 (file)
@@ -109,7 +109,7 @@ class Html {
         * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return array $attrs A modified attribute array
         */
-       public static function buttonAttributes( $attrs, $modifiers = array() ) {
+       public static function buttonAttributes( array $attrs, array $modifiers = array() ) {
                global $wgUseMediaWikiUIEverywhere;
                if ( $wgUseMediaWikiUIEverywhere ) {
                        if ( isset( $attrs['class'] ) ) {
@@ -137,11 +137,8 @@ class Html {
         * @param array $attrs An attribute array.
         * @return array $attrs A modified attribute array
         */
-       public static function getTextInputAttributes( $attrs ) {
+       public static function getTextInputAttributes( array $attrs ) {
                global $wgUseMediaWikiUIEverywhere;
-               if ( !$attrs ) {
-                       $attrs = array();
-               }
                if ( $wgUseMediaWikiUIEverywhere ) {
                        if ( isset( $attrs['class'] ) ) {
                                if ( is_array( $attrs['class'] ) ) {
@@ -169,7 +166,7 @@ class Html {
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
-       public static function linkButton( $contents, $attrs, $modifiers = array() ) {
+       public static function linkButton( $contents, array $attrs, array $modifiers = array() ) {
                return self::element( 'a',
                        self::buttonAttributes( $attrs, $modifiers ),
                        $contents
@@ -189,7 +186,7 @@ class Html {
         * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
         * @return string Raw HTML
         */
-       public static function submitButton( $contents, $attrs, $modifiers = array() ) {
+       public static function submitButton( $contents, array $attrs, array $modifiers = array() ) {
                $attrs['type'] = 'submit';
                $attrs['value'] = $contents;
                return self::element( 'input', self::buttonAttributes( $attrs, $modifiers ) );
@@ -337,8 +334,7 @@ class Html {
         *   further documentation.
         * @return array An array of attributes functionally identical to $attribs
         */
-       private static function dropDefaults( $element, $attribs ) {
-
+       private static function dropDefaults( $element, array $attribs ) {
                // Whenever altering this array, please provide a covering test case
                // in HtmlTest::provideElementsWithAttributesHavingDefaultValues
                static $attribDefaults = array(
@@ -485,11 +481,10 @@ class Html {
         * @return string HTML fragment that goes between element name and '>'
         *   (starting with a space if at least one attribute is output)
         */
-       public static function expandAttributes( $attribs ) {
+       public static function expandAttributes( array $attribs ) {
                global $wgWellFormedXml;
 
                $ret = '';
-               $attribs = (array)$attribs;
                foreach ( $attribs as $key => $value ) {
                        // Support intuitive array( 'checked' => true/false ) form
                        if ( $value === false || is_null( $value ) ) {
@@ -714,7 +709,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function input( $name, $value = '', $type = 'text', $attribs = array() ) {
+       public static function input( $name, $value = '', $type = 'text', array $attribs = array() ) {
                $attribs['type'] = $type;
                $attribs['value'] = $value;
                $attribs['name'] = $name;
@@ -794,7 +789,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function hidden( $name, $value, $attribs = array() ) {
+       public static function hidden( $name, $value, array $attribs = array() ) {
                return self::input( $name, $value, 'hidden', $attribs );
        }
 
@@ -810,7 +805,7 @@ class Html {
         *   attributes, passed to Html::element()
         * @return string Raw HTML
         */
-       public static function textarea( $name, $value = '', $attribs = array() ) {
+       public static function textarea( $name, $value = '', array $attribs = array() ) {
                $attribs['name'] = $name;
 
                if ( substr( $value, 0, 1 ) == "\n" ) {
@@ -937,7 +932,7 @@ class Html {
         *   attributes, passed to Html::element() of html tag.
         * @return string Raw HTML
         */
-       public static function htmlHeader( $attribs = array() ) {
+       public static function htmlHeader( array $attribs = array() ) {
                $ret = '';
 
                global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
@@ -1047,7 +1042,7 @@ class Html {
         * @param string[] $urls
         * @return string
         */
-       static function srcSet( $urls ) {
+       static function srcSet( array $urls ) {
                $candidates = array();
                foreach ( $urls as $density => $url ) {
                        // Cast density to float to strip 'x'.
index 06355ed..c2fae30 100644 (file)
@@ -34,7 +34,7 @@ class WikiImporter {
        private $reader = null;
        private $foreignNamespaces = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
-       private $mSiteInfoCallback, $mTargetNamespace, $mPageOutCallback;
+       private $mSiteInfoCallback, $mPageOutCallback;
        private $mNoticeCallback, $mDebug;
        private $mImportUploads, $mImageBasePath;
        private $mNoUpdates = false;
@@ -49,8 +49,13 @@ class WikiImporter {
         * Creates an ImportXMLReader drawing from the source provided
         * @param ImportSource $source
         * @param Config $config
+        * @throws Exception
         */
        function __construct( ImportSource $source, Config $config = null ) {
+               if ( !class_exists( 'XMLReader' ) ) {
+                       throw new Exception( 'Import requires PHP to have been compiled with libxml support' );
+               }
+
                $this->reader = new XMLReader();
                if ( !$config ) {
                        wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' );
@@ -62,11 +67,22 @@ class WikiImporter {
                        stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
                }
                $id = UploadSourceAdapter::registerSource( $source );
+
+               // Enable the entity loader, as it is needed for loading external URLs via
+               // XMLReader::open (T86036)
+               $oldDisable = libxml_disable_entity_loader( false );
                if ( defined( 'LIBXML_PARSEHUGE' ) ) {
-                       $this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
+                       $status = $this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
                } else {
-                       $this->reader->open( "uploadsource://$id" );
+                       $status = $this->reader->open( "uploadsource://$id" );
                }
+               if ( !$status ) {
+                       $error = libxml_get_last_error();
+                       libxml_disable_entity_loader( $oldDisable );
+                       throw new MWException( 'Encountered an internal error while initializing WikiImporter object: ' .
+                               $error->message );
+               }
+               libxml_disable_entity_loader( $oldDisable );
 
                // Default callbacks
                $this->setPageCallback( array( $this, 'beforeImportPage' ) );
@@ -224,7 +240,6 @@ class WikiImporter {
        public function setTargetNamespace( $namespace ) {
                if ( is_null( $namespace ) ) {
                        // Don't override namespaces
-                       $this->mTargetNamespace = null;
                        $this->setImportTitleFactory( new NaiveImportTitleFactory() );
                        return true;
                } elseif (
@@ -232,7 +247,6 @@ class WikiImporter {
                        MWNamespace::exists( intval( $namespace ) )
                ) {
                        $namespace = intval( $namespace );
-                       $this->mTargetNamespace = $namespace;
                        $this->setImportTitleFactory( new NamespaceImportTitleFactory( $namespace ) );
                        return true;
                } else {
@@ -252,10 +266,7 @@ class WikiImporter {
                        $this->setImportTitleFactory( new NaiveImportTitleFactory() );
                } elseif ( $rootpage !== '' ) {
                        $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
-                       $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace )
-                               ? $this->mTargetNamespace
-                               : NS_MAIN
-                       );
+                       $title = Title::newFromText( $rootpage );
 
                        if ( !$title || $title->isExternal() ) {
                                $status->fatal( 'import-rootpage-invalid' );
@@ -528,10 +539,10 @@ class WikiImporter {
                $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->read();
 
-               if ( $this->reader->name != 'mediawiki' ) {
+               if ( $this->reader->localName != 'mediawiki' ) {
                        libxml_disable_entity_loader( $oldDisable );
                        throw new MWException( "Expected <mediawiki> tag, got " .
-                               $this->reader->name );
+                               $this->reader->localName );
                }
                $this->debug( "<mediawiki> tag is correct." );
 
@@ -542,7 +553,7 @@ class WikiImporter {
                $rethrow = null;
                try {
                        while ( $keepReading ) {
-                               $tag = $this->reader->name;
+                               $tag = $this->reader->localName;
                                $type = $this->reader->nodeType;
 
                                if ( !Hooks::run( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
@@ -593,11 +604,11 @@ class WikiImporter {
 
                while ( $this->reader->read() ) {
                        if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
-                                       $this->reader->name == 'siteinfo' ) {
+                                       $this->reader->localName == 'siteinfo' ) {
                                break;
                        }
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( $tag == 'namespace' ) {
                                $this->foreignNamespaces[ $this->nodeAttribute( 'key' ) ] =
@@ -621,11 +632,11 @@ class WikiImporter {
 
                while ( $this->reader->read() ) {
                        if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                                       $this->reader->name == 'logitem' ) {
+                                       $this->reader->localName == 'logitem' ) {
                                break;
                        }
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( !Hooks::run( 'ImportHandleLogItemXMLTag', array(
                                $this, $logInfo
@@ -685,13 +696,13 @@ class WikiImporter {
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
                        if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                                       $this->reader->name == 'page' ) {
+                                       $this->reader->localName == 'page' ) {
                                break;
                        }
 
                        $skip = false;
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( $badTitle ) {
                                // The title is invalid, bail out of this page
@@ -758,11 +769,11 @@ class WikiImporter {
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
                        if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                                       $this->reader->name == 'revision' ) {
+                                       $this->reader->localName == 'revision' ) {
                                break;
                        }
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( !Hooks::run( 'ImportHandleRevisionXMLTag', array(
                                $this, $pageInfo, $revisionInfo
@@ -850,11 +861,11 @@ class WikiImporter {
 
                while ( $skip ? $this->reader->next() : $this->reader->read() ) {
                        if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                                       $this->reader->name == 'upload' ) {
+                                       $this->reader->localName == 'upload' ) {
                                break;
                        }
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( !Hooks::run( 'ImportHandleUploadXMLTag', array(
                                $this, $pageInfo
@@ -948,11 +959,11 @@ class WikiImporter {
 
                while ( $this->reader->read() ) {
                        if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                                       $this->reader->name == 'contributor' ) {
+                                       $this->reader->localName == 'contributor' ) {
                                break;
                        }
 
-                       $tag = $this->reader->name;
+                       $tag = $this->reader->localName;
 
                        if ( in_array( $tag, $fields ) ) {
                                $info[$tag] = $this->nodeContents();
index 68d03c8..ec2f40f 100644 (file)
@@ -464,7 +464,9 @@ class MediaWiki {
                // Send Ajax requests to the Ajax dispatcher.
                if ( $this->config->get( 'UseAjax' ) && $request->getVal( 'action' ) === 'ajax' ) {
                        // Set a dummy title, because $wgTitle == null might break things
-                       $title = Title::makeTitle( NS_MAIN, 'AJAX' );
+                       $title = Title::makeTitle( NS_SPECIAL, 'Badtitle/performing an AJAX call in '
+                               . __METHOD__
+                       );
                        $this->context->setTitle( $title );
                        $wgTitle = $title;
 
@@ -529,7 +531,7 @@ class MediaWiki {
                                        wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
                                }
                                // Setup dummy Title, otherwise OutputPage::redirect will fail
-                               $title = Title::newFromText( NS_MAIN, 'REDIR' );
+                               $title = Title::newFromText( 'REDIR', NS_MAIN );
                                $this->context->setTitle( $title );
                                $output = $this->context->getOutput();
                                // Since we only do this redir to change proto, always send a vary header
index 134af0e..4935e33 100644 (file)
@@ -597,7 +597,7 @@ class Message implements MessageSpecifier {
                if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
                        $this->language = $lang;
                } elseif ( is_string( $lang ) ) {
-                       if ( $this->language->getCode() != $lang ) {
+                       if ( !$this->language instanceof Language || $this->language->getCode() != $lang ) {
                                $this->language = Language::factory( $lang );
                        }
                } else {
diff --git a/includes/MessageBlobStore.php b/includes/MessageBlobStore.php
deleted file mode 100644 (file)
index 011cae6..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-<?php
-/**
- * Resource message blobs storage used by the resource loader.
- *
- * 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 Roan Kattouw
- * @author Trevor Parscal
- */
-
-/**
- * This class provides access to the resource message blobs storage used by
- * the ResourceLoader.
- *
- * A message blob is a JSON object containing the interface messages for a
- * certain resource in a certain language. These message blobs are cached
- * in the msg_resource table and automatically invalidated when one of their
- * constituent messages or the resource itself is changed.
- */
-class MessageBlobStore {
-       /**
-        * Get the singleton instance
-        *
-        * @since 1.24
-        * @deprecated since 1.25
-        * @return MessageBlobStore
-        */
-       public static function getInstance() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return new self;
-       }
-
-       /**
-        * Get the message blobs for a set of modules
-        *
-        * @param ResourceLoader $resourceLoader
-        * @param array $modules Array of module objects keyed by module name
-        * @param string $lang Language code
-        * @return array An array mapping module names to message blobs
-        */
-       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
-               if ( !count( $modules ) ) {
-                       return array();
-               }
-               // Try getting from the DB first
-               $blobs = $this->getFromDB( $resourceLoader, array_keys( $modules ), $lang );
-
-               // Generate blobs for any missing modules and store them in the DB
-               $missing = array_diff( array_keys( $modules ), array_keys( $blobs ) );
-               foreach ( $missing as $name ) {
-                       $blob = $this->insertMessageBlob( $name, $modules[$name], $lang );
-                       if ( $blob ) {
-                               $blobs[$name] = $blob;
-                       }
-               }
-
-               return $blobs;
-       }
-
-       /**
-        * Generate and insert a new message blob. If the blob was already
-        * present, it is not regenerated; instead, the preexisting blob
-        * is fetched and returned.
-        *
-        * @param string $name Module name
-        * @param ResourceLoaderModule $module
-        * @param string $lang Language code
-        * @return mixed Message blob or false if the module has no messages
-        */
-       public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
-               $blob = $this->generateMessageBlob( $module, $lang );
-
-               if ( !$blob ) {
-                       return false;
-               }
-
-               try {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $success = $dbw->insert( 'msg_resource', array(
-                                       'mr_lang' => $lang,
-                                       'mr_resource' => $name,
-                                       'mr_blob' => $blob,
-                                       'mr_timestamp' => $dbw->timestamp()
-                               ),
-                               __METHOD__,
-                               array( 'IGNORE' )
-                       );
-
-                       if ( $success ) {
-                               if ( $dbw->affectedRows() == 0 ) {
-                                       // Blob was already present, fetch it
-                                       $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
-                                                       'mr_resource' => $name,
-                                                       'mr_lang' => $lang,
-                                               ),
-                                               __METHOD__
-                                       );
-                               } else {
-                                       // Update msg_resource_links
-                                       $rows = array();
-
-                                       foreach ( $module->getMessages() as $key ) {
-                                               $rows[] = array(
-                                                       'mrl_resource' => $name,
-                                                       'mrl_message' => $key
-                                               );
-                                       }
-                                       $dbw->insert( 'msg_resource_links', $rows,
-                                               __METHOD__, array( 'IGNORE' )
-                                       );
-                               }
-                       }
-               } catch ( DBError $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-               return $blob;
-       }
-
-       /**
-        * Update the message blob for a given module in a given language
-        *
-        * @param string $name Module name
-        * @param ResourceLoaderModule $module
-        * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for
-        *   the given module/language pair.
-        */
-       public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $row = $dbw->selectRow( 'msg_resource', 'mr_blob',
-                       array( 'mr_resource' => $name, 'mr_lang' => $lang ),
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return null;
-               }
-
-               // Save the old and new blobs for later
-               $oldBlob = $row->mr_blob;
-               $newBlob = $this->generateMessageBlob( $module, $lang );
-
-               try {
-                       $newRow = array(
-                               'mr_resource' => $name,
-                               'mr_lang' => $lang,
-                               'mr_blob' => $newBlob,
-                               'mr_timestamp' => $dbw->timestamp()
-                       );
-
-                       $dbw->replace( 'msg_resource',
-                               array( array( 'mr_resource', 'mr_lang' ) ),
-                               $newRow, __METHOD__
-                       );
-
-                       // Figure out which messages were added and removed
-                       $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
-                       $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
-                       $added = array_diff( $newMessages, $oldMessages );
-                       $removed = array_diff( $oldMessages, $newMessages );
-
-                       // Delete removed messages, insert added ones
-                       if ( $removed ) {
-                               $dbw->delete( 'msg_resource_links', array(
-                                               'mrl_resource' => $name,
-                                               'mrl_message' => $removed
-                                       ), __METHOD__
-                               );
-                       }
-
-                       $newLinksRows = array();
-
-                       foreach ( $added as $message ) {
-                               $newLinksRows[] = array(
-                                       'mrl_resource' => $name,
-                                       'mrl_message' => $message
-                               );
-                       }
-
-                       if ( $newLinksRows ) {
-                               $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
-                                       array( 'IGNORE' ) // just in case
-                               );
-                       }
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-               return $newBlob;
-       }
-
-       /**
-        * Update a single message in all message blobs it occurs in.
-        *
-        * @param string $key Message key
-        */
-       public function updateMessage( $key ) {
-               try {
-                       $dbw = wfGetDB( DB_MASTER );
-
-                       // Keep running until the updates queue is empty.
-                       // Due to update conflicts, the queue might not be emptied
-                       // in one iteration.
-                       $updates = null;
-                       do {
-                               $updates = $this->getUpdatesForMessage( $key, $updates );
-
-                               foreach ( $updates as $k => $update ) {
-                                       // Update the row on the condition that it
-                                       // didn't change since we fetched it by putting
-                                       // the timestamp in the WHERE clause.
-                                       $success = $dbw->update( 'msg_resource',
-                                               array(
-                                                       'mr_blob' => $update['newBlob'],
-                                                       'mr_timestamp' => $dbw->timestamp() ),
-                                               array(
-                                                       'mr_resource' => $update['resource'],
-                                                       'mr_lang' => $update['lang'],
-                                                       'mr_timestamp' => $update['timestamp'] ),
-                                               __METHOD__
-                                       );
-
-                                       // Only requeue conflicted updates.
-                                       // If update() returned false, don't retry, for
-                                       // fear of getting into an infinite loop
-                                       if ( !( $success && $dbw->affectedRows() == 0 ) ) {
-                                               // Not conflicted
-                                               unset( $updates[$k] );
-                                       }
-                               }
-                       } while ( count( $updates ) );
-
-                       // No need to update msg_resource_links because we didn't add
-                       // or remove any messages, we just changed their contents.
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-       }
-
-       public function clear() {
-               // TODO: Give this some more thought
-               try {
-                       // Not using TRUNCATE, because that needs extra permissions,
-                       // which maybe not granted to the database user.
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'msg_resource', '*', __METHOD__ );
-                       $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-       }
-
-       /**
-        * Create an update queue for updateMessage()
-        *
-        * @param string $key Message key
-        * @param array $prevUpdates Updates queue to refresh or null to build a fresh update queue
-        * @return array Updates queue
-        */
-       private function getUpdatesForMessage( $key, $prevUpdates = null ) {
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( is_null( $prevUpdates ) ) {
-                       // Fetch all blobs referencing $key
-                       $res = $dbw->select(
-                               array( 'msg_resource', 'msg_resource_links' ),
-                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
-                               array( 'mrl_message' => $key, 'mr_resource=mrl_resource' ),
-                               __METHOD__
-                       );
-               } else {
-                       // Refetch the blobs referenced by $prevUpdates
-
-                       // Reorganize the (resource, lang) pairs in the format
-                       // expected by makeWhereFrom2d()
-                       $twoD = array();
-
-                       foreach ( $prevUpdates as $update ) {
-                               $twoD[$update['resource']][$update['lang']] = true;
-                       }
-
-                       $res = $dbw->select( 'msg_resource',
-                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
-                               $dbw->makeWhereFrom2d( $twoD, 'mr_resource', 'mr_lang' ),
-                               __METHOD__
-                       );
-               }
-
-               // Build the new updates queue
-               $updates = array();
-
-               foreach ( $res as $row ) {
-                       $updates[] = array(
-                               'resource' => $row->mr_resource,
-                               'lang' => $row->mr_lang,
-                               'timestamp' => $row->mr_timestamp,
-                               'newBlob' => $this->reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
-                       );
-               }
-
-               return $updates;
-       }
-
-       /**
-        * Reencode a message blob with the updated value for a message
-        *
-        * @param string $blob Message blob (JSON object)
-        * @param string $key Message key
-        * @param string $lang Language code
-        * @return string Message blob with $key replaced with its new value
-        */
-       private function reencodeBlob( $blob, $key, $lang ) {
-               $decoded = FormatJson::decode( $blob, true );
-               $decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
-
-               return FormatJson::encode( (object)$decoded );
-       }
-
-       /**
-        * Get the message blobs for a set of modules from the database.
-        * Modules whose blobs are not in the database are silently dropped.
-        *
-        * @param ResourceLoader $resourceLoader
-        * @param array $modules Array of module names
-        * @param string $lang Language code
-        * @throws MWException
-        * @return array Array mapping module names to blobs
-        */
-       private function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
-               $config = $resourceLoader->getConfig();
-               $retval = array();
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'msg_resource',
-                       array( 'mr_blob', 'mr_resource', 'mr_timestamp' ),
-                       array( 'mr_resource' => $modules, 'mr_lang' => $lang ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $module = $resourceLoader->getModule( $row->mr_resource );
-                       if ( !$module ) {
-                               // This shouldn't be possible
-                               throw new MWException( __METHOD__ . ' passed an invalid module name' );
-                       }
-
-                       // Update the module's blobs if the set of messages changed or if the blob is
-                       // older than the CacheEpoch setting
-                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
-                       $values = array_values( array_unique( $module->getMessages() ) );
-                       if ( $keys !== $values
-                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $config->get( 'CacheEpoch' )
-                       ) {
-                               $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
-                       } else {
-                               $retval[$row->mr_resource] = $row->mr_blob;
-                       }
-               }
-
-               return $retval;
-       }
-
-       /**
-        * Generate the message blob for a given module in a given language.
-        *
-        * @param ResourceLoaderModule $module
-        * @param string $lang Language code
-        * @return string JSON object
-        */
-       private function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
-               $messages = array();
-
-               foreach ( $module->getMessages() as $key ) {
-                       $messages[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
-               }
-
-               return FormatJson::encode( (object)$messages );
-       }
-}
index cac89f4..28d55e4 100644 (file)
@@ -2854,10 +2854,8 @@ class OutputPage extends ContextSource {
                                                        $resourceLoader->makeModuleResponse( $context, $grpModules )
                                                );
                                        } else {
-                                               $links['html'] .= Html::inlineScript(
-                                                       ResourceLoader::makeLoaderConditionalScript(
-                                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
-                                                       )
+                                               $links['html'] .= ResourceLoader::makeInlineScript(
+                                                       $resourceLoader->makeModuleResponse( $context, $grpModules )
                                                );
                                        }
                                        $links['html'] .= "\n";
@@ -2896,10 +2894,8 @@ class OutputPage extends ContextSource {
                                        if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
                                                $link = Html::linkedStyle( $url );
                                        } elseif ( $loadCall ) {
-                                               $link = Html::inlineScript(
-                                                       ResourceLoader::makeLoaderConditionalScript(
-                                                               Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
-                                                       )
+                                               $link = ResourceLoader::makeInlineScript(
+                                                       Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
                                                );
                                        } else {
                                                $link = Html::linkedScript( $url );
@@ -2908,10 +2904,8 @@ class OutputPage extends ContextSource {
                                                        // browsers not supported by the startup module would unconditionally
                                                        // execute this module. Otherwise users will get "ReferenceError: mw is
                                                        // undefined" or "jQuery is undefined" from e.g. a "site" module.
-                                                       $link = Html::inlineScript(
-                                                               ResourceLoader::makeLoaderConditionalScript(
-                                                                       Xml::encodeJsCall( 'document.write', array( $link ) )
-                                                               )
+                                                       $link = ResourceLoader::makeInlineScript(
+                                                               Xml::encodeJsCall( 'document.write', array( $link ) )
                                                        );
                                                }
 
@@ -2955,10 +2949,8 @@ class OutputPage extends ContextSource {
                }
 
                if ( count( $states ) ) {
-                       $html = Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript(
-                                       ResourceLoader::makeLoaderStateScript( $states )
-                               )
+                       $html = ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeLoaderStateScript( $states )
                        ) . "\n" . $html;
                }
 
@@ -2977,10 +2969,8 @@ class OutputPage extends ContextSource {
                $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
 
                // Load config before anything else
-               $links[] = Html::inlineScript(
-                       ResourceLoader::makeLoaderConditionalScript(
-                               ResourceLoader::makeConfigSetScript( $this->getJSVars() )
-                       )
+               $links[] = ResourceLoader::makeInlineScript(
+                       ResourceLoader::makeConfigSetScript( $this->getJSVars() )
                );
 
                // Load embeddable private modules before any loader links
@@ -3004,10 +2994,8 @@ class OutputPage extends ContextSource {
                // Only load modules that have marked themselves for loading at the top
                $modules = $this->getModules( true, 'top' );
                if ( $modules ) {
-                       $links[] = Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript(
-                                       Xml::encodeJsCall( 'mw.loader.load', array( $modules ) )
-                               )
+                       $links[] = ResourceLoader::makeInlineScript(
+                               Xml::encodeJsCall( 'mw.loader.load', array( $modules ) )
                        );
                }
 
@@ -3047,10 +3035,8 @@ class OutputPage extends ContextSource {
                // Only load modules that have marked themselves for loading at the bottom
                $modules = $this->getModules( true, 'bottom' );
                if ( $modules ) {
-                       $links[] = Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript(
-                                       Xml::encodeJsCall( 'mw.loader.load', array( $modules, null, true ) )
-                               )
+                       $links[] = ResourceLoader::makeInlineScript(
+                               Xml::encodeJsCall( 'mw.loader.load', array( $modules, null, true ) )
                        );
                }
 
index b061990..3a2f9f8 100644 (file)
@@ -39,7 +39,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.25';
+       $mwVersion = '1.26';
        $minimumVersionPHP = '5.3.3';
 
        $phpVersion = PHP_VERSION;
index 40c3a2b..74a917d 100644 (file)
@@ -657,8 +657,9 @@ class Preferences {
                $now = wfTimestampNow();
                $lang = $context->getLanguage();
                $nowlocal = Xml::element( 'span', array( 'id' => 'wpLocalTime' ),
-                       $lang->time( $now, true ) );
-               $nowserver = $lang->time( $now, false ) .
+                       $lang->userTime( $now, $user ) );
+               $nowserver = $lang->userTime( $now, $user,
+                               array( 'format' => false, 'timecorrection' => false ) ) .
                        Html::hidden( 'wpServerTime', (int)substr( $now, 8, 2 ) * 60 + (int)substr( $now, 10, 2 ) );
 
                $defaultPreferences['nowserver'] = array(
index 1219da5..c546de7 100644 (file)
@@ -157,7 +157,7 @@ class ProtectionForm {
                        $value = $this->mExpirySelection[$action];
                }
                if ( wfIsInfinity( $value ) ) {
-                       $time = wfGetDB( DB_SLAVE )->getInfinity();
+                       $time = 'infinity';
                } else {
                        $unix = strtotime( $value );
 
index d10b541..1cb43f7 100644 (file)
@@ -317,7 +317,7 @@ class RevisionItem extends RevisionItemBase {
        }
 
        public function getAuthorNameField() {
-               return 'user_name'; // see Revision::selectUserFields()
+               return 'rev_user_text';
        }
 
        public function canView() {
@@ -334,15 +334,19 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDelArchiveItem.
+        * @todo Essentially a copy of RevDelRevisionItem::getRevisionLink. That class
+        * should inherit from this one, and implement an appropriate interface instead
+        * of extending RevDelItem
         * @return string
         */
        protected function getRevisionLink() {
-               $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $date;
                }
-               return Linker::link(
+               return Linker::linkKnown(
                        $this->list->title,
                        $date,
                        array(),
@@ -355,30 +359,34 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDelArchiveItem
+        * @todo Essentially a copy of RevDelRevisionItem::getDiffLink. That class
+        * should inherit from this one, and implement an appropriate interface instead
+        * of extending RevDelItem
         * @return string
         */
        protected function getDiffLink() {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->context->msg( 'diff' )->escaped();
                } else {
-                       return Linker::link(
+                       return Linker::linkKnown(
                                        $this->list->title,
-                                       $this->context->msg( 'diff' )->escaped(),
+                                       $this->list->msg( 'diff' )->escaped(),
                                        array(),
                                        array(
                                                'diff' => $this->revision->getId(),
                                                'oldid' => 'prev',
                                                'unhide' => 1
-                                       ),
-                                       array(
-                                               'known',
-                                               'noclasses'
                                        )
                                );
                }
        }
 
+       /**
+        * @todo Essentially a copy of RevDelRevisionItem::getHTML. That class
+        * should inherit from this one, and implement an appropriate interface instead
+        * of extending RevDelItem
+        * @return string
+        */
        public function getHTML() {
                $difflink = $this->context->msg( 'parentheses' )
                        ->rawParams( $this->getDiffLink() )->escaped();
index e281768..c5c16a0 100644 (file)
@@ -488,6 +488,10 @@ require_once "$IP/includes/libs/normal/UtfNormalUtil.php";
 
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
+if ( defined( 'MW_ENTRY_PHP5' ) ) {
+       wfWarn( 'The ".php5" entry point files are deprecated. Use ".php" instead.' );
+}
+
 if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
@@ -519,9 +523,7 @@ if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
 
 // Now that GlobalFunctions is loaded, set defaults that depend on it.
 if ( $wgTmpDirectory === false ) {
-       $ps_tmpdir = Profiler::instance()->scopedProfileIn( $fname . '-tempDir' );
        $wgTmpDirectory = wfTempDir();
-       Profiler::instance()->scopedProfileOut( $ps_tmpdir );
 }
 
 // We don't use counters anymore. Left here for extensions still
index 15c18f3..81172a1 100644 (file)
@@ -68,6 +68,8 @@ class SiteStats {
         * @return bool|ResultWrapper
         */
        static function loadAndLazyInit() {
+               global $wgMiserMode;
+
                wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
                $row = self::doLoad( wfGetDB( DB_SLAVE ) );
 
@@ -77,7 +79,7 @@ class SiteStats {
                        $row = self::doLoad( wfGetDB( DB_MASTER ) );
                }
 
-               if ( !self::isSane( $row ) ) {
+               if ( !$wgMiserMode && !self::isSane( $row ) ) {
                        // Normally the site_stats table is initialized at install time.
                        // Some manual construction scenarios may leave the table empty or
                        // broken, however, for instance when importing from a dump into a
index 9868b2e..b0df15f 100644 (file)
@@ -96,7 +96,7 @@ class Title {
        /** @var array Array of groups allowed to edit this article */
        public $mRestrictions = array();
 
-       /** @var bool */
+       /** @var string|bool */
        protected $mOldRestrictions = false;
 
        /** @var bool Cascade restrictions on this page to included templates and images? */
@@ -260,8 +260,10 @@ class Title {
         * @return Title|null Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
-               if ( !is_string( $text ) ) {
-                       throw new InvalidArgumentException( 'Title::newFromText given something that isn\'t a string' );
+               if ( is_object( $text ) ) {
+                       throw new InvalidArgumentException( '$text must be a string.' );
+               } elseif ( !is_string( $text ) ) {
+                       wfWarn( __METHOD__ . ': $text must be a string. This will throw an InvalidArgumentException in future.', 2 );
                }
 
                $cache = self::getTitleCache();
@@ -449,6 +451,9 @@ class Title {
                        if ( isset( $row->page_lang ) ) {
                                $this->mDbPageLanguage = (string)$row->page_lang;
                        }
+                       if ( isset( $row->page_restrictions ) ) {
+                               $this->mOldRestrictions = $row->page_restrictions;
+                       }
                } else { // page not found
                        $this->mArticleID = 0;
                        $this->mLength = 0;
@@ -2572,6 +2577,7 @@ class Title {
                                if ( $row['permission'] == 'autoconfirmed' ) {
                                        $row['permission'] = 'editsemiprotected'; // B/C
                                }
+                               $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] );
                        }
                        $this->mTitleProtection = $row;
                }
@@ -2709,7 +2715,6 @@ class Title {
         *        false.
         */
        public function getCascadeProtectionSources( $getPages = true ) {
-               global $wgContLang;
                $pagerestrictions = array();
 
                if ( $this->mCascadeSources !== null && $getPages ) {
@@ -2752,7 +2757,7 @@ class Title {
                $now = wfTimestampNow();
 
                foreach ( $res as $row ) {
-                       $expiry = $wgContLang->formatExpiry( $row->pr_expiry, TS_MW );
+                       $expiry = $dbr->decodeExpiry( $row->pr_expiry );
                        if ( $expiry > $now ) {
                                if ( $getPages ) {
                                        $page_id = $row->pr_page;
@@ -2885,28 +2890,29 @@ class Title {
         *   restrictions from page table (pre 1.10)
         */
        public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
-               global $wgContLang;
                $dbr = wfGetDB( DB_SLAVE );
 
                $restrictionTypes = $this->getRestrictionTypes();
 
                foreach ( $restrictionTypes as $type ) {
                        $this->mRestrictions[$type] = array();
-                       $this->mRestrictionsExpiry[$type] = $wgContLang->formatExpiry( '', TS_MW );
+                       $this->mRestrictionsExpiry[$type] = 'infinity';
                }
 
                $this->mCascadeRestriction = false;
 
                # Backwards-compatibility: also load the restrictions from the page record (old format).
+               if ( $oldFashionedRestrictions !== null ) {
+                       $this->mOldRestrictions = $oldFashionedRestrictions;
+               }
 
-               if ( $oldFashionedRestrictions === null ) {
-                       $oldFashionedRestrictions = $dbr->selectField( 'page', 'page_restrictions',
+               if ( $this->mOldRestrictions === false ) {
+                       $this->mOldRestrictions = $dbr->selectField( 'page', 'page_restrictions',
                                array( 'page_id' => $this->getArticleID() ), __METHOD__ );
                }
 
-               if ( $oldFashionedRestrictions != '' ) {
-
-                       foreach ( explode( ':', trim( $oldFashionedRestrictions ) ) as $restrict ) {
+               if ( $this->mOldRestrictions != '' ) {
+                       foreach ( explode( ':', trim( $this->mOldRestrictions ) ) as $restrict ) {
                                $temp = explode( '=', trim( $restrict ) );
                                if ( count( $temp ) == 1 ) {
                                        // old old format should be treated as edit/move restriction
@@ -2919,9 +2925,6 @@ class Title {
                                        }
                                }
                        }
-
-                       $this->mOldRestrictions = true;
-
                }
 
                if ( count( $rows ) ) {
@@ -2938,7 +2941,7 @@ class Title {
 
                                // This code should be refactored, now that it's being used more generally,
                                // But I don't really see any harm in leaving it in Block for now -werdna
-                               $expiry = $wgContLang->formatExpiry( $row->pr_expiry, TS_MW );
+                               $expiry = $dbr->decodeExpiry( $row->pr_expiry );
 
                                // Only apply the restrictions if they haven't expired!
                                if ( !$expiry || $expiry > $now ) {
@@ -2960,11 +2963,9 @@ class Title {
         *   restrictions from page table (pre 1.10)
         */
        public function loadRestrictions( $oldFashionedRestrictions = null ) {
-               global $wgContLang;
                if ( !$this->mRestrictionsLoaded ) {
+                       $dbr = wfGetDB( DB_SLAVE );
                        if ( $this->exists() ) {
-                               $dbr = wfGetDB( DB_SLAVE );
-
                                $res = $dbr->select(
                                        'page_restrictions',
                                        array( 'pr_type', 'pr_expiry', 'pr_level', 'pr_cascade' ),
@@ -2978,7 +2979,7 @@ class Title {
 
                                if ( $title_protection ) {
                                        $now = wfTimestampNow();
-                                       $expiry = $wgContLang->formatExpiry( $title_protection['expiry'], TS_MW );
+                                       $expiry = $dbr->decodeExpiry( $title_protection['expiry'] );
 
                                        if ( !$expiry || $expiry > $now ) {
                                                // Apply the restrictions
@@ -2988,7 +2989,7 @@ class Title {
                                                $this->mTitleProtection = false;
                                        }
                                } else {
-                                       $this->mRestrictionsExpiry['create'] = $wgContLang->formatExpiry( '', TS_MW );
+                                       $this->mRestrictionsExpiry['create'] = 'infinity';
                                }
                                $this->mRestrictionsLoaded = true;
                        }
@@ -3272,6 +3273,7 @@ class Title {
                }
                $this->mRestrictionsLoaded = false;
                $this->mRestrictions = array();
+               $this->mOldRestrictions = false;
                $this->mRedirect = null;
                $this->mLength = -1;
                $this->mLatestID = false;
@@ -3418,8 +3420,6 @@ class Title {
         * @return array Array of Title objects linking here
         */
        public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
-               global $wgContentHandlerUseDB;
-
                $id = $this->getArticleID();
 
                # If the page doesn't exist; there can't be any link from this page
@@ -3433,49 +3433,36 @@ class Title {
                        $db = wfGetDB( DB_SLAVE );
                }
 
-               $namespaceFiled = "{$prefix}_namespace";
-               $titleField = "{$prefix}_title";
-
-               $fields = array(
-                       $namespaceFiled,
-                       $titleField,
-                       'page_id',
-                       'page_len',
-                       'page_is_redirect',
-                       'page_latest'
-               );
-
-               if ( $wgContentHandlerUseDB ) {
-                       $fields[] = 'page_content_model';
-               }
+               $blNamespace = "{$prefix}_namespace";
+               $blTitle = "{$prefix}_title";
 
                $res = $db->select(
                        array( $table, 'page' ),
-                       $fields,
+                       array_merge(
+                               array( $blNamespace, $blTitle ),
+                               WikiPage::selectFields()
+                       ),
                        array( "{$prefix}_from" => $id ),
                        __METHOD__,
                        $options,
                        array( 'page' => array(
                                'LEFT JOIN',
-                               array( "page_namespace=$namespaceFiled", "page_title=$titleField" )
+                               array( "page_namespace=$blNamespace", "page_title=$blTitle" )
                        ) )
                );
 
                $retVal = array();
-               if ( $res->numRows() ) {
-                       $linkCache = LinkCache::singleton();
-                       foreach ( $res as $row ) {
-                               $titleObj = Title::makeTitle( $row->$namespaceFiled, $row->$titleField );
-                               if ( $titleObj ) {
-                                       if ( $row->page_id ) {
-                                               $linkCache->addGoodLinkObjFromRow( $titleObj, $row );
-                                       } else {
-                                               $linkCache->addBadLinkObj( $titleObj );
-                                       }
-                                       $retVal[] = $titleObj;
-                               }
+               $linkCache = LinkCache::singleton();
+               foreach ( $res as $row ) {
+                       if ( $row->page_id ) {
+                               $titleObj = Title::newFromRow( $row );
+                       } else {
+                               $titleObj = Title::makeTitle( $row->$blNamespace, $row->$blTitle );
+                               $linkCache->addBadLinkObj( $titleObj );
                        }
+                       $retVal[] = $titleObj;
                }
+
                return $retVal;
        }
 
@@ -4422,35 +4409,29 @@ class Title {
         * @return string|null
         */
        public function getNotificationTimestamp( $user = null ) {
-               global $wgUser, $wgShowUpdatedMarker;
+               global $wgUser;
+
                // Assume current user if none given
                if ( !$user ) {
                        $user = $wgUser;
                }
                // Check cache first
                $uid = $user->getId();
+               if ( !$uid ) {
+                       return false;
+               }
                // avoid isset here, as it'll return false for null entries
                if ( array_key_exists( $uid, $this->mNotificationTimestamp ) ) {
                        return $this->mNotificationTimestamp[$uid];
                }
-               if ( !$uid || !$wgShowUpdatedMarker || !$user->isAllowed( 'viewmywatchlist' ) ) {
-                       $this->mNotificationTimestamp[$uid] = false;
-                       return $this->mNotificationTimestamp[$uid];
-               }
                // Don't cache too much!
                if ( count( $this->mNotificationTimestamp ) >= self::CACHE_MAX ) {
                        $this->mNotificationTimestamp = array();
                }
-               $dbr = wfGetDB( DB_SLAVE );
-               $this->mNotificationTimestamp[$uid] = $dbr->selectField( 'watchlist',
-                       'wl_notificationtimestamp',
-                       array(
-                               'wl_user' => $user->getId(),
-                               'wl_namespace' => $this->getNamespace(),
-                               'wl_title' => $this->getDBkey(),
-                       ),
-                       __METHOD__
-               );
+
+               $watchedItem = WatchedItem::fromUserTitle( $user, $this );
+               $this->mNotificationTimestamp[$uid] = $watchedItem->getNotificationTimestamp();
+
                return $this->mNotificationTimestamp[$uid];
        }
 
index 322f8af..c3d4a65 100644 (file)
@@ -102,6 +102,7 @@ class User implements IDBAccessObject {
         */
        protected static $mCoreRights = array(
                'apihighlimits',
+               'applychangetags',
                'autoconfirmed',
                'autopatrol',
                'bigdelete',
@@ -109,6 +110,7 @@ class User implements IDBAccessObject {
                'blockemail',
                'bot',
                'browsearchive',
+               'changetags',
                'createaccount',
                'createpage',
                'createtalk',
@@ -452,7 +454,7 @@ class User implements IDBAccessObject {
                // The cache needs good consistency due to its high TTL, so the user
                // should have been loaded from the master to avoid lag amplification.
                if ( !( $this->queryFlagsUsed & self::READ_LATEST ) ) {
-                       wfWarn( "Cannot save slave-loaded User object data to cache." );
+                       wfWarn( "Cannot cache slave-loaded User object with ID '{$this->mId}'." );
                        return;
                }
 
@@ -1371,10 +1373,10 @@ class User implements IDBAccessObject {
         */
        private function loadGroups() {
                if ( is_null( $this->mGroups ) ) {
-                       $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
                                ? wfGetDB( DB_MASTER )
                                : wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'user_groups',
+                       $res = $db->select( 'user_groups',
                                array( 'ug_group' ),
                                array( 'ug_user' => $this->mId ),
                                __METHOD__ );
@@ -1395,10 +1397,17 @@ class User implements IDBAccessObject {
         * @since 1.24
         */
        private function loadPasswords() {
-               if ( $this->getId() !== 0 && ( $this->mPassword === null || $this->mNewpassword === null ) ) {
-                       $this->loadFromRow( wfGetDB( DB_MASTER )->selectRow(
+               if ( $this->getId() !== 0 &&
+                       ( $this->mPassword === null || $this->mNewpassword === null )
+               ) {
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                               ? wfGetDB( DB_MASTER )
+                               : wfGetDB( DB_SLAVE );
+
+                       $this->loadFromRow( $db->selectRow(
                                'user',
-                               array( 'user_password', 'user_newpassword', 'user_newpass_time', 'user_password_expires' ),
+                               array( 'user_password', 'user_newpassword',
+                                       'user_newpass_time', 'user_password_expires' ),
                                array( 'user_id' => $this->getId() ),
                                __METHOD__
                        ) );
@@ -1422,37 +1431,85 @@ class User implements IDBAccessObject {
        public function addAutopromoteOnceGroups( $event ) {
                global $wgAutopromoteOnceLogInRC, $wgAuth;
 
-               $toPromote = array();
-               if ( !wfReadOnly() && $this->getId() ) {
-                       $toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
-                       if ( count( $toPromote ) ) {
-                               $oldGroups = $this->getGroups(); // previous groups
+               if ( wfReadOnly() || !$this->getId() ) {
+                       return array();
+               }
 
-                               foreach ( $toPromote as $group ) {
-                                       $this->addGroup( $group );
-                               }
-                               // update groups in external authentication database
-                               $wgAuth->updateExternalDBGroups( $this, $toPromote );
+               $toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
+               if ( !count( $toPromote ) ) {
+                       return array();
+               }
 
-                               $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
+               if ( !$this->checkAndSetTouched() ) {
+                       return array(); // raced out (bug T48834)
+               }
 
-                               $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
-                               $logEntry->setPerformer( $this );
-                               $logEntry->setTarget( $this->getUserPage() );
-                               $logEntry->setParameters( array(
-                                       '4::oldgroups' => $oldGroups,
-                                       '5::newgroups' => $newGroups,
-                               ) );
-                               $logid = $logEntry->insert();
-                               if ( $wgAutopromoteOnceLogInRC ) {
-                                       $logEntry->publish( $logid );
-                               }
-                       }
+               $oldGroups = $this->getGroups(); // previous groups
+               foreach ( $toPromote as $group ) {
+                       $this->addGroup( $group );
+               }
+
+               // update groups in external authentication database
+               $wgAuth->updateExternalDBGroups( $this, $toPromote );
+
+               $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
+
+               $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
+               $logEntry->setPerformer( $this );
+               $logEntry->setTarget( $this->getUserPage() );
+               $logEntry->setParameters( array(
+                       '4::oldgroups' => $oldGroups,
+                       '5::newgroups' => $newGroups,
+               ) );
+               $logid = $logEntry->insert();
+               if ( $wgAutopromoteOnceLogInRC ) {
+                       $logEntry->publish( $logid );
                }
 
                return $toPromote;
        }
 
+       /**
+        * Bump user_touched if it didn't change since this object was loaded
+        *
+        * On success, the mTouched field is updated.
+        * The user serialization cache is always cleared.
+        *
+        * @return bool Whether user_touched was actually updated
+        * @since 1.26
+        */
+       protected function checkAndSetTouched() {
+               $this->load();
+
+               if ( !$this->mId ) {
+                       return false; // anon
+               }
+
+               // Get a new user_touched that is higher than the old one
+               $oldTouched = $this->mTouched;
+               $newTouched = $this->newTouchedTimestamp();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update( 'user',
+                       array( 'user_touched' => $dbw->timestamp( $newTouched ) ),
+                       array(
+                               'user_id' => $this->mId,
+                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
+                       ),
+                       __METHOD__
+               );
+               $success = ( $dbw->affectedRows() > 0 );
+
+               if ( $success ) {
+                       $this->mTouched = $newTouched;
+               }
+
+               // Clears on failure too since that is desired if the cache is stale
+               $this->clearSharedCache();
+
+               return $success;
+       }
+
        /**
         * Clear various cached data stored in this object. The cache of the user table
         * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
@@ -2195,6 +2252,8 @@ class User implements IDBAccessObject {
         *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
+               global $wgMemc;
+
                if ( wfReadOnly() ) {
                        return;
                }
@@ -2209,7 +2268,6 @@ class User implements IDBAccessObject {
                        $field = 'user_id';
                        $id = $this->getId();
                }
-               global $wgMemc;
 
                if ( $val ) {
                        $changed = $this->updateNewtalk( $field, $id, $curRev );
@@ -2233,9 +2291,15 @@ class User implements IDBAccessObject {
         * user_touched field when we update things.
         * @return string Timestamp in TS_MW format
         */
-       private static function newTouchedTimestamp() {
+       private function newTouchedTimestamp() {
                global $wgClockSkewFudge;
-               return wfTimestamp( TS_MW, time() + $wgClockSkewFudge );
+
+               $time = wfTimestamp( TS_MW, time() + $wgClockSkewFudge );
+               if ( $this->mTouched && $time <= $this->mTouched ) {
+                       $time = wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $this->mTouched ) + 1 );
+               }
+
+               return $time;
        }
 
        /**
@@ -2255,37 +2319,13 @@ class User implements IDBAccessObject {
        }
 
        /**
-        * Immediately touch the user data cache for this account.
-        * Updates user_touched field, and removes account data from memcached
-        * for reload on the next hit.
+        * Immediately touch the user data cache for this account
+        *
+        * Calls touch() and removes account data from memcached
         */
        public function invalidateCache() {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-               $this->load();
-               if ( $this->mId ) {
-                       $this->mTouched = self::newTouchedTimestamp();
-
-                       $dbw = wfGetDB( DB_MASTER );
-                       $userid = $this->mId;
-                       $touched = $this->mTouched;
-                       $method = __METHOD__;
-                       $dbw->onTransactionIdle( function () use ( $dbw, $userid, $touched, $method ) {
-                               // Prevent contention slams by checking user_touched first
-                               $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
-                               $needsPurge = $dbw->selectField( 'user', '1',
-                                       array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
-                               if ( $needsPurge ) {
-                                       $dbw->update( 'user',
-                                               array( 'user_touched' => $dbw->timestamp( $touched ) ),
-                                               array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
-                                               $method
-                                       );
-                               }
-                       } );
-                       $this->clearSharedCache();
-               }
+               $this->touch();
+               $this->clearSharedCache();
        }
 
        /**
@@ -2307,7 +2347,7 @@ class User implements IDBAccessObject {
 
                if ( $this->mId ) {
                        $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
-                       $timestamp = self::newTouchedTimestamp();
+                       $timestamp = $this->newTouchedTimestamp();
                        $wgMemc->set( $key, $timestamp );
                        $this->mQuickTouched = $timestamp;
                }
@@ -2349,6 +2389,17 @@ class User implements IDBAccessObject {
                return $this->mTouched;
        }
 
+       /**
+        * Get the user_touched timestamp field (time of last DB updates)
+        * @return string TS_MW Timestamp
+        * @since 1.26
+        */
+       protected function getDBTouched() {
+               $this->load();
+
+               return $this->mTouched;
+       }
+
        /**
         * @return Password
         * @since 1.24
@@ -3044,10 +3095,10 @@ class User implements IDBAccessObject {
                $this->load();
 
                if ( is_null( $this->mFormerGroups ) ) {
-                       $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
                                ? wfGetDB( DB_MASTER )
                                : wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'user_former_groups',
+                       $res = $db->select( 'user_former_groups',
                                array( 'ufg_group' ),
                                array( 'ufg_user' => $this->mId ),
                                __METHOD__ );
@@ -3586,22 +3637,33 @@ class User implements IDBAccessObject {
                global $wgAuth;
 
                if ( wfReadOnly() ) {
-                       return; // @TODO: caller should deal with this instead!
+                       // @TODO: caller should deal with this instead!
+                       // This should really just be an exception.
+                       MWExceptionHandler::logException( new DBExpectedError(
+                               null,
+                               "Could not update user with ID '{$this->mId}'; DB is read-only."
+                       ) );
+                       return;
                }
 
                $this->load();
                $this->loadPasswords();
                if ( 0 == $this->mId ) {
-                       return;
+                       return; // anon
                }
 
                // This method is for updating existing users, so the user should
                // have been loaded from the master to begin with to avoid problems.
                if ( !( $this->queryFlagsUsed & self::READ_LATEST ) ) {
-                       wfWarn( "Attempting to save slave-loaded User object data." );
+                       wfWarn( "Attempting to save slave-loaded User object with ID '{$this->mId}'." );
                }
 
-               $this->mTouched = self::newTouchedTimestamp();
+               // Get a new user_touched that is higher than the old one.
+               // This will be used for a CAS check as a last-resort safety
+               // check against race conditions and slave lag.
+               $oldTouched = $this->mTouched;
+               $newTouched = $this->newTouchedTimestamp();
+
                if ( !$wgAuth->allowSetLocalPassword() ) {
                        $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
                }
@@ -3616,21 +3678,43 @@ class User implements IDBAccessObject {
                                'user_real_name' => $this->mRealName,
                                'user_email' => $this->mEmail,
                                'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
-                               'user_touched' => $dbw->timestamp( $this->mTouched ),
+                               'user_touched' => $dbw->timestamp( $newTouched ),
                                'user_token' => strval( $this->mToken ),
                                'user_email_token' => $this->mEmailToken,
                                'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
                                'user_password_expires' => $dbw->timestampOrNull( $this->mPasswordExpires ),
                        ), array( /* WHERE */
-                               'user_id' => $this->mId
+                               'user_id' => $this->mId,
+                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
                        ), __METHOD__
                );
 
+               if ( !$dbw->affectedRows() ) {
+                       // Maybe the problem was a missed cache update; clear it to be safe
+                       $this->clearSharedCache();
+                       // User was changed in the meantime or loaded with stale data
+                       MWExceptionHandler::logException( new MWException(
+                               "CAS update failed on user_touched for user ID '{$this->mId}';" .
+                               "the version of the user to be saved is older than the current version."
+                       ) );
+
+                       return;
+               }
+
+               $this->mTouched = $newTouched;
                $this->saveOptions();
 
                Hooks::run( 'UserSaveSettings', array( $this ) );
                $this->clearSharedCache();
                $this->getUserPage()->invalidateCache();
+
+               // T95839: clear the cache again post-commit to reduce race conditions
+               // where stale values are written back to the cache by other threads.
+               // Note: this *still* doesn't deal with REPEATABLE-READ snapshot lag...
+               $that = $this;
+               $dbw->onTransactionIdle( function() use ( $that ) {
+                       $that->clearSharedCache();
+               } );
        }
 
        /**
@@ -3694,7 +3778,7 @@ class User implements IDBAccessObject {
                        'user_token' => strval( $user->mToken ),
                        'user_registration' => $dbw->timestamp( $user->mRegistration ),
                        'user_editcount' => 0,
-                       'user_touched' => $dbw->timestamp( self::newTouchedTimestamp() ),
+                       'user_touched' => $dbw->timestamp( $user->newTouchedTimestamp() ),
                );
                foreach ( $params as $name => $value ) {
                        $fields["user_$name"] = $value;
@@ -3741,7 +3825,7 @@ class User implements IDBAccessObject {
                        $this->setToken(); // init token
                }
 
-               $this->mTouched = self::newTouchedTimestamp();
+               $this->mTouched = $this->newTouchedTimestamp();
 
                $dbw = wfGetDB( DB_MASTER );
                $inWrite = $dbw->writesOrCallbacksPending();
@@ -4724,38 +4808,51 @@ class User implements IDBAccessObject {
                return $groups;
        }
 
+       /**
+        * Deferred version of incEditCountImmediate()
+        */
+       public function incEditCount() {
+               $that = $this;
+               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $that ) {
+                       $that->incEditCountImmediate();
+               } );
+       }
+
        /**
         * Increment the user's edit-count field.
         * Will have no effect for anonymous users.
+        * @since 1.26
         */
-       public function incEditCount() {
-               if ( !$this->isAnon() ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update(
-                               'user',
-                               array( 'user_editcount=user_editcount+1' ),
-                               array( 'user_id' => $this->getId() ),
-                               __METHOD__
-                       );
+       public function incEditCountImmediate() {
+               if ( $this->isAnon() ) {
+                       return;
+               }
 
-                       // Lazy initialization check...
-                       if ( $dbw->affectedRows() == 0 ) {
-                               // Now here's a goddamn hack...
-                               $dbr = wfGetDB( DB_SLAVE );
-                               if ( $dbr !== $dbw ) {
-                                       // If we actually have a slave server, the count is
-                                       // at least one behind because the current transaction
-                                       // has not been committed and replicated.
-                                       $this->initEditCount( 1 );
-                               } else {
-                                       // But if DB_SLAVE is selecting the master, then the
-                                       // count we just read includes the revision that was
-                                       // just added in the working transaction.
-                                       $this->initEditCount();
-                               }
+               $dbw = wfGetDB( DB_MASTER );
+               // No rows will be "affected" if user_editcount is NULL
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount=user_editcount+1' ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+               // Lazy initialization check...
+               if ( $dbw->affectedRows() == 0 ) {
+                       // Now here's a goddamn hack...
+                       $dbr = wfGetDB( DB_SLAVE );
+                       if ( $dbr !== $dbw ) {
+                               // If we actually have a slave server, the count is
+                               // at least one behind because the current transaction
+                               // has not been committed and replicated.
+                               $this->initEditCount( 1 );
+                       } else {
+                               // But if DB_SLAVE is selecting the master, then the
+                               // count we just read includes the revision that was
+                               // just added in the working transaction.
+                               $this->initEditCount();
                        }
                }
-               // edit count in user cache too
+               // Edit count in user cache too
                $this->invalidateCache();
        }
 
index 4d22692..524e701 100644 (file)
@@ -240,11 +240,7 @@ class WatchedItem {
                        } else {
                                // Oldid given and isn't the latest; update the timestamp.
                                // This will result in no further notification emails being sent!
-                               $dbr = wfGetDB( DB_SLAVE );
-                               $notificationTimestamp = $dbr->selectField(
-                                       'revision', 'rev_timestamp',
-                                       array( 'rev_page' => $title->getArticleID(), 'rev_id' => $oldid )
-                               );
+                               $notificationTimestamp = Revision::getTimestampFromId( $title, $oldid );
                                // We need to go one second to the future because of various strict comparisons
                                // throughout the codebase
                                $ts = new MWTimestamp( $notificationTimestamp );
index 9c71f3e..f97dc6a 100644 (file)
@@ -78,7 +78,6 @@ if ( $IP === false ) {
 
 # Grab profiling functions
 require_once "$IP/includes/profiler/ProfilerFunctions.php";
-$wgRUstart = wfGetRusage() ?: array();
 
 # Start the autoloader, so that extensions can derive classes from core files
 require_once "$IP/includes/AutoLoader.php";
index 4be2751..ba9f448 100644 (file)
@@ -375,6 +375,7 @@ $zh2Hant = array(
 '啰' => '囉',
 '啴' => '嘽',
 '啸' => '嘯',
+'喂' => '餵',
 '喷' => '噴',
 '喽' => '嘍',
 '喾' => '嚳',
@@ -415,7 +416,6 @@ $zh2Hant = array(
 '垭' => '埡',
 '垱' => '壋',
 '垲' => '塏',
-'垴' => '堖',
 '埘' => '塒',
 '埙' => '塤',
 '埚' => '堝',
@@ -504,7 +504,6 @@ $zh2Hant = array(
 '岖' => '嶇',
 '岗' => '崗',
 '岘' => '峴',
-'岙' => '嶴',
 '岚' => '嵐',
 '岛' => '島',
 '岭' => '嶺',
@@ -2889,7 +2888,6 @@ $zh2Hant = array(
 '𩧿' => '䮠',
 '𩨀' => '騔',
 '𩨁' => '䮞',
-'𩨂' => '驄',
 '𩨃' => '騝',
 '𩨄' => '騪',
 '𩨅' => '𩤸',
@@ -3002,8 +3000,8 @@ $zh2Hant = array(
 '𫛢' => '鸋',
 '𫛶' => '鶒',
 '𫛸' => '鶗',
-'0出現' => '0出現',
 '0出现' => '0出現',
+'0出現' => '0出現',
 '0出線' => '0出線',
 '0出线' => '0出線',
 '0只支持' => '0只支持',
@@ -3078,7 +3076,8 @@ $zh2Hant = array(
 '9只' => '9隻',
 '9余' => '9餘',
 '·范' => '·范',
-'’s' => '’s',
+'’s ' => '’s',
+'。个中' => '。箇中',
 '〇周后' => '〇周後',
 '〇年' => '〇年',
 '〇只' => '〇隻',
@@ -3116,6 +3115,7 @@ $zh2Hant = array(
 '一争两丑' => '一爭兩醜',
 '一物克一物' => '一物剋一物',
 '一目了然' => '一目了然',
+'一碗面' => '一碗麵',
 '一扎' => '一紮',
 '一冲' => '一衝',
 '一厘一毫' => '一釐一毫',
@@ -3208,8 +3208,8 @@ $zh2Hant = array(
 '不干她' => '不干她',
 '不干它' => '不干它',
 '不干我' => '不干我',
-'不干擾' => '不干擾',
 '不干扰' => '不干擾',
+'不干擾' => '不干擾',
 '不干涉' => '不干涉',
 '不干牠' => '不干牠',
 '不干犯' => '不干犯',
@@ -3219,8 +3219,8 @@ $zh2Hant = array(
 '不吊' => '不弔',
 '不卷' => '不捲',
 '不采' => '不採',
-'不斗膽' => '不斗膽',
 '不斗胆' => '不斗膽',
+'不斗膽' => '不斗膽',
 '不断发' => '不斷發',
 '不每只' => '不每只',
 '不谷' => '不穀',
@@ -3228,8 +3228,8 @@ $zh2Hant = array(
 '不负所托' => '不負所托',
 '不通吊庆' => '不通弔慶',
 '不丑' => '不醜',
-'不采聲' => '不采聲',
 '不采声' => '不采聲',
+'不采聲' => '不采聲',
 '不锈钢' => '不鏽鋼',
 '不食干腊' => '不食乾腊',
 '不斗' => '不鬥',
@@ -3260,6 +3260,7 @@ $zh2Hant = array(
 '中型钟表面' => '中型鐘表面',
 '中型钟表' => '中型鐘錶',
 '中型钟面' => '中型鐘面',
+'中境里' => '中境里',
 '中岳' => '中嶽',
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
@@ -3275,31 +3276,36 @@ $zh2Hant = array(
 '中签订' => '中簽訂',
 '中签' => '中籤',
 '中风后' => '中風後',
-'丰儀' => '丰儀',
 '丰仪' => '丰儀',
+'丰儀' => '丰儀',
 '丰南' => '丰南',
 '丰姿' => '丰姿',
 '丰容' => '丰容',
-'丰度' => '丰度',
 '丰情' => '丰情',
 '丰标' => '丰標',
-'丰標不凡' => '丰標不凡',
 '丰标不凡' => '丰標不凡',
+'丰標不凡' => '丰標不凡',
 '丰神' => '丰神',
 '丰茸' => '丰茸',
 '丰采' => '丰采',
-'丰韻' => '丰韻',
 '丰韵' => '丰韻',
+'丰韻' => '丰韻',
+'丹棱' => '丹稜',
 '主仆' => '主僕',
 '主干' => '主幹',
 '主钟差' => '主鐘差',
 '主钟曲线' => '主鐘曲線',
 '乃系' => '乃係',
 '么么唱唱' => '么么唱唱',
+'么九' => '么九',
 '么儿' => '么兒',
+'么半' => '么半',
 '么喝' => '么喝',
+'么女' => '么女',
 '么妹' => '么妹',
+'么子' => '么子',
 '么弟' => '么弟',
+'么正' => '么正',
 '么爷' => '么爺',
 '么雞' => '么雞',
 '么么小丑' => '么麼小丑',
@@ -3321,12 +3327,8 @@ $zh2Hant = array(
 '九扎' => '九紮',
 '九只' => '九隻',
 '九余' => '九餘',
-'也斗了胆' => '也斗了膽',
-'干上' => '乾上',
 '干干' => '乾乾',
-'干干儿的' => '乾乾兒的',
 '干干净净' => '乾乾淨淨',
-'干了' => '乾了',
 '干井' => '乾井',
 '干个够' => '乾個夠',
 '干儿' => '乾兒',
@@ -3349,7 +3351,6 @@ $zh2Hant = array(
 '干回付' => '乾回付',
 '干圆洁净' => '乾圓潔淨',
 '干地' => '乾地',
-'干坤' => '乾坤',
 '干坞' => '乾塢',
 '干女' => '乾女',
 '干奴才' => '乾奴才',
@@ -3364,7 +3365,6 @@ $zh2Hant = array(
 '干巴' => '乾巴',
 '干式' => '乾式',
 '干弟' => '乾弟',
-'干得' => '乾得',
 '干急' => '乾急',
 '干性' => '乾性',
 '干打雷' => '乾打雷',
@@ -3464,13 +3464,14 @@ $zh2Hant = array(
 '干醋' => '乾醋',
 '干重' => '乾重',
 '干量' => '乾量',
+'干锅' => '乾鍋',
 '干阿奶' => '乾阿奶',
-'干隆' => '乾隆',
 '干雷' => '乾雷',
 '干电' => '乾電',
 '干霍乱' => '乾霍亂',
 '干颡' => '乾顙',
 '干台' => '乾颱',
+'干食' => '乾食',
 '干饭' => '乾飯',
 '干馆' => '乾館',
 '干糇' => '乾餱',
@@ -3484,10 +3485,8 @@ $zh2Hant = array(
 '乱哄' => '亂鬨',
 '乱哄不过来' => '亂鬨不過來',
 '了然后' => '了然後',
-'事情干脆' => '事情干脆',
 '事有斗巧' => '事有鬥巧',
 '事里' => '事裡',
-'事都干脆' => '事都干脆',
 '二不棱登' => '二不稜登',
 '二个' => '二個',
 '二只得' => '二只得',
@@ -3507,11 +3506,11 @@ $zh2Hant = array(
 '于仲文' => '于仲文',
 '于佳卉' => '于佳卉',
 '于来山' => '于來山',
-'于偉國' => '于偉國',
 '于伟国' => '于偉國',
+'于偉國' => '于偉國',
 '于光新' => '于光新',
-'于光遠' => '于光遠',
 '于光远' => '于光遠',
+'于光遠' => '于光遠',
 '于克-兰多县' => '于克-蘭多縣',
 '于克-蘭多縣' => '于克-蘭多縣',
 '于克勒' => '于克勒',
@@ -3530,12 +3529,12 @@ $zh2Hant = array(
 '于吉' => '于吉',
 '于和伟' => '于和偉',
 '于品海' => '于品海',
-'于國楨' => '于國楨',
 '于国桢' => '于國楨',
+'于國楨' => '于國楨',
 '于国治' => '于國治',
 '于國治' => '于國治',
-'于堅' => '于堅',
 '于坚' => '于堅',
+'于堅' => '于堅',
 '于大宝' => '于大寶',
 '于大寶' => '于大寶',
 '于天仁' => '于天仁',
@@ -3558,12 +3557,12 @@ $zh2Hant = array(
 '于小惠' => '于小惠',
 '于少保' => '于少保',
 '于山' => '于山',
-'于山國' => '于山國',
 '于山国' => '于山國',
+'于山國' => '于山國',
 '于帅' => '于帥',
 '于帥' => '于帥',
-'于幼軍' => '于幼軍',
 '于幼军' => '于幼軍',
+'于幼軍' => '于幼軍',
 '于康震' => '于康震',
 '于广洲' => '于廣洲',
 '于廣洲' => '于廣洲',
@@ -3571,14 +3570,14 @@ $zh2Hant = array(
 '于从濂' => '于從濂',
 '于從濂' => '于從濂',
 '于德海' => '于德海',
-'于志寧' => '于志寧',
 '于志宁' => '于志寧',
+'于志寧' => '于志寧',
 '于忠肃集' => '于忠肅集',
 '于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
-'于成龙' => '于成龍',
 '于成龍' => '于成龍',
+'于成龙' => '于成龍',
 '于振' => '于振',
 '于振武' => '于振武',
 '于敏' => '于敏',
@@ -3587,24 +3586,24 @@ $zh2Hant = array(
 '于斯塔德' => '于斯塔德',
 '于斯納爾斯貝里' => '于斯納爾斯貝里',
 '于斯纳尔斯贝里' => '于斯納爾斯貝里',
-'于斯達爾' => '于斯達爾',
 '于斯达尔' => '于斯達爾',
-'äº\8eæ\98\8e濤' => 'äº\8eæ\98\8e濤',
+'äº\8eæ\96¯é\81\94ç\88¾' => 'äº\8eæ\96¯é\81\94ç\88¾',
 '于明涛' => '于明濤',
+'于明濤' => '于明濤',
 '于是之' => '于是之',
 '于晨楠' => '于晨楠',
 '于晴' => '于晴',
 '于会泳' => '于會泳',
 '于會泳' => '于會泳',
-'于根偉' => '于根偉',
 '于根伟' => '于根偉',
+'于根偉' => '于根偉',
 '于格' => '于格',
 '于枫' => '于楓',
 '于楓' => '于楓',
 '于荣光' => '于榮光',
 '于樂' => '于樂',
-'于樹潔' => '于樹潔',
 '于树洁' => '于樹潔',
+'于樹潔' => '于樹潔',
 '于欣' => '于欣',
 '于欣源' => '于欣源',
 '于正昇' => '于正昇',
@@ -3615,18 +3614,18 @@ $zh2Hant = array(
 '于江震' => '于江震',
 '于波' => '于波',
 '于洋' => '于洋',
-'于洪區' => '于洪區',
 '于洪区' => '于洪區',
+'于洪區' => '于洪區',
 '于浩威' => '于浩威',
 '于海' => '于海',
 '于海洋' => '于海洋',
-'于湘蘭' => '于湘蘭',
 '于湘兰' => '于湘蘭',
-'äº\8eæ¼¢è¶\85' => 'äº\8eæ¼¢è¶\85',
+'äº\8eæ¹\98è\98­' => 'äº\8eæ¹\98è\98­',
 '于汉超' => '于漢超',
+'于漢超' => '于漢超',
 '于澄' => '于澄',
-'于澤爾' => '于澤爾',
 '于泽尔' => '于澤爾',
+'于澤爾' => '于澤爾',
 '于涛' => '于濤',
 '于濤' => '于濤',
 '于熙珍' => '于熙珍',
@@ -3655,8 +3654,8 @@ $zh2Hant = array(
 '于谨' => '于謹',
 '于貝爾' => '于貝爾',
 '于贝尔' => '于貝爾',
-'于赠' => '于贈',
 '于贈' => '于贈',
+'于赠' => '于贈',
 '于越' => '于越',
 '于军' => '于軍',
 '于軍' => '于軍',
@@ -3679,23 +3678,24 @@ $zh2Hant = array(
 '于非闇' => '于非闇',
 '于韋斯屈萊' => '于韋斯屈萊',
 '于韦斯屈莱' => '于韋斯屈萊',
-'于风政' => '于風政',
 '于風政' => '于風政',
+'于风政' => '于風政',
 '于飞' => '于飛',
 '于飛島' => '于飛島',
 '于飞岛' => '于飛島',
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
-'于鳳桐' => '于鳳桐',
 '于凤桐' => '于鳳桐',
-'于鳳至' => '于鳳至',
+'于鳳桐' => '于鳳桐',
 '于凤至' => '于鳳至',
-'äº\8eé»\98奧' => 'äº\8eé»\98奧',
+'äº\8eé³³è\87³' => 'äº\8eé³³è\87³',
 '于默奥' => '于默奧',
+'于默奧' => '于默奧',
 '云乎' => '云乎',
 '云云' => '云云',
 '云何' => '云何',
+'云敞' => '云敞',
 '云为' => '云為',
 '云為' => '云為',
 '云然' => '云然',
@@ -3704,6 +3704,7 @@ $zh2Hant = array(
 '五个' => '五個',
 '五周后' => '五周後',
 '五天后' => '五天後',
+'五峰县' => '五峯縣',
 '五岳' => '五嶽',
 '五年' => '五年',
 '五谷' => '五穀',
@@ -3715,7 +3716,6 @@ $zh2Hant = array(
 '五只' => '五隻',
 '五余' => '五餘',
 '井干' => '井幹',
-'井干摧败' => '井榦摧敗',
 '井里' => '井裡',
 '亚于' => '亞於',
 '亚美尼亚历' => '亞美尼亞曆',
@@ -3723,6 +3723,7 @@ $zh2Hant = array(
 '交游' => '交遊',
 '交哄' => '交鬨',
 '亦云' => '亦云',
+'京沈' => '京瀋',
 '亮丑' => '亮醜',
 '亮钟' => '亮鐘',
 '人云' => '人云',
@@ -3739,6 +3740,7 @@ $zh2Hant = array(
 '付托' => '付託',
 '仙后' => '仙后',
 '仙后座' => '仙后座',
+'仙游' => '仙遊',
 '代数里' => '代數裡',
 '代理发行' => '代理發行',
 '代码表' => '代碼表',
@@ -3767,6 +3769,7 @@ $zh2Hant = array(
 '伊郁' => '伊鬱',
 '伏几' => '伏几',
 '伐罪吊民' => '伐罪弔民',
+'休克期' => '休克期',
 '休征' => '休徵',
 '伙头' => '伙頭',
 '伴游' => '伴遊',
@@ -3793,13 +3796,12 @@ $zh2Hant = array(
 '作品里' => '作品裡',
 '作奸犯科' => '作姦犯科',
 '作准' => '作準',
-'你斗了胆' => '你斗了膽',
 '你夸' => '你誇',
 '佣金' => '佣金',
 '佣鈿' => '佣鈿',
 '佣钿' => '佣鈿',
-'佣钱' => '佣錢',
 '佣錢' => '佣錢',
+'佣钱' => '佣錢',
 '佳肴' => '佳肴',
 '佳里鎮' => '佳里鎮',
 '并一不二' => '併一不二',
@@ -3808,7 +3810,7 @@ $zh2Hant = array(
 '并到' => '併到',
 '并合' => '併合',
 '并名' => '併名',
-'并吞' => '併吞',
+'并吞下' => '併吞下',
 '并拢' => '併攏',
 '并案' => '併案',
 '并流' => '併流',
@@ -3846,7 +3848,6 @@ $zh2Hant = array(
 '个里' => '個裡',
 '个钟' => '個鐘',
 '个钟表' => '個鐘錶',
-'们斗了胆' => '們斗了膽',
 '幸免' => '倖免',
 '幸存' => '倖存',
 '幸幸' => '倖幸',
@@ -3870,11 +3871,12 @@ $zh2Hant = array(
 '佣仆' => '傭僕',
 '傲游' => '傲遊',
 '傲霜斗雪' => '傲霜鬥雪',
-'傳位于四太子' => '傳位于四太子',
 '传位于四太子' => '傳位于四太子',
+'傳位于四太子' => '傳位于四太子',
 '传于' => '傳於',
 '债累累' => '債纍纍',
 '傻里傻气' => '傻裡傻氣',
+'仅余' => '僅餘',
 '仆人' => '僕人',
 '仆使' => '僕使',
 '仆仆' => '僕僕',
@@ -3956,14 +3958,15 @@ $zh2Hant = array(
 '凶险' => '兇險',
 '先采' => '先採',
 '光致致' => '光緻緻',
+'克期间' => '克期間',
 '免征' => '免徵',
 '党太尉' => '党太尉',
 '党姓' => '党姓',
 '党家' => '党家',
 '党怀英' => '党懷英',
 '党进' => '党進',
-'党项' => '党項',
 '党項' => '党項',
+'党项' => '党項',
 '内脏' => '內臟',
 '内制' => '內製',
 '内面包' => '內面包',
@@ -4032,10 +4035,10 @@ $zh2Hant = array(
 '冷面相' => '冷面相',
 '冷面' => '冷麵',
 '准三后' => '准三后',
-'准保護' => '准保護',
 '准保护' => '准保護',
-'准保釋' => '准保釋',
+'准保護' => '准保護',
 '准保释' => '准保釋',
+'准保釋' => '准保釋',
 '凌蒙初' => '凌濛初',
 '凝炼' => '凝鍊',
 '几上' => '几上',
@@ -4074,8 +4077,8 @@ $zh2Hant = array(
 '划不來' => '划不來',
 '划不来' => '划不來',
 '划了一会' => '划了一會',
-'划来划去' => '划來划去',
 '划來划去' => '划來划去',
+'划来划去' => '划來划去',
 '划具' => '划具',
 '划到岸' => '划到岸',
 '划到江心' => '划到江心',
@@ -4086,22 +4089,24 @@ $zh2Hant = array(
 '划得來' => '划得來',
 '划得来' => '划得來',
 '划拳' => '划拳',
-'划槳' => '划槳',
 '划桨' => '划槳',
+'划槳' => '划槳',
 '划水' => '划水',
+'划着独木舟' => '划着獨木舟',
+'划着竹筏' => '划着竹筏',
+'划着船' => '划着船',
 '划算' => '划算',
 '划船' => '划船',
 '划艇' => '划艇',
-'划著' => '划著',
 '划行' => '划行',
 '划走' => '划走',
 '划起' => '划起',
-'划進' => '划進',
 '划进' => '划進',
+'划進' => '划進',
 '划过' => '划過',
 '划過' => '划過',
-'划龙舟' => '划龍舟',
 '划龍舟' => '划龍舟',
+'划龙舟' => '划龍舟',
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
@@ -4136,7 +4141,6 @@ $zh2Hant = array(
 '剥制' => '剝製',
 '剩余' => '剩餘',
 '剪其发' => '剪其髮',
-'剪牡丹喂牛' => '剪牡丹喂牛',
 '剪发' => '剪髮',
 '割舍' => '割捨',
 '创获' => '創穫',
@@ -4148,8 +4152,9 @@ $zh2Hant = array(
 '铲头' => '剷頭',
 '划入' => '劃入',
 '划为' => '劃為',
-'å\8a\89ä½³æ\80\9c' => 'å\8a\89ä½³æ\80\9c',
+'å\88\92è\91\97' => 'å\8a\83è\91\97å\90\8d',
 '刘佳怜' => '劉佳怜',
+'劉佳怜' => '劉佳怜',
 '刘芸后' => '劉芸后',
 '力拼' => '力拚',
 '力拼众敌' => '力拼眾敵',
@@ -4157,7 +4162,6 @@ $zh2Hant = array(
 '功勋' => '功勳',
 '功致' => '功緻',
 '加氢精制' => '加氫精制',
-'加注' => '加註',
 '劣于' => '劣於',
 '助于' => '助於',
 '劫余' => '劫餘',
@@ -4179,6 +4183,7 @@ $zh2Hant = array(
 '包扎' => '包紮',
 '匏系' => '匏繫',
 '北山索面' => '北山索麵',
+'北仑河' => '北崙河',
 '北岳' => '北嶽',
 '北回线' => '北迴線',
 '北回铁路' => '北迴鐵路',
@@ -4230,7 +4235,6 @@ $zh2Hant = array(
 '南回线' => '南迴線',
 '南回铁路' => '南迴鐵路',
 '南游' => '南遊',
-'博汇' => '博彙',
 '博采' => '博採',
 '博尔术' => '博爾朮',
 '卜云吉' => '卜云吉',
@@ -4241,7 +4245,6 @@ $zh2Hant = array(
 '印鉴' => '印鑑',
 '危于' => '危於',
 '卵与石斗' => '卵與石鬥',
-'卷发' => '卷髮',
 '卷须' => '卷鬚',
 '厂部' => '厂部',
 '厝薪于火' => '厝薪於火',
@@ -4254,8 +4257,8 @@ $zh2Hant = array(
 '反朴' => '反樸',
 '反冲' => '反衝',
 '反复制' => '反複製',
-'反覆' => '反覆',
 '反复' => '反覆',
+'反覆' => '反覆',
 '取舍' => '取捨',
 '受雇' => '受僱',
 '受托' => '受託',
@@ -4270,12 +4273,13 @@ $zh2Hant = array(
 '口腹之欲' => '口腹之慾',
 '口里' => '口裡',
 '口钟' => '口鐘',
-'古書云' => '古書云',
+'古人有云' => '古人有云',
 '古书云' => '古書云',
+'古書云' => '古書云',
 '古柯咸' => '古柯鹹',
 '古朴' => '古樸',
-'古语云' => '古語云',
 '古語云' => '古語云',
+'古语云' => '古語云',
 '古迹' => '古蹟',
 '古钟' => '古鐘',
 '古钟表' => '古鐘錶',
@@ -4294,8 +4298,8 @@ $zh2Hant = array(
 '只身上有' => '只身上有',
 '只身上沒' => '只身上沒',
 '只身上没' => '只身上沒',
-'只身上無' => '只身上無',
 '只身上无' => '只身上無',
+'只身上無' => '只身上無',
 '只身上的' => '只身上的',
 '只身世' => '只身世',
 '只身份' => '只身份',
@@ -4304,19 +4308,19 @@ $zh2Hant = array(
 '只身子' => '只身子',
 '只身形' => '只身形',
 '只身影' => '只身影',
-'只身後' => '只身後',
 '只身后' => '只身後',
+'只身後' => '只身後',
 '只身心' => '只身心',
 '只身旁' => '只身旁',
 '只身材' => '只身材',
 '只身段' => '只身段',
 '只身为' => '只身為',
 '只身為' => '只身為',
-'只身邊' => '只身邊',
 '只身边' => '只身邊',
+'只身邊' => '只身邊',
 '只身首' => '只身首',
-'只身體' => '只身體',
 '只身体' => '只身體',
+'只身體' => '只身體',
 '只身高' => '只身高',
 '只采声' => '只采聲',
 '叮叮当当' => '叮叮噹噹',
@@ -4339,6 +4343,7 @@ $zh2Hant = array(
 '叶音' => '叶音',
 '叶韵' => '叶韻',
 '吃板刀面' => '吃板刀麵',
+'吃碗面' => '吃碗麵',
 '吃姜' => '吃薑',
 '吃里扒外' => '吃裡扒外',
 '吃里爬外' => '吃裡爬外',
@@ -4359,6 +4364,7 @@ $zh2Hant = array(
 '同伙' => '同夥',
 '同于' => '同於',
 '同余' => '同餘',
+'名单于' => '名單於',
 '后冠' => '后冠',
 '后北街' => '后北街',
 '后土' => '后土',
@@ -4369,19 +4375,19 @@ $zh2Hant = array(
 '后庄' => '后庄',
 '后座' => '后座',
 '后母戊' => '后母戊',
-'后海灣' => '后海灣',
 '后海湾' => '后海灣',
+'后海灣' => '后海灣',
 '后瑞站' => '后瑞站',
 '后稷' => '后稷',
 '后綜' => '后綜',
 '后羿' => '后羿',
 '后街' => '后街',
 '后角' => '后角',
-'后豐' => '后豐',
 '后丰' => '后豐',
+'后豐' => '后豐',
 '后里' => '后里',
-'后髮FK型星' => '后髮FK型星',
 '后发FK型星' => '后髮FK型星',
+'后髮FK型星' => '后髮FK型星',
 '后发座' => '后髮座',
 '后髮座' => '后髮座',
 '后发星系团' => '后髮星系團',
@@ -4406,12 +4412,14 @@ $zh2Hant = array(
 '呆致致' => '呆緻緻',
 '呆里呆气' => '呆裡呆氣',
 '告札' => '告劄',
+'呦喂' => '呦喂',
 '周后' => '周后',
+'周惠后' => '周惠后',
 '周历' => '周曆',
-'周杰倫' => '周杰倫',
-'周杰伦' => '周杰倫',
+'周杰' => '周杰',
 '周历史' => '周歷史',
-'周游' => '周遊',
+'周游列国' => '周遊列國',
+'呵喂' => '呵喂',
 '呼吁' => '呼籲',
 '命中注定' => '命中注定',
 '和奸' => '和姦',
@@ -4422,7 +4430,6 @@ $zh2Hant = array(
 '咯当' => '咯噹',
 '哀吊' => '哀弔',
 '哀挽' => '哀輓',
-'品汇' => '品彙',
 '品鉴' => '品鑑',
 '哄堂大笑' => '哄堂大笑',
 '員山庄' => '員山庄',
@@ -4437,9 +4444,14 @@ $zh2Hant = array(
 '商历' => '商曆',
 '商标准许' => '商標准許',
 '商历史' => '商歷史',
+'啊喂' => '啊喂',
 '启发式' => '啟發式',
 '啷当' => '啷噹',
 '喂了一声' => '喂了一聲',
+'喂喂' => '喂喂',
+'喂哟' => '喂喲',
+'喂!' => '喂!',
+'喂,' => '喂,',
 '善于' => '善於',
 '喜向往' => '喜向往',
 '喜欢表' => '喜歡錶',
@@ -4450,11 +4462,13 @@ $zh2Hant = array(
 '喧哄' => '喧鬨',
 '丧钟' => '喪鐘',
 '乔岳' => '喬嶽',
-'單于' => '單于',
 '单于' => '單于',
+'單于' => '單于',
 '单单于' => '單單於',
 '单干' => '單幹',
 '单打独斗' => '單打獨鬥',
+'哟喂' => '喲喂',
+'喲喂' => '喲喂',
 '嘉谷' => '嘉穀',
 '嘉肴' => '嘉肴',
 '嘴里' => '嘴裡',
@@ -4570,12 +4584,14 @@ $zh2Hant = array(
 '堡子里' => '堡子里',
 '场里' => '場裡',
 '塞耳盗钟' => '塞耳盜鐘',
+'境里' => '境裡',
+'境里程' => '境里程',
 '墓志铭' => '墓志銘',
 '墓志' => '墓誌',
 '增辟' => '增闢',
 '墨子里' => '墨子里',
-'墨沈' => '墨沈',
-'墨沈未干' => '墨瀋未乾',
+'墨沈沈' => '墨沈沈',
+'墨沈' => '墨瀋',
 '垦辟' => '墾闢',
 '壮游' => '壯遊',
 '壮面' => '壯麵',
@@ -4597,16 +4613,16 @@ $zh2Hant = array(
 '多只含' => '多只含',
 '多只在' => '多只在',
 '多只是' => '多只是',
-'多只會' => '多只會',
 '多只会' => '多只會',
+'多只會' => '多只會',
 '多只有' => '多只有',
 '多只比' => '多只比',
 '多只用' => '多只用',
 '多只能' => '多只能',
 '多只限' => '多只限',
 '多只需' => '多只需',
-'多只须' => '多只須',
 '多只須' => '多只須',
+'多只须' => '多只須',
 '多周后' => '多周後',
 '多天后' => '多天後',
 '多于' => '多於',
@@ -4665,7 +4681,6 @@ $zh2Hant = array(
 '大钟' => '大鐘',
 '大只' => '大隻',
 '大风后' => '大風後',
-'大曲酒' => '大麴酒',
 '天克地冲' => '天克地衝',
 '天后' => '天后',
 '天后宫' => '天后宮',
@@ -4692,14 +4707,10 @@ $zh2Hant = array(
 '太丑' => '太醜',
 '太阁' => '太閤',
 '夯干' => '夯幹',
-'夸人' => '夸人',
 '夸克' => '夸克',
-'夸姣' => '夸姣',
-'夸容' => '夸容',
 '夸父' => '夸父',
 '夸特' => '夸特',
 '夸脱' => '夸脫',
-'夸丽' => '夸麗',
 '奇勋' => '奇勳',
 '奇迹' => '奇蹟',
 '奇丑' => '奇醜',
@@ -4710,7 +4721,6 @@ $zh2Hant = array(
 '女仆' => '女僕',
 '奴仆' => '奴僕',
 '奸淫掳掠' => '奸淫擄掠',
-'好干' => '好乾',
 '好家伙' => '好傢夥',
 '好凶' => '好兇',
 '好勇斗狠' => '好勇鬥狠',
@@ -4734,7 +4744,6 @@ $zh2Hant = array(
 '始于' => '始於',
 '委托' => '委託',
 '委托书' => '委託書',
-'姜文杰' => '姜文杰',
 '奸夫' => '姦夫',
 '奸妇' => '姦婦',
 '奸宄' => '姦宄',
@@ -4765,7 +4774,9 @@ $zh2Hant = array(
 '存折' => '存摺',
 '存于' => '存於',
 '孛里海' => '孛里海',
-'孤寡不谷' => '孤寡不穀',
+'孝惠后' => '孝惠后',
+'孙杰' => '孫杰',
+'孫杰' => '孫杰',
 '学家' => '學家',
 '学里' => '學裡',
 '宇宙志' => '宇宙誌',
@@ -4894,24 +4905,27 @@ $zh2Hant = array(
 '山里的' => '山裡的',
 '山谷道' => '山谷道',
 '山重水复' => '山重水複',
+'岫岩' => '岫巖',
 '岱岳' => '岱嶽',
 '峇里海' => '峇里海',
 '峰回' => '峰迴',
 '峻岭' => '峻岭',
-'昆剧' => '崑劇',
 '崑剧' => '崑劇',
+'昆剧' => '崑劇',
 '崑山' => '崑山',
 '昆山' => '崑山',
 '昆冈' => '崑岡',
 '昆仑' => '崑崙',
+'昆嵛' => '崑嵛',
+'昆承湖' => '崑承湖',
 '崑曲' => '崑曲',
 '昆曲' => '崑曲',
-'昆腔' => '崑腔',
 '崑腔' => '崑腔',
-'æ\98\86è\8b\8f' => 'å´\91è\98\87',
+'æ\98\86è\85\94' => 'å´\91è\85\94',
 '崑苏' => '崑蘇',
-'æ\98\86è°\83' => 'å´\91調',
+'æ\98\86è\8b\8f' => 'å´\91è\98\87',
 '崑调' => '崑調',
+'昆调' => '崑調',
 '崖广' => '崖广',
 '嶒棱' => '嶒稜',
 '岳岳' => '嶽嶽',
@@ -4948,6 +4962,7 @@ $zh2Hant = array(
 '师范' => '師範',
 '席卷' => '席捲',
 '带征' => '帶徵',
+'带余' => '帶餘',
 '带发修行' => '帶髮修行',
 '幅图里' => '幅圖裡',
 '干系' => '干係',
@@ -4960,15 +4975,18 @@ $zh2Hant = array(
 '年里' => '年裡',
 '年鉴' => '年鑑',
 '并力' => '并力',
+'并吞' => '并吞',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
 '幸免于难' => '幸免於難',
 '幸于' => '幸於',
 '幸运胡' => '幸運鬍',
+'干上' => '幹上',
 '干下去' => '幹下去',
 '干不了' => '幹不了',
 '干不成' => '幹不成',
+'干了' => '幹了',
 '干事' => '幹事',
 '干些' => '幹些',
 '干人' => '幹人',
@@ -4983,8 +5001,7 @@ $zh2Hant = array(
 '干坏事' => '幹壞事',
 '干完' => '幹完',
 '干家' => '幹家',
-'干将' => '幹將',
-'干得了' => '幹得了',
+'干得' => '幹得',
 '干性油' => '幹性油',
 '干才' => '幹才',
 '干掉' => '幹掉',
@@ -5027,8 +5044,8 @@ $zh2Hant = array(
 '床席' => '床蓆',
 '店里' => '店裡',
 '府干卿' => '府干卿',
-'府干擾' => '府干擾',
 '府干扰' => '府干擾',
+'府干擾' => '府干擾',
 '府干政' => '府干政',
 '府干涉' => '府干涉',
 '府干犯' => '府干犯',
@@ -5041,8 +5058,8 @@ $zh2Hant = array(
 '厨余' => '廚餘',
 '厮斗' => '廝鬥',
 '庙里' => '廟裡',
-'廢后' => '廢后',
 '废后' => '廢后',
+'廢后' => '廢后',
 '广征' => '廣徵',
 '广舍' => '廣捨',
 '延历' => '延曆',
@@ -5093,9 +5110,11 @@ $zh2Hant = array(
 '弘历史' => '弘歷史',
 '弱于' => '弱於',
 '弱水三千只取一瓢' => '弱水三千只取一瓢',
-'張三丰' => '張三丰',
 '张三丰' => '張三丰',
+'張三丰' => '張三丰',
 '张勋' => '張勳',
+'张杰' => '張杰',
+'張杰' => '張杰',
 '张乐于张徐' => '張樂于張徐',
 '强制作用' => '強制作用',
 '强奸' => '強姦',
@@ -5109,13 +5128,9 @@ $zh2Hant = array(
 '弹子台' => '彈子檯',
 '弹珠台' => '彈珠檯',
 '汇刊' => '彙刊',
-'汇报' => '彙報',
-'汇整' => '彙整',
 '汇算' => '彙算',
-'汇编' => '彙編',
 '汇纂' => '彙纂',
 '汇辑' => '彙輯',
-'汇集' => '彙集',
 '形单影只' => '形單影隻',
 '形于' => '形於',
 '彭于晏' => '彭于晏',
@@ -5133,11 +5148,13 @@ $zh2Hant = array(
 '后印' => '後印',
 '后台老板' => '後台老板',
 '后天' => '後天',
+'後庄' => '後庄',
 '后面店' => '後面店',
 '徐干' => '徐幹',
 '徒杠' => '徒杠',
 '徒托空言' => '徒託空言',
 '得到回复' => '得到回覆',
+'得力干将' => '得力幹將',
 '从仆' => '從僕',
 '从图里' => '從圖裡',
 '从山里' => '從山裡',
@@ -5326,7 +5343,7 @@ $zh2Hant = array(
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
 '忠于' => '忠於',
-'快干' => '快',
+'快干' => '快',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怒于' => '怒於',
@@ -5381,6 +5398,7 @@ $zh2Hant = array(
 '愿而恭' => '愿而恭',
 '栗冽' => '慄冽',
 '栗栗' => '慄慄',
+'慈溪' => '慈谿',
 '慌里慌张' => '慌裡慌張',
 '惨淡' => '慘澹',
 '庆吊' => '慶弔',
@@ -5406,9 +5424,8 @@ $zh2Hant = array(
 '应征' => '應徵',
 '应钟' => '應鐘',
 '懔栗' => '懍慄',
-'蒙懂' => '懞懂',
-'蒙蒙懂懂' => '懞懞懂懂',
-'蒙直' => '懞直',
+'懞懞懂懂' => '懞懞懂懂',
+'懞直' => '懞直',
 '惩忿窒欲' => '懲忿窒欲',
 '怀里' => '懷裡',
 '怀钟' => '懷鐘',
@@ -5437,20 +5454,19 @@ $zh2Hant = array(
 '所占算' => '所占算',
 '所托' => '所託',
 '扁拟谷盗虫' => '扁擬穀盜蟲',
-'手冢治虫' => '手塚治虫',
 '手塚治虫' => '手塚治虫',
 '手折' => '手摺',
-'手表態' => '手表態',
 '手表态' => '手表態',
+'手表態' => '手表態',
 '手表明' => '手表明',
-'手表決' => '手表決',
 '手表决' => '手表決',
+'手表決' => '手表決',
 '手表演' => '手表演',
-'手表現' => '手表現',
 '手表现' => '手表現',
+'手表現' => '手表現',
 '手表示' => '手表示',
-'手表達' => '手表達',
 '手表达' => '手表達',
+'手表達' => '手表達',
 '手表露' => '手表露',
 '手表面' => '手表面',
 '手里剑' => '手裏劍',
@@ -5484,7 +5500,6 @@ $zh2Hant = array(
 '打斗' => '打鬥',
 '托管国' => '托管國',
 '扛大梁' => '扛大樑',
-'捍御' => '扞禦',
 '扯面' => '扯麵',
 '扶余' => '扶餘',
 '批准的' => '批准的',
@@ -5573,6 +5588,7 @@ $zh2Hant = array(
 '捉奸党' => '捉奸黨',
 '捉奸' => '捉姦',
 '捉发' => '捉髮',
+'捍御' => '捍禦',
 '捏面人' => '捏麵人',
 '舍不得' => '捨不得',
 '舍入' => '捨入',
@@ -5620,7 +5636,6 @@ $zh2Hant = array(
 '卷纸' => '捲紙',
 '卷缩' => '捲縮',
 '卷舌' => '捲舌',
-'卷铺盖' => '捲舖蓋',
 '卷烟' => '捲菸',
 '卷叶蛾' => '捲葉蛾',
 '卷袖' => '捲袖',
@@ -5628,9 +5643,10 @@ $zh2Hant = array(
 '卷起' => '捲起',
 '卷轴' => '捲軸',
 '卷逃' => '捲逃',
+'卷铺盖' => '捲鋪蓋',
 '卷云' => '捲雲',
 '卷风' => '捲風',
-'卷发器' => '捲髮器',
+'卷发' => '捲髮',
 '捵面' => '捵麵',
 '捶炼' => '捶鍊',
 '扫荡' => '掃蕩',
@@ -5686,8 +5702,8 @@ $zh2Hant = array(
 '采种' => '採種',
 '采空区' => '採空區',
 '采空采穗' => '採空採穗',
-'采纳' => '採納',
 '采納' => '採納',
+'采纳' => '採納',
 '采给' => '採給',
 '采花' => '採花',
 '采芹人' => '採芹人',
@@ -5734,8 +5750,8 @@ $zh2Hant = array(
 '揪发' => '揪髮',
 '揪须' => '揪鬚',
 '揭丑' => '揭醜',
-'揮手表' => '揮手表',
 '挥手表' => '揮手表',
+'揮手表' => '揮手表',
 '搋面' => '搋麵',
 '损于' => '損於',
 '搏斗' => '搏鬥',
@@ -5773,7 +5789,8 @@ $zh2Hant = array(
 '撩斗' => '撩鬥',
 '播于' => '播於',
 '扑冬' => '撲鼕',
-'扑冬冬' => '撲鼕鼕',
+'扑咚' => '撲鼕',
+'扑咚咚' => '撲鼕鼕',
 '擀面' => '擀麵',
 '击扑' => '擊扑',
 '击钟' => '擊鐘',
@@ -5781,7 +5798,6 @@ $zh2Hant = array(
 '担仔面' => '擔仔麵',
 '担担面' => '擔擔麵',
 '据云' => '據云',
-'据干而窥井底' => '據榦而窺井底',
 '擢发' => '擢髮',
 '擦干' => '擦乾',
 '擦干净' => '擦乾淨',
@@ -5793,7 +5809,7 @@ $zh2Hant = array(
 '收获' => '收穫',
 '改征' => '改徵',
 '改采' => '改採',
-'放挣' => '放懞掙',
+'放挣' => '放懞掙',
 '放荡' => '放蕩',
 '放松' => '放鬆',
 '政斗' => '政鬥',
@@ -5840,14 +5856,15 @@ $zh2Hant = array(
 '数与虏确' => '數與虜确',
 '数只' => '數隻',
 '文丑' => '文丑',
-'文汇报' => '文匯報',
 '文学志' => '文學誌',
 '文征明' => '文徵明',
 '文思泉涌' => '文思泉湧',
+'文杰' => '文杰',
 '文采郁郁' => '文采郁郁',
 '斗牛星' => '斗牛星',
 '斫雕为朴' => '斫雕為樸',
 '新井里美' => '新井里美',
+'新干县' => '新幹縣',
 '新历' => '新曆',
 '新历史' => '新歷史',
 '新扎' => '新紮',
@@ -5855,12 +5872,10 @@ $zh2Hant = array(
 '断发' => '斷髮',
 '断发文身' => '斷髮文身',
 '方便面' => '方便麵',
-'方几' => '方几',
 '方向往' => '方向往',
 '方志恒' => '方志恒',
 '方法里' => '方法裡',
 '方志' => '方誌',
-'方面' => '方面',
 '于0' => '於0',
 '于1' => '於1',
 '于2' => '於2',
@@ -5964,14 +5979,13 @@ $zh2Hant = array(
 '于陆' => '於陸',
 '于震中' => '於震中',
 '于震前' => '於震前',
-'äº\8eé\9c\87å\90\8e' => 'æ\96¼é\9c\87å\90\8e',
+'äº\8eé\9c\87å\90\8e' => 'æ\96¼é\9c\87å¾\8c',
 '施舍' => '施捨',
 '施于' => '施於',
 '施舍之道' => '施舍之道',
 '旁征博引' => '旁徵博引',
 '旁注' => '旁註',
 '旅游' => '旅遊',
-'旋干转坤' => '旋乾轉坤',
 '旋回' => '旋迴',
 '族里' => '族裡',
 '日心历表' => '日心曆表',
@@ -5991,11 +6005,13 @@ $zh2Hant = array(
 '明范' => '明範',
 '明鉴' => '明鑑',
 '易于' => '易於',
+'昔人有云' => '昔人有云',
 '星历' => '星曆',
 '星期后' => '星期後',
 '星历史' => '星歷史',
 '春游' => '春遊',
 '春香斗学' => '春香鬥學',
+'昭惠后' => '昭惠后',
 '是发小' => '是髮小',
 '时钟' => '時鐘',
 '时间不准' => '時間不準',
@@ -6004,7 +6020,7 @@ $zh2Hant = array(
 '晚钟' => '晚鐘',
 '晞发' => '晞髮',
 '晨钟' => '晨鐘',
-'æ\99®å\86¬å\86¬' => '普鼕鼕',
+'æ\99®å\92\9aå\92\9a' => '普鼕鼕',
 '晾干' => '晾乾',
 '暗地里' => '暗地裡',
 '暗沟里' => '暗溝裡',
@@ -6030,7 +6046,6 @@ $zh2Hant = array(
 '晒谷' => '曬穀',
 '曰云' => '曰云',
 '更仆难数' => '更僕難數',
-'更加注' => '更加注',
 '更签' => '更籤',
 '更钟' => '更鐘',
 '书签' => '書籤',
@@ -6040,8 +6055,8 @@ $zh2Hant = array(
 '曾朴' => '曾樸',
 '最多' => '最多',
 '最多只' => '最多只',
-'會干擾' => '會干擾',
 '会干扰' => '會干擾',
+'會干擾' => '會干擾',
 '会干' => '會幹',
 '会吊' => '會弔',
 '会里' => '會裡',
@@ -6056,8 +6071,8 @@ $zh2Hant = array(
 '有只不' => '有只不',
 '有只允' => '有只允',
 '有只容' => '有只容',
-'有只采' => '有只採',
 '有只採' => '有只採',
+'有只采' => '有只採',
 '有只是' => '有只是',
 '有只用' => '有只用',
 '有回复' => '有回覆',
@@ -6066,8 +6081,8 @@ $zh2Hant = array(
 '有征战' => '有征戰',
 '有征戰' => '有征戰',
 '有征服' => '有征服',
-'有征讨' => '有征討',
 '有征討' => '有征討',
+'有征讨' => '有征討',
 '有征' => '有徵',
 '有恒街' => '有恒街',
 '有栖川' => '有栖川',
@@ -6101,6 +6116,7 @@ $zh2Hant = array(
 '朱理安历史' => '朱理安歷史',
 '朴子里' => '朴子里',
 '李志喜' => '李志喜',
+'李适' => '李适',
 '李连杰' => '李連杰',
 '李連杰' => '李連杰',
 '材干' => '材幹',
@@ -6113,20 +6129,22 @@ $zh2Hant = array(
 '束发' => '束髮',
 '杠人' => '杠人',
 '杠梁' => '杠梁',
-'杠轂' => '杠轂',
 '杠毂' => '杠轂',
+'杠轂' => '杠轂',
 '杯干' => '杯乾',
 '杯面' => '杯麵',
 '杰伦' => '杰倫',
-'æ\9d°å¨\81ç\88¾é\9f³æ¨\82' => 'æ\9d°å¨\81ç\88¾é\9f³æ¨\82',
-'杰威尔音乐' => '杰威爾音樂',
-'杰特' => '杰特',
+'æ\9d°å\80«' => 'æ\9d°å\80«',
+'杰威尔' => '杰威爾',
+'杰威爾' => '杰威爾',
 '东周钟' => '東周鐘',
 '东岳' => '東嶽',
 '東湖里' => '東湖里',
 '东冲西突' => '東衝西突',
 '东游' => '東遊',
+'松口镇' => '松口鎮',
 '松山庄' => '松山庄',
+'松溪县' => '松谿縣',
 '板荡' => '板蕩',
 '林宏岳' => '林宏嶽',
 '林杰樑' => '林杰樑',
@@ -6147,6 +6165,7 @@ $zh2Hant = array(
 '柜子' => '柜子',
 '柜柳' => '柜柳',
 '柱梁' => '柱樑',
+'柳斌杰' => '柳斌杰',
 '柳诒征' => '柳詒徵',
 '栖栖皇皇' => '栖栖皇皇',
 '栗栖溪' => '栗栖溪',
@@ -6160,6 +6179,7 @@ $zh2Hant = array(
 '格里高利历' => '格里高利曆',
 '格斗' => '格鬥',
 '桂圆干' => '桂圓乾',
+'框里' => '框裡',
 '桌几' => '桌几',
 '桌历' => '桌曆',
 '桌历史' => '桌歷史',
@@ -6185,14 +6205,15 @@ $zh2Hant = array(
 '植发' => '植髮',
 '椒面' => '椒麵',
 '椰枣干' => '椰棗乾',
-'楊雅筑' => '楊雅筑',
 '杨雅筑' => '楊雅筑',
+'楊雅筑' => '楊雅筑',
 '桢干' => '楨幹',
 '业余' => '業餘',
 '榨干' => '榨乾',
 '枪杆' => '槍桿',
 '杠杆' => '槓桿',
 '乐器钟' => '樂器鐘',
+'乐游原' => '樂遊原',
 '樊于期' => '樊於期',
 '梁上' => '樑上',
 '梁柱' => '樑柱',
@@ -6208,8 +6229,8 @@ $zh2Hant = array(
 '模范14棒' => '模范14棒',
 '模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
-'模范三軍' => '模范三軍',
 '模范三军' => '模范三軍',
+'模范三軍' => '模范三軍',
 '模范棒棒堂' => '模范棒棒堂',
 '模制' => '模製',
 '样范' => '樣範',
@@ -6233,8 +6254,8 @@ $zh2Hant = array(
 '朴陋' => '樸陋',
 '朴马' => '樸馬',
 '朴鲁' => '樸魯',
-'树干' => '樹幹',
 '树林里' => '樹林裡',
+'树干' => '樹榦',
 '树梁' => '樹樑',
 '桥梁' => '橋樑',
 '机械系' => '機械系',
@@ -6242,6 +6263,7 @@ $zh2Hant = array(
 '机械表' => '機械錶',
 '机械钟' => '機械鐘',
 '机械钟表' => '機械鐘錶',
+'横峰县' => '橫峯縣',
 '横征暴敛' => '橫徵暴斂',
 '横梁' => '橫樑',
 '横冲' => '橫衝',
@@ -6250,6 +6272,7 @@ $zh2Hant = array(
 '台灯' => '檯燈',
 '台球' => '檯球',
 '台面上' => '檯面上',
+'台面化' => '檯面化',
 '柜台' => '櫃檯',
 '栉发工' => '櫛髮工',
 '欲海难填' => '欲海難填',
@@ -6259,6 +6282,7 @@ $zh2Hant = array(
 '欧游' => '歐遊',
 '止于' => '止於',
 '正官庄' => '正官庄',
+'正杰' => '正杰',
 '武丑' => '武丑',
 '武后' => '武后',
 '武斗' => '武鬥',
@@ -6299,6 +6323,7 @@ $zh2Hant = array(
 '水来汤里去' => '水來湯裡去',
 '水准' => '水準',
 '水无怜奈' => '水無怜奈',
+'水表面' => '水表面',
 '水里' => '水裡',
 '水里商工' => '水里商工',
 '水里溪' => '水里溪',
@@ -6313,8 +6338,8 @@ $zh2Hant = array(
 '求知欲' => '求知慾',
 '求签' => '求籤',
 '求道于盲' => '求道於盲',
-'污蔑' => '汙衊',
 '池里' => '池裡',
+'污蔑' => '污衊',
 '汤卤' => '汤滷',
 '汲于' => '汲於',
 '决斗' => '決鬥',
@@ -6327,15 +6352,14 @@ $zh2Hant = array(
 '没事干' => '沒事幹',
 '没干' => '沒幹',
 '没折至' => '沒摺至',
-'没梢干' => '沒梢幹',
 '没样范' => '沒樣範',
 '没准' => '沒準',
 '冲冠发怒' => '沖冠髮怒',
 '冲天' => '沖天',
+'沙琅' => '沙瑯',
 '沙羡' => '沙羡',
 '沙里淘金' => '沙裡淘金',
 '河岳' => '河嶽',
-'河流汇集' => '河流匯集',
 '河里' => '河裡',
 '油泼面' => '油潑麵',
 '油斗' => '油鬥',
@@ -6356,7 +6380,7 @@ $zh2Hant = array(
 '泱郁' => '泱鬱',
 '泳气钟' => '泳氣鐘',
 '洄游' => '洄遊',
-'æ´\8b河大æ\9b²' => 'æ´\8b河大麴',
+'æ´\8b河大æ\9b²' => 'æ´\8b河大麯',
 '洒家' => '洒家',
 '洒扫' => '洒掃',
 '洒水' => '洒水',
@@ -6391,8 +6415,8 @@ $zh2Hant = array(
 '浮夸' => '浮誇',
 '浮松' => '浮鬆',
 '海干' => '海乾',
-'海淀山後' => '海淀山後',
 '海淀山后' => '海淀山後',
+'海淀山後' => '海淀山後',
 '浸卤' => '浸滷',
 '涂善妮' => '涂善妮',
 '涂坤' => '涂坤',
@@ -6413,8 +6437,8 @@ $zh2Hant = array(
 '涂醒哲' => '涂醒哲',
 '涂長望' => '涂長望',
 '涂长望' => '涂長望',
-'涂鸿钦' => '涂鴻欽',
 '涂鴻欽' => '涂鴻欽',
+'涂鸿钦' => '涂鴻欽',
 '涳蒙' => '涳濛',
 '涸干' => '涸乾',
 '凉席' => '涼蓆',
@@ -6425,7 +6449,6 @@ $zh2Hant = array(
 '泪如泉涌' => '淚如泉湧',
 '淡于' => '淡於',
 '淡蒙蒙' => '淡濛濛',
-'淡朱' => '淡硃',
 '净余' => '淨餘',
 '净发' => '淨髮',
 '淫欲' => '淫慾',
@@ -6495,8 +6518,10 @@ $zh2Hant = array(
 '准军事' => '準軍事',
 '准头' => '準頭',
 '准点' => '準點',
+'沟大曲' => '溝大麯',
 '溟蒙' => '溟濛',
 '溢于' => '溢於',
+'温洛克期' => '溫洛克期',
 '溲面' => '溲麵',
 '溺于' => '溺於',
 '滃郁' => '滃鬱',
@@ -6542,6 +6567,7 @@ $zh2Hant = array(
 '潮涌' => '潮湧',
 '溃于' => '潰於',
 '涩谷区' => '澀谷區',
+'澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
 '澒蒙' => '澒濛',
 '泽渗漓而下降' => '澤滲灕而下降',
@@ -6560,11 +6586,20 @@ $zh2Hant = array(
 '蒙汜' => '濛汜',
 '蒙蒙细雨' => '濛濛細雨',
 '蒙雾' => '濛霧',
-'蒙松雨' => '濛鬆雨',
 '蒙鸿' => '濛鴻',
+'浚州' => '濬州',
+'浚县' => '濬縣',
 '滨田里佳子' => '濱田里佳子',
-'沈吉线' => '瀋吉線',
+'沈丹客运' => '瀋丹客運',
+'沈丹线' => '瀋丹線',
+'沈丹铁路' => '瀋丹鐵路',
+'沈北' => '瀋北',
+'沈吉' => '瀋吉',
+'沈大线' => '瀋大線',
+'沈大铁路' => '瀋大鐵路',
+'沈大高速' => '瀋大高速',
 '沈山线' => '瀋山線',
+'沈山铁路' => '瀋山鐵路',
 '沈州' => '瀋州',
 '沈抚' => '瀋撫',
 '沈水' => '瀋水',
@@ -6613,6 +6648,7 @@ $zh2Hant = array(
 '炼制' => '煉製',
 '煎面' => '煎麵',
 '烟卷' => '煙捲',
+'烟台' => '煙臺',
 '照入签' => '照入籤',
 '照相干片' => '照相乾片',
 '煨干' => '煨乾',
@@ -6701,6 +6737,7 @@ $zh2Hant = array(
 '理次发' => '理次髮',
 '理发' => '理髮',
 '琴钟' => '琴鐘',
+'珐琅' => '琺瑯',
 '瑞城里' => '瑞城里',
 '瑞征' => '瑞徵',
 '瑶签' => '瑤籤',
@@ -6736,6 +6773,7 @@ $zh2Hant = array(
 '男仆' => '男僕',
 '界里' => '界裡',
 '畏于' => '畏於',
+'留长发' => '留長髮',
 '留发' => '留髮',
 '毕于' => '畢於',
 '毕业于' => '畢業於',
@@ -6785,11 +6823,11 @@ $zh2Hant = array(
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
-'百只夠' => '百只夠',
 '百只够' => '百只夠',
+'百只夠' => '百只夠',
 '百只怕' => '百只怕',
-'百只足夠' => '百只足夠',
 '百只足够' => '百只足夠',
+'百只足夠' => '百只足夠',
 '百周后' => '百周後',
 '百天后' => '百天後',
 '百年' => '百年',
@@ -6805,6 +6843,8 @@ $zh2Hant = array(
 '的回复' => '的回覆',
 '的图里' => '的圖裡',
 '的山里' => '的山裡',
+'的干将' => '的幹將',
+'的个中' => '的箇中',
 '的钟' => '的鐘',
 '的长发' => '的長髮',
 '的发小' => '的髮小',
@@ -6877,6 +6917,7 @@ $zh2Hant = array(
 '瞳蒙' => '瞳矇',
 '蒙事' => '矇事',
 '蒙昧无知' => '矇昧無知',
+'蒙松雨' => '矇松雨',
 '蒙混' => '矇混',
 '蒙瞍' => '矇瞍',
 '蒙眬' => '矇矓',
@@ -6887,6 +6928,7 @@ $zh2Hant = array(
 '矜夸' => '矜誇',
 '短几' => '短几',
 '短于' => '短於',
+'短发生' => '短發生',
 '短发' => '短髮',
 '矮几' => '矮几',
 '石几' => '石几',
@@ -6895,20 +6937,14 @@ $zh2Hant = array(
 '石英钟' => '石英鐘',
 '石英钟表' => '石英鐘錶',
 '石钟' => '石鐘',
-'石钟山' => '石鐘山',
 '研制' => '研製',
 '砰当' => '砰噹',
 '破鉴' => '破鑑',
-'朱唇皓齿' => '硃唇皓齒',
-'朱批' => '硃批',
 '朱砂' => '硃砂',
-'朱笔' => '硃筆',
-'朱红色' => '硃紅色',
-'朱色' => '硃色',
-'朱谕' => '硃諭',
 '硬干' => '硬幹',
 '确瘠' => '确瘠',
 '碑志' => '碑誌',
+'碗里' => '碗裡',
 '碰钟' => '碰鐘',
 '确系' => '確係',
 '码表' => '碼錶',
@@ -6952,7 +6988,6 @@ $zh2Hant = array(
 '私欲' => '私慾',
 '私斗' => '私鬥',
 '秋游' => '秋遊',
-'秋阴入井干' => '秋陰入井幹',
 '秋发' => '秋髮',
 '种丹妮' => '种丹妮',
 '种师中' => '种師中',
@@ -6965,6 +7000,7 @@ $zh2Hant = array(
 '秒表示' => '秒表示',
 '秒钟' => '秒鐘',
 '秤杆' => '秤桿',
+'秦沈客运' => '秦瀋客運',
 '移祸于' => '移禍於',
 '稀松' => '稀鬆',
 '棱台' => '稜台',
@@ -7010,6 +7046,7 @@ $zh2Hant = array(
 '谷雨' => '穀雨',
 '谷类' => '穀類',
 '谷食' => '穀食',
+'穆棱' => '穆稜',
 '穆罕默德历' => '穆罕默德曆',
 '穆罕默德历史' => '穆罕默德歷史',
 '积淀' => '積澱',
@@ -7035,7 +7072,6 @@ $zh2Hant = array(
 '窃钟掩耳' => '竊鐘掩耳',
 '立于' => '立於',
 '立范' => '立範',
-'站干岸儿' => '站乾岸兒',
 '童仆' => '童僕',
 '竞斗' => '競鬥',
 '竹几' => '竹几',
@@ -7043,6 +7079,7 @@ $zh2Hant = array(
 '竹签' => '竹籤',
 '竹席' => '竹蓆',
 '竹制' => '竹製',
+'竹溪县' => '竹谿縣',
 '笑里藏刀' => '笑裡藏刀',
 '第一出现' => '第一出現',
 '第一出現' => '第一出現',
@@ -7053,8 +7090,8 @@ $zh2Hant = array(
 '第三出局' => '第三出局',
 '第三出' => '第三齣',
 '第九出' => '第九齣',
-'第二出线' => '第二出線',
 '第二出線' => '第二出線',
+'第二出线' => '第二出線',
 '第二出' => '第二齣',
 '第五出局' => '第五出局',
 '第五出' => '第五齣',
@@ -7076,21 +7113,19 @@ $zh2Hant = array(
 '筑肥' => '筑肥',
 '筑西' => '筑西',
 '筑邦' => '筑邦',
-'筑陽' => '筑陽',
 '筑阳' => '筑陽',
+'筑陽' => '筑陽',
 '答复' => '答覆',
 '筵几' => '筵几',
 '个中原因' => '箇中原因',
-'个中奥妙' => '箇中奧妙',
-'个中奥秘' => '箇中奧秘',
+'个中奥' => '箇中奧',
 '个中好手' => '箇中好手',
 '个中强手' => '箇中強手',
-'个中消息' => '箇中消息',
 '个中滋味' => '箇中滋味',
 '个中玄机' => '箇中玄機',
 '个中理由' => '箇中理由',
-'个中讯息' => '箇中訊息',
-'个中资讯' => '箇中資訊',
+'个中翘楚' => '箇中翹楚',
+'个中道理' => '箇中道理',
 '个中高手' => '箇中高手',
 '个旧' => '箇舊',
 '算历' => '算曆',
@@ -7115,8 +7150,9 @@ $zh2Hant = array(
 '范金' => '範金',
 '简并' => '簡併',
 '简朴' => '簡樸',
-'ç°¡ç­\91ç¿\8e' => 'ç°¡ç­\91ç¿\8e',
+'ç®\80ç\9f­å\8f\91' => 'ç°¡ç\9f­ç\99¼',
 '简筑翎' => '簡筑翎',
+'簡筑翎' => '簡筑翎',
 '簸荡' => '簸蕩',
 '签幐' => '籤幐',
 '签押' => '籤押',
@@ -7198,13 +7234,12 @@ $zh2Hant = array(
 '绝于' => '絕於',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
-'給我干脆' => '給我干脆',
-'给我干脆' => '給我干脆',
 '给于' => '給於',
 '丝恩发怨' => '絲恩髮怨',
 '丝制' => '絲製',
 '丝发' => '絲髮',
 '绑扎' => '綁紮',
+'绥棱' => '綏稜',
 '捆扎' => '綑紮',
 '經有云' => '經有云',
 '经有云' => '經有云',
@@ -7213,6 +7248,9 @@ $zh2Hant = array(
 '维系' => '維繫',
 '绾发' => '綰髮',
 '纲鉴' => '綱鑑',
+'網球台' => '網球台',
+'网球台' => '網球台',
+'网站里' => '網站裡',
 '网里' => '網裡',
 '网志' => '網誌',
 '网游' => '網遊',
@@ -7237,6 +7275,7 @@ $zh2Hant = array(
 '缝里' => '縫裡',
 '缝制' => '縫製',
 '缩栗' => '縮慄',
+'缩短发' => '縮短發',
 '纵欲' => '縱慾',
 '纤夫' => '縴夫',
 '纤手' => '縴手',
@@ -7247,7 +7286,6 @@ $zh2Hant = array(
 '繁复' => '繁複',
 '繁钟' => '繁鐘',
 '绷扒吊拷' => '繃扒弔拷',
-'穗帏飘井干' => '繐幃飄井幹',
 '绕梁' => '繞樑',
 '绘制' => '繪製',
 '系上。' => '繫上。',
@@ -7273,6 +7311,7 @@ $zh2Hant = array(
 '系紧' => '繫緊',
 '系绳' => '繫繩',
 '系累' => '繫纍',
+'系舟' => '繫舟',
 '系船' => '繫船',
 '系辞' => '繫辭',
 '系鞋带' => '繫鞋帶',
@@ -7317,7 +7356,7 @@ $zh2Hant = array(
 '老干' => '老乾',
 '老仆' => '老僕',
 '老干部' => '老幹部',
-'老' => '老懞',
+'老' => '老懞',
 '老于' => '老於',
 '老爷钟' => '老爺鐘',
 '老姜' => '老薑',
@@ -7357,6 +7396,7 @@ $zh2Hant = array(
 '胜键' => '胜鍵',
 '胡云' => '胡云',
 '胡子昂' => '胡子昂',
+'胡杰' => '胡杰',
 '胡朴安' => '胡樸安',
 '胡里胡涂' => '胡裡胡塗',
 '胰脏' => '胰臟',
@@ -7419,6 +7459,7 @@ $zh2Hant = array(
 '自制能力' => '自制能力',
 '自于' => '自於',
 '自然数里' => '自然數裡',
+'自由钟' => '自由鐘',
 '自制' => '自製',
 '自觉自愿' => '自覺自愿',
 '自夸' => '自誇',
@@ -7431,8 +7472,8 @@ $zh2Hant = array(
 '台静农' => '臺靜農',
 '臻于' => '臻於',
 '舂谷' => '舂穀',
-'舉手表' => '舉手表',
 '举手表' => '舉手表',
+'舉手表' => '舉手表',
 '舊庄' => '舊庄',
 '旧历' => '舊曆',
 '旧历史' => '舊歷史',
@@ -7474,8 +7515,8 @@ $zh2Hant = array(
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
-'范文瀾' => '范文瀾',
 '范文澜' => '范文瀾',
+'范文瀾' => '范文瀾',
 '范文照' => '范文照',
 '范文程' => '范文程',
 '范文芳' => '范文芳',
@@ -7484,8 +7525,8 @@ $zh2Hant = array(
 '范登堡' => '范登堡',
 '范賢惠' => '范賢惠',
 '范贤惠' => '范賢惠',
-'茅于轼' => '茅于軾',
 '茅于軾' => '茅于軾',
+'茅于轼' => '茅于軾',
 '茶几' => '茶几',
 '茶余' => '茶餘',
 '茶面' => '茶麵',
@@ -7502,12 +7543,12 @@ $zh2Hant = array(
 '莽荡' => '莽蕩',
 '菜干' => '菜乾',
 '菜坛' => '菜罈',
-'菜肴' => '菜',
+'菜肴' => '菜',
 '菠棱菜' => '菠稜菜',
 '菠萝干' => '菠蘿乾',
 '华严钟' => '華嚴鐘',
-'萬一只' => '萬一只',
 '万一只' => '萬一只',
+'萬一只' => '萬一只',
 '万个' => '萬個',
 '万周后' => '萬周後',
 '万天后' => '萬天後',
@@ -7589,8 +7630,8 @@ $zh2Hant = array(
 '熏风' => '薰風',
 '熏香' => '薰香',
 '苧悴' => '薴悴',
-'薴烯' => '薴烯',
 '苧烯' => '薴烯',
+'薴烯' => '薴烯',
 '借以' => '藉以',
 '借助' => '藉助',
 '借口' => '藉口',
@@ -7612,10 +7653,11 @@ $zh2Hant = array(
 '藤制' => '藤製',
 '药签' => '藥籤',
 '药面儿' => '藥麵兒',
-'苏昆' => '蘇崑',
 '苏崑' => '蘇崑',
+'苏昆' => '蘇崑',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
+'兰溪市' => '蘭谿市',
 '萝卜' => '蘿蔔',
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
@@ -7634,6 +7676,7 @@ $zh2Hant = array(
 '蝎虎' => '蝎虎',
 '蝎蝎螫螫' => '蝎蝎螫螫',
 '蝎谮' => '蝎譖',
+'虾面' => '蝦麵',
 '虮虱相吊' => '蟣蝨相弔',
 '蛏干' => '蟶乾',
 '蚁后' => '蟻后',
@@ -7645,6 +7688,7 @@ $zh2Hant = array(
 '行事历' => '行事曆',
 '行事历史' => '行事歷史',
 '行凶' => '行兇',
+'行家里手' => '行家裡手',
 '行于' => '行於',
 '行百里者半于九十' => '行百里者半於九十',
 '卫后庄公' => '衛後莊公',
@@ -7698,6 +7742,7 @@ $zh2Hant = array(
 '冲头阵' => '衝頭陣',
 '冲风' => '衝風',
 '衡鉴' => '衡鑑',
+'表面包' => '表面包',
 '衷于' => '衷於',
 '袋杆' => '袋桿',
 '袋里' => '袋裡',
@@ -7716,9 +7761,9 @@ $zh2Hant = array(
 '夹裙' => '袷裙',
 '裁并' => '裁併',
 '裁制' => '裁製',
-'里手' => '裏手',
 '里水镇' => '裏水鎮',
 '里海' => '裏海',
+'里运河' => '裏運河',
 '补于' => '補於',
 '补注' => '補註',
 '装折' => '裝摺',
@@ -7771,6 +7816,13 @@ $zh2Hant = array(
 '复利' => '複利',
 '复印' => '複印',
 '复句' => '複句',
+'复合函数' => '複合函數',
+'复合制' => '複合制',
+'复合式' => '複合式',
+'复合弓' => '複合弓',
+'复合材' => '複合材',
+'复合物' => '複合物',
+'复合体' => '複合體',
 '复壁' => '複壁',
 '复姓' => '複姓',
 '复字键' => '複字鍵',
@@ -7846,6 +7898,7 @@ $zh2Hant = array(
 '触须' => '觸鬚',
 '言云' => '言云',
 '言大而夸' => '言大而夸',
+'言里' => '言裡',
 '言辩而确' => '言辯而确',
 '订制' => '訂製',
 '计划' => '計劃',
@@ -7855,6 +7908,7 @@ $zh2Hant = array(
 '托交' => '託交',
 '托人' => '託人',
 '托付' => '託付',
+'托克逊' => '託克遜',
 '托儿' => '託兒',
 '托古讽今' => '託古諷今',
 '托名' => '託名',
@@ -7876,8 +7930,10 @@ $zh2Hant = array(
 '托辞' => '託辭',
 '托运' => '託運',
 '托过' => '託過',
+'托里县' => '託里縣',
 '托附' => '託附',
 '许愿起经' => '許愿起經',
+'許聖杰' => '許聖杰',
 '许虬' => '許虬',
 '注上' => '註上',
 '注册' => '註冊',
@@ -7915,6 +7971,7 @@ $zh2Hant = array(
 '诔赞' => '誄讚',
 '夸下海口' => '誇下海口',
 '夸了' => '誇了',
+'夸人' => '誇人',
 '夸他' => '誇他',
 '夸你' => '誇你',
 '夸来夸去' => '誇來誇去',
@@ -7926,7 +7983,9 @@ $zh2Hant = array(
 '夸多斗靡' => '誇多鬥靡',
 '夸大' => '誇大',
 '夸她' => '誇她',
+'夸姣' => '誇姣',
 '夸官' => '誇官',
+'夸容' => '誇容',
 '夸张' => '誇張',
 '夸强说会' => '誇強說會',
 '夸得' => '誇得',
@@ -7951,6 +8010,7 @@ $zh2Hant = array(
 '夸辩' => '誇辯',
 '夸过' => '誇過',
 '夸饰' => '誇飾',
+'夸丽' => '誇麗',
 '志哀' => '誌哀',
 '志喜' => '誌喜',
 '志庆' => '誌慶',
@@ -7980,6 +8040,8 @@ $zh2Hant = array(
 '咨询' => '諮詢',
 '诸余' => '諸餘',
 '谋干' => '謀幹',
+'謝杰' => '謝杰',
+'谢杰' => '謝杰',
 '谢华后' => '謝華后',
 '谬采虚声' => '謬採虛聲',
 '谬赞' => '謬讚',
@@ -8023,6 +8085,7 @@ $zh2Hant = array(
 '豆干' => '豆乾',
 '豆腐干' => '豆腐乾',
 '竖起脊梁' => '豎起脊梁',
+'丰度' => '豐度',
 '丰滨' => '豐濱',
 '丰滨乡' => '豐濱鄉',
 '丰台' => '豐臺',
@@ -8043,8 +8106,8 @@ $zh2Hant = array(
 '賢后' => '賢后',
 '贤后' => '賢后',
 '卖断发' => '賣斷發',
-'赋范' => '賦范',
 '賦范' => '賦范',
+'赋范' => '賦范',
 '质数里' => '質數裡',
 '质朴' => '質樸',
 '赌后' => '賭后',
@@ -8065,6 +8128,7 @@ $zh2Hant = array(
 '赵治勋' => '趙治勳',
 '趱干' => '趲幹',
 '足于' => '足於',
+'足球台' => '足球台',
 '跌扑' => '跌扑',
 '路图里' => '路圖裡',
 '路签' => '路籤',
@@ -8112,6 +8176,7 @@ $zh2Hant = array(
 '辞汇' => '辭彙',
 '辫发' => '辮髮',
 '辩斗' => '辯鬥',
+'辰溪县' => '辰谿縣',
 '农历' => '農曆',
 '农历史' => '農歷史',
 '农民历' => '農民曆',
@@ -8196,11 +8261,12 @@ $zh2Hant = array(
 '造钟' => '造鐘',
 '连三并四' => '連三併四',
 '连采' => '連採',
+'连发式' => '連發式',
 '连系' => '連繫',
-'周游世界' => '週遊世界',
+'周游' => '週遊',
 '进两出' => '進兩出',
-'進制' => '進制',
 '进制' => '進制',
+'進制' => '進制',
 '逼并' => '逼併',
 '遇风后' => '遇風後',
 '游了' => '遊了',
@@ -8234,6 +8300,7 @@ $zh2Hant = array(
 '游目骋怀' => '遊目騁懷',
 '游程' => '遊程',
 '游丝' => '遊絲',
+'游美学务' => '遊美學務',
 '游兴' => '遊興',
 '游船' => '遊船',
 '游艇' => '遊艇',
@@ -8314,8 +8381,8 @@ $zh2Hant = array(
 '酒气冲天' => '酒氣衝天',
 '酒坛' => '酒罈',
 '酒肴' => '酒肴',
-'酒麹' => '酒麴',
 '酒曲' => '酒麴',
+'酒麹' => '酒麴',
 '酥松' => '酥鬆',
 '酸姜' => '酸薑',
 '醇朴' => '醇樸',
@@ -8417,6 +8484,7 @@ $zh2Hant = array(
 '金表露' => '金表露',
 '金表面' => '金表面',
 '金装玉里' => '金裝玉裡',
+'金溪县' => '金谿縣',
 '金链' => '金鍊',
 '金钟' => '金鐘',
 '金发' => '金髮',
@@ -8511,6 +8579,7 @@ $zh2Hant = array(
 '钟罩' => '鐘罩',
 '钟声' => '鐘聲',
 '钟腰' => '鐘腰',
+'钟花' => '鐘花',
 '钟螺' => '鐘螺',
 '钟行' => '鐘行',
 '钟表面' => '鐘表面',
@@ -8620,8 +8689,10 @@ $zh2Hant = array(
 '陳冲' => '陳冲',
 '陳士杰' => '陳士杰',
 '陈升' => '陳昇',
-'陳有后' => '陳有后',
 '陈有后' => '陳有后',
+'陳有后' => '陳有后',
+'陈杰' => '陳杰',
+'陳杰' => '陳杰',
 '陈炼' => '陳鍊',
 '陆游' => '陸遊',
 '阳春面' => '陽春麵',
@@ -8649,7 +8720,6 @@ $zh2Hant = array(
 '雕梁画栋' => '雕樑畫棟',
 '双折射' => '雙折射',
 '双折' => '雙摺',
-'双沟大曲' => '雙溝大麯',
 '双胜类' => '雙胜類',
 '双雕' => '雙鵰',
 '杂合面儿' => '雜合麵兒',
@@ -8671,7 +8741,7 @@ $zh2Hant = array(
 '雪里' => '雪裡',
 '雪里红' => '雪裡紅',
 '雪里蕻' => '雪裡蕻',
-'云吞面' => '雲吞麵',
+'云吞' => '雲吞',
 '云笈七签' => '雲笈七籤',
 '云游' => '雲遊',
 '云须' => '雲鬚',
@@ -8684,16 +8754,21 @@ $zh2Hant = array(
 '电子表格' => '電子表格',
 '电子钟' => '電子鐘',
 '电子钟表' => '電子鐘錶',
+'电梯里' => '電梯裡',
 '电波钟' => '電波鐘',
 '电码表' => '電碼表',
 '电冲' => '電衝',
+'电视台风' => '電視台風',
 '电表' => '電錶',
 '电钟' => '電鐘',
 '震栗' => '震慄',
 '霉气冲天' => '霉氣衝天',
+'沾化' => '霑化',
+'沾益' => '霑益',
 '雾里' => '霧裡',
 '露丑' => '露醜',
 '霁范' => '霽範',
+'灵昆' => '靈崑',
 '青山一发' => '青山一髮',
 '青霉' => '青黴',
 '非常准' => '非常準',
@@ -8716,12 +8791,11 @@ $zh2Hant = array(
 '面包起' => '面包起',
 '面包办' => '面包辦',
 '面店铺' => '面店鋪',
-'面條目' => '面條目',
 '面条目' => '面條目',
+'面條目' => '面條目',
 '面粉碎' => '面粉碎',
 '面粉红' => '面粉紅',
 '面食饭' => '面食飯',
-'面食面' => '面食麵',
 '鞋里' => '鞋裡',
 '鞣制' => '鞣製',
 '秋千' => '鞦韆',
@@ -8737,8 +8811,8 @@ $zh2Hant = array(
 '頁面' => '頁面',
 '页面' => '頁面',
 '顶凶' => '頂兇',
-'顶多' => '頂多',
 '頂多' => '頂多',
+'顶多' => '頂多',
 '项链' => '項鍊',
 '顺于' => '順於',
 '顺钟向' => '順鐘向',
@@ -8749,7 +8823,6 @@ $zh2Hant = array(
 '预报不准' => '預報不準',
 '预制' => '預製',
 '领袖欲' => '領袖慾',
-'头儿干' => '頭兒幹',
 '头里' => '頭裡',
 '头长发' => '頭長髮',
 '头发' => '頭髮',
@@ -8854,6 +8927,7 @@ $zh2Hant = array(
 '余子' => '餘子',
 '余存' => '餘存',
 '余孽' => '餘孽',
+'余干' => '餘干',
 '余年' => '餘年',
 '余式' => '餘式',
 '余弦' => '餘弦',
@@ -8876,6 +8950,7 @@ $zh2Hant = array(
 '余殃' => '餘殃',
 '余毒' => '餘毒',
 '余气' => '餘氣',
+'余江' => '餘江',
 '余波' => '餘波',
 '余温' => '餘溫',
 '余泽' => '餘澤',
@@ -8924,7 +8999,6 @@ $zh2Hant = array(
 '馄饨面' => '餛飩麵',
 '馆谷' => '館穀',
 '馆里' => '館裡',
-'餵驴' => '餵驢',
 '饥寒' => '饑寒',
 '饥民' => '饑民',
 '饥渴' => '饑渴',
@@ -8945,8 +9019,8 @@ $zh2Hant = array(
 '马格里布' => '馬格里布',
 '驻扎' => '駐紮',
 '骀荡' => '駘蕩',
-'騰格里' => '騰格里',
 '腾格里' => '騰格里',
+'騰格里' => '騰格里',
 '腾涌' => '騰湧',
 '腾冲' => '騰衝',
 '惊栗' => '驚慄',
@@ -8973,6 +9047,7 @@ $zh2Hant = array(
 '发乳' => '髮乳',
 '发光可鉴' => '髮光可鑑',
 '发匪' => '髮匪',
+'发及腰' => '髮及腰',
 '发型' => '髮型',
 '发夹' => '髮夾',
 '发妻' => '髮妻',
@@ -8983,6 +9058,7 @@ $zh2Hant = array(
 '发廊' => '髮廊',
 '发式' => '髮式',
 '发引千钧' => '髮引千鈞',
+'发披肩' => '髮披肩',
 '发指' => '髮指',
 '发卷' => '髮捲',
 '发根' => '髮根',
@@ -9111,6 +9187,7 @@ $zh2Hant = array(
 '斗犀台' => '鬥犀臺',
 '斗犬' => '鬥犬',
 '斗狠' => '鬥狠',
+'斗兽' => '鬥獸',
 '斗叠' => '鬥疊',
 '斗百草' => '鬥百草',
 '斗眼' => '鬥眼',
@@ -9140,6 +9217,7 @@ $zh2Hant = array(
 '斗鸭' => '鬥鴨',
 '斗鹌鹑' => '鬥鵪鶉',
 '斗丽' => '鬥麗',
+'斗龙' => '鬥龍',
 '闹表' => '鬧錶',
 '闹钟' => '鬧鐘',
 '哄动' => '鬨動',
@@ -9189,13 +9267,14 @@ $zh2Hant = array(
 '鬼谷子' => '鬼谷子',
 '魂牵梦系' => '魂牽夢繫',
 '魏征' => '魏徵',
-'魔杰座' => '魔杰座',
 '魔表' => '魔錶',
 '鱼干' => '魚乾',
 '鱼松' => '魚鬆',
-'鲜于枢' => '鮮于樞',
 '鮮于樞' => '鮮于樞',
+'鲜于枢' => '鮮于樞',
 '鲸须' => '鯨鬚',
+'鳥栖' => '鳥栖',
+'鸟栖市' => '鳥栖市',
 '鳳凰于飛' => '鳳凰于飛',
 '凤梨干' => '鳳梨乾',
 '鸣钟' => '鳴鐘',
@@ -9206,6 +9285,7 @@ $zh2Hant = array(
 '雕悍' => '鵰悍',
 '雕翎' => '鵰翎',
 '雕鹗' => '鵰鶚',
+'鹤峰县' => '鶴峯縣',
 '鹤吊' => '鶴弔',
 '鹤发' => '鶴髮',
 '鸾鉴' => '鸞鑑',
@@ -9242,14 +9322,16 @@ $zh2Hant = array(
 '盐余' => '鹽餘',
 '鹿場里' => '鹿場里',
 '丽于' => '麗於',
+'麟游' => '麟遊',
+'曲酒' => '麯酒',
 '曲尘' => '麴塵',
 '曲櫱' => '麴櫱',
 '曲秀才' => '麴秀才',
 '曲车' => '麴車',
 '曲道士' => '麴道士',
 '曲钱' => '麴錢',
-'麹霉' => '麴黴',
 '曲霉' => '麴黴',
+'麹霉' => '麴黴',
 '面人儿' => '麵人兒',
 '面价' => '麵價',
 '面包' => '麵包',
@@ -9280,7 +9362,11 @@ $zh2Hant = array(
 '麻将席' => '麻將蓆',
 '麻酱面' => '麻醬麵',
 '黄干黑瘦' => '黃乾黑瘦',
+'黄岩区' => '黃巖區',
+'黄岩县' => '黃巖縣',
 '黄历' => '黃曆',
+'黃杰' => '黃杰',
+'黄杰' => '黃杰',
 '黄历史' => '黃歷史',
 '黃詩杰' => '黃詩杰',
 '黄诗杰' => '黃詩杰',
@@ -9291,14 +9377,17 @@ $zh2Hant = array(
 '黄发' => '黃髮',
 '黄曲毒素' => '黃麴毒素',
 '黎克特制' => '黎克特制',
-'黎吉雲' => '黎吉雲',
 '黎吉云' => '黎吉雲',
+'黎吉雲' => '黎吉雲',
 '黑奴吁天录' => '黑奴籲天錄',
+'黑干将' => '黑幹將',
+'黑长发' => '黑長髮',
 '黑发' => '黑髮',
 '点札' => '點劄',
 '点半钟' => '點半鐘',
 '点多钟' => '點多鐘',
 '点里' => '點裡',
+'点赞' => '點讚',
 '点里程' => '點里程',
 '点钟' => '點鐘',
 '霉毒' => '黴毒',
@@ -9309,6 +9398,7 @@ $zh2Hant = array(
 '鼓里' => '鼓裡',
 '鼓噪' => '鼓譟',
 '冬冬鼓' => '鼕鼕鼓',
+'咚咚鼓' => '鼕鼕鼓',
 '鼠曲草' => '鼠麴草',
 '鼻梁儿' => '鼻梁兒',
 '鼻梁' => '鼻樑',
@@ -9318,6 +9408,7 @@ $zh2Hant = array(
 '齿落发白' => '齒落髮白',
 '齿发' => '齒髮',
 '出儿' => '齣兒',
+'龙岩' => '龍巖',
 '龙卷' => '龍捲',
 '龙眼干' => '龍眼乾',
 '龙须' => '龍鬚',
@@ -9325,13 +9416,13 @@ $zh2Hant = array(
 '龙斗虎伤' => '龍鬥虎傷',
 '龜山庄' => '龜山庄',
 '龟鉴' => '龜鑑',
+',个中' => ',箇中',
 );
 
 $zh2Hans = array(
 '㑯' => '㑔',
 '㑳' => '㑇',
 '㑶' => '㐹',
-'㑺' => '俊',
 '㒓' => '𠉂',
 '㒺' => '罔',
 '㓂' => '寇',
@@ -9359,10 +9450,8 @@ $zh2Hans = array(
 '㢝' => '𢋈',
 '㤙' => '恩',
 '㥦' => '惬',
-'㥫' => '惇',
 '㥮' => '㤘',
 '㦎' => '𢛯',
-'㧱' => '拿',
 '㨗' => '捷',
 '㨪' => '晃',
 '㨿' => '据',
@@ -9489,7 +9578,6 @@ $zh2Hans = array(
 '來' => '来',
 '侖' => '仑',
 '侶' => '侣',
-'侷' => '局',
 '俁' => '俣',
 '係' => '系',
 '俔' => '伣',
@@ -9766,7 +9854,6 @@ $zh2Hans = array(
 '執' => '执',
 '堅' => '坚',
 '堊' => '垩',
-'堖' => '垴',
 '堝' => '埚',
 '堯' => '尧',
 '報' => '报',
@@ -9776,7 +9863,6 @@ $zh2Hans = array(
 '塏' => '垲',
 '塒' => '埘',
 '塗' => '涂',
-'塚' => '冢',
 '塟' => '葬',
 '塢' => '坞',
 '塤' => '埙',
@@ -9933,7 +10019,6 @@ $zh2Hans = array(
 '嶧' => '峄',
 '嶨' => '峃',
 '嶮' => '崄',
-'嶴' => '岙',
 '嶸' => '嵘',
 '嶺' => '岭',
 '嶼' => '屿',
@@ -10075,7 +10160,6 @@ $zh2Hans = array(
 '應' => '应',
 '懌' => '怿',
 '懍' => '懔',
-'懞' => '蒙',
 '懟' => '怼',
 '懣' => '懑',
 '懨' => '恹',
@@ -10281,8 +10365,6 @@ $zh2Hans = array(
 '棧' => '栈',
 '棲' => '栖',
 '棶' => '梾',
-'椀' => '碗',
-'椉' => '乘',
 '椏' => '桠',
 '椗' => '碇',
 '椲' => '㭏',
@@ -10446,7 +10528,6 @@ $zh2Hans = array(
 '湞' => '浈',
 '湧' => '涌',
 '湯' => '汤',
-'湻' => '淳',
 '湼' => '涅',
 '溈' => '沩',
 '準' => '准',
@@ -10794,7 +10875,6 @@ $zh2Hans = array(
 '矚' => '瞩',
 '矯' => '矫',
 '砲' => '炮',
-'硃' => '朱',
 '硜' => '硁',
 '硤' => '硖',
 '硨' => '砗',
@@ -11426,7 +11506,6 @@ $zh2Hans = array(
 '衊' => '蔑',
 '術' => '术',
 '衕' => '同',
-'衖' => '弄',
 '衚' => '胡',
 '衛' => '卫',
 '衝' => '冲',
@@ -11489,7 +11568,6 @@ $zh2Hans = array(
 '覽' => '览',
 '覿' => '觌',
 '觀' => '观',
-'觔' => '斤',
 '觝' => '抵',
 '觴' => '觞',
 '觶' => '觯',
@@ -11920,7 +11998,6 @@ $zh2Hans = array(
 '適' => '适',
 '遯' => '遁',
 '遲' => '迟',
-'遶' => '绕',
 '遷' => '迁',
 '選' => '选',
 '遺' => '遗',
@@ -12380,7 +12457,6 @@ $zh2Hans = array(
 '靭' => '韧',
 '靱' => '韧',
 '鞀' => '鼗',
-'鞌' => '鞍',
 '鞏' => '巩',
 '鞝' => '绱',
 '鞦' => '秋',
@@ -12528,6 +12604,7 @@ $zh2Hans = array(
 '餭' => '𫗮',
 '餱' => '糇',
 '餳' => '饧',
+'餵' => '喂',
 '餶' => '馉',
 '餷' => '馇',
 '餸' => '𩠌',
@@ -12582,7 +12659,6 @@ $zh2Hans = array(
 '駧' => '𩧲',
 '駩' => '𩧴',
 '駭' => '骇',
-'駮' => '驳',
 '駰' => '骃',
 '駱' => '骆',
 '駶' => '𩧺',
@@ -12621,7 +12697,7 @@ $zh2Hans = array(
 '驁' => '骜',
 '驂' => '骖',
 '驃' => '骠',
-'驄' => '𩨂',
+'驄' => '',
 '驅' => '驱',
 '驊' => '骅',
 '驋' => '𩧯',
@@ -12649,10 +12725,8 @@ $zh2Hans = array(
 '體' => '体',
 '髕' => '髌',
 '髖' => '髋',
-'髣' => '仿',
 '髥' => '髯',
 '髮' => '发',
-'髴' => '佛',
 '鬀' => '剃',
 '鬆' => '松',
 '鬉' => '鬃',
@@ -12665,7 +12739,6 @@ $zh2Hans = array(
 '鬨' => '哄',
 '鬩' => '阋',
 '鬪' => '斗',
-'鬭' => '斗',
 '鬮' => '阄',
 '鬰' => '郁',
 '鬱' => '郁',
@@ -12944,7 +13017,7 @@ $zh2Hans = array(
 '鼇' => '鳌',
 '鼈' => '鳖',
 '鼉' => '鼍',
-'é¼\95' => 'å\86¬',
+'é¼\95' => 'å\92\9a',
 '鼴' => '鼹',
 '齊' => '齐',
 '齋' => '斋',
@@ -12977,43 +13050,30 @@ $zh2Hans = array(
 '龜' => '龟',
 '龭' => '𩨎',
 '龯' => '𨱆',
-'𠇮' => '命',
-'𠌂' => '伞',
 '𠌥' => '𠆿',
 '𠏢' => '𠉗',
 '𠕂' => '再',
 '𠕅' => '再',
-'𠖇' => '冥',
 '𠞆' => '𠛆',
 '𠞰' => '剿',
 '𠠎' => '𠚳',
-'𠪾' => '历',
-'𠴟' => '咩',
-'𠻳' => '嗽',
 '𡄔' => '𠴢',
 '𡄣' => '𠵸',
 '𡅏' => '𠲥',
-'𡐨' => '野',
 '𡑭' => '𡋗',
 '𡓾' => '𡋀',
 '𡚁' => '弊',
 '𡞵' => '㛟',
 '𡠹' => '㛿',
 '𡢃' => '㛠',
-'𡨘' => '冤',
 '𡨥' => '寇',
-'𡬶' => '寻',
 '𡮉' => '𡭜',
 '𡮣' => '𡭬',
 '𡻕' => '岁',
 '𡾱' => '㟜',
 '𢣚' => '𢘝',
 '𢣭' => '𢘞',
-'𢬸' => '括',
-'𢭏' => '捣',
-'𢮥' => '操',
 '𢶫' => '𢫞',
-'𢷬' => '捣',
 '𢷮' => '𢫊',
 '𢹿' => '𢬦',
 '𣙎' => '㭣',
@@ -13030,20 +13090,15 @@ $zh2Hans = array(
 '𤨏' => '琐',
 '𤪺' => '㻘',
 '𤫩' => '㻏',
-'𤰜' => '亩',
 '𤱈' => '亩',
-'𤱊' => '留',
 '𤳸' => '𤳄',
 '𤸫' => '𤶧',
 '𤺥' => '瘩',
-'𥄨' => '瞅',
 '𥌃' => '𥅘',
 '𥕥' => '𥐰',
 '𥖅' => '𥐯',
 '𥢢' => '䅪',
-'𥦗' => '窗',
 '𥨐' => '𥧂',
-'𥲻' => '纂',
 '𥵃' => '𥱔',
 '𥵊' => '𥭉',
 '𥸠' => '𥮋',
@@ -13051,16 +13106,12 @@ $zh2Hans = array(
 '𥽖' => '𥺇',
 '𥿊' => '𦈈',
 '𦂅' => '𦈒',
-'𦂳' => '紧',
-'𦃂' => '紧',
 '𦃄' => '𦈗',
-'𦉆' => '碴',
 '𦊱' => '挂',
 '𦍑' => '羌',
 '𦕈' => '眇',
 '𦢈' => '𣍨',
 '𦣎' => '𦟗',
-'𦪙' => '䑽',
 '𦪽' => '𦨩',
 '𦵏' => '葬',
 '𧔥' => '𧒭',
@@ -13182,22 +13233,21 @@ $zh2Hans = array(
 '』' => '’',
 '「' => '“',
 '「' => '“',
-'」' => '”',
 '」' => '”',
+'」' => '”',
 '。陞' => '。升',
 '《易乾' => '《易乾',
 '一釐' => '一厘',
-'一口鍾' => '一口钟',
-'一鍾' => '一钟',
 '上昇' => '上升',
+'不穀' => '不穀',
 '專著' => '专著',
-'世界鍾' => '世界钟',
-'喪鍾' => '丧钟',
 '乾一坛' => '乾一坛',
 '乾一壇' => '乾一坛',
-'乾一组' => '乾一组',
 '乾一組' => '乾一组',
+'乾一组' => '乾一组',
 '乾上乾下' => '乾上乾下',
+'乾东' => '乾东',
+'乾東' => '乾东',
 '乾為天' => '乾为天',
 '乾為陽' => '乾为阳',
 '乾九' => '乾九',
@@ -13212,27 +13262,27 @@ $zh2Hans = array(
 '乾光' => '乾光',
 '乾兴' => '乾兴',
 '乾興' => '乾兴',
-'乾岡' => '乾冈',
 '乾冈' => '乾冈',
+'乾岡' => '乾冈',
 '乾刘' => '乾刘',
 '乾劉' => '乾刘',
 '乾刚' => '乾刚',
 '乾剛' => '乾刚',
-'乾務' => '乾务',
 '乾务' => '乾务',
+'乾務' => '乾务',
 '乾化' => '乾化',
 '乾卦' => '乾卦',
 '乾县' => '乾县',
 '乾縣' => '乾县',
 '乾台' => '乾台',
 '乾吉' => '乾吉',
-'乾啟' => '乾启',
 '乾启' => '乾启',
+'乾啟' => '乾启',
 '乾命' => '乾命',
 '乾和' => '乾和',
 '乾嘉' => '乾嘉',
-'乾圖' => '乾图',
 '乾图' => '乾图',
+'乾圖' => '乾图',
 '乾坤' => '乾坤',
 '乾城' => '乾城',
 '乾基' => '乾基',
@@ -13252,8 +13302,8 @@ $zh2Hans = array(
 '乾巛' => '乾巛',
 '乾州' => '乾州',
 '乾式' => '乾式',
-'乾錄' => '乾录',
 '乾录' => '乾录',
+'乾錄' => '乾录',
 '乾律' => '乾律',
 '乾德' => '乾德',
 '乾心' => '乾心',
@@ -13266,17 +13316,17 @@ $zh2Hans = array(
 '乾旦' => '乾旦',
 '乾明' => '乾明',
 '乾昧' => '乾昧',
-'乾暉' => '乾晖',
 '乾晖' => '乾晖',
+'乾暉' => '乾晖',
 '乾景' => '乾景',
 '乾晷' => '乾晷',
 '乾曜' => '乾曜',
-'乾構' => '乾构',
 '乾构' => '乾构',
+'乾構' => '乾构',
 '乾枢' => '乾枢',
 '乾樞' => '乾枢',
-'乾棟' => '乾栋',
 '乾栋' => '乾栋',
+'乾棟' => '乾栋',
 '乾步' => '乾步',
 '乾氏' => '乾氏',
 '乾沓和' => '乾沓和',
@@ -13288,6 +13338,7 @@ $zh2Hans = array(
 '乾潭' => '乾潭',
 '乾灵' => '乾灵',
 '乾靈' => '乾灵',
+'乾生元' => '乾生元',
 '乾男' => '乾男',
 '乾皋' => '乾皋',
 '乾盛世' => '乾盛世',
@@ -13295,8 +13346,8 @@ $zh2Hans = array(
 '乾祐' => '乾祐',
 '乾神' => '乾神',
 '乾穹' => '乾穹',
-'乾竇' => '乾窦',
 '乾窦' => '乾窦',
+'乾竇' => '乾窦',
 '乾竺' => '乾竺',
 '乾笃' => '乾笃',
 '乾篤' => '乾笃',
@@ -13307,14 +13358,14 @@ $zh2Hans = array(
 '乾红' => '乾红',
 '乾綱' => '乾纲',
 '乾纲' => '乾纲',
-'乾纽' => '乾纽',
 '乾紐' => '乾纽',
-'ä¹¾ç»\9c' => 'ä¹¾ç»\9c',
+'乾纽' => '乾纽',
 '乾絡' => '乾络',
+'乾络' => '乾络',
 '乾統' => '乾统',
 '乾统' => '乾统',
-'乾维' => '乾维',
 '乾維' => '乾维',
+'乾维' => '乾维',
 '乾罗' => '乾罗',
 '乾羅' => '乾罗',
 '乾花' => '乾花',
@@ -13325,18 +13376,18 @@ $zh2Hans = array(
 '乾西' => '乾西',
 '乾覆' => '乾覆',
 '乾象' => '乾象',
-'乾象歷' => '乾象历',
 '乾象历' => '乾象历',
+'乾象歷' => '乾象历',
 '乾貞' => '乾贞',
 '乾贞' => '乾贞',
-'乾贵士' => '乾贵士',
 '乾貴士' => '乾贵士',
+'乾贵士' => '乾贵士',
 '乾貺' => '乾贶',
 '乾贶' => '乾贶',
 '乾車' => '乾车',
 '乾车' => '乾车',
-'乾轴' => '乾轴',
 '乾軸' => '乾轴',
+'乾轴' => '乾轴',
 '乾通' => '乾通',
 '乾造' => '乾造',
 '乾道' => '乾道',
@@ -13355,25 +13406,27 @@ $zh2Hans = array(
 '乾風' => '乾风',
 '乾风' => '乾风',
 '乾首' => '乾首',
-'乾马' => '乾马',
 '乾馬' => '乾马',
+'乾马' => '乾马',
 '乾鵠' => '乾鹄',
 '乾鹄' => '乾鹄',
 '乾鵲' => '乾鹊',
 '乾鹊' => '乾鹊',
-'乾龙' => '乾龙',
 '乾龍' => '乾龙',
+'乾龙' => '乾龙',
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '五箇山' => '五箇山',
+'什么' => '什么',
 '仇讎' => '仇雠',
 '以微知著' => '以微知著',
-'以莛叩鍾' => '以莛叩钟',
 '仰屋著書' => '仰屋著书',
 '彷彿' => '仿佛',
 '夥計' => '伙计',
 '佛頭著糞' => '佛头著粪',
 '偵蒐' => '侦搜',
+'倖一郎' => '倖一郎',
+'倖田' => '倖田',
 '候覆' => '候复',
 '藉助' => '借助',
 '藉口' => '借口',
@@ -13384,19 +13437,18 @@ $zh2Hans = array(
 '藉由' => '借由',
 '藉端' => '借端',
 '藉詞' => '借词',
+'傒倖' => '傒倖',
 '先名後姓' => '先名后姓',
+'兒寬' => '兒宽',
 '六么' => '六幺',
 '蘭質薰心' => '兰质薰心',
 '內聯陞' => '内联升',
 '憑藉' => '凭借',
-'分鍾' => '分钟',
 '初昇' => '初升',
 '利欲薰心' => '利欲薰心',
-'刻鍾' => '刻钟',
 '剋了' => '剋了',
 '剋架' => '剋架',
 '剖釐' => '剖厘',
-'千鍾' => '千钟',
 '陞為' => '升为',
 '陞了' => '升了',
 '昇仙' => '升仙',
@@ -13412,7 +13464,6 @@ $zh2Hans = array(
 '昇降' => '升降',
 '卓著' => '卓著',
 '博和託' => '博和讬',
-'卷舌' => '卷舌',
 '歷陞' => '历升',
 '釐改' => '厘改',
 '釐整' => '厘整',
@@ -13421,14 +13472,11 @@ $zh2Hans = array(
 '釐清' => '厘清',
 '釐訂' => '厘订',
 '釐革' => '厘革',
-'原子鍾' => '原子钟',
 '原著' => '原著',
 '又陞' => '又升',
 '反反覆覆' => '反反复复',
 '反覆' => '反复',
-'古鍾' => '古钟',
 '可穿著' => '可穿著',
-'台鍾' => '台钟',
 '吃衣著飯' => '吃衣著饭',
 '合著' => '合著',
 '同陞和' => '同升和',
@@ -13439,41 +13487,40 @@ $zh2Hans = array(
 '回覆' => '回复',
 '土著' => '土著',
 '坤乾' => '坤乾',
-'塔鍾' => '塔钟',
 '墨瀋' => '墨渖',
-'壁鍾' => '壁钟',
 '覆查' => '复查',
 '覆核' => '复核',
 '覆检' => '复检',
 '復甦' => '复苏',
-'多鍾' => '多钟',
+'多么' => '多么',
 '大麴' => '大曲',
-'大鍾' => '大钟',
-'天道為乾' => '天道为乾',
 '天道为乾' => '天道为乾',
+'天道為乾' => '天道为乾',
 '奧區' => '奧区',
 '如瀋' => '如渖',
 '姓么' => '姓幺',
 '子餘' => '子馀',
 '字乾生' => '字乾生',
-'孫乾' => '孙乾',
 '孙乾' => '孙乾',
-'å®\8bé\8d¾å\9c\8b' => 'å®\8bé\92\9få\9b½',
+'å­«ä¹¾' => 'å­\99ä¹¾',
 '宏碁' => '宏碁',
 '官陞' => '官升',
 '將軍抽俥' => '将军抽俥',
 '將軍抽車' => '将军抽車',
 '爾冬陞' => '尔冬升',
 '尼乾陀' => '尼乾陀',
+'侷促' => '局促',
 '跼促' => '局促',
+'侷限' => '局限',
 '跼限' => '局限',
-'山崩é\8d¾æ\87\89' => '山崩é\92\9fåº\94',
-'å´\94ç§\80é\8d¾' => 'å´\94ç§\80é\92\9f',
+'å±±å´\8eé\97\87é½\8b' => 'å±±å´\8eé\97\87æ\96\8b',
+'å²³è¨\97' => '岳讬',
 '巨著' => '巨著',
 '乾乾淨淨' => '干干净净',
 '乾乾脆脆' => '干干脆脆',
 '乾泉水' => '干泉水',
 '年陞' => '年升',
+'么九' => '幺九',
 '么二三' => '幺二三',
 '么元' => '幺元',
 '么鳳' => '幺凤',
@@ -13482,15 +13529,18 @@ $zh2Hans = array(
 '么廝' => '幺厮',
 '幺厮' => '幺厮',
 '么叔' => '幺叔',
+'么女' => '幺女',
 '么媽' => '幺妈',
 '么妹' => '幺妹',
 '么姓' => '幺姓',
 '么姨' => '幺姨',
 '么娘' => '幺娘',
-'幺孃' => '幺娘',
 '么孃' => '幺娘',
+'幺孃' => '幺娘',
+'么子' => '幺子',
 '么小' => '幺小',
 '么弟' => '幺弟',
+'么正' => '幺正',
 '么氏' => '幺氏',
 '么爸' => '幺爸',
 '么爹' => '幺爹',
@@ -13498,22 +13548,20 @@ $zh2Hans = array(
 '么舅' => '幺舅',
 '么蛾子' => '幺蛾子',
 '么謙' => '幺谦',
-'么麽' => '幺麽',
 '么麼' => '幺麽',
+'么麽' => '幺麽',
 '么麽小丑' => '幺麽小丑',
 '慶餘' => '庆馀',
-'座鍾' => '座钟',
 '康乾' => '康乾',
-'張法乾' => '张法乾',
 '张法乾' => '张法乾',
-'張鍾英' => '张钟英',
+'張法乾' => '张法乾',
 '彰明較著' => '彰明较著',
 '待覆' => '待复',
 '後姓' => '後姓',
 '慫慂' => '怂恿',
+'怎么' => '怎么',
 '恩威並著' => '恩威并著',
 '噁心' => '恶心',
-'懸鍾' => '悬钟',
 '情蒐' => '情搜',
 '情鍾' => '情钟',
 '惏悷' => '惏悷',
@@ -13526,6 +13574,7 @@ $zh2Hans = array(
 '扞格' => '扞格',
 '執著' => '执著',
 '批覆' => '批复',
+'承乾' => '承乾',
 '拉鍊' => '拉链',
 '拙著' => '拙著',
 '拚命' => '拚命',
@@ -13533,9 +13582,7 @@ $zh2Hans = array(
 '拚死' => '拚死',
 '拾瀋' => '拾渖',
 '拿破崙' => '拿破仑',
-'掛鍾' => '挂钟',
 '挨剋' => '挨剋',
-'掩耳盜鍾' => '掩耳盗钟',
 '提昇' => '提升',
 '蒐錄' => '搜录',
 '蒐索' => '搜索',
@@ -13544,17 +13591,15 @@ $zh2Hans = array(
 '蒐證' => '搜证',
 '蒐購' => '搜购',
 '蒐輯' => '搜辑',
-'蒐采' => '搜采',
 '蒐採' => '搜采',
+'蒐采' => '搜采',
 '蒐集' => '搜集',
 '搥打' => '搥打',
 '搥胸頓足' => '搥胸顿足',
-'擺鍾' => '摆钟',
-'撞鍾' => '撞钟',
 '撰著' => '撰著',
 '效果顯著' => '效果显著',
-'敲鍾' => '敲钟',
 '文徵明' => '文徵明',
+'觔斗' => '斤斗',
 '新著' => '新著',
 '於世成' => '於世成',
 '於之瑩' => '於之莹',
@@ -13572,10 +13617,10 @@ $zh2Hans = array(
 '於志賀' => '於志贺',
 '於志贺' => '於志贺',
 '於戲' => '於戏',
-'於梨華' => '於梨华',
 '於梨华' => '於梨华',
+'於梨華' => '於梨华',
 '於氏' => '於氏',
-'於潜县' => '於潜县',
+'於潜' => '於潜',
 '於潛縣' => '於潜县',
 '於祥玉' => '於祥玉',
 '於菟' => '於菟',
@@ -13583,7 +13628,6 @@ $zh2Hans = array(
 '於除鞬' => '於除鞬',
 '旋乾轉坤' => '旋乾转坤',
 '旋乾转坤' => '旋乾转坤',
-'時鍾' => '时钟',
 '曠若發矇' => '旷若发矇',
 '崑崙' => '昆仑',
 '崑劇' => '昆剧',
@@ -13593,10 +13637,10 @@ $zh2Hans = array(
 '崑蘇' => '昆苏',
 '崑調' => '昆调',
 '易·乾' => '易·乾',
-'易经·乾' => '易经·乾',
 '易經·乾' => '易经·乾',
-'易经乾' => '易经乾',
+'易经·乾' => '易经·乾',
 '易經乾' => '易经乾',
+'易经乾' => '易经乾',
 '昭著' => '昭著',
 '顯著' => '显著',
 '顯著地' => '显著地',
@@ -13606,17 +13650,17 @@ $zh2Hans = array(
 '顯著效果' => '显著效果',
 '顯著特點' => '显著特点',
 '晉陞' => '晋升',
-'晚鍾' => '晚钟',
-'晨鍾' => '晨钟',
 '暗闇' => '暗闇',
 '麴黴' => '曲霉',
-'曾運乾' => '曾运乾',
 '曾运乾' => '曾运乾',
+'曾運乾' => '曾运乾',
 '月陞' => '月升',
 '朝乾夕惕' => '朝乾夕惕',
-'朝鍾暮鼓' => '朝钟暮鼓',
 '朱有燉' => '朱有燉',
 '朱淛' => '朱淛',
+'硃砂' => '朱砂',
+'硃紅' => '朱红',
+'硃色' => '朱色',
 '朴於宇同' => '朴於宇同',
 '李乾德' => '李乾德',
 '李乾順' => '李乾顺',
@@ -13624,18 +13668,14 @@ $zh2Hans = array(
 '李澤鉅' => '李泽钜',
 '李祕' => '李祕',
 '李譔' => '李譔',
-'李鍾原' => '李钟原',
-'林鍾' => '林钟',
-'柳诒徵' => '柳诒徵',
 '柳詒徵' => '柳诒徵',
+'柳诒徵' => '柳诒徵',
 '校讎' => '校雠',
 '楈枒' => '楈枒',
 '樊於期' => '樊於期',
-'橡椀' => '橡椀',
-'此鍾' => '此钟',
 '殘瀋' => '残渖',
-'慇懃' => '殷勤',
 '慇勤' => '殷勤',
+'慇懃' => '殷勤',
 '比較顯著' => '比较显著',
 '毫釐' => '毫厘',
 '氆氌' => '氆氌',
@@ -13647,9 +13687,7 @@ $zh2Hans = array(
 '沈默' => '沉默',
 '氾濫' => '泛滥',
 '洗鍊' => '洗练',
-'洪鍾' => '洪钟',
 '瀋液' => '渖液',
-'點鍾' => '点钟',
 '薰習' => '熏习',
 '薰心' => '熏心',
 '薰沐' => '熏沐',
@@ -13660,36 +13698,32 @@ $zh2Hans = array(
 '王道乾' => '王道乾',
 '王餘魚' => '王馀鱼',
 '甚夥' => '甚夥',
-'生物鍾' => '生物钟',
-'電鍾' => '电钟',
-'男為乾' => '男为乾',
 '男为乾' => '男为乾',
-'男爲乾' => '男为乾',
-'男性爲乾' => '男性为乾',
-'男性為乾' => '男性为乾',
+'男為乾' => '男为乾',
 '男性为乾' => '男性为乾',
+'男性為乾' => '男性为乾',
 '療效顯著' => '疗效显著',
 '白瀋' => '白渖',
 '皁保' => '皁保',
 '目劄' => '目劄',
 '直昇' => '直升',
 '睹微知著' => '睹微知著',
-'瞭臺' => '瞭台',
 '瞭台' => '瞭台',
+'瞭臺' => '瞭台',
 '瞭望' => '瞭望',
 '矇眬' => '矇眬',
 '矇矓' => '矇眬',
 '石碁' => '石碁',
 '石碁鎮' => '石碁镇',
-'石英鍾' => '石英钟',
-'石鍾乳' => '石钟乳',
+'碩託' => '硕讬',
 '鹼菜' => '硷菜',
-'碁聖' => '碁圣',
 '碁圣' => '碁圣',
+'碁聖' => '碁圣',
 '碁所' => '碁所',
 '祕宜' => '祕宜',
-'ç§\92é\8d¾' => 'ç§\92é\92\9f',
+'ç©\80æ\97¦' => 'ç©\80æ\97¦',
 '穀梁' => '穀梁',
+'穀水' => '穀水',
 '穿著者' => '穿着者',
 '竹昇' => '竹升',
 '答覆' => '答复',
@@ -13697,10 +13731,11 @@ $zh2Hans = array(
 '米瀋' => '米渖',
 '餬口' => '糊口',
 '繙㠾' => '繙㠾',
+'遶境' => '绕境',
 '線國安' => '缐国安',
 '線姓' => '缐姓',
 '編著' => '编著',
-'編鍾' => '编钟',
+'老么' => '老幺',
 '肉乾乾' => '肉干干',
 '肘手鍊足' => '肘手链足',
 '甦醒' => '苏醒',
@@ -13723,14 +13758,18 @@ $zh2Hans = array(
 '著者' => '著者',
 '著身' => '著身',
 '著述' => '著述',
-'覆蓋' => '覆蓋',
+'蔡絛' => '蔡絛',
+'行餘' => '行馀',
+'覆蓋' => '覆盖',
 '見微知著' => '见微知著',
 '見著' => '见著',
 '視微知著' => '视微知著',
 '言幾析理' => '言幾析理',
 '諲譔' => '諲譔',
-'警鍾' => '警钟',
 '譩譆' => '譩譆',
+'託庸' => '讬庸',
+'託恩多' => '讬恩多',
+'託麻' => '讬麻',
 '論著' => '论著',
 '譯著' => '译著',
 '謝肇淛' => '谢肇淛',
@@ -13739,12 +13778,11 @@ $zh2Hans = array(
 '較著' => '较著',
 '近角聪信' => '近角聪信',
 '这么' => '这么',
-'進化鍾' => '进化钟',
 '造麴' => '造曲',
 '遺著' => '遗著',
+'那么' => '那么',
 '那麽' => '那麽',
 '郭子乾' => '郭子乾',
-'郭行餘' => '郭行馀',
 '酒麴' => '酒曲',
 '醉瀋' => '醉渖',
 '醯壶' => '醯壶',
@@ -13753,48 +13791,17 @@ $zh2Hans = array(
 '醯醬' => '醯酱',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
-'醯鸡' => '醯鸡',
 '醯雞' => '醯鸡',
+'醯鸡' => '醯鸡',
 '重覆' => '重复',
-'金尚鍾' => '金尚钟',
-'金民鍾' => '金民钟',
-'金鍾' => '金钟',
 '金鍊' => '金链',
-'鍾麗緹' => '钟丽缇',
-'鍾乳石' => '钟乳石',
-'鍾儀奏楚' => '钟仪奏楚',
-'鍾關' => '钟关',
-'鍾聲' => '钟声',
-'鍾頭' => '钟头',
-'鍾山' => '钟山',
-'鍾差' => '钟差',
-'鍾座' => '钟座',
 '鍾情' => '钟情',
 '鍾意' => '钟意',
-'鍾慧冰' => '钟慧冰',
-'鍾擺' => '钟摆',
-'鍾架' => '钟架',
-'鍾楚紅' => '钟楚红',
-'鍾樓' => '钟楼',
-'鍾漢良' => '钟汉良',
-'鍾汶' => '钟汶',
-'鍾淑慧' => '钟淑慧',
 '鍾靈' => '钟灵',
-'鍾點' => '钟点',
 '鍾愛' => '钟爱',
-'鍾琴' => '钟琴',
-'鍾相' => '钟相',
-'鍾祥' => '钟祥',
-'鍾離' => '钟离',
-'鍾表' => '钟表',
-'鍾鎮濤' => '钟镇涛',
-'鍾面' => '钟面',
-'鍾馗' => '钟馗',
-'鍾鳴漏盡' => '钟鸣漏尽',
-'鍾鳴鼎食' => '钟鸣鼎食',
-'鍾鼓' => '钟鼓',
 '鐵鍊' => '铁链',
 '鉸鍊' => '铰链',
+'銀硃' => '银朱',
 '銀鍊' => '银链',
 '鍊子' => '链子',
 '鍊條' => '链条',
@@ -13802,11 +13809,10 @@ $zh2Hans = array(
 '鍊鎖' => '链锁',
 '鍊錘' => '链锤',
 '鎖鍊' => '锁链',
+'闇公' => '闇公',
 '閻懷禮' => '闫怀礼',
-'鬧鍾' => '闹钟',
-'陽為乾' => '阳为乾',
 '阳为乾' => '阳为乾',
-'é\99½ç\88²乾' => '阳为乾',
+'é\99½ç\82º乾' => '阳为乾',
 '阿部正瞭' => '阿部正瞭',
 '陆徵祥' => '陆徵祥',
 '陸徵祥' => '陆徵祥',
@@ -13816,8 +13822,8 @@ $zh2Hans = array(
 '陳元扞' => '陈元扞',
 '陈公乾生' => '陈公乾生',
 '陳公乾生' => '陈公乾生',
-'陳遇乾' => '陈遇乾',
 '陈遇乾' => '陈遇乾',
+'陳遇乾' => '陈遇乾',
 '陳堵' => '陳堵',
 '陳禕' => '陳禕',
 '雍乾' => '雍乾',
@@ -13825,28 +13831,25 @@ $zh2Hans = array(
 '讎定' => '雠定',
 '讎校' => '雠校',
 '讎問' => '雠问',
-'音聲如鍾' => '音声如钟',
 '項鍊' => '项链',
 '飛昇' => '飞升',
 '飭令' => '飭令',
-'é¤\98å¹´ç\84¡å¤\9a' => 'é¦\80å¹´æ\97 å¤\9a',
+'飽è¨\97' => '饱讬',
 '餘慶' => '馀庆',
 '餘瀋' => '馀渖',
-'馬德鍾' => '马德钟',
+'馬鞌' => '马鞍',
 '高昇' => '高升',
 '高陞' => '高升',
 '鬱姓' => '鬱姓',
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
-'鳴鍾' => '鸣钟',
 '麽氏' => '麽氏',
-'麽麽' => '麽麽',
 '麼麼' => '麽麽',
+'麽麽' => '麽麽',
 '黃麴毒素' => '黄曲毒素',
-'黄润乾' => '黄润乾',
 '黃潤乾' => '黄润乾',
-'é»\83é\8d¾' => 'é»\84é\92\9f',
+'é»\84润乾' => 'é»\84润乾',
 '龍鍾' => '龙钟',
 ',陞' => ',升',
 );
@@ -13870,8 +13873,8 @@ $zh2TW = array(
 '丙肝' => 'C肝',
 'IP地址' => 'IP位址',
 '乔戈里峰' => 'K2',
-'·威爾士' => '·威爾士',
 '·威尔士' => '·威爾士',
+'·威爾士' => '·威爾士',
 '一杆' => '一桿',
 '七杆' => '七桿',
 '三杆' => '三桿',
@@ -13885,6 +13888,7 @@ $zh2TW = array(
 '以太网' => '乙太網',
 '九杆' => '九桿',
 '了結他' => '了結他',
+'二手烟' => '二手菸',
 '二手煙' => '二手菸',
 '二杆' => '二桿',
 '二极管' => '二極體',
@@ -13895,22 +13899,22 @@ $zh2TW = array(
 '阿斯旺' => '亞斯文',
 '人工智能' => '人工智慧',
 '人机交互' => '人機互動',
-'石勒蘇益格' => '什勒斯維希',
 '石勒苏益格' => '什勒斯維希',
+'石勒蘇益格' => '什勒斯維希',
 '界面' => '介面',
 '伊利诺伊州' => '伊利諾州',
-'伊斯坦布爾' => '伊斯坦堡',
 '伊斯坦布尔' => '伊斯坦堡',
+'伊斯坦布爾' => '伊斯坦堡',
 '伊斯兰堡' => '伊斯蘭瑪巴德',
 '伊斯蘭堡' => '伊斯蘭瑪巴德',
 '埃博拉' => '伊波拉',
 '伊丽莎白' => '伊莉莎白',
-'掌上壓' => '伏地挺身',
 '俯卧撑' => '伏地挺身',
+'掌上壓' => '伏地挺身',
 '伯明翰' => '伯明罕',
 '服务器' => '伺服器',
-'字节' => '位元組',
 '字節' => '位元組',
+'字节' => '位元組',
 '佛罗伦萨' => '佛羅倫斯',
 '操作系统' => '作業系統',
 '系数' => '係數',
@@ -13918,8 +13922,8 @@ $zh2TW = array(
 '傅里叶' => '傅立葉',
 '光盘' => '光碟',
 '光驱' => '光碟機',
-'克羅地亞' => '克羅埃西亞',
 '克罗地亚' => '克羅埃西亞',
+'克羅地亞' => '克羅埃西亞',
 '克里斯托弗' => '克里斯多福',
 '万维网' => '全球資訊網',
 '八杆' => '八桿',
@@ -13927,6 +13931,9 @@ $zh2TW = array(
 '六杆' => '六桿',
 '凯瑟琳' => '凱薩琳',
 '嘉芙蓮' => '凱薩琳',
+'划着独木舟' => '划著獨木舟',
+'划着竹筏' => '划著竹筏',
+'划着船' => '划著船',
 '打印' => '列印',
 '列支敦士登' => '列支敦斯登',
 '前波美拉尼亚' => '前波莫瑞',
@@ -13938,22 +13945,24 @@ $zh2TW = array(
 '北朝鲜' => '北韓',
 '局域网' => '區域網',
 '十杆' => '十桿',
-'特立尼達和多巴哥' => '千里達托貝哥',
 '特立尼达和托巴哥' => '千里達托貝哥',
+'特立尼達和多巴哥' => '千里達托貝哥',
 '南朝鲜' => '南韓',
 '卡斯特罗' => '卡斯楚',
 '卡塔尔' => '卡達',
 '卡塔爾' => '卡達',
+'铆足' => '卯足',
 '打印机' => '印表機',
 '打印機' => '印表機',
-'厄立特里亞' => '厄利垂亞',
-'厄立特里亚' => '厄利垂亞',
 '厄利垂亚' => '厄利垂亞',
-'厄瓜多爾' => '厄瓜多',
+'厄立特里亚' => '厄利垂亞',
+'厄立特里亞' => '厄利垂亞',
 '厄瓜多' => '厄瓜多',
 '厄瓜多尔' => '厄瓜多',
+'厄瓜多爾' => '厄瓜多',
 '源代码' => '原始碼',
 '圆珠笔' => '原子筆',
+'反烟' => '反菸',
 '反煙' => '反菸',
 '可卡因' => '古柯鹼',
 '便携式' => '可攜式',
@@ -13975,17 +13984,17 @@ $zh2TW = array(
 '乞力马扎罗' => '吉力馬札羅',
 '吉布堤' => '吉布地',
 '吉布提' => '吉布地',
-'吉尔吉斯斯坦' => '吉爾吉斯',
 '基里巴斯' => '吉里巴斯',
-'圖瓦盧' => '吐瓦魯',
 '图瓦卢' => '吐瓦魯',
+'圖瓦盧' => '吐瓦魯',
+'吸烟' => '吸菸',
 '吸煙' => '吸菸',
+'吕宋烟' => '呂宋菸',
 '呂宋煙' => '呂宋菸',
-'哈萨克斯坦' => '哈薩克',
 '格丁根' => '哥廷根',
 '哥特式' => '哥德式',
-'哥斯達黎加' => '哥斯大黎加',
 '哥斯达黎加' => '哥斯大黎加',
+'哥斯達黎加' => '哥斯大黎加',
 '卡拉奇' => '喀拉蚩',
 '乔治·奥威尔' => '喬治·歐威爾',
 '佐治亚' => '喬治亞',
@@ -13996,63 +14005,61 @@ $zh2TW = array(
 '單鏡反光機' => '單眼相機',
 '嘯咤' => '嘯吒',
 '四杆' => '四桿',
-'土库曼斯坦' => '土庫曼',
-'圖盧茲' => '土魯斯',
 '图卢兹' => '土魯斯',
-'IP' => '地址',
+'圖盧茲' => '土魯斯',
 '戛纳' => '坎城',
 '堪培拉' => '坎培拉',
-'坦桑尼亞' => '坦尚尼亞',
 '坦桑尼亚' => '坦尚尼亞',
+'坦桑尼亞' => '坦尚尼亞',
 '端口' => '埠',
 '首席执行官' => '執行長',
-'塔吉克斯坦' => '塔吉克',
-'塞舌爾' => '塞席爾',
 '塞舌尔' => '塞席爾',
+'塞舌爾' => '塞席爾',
 '萨拉热窝' => '塞拉耶佛',
 '薩拉熱窩' => '塞拉耶佛',
+'塞尔维亚和黑山' => '塞爾維亞與蒙特內哥羅',
 '塞爾維亞和黑山' => '塞爾維亞與蒙特內哥羅',
 '塞爾維亞與蒙特內哥羅' => '塞爾維亞與蒙特內哥羅',
-'塞尔维亚和黑山' => '塞爾維亞與蒙特內哥羅',
 '塞维利亚' => '塞維亞',
 '西維爾' => '塞維亞',
 '塞黑' => '塞蒙',
-'英联邦' => '大英國協',
 '共和联邦' => '大英國協',
+'英联邦' => '大英國協',
 '英聯邦' => '大英國協',
-'宇航员' => '太空人',
 '太空飛行員' => '太空人',
-'航天飞机' => '太空梭',
+'宇航员' => '太空人',
 '穿梭機' => '太空梭',
+'航天飞机' => '太空梭',
 '宇航服' => '太空衣',
 '航天器' => '太空飛行器',
-'尼日利亞' => '奈及利亞',
 '尼日利亚' => '奈及利亞',
+'尼日利亞' => '奈及利亞',
 '忌廉' => '奶油',
 '荷里活' => '好萊塢',
 '威廉姆斯' => '威廉士',
-'威斯特法倫' => '威斯伐倫',
 '威斯特法伦' => '威斯伐倫',
+'威斯特法倫' => '威斯伐倫',
 '威士顿康星' => '威斯康辛',
-'威爾士' => '威爾斯',
 '威尔士' => '威爾斯',
+'威爾士' => '威爾斯',
 '字库' => '字型檔',
 '存盘' => '存檔',
-'门德尔松' => '孟德爾頌',
 '孟德爾遜' => '孟德爾頌',
-'安哈爾特' => '安哈特',
+'门德尔松' => '孟德爾頌',
 '安哈尔特' => '安哈特',
-'安提瓜和巴布達' => '安地卡及巴布達',
+'安哈爾特' => '安哈特',
 '安提瓜和巴布达' => '安地卡及巴布達',
+'安提瓜和巴布達' => '安地卡及巴布達',
 '洪都拉斯' => '宏都拉斯',
 '密歇根' => '密西根',
 '宽带' => '寬頻',
-'老撾人民民主共和國' => '寮人民民主共和國',
 '老挝人民民主共和国' => '寮人民民主共和國',
+'老撾人民民主共和國' => '寮人民民主共和國',
 '老挝' => '寮國',
 '老撾' => '寮國',
 '老挝语' => '寮語',
 '老撾語' => '寮語',
+'波里活' => '寶萊塢',
 '高峰时段' => '尖峰時段',
 '高峰时间' => '尖峰時間',
 '贊比亞' => '尚比亞',
@@ -14065,8 +14072,8 @@ $zh2TW = array(
 '機床' => '工具機',
 '珍寶客機' => '巨無霸客機',
 '发达国家' => '已開發國家',
-'巴塞隆拿' => '巴塞隆納',
 '巴塞罗那' => '巴塞隆納',
+'巴塞隆拿' => '巴塞隆納',
 '巴布亚新几内亚' => '巴布亞紐幾內亞',
 '巴布亞新畿內亞' => '巴布亞紐幾內亞',
 '巴士拉' => '巴斯拉',
@@ -14074,8 +14081,8 @@ $zh2TW = array(
 '佈' => '布',
 '布基納法索' => '布吉納法索',
 '布基纳法索' => '布吉納法索',
-'布殊' => '布希',
 '布什' => '布希',
+'布殊' => '布希',
 '勃兰登堡' => '布蘭登堡',
 '勃蘭登堡' => '布蘭登堡',
 '布里斯托尔' => '布里斯托',
@@ -14092,12 +14099,15 @@ $zh2TW = array(
 '几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
 '比利牛斯' => '庇里牛斯',
+'库尔德人' => '庫德人',
+'库尔德族' => '庫德族',
 '康涅狄格' => '康乃狄克',
 '约翰斯顿岛' => '強斯頓環礁',
+'汇编' => '彙編',
 '形而上学' => '形上學',
 '形而上學' => '形上學',
-'得克薩斯' => '德克薩斯',
 '得克萨斯' => '德克薩斯',
+'得克薩斯' => '德克薩斯',
 '德累斯頓' => '德勒斯登',
 '德累斯顿' => '德勒斯登',
 '德里达' => '德希達',
@@ -14111,74 +14121,79 @@ $zh2TW = array(
 '艾奧瓦' => '愛荷華',
 '爱德华州' => '愛達荷州',
 '应用程序' => '應用程式',
-'戈爾巴喬夫' => '戈巴契夫',
 '戈尔巴乔夫' => '戈巴契夫',
+'戈爾巴喬夫' => '戈巴契夫',
+'戒烟' => '戒菸',
 '戒煙' => '戒菸',
 '戴克里先' => '戴克里先',
+'抽烟' => '抽菸',
 '抽煙' => '抽菸',
 '拉普兰' => '拉布蘭',
+'拒烟' => '拒菸',
 '拒煙' => '拒菸',
+'卷烟' => '捲菸',
 '捲煙' => '捲菸',
 '積架' => '捷豹',
 '控件' => '控制項',
 '推杆' => '推桿',
 '第比利斯' => '提比里西',
-'揮杆' => '揮桿',
 '挥杆' => '揮桿',
+'揮杆' => '揮桿',
 '搜索引擎' => '搜尋引擎',
 '摩根士丹利' => '摩根史坦利',
 '台球' => '撞球',
 '攻打印' => '攻打印',
 '数字技术' => '數位技術',
 '數碼技術' => '數位技術',
-'數碼相機' => '數位相機',
 '数码相机' => '數位相機',
+'數碼相機' => '數位相機',
 '数字信号' => '數位訊號',
 '數碼訊號' => '數位訊號',
 '数字电视' => '數位電視',
 '數碼電視' => '數位電視',
-'调制解调器' => '數據機',
 '調制解調器' => '數據機',
+'调制解调器' => '數據機',
 '斯洛文尼亚' => '斯洛維尼亞',
 '斯洛文尼亞' => '斯洛維尼亞',
 '新罕布什尔' => '新罕布夏',
 '施罗德' => '施洛德',
+'旱烟' => '旱菸',
 '旱煙' => '旱菸',
 '普利策' => '普利茲',
 '芯片' => '晶片',
 '智能卡' => '智慧卡',
-'智能手機' => '智慧型手機',
 '智能手机' => '智慧型手機',
+'智能手機' => '智慧型手機',
 '智能电话' => '智慧型電話',
 '智能電話' => '智慧型電話',
-'知识产权' => '智慧財產權',
 '知識產權' => '智慧財產權',
+'知识产权' => '智慧財產權',
 '萌島' => '曼島',
 '马恩岛' => '曼島',
 '木杆' => '木桿',
 '列奥纳多' => '李奧納多',
-'杜塞爾多夫' => '杜塞道夫',
 '杜塞尔多夫' => '杜塞道夫',
+'杜塞爾多夫' => '杜塞道夫',
 '迪拜' => '杜拜',
-'亚细安' => '東協',
 '东盟' => '東協',
+'亚细安' => '東協',
 '东南亚国家联盟' => '東南亞國協',
 '柏林墙' => '柏林圍牆',
 '柏林牆' => '柏林圍牆',
 '乍得' => '查德',
 '查韦斯' => '查維茲',
-'克林顿' => '柯林頓',
 '克林頓' => '柯林頓',
-'撒切尔' => '柴契爾',
+'克林顿' => '柯林頓',
 '戴卓爾' => '柴契爾',
-'æ ¼æ\9e\97纳达' => 'æ ¼ç\91\9eé\82£é\81\94',
+'æ\92\92å\88\87å°\94' => 'æ\9f´å¥\91ç\88¾',
 '格林納達' => '格瑞那達',
-'乒乓球' => '桌球',
+'格林纳达' => '格瑞那達',
 '乒乓' => '桌球',
+'乒乓球' => '桌球',
 '杆弟' => '桿弟',
 '杆身' => '桿身',
-'杆頭' => '桿頭',
 '杆头' => '桿頭',
+'杆頭' => '桿頭',
 '梅尔·吉布森' => '梅爾·吉勃遜',
 '梵高' => '梵谷',
 '桑巴舞' => '森巴舞',
@@ -14189,38 +14204,41 @@ $zh2TW = array(
 '標準杆' => '標準桿',
 '毛里求斯' => '模里西斯',
 '毛里裘斯' => '模里西斯',
-'機械人' => '機器人',
 '机器人' => '機器人',
+'機械人' => '機器人',
 '概率' => '機率',
 '電單車' => '機車',
 '枱' => '檯',
 '字段' => '欄位',
-'奧巴馬' => '歐巴馬',
 '奥巴马' => '歐巴馬',
+'奧巴馬' => '歐巴馬',
 '正在叱咤' => '正在叱咤',
 '文莱' => '汶萊',
 '沙律' => '沙拉',
-'沙特阿拉伯' => '沙烏地阿拉伯',
 '沙地阿拉伯' => '沙烏地阿拉伯',
+'沙特阿拉伯' => '沙烏地阿拉伯',
 '法属圭亚那' => '法屬蓋亞那',
 '波斯尼亚' => '波士尼亞',
 '波斯尼亞' => '波士尼亞',
-'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
 '波斯尼亚和黑塞哥维那' => '波士尼亞赫塞哥維納',
-'博茨瓦纳' => '波札那',
+'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
 '博茨瓦納' => '波札那',
+'博茨瓦纳' => '波札那',
 '波黑' => '波赫',
+'洋烟' => '洋菸',
 '洋煙' => '洋菸',
 '帕特里克' => '派屈克',
 '海洛英' => '海洛因',
-'侯赛因' => '海珊',
 '侯賽因' => '海珊',
+'侯赛因' => '海珊',
 '鼠标' => '滑鼠',
-'漢诺威' => '漢諾瓦',
 '汉诺威' => '漢諾瓦',
-'乌兹别克斯坦' => '烏茲別克',
+'漢诺威' => '漢諾瓦',
+'烤烟' => '烤菸',
 '烤煙' => '烤菸',
+'无烟日' => '無菸日',
 '無煙日' => '無菸日',
+'无烟环境' => '無菸環境',
 '無煙環境' => '無菸環境',
 '烟熏' => '煙燻',
 '首席运营官' => '營運長',
@@ -14236,8 +14254,8 @@ $zh2TW = array(
 '独立国家联合体' => '獨立國家國協',
 '波利尼西亚' => '玻里尼西亞',
 '波利尼西亞' => '玻里尼西亞',
-'本杰明' => '班傑明',
 '本傑明' => '班傑明',
+'本杰明' => '班傑明',
 '球杆' => '球桿',
 '理查德' => '理察',
 '卢塞恩' => '琉森',
@@ -14254,12 +14272,12 @@ $zh2TW = array(
 '徵狀' => '症狀',
 '勃朗宁' => '白朗寧',
 '百慕大' => '百慕達',
-'盧旺達' => '盧安達',
 '卢旺达' => '盧安達',
+'盧旺達' => '盧安達',
 '睾' => '睪',
 '知识产权局' => '知識產權局',
-'知識產權署' => '知識產權署',
 '知識產權局' => '知識產權署',
+'知識產權署' => '知識產權署',
 '知识产权署' => '知識產權署',
 '硅' => '矽',
 '硅藻' => '硅藻',
@@ -14268,17 +14286,19 @@ $zh2TW = array(
 '盘片' => '碟片',
 '磁盘' => '磁碟',
 '磁道' => '磁軌',
+'禁烟' => '禁菸',
 '禁煙' => '禁菸',
 '福尔马林' => '福馬林',
 '福爾馬林' => '福馬林',
+'私烟' => '私菸',
 '私煙' => '私菸',
 '程序员' => '程式設計師',
 '编程语言' => '程式語言',
-'空氣質素' => '空氣品質',
 '空气质量' => '空氣品質',
+'空氣質素' => '空氣品質',
 '突尼斯' => '突尼西亞',
-'蹦极跳' => '笨豬跳',
 '绑紧跳' => '笨豬跳',
+'蹦极跳' => '笨豬跳',
 '短信' => '簡訊',
 '纽黑文' => '紐哈芬',
 '新奥尔良' => '紐奧良',
@@ -14287,23 +14307,24 @@ $zh2TW = array(
 '新西兰' => '紐西蘭',
 '新西蘭' => '紐西蘭',
 '紙煙' => '紙菸',
-'ç´¢è´\8aå°¼è¾\9b' => 'ç´¢å¿\8då°¼è¾\9b',
+'纸ç\83\9f' => 'ç´\99è\8f¸',
 '索尔仁尼琴' => '索忍尼辛',
-'所羅門群島' => '索羅門群島',
+'索贊尼辛' => '索忍尼辛',
 '所罗门群岛' => '索羅門群島',
-'索马里' => '索馬利亞',
+'所羅門群島' => '索羅門群島',
 '索馬里' => '索馬利亞',
-'索马里兰' => '索馬利蘭',
+'索马里' => '索馬利亞',
 '索馬里蘭' => '索馬利蘭',
+'索马里兰' => '索馬利蘭',
 '維爾京群島' => '維京群島',
 '维尔京群岛' => '維京群島',
 '弗吉尼亚' => '維吉尼亞',
 '佛得角' => '維德角',
 '维特根斯坦' => '維根斯坦',
+'互联网' => '網際網路',
 '互联网络' => '網際網路',
-'因特网' => '網際網路',
 '互聯網' => '網際網路',
-'互联网' => '網際網路',
+'因特网' => '網際網路',
 '系着' => '繫著',
 '卢瓦尔' => '羅亞爾',
 '盧瓦爾' => '羅亞爾',
@@ -14314,11 +14335,11 @@ $zh2TW = array(
 '昂山素季' => '翁山蘇姬',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
-'聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
+'聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣赫勒拿' => '聖赫倫那',
-'聖盧西亞' => '聖露西亞',
 '圣卢西亚' => '聖露西亞',
+'聖盧西亞' => '聖露西亞',
 '圣马力诺' => '聖馬利諾',
 '聖馬力諾' => '聖馬利諾',
 '肯尼亚' => '肯亞',
@@ -14328,8 +14349,8 @@ $zh2TW = array(
 '三藩市' => '舊金山',
 '艾森豪威尔' => '艾森豪',
 '埃菲尔' => '艾菲爾',
-'阿里埃勒·沙龙' => '艾里爾·夏隆',
 '阿里埃勒·沙龍' => '艾里爾·夏隆',
+'阿里埃勒·沙龙' => '艾里爾·夏隆',
 '帕塔亚' => '芭達亞',
 '黎克特制' => '芮氏',
 '里氏0' => '芮氏0',
@@ -14347,8 +14368,8 @@ $zh2TW = array(
 '里氏震级' => '芮氏規模',
 '当且仅当' => '若且唯若',
 '味美思' => '苦艾酒',
-'毛里塔尼亞' => '茅利塔尼亞',
 '毛里塔尼亚' => '茅利塔尼亞',
+'毛里塔尼亞' => '茅利塔尼亞',
 '霍尔木兹' => '荷姆茲',
 '霍爾木茲' => '荷姆茲',
 '荷李活道' => '荷李活道',
@@ -14356,27 +14377,45 @@ $zh2TW = array(
 '瓦文萨' => '華勒沙',
 '華里沙' => '華勒沙',
 '瓦格纳' => '華格納',
+'烟具' => '菸具',
 '煙具' => '菸具',
+'烟品' => '菸品',
 '煙品' => '菸品',
+'烟嘴' => '菸嘴',
 '煙嘴' => '菸嘴',
+'烟卷' => '菸捲',
 '煙捲' => '菸捲',
+'烟斗' => '菸斗',
 '煙斗' => '菸斗',
+'烟民' => '菸民',
 '煙民' => '菸民',
+'烟灰' => '菸灰',
 '煙灰' => '菸灰',
+'烟瘾' => '菸癮',
 '煙癮' => '菸癮',
+'烟丝' => '菸絲',
 '煙絲' => '菸絲',
+'烟草' => '菸草',
 '煙草' => '菸草',
+'烟叶' => '菸葉',
 '煙葉' => '菸葉',
+'烟蒂' => '菸蒂',
 '煙蒂' => '菸蒂',
+'烟袋' => '菸袋',
 '煙袋' => '菸袋',
+'烟农' => '菸農',
 '煙農' => '菸農',
+'烟酒' => '菸酒',
 '煙酒' => '菸酒',
+'烟头' => '菸頭',
 '煙頭' => '菸頭',
+'烟鬼' => '菸鬼',
 '煙鬼' => '菸鬼',
+'烟碱' => '菸鹼',
 '煙鹼' => '菸鹼',
 '万历朝鲜战争' => '萬曆朝鮮戰爭',
-'瓦努阿圖' => '萬那杜',
 '瓦努阿图' => '萬那杜',
+'瓦努阿圖' => '萬那杜',
 '叶利钦' => '葉爾欽',
 '葉利欽' => '葉爾欽',
 '埃里温' => '葉里溫',
@@ -14386,22 +14425,24 @@ $zh2TW = array(
 '着' => '著',
 '科摩罗' => '葛摩',
 '科摩羅' => '葛摩',
-'黑山共和國' => '蒙特內哥羅共和國',
+'格林美獎' => '葛萊美獎',
+'格莱美奖' => '葛萊美獎',
 '黑山共和国' => '蒙特內哥羅共和國',
-'蒙特利爾' => '蒙特婁',
+'黑山共和國' => '蒙特內哥羅共和國',
 '滿地可' => '蒙特婁',
 '蒙特利尔' => '蒙特婁',
+'蒙特利爾' => '蒙特婁',
 '普密蓬' => '蒲美蓬',
 '布隆迪' => '蒲隆地',
 '圭亚那' => '蓋亞那',
 '开曼群岛' => '蓋曼群島',
 '開曼群島' => '蓋曼群島',
-'蕭士達高維契' => '蕭士塔高維奇',
 '肖斯塔科维奇' => '蕭士塔高維奇',
+'蕭士達高維契' => '蕭士塔高維奇',
 '肖邦' => '蕭邦',
 '薛定谔' => '薛丁格',
-'扎伊爾' => '薩伊',
 '扎伊尔' => '薩伊',
+'扎伊爾' => '薩伊',
 '素檀' => '蘇丹',
 '苏里南' => '蘇利南',
 '浮罗交怡' => '蘭卡威',
@@ -14412,37 +14453,38 @@ $zh2TW = array(
 '屏幕' => '螢幕',
 '流動網絡' => '行動網路',
 '移动网络' => '行動網路',
-'移动电话' => '行動電話',
 '流動電話' => '行動電話',
+'移动电话' => '行動電話',
 '冲着' => '衝著',
-'埃塞俄比亞' => '衣索比亞',
 '埃塞俄比亚' => '衣索比亞',
+'埃塞俄比亞' => '衣索比亞',
 '克隆人' => '複製人',
-'國際象棋' => '西洋棋',
 '囯际象棋' => '西洋棋',
 '国际象棋' => '西洋棋',
+'國際象棋' => '西洋棋',
 '赫梯' => '西臺',
-'解像度' => '解析度',
 '分辨率' => '解析度',
+'解像度' => '解析度',
 '译码' => '解碼',
 '出租车' => '計程車',
 '约翰逊' => '詹森',
 '诺曼底' => '諾曼第',
-'瑙鲁' => '諾魯',
 '瑙魯' => '諾魯',
+'瑙鲁' => '諾魯',
 '科特迪瓦' => '象牙海岸',
-'贝尔格莱德' => '貝爾格勒',
 '貝爾格萊德' => '貝爾格勒',
+'贝尔格莱德' => '貝爾格勒',
 '伯利兹' => '貝里斯',
 '伯利茲' => '貝里斯',
 '首席财务官' => '財務長',
 '集装箱' => '貨櫃',
-'數據庫' => '資料庫',
 '数据库' => '資料庫',
+'數據庫' => '資料庫',
 '信息论' => '資訊理論',
+'乔布斯' => '賈伯斯',
 '宾西法尼亚' => '賓夕法尼亞',
-'利比里亞' => '賴比瑞亞',
 '利比里亚' => '賴比瑞亞',
+'利比里亞' => '賴比瑞亞',
 '莱索托' => '賴索托',
 '萊索托' => '賴索托',
 '塞浦路斯' => '賽普勒斯',
@@ -14453,8 +14495,8 @@ $zh2TW = array(
 '软驱' => '軟碟機',
 '軟件' => '軟體',
 '软件' => '軟體',
-'津巴布韦' => '辛巴威',
 '津巴布韋' => '辛巴威',
+'津巴布韦' => '辛巴威',
 '径入' => '逕入',
 '径到' => '逕到',
 '径取' => '逕取',
@@ -14474,17 +14516,16 @@ $zh2TW = array(
 '溫納圖萬' => '那杜',
 '丘吉尔' => '邱吉爾',
 '多普勒' => '都卜勒',
-'奥斯曼' => '鄂圖曼',
 '酰' => '醯',
 '里士满' => '里奇蒙',
-'金沙薩' => '金夏沙',
 '金沙萨' => '金夏沙',
-'健力士世界纪录' => '金氏世界紀錄',
+'金沙薩' => '金夏沙',
 '健力士世界紀錄' => '金氏世界紀錄',
+'健力士世界纪录' => '金氏世界紀錄',
 '吉尼斯世界纪录' => '金氏世界紀錄',
 '钚' => '鈽',
-'钩' => '鉤',
 '鈎' => '鉤',
+'钩' => '鉤',
 '锎' => '鉲',
 '锫' => '鉳',
 '镅' => '鋂',
@@ -14513,18 +14554,20 @@ $zh2TW = array(
 '雅穆苏克雷' => '雅穆索戈',
 '雅穆蘇克雷' => '雅穆索戈',
 '悉尼' => '雪梨',
+'雪茄烟' => '雪茄菸',
 '雪茄煙' => '雪茄菸',
 '莱特湾' => '雷伊泰灣',
 '萊特灣' => '雷伊泰灣',
 '激光' => '雷射',
 '雷诺阿' => '雷諾瓦',
+'电子烟' => '電子菸',
 '電子煙' => '電子菸',
-'晶體管' => '電晶體',
 '晶体管' => '電晶體',
+'晶體管' => '電晶體',
 '电杆' => '電桿',
 '电线杆' => '電線桿',
-'计算机程序' => '電腦程式',
 '电脑程序' => '電腦程式',
+'计算机程序' => '電腦程式',
 '荷尔斯泰因' => '霍爾斯坦',
 '荷爾斯泰因' => '霍爾斯坦',
 '朝鲜战争' => '韓戰',
@@ -14532,9 +14575,10 @@ $zh2TW = array(
 '缺省' => '預設',
 '导弹' => '飛彈',
 '糊口' => '餬口',
+'香烟' => '香菸',
 '香煙' => '香菸',
-'马里共和国' => '馬利共和國',
 '馬里共和國' => '馬利共和國',
+'马里共和国' => '馬利共和國',
 '马拉维' => '馬拉威',
 '馬斯特里赫特' => '馬斯垂克',
 '马斯特里赫特' => '馬斯垂克',
@@ -14548,25 +14592,27 @@ $zh2TW = array(
 '咪高峰' => '麥克風',
 '迈克尔' => '麥可',
 '麦克尔' => '麥可',
-'邁凱輪' => '麥拿輪',
 '迈凯轮' => '麥拿輪',
+'邁凱輪' => '麥拿輪',
 '马萨诸塞' => '麻薩諸塞',
 '戴安娜' => '黛安娜',
 '狄安娜' => '黛安娜',
+'点烟' => '點菸',
 '點煙' => '點菸',
 '霉素' => '黴素',
 );
 
 $zh2HK = array(
 'IP地址' => 'IP位址',
-'·威爾士' => '·威爾士',
 '·威尔士' => '·威爾士',
+'·威爾士' => '·威爾士',
 '一地里' => '一地裏',
 '一年里' => '一年裏',
 '三十六著' => '三十六着',
 '三極體' => '三極管',
 '旧金山' => '三藩市',
 '舊金山' => '三藩市',
+'上台面' => '上枱面',
 '下著' => '下着',
 '下著作' => '下著作',
 '下著名' => '下著名',
@@ -14632,6 +14678,7 @@ $zh2HK = array(
 '伊斯坦堡' => '伊斯坦布爾',
 '伊斯蘭瑪巴德' => '伊斯蘭堡',
 '埃博拉' => '伊波拉',
+'伏著' => '伏着',
 '貝里斯' => '伯利茲',
 '伯明罕' => '伯明翰',
 '伴著' => '伴着',
@@ -14656,8 +14703,8 @@ $zh2HK = array(
 '布满' => '佈滿',
 '布滿' => '佈滿',
 '布置' => '佈置',
-'布设' => '佈設',
 '布設' => '佈設',
+'布设' => '佈設',
 '布警' => '佈警',
 '布道' => '佈道',
 '布防' => '佈防',
@@ -14665,12 +14712,12 @@ $zh2HK = array(
 '布陣' => '佈陣',
 '布雷、' => '佈雷、',
 '布雷。' => '佈雷。',
-'布雷封锁' => '佈雷封鎖',
 '布雷封鎖' => '佈雷封鎖',
+'布雷封锁' => '佈雷封鎖',
 '布雷的' => '佈雷的',
 '布雷艇' => '佈雷艇',
-'布雷艦' => '佈雷艦',
 '布雷舰' => '佈雷艦',
+'布雷艦' => '佈雷艦',
 '布雷速度' => '佈雷速度',
 '布雷,' => '佈雷,',
 '布雷;' => '佈雷;',
@@ -14737,8 +14784,8 @@ $zh2HK = array(
 '占上風' => '佔上風',
 '占上风' => '佔上風',
 '占下' => '佔下',
-'占下风' => '佔下風',
 '占下風' => '佔下風',
+'占下风' => '佔下風',
 '占不占' => '佔不佔',
 '占不足' => '佔不足',
 '占世界' => '佔世界',
@@ -14759,10 +14806,10 @@ $zh2HK = array(
 '占個' => '佔個',
 '占个位' => '佔個位',
 '占個位' => '佔個位',
-'占億' => '佔億',
 '占亿' => '佔億',
-'å\8d å\84ª' => 'ä½\94å\84ª',
+'å\8d å\84\84' => 'ä½\94å\84\84',
 '占优' => '佔優',
+'占優' => '佔優',
 '占先' => '佔先',
 '占光' => '佔光',
 '占全' => '佔全',
@@ -14789,8 +14836,8 @@ $zh2HK = array(
 '占國' => '佔國',
 '占在' => '佔在',
 '占地' => '佔地',
-'占場' => '佔場',
 '占场' => '佔場',
+'占場' => '佔場',
 '占压' => '佔壓',
 '占壓' => '佔壓',
 '占多' => '佔多',
@@ -14811,8 +14858,8 @@ $zh2HK = array(
 '占德' => '佔德',
 '占所有' => '佔所有',
 '占掉' => '佔掉',
-'占據' => '佔據',
 '占据' => '佔據',
+'占據' => '佔據',
 '占整' => '佔整',
 '占新' => '佔新',
 '占有' => '佔有',
@@ -14825,23 +14872,23 @@ $zh2HK = array(
 '占满' => '佔滿',
 '占滿' => '佔滿',
 '占澳' => '佔澳',
-'占為' => '佔為',
 '占为' => '佔為',
+'占為' => '佔為',
 '占率' => '佔率',
 '占用' => '佔用',
-'占畢' => '佔畢',
 '占毕' => '佔畢',
+'占畢' => '佔畢',
 '占百' => '佔百',
-'占盡' => '佔盡',
 '占尽' => '佔盡',
+'占盡' => '佔盡',
 '占着' => '佔着',
 '占著' => '佔着',
-'占网' => '佔網',
 '占網' => '佔網',
+'占网' => '佔網',
 '占線' => '佔線',
 '占线' => '佔線',
-'占總' => '佔總',
 '占总' => '佔總',
+'占總' => '佔總',
 '占缺' => '佔缺',
 '占美' => '佔美',
 '占耕' => '佔耕',
@@ -14849,21 +14896,21 @@ $zh2HK = array(
 '占至少' => '佔至少',
 '占臺' => '佔臺',
 '占英' => '佔英',
-'占萬' => '佔萬',
 '占万' => '佔萬',
+'占萬' => '佔萬',
 '占著名' => '佔著名',
 '占著者' => '佔著者',
 '占葡' => '佔葡',
-'占蘇' => '佔蘇',
 '占苏' => '佔蘇',
+'占蘇' => '佔蘇',
 '占西' => '佔西',
 '占資' => '佔資',
 '占资' => '佔資',
 '占起' => '佔起',
 '占超过' => '佔超過',
 '占超過' => '佔超過',
-'占過' => '佔過',
 '占过' => '佔過',
+'占過' => '佔過',
 '占道' => '佔道',
 '占零' => '佔零',
 '占領' => '佔領',
@@ -14931,8 +14978,8 @@ $zh2HK = array(
 '做著者' => '做著者',
 '做著述' => '做著述',
 '做著錄' => '做著錄',
-'金氏世界紀錄' => '健力士世界紀錄',
 '吉尼斯世界纪录' => '健力士世界紀錄',
+'金氏世界紀錄' => '健力士世界紀錄',
 '側著' => '側着',
 '側著作' => '側著作',
 '側著名' => '側著名',
@@ -15025,8 +15072,8 @@ $zh2HK = array(
 '剪彩' => '剪綵',
 '割占' => '割佔',
 '劃著' => '劃着',
-'擊劍' => '劍擊',
 '击剑' => '劍擊',
+'擊劍' => '劍擊',
 '加薩走廊' => '加沙地帶',
 '迦納' => '加納',
 '加彭' => '加蓬',
@@ -15060,8 +15107,8 @@ $zh2HK = array(
 '南朝鲜' => '南韓',
 '波札那' => '博茨瓦納',
 '占卜' => '占卜',
-'占國橋' => '占國橋',
 '占国桥' => '占國橋',
+'占國橋' => '占國橋',
 '占有五不' => '占有五不',
 '占著作' => '占著作',
 '占著稱' => '占著稱',
@@ -15081,8 +15128,8 @@ $zh2HK = array(
 '印著錄' => '印著錄',
 '瓜地馬拉' => '危地馬拉',
 '厄瓜多' => '厄瓜多爾',
-'厄瓜多爾' => '厄瓜多爾',
 '厄瓜多尔' => '厄瓜多爾',
+'厄瓜多爾' => '厄瓜多爾',
 '厄利垂亚' => '厄立特里亞',
 '厄利垂亞' => '厄立特里亞',
 '源代码' => '原始碼',
@@ -15117,8 +15164,9 @@ $zh2HK = array(
 '叫著錄' => '叫著錄',
 '古柯鹼' => '可卡因',
 '叱吒' => '叱咤',
-'斯皮尔伯格' => '史匹堡',
+'斯坦福' => '史丹福',
 '史匹柏' => '史匹堡',
+'斯皮尔伯格' => '史匹堡',
 '史蒂芬·史匹柏' => '史提芬·史匹堡',
 '斯蒂芬·斯皮尔伯格' => '史提芬·史匹堡',
 '吃不著' => '吃不着',
@@ -15127,7 +15175,6 @@ $zh2HK = array(
 '吃里扒外' => '吃裏扒外',
 '吃里爬外' => '吃裏爬外',
 '吉布地' => '吉布堤',
-'吉尔吉斯斯坦' => '吉爾吉斯',
 '吊著' => '吊着',
 '向著' => '向着',
 '向著作' => '向著作',
@@ -15166,8 +15213,8 @@ $zh2HK = array(
 '味著述' => '味著述',
 '味著錄' => '味著錄',
 '咖哩' => '咖喱',
-'麦克风' => '咪高峰',
 '麥克風' => '咪高峰',
+'麦克风' => '咪高峰',
 '哥特式' => '哥德式',
 '哥斯大黎加' => '哥斯達黎加',
 '哪里' => '哪裏',
@@ -15195,14 +15242,15 @@ $zh2HK = array(
 '喝著者' => '喝著者',
 '喝著述' => '喝著述',
 '喝著錄' => '喝著錄',
+'賈伯斯' => '喬布斯',
 '乔治·奥威尔' => '喬治·歐威爾',
-'單眼相機' => '單鏡反光機',
 '单反相机' => '單鏡反光機',
+'單眼相機' => '單鏡反光機',
 '嗅不著' => '嗅不着',
 '嗅得著' => '嗅得着',
 '嗅著' => '嗅着',
-'凱薩琳' => '嘉芙蓮',
 '凯瑟琳' => '嘉芙蓮',
+'凱薩琳' => '嘉芙蓮',
 '嘯吒' => '嘯咤',
 '嘴里' => '嘴裏',
 '嚷著' => '嚷着',
@@ -15262,7 +15310,6 @@ $zh2HK = array(
 '蓋亞那' => '圭亞那',
 '地占' => '地佔',
 '地图里' => '地圖裏',
-'IP' => '地址',
 '堪培拉' => '坎培拉',
 '坐台' => '坐枱',
 '坐著' => '坐着',
@@ -15287,6 +15334,7 @@ $zh2HK = array(
 '賽普勒斯' => '塞浦路斯',
 '塞爾維亞與蒙特內哥羅' => '塞爾維亞和黑山',
 '塞席爾' => '塞舌爾',
+'境里' => '境裏',
 '壓著' => '壓着',
 '壓著作' => '壓著作',
 '壓著名' => '壓著名',
@@ -15320,13 +15368,13 @@ $zh2HK = array(
 '夾著者' => '夾著者',
 '夾著述' => '夾著述',
 '夾著錄' => '夾著錄',
-'奧占' => '奧佔',
 '奥占' => '奧佔',
+'奧占' => '奧佔',
 '歐巴馬' => '奧巴馬',
 '妆台' => '妝枱',
 '威斯伐倫' => '威斯特法倫',
-'威爾士' => '威爾斯',
 '威尔士' => '威爾斯',
+'威爾士' => '威爾斯',
 '子里' => '子裏',
 '字里行间' => '字裏行間',
 '存著' => '存着',
@@ -15386,10 +15434,10 @@ $zh2HK = array(
 '寫著錄' => '寫著錄',
 '宝里宝气' => '寶裏寶氣',
 '封面里' => '封面裏',
-'將占' => '將佔',
 '将占' => '將佔',
-'將占卜' => '將占卜',
+'將占' => '將佔',
 '将占卜' => '將占卜',
+'將占卜' => '將占卜',
 '专辑里' => '專輯裏',
 '尋著' => '尋着',
 '尋著作' => '尋著作',
@@ -15472,6 +15520,8 @@ $zh2HK = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著稱',
 '幾內亞比索' => '幾內亞比紹',
+'庫德人' => '库爾德人',
+'庫德族' => '库爾德族',
 '店里' => '店裏',
 '坎城' => '康城',
 '戛纳' => '康城',
@@ -15484,8 +15534,8 @@ $zh2HK = array(
 '康著述' => '康著述',
 '康著錄' => '康著錄',
 '庙里' => '廟裏',
-'强占' => '強佔',
 '強占' => '強佔',
+'强占' => '強佔',
 '约翰斯顿岛' => '強斯頓環礁',
 '弹子台' => '彈子枱',
 '蹦床' => '彈床',
@@ -15521,8 +15571,8 @@ $zh2HK = array(
 '循著者' => '循著者',
 '循著述' => '循著述',
 '循著錄' => '循著錄',
-'徵占' => '徵佔',
 '征占' => '徵佔',
+'徵占' => '徵佔',
 '德占' => '德佔',
 '得克萨斯' => '德克薩斯',
 '德勒斯登' => '德累斯頓',
@@ -15596,8 +15646,8 @@ $zh2HK = array(
 '想著者' => '想著者',
 '想著述' => '想著述',
 '想著錄' => '想著錄',
-'義占' => '意佔',
 '意占' => '意佔',
+'義占' => '意佔',
 '義大利' => '意大利',
 '艾滋' => '愛滋',
 '愛著' => '愛着',
@@ -15786,8 +15836,8 @@ $zh2HK = array(
 '捆著者' => '捆著者',
 '捆著述' => '捆著述',
 '捆著錄' => '捆著錄',
-'俯卧撑' => '掌上壓',
 '伏地挺身' => '掌上壓',
+'俯卧撑' => '掌上壓',
 '掖著' => '掖着',
 '掖著作' => '掖著作',
 '掖著名' => '掖著名',
@@ -15897,10 +15947,10 @@ $zh2HK = array(
 '数字技术' => '數碼技術',
 '數位技術' => '數碼技術',
 '數位相機' => '數碼相機',
-'數碼訊號' => '數碼訊號',
 '数字信号' => '數碼訊號',
-'數位電視' => '數碼電視',
+'數碼訊號' => '數碼訊號',
 '数字电视' => '數碼電視',
+'數位電視' => '數碼電視',
 '數著作' => '數著作',
 '數著名' => '數著名',
 '數著稱' => '數著稱',
@@ -15933,8 +15983,8 @@ $zh2HK = array(
 '昂著者' => '昂著者',
 '昂著述' => '昂著述',
 '昂著錄' => '昂著錄',
-'星羅棋布' => '星羅棋佈',
 '星罗棋布' => '星羅棋佈',
+'星羅棋布' => '星羅棋佈',
 '映著' => '映着',
 '映著作' => '映著作',
 '映著名' => '映著名',
@@ -15950,8 +16000,8 @@ $zh2HK = array(
 '晃著者' => '晃著者',
 '晃著述' => '晃著述',
 '晃著錄' => '晃著錄',
-'芯片' => '晶片',
 '晶元' => '晶片',
+'芯片' => '晶片',
 '智慧型' => '智能',
 '智慧卡' => '智能卡',
 '智慧手機' => '智能手機',
@@ -15966,10 +16016,10 @@ $zh2HK = array(
 '暗著述' => '暗著述',
 '暗著錄' => '暗著錄',
 '暗里' => '暗裏',
-'會占' => '會佔',
 '会占' => '會佔',
-'會占卜' => '會占卜',
+'會占' => '會佔',
 '会占卜' => '會占卜',
+'會占卜' => '會占卜',
 '会里' => '會裏',
 '有著' => '有着',
 '有著作' => '有著作',
@@ -16026,15 +16076,19 @@ $zh2HK = array(
 '台历' => '枱曆',
 '台灯' => '枱燈',
 '台面上' => '枱面上',
+'台面化' => '枱面化',
 '柏林墙' => '柏林圍牆',
 '奧黛莉·朵杜' => '柯德莉·塔圖',
 '奥黛丽·赫本' => '柯德莉·夏萍',
 '奧黛麗·赫本' => '柯德莉·夏萍',
 '哥廷根' => '格丁根',
 '格瑞那達' => '格林納達',
+'格莱美奖' => '格林美獎',
+'葛萊美獎' => '格林美獎',
 '格鲁吉亚' => '格魯吉亞',
-'æ\92\9eç\90\83' => 'æ¡\8cç\90\83',
+'æ¡\86é\87\8c' => 'æ¡\86è£\8f',
 '台球' => '桌球',
+'撞球' => '桌球',
 '梅鐸' => '梅鐸',
 '默多克' => '梅鐸',
 '梳著' => '梳着',
@@ -16063,8 +16117,8 @@ $zh2HK = array(
 '標誌著' => '標誌着',
 '树林里' => '樹林裏',
 '工具機' => '機床',
-'機器人' => '機械人',
 '机器人' => '機械人',
+'機器人' => '機械人',
 '柜台' => '櫃枱',
 '历史里' => '歷史裏',
 '死里求生' => '死裏求生',
@@ -16109,8 +16163,8 @@ $zh2HK = array(
 '沖著。' => '沖著。',
 '沖著《' => '沖著《',
 '沖著,' => '沖著,',
-'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙地阿拉伯' => '沙特阿拉伯',
+'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙里淘金' => '沙裏淘金',
 '河里' => '河裏',
 '沿著' => '沿着',
@@ -16126,6 +16180,8 @@ $zh2HK = array(
 '玻里尼西亞' => '波利尼西亞',
 '波士尼亞' => '波斯尼亞',
 '波士尼亞赫塞哥維納' => '波斯尼亞黑塞哥維那',
+'宝莱坞' => '波里活',
+'寶萊塢' => '波里活',
 '幫浦' => '泵',
 '洞里' => '洞裏',
 '辛巴威' => '津巴布韋',
@@ -16140,8 +16196,8 @@ $zh2HK = array(
 '活著錄' => '活著錄',
 '移动网络' => '流動網絡',
 '行動網路' => '流動網絡',
-'行動電話' => '流動電話',
 '移动电话' => '流動電話',
+'行動電話' => '流動電話',
 '流著' => '流着',
 '流著作' => '流著作',
 '流著名' => '流著名',
@@ -16162,8 +16218,8 @@ $zh2HK = array(
 '浮著錄' => '浮著錄',
 '海上布雷' => '海上佈雷',
 '海洛因' => '海洛英',
-'海灣布雷' => '海灣佈雷',
 '海湾布雷' => '海灣佈雷',
+'海灣布雷' => '海灣佈雷',
 '涵著' => '涵着',
 '涵著作' => '涵著作',
 '涵著名' => '涵著名',
@@ -16299,8 +16355,8 @@ $zh2HK = array(
 '猜著述' => '猜著述',
 '猜著錄' => '猜著錄',
 '狱里' => '獄裏',
-'獨占' => '獨佔',
 '独占' => '獨佔',
+'獨占' => '獨佔',
 '獨著' => '獨着',
 '獨著作' => '獨著作',
 '獨著名' => '獨著名',
@@ -16365,16 +16421,16 @@ $zh2HK = array(
 '過著作' => '當著作',
 '當著名' => '當著名',
 '過著名' => '當著名',
-'過著書' => '當著書',
 '當著書' => '當著書',
+'過著書' => '當著書',
 '當著稱' => '當著稱',
 '過著稱' => '當著稱',
 '當著者' => '當著者',
 '過著者' => '當著者',
-'過著述' => '當著述',
 '當著述' => '當著述',
-'過著錄' => '當著錄',
+'過著述' => '當著述',
 '當著錄' => '當著錄',
+'過著錄' => '當著錄',
 '几内亚' => '畿內亞',
 '幾內亞' => '畿內亞',
 '迭代' => '疊代',
@@ -16387,8 +16443,8 @@ $zh2HK = array(
 '疑著述' => '疑著述',
 '疑著錄' => '疑著錄',
 '狂牛症' => '瘋牛症',
-'發布' => '發佈',
 '发布' => '發佈',
+'發布' => '發佈',
 '發著' => '發着',
 '發著《' => '發著《',
 '發著作' => '發著作',
@@ -16522,8 +16578,9 @@ $zh2HK = array(
 '什勒斯維希' => '石勒蘇益格',
 '硅' => '矽',
 '硅藻' => '硅藻',
-'硬體' => '硬件',
 '硬件' => '硬件',
+'硬體' => '硬件',
+'碗里' => '碗裏',
 '贝克汉姆' => '碧咸',
 '贝克漢' => '碧咸',
 '社里' => '社裏',
@@ -16538,18 +16595,18 @@ $zh2HK = array(
 '福著錄' => '福著錄',
 '秀发布' => '秀發佈',
 '私下里' => '私下裏',
-'隱私' => '私隱',
 '隐私' => '私隱',
+'隱私' => '私隱',
 '葛摩' => '科摩羅',
 '程序员' => '程式設計師',
 '捷豹' => '積架',
-'穩占' => '穩佔',
 '稳占' => '穩佔',
+'穩占' => '穩佔',
 '穫著' => '穫着',
 '空中布雷' => '空中佈雷',
 '空投布雷' => '空投佈雷',
-'空氣品質' => '空氣質素',
 '空气质量' => '空氣質素',
+'空氣品質' => '空氣質素',
 '空著' => '空着',
 '空著作' => '空著作',
 '空著名' => '空著名',
@@ -16558,8 +16615,8 @@ $zh2HK = array(
 '空著者' => '空著者',
 '空著述' => '空著述',
 '空著錄' => '空著錄',
-'航天飞机' => '穿梭機',
 '太空梭' => '穿梭機',
+'航天飞机' => '穿梭機',
 '穿著' => '穿着',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
@@ -16600,8 +16657,8 @@ $zh2HK = array(
 '节目里' => '節目裏',
 '簽著' => '簽着',
 '籃板球' => '籃板球',
-'麦克尔' => '米高',
 '迈克尔' => '米高',
+'麦克尔' => '米高',
 '迈克尔·欧文' => '米高·奧雲',
 '糊里糊涂' => '糊裏糊塗',
 '系列里' => '系列裏',
@@ -16610,8 +16667,8 @@ $zh2HK = array(
 '約占' => '約佔',
 '约占' => '約佔',
 '紐賓士域' => '紐賓士域',
-'索忍尼辛' => '索贊尼辛',
 '索尔仁尼琴' => '索贊尼辛',
+'索忍尼辛' => '索贊尼辛',
 '索馬利亞' => '索馬里',
 '索馬利里' => '索馬里',
 '紮著' => '紮着',
@@ -16624,8 +16681,8 @@ $zh2HK = array(
 '紮著錄' => '紮著錄',
 '组里' => '組裏',
 '吉他' => '結他',
-'结彩' => '結綵',
 '結彩' => '結綵',
+'结彩' => '結綵',
 '綁著' => '綁着',
 '綁著作' => '綁著作',
 '綁著名' => '綁著名',
@@ -16634,6 +16691,7 @@ $zh2HK = array(
 '綁著者' => '綁著者',
 '綁著述' => '綁著述',
 '綁著錄' => '綁著錄',
+'网站里' => '網站裏',
 '網路' => '網絡',
 '网里' => '網裏',
 '彩带' => '綵帶',
@@ -16654,6 +16712,7 @@ $zh2HK = array(
 '緝凶' => '緝兇',
 '县里' => '縣裏',
 '缝里' => '縫裏',
+'縱著' => '縱着',
 '总数里' => '總數裏',
 '尖峰時段' => '繁忙時段',
 '尖峰時間' => '繁忙時間',
@@ -16667,8 +16726,8 @@ $zh2HK = array(
 '繞著者' => '繞著者',
 '繞著述' => '繞著述',
 '繞著錄' => '繞著錄',
-'繫著' => '繫着',
 '系着' => '繫着',
+'繫著' => '繫着',
 '纏著' => '纏着',
 '纏著作' => '纏著作',
 '纏著名' => '纏著名',
@@ -16777,8 +16836,8 @@ $zh2HK = array(
 '與著述' => '與著述',
 '與著錄' => '與著錄',
 '舒马赫' => '舒麥加',
-'爱荷华' => '艾奧瓦',
 '愛荷華' => '艾奧瓦',
+'爱荷华' => '艾奧瓦',
 '埃菲尔' => '艾菲爾',
 '帕塔亚' => '芭達亞',
 '花盆里' => '花盆裏',
@@ -16794,25 +16853,25 @@ $zh2HK = array(
 '苦著錄' => '苦著錄',
 '苦里' => '苦裏',
 '英占' => '英佔',
-'大英國協' => '英聯邦',
 '共和联邦' => '英聯邦',
+'大英國協' => '英聯邦',
 '草丛里' => '草叢裏',
 '霍爾斯坦' => '荷爾斯泰因',
-'好萊塢' => '荷里活',
 '好莱坞' => '荷里活',
+'好萊塢' => '荷里活',
 '庄里' => '莊裏',
 '莫三比克' => '莫桑比克',
-'瓦倫西亞' => '華倫西亞',
 '巴伦西亚' => '華倫西亞',
 '巴倫西亞' => '華倫西亞',
+'瓦倫西亞' => '華倫西亞',
 '瓦文萨' => '華里沙',
 '華勒沙' => '華里沙',
 '菲利普亲王' => '菲臘親王',
 '菲利普親王' => '菲臘親王',
 '賴索托' => '萊索托',
 '马恩岛' => '萌島',
-'马自达' => '萬事得',
 '馬自達' => '萬事得',
+'马自达' => '萬事得',
 '万历朝鲜战争' => '萬曆朝鮮戰爭',
 '落著' => '落着',
 '落著作' => '落著作',
@@ -16825,8 +16884,8 @@ $zh2HK = array(
 '葉爾欽' => '葉利欽',
 '葡占' => '葡佔',
 '葫芦里卖甚么药' => '葫蘆裏賣甚麼藥',
-'蒙特婁' => '蒙特利爾',
 '滿地可' => '蒙特利爾',
+'蒙特婁' => '蒙特利爾',
 '蒙著' => '蒙着',
 '蒙著作' => '蒙著作',
 '蒙著名' => '蒙著名',
@@ -16836,6 +16895,9 @@ $zh2HK = array(
 '蒙著述' => '蒙著述',
 '蒙著錄' => '蒙著錄',
 '蓋著' => '蓋着',
+'蓋著作' => '蓋著作',
+'蓋著名' => '蓋著名',
+'蓋著稱' => '蓋著稱',
 '肖斯塔科维奇' => '蕭士達高維契',
 '蕭士塔高維奇' => '蕭士達高維契',
 '肖邦' => '蕭邦',
@@ -16870,6 +16932,7 @@ $zh2HK = array(
 '蜜里调油' => '蜜裏調油',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'行家里手' => '行家裏手',
 '首席执行官' => '行政總裁',
 '行著' => '行着',
 '行著作' => '行著作',
@@ -16903,7 +16966,6 @@ $zh2HK = array(
 '里带' => '裏帶',
 '里弦' => '裏弦',
 '里应外合' => '裏應外合',
-'里手' => '裏手',
 '里海' => '裏海',
 '里脊' => '裏脊',
 '里衣' => '裏衣',
@@ -16933,11 +16995,12 @@ $zh2HK = array(
 '裹著錄' => '裹著錄',
 '衬里' => '襯裏',
 '西占' => '西佔',
-'塞维利亚' => '西維爾',
 '塞維亞' => '西維爾',
+'塞维利亚' => '西維爾',
 '要占' => '要佔',
 '要占卜' => '要占卜',
 '覆著' => '覆着',
+'覆蓋著' => '覆蓋着',
 '見著' => '見着',
 '見著作' => '見著作',
 '見著名' => '見著名',
@@ -16946,9 +17009,12 @@ $zh2HK = array(
 '見著者' => '見著者',
 '見著述' => '見著述',
 '見著錄' => '見著錄',
+'視著' => '視着',
+'視著名' => '視著名',
 '角落里' => '角落裏',
 '分辨率' => '解像度',
 '解析度' => '解像度',
+'言里' => '言裏',
 '計畫' => '計劃',
 '記著' => '記着',
 '記著作' => '記著作',
@@ -17022,6 +17088,7 @@ $zh2HK = array(
 '貞著述' => '貞著述',
 '貞著錄' => '貞著錄',
 '負著' => '負着',
+'貢寮國' => '貢寮國',
 '買凶' => '買兇',
 '費占' => '費佔',
 '费占' => '費佔',
@@ -17242,11 +17309,10 @@ $zh2HK = array(
 '遠著者' => '遠著者',
 '遠著述' => '遠著述',
 '遠著錄' => '遠著錄',
-'還占' => '還佔',
 '还占' => '還佔',
+'還占' => '還佔',
 '邋里邋遢' => '邋裏邋遢',
 '那里' => '那裏',
-'奥斯曼' => '鄂圖曼',
 '配合著' => '配合着',
 '配合著名' => '配合著名',
 '配图里' => '配圖裏',
@@ -17267,14 +17333,14 @@ $zh2HK = array(
 '醜著者' => '醜著者',
 '醜著述' => '醜著述',
 '醜著錄' => '醜著錄',
-'醯壺' => '醯壺',
 '醯壶' => '醯壺',
+'醯壺' => '醯壺',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
 '醯酱' => '醯醬',
 '醯醬' => '醯醬',
-'醯鸡' => '醯雞',
 '醯雞' => '醯雞',
+'醯鸡' => '醯雞',
 '釀著' => '釀着',
 '釀著作' => '釀著作',
 '釀著名' => '釀著名',
@@ -17387,8 +17453,8 @@ $zh2HK = array(
 '隨著者' => '隨著者',
 '隨著述' => '隨著述',
 '隨著錄' => '隨著錄',
-'隱占' => '隱佔',
 '隐占' => '隱佔',
+'隱占' => '隱佔',
 '雅爾達' => '雅爾塔',
 '雅著' => '雅着',
 '雅穆索戈' => '雅穆蘇克雷',
@@ -17413,10 +17479,11 @@ $zh2HK = array(
 '冰淇淋' => '雪糕',
 '冰激凌' => '雪糕',
 '雪里' => '雪裏',
-'萊特灣' => '雷伊泰灣',
 '莱特湾' => '雷伊泰灣',
-'晶體管' => '電晶體',
+'萊特灣' => '雷伊泰灣',
 '晶体管' => '電晶體',
+'晶體管' => '電晶體',
+'电梯里' => '電梯裏',
 '电脑程序' => '電腦程式',
 '计算机程序' => '電腦程式',
 '霄裡' => '霄裡',
@@ -17427,12 +17494,12 @@ $zh2HK = array(
 '靠著' => '靠着',
 '靠著作' => '靠著作',
 '靠著名' => '靠著名',
-'靠著稱' => '靠著稱',
 '靠著称' => '靠著稱',
+'靠著稱' => '靠著稱',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
-'靠著錄' => '靠著錄',
 '靠著录' => '靠著錄',
+'靠著錄' => '靠著錄',
 '鞋里' => '鞋裏',
 '鞭辟入里' => '鞭辟入裏',
 '朝鲜战争' => '韓戰',
@@ -17460,8 +17527,8 @@ $zh2HK = array(
 '順著者' => '順著者',
 '順著述' => '順著述',
 '順著錄' => '順著錄',
-'颁布' => '頒佈',
 '頒布' => '頒佈',
+'颁布' => '頒佈',
 '領著' => '領着',
 '領著作' => '領著作',
 '領著名' => '領著名',
@@ -17485,8 +17552,8 @@ $zh2HK = array(
 '餐台' => '餐枱',
 '馆里' => '館裏',
 '糊口' => '餬口',
-'马里兰' => '馬利蘭',
 '馬里蘭' => '馬利蘭',
+'马里兰' => '馬利蘭',
 '马拉特·萨芬' => '馬拉特·沙芬',
 '馬斯垂克' => '馬斯特里赫特',
 '馬爾地夫' => '馬爾代夫',
@@ -17545,8 +17612,8 @@ $zh2HK = array(
 '鬧著' => '鬧着',
 '牛軋' => '鳥結',
 '牛轧' => '鳥結',
-'鸠占' => '鳩佔',
 '鳩占' => '鳩佔',
+'鸠占' => '鳩佔',
 '麗著' => '麗着',
 '麗著作' => '麗著作',
 '麗著名' => '麗著名',
@@ -17566,21 +17633,21 @@ $zh2HK = array(
 '里氏3' => '黎克特制3',
 '芮氏4' => '黎克特制4',
 '里氏4' => '黎克特制4',
-'里氏5' => '黎克特制5',
 '芮氏5' => '黎克特制5',
-'里氏6' => '黎克特制6',
+'里氏5' => '黎克特制5',
 '芮氏6' => '黎克特制6',
-'里氏7' => '黎克特制7',
+'里氏6' => '黎克特制6',
 '芮氏7' => '黎克特制7',
-'里氏8' => '黎克特制8',
+'里氏7' => '黎克特制7',
 '芮氏8' => '黎克特制8',
+'里氏8' => '黎克特制8',
 '芮氏9' => '黎克特制9',
 '里氏9' => '黎克特制9',
 '芮氏地震規模' => '黎克特制地震震級',
 '里氏地震规模' => '黎克特制地震震級',
-'里氏震级' => '黎克特制震級',
 '芮氏規模' => '黎克特制震級',
 '里氏规模' => '黎克特制震級',
+'里氏震级' => '黎克特制震級',
 '黏著' => '黏着',
 '黏著作' => '黏著作',
 '黏著名' => '黏著名',
@@ -17614,11 +17681,11 @@ $zh2CN = array(
 '下著' => '下着',
 '下著作' => '下著作',
 '下著名' => '下著名',
-'下著錄' => '下著录',
 '下著录' => '下著录',
+'下著錄' => '下著录',
 '下著有' => '下著有',
-'下著稱' => '下著称',
 '下著称' => '下著称',
+'下著稱' => '下著称',
 '下著者' => '下著者',
 '下著述' => '下著述',
 '不著' => '不着',
@@ -17646,8 +17713,8 @@ $zh2CN = array(
 '邱吉爾' => '丘吉尔',
 'C型肝炎' => '丙型肝炎',
 'C肝' => '丙肝',
-'東協' => '东盟',
 '亚细安' => '东盟',
+'東協' => '东盟',
 '臨著' => '临着',
 '臨著書' => '临著书',
 '臨著作' => '临著作',
@@ -17674,7 +17741,6 @@ $zh2CN = array(
 '麗著者' => '丽著者',
 '麗著述' => '丽著述',
 '麼著' => '么着',
-'烏茲別克' => '乌兹别克斯坦',
 '樂著' => '乐着',
 '樂著書' => '乐著书',
 '樂著作' => '乐著作',
@@ -17683,6 +17749,7 @@ $zh2CN = array(
 '樂著稱' => '乐著称',
 '樂著者' => '乐著者',
 '樂著述' => '乐著述',
+'賈伯斯' => '乔布斯',
 '喬治·歐威爾' => '乔治·奥威尔',
 '乘著' => '乘着',
 '乘著書' => '乘著书',
@@ -17709,8 +17776,8 @@ $zh2CN = array(
 '二極體' => '二极管',
 '二進位制' => '二进位制',
 '二進位' => '二进制',
-'網際網路' => '互联网',
 '網際網絡' => '互联网',
+'網際網路' => '互联网',
 '亞歷山卓' => '亚历山大',
 '雅穆索戈' => '亚穆苏克罗',
 '互動式' => '交互式',
@@ -17749,6 +17816,7 @@ $zh2CN = array(
 '伊利諾伊' => '伊利诺伊',
 '伊斯蘭瑪巴德' => '伊斯兰堡',
 '伊斯坦堡' => '伊斯坦布尔',
+'伏著' => '伏着',
 '優先順序' => '优先级',
 '傳著' => '传着',
 '傳著書' => '传著书',
@@ -17769,7 +17837,6 @@ $zh2CN = array(
 '伴著者' => '伴著者',
 '伴著述' => '伴著述',
 '點陣圖' => '位图',
-'IP' => '位址',
 '低著' => '低着',
 '低著書' => '低著书',
 '低著作' => '低著作',
@@ -17817,8 +17884,8 @@ $zh2CN = array(
 '信著稱' => '信著称',
 '信著者' => '信著者',
 '信著述' => '信著述',
-'掌上壓' => '俯卧撑',
 '伏地挺身' => '俯卧撑',
+'掌上壓' => '俯卧撑',
 '倒帳' => '倒账',
 '候著' => '候着',
 '候著書' => '候著书',
@@ -17828,8 +17895,8 @@ $zh2CN = array(
 '候著稱' => '候著称',
 '候著者' => '候著者',
 '候著述' => '候著述',
-'藉著' => '借着',
 '借著' => '借着',
+'藉著' => '借着',
 '借著書' => '借著书',
 '借著作' => '借著作',
 '借著名' => '借著名',
@@ -17943,8 +18010,8 @@ $zh2CN = array(
 '嘉芙蓮' => '凯瑟琳',
 '份內' => '分内',
 '份外' => '分外',
-'解析度' => '分辨率',
 '解像度' => '分辨率',
+'解析度' => '分辨率',
 '份量' => '分量',
 '車諾比' => '切尔诺贝利',
 '劃著' => '划着',
@@ -18016,8 +18083,8 @@ $zh2CN = array(
 '十進位制' => '十进位制',
 '十進位' => '十进制',
 '公升' => '升',
-'單鏡反光機' => '单反相机',
 '單眼相機' => '单反相机',
+'單鏡反光機' => '单反相机',
 '波札那' => '博茨瓦纳',
 '占著' => '占着',
 '占著作' => '占著作',
@@ -18038,12 +18105,12 @@ $zh2CN = array(
 '印著者' => '印著者',
 '印著述' => '印著述',
 '瓜地馬拉' => '危地马拉',
+'厄瓜多' => '厄瓜多尔',
 '厄瓜多尔' => '厄瓜多尔',
 '厄瓜多爾' => '厄瓜多尔',
-'厄瓜多' => '厄瓜多尔',
-'厄立特里亞' => '厄立特里亚',
 '厄利垂亚' => '厄立特里亚',
 '厄利垂亞' => '厄立特里亚',
+'厄立特里亞' => '厄立特里亚',
 '壓著' => '压着',
 '壓著書' => '压著书',
 '壓著作' => '压著作',
@@ -18083,6 +18150,8 @@ $zh2CN = array(
 '變著稱' => '变著称',
 '變著者' => '变著者',
 '變著述' => '变著述',
+'隻字片語' => '只字片语',
+'隻言片語' => '只言片语',
 '唯讀' => '只读',
 '叫著' => '叫着',
 '叫著書' => '叫著书',
@@ -18146,7 +18215,6 @@ $zh2CN = array(
 '味著述' => '味著述',
 '咖哩' => '咖喱',
 '諮' => '咨',
-'哈薩克' => '哈萨克斯坦',
 '響著' => '响着',
 '響著書' => '响著书',
 '響著作' => '响著作',
@@ -18226,10 +18294,9 @@ $zh2CN = array(
 '土魯斯' => '图卢兹',
 '吐瓦魯' => '图瓦卢',
 '原子筆' => '圆珠笔',
-'土庫曼' => '土库曼斯坦',
 '聖露西亞' => '圣卢西亚',
-'聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
+'聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '在著' => '在着',
@@ -18259,14 +18326,12 @@ $zh2CN = array(
 '吉里巴斯' => '基里巴斯',
 '堂姊' => '堂姐',
 '坎培拉' => '堪培拉',
-'塔吉克' => '塔吉克斯坦',
-'塔吉克斯坦' => '塔吉克斯坦',
 '塞爾維亞與蒙特內哥羅' => '塞尔维亚和黑山',
 '塞拉利昂' => '塞拉利昂',
 '塞普勒斯' => '塞浦路斯',
 '賽普勒斯' => '塞浦路斯',
-'西維爾' => '塞维利亚',
 '塞維亞' => '塞维利亚',
+'西維爾' => '塞维利亚',
 '塞席爾' => '塞舌尔',
 '音效卡' => '声卡',
 '備著' => '备着',
@@ -18345,9 +18410,10 @@ $zh2CN = array(
 '定著稱' => '定著称',
 '定著者' => '定著者',
 '定著述' => '定著述',
+'波里活' => '宝莱坞',
 '寬頻' => '宽带',
-'密西根' => '密歇根',
 '密执安' => '密歇根',
+'密西根' => '密歇根',
 '對著' => '对着',
 '對著書' => '对著书',
 '對著作' => '对著作',
@@ -18379,10 +18445,10 @@ $zh2CN = array(
 '展著稱' => '展著称',
 '展著者' => '展著者',
 '展著述' => '展著述',
-'華倫西亞' => '巴伦西亚',
 '瓦倫西亞' => '巴伦西亚',
-'巴塞隆納' => '巴塞罗那',
+'華倫西亞' => '巴伦西亚',
 '巴塞隆拿' => '巴塞罗那',
+'巴塞隆納' => '巴塞罗那',
 '巴斯拉' => '巴士拉',
 '帕邁拉環礁' => '巴尔米拉环礁',
 '巴貝多' => '巴巴多斯',
@@ -18417,6 +18483,8 @@ $zh2CN = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著称',
 '庇護著' => '庇护着',
+'庫德人' => '库尔德人',
+'庫德族' => '库尔德族',
 '應用程式' => '应用程序',
 '應著' => '应着',
 '應著書' => '应著书',
@@ -18663,8 +18731,8 @@ $zh2CN = array(
 '披著稱' => '披著称',
 '披著者' => '披著者',
 '披著述' => '披著述',
-'擡著' => '抬着',
 '抬著' => '抬着',
+'擡著' => '抬着',
 '抬著作' => '抬著作',
 '抬著名' => '抬著名',
 '抬著錄' => '抬著录',
@@ -18847,8 +18915,8 @@ $zh2CN = array(
 '敞著稱' => '敞著称',
 '敞著者' => '敞著者',
 '敞著述' => '敞著述',
-'數碼訊號' => '数字信号',
 '數位訊號' => '数字信号',
+'數碼訊號' => '数字信号',
 '數位技術' => '数字技术',
 '數碼技術' => '数字技术',
 '數位電視' => '数字电视',
@@ -18879,6 +18947,7 @@ $zh2CN = array(
 '斥著稱' => '斥著称',
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
+'史丹福' => '斯坦福',
 '史達林' => '斯大林',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
@@ -19008,6 +19077,8 @@ $zh2CN = array(
 '查維茲' => '查韦斯',
 '標誌著' => '标志着',
 '格瑞那達' => '格林纳达',
+'格林美獎' => '格莱美奖',
+'葛萊美獎' => '格莱美奖',
 '森巴舞' => '桑巴舞',
 '梅赫西迪' => '梅赛德斯',
 '夢著' => '梦着',
@@ -19032,8 +19103,8 @@ $zh2CN = array(
 '庇里牛斯' => '比利牛斯',
 '畢卡索' => '毕加索',
 '茅利塔尼亞' => '毛里塔尼亚',
-'毛里裘斯' => '毛里求斯',
 '模里西斯' => '毛里求斯',
+'毛里裘斯' => '毛里求斯',
 '公厘' => '毫米',
 '公釐' => '毫米',
 '胺基酸' => '氨基酸',
@@ -19057,8 +19128,8 @@ $zh2CN = array(
 '沉著稱' => '沉著称',
 '沉著者' => '沉著者',
 '沉著述' => '沉著述',
-'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙地阿拉伯' => '沙特阿拉伯',
+'沙烏地阿拉伯' => '沙特阿拉伯',
 '沿著' => '沿着',
 '沿著書' => '沿著书',
 '沿著作' => '沿著作',
@@ -19228,8 +19299,8 @@ $zh2CN = array(
 '猜著者' => '猜著者',
 '猜著述' => '猜著述',
 '玩著' => '玩着',
-'萬那杜' => '瓦努阿图',
 '溫納圖' => '瓦努阿图',
+'萬那杜' => '瓦努阿图',
 '華勒沙' => '瓦文萨',
 '華里沙' => '瓦文萨',
 '甜著' => '甜着',
@@ -19287,6 +19358,10 @@ $zh2CN = array(
 '皺著者' => '皱著者',
 '皺著述' => '皱著述',
 '鹽份' => '盐分',
+'蓋著' => '盖着',
+'蓋著作' => '盖著作',
+'蓋著名' => '盖著名',
+'蓋著稱' => '盖著称',
 '盛著' => '盛着',
 '盛著書' => '盛著书',
 '盛著作' => '盛著作',
@@ -19323,8 +19398,8 @@ $zh2CN = array(
 '著絲' => '着丝',
 '著麼' => '着么',
 '著人' => '着人',
-'著甚麽' => '着什么',
 '著什麼' => '着什么',
+'著甚麽' => '着什么',
 '著他' => '着他',
 '著令' => '着令',
 '著位' => '着位',
@@ -19453,8 +19528,8 @@ $zh2CN = array(
 '瞪著稱' => '瞪著称',
 '瞪著者' => '瞪著者',
 '瞪著述' => '瞪著述',
-'智財權' => '知识产权',
 '智慧財產權' => '知识产权',
+'智財權' => '知识产权',
 '知識份子' => '知识分子',
 '什勒斯維希' => '石勒苏益格',
 '矽塵' => '矽尘',
@@ -19482,15 +19557,15 @@ $zh2CN = array(
 '葛摩' => '科摩罗',
 '象牙海岸' => '科特迪瓦',
 '積極份子' => '积极分子',
-'行動電話' => '移动电话',
 '流動電話' => '移动电话',
-'行動網路' => '移动网络',
+'行動電話' => '移动电话',
 '流動網絡' => '移动网络',
+'行動網路' => '移动网络',
 '程式設計師' => '程序员',
 '程式控制' => '程控',
 '空中巴士' => '空中客车',
-'空氣質素' => '空气质量',
 '空氣品質' => '空气质量',
+'空氣質素' => '空气质量',
 '空著' => '空着',
 '空著書' => '空著书',
 '空著作' => '空著作',
@@ -19553,13 +19628,14 @@ $zh2CN = array(
 '糖份' => '糖分',
 '動畫影集' => '系列动画片',
 '繫著' => '系着',
-'索贊尼辛' => '索尔仁尼琴',
 '索忍尼辛' => '索尔仁尼琴',
+'索贊尼辛' => '索尔仁尼琴',
 '蘇辛尼津' => '索尔仁尼琴',
 '索馬利亞' => '索马里',
 '索馬利蘭' => '索马里兰',
 '正體中文' => '繁体中文',
 '強斯頓環礁' => '约翰斯顿岛',
+'縱著' => '纵着',
 '組份' => '组分',
 '經常帳' => '经常账',
 '經濟帳' => '经济账',
@@ -19662,8 +19738,8 @@ $zh2CN = array(
 '藝著者' => '艺著者',
 '藝著述' => '艺著述',
 '愛滋' => '艾滋',
-'晶片' => '芯片',
 '晶元' => '芯片',
+'晶片' => '芯片',
 '蘇利南' => '苏里南',
 '苦著' => '苦着',
 '苦著書' => '苦著书',
@@ -19675,8 +19751,8 @@ $zh2CN = array(
 '苦著述' => '苦著述',
 '英吋' => '英寸',
 '英呎' => '英尺',
-'大英國協' => '英联邦',
 '共和联邦' => '英联邦',
+'大英國協' => '英联邦',
 '士多啤梨' => '草莓',
 '螢光棒' => '荧光棒',
 '螢屏' => '荧屏',
@@ -19684,8 +19760,8 @@ $zh2CN = array(
 '莫三比克' => '莫桑比克',
 '雷伊泰灣' => '莱特湾',
 '賴索托' => '莱索托',
-'穫著' => '获着',
 '獲著' => '获着',
+'穫著' => '获着',
 '獲著書' => '获著书',
 '獲著作' => '获著作',
 '獲著名' => '获著名',
@@ -19712,7 +19788,6 @@ $zh2CN = array(
 '蒙著稱' => '蒙著称',
 '蒙著者' => '蒙著者',
 '蒙著述' => '蒙著述',
-'蓋著' => '蓋着',
 '藍芽' => '蓝牙',
 '薛丁格' => '薛定谔',
 '藏著' => '藏着',
@@ -19765,6 +19840,7 @@ $zh2CN = array(
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '要帳' => '要账',
+'覆蓋著' => '覆盖着',
 '覆著' => '覆着',
 '見著' => '见着',
 '見著書' => '见著书',
@@ -19774,6 +19850,8 @@ $zh2CN = array(
 '見著稱' => '见著称',
 '見著者' => '见著者',
 '見著述' => '见著述',
+'視著' => '视着',
+'視著名' => '视著名',
 '占士邦' => '詹姆斯·邦德',
 '警戒著' => '警戒着',
 '計畫' => '计划',
@@ -19788,7 +19866,6 @@ $zh2CN = array(
 '記著者' => '记著者',
 '記著述' => '记著述',
 '記帳' => '记账',
-'辭彙' => '词汇',
 '片語' => '词组',
 '試著' => '试着',
 '試著書' => '试著书',
@@ -19834,6 +19911,7 @@ $zh2CN = array(
 '貞著者' => '贞著者',
 '貞著述' => '贞著述',
 '負著' => '负着',
+'貢寮國' => '贡寮国',
 '帳上' => '账上',
 '帳冊' => '账册',
 '帳務' => '账务',
@@ -20091,6 +20169,7 @@ $zh2CN = array(
 '鈽' => '钚',
 '鍅' => '钫',
 '狄托' => '铁托',
+'卯足' => '铆足',
 '鋪著' => '铺着',
 '鋪著書' => '铺著书',
 '鋪著作' => '铺著作',
@@ -20106,8 +20185,8 @@ $zh2CN = array(
 '鑀' => '锿',
 '鋂' => '镅',
 '錼' => '镎',
-'孟德爾頌' => '门德尔松',
 '孟德爾遜' => '门德尔松',
+'孟德爾頌' => '门德尔松',
 '快閃記憶體' => '闪存',
 '閉著' => '闭着',
 '閉著書' => '闭著书',
@@ -20117,8 +20196,8 @@ $zh2CN = array(
 '閉著稱' => '闭著称',
 '閉著者' => '闭著者',
 '閉著述' => '闭著述',
-'閒著' => '闲着',
 '閑著' => '闲着',
+'閒著' => '闲着',
 '閑著書' => '闲著书',
 '閑著作' => '闲著作',
 '閑著名' => '闲著名',
@@ -20184,7 +20263,6 @@ $zh2CN = array(
 '雅著稱' => '雅著称',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
-'山葉' => '雅马哈',
 '雷諾瓦' => '雷诺阿',
 '荷姆茲' => '霍尔木兹',
 '非份' => '非分',
@@ -20221,8 +20299,8 @@ $zh2CN = array(
 '領著稱' => '领著称',
 '領著者' => '领著者',
 '領著述' => '领著述',
-'飄著' => '飘着',
 '飃著' => '飘着',
+'飄著' => '飘着',
 '飄著書' => '飘著书',
 '飄著作' => '飘著作',
 '飄著名' => '飘著名',
index 8d11d90..aca4363 100644 (file)
@@ -132,6 +132,8 @@ abstract class Action {
                if ( $actionName === 'historysubmit' ) {
                        if ( $request->getBool( 'revisiondelete' ) ) {
                                $actionName = 'revisiondelete';
+                       } elseif ( $request->getBool( 'editchangetags' ) ) {
+                               $actionName = 'editchangetags';
                        } else {
                                $actionName = 'view';
                        }
index 7189372..83185e4 100644 (file)
@@ -432,8 +432,13 @@ class HistoryPager extends ReverseChronologicalPager {
                        $latest = ( $this->counter == 1 && $this->mIsFirst );
                        $firstInList = $this->counter == 1;
                        $this->counter++;
-                       $s = $this->historyLine( $this->lastRow, $row,
-                               $this->getTitle()->getNotificationTimestamp( $this->getUser() ), $latest, $firstInList );
+
+                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
+                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
+                               : false;
+
+                       $s = $this->historyLine(
+                               $this->lastRow, $row, $notifTimestamp, $latest, $firstInList );
                } else {
                        $s = '';
                }
@@ -443,6 +448,10 @@ class HistoryPager extends ReverseChronologicalPager {
        }
 
        function doBatchLookups() {
+               if ( !Hooks::run( 'PageHistoryPager::doBatchLookups', array( $this, $this->mResult ) ) ) {
+                       return;
+               }
+
                # Do a link batch query
                $this->mResult->seek( 0 );
                $batch = new LinkBatch();
@@ -479,6 +488,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        'id' => 'mw-history-compare' ) ) . "\n";
                $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n";
                $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
+               $s .= Html::hidden( 'type', 'revision' ) . "\n";
 
                // Button container stored in $this->buttons for re-use in getEndBody()
                $this->buttons = '<div>';
@@ -489,8 +499,17 @@ class HistoryPager extends ReverseChronologicalPager {
                        $attrs
                ) . "\n";
 
-               if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
-                       $this->buttons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
+               $user = $this->getUser();
+               $actionButtons = '';
+               if ( $user->isAllowed( 'deleterevision' ) ) {
+                       $actionButtons .= $this->getRevisionButton( 'revisiondelete', 'showhideselectedversions' );
+               }
+               if ( $user->isAllowed( 'changetags' ) ) {
+                       $actionButtons .= $this->getRevisionButton( 'editchangetags', 'history-edit-tags' );
+               }
+               if ( $actionButtons ) {
+                       $this->buttons .= Xml::tags( 'div', array( 'class' =>
+                               'mw-history-revisionactions' ), $actionButtons );
                }
                $this->buttons .= '</div>';
 
@@ -532,8 +551,13 @@ class HistoryPager extends ReverseChronologicalPager {
                                $next = $this->mPastTheEndRow;
                        }
                        $this->counter++;
-                       $s = $this->historyLine( $this->lastRow, $next,
-                               $this->getTitle()->getNotificationTimestamp( $this->getUser() ), $latest, $firstInList );
+
+                       $notifTimestamp = $this->getConfig()->get( 'ShowUpdatedMarker' )
+                               ? $this->getTitle()->getNotificationTimestamp( $this->getUser() )
+                               : false;
+
+                       $s = $this->historyLine(
+                               $this->lastRow, $next, $notifTimestamp, $latest, $firstInList );
                } else {
                        $s = '';
                }
@@ -606,11 +630,15 @@ class HistoryPager extends ReverseChronologicalPager {
 
                $del = '';
                $user = $this->getUser();
-               // Show checkboxes for each revision
-               if ( $user->isAllowed( 'deleterevision' ) ) {
+               $canRevDelete = $user->isAllowed( 'deleterevision' );
+               $canModifyTags = $user->isAllowed( 'changetags' );
+               // Show checkboxes for each revision, to allow for revision deletion and
+               // change tags
+               if ( $canRevDelete || $canModifyTags ) {
                        $this->preventClickjacking();
-                       // If revision was hidden from sysops, disable the checkbox
-                       if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
+                       // If revision was hidden from sysops and we don't need the checkbox
+                       // for anything else, disable it
+                       if ( !$canModifyTags && !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
                                $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
                        // Otherwise, enable the checkbox...
                        } else {
index b5a7391..de4f977 100644 (file)
@@ -373,18 +373,30 @@ class InfoAction extends FormlessAction {
 
                if ( $title->inNamespace( NS_CATEGORY ) ) {
                        $category = Category::newFromTitle( $title );
+
+                       // $allCount is the total number of cat members,
+                       // not the count of how many members are normal pages.
+                       $allCount = (int)$category->getPageCount();
+                       $subcatCount = (int)$category->getSubcatCount();
+                       $fileCount = (int)$category->getFileCount();
+                       $pagesCount = $allCount - $subcatCount - $fileCount;
+
                        $pageInfo['category-info'] = array(
+                               array(
+                                       $this->msg( 'pageinfo-category-total' ),
+                                       $lang->formatNum( $allCount )
+                               ),
                                array(
                                        $this->msg( 'pageinfo-category-pages' ),
-                                       $lang->formatNum( $category->getPageCount() )
+                                       $lang->formatNum( $pagesCount )
                                ),
                                array(
                                        $this->msg( 'pageinfo-category-subcats' ),
-                                       $lang->formatNum( $category->getSubcatCount() )
+                                       $lang->formatNum( $subcatCount )
                                ),
                                array(
                                        $this->msg( 'pageinfo-category-files' ),
-                                       $lang->formatNum( $category->getFileCount() )
+                                       $lang->formatNum( $fileCount )
                                )
                        );
                }
@@ -434,6 +446,9 @@ class InfoAction extends FormlessAction {
                                        $message = $message->escaped();
                                }
                        }
+                       $expiry = $title->getRestrictionExpiry( $restrictionType );
+                       $formattedexpiry = $this->msg( 'parentheses', $this->getLanguage()->formatExpiry( $expiry ) )->escaped();
+                       $message .= $this->msg( 'word-separator' )->escaped() . $formattedexpiry;
 
                        // Messages: restriction-edit, restriction-move, restriction-create,
                        // restriction-upload
index b6eeb7b..dbcb848 100644 (file)
  * An action that just pass the request to Special:RevisionDelete
  *
  * @ingroup Actions
+ * @deprecated since 1.25 This class has been replaced by SpecialPageAction, but
+ * you really shouldn't have been using it outside core in the first place
  */
 class RevisiondeleteAction extends FormlessAction {
+       public function __construct( Page $page, IContextSource $context = null ) {
+               wfDeprecated( 'RevisiondeleteAction class', '1.25' );
+               parent::__construct( $page, $context );
+       }
 
        public function getName() {
                return 'revisiondelete';
diff --git a/includes/actions/SpecialPageAction.php b/includes/actions/SpecialPageAction.php
new file mode 100644 (file)
index 0000000..9b72163
--- /dev/null
@@ -0,0 +1,79 @@
+<?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
+ *
+ * @file
+ * @ingroup Actions
+ */
+
+/**
+ * An action that just passes the request to the relevant special page
+ *
+ * @ingroup Actions
+ * @since 1.25
+ */
+class SpecialPageAction extends FormlessAction {
+
+       /**
+        * @var array A mapping of action names to special page names.
+        */
+       public static $actionToSpecialPageMapping = array(
+               'revisiondelete' => 'Revisiondelete',
+               'editchangetags' => 'EditTags',
+       );
+
+       public function getName() {
+               $request = $this->getRequest();
+               $actionName = $request->getVal( 'action', 'view' );
+               // TODO: Shouldn't need to copy-paste this code from Action::getActionName!
+               if ( $actionName === 'historysubmit' ) {
+                       if ( $request->getBool( 'revisiondelete' ) ) {
+                               $actionName = 'revisiondelete';
+                       } elseif ( $request->getBool( 'editchangetags' ) ) {
+                               $actionName = 'editchangetags';
+                       }
+               }
+
+               if ( isset( self::$actionToSpecialPageMapping[$actionName] ) ) {
+                       return $actionName;
+               }
+               return 'nosuchaction';
+       }
+
+       public function requiresUnblock() {
+               return false;
+       }
+
+       public function getDescription() {
+               return '';
+       }
+
+       public function onView() {
+               return '';
+       }
+
+       public function show() {
+               $action = self::getName();
+               if ( $action === 'nosuchaction' ) {
+                       throw new ErrorPageError( $this->msg( 'nosuchaction' ), $this->msg( 'nosuchactiontext' ) );
+               }
+
+               // map actions to (whitelisted) special pages
+               $special = SpecialPageFactory::getPage( self::$actionToSpecialPageMapping[$action] );
+               $special->setContext( $this->getContext() );
+               $special->getContext()->setTitle( $special->getPageTitle() );
+               $special->run( '' );
+       }
+}
index 74e51c8..2a449df 100644 (file)
@@ -98,12 +98,17 @@ abstract class ApiBase extends ContextSource {
         */
        const GET_VALUES_FOR_HELP = 1;
 
+       /** @var array Maps extension paths to info arrays */
+       private static $extensionInfo = null;
+
        /** @var ApiMain */
        private $mMainModule;
        /** @var string */
        private $mModuleName, $mModulePrefix;
        private $mSlaveDB = null;
        private $mParamCache = array();
+       /** @var array|null|bool */
+       private $mModuleSource = false;
 
        /**
         * @param ApiMain $mainModule
@@ -467,11 +472,17 @@ abstract class ApiBase extends ContextSource {
        }
 
        /**
-        * Get the result data array (read-only)
-        * @return array
+        * Get the error formatter
+        * @return ApiErrorFormatter
         */
-       public function getResultData() {
-               return $this->getResult()->getData();
+       public function getErrorFormatter() {
+               // Main module has getErrorFormatter() method overridden
+               // Safety - avoid infinite loop:
+               if ( $this->isMain() ) {
+                       ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
+               }
+
+               return $this->getMain()->getErrorFormatter();
        }
 
        /**
@@ -486,6 +497,34 @@ abstract class ApiBase extends ContextSource {
                return $this->mSlaveDB;
        }
 
+       /**
+        * Get the continuation manager
+        * @return ApiContinuationManager|null
+        */
+       public function getContinuationManager() {
+               // Main module has getContinuationManager() method overridden
+               // Safety - avoid infinite loop:
+               if ( $this->isMain() ) {
+                       ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
+               }
+
+               return $this->getMain()->getContinuationManager();
+       }
+
+       /**
+        * Set the continuation manager
+        * @param ApiContinuationManager|null
+        */
+       public function setContinuationManager( $manager ) {
+               // Main module has setContinuationManager() method overridden
+               // Safety - avoid infinite loop:
+               if ( $this->isMain() ) {
+                       ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
+               }
+
+               $this->getMain()->setContinuationManager( $manager );
+       }
+
        /**@}*/
 
        /************************************************************************//**
@@ -865,7 +904,7 @@ abstract class ApiBase extends ContextSource {
                                                        $value = $this->getMain()->canApiHighLimits()
                                                                ? $paramSettings[self::PARAM_MAX2]
                                                                : $paramSettings[self::PARAM_MAX];
-                                                       $this->getResult()->setParsedLimit( $this->getModuleName(), $value );
+                                                       $this->getResult()->addParsedLimit( $this->getModuleName(), $value );
                                                } else {
                                                        $value = intval( $value );
                                                        $this->validateLimit(
@@ -1241,28 +1280,8 @@ abstract class ApiBase extends ContextSource {
         * @param string $warning Warning message
         */
        public function setWarning( $warning ) {
-               $result = $this->getResult();
-               $data = $result->getData();
-               $moduleName = $this->getModuleName();
-               if ( isset( $data['warnings'][$moduleName] ) ) {
-                       // Don't add duplicate warnings
-                       $oldWarning = $data['warnings'][$moduleName]['*'];
-                       $warnPos = strpos( $oldWarning, $warning );
-                       // If $warning was found in $oldWarning, check if it starts at 0 or after "\n"
-                       if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
-                               // Check if $warning is followed by "\n" or the end of the $oldWarning
-                               $warnPos += strlen( $warning );
-                               if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
-                                       return;
-                               }
-                       }
-                       // If there is a warning already, append it to the existing one
-                       $warning = "$oldWarning\n$warning";
-               }
-               $msg = array();
-               ApiResult::setContent( $msg, $warning );
-               $result->addValue( 'warnings', $moduleName,
-                       $msg, ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+               $msg = new ApiRawMessage( $warning, 'warning' );
+               $this->getErrorFormatter()->addWarning( $this->getModuleName(), $msg );
        }
 
        /**
@@ -1663,6 +1682,10 @@ abstract class ApiBase extends ContextSource {
                        'code' => 'nosuchrcid',
                        'info' => "There is no change with rcid \"\$1\""
                ),
+               'nosuchlogid' => array(
+                       'code' => 'nosuchlogid',
+                       'info' => "There is no log entry with ID \"\$1\""
+               ),
                'protect-invalidaction' => array(
                        'code' => 'protect-invalidaction',
                        'info' => "Invalid protection type \"\$1\""
@@ -2184,6 +2207,93 @@ abstract class ApiBase extends ContextSource {
                return $flags;
        }
 
+       /**
+        * Returns information about the source of this module, if known
+        *
+        * Returned array is an array with the following keys:
+        * - path: Install path
+        * - name: Extension name, or "MediaWiki" for core
+        * - namemsg: (optional) i18n message key for a display name
+        * - license-name: (optional) Name of license
+        *
+        * @return array|null
+        */
+       protected function getModuleSourceInfo() {
+               global $IP;
+
+               if ( $this->mModuleSource !== false ) {
+                       return $this->mModuleSource;
+               }
+
+               // First, try to find where the module comes from...
+               $rClass = new ReflectionClass( $this );
+               $path = $rClass->getFileName();
+               if ( !$path ) {
+                       // No path known?
+                       $this->mModuleSource = null;
+                       return null;
+               }
+               $path = realpath( $path ) ?: $path;
+
+               // Build map of extension directories to extension info
+               if ( self::$extensionInfo === null ) {
+                       self::$extensionInfo = array(
+                               realpath( __DIR__ ) ?: __DIR__ => array(
+                                       'path' => $IP,
+                                       'name' => 'MediaWiki',
+                                       'license-name' => 'GPL-2.0+',
+                               ),
+                               realpath( "$IP/extensions" ) ?: "$IP/extensions" => null,
+                       );
+                       $keep = array(
+                               'path' => null,
+                               'name' => null,
+                               'namemsg' => null,
+                               'license-name' => null,
+                       );
+                       foreach ( $this->getConfig()->get( 'ExtensionCredits' ) as $group ) {
+                               foreach ( $group as $ext ) {
+                                       if ( !isset( $ext['path'] ) || !isset( $ext['name'] ) ) {
+                                               // This shouldn't happen, but does anyway.
+                                               continue;
+                                       }
+
+                                       $extpath = $ext['path'];
+                                       if ( !is_dir( $extpath ) ) {
+                                               $extpath = dirname( $extpath );
+                                       }
+                                       self::$extensionInfo[realpath( $extpath ) ?: $extpath] =
+                                               array_intersect_key( $ext, $keep );
+                               }
+                       }
+                       foreach ( ExtensionRegistry::getInstance()->getAllThings() as $ext ) {
+                               $extpath = $ext['path'];
+                               if ( !is_dir( $extpath ) ) {
+                                       $extpath = dirname( $extpath );
+                               }
+                               self::$extensionInfo[realpath( $extpath ) ?: $extpath] =
+                                       array_intersect_key( $ext, $keep );
+                       }
+               }
+
+               // Now traverse parent directories until we find a match or run out of
+               // parents.
+               do {
+                       if ( array_key_exists( $path, self::$extensionInfo ) ) {
+                               // Found it!
+                               $this->mModuleSource = self::$extensionInfo[$path];
+                               return $this->mModuleSource;
+                       }
+
+                       $oldpath = $path;
+                       $path = dirname( $path );
+               } while ( $path !== $oldpath );
+
+               // No idea what extension this might be.
+               $this->mModuleSource = null;
+               return null;
+       }
+
        /**
         * Called from ApiHelp before the pieces are joined together and returned.
         *
@@ -2713,6 +2823,16 @@ abstract class ApiBase extends ContextSource {
                return 0;
        }
 
+       /**
+        * Get the result data array (read-only)
+        * @deprecated since 1.25, use $this->getResult() methods instead
+        * @return array
+        */
+       public function getResultData() {
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getResult()->getData();
+       }
+
        /**@}*/
 }
 
index f03cef2..26b5f0e 100644 (file)
@@ -39,6 +39,8 @@ class ApiBlock extends ApiBase {
         * of success. If it fails, the result will specify the nature of the error.
         */
        public function execute() {
+               global $wgContLang;
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
@@ -100,11 +102,9 @@ class ApiBlock extends ApiBase {
                $res['user'] = $params['user'];
                $res['userID'] = $target instanceof User ? $target->getId() : 0;
 
-               $block = Block::newFromTarget( $target );
+               $block = Block::newFromTarget( $target, null, true );
                if ( $block instanceof Block ) {
-                       $res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
-                               ? 'infinite'
-                               : wfTimestamp( TS_ISO_8601, $block->mExpiry );
+                       $res['expiry'] = $wgContLang->formatExpiry( $block->mExpiry, TS_ISO_8601, 'infinite' );
                        $res['id'] = $block->getId();
                } else {
                        # should be unreachable
@@ -113,27 +113,13 @@ class ApiBlock extends ApiBase {
                }
 
                $res['reason'] = $params['reason'];
-               if ( $params['anononly'] ) {
-                       $res['anononly'] = '';
-               }
-               if ( $params['nocreate'] ) {
-                       $res['nocreate'] = '';
-               }
-               if ( $params['autoblock'] ) {
-                       $res['autoblock'] = '';
-               }
-               if ( $params['noemail'] ) {
-                       $res['noemail'] = '';
-               }
-               if ( $params['hidename'] ) {
-                       $res['hidename'] = '';
-               }
-               if ( $params['allowusertalk'] ) {
-                       $res['allowusertalk'] = '';
-               }
-               if ( $params['watchuser'] ) {
-                       $res['watchuser'] = '';
-               }
+               $res['anononly'] = $params['anononly'];
+               $res['nocreate'] = $params['nocreate'];
+               $res['autoblock'] = $params['autoblock'];
+               $res['noemail'] = $params['noemail'];
+               $res['hidename'] = $params['hidename'];
+               $res['allowusertalk'] = $params['allowusertalk'];
+               $res['watchuser'] = $params['watchuser'];
 
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
        }
index ce256a6..2300912 100644 (file)
@@ -72,7 +72,7 @@ class ApiComparePages extends ApiBase {
                        );
                }
 
-               ApiResult::setContent( $vals, $difftext );
+               ApiResult::setContentValue( $vals, 'body', $difftext );
 
                $this->getResult()->addValue( null, $this->getModuleName(), $vals );
        }
diff --git a/includes/api/ApiContinuationManager.php b/includes/api/ApiContinuationManager.php
new file mode 100644 (file)
index 0000000..354f4e7
--- /dev/null
@@ -0,0 +1,238 @@
+<?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
+ */
+
+/**
+ * This manages continuation state.
+ * @since 1.25 this is no longer a subclass of ApiBase
+ * @ingroup API
+ */
+class ApiContinuationManager {
+       private $source;
+
+       private $allModules = array();
+       private $generatedModules = array();
+
+       private $continuationData = array();
+       private $generatorContinuationData = array();
+
+       private $generatorParams = array();
+       private $generatorDone = false;
+
+       /**
+        * @param ApiBase $module Module starting the continuation
+        * @param ApiBase[] $allModules Contains ApiBase instances that will be executed
+        * @param array $generatedModules Names of modules that depend on the generator
+        */
+       public function __construct(
+               ApiBase $module, array $allModules = array(), array $generatedModules = array()
+       ) {
+               $this->source = get_class( $module );
+               $request = $module->getRequest();
+
+               $this->generatedModules = $generatedModules
+                       ? array_combine( $generatedModules, $generatedModules )
+                       : array();
+
+               $skip = array();
+               $continue = $request->getVal( 'continue', '' );
+               if ( $continue !== '' ) {
+                       $continue = explode( '||', $continue );
+                       if ( count( $continue ) !== 2 ) {
+                               throw new UsageException(
+                                       'Invalid continue param. You should pass the original value returned by the previous query',
+                                       'badcontinue'
+                               );
+                       }
+                       $this->generatorDone = ( $continue[0] === '-' );
+                       $skip = explode( '|', $continue[1] );
+                       if ( !$this->generatorDone ) {
+                               $params = explode( '|', $continue[0] );
+                               if ( $params ) {
+                                       $this->generatorParams = array_intersect_key(
+                                               $request->getValues(),
+                                               array_flip( $params )
+                                       );
+                               }
+                       } else {
+                               // When the generator is complete, don't run any modules that
+                               // depend on it.
+                               $skip += $this->generatedModules;
+                       }
+               }
+
+               foreach ( $allModules as $module ) {
+                       $name = $module->getModuleName();
+                       if ( in_array( $name, $skip, true ) ) {
+                               $this->allModules[$name] = false;
+                               // Prevent spurious "unused parameter" warnings
+                               $module->extractRequestParams();
+                       } else {
+                               $this->allModules[$name] = $module;
+                       }
+               }
+       }
+
+       /**
+        * Get the class that created this manager
+        * @return string
+        */
+       public function getSource() {
+               return $this->source;
+       }
+
+       /**
+        * Is the generator done?
+        * @return bool
+        */
+       public function isGeneratorDone() {
+               return $this->generatorDone;
+       }
+
+       /**
+        * Get the list of modules that should actually be run
+        * @return ApiBase[]
+        */
+       public function getRunModules() {
+               return array_values( array_filter( $this->allModules ) );
+       }
+
+       /**
+        * Set the continuation parameter for a module
+        * @param ApiBase $module
+        * @param string $paramName
+        * @param string|array $paramValue
+        * @throws UnexpectedValueException
+        */
+       public function addContinueParam( ApiBase $module, $paramName, $paramValue ) {
+               $name = $module->getModuleName();
+               if ( !isset( $this->allModules[$name] ) ) {
+                       throw new UnexpectedValueException(
+                               "Module '$name' called " . __METHOD__ .
+                                       ' but was not passed to ' . __CLASS__ . '::__construct'
+                       );
+               }
+               if ( !$this->allModules[$name] ) {
+                       throw new UnexpectedValueException(
+                               "Module '$name' was not supposed to have been executed, but " .
+                                       'it was executed anyway'
+                       );
+               }
+               $paramName = $module->encodeParamName( $paramName );
+               if ( is_array( $paramValue ) ) {
+                       $paramValue = join( '|', $paramValue );
+               }
+               $this->continuationData[$name][$paramName] = $paramValue;
+       }
+
+       /**
+        * Set the continuation parameter for the generator module
+        * @param ApiBase $module
+        * @param string $paramName
+        * @param string|array $paramValue
+        */
+       public function addGeneratorContinueParam( ApiBase $module, $paramName, $paramValue ) {
+               $name = $module->getModuleName();
+               $paramName = $module->encodeParamName( $paramName );
+               if ( is_array( $paramValue ) ) {
+                       $paramValue = join( '|', $paramValue );
+               }
+               $this->generatorContinuationData[$name][$paramName] = $paramValue;
+       }
+
+       /**
+        * Fetch raw continuation data
+        * @return array
+        */
+       public function getRawContinuation() {
+               return array_merge_recursive( $this->continuationData, $this->generatorContinuationData );
+       }
+
+       /**
+        * Fetch continuation result data
+        * @return array Array( (array)$data, (bool)$batchcomplete )
+        */
+       public function getContinuation() {
+               $data = array();
+               $batchcomplete = false;
+
+               $finishedModules = array_diff(
+                       array_keys( $this->allModules ),
+                       array_keys( $this->continuationData )
+               );
+
+               // First, grab the non-generator-using continuation data
+               $continuationData = array_diff_key( $this->continuationData, $this->generatedModules );
+               foreach ( $continuationData as $module => $kvp ) {
+                       $data += $kvp;
+               }
+
+               // Next, handle the generator-using continuation data
+               $continuationData = array_intersect_key( $this->continuationData, $this->generatedModules );
+               if ( $continuationData ) {
+                       // Some modules are unfinished: include those params, and copy
+                       // the generator params.
+                       foreach ( $continuationData as $module => $kvp ) {
+                               $data += $kvp;
+                       }
+                       $data += $this->generatorParams;
+                       $generatorKeys = join( '|', array_keys( $this->generatorParams ) );
+               } elseif ( $this->generatorContinuationData ) {
+                       // All the generator-using modules are complete, but the
+                       // generator isn't. Continue the generator and restart the
+                       // generator-using modules
+                       $generatorParams = array();
+                       foreach ( $this->generatorContinuationData as $kvp ) {
+                               $generatorParams += $kvp;
+                       }
+                       $data += $generatorParams;
+                       $finishedModules = array_diff( $finishedModules, $this->generatedModules );
+                       $generatorKeys = join( '|', array_keys( $generatorParams ) );
+                       $batchcomplete = true;
+               } else {
+                       // Generator and prop modules are all done. Mark it so.
+                       $generatorKeys = '-';
+                       $batchcomplete = true;
+               }
+
+               // Set 'continue' if any continuation data is set or if the generator
+               // still needs to run
+               if ( $data || $generatorKeys !== '-' ) {
+                       $data['continue'] = $generatorKeys . '||' . join( '|', $finishedModules );
+               }
+
+               return array( $data, $batchcomplete );
+       }
+
+       /**
+        * Store the continuation data into the result
+        * @param ApiResult $result
+        */
+       public function setContinuationIntoResult( ApiResult $result ) {
+               list( $data, $batchcomplete ) = $this->getContinuation();
+               if ( $data ) {
+                       $result->addValue( null, 'continue', $data,
+                               ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+               }
+               if ( $batchcomplete ) {
+                       $result->addValue( null, 'batchcomplete', true,
+                               ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+               }
+       }
+}
index b56a244..455540b 100644 (file)
@@ -152,9 +152,9 @@ class ApiCreateAccount extends ApiBase {
                        $warnings = $status->getErrorsByType( 'warning' );
                        if ( $warnings ) {
                                foreach ( $warnings as &$warning ) {
-                                       $apiResult->setIndexedTagName( $warning['params'], 'param' );
+                                       ApiResult::setIndexedTagName( $warning['params'], 'param' );
                                }
-                               $apiResult->setIndexedTagName( $warnings, 'warning' );
+                               ApiResult::setIndexedTagName( $warnings, 'warning' );
                                $result['warnings'] = $warnings;
                        }
                } else {
index f697b6f..0dee147 100644 (file)
@@ -28,7 +28,9 @@
  * A module that allows for editing and creating pages.
  *
  * Currently, this wraps around the EditPage class in an ugly way,
- * EditPage.php should be rewritten to provide a cleaner interface
+ * EditPage.php should be rewritten to provide a cleaner interface,
+ * see T20654 if you're inspired to fix this.
+ *
  * @ingroup API
  */
 class ApiEditPage extends ApiBase {
@@ -80,7 +82,7 @@ class ApiEditPage extends ApiBase {
                                        $titleObj = $newTitle;
                                }
 
-                               $apiResult->setIndexedTagName( $redirValues, 'r' );
+                               ApiResult::setIndexedTagName( $redirValues, 'r' );
                                $apiResult->addValue( null, 'redirects', $redirValues );
 
                                // Since the page changed, update $pageObj
@@ -94,8 +96,12 @@ class ApiEditPage extends ApiBase {
                        $contentHandler = ContentHandler::getForModelID( $params['contentmodel'] );
                }
 
-               // @todo Ask handler whether direct editing is supported at all! make
-               // allowFlatEdit() method or some such
+               if ( $contentHandler->supportsDirectApiEditing() === false ) {
+                       $this->dieUsage(
+                               'Direct editing via API is not supported for this content type.',
+                               'no-direct-editing'
+                       );
+               }
 
                if ( !isset( $params['contentformat'] ) || $params['contentformat'] == '' ) {
                        $params['contentformat'] = $contentHandler->getDefaultFormat();
@@ -329,6 +335,15 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpWatchthis'] = '';
                }
 
+               // Apply change tags
+               if ( count( $params['tags'] ) ) {
+                       if ( $user->isAllowed( 'applychangetags' ) ) {
+                               $requestArray['wpChangeTags'] = implode( ',', $params['tags'] );
+                       } else {
+                               $this->dieUsage( 'You don\'t have permission to set change tags.', 'taggingnotallowed' );
+                       }
+               }
+
                // Pass through anything else we might have been given, to support extensions
                // This is kind of a hack but it's the best we can do to make extensions work
                $requestArray += $this->getRequest()->getValues();
@@ -351,9 +366,7 @@ class ApiEditPage extends ApiBase {
 
                $ep = new EditPage( $articleObject );
 
-               // allow editing of non-textual content.
-               $ep->allowNonTextContent = true;
-
+               $ep->setApiEditOverride( true );
                $ep->setContextTitle( $titleObj );
                $ep->importFormData( $req );
                $content = $ep->textbox1;
@@ -473,8 +486,11 @@ class ApiEditPage extends ApiBase {
                        case EditPage::AS_TEXTBOX_EMPTY:
                                $this->dieUsageMsg( 'emptynewsection' );
 
+                       case EditPage::AS_CHANGE_TAG_ERROR:
+                               $this->dieStatus( $status );
+
                        case EditPage::AS_SUCCESS_NEW_ARTICLE:
-                               $r['new'] = '';
+                               $r['new'] = true;
                                // fall-through
 
                        case EditPage::AS_SUCCESS_UPDATE:
@@ -484,7 +500,7 @@ class ApiEditPage extends ApiBase {
                                $r['contentmodel'] = $titleObj->getContentModel();
                                $newRevId = $articleObject->getLatest();
                                if ( $newRevId == $oldRevId ) {
-                                       $r['nochange'] = '';
+                                       $r['nochange'] = true;
                                } else {
                                        $r['oldrevid'] = intval( $oldRevId );
                                        $r['newrevid'] = intval( $newRevId );
@@ -529,6 +545,10 @@ class ApiEditPage extends ApiBase {
                        ),
                        'text' => null,
                        'summary' => null,
+                       'tags' => array(
+                               ApiBase::PARAM_TYPE => ChangeTags::listExplicitlyDefinedTags(),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'minor' => false,
                        'notminor' => false,
                        'bot' => false,
diff --git a/includes/api/ApiErrorFormatter.php b/includes/api/ApiErrorFormatter.php
new file mode 100644 (file)
index 0000000..9414329
--- /dev/null
@@ -0,0 +1,303 @@
+<?php
+/**
+ * This file contains the ApiErrorFormatter definition, plus implementations of
+ * specific formatters.
+ *
+ * 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
+ */
+
+/**
+ * Formats errors and warnings for the API, and add them to the associated
+ * ApiResult.
+ * @since 1.25
+ * @ingroup API
+ */
+class ApiErrorFormatter {
+       /** @var Title Dummy title to silence warnings from MessageCache::parse() */
+       private static $dummyTitle = null;
+
+       /** @var ApiResult */
+       protected $result;
+
+       /** @var Language */
+       protected $lang;
+       protected $useDB = false;
+       protected $format = 'none';
+
+       /**
+        * @param ApiResult $result Into which data will be added
+        * @param Language $lang Used for i18n
+        * @param string $format
+        *  - text: Error message as wikitext
+        *  - html: Error message as HTML
+        *  - raw: Raw message key and parameters, no human-readable text
+        *  - none: Code and data only, no human-readable text
+        * @param bool $useDB Whether to use local translations for errors and warnings.
+        */
+       public function __construct( ApiResult $result, Language $lang, $format, $useDB = false ) {
+               $this->result = $result;
+               $this->lang = $lang;
+               $this->useDB = $useDB;
+               $this->format = $format;
+       }
+
+       /**
+        * Fetch a dummy title to set on Messages
+        * @return Title
+        */
+       protected function getDummyTitle() {
+               if ( self::$dummyTitle === null ) {
+                       self::$dummyTitle = Title::makeTitle( NS_SPECIAL, 'Badtitle/' . __METHOD__ );
+               }
+               return self::$dummyTitle;
+       }
+
+       /**
+        * Add a warning to the result
+        * @param string $moduleName
+        * @param MessageSpecifier|array|string $msg i18n message for the warning
+        * @param string $code Machine-readable code for the warning. Defaults as
+        *   for IApiMessage::getApiCode().
+        * @param array $data Machine-readable data for the warning, if any.
+        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        */
+       public function addWarning( $moduleName, $msg, $code = null, $data = null ) {
+               $msg = ApiMessage::create( $msg, $code, $data )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
+               $this->addWarningOrError( 'warning', $moduleName, $msg );
+       }
+
+       /**
+        * Add an error to the result
+        * @param string $moduleName
+        * @param MessageSpecifier|array|string $msg i18n message for the error
+        * @param string $code Machine-readable code for the warning. Defaults as
+        *   for IApiMessage::getApiCode().
+        * @param array $data Machine-readable data for the warning, if any.
+        *   Uses IApiMessage::getApiData() if $msg implements that interface.
+        */
+       public function addError( $moduleName, $msg, $code = null, $data = null ) {
+               $msg = ApiMessage::create( $msg, $code, $data )
+                       ->inLanguage( $this->lang )
+                       ->title( $this->getDummyTitle() )
+                       ->useDatabase( $this->useDB );
+               $this->addWarningOrError( 'error', $moduleName, $msg );
+       }
+
+       /**
+        * Add warnings and errors from a Status object to the result
+        * @param string $moduleName
+        * @param Status $status
+        * @param string[] $types 'warning' and/or 'error'
+        */
+       public function addMessagesFromStatus(
+               $moduleName, Status $status, $types = array( 'warning', 'error' )
+       ) {
+               if ( $status->isGood() || !$status->errors ) {
+                       return;
+               }
+
+               $types = (array)$types;
+               foreach ( $status->errors as $error ) {
+                       if ( !in_array( $error['type'], $types, true ) ) {
+                               continue;
+                       }
+
+                       if ( $error['type'] === 'error' ) {
+                               $tag = 'error';
+                       } else {
+                               // Assume any unknown type is a warning
+                               $tag = 'warning';
+                       }
+
+                       if ( is_array( $error ) && isset( $error['message'] ) ) {
+                               // Normal case
+                               if ( $error['message'] instanceof Message ) {
+                                       $msg = ApiMessage::create( $error['message'], null, array() );
+                               } else {
+                                       $args = isset( $error['params'] ) ? $error['params'] : array();
+                                       array_unshift( $args, $error['message'] );
+                                       $error += array( 'params' => array() );
+                                       $msg = ApiMessage::create( $args, null, array() );
+                               }
+                       } elseif ( is_array( $error ) ) {
+                               // Weird case handled by Message::getErrorMessage
+                               $msg = ApiMessage::create( $error, null, array() );
+                       } else {
+                               // Another weird case handled by Message::getErrorMessage
+                               $msg = ApiMessage::create( $error, null, array() );
+                       }
+
+                       $msg->inLanguage( $this->lang )
+                               ->title( $this->getDummyTitle() )
+                               ->useDatabase( $this->useDB );
+                       $this->addWarningOrError( $tag, $moduleName, $msg );
+               }
+       }
+
+       /**
+        * Format messages from a Status as an array
+        * @param Status $status
+        * @param string $type 'warning' or 'error'
+        * @param string|null $format
+        * @return array
+        */
+       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->errors ) {
+                       return array();
+               }
+
+               $result = new ApiResult( 1e6 );
+               $formatter = new ApiErrorFormatter(
+                       $result, $this->lang, $format ?: $this->format, $this->useDB
+               );
+               $formatter->addMessagesFromStatus( 'dummy', $status, array( $type ) );
+               switch ( $type ) {
+                       case 'error':
+                               return (array)$result->getResultData( array( 'errors', 'dummy' ) );
+                       case 'warning':
+                               return (array)$result->getResultData( array( 'warnings', 'dummy' ) );
+               }
+       }
+
+       /**
+        * Actually add the warning or error to the result
+        * @param string $tag 'warning' or 'error'
+        * @param string $moduleName
+        * @param ApiMessage|ApiRawMessage $msg
+        */
+       protected function addWarningOrError( $tag, $moduleName, $msg ) {
+               $value = array( 'code' => $msg->getApiCode() );
+               switch ( $this->format ) {
+                       case 'wikitext':
+                               $value += array(
+                                       'text' => $msg->text(),
+                                       ApiResult::META_CONTENT => 'text',
+                               );
+                               break;
+
+                       case 'html':
+                               $value += array(
+                                       'html' => $msg->parse(),
+                                       ApiResult::META_CONTENT => 'html',
+                               );
+                               break;
+
+                       case 'raw':
+                               $value += array(
+                                       'message' => $msg->getKey(),
+                                       'params' => $msg->getParams(),
+                               );
+                               ApiResult::setIndexedTagName( $value['params'], 'param' );
+                               break;
+
+                       case 'none':
+                               break;
+               }
+               $value += $msg->getApiData();
+
+               $path = array( $tag . 's', $moduleName );
+               $existing = $this->result->getResultData( $path );
+               if ( $existing === null || !in_array( $value, $existing ) ) {
+                       $flags = ApiResult::NO_SIZE_CHECK;
+                       if ( $existing === null ) {
+                               $flags |= ApiResult::ADD_ON_TOP;
+                       }
+                       $this->result->addValue( $path, null, $value, $flags );
+                       $this->result->addIndexedTagName( $path, $tag );
+               }
+       }
+}
+
+/**
+ * Format errors and warnings in the old style, for backwards compatibility.
+ * @since 1.25
+ * @deprecated Only for backwards compatibility, do not use
+ * @ingroup API
+ */
+class ApiErrorFormatter_BackCompat extends ApiErrorFormatter {
+       /**
+        * @param ApiResult $result Into which data will be added
+        */
+       public function __construct( ApiResult $result ) {
+               parent::__construct( $result, Language::factory( 'en' ), 'none', false );
+       }
+
+       public function arrayFromStatus( Status $status, $type = 'error', $format = null ) {
+               if ( $status->isGood() || !$status->errors ) {
+                       return array();
+               }
+
+               $result = array();
+               foreach ( $status->getErrorsByType( $type ) as $error ) {
+                       if ( $error['message'] instanceof Message ) {
+                               $error = array(
+                                       'message' => $error['message']->getKey(),
+                                       'params' => $error['message']->getParams(),
+                               ) + $error;
+                       }
+                       ApiResult::setIndexedTagName( $error['params'], 'param' );
+                       $result[] = $error;
+               }
+               ApiResult::setIndexedTagName( $result, $type );
+
+               return $result;
+       }
+
+       protected function addWarningOrError( $tag, $moduleName, $msg ) {
+               $value = $msg->plain();
+
+               if ( $tag === 'error' ) {
+                       // In BC mode, only one error
+                       $code = $msg->getApiCode();
+                       if ( isset( ApiBase::$messageMap[$code] ) ) {
+                               // Backwards compatibility
+                               $code = ApiBase::$messageMap[$code]['code'];
+                       }
+
+                       $value = array(
+                               'code' => $code,
+                               'info' => $value,
+                       ) + $msg->getApiData();
+                       $this->result->addValue( null, 'error', $value,
+                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+               } else {
+                       // Don't add duplicate warnings
+                       $tag .= 's';
+                       $path = array( $tag, $moduleName );
+                       $oldWarning = $this->result->getResultData( array( $tag, $moduleName, $tag ) );
+                       if ( $oldWarning !== null ) {
+                               $warnPos = strpos( $oldWarning, $value );
+                               // If $value was found in $oldWarning, check if it starts at 0 or after "\n"
+                               if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
+                                       // Check if $value is followed by "\n" or the end of the $oldWarning
+                                       $warnPos += strlen( $value );
+                                       if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
+                                               return;
+                                       }
+                               }
+                               // If there is a warning already, append it to the existing one
+                               $value = "$oldWarning\n$value";
+                       }
+                       $this->result->addContentValue( $path, $tag, $value,
+                               ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+               }
+       }
+}
index 4a5afb9..6d064eb 100644 (file)
@@ -96,9 +96,8 @@ class ApiExpandTemplates extends ApiBase {
                                $retval['parsetree'] = $xml;
                        } else {
                                // the old way
-                               $xml_result = array();
-                               ApiResult::setContent( $xml_result, $xml );
-                               $result->addValue( null, 'parsetree', $xml_result );
+                               $result->addValue( null, 'parsetree', $xml );
+                               $result->addValue( null, ApiResult::META_BC_SUBELEMENTS, array( 'parsetree' ) );
                        }
                }
 
@@ -110,7 +109,7 @@ class ApiExpandTemplates extends ApiBase {
                        $wikitext = $wgParser->preprocess( $params['text'], $title_obj, $options, $revid, $frame );
                        if ( $params['prop'] === null ) {
                                // the old way
-                               ApiResult::setContent( $retval, $wikitext );
+                               ApiResult::setContentValue( $retval, 'wikitext', $wikitext );
                        } else {
                                if ( isset( $prop['categories'] ) ) {
                                        $categories = $wgParser->getOutput()->getCategories();
@@ -119,29 +118,23 @@ class ApiExpandTemplates extends ApiBase {
                                                foreach ( $categories as $category => $sortkey ) {
                                                        $entry = array();
                                                        $entry['sortkey'] = $sortkey;
-                                                       ApiResult::setContent( $entry, $category );
+                                                       ApiResult::setContentValue( $entry, 'category', $category );
                                                        $categories_result[] = $entry;
                                                }
-                                               $result->setIndexedTagName( $categories_result, 'category' );
+                                               ApiResult::setIndexedTagName( $categories_result, 'category' );
                                                $retval['categories'] = $categories_result;
                                        }
                                }
                                if ( isset( $prop['properties'] ) ) {
                                        $properties = $wgParser->getOutput()->getProperties();
                                        if ( $properties ) {
-                                               $properties_result = array();
-                                               foreach ( $properties as $name => $value ) {
-                                                       $entry = array();
-                                                       $entry['name'] = $name;
-                                                       ApiResult::setContent( $entry, $value );
-                                                       $properties_result[] = $entry;
-                                               }
-                                               $result->setIndexedTagName( $properties_result, 'property' );
-                                               $retval['properties'] = $properties_result;
+                                               ApiResult::setArrayType( $properties, 'BCkvp', 'name' );
+                                               ApiResult::setIndexedTagName( $properties, 'property' );
+                                               $retval['properties'] = $properties;
                                        }
                                }
-                               if ( isset( $prop['volatile'] ) && $frame->isVolatile() ) {
-                                       $retval['volatile'] = '';
+                               if ( isset( $prop['volatile'] ) ) {
+                                       $retval['volatile'] = $frame->isVolatile();
                                }
                                if ( isset( $prop['ttl'] ) && $frame->getTTL() !== null ) {
                                        $retval['ttl'] = $frame->getTTL();
@@ -151,7 +144,7 @@ class ApiExpandTemplates extends ApiBase {
                                }
                        }
                }
-               $result->setSubelements( $retval, array( 'wikitext', 'parsetree' ) );
+               ApiResult::setSubelementsList( $retval, array( 'wikitext', 'parsetree' ) );
                $result->addValue( null, $this->getModuleName(), $retval );
        }
 
index bfa750b..d1beef8 100644 (file)
@@ -112,11 +112,12 @@ class ApiFeedWatchlist extends ApiBase {
                        $module = new ApiMain( $fauxReq );
                        $module->execute();
 
-                       // Get data array
-                       $data = $module->getResultData();
-
+                       $data = $module->getResult()->getResultData( array( 'query', 'watchlist' ) );
                        $feedItems = array();
-                       foreach ( (array)$data['query']['watchlist'] as $info ) {
+                       foreach ( (array)$data as $key => $info ) {
+                               if ( ApiResult::isMetadataKey( $key ) ) {
+                                       continue;
+                               }
                                $feedItem = $this->createFeedItem( $info );
                                if ( $feedItem ) {
                                        $feedItems[] = $feedItem;
index 61966e5..5517ee0 100644 (file)
@@ -61,7 +61,7 @@ class ApiFileRevert extends ApiBase {
                } else {
                        $result = array(
                                'result' => 'Failure',
-                               'errors' => $this->getResult()->convertStatusToArray( $status ),
+                               'errors' => $this->getErrorFormatter()->arrayFromStatus( $status ),
                        );
                }
 
index 7bbd968..d078dc4 100644 (file)
@@ -32,6 +32,7 @@
 abstract class ApiFormatBase extends ApiBase {
        private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp;
        private $mBuffer, $mDisabled = false;
+       protected $mForceDefaultParams = false;
 
        /**
         * If $format ends with 'fm', pretty-print the output in HTML.
@@ -60,14 +61,6 @@ abstract class ApiFormatBase extends ApiBase {
         */
        abstract public function getMimeType();
 
-       /**
-        * Whether this formatter needs raw data such as _element tags
-        * @return bool
-        */
-       public function getNeedsRawData() {
-               return false;
-       }
-
        /**
         * Get the internal format name
         * @return string
@@ -115,6 +108,34 @@ abstract class ApiFormatBase extends ApiBase {
                return true;
        }
 
+       /**
+        * Ignore request parameters, force a default.
+        *
+        * Used as a fallback if errors are being thrown.
+        * @since 1.26
+        */
+       public function forceDefaultParams() {
+               $this->mForceDefaultParams = true;
+       }
+
+       /**
+        * Overridden to honor $this->forceDefaultParams(), if applicable
+        * @since 1.26
+        */
+       protected function getParameterFromSettings( $paramName, $paramSettings, $parseLimit ) {
+               if ( !$this->mForceDefaultParams ) {
+                       return parent::getParameterFromSettings( $paramName, $paramSettings, $parseLimit );
+               }
+
+               if ( !is_array( $paramSettings ) ) {
+                       return $paramSettings;
+               } elseif ( isset( $paramSettings[self::PARAM_DFLT] ) ) {
+                       return $paramSettings[self::PARAM_DFLT];
+               } else {
+                       return null;
+               }
+       }
+
        /**
         * Initialize the printer function and prepare the output headers.
         * @param bool $unused Always false since 1.25
@@ -350,6 +371,22 @@ abstract class ApiFormatBase extends ApiBase {
        public function setBufferResult( $value ) {
        }
 
+       /**
+        * Formerly indicated whether the formatter needed metadata from ApiResult.
+        *
+        * ApiResult previously (indirectly) used this to decide whether to add
+        * metadata or to ignore calls to metadata-setting methods, which
+        * unfortunately made several methods that should have been static have to
+        * be dynamic instead. Now ApiResult always stores metadata and formatters
+        * are required to ignore it or filter it out.
+        *
+        * @deprecated since 1.25
+        * @return bool
+        */
+       public function getNeedsRawData() {
+               return false;
+       }
+
        /**@}*/
 }
 
index 273e205..7d359ad 100644 (file)
@@ -40,7 +40,12 @@ class ApiFormatDbg extends ApiFormatBase {
 
        public function execute() {
                $this->markDeprecated();
-               $this->printText( var_export( $this->getResultData(), true ) );
+               $data = $this->getResult()->getResultData( null, array(
+                       'BC' => array(),
+                       'Types' => array(),
+                       'Strip' => 'all',
+               ) );
+               $this->printText( var_export( $data, true ) );
        }
 
        public function isDeprecated() {
index 7ef8960..f34e1ae 100644 (file)
@@ -40,8 +40,13 @@ class ApiFormatDump extends ApiFormatBase {
 
        public function execute() {
                $this->markDeprecated();
+               $data = $this->getResult()->getResultData( null, array(
+                       'BC' => array(),
+                       'Types' => array(),
+                       'Strip' => 'all',
+               ) );
                ob_start();
-               var_dump( $this->getResultData() );
+               var_dump( $data );
                $result = ob_get_contents();
                ob_end_clean();
                $this->printText( $result );
index 3f53ed4..00747ee 100644 (file)
@@ -46,8 +46,8 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                // Disable size checking for this because we can't continue
                // cleanly; size checking would cause more problems than it'd
                // solve
-               $result->addValue( null, '_feed', $feed, ApiResult::NO_SIZE_CHECK );
-               $result->addValue( null, '_feeditems', $feedItems, ApiResult::NO_SIZE_CHECK );
+               $result->addValue( null, '_feed', $feed, ApiResult::NO_VALIDATE );
+               $result->addValue( null, '_feeditems', $feedItems, ApiResult::NO_VALIDATE );
        }
 
        /**
@@ -89,7 +89,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                        return;
                }
 
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
                if ( isset( $data['_feed'] ) && isset( $data['_feeditems'] ) ) {
                        $data['_feed']->httpHeaders();
                } else {
@@ -104,7 +104,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
         * $result['_feeditems'] - an array of FeedItem instances
         */
        public function execute() {
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
                if ( isset( $data['_feed'] ) && isset( $data['_feeditems'] ) ) {
                        $feed = $data['_feed'];
                        $items = $data['_feeditems'];
index 966e82d..43877b7 100644 (file)
  */
 class ApiFormatJson extends ApiFormatBase {
 
-       private $mIsRaw;
+       private $isRaw;
 
        public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
-               $this->mIsRaw = ( $format === 'rawfm' );
+               $this->isRaw = ( $format === 'rawfm' );
        }
 
        public function getMimeType() {
                $params = $this->extractRequestParams();
                // callback:
-               if ( $params['callback'] ) {
+               if ( isset( $params['callback'] ) ) {
                        return 'text/javascript';
                }
 
                return 'application/json';
        }
 
+       /**
+        * @deprecated since 1.25
+        */
        public function getNeedsRawData() {
-               return $this->mIsRaw;
+               return $this->isRaw;
        }
 
        /**
@@ -62,11 +65,37 @@ class ApiFormatJson extends ApiFormatBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $json = FormatJson::encode(
-                       $this->getResultData(),
-                       $this->getIsHtml(),
-                       $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
-               );
+
+               $opt = 0;
+               if ( $this->isRaw ) {
+                       $opt |= FormatJson::ALL_OK;
+                       $transform = array();
+               } else {
+                       switch ( $params['formatversion'] ) {
+                               case 1:
+                                       $opt |= $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK;
+                                       $transform = array(
+                                               'BC' => array(),
+                                               'Types' => array( 'AssocAsObject' => true ),
+                                               'Strip' => 'all',
+                                       );
+                                       break;
+
+                               case 2:
+                               case 'latest':
+                                       $opt |= $params['ascii'] ? FormatJson::XMLMETA_OK : FormatJson::ALL_OK;
+                                       $transform = array(
+                                               'Types' => array( 'AssocAsObject' => true ),
+                                               'Strip' => 'all',
+                                       );
+                                       break;
+
+                               default:
+                                       $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+                       }
+               }
+               $data = $this->getResult()->getResultData( null, $transform );
+               $json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
 
                // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API, so we need to
@@ -77,9 +106,8 @@ class ApiFormatJson extends ApiFormatBase {
                        );
                }
 
-               $callback = $params['callback'];
-               if ( $callback !== null ) {
-                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+               if ( isset( $params['callback'] ) ) {
+                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
                        # Prepend a comment to try to avoid attacks against content
                        # sniffers, such as bug 68187.
                        $this->printText( "/**/$callback($json)" );
@@ -89,7 +117,11 @@ class ApiFormatJson extends ApiFormatBase {
        }
 
        public function getAllowedParams() {
-               return array(
+               if ( $this->isRaw ) {
+                       return array();
+               }
+
+               $ret = array(
                        'callback' => array(
                                ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-callback',
                        ),
@@ -97,6 +129,16 @@ class ApiFormatJson extends ApiFormatBase {
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-utf8',
                        ),
+                       'ascii' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-ascii',
+                       ),
+                       'formatversion' => array(
+                               ApiBase::PARAM_TYPE => array( 1, 2, 'latest' ),
+                               ApiBase::PARAM_DFLT => 1,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-json-param-formatversion',
+                       ),
                );
+               return $ret;
        }
 }
index a4b4a11..d88dd40 100644 (file)
@@ -35,7 +35,29 @@ class ApiFormatPhp extends ApiFormatBase {
        }
 
        public function execute() {
-               $text = serialize( $this->getResultData() );
+               $params = $this->extractRequestParams();
+
+               switch ( $params['formatversion'] ) {
+                       case 1:
+                               $transforms = array(
+                                       'BC' => array(),
+                                       'Types' => array(),
+                                       'Strip' => 'all',
+                               );
+                               break;
+
+                       case 2:
+                       case 'latest':
+                               $transforms = array(
+                                       'Types' => array(),
+                                       'Strip' => 'all',
+                               );
+                               break;
+
+                       default:
+                               $this->dieUsage( __METHOD__ . ': Unknown value for \'formatversion\'', 'unknownformatversion' );
+               }
+               $text = serialize( $this->getResult()->getResultData( null, $transforms ) );
 
                // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
                // Flash, but what it does isn't friendly for the API. There's nothing
@@ -53,4 +75,15 @@ class ApiFormatPhp extends ApiFormatBase {
 
                $this->printText( $text );
        }
+
+       public function getAllowedParams() {
+               $ret = array(
+                       'formatversion' => array(
+                               ApiBase::PARAM_TYPE => array( 1, 2, 'latest' ),
+                               ApiBase::PARAM_DFLT => 1,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-php-param-formatversion',
+                       ),
+               );
+               return $ret;
+       }
 }
index 81d2f4f..7bb2453 100644 (file)
@@ -42,7 +42,7 @@ class ApiFormatRaw extends ApiFormatBase {
        }
 
        public function getMimeType() {
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
 
                if ( isset( $data['error'] ) ) {
                        return $this->errorFallback->getMimeType();
@@ -56,7 +56,7 @@ class ApiFormatRaw extends ApiFormatBase {
        }
 
        public function initPrinter( $unused = false ) {
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->errorFallback->initPrinter( $unused );
                } else {
@@ -65,7 +65,7 @@ class ApiFormatRaw extends ApiFormatBase {
        }
 
        public function closePrinter() {
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->errorFallback->closePrinter();
                } else {
@@ -74,7 +74,7 @@ class ApiFormatRaw extends ApiFormatBase {
        }
 
        public function execute() {
-               $data = $this->getResultData();
+               $data = $this->getResult()->getResultData();
                if ( isset( $data['error'] ) ) {
                        $this->errorFallback->execute();
                        return;
index 505b259..e739d5a 100644 (file)
@@ -40,7 +40,12 @@ class ApiFormatTxt extends ApiFormatBase {
 
        public function execute() {
                $this->markDeprecated();
-               $this->printText( print_r( $this->getResultData(), true ) );
+               $data = $this->getResult()->getResultData( null, array(
+                       'BC' => array(),
+                       'Types' => array(),
+                       'Strip' => 'all',
+               ) );
+               $this->printText( print_r( $data, true ) );
        }
 
        public function isDeprecated() {
index 8662a64..c18353f 100644 (file)
@@ -38,8 +38,20 @@ class ApiFormatWddx extends ApiFormatBase {
        public function execute() {
                $this->markDeprecated();
 
+               $data = $this->getResult()->getResultData( null, array(
+                       'BC' => array(),
+                       'Types' => array( 'AssocAsObject' => true ),
+                       'Strip' => 'all',
+               ) );
+
                if ( !$this->getIsHtml() && !static::useSlowPrinter() ) {
-                       $this->printText( wddx_serialize_value( $this->getResultData() ) );
+                       $txt = wddx_serialize_value( $data );
+                       $txt = str_replace(
+                               '<struct><var name=\'php_class_name\'><string>stdClass</string></var>',
+                               '<struct>',
+                               $txt
+                       );
+                       $this->printText( $txt );
                } else {
                        // Don't do newlines and indentation if we weren't asked
                        // for pretty output
@@ -49,7 +61,7 @@ class ApiFormatWddx extends ApiFormatBase {
                        $this->printText( "<wddxPacket version=\"1.0\">$nl" );
                        $this->printText( "$indstr<header />$nl" );
                        $this->printText( "$indstr<data>$nl" );
-                       $this->slowWddxPrinter( $this->getResultData(), 4 );
+                       $this->slowWddxPrinter( $data, 4 );
                        $this->printText( "$indstr</data>$nl" );
                        $this->printText( "</wddxPacket>$nl" );
                }
@@ -102,34 +114,37 @@ class ApiFormatWddx extends ApiFormatBase {
                $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
                $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
                $nl = ( $this->getIsHtml() ? "\n" : '' );
+
                if ( is_array( $elemValue ) ) {
-                       // Check whether we've got an associative array (<struct>)
-                       // or a regular array (<array>)
                        $cnt = count( $elemValue );
-                       if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
-                               // Regular array
-                               $this->printText( $indstr . Xml::element( 'array', array(
-                                       'length' => $cnt ), null ) . $nl );
-                               foreach ( $elemValue as $subElemValue ) {
-                                       $this->slowWddxPrinter( $subElemValue, $indent + 2 );
-                               }
-                               $this->printText( "$indstr</array>$nl" );
-                       } else {
-                               // Associative array (<struct>)
-                               $this->printText( "$indstr<struct>$nl" );
-                               foreach ( $elemValue as $subElemName => $subElemValue ) {
-                                       $this->printText( $indstr2 . Xml::element( 'var', array(
-                                               'name' => $subElemName
-                                       ), null ) . $nl );
-                                       $this->slowWddxPrinter( $subElemValue, $indent + 4 );
-                                       $this->printText( "$indstr2</var>$nl" );
-                               }
-                               $this->printText( "$indstr</struct>$nl" );
+                       if ( $cnt != 0 && array_keys( $elemValue ) !== range( 0, $cnt - 1 ) ) {
+                               $elemValue = (object)$elemValue;
+                       }
+               }
+
+               if ( is_array( $elemValue ) ) {
+                       // Regular array
+                       $this->printText( $indstr . Xml::element( 'array', array(
+                               'length' => count( $elemValue ) ), null ) . $nl );
+                       foreach ( $elemValue as $subElemValue ) {
+                               $this->slowWddxPrinter( $subElemValue, $indent + 2 );
+                       }
+                       $this->printText( "$indstr</array>$nl" );
+               } elseif ( is_object( $elemValue ) ) {
+                       // Associative array (<struct>)
+                       $this->printText( "$indstr<struct>$nl" );
+                       foreach ( $elemValue as $subElemName => $subElemValue ) {
+                               $this->printText( $indstr2 . Xml::element( 'var', array(
+                                       'name' => $subElemName
+                               ), null ) . $nl );
+                               $this->slowWddxPrinter( $subElemValue, $indent + 4 );
+                               $this->printText( "$indstr2</var>$nl" );
                        }
+                       $this->printText( "$indstr</struct>$nl" );
                } elseif ( is_int( $elemValue ) || is_float( $elemValue ) ) {
                        $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
                } elseif ( is_string( $elemValue ) ) {
-                       $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+                       $this->printText( $indstr . Xml::element( 'string', null, $elemValue, false ) . $nl );
                } elseif ( is_bool( $elemValue ) ) {
                        $this->printText( $indstr . Xml::element( 'boolean',
                                array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
index 7010dd6..dbd5645 100644 (file)
@@ -39,6 +39,9 @@ class ApiFormatXml extends ApiFormatBase {
                return 'text/xml';
        }
 
+       /**
+        * @deprecated since 1.25
+        */
        public function getNeedsRawData() {
                return true;
        }
@@ -56,18 +59,32 @@ class ApiFormatXml extends ApiFormatBase {
                if ( !is_null( $this->mXslt ) ) {
                        $this->addXslt();
                }
-               if ( $this->mIncludeNamespace ) {
+
+               $result = $this->getResult();
+               if ( $this->mIncludeNamespace && $result->getResultData( 'xmlns' ) === null ) {
                        // If the result data already contains an 'xmlns' namespace added
                        // for custom XML output types, it will override the one for the
                        // generic API results.
                        // This allows API output of other XML types like Atom, RSS, RSD.
-                       $data = $this->getResultData() + array( 'xmlns' => self::$namespace );
-               } else {
-                       $data = $this->getResultData();
+                       $result->addValue( null, 'xmlns', self::$namespace, ApiResult::NO_SIZE_CHECK );
                }
+               $data = $result->getResultData( null, array(
+                       'Custom' => function ( &$data, &$metadata ) {
+                               if ( isset( $metadata[ApiResult::META_TYPE] ) ) {
+                                       // We want to use non-BC for BCassoc to force outputting of _idx.
+                                       switch( $metadata[ApiResult::META_TYPE] ) {
+                                               case 'BCassoc':
+                                                       $metadata[ApiResult::META_TYPE] = 'assoc';
+                                                       break;
+                                       }
+                               }
+                       },
+                       'BC' => array( 'nobool', 'no*', 'nosub' ),
+                       'Types' => array( 'ArmorKVP' => '_name' ),
+               ) );
 
                $this->printText(
-                       self::recXmlPrint( $this->mRootElemName,
+                       static::recXmlPrint( $this->mRootElemName,
                                $data,
                                $this->getIsHtml() ? -2 : null
                        )
@@ -77,143 +94,185 @@ class ApiFormatXml extends ApiFormatBase {
        /**
         * This method takes an array and converts it to XML.
         *
-        * There are several noteworthy cases:
-        *
-        * If array contains a key '_element', then the code assumes that ALL
-        * other keys are not important and replaces them with the
-        * value['_element'].
-        *
-        * @par Example:
-        * @verbatim
-        * name='root', value = array( '_element'=>'page', 'x', 'y', 'z')
-        * @endverbatim
-        * creates:
-        * @verbatim
-        * <root>  <page>x</page>  <page>y</page>  <page>z</page> </root>
-        * @endverbatim
-        *
-        * If any of the array's element key is '*', then the code treats all
-        * other key->value pairs as attributes, and the value['*'] as the
-        * element's content.
-        *
-        * @par Example:
-        * @verbatim
-        * name='root', value = array( '*'=>'text', 'lang'=>'en', 'id'=>10)
-        * @endverbatim
-        * creates:
-        * @verbatim
-        * <root lang='en' id='10'>text</root>
-        * @endverbatim
-        *
-        * Finally neither key is found, all keys become element names, and values
-        * become element content.
-        *
-        * @note The method is recursive, so the same rules apply to any
-        * sub-arrays.
-        *
-        * @param string $elemName
-        * @param mixed $elemValue
-        * @param int $indent
-        *
+        * @param string|null $name Tag name
+        * @param mixed $value Tag value (attributes/content/subelements)
+        * @param int|null $indent Indentation
+        * @param array $attributes Additional attributes
         * @return string
         */
-       public static function recXmlPrint( $elemName, $elemValue, $indent ) {
+       public static function recXmlPrint( $name, $value, $indent, $attributes = array() ) {
                $retval = '';
-               if ( !is_null( $indent ) ) {
-                       $indent += 2;
+               if ( $indent !== null ) {
+                       if ( $name !== null ) {
+                               $indent += 2;
+                       }
                        $indstr = "\n" . str_repeat( ' ', $indent );
                } else {
                        $indstr = '';
                }
-               $elemName = str_replace( ' ', '_', $elemName );
-
-               if ( is_array( $elemValue ) ) {
-                       if ( isset( $elemValue['*'] ) ) {
-                               $subElemContent = $elemValue['*'];
-                               unset( $elemValue['*'] );
 
-                               // Add xml:space="preserve" to the
-                               // element so XML parsers will leave
-                               // whitespace in the content alone
-                               $elemValue['xml:space'] = 'preserve';
-                       } else {
-                               $subElemContent = null;
+               if ( is_object( $value ) ) {
+                       $value = (array)$value;
+               }
+               if ( is_array( $value ) ) {
+                       $contentKey = isset( $value[ApiResult::META_CONTENT] )
+                               ? $value[ApiResult::META_CONTENT]
+                               : '*';
+                       $subelementKeys = isset( $value[ApiResult::META_SUBELEMENTS] )
+                               ? $value[ApiResult::META_SUBELEMENTS]
+                               : array();
+                       if ( isset( $value[ApiResult::META_BC_SUBELEMENTS] ) ) {
+                               $subelementKeys = array_merge(
+                                       $subelementKeys, $value[ApiResult::META_BC_SUBELEMENTS]
+                               );
                        }
+                       $preserveKeys = isset( $value[ApiResult::META_PRESERVE_KEYS] )
+                               ? $value[ApiResult::META_PRESERVE_KEYS]
+                               : array();
+                       $indexedTagName = isset( $value[ApiResult::META_INDEXED_TAG_NAME] )
+                               ? $value[ApiResult::META_INDEXED_TAG_NAME]
+                               : '_v';
+                       $bcBools = isset( $value[ApiResult::META_BC_BOOLS] )
+                               ? $value[ApiResult::META_BC_BOOLS]
+                               : array();
+                       $indexSubelements = isset( $value[ApiResult::META_TYPE] )
+                               ? $value[ApiResult::META_TYPE] !== 'array'
+                               : false;
 
-                       if ( isset( $elemValue['_element'] ) ) {
-                               $subElemIndName = $elemValue['_element'];
-                               unset( $elemValue['_element'] );
-                       } else {
-                               $subElemIndName = null;
-                       }
+                       $content = null;
+                       $subelements = array();
+                       $indexedSubelements = array();
+                       foreach ( $value as $k => $v ) {
+                               if ( ApiResult::isMetadataKey( $k ) && !in_array( $k, $preserveKeys, true ) ) {
+                                       continue;
+                               }
 
-                       if ( isset( $elemValue['_subelements'] ) ) {
-                               foreach ( $elemValue['_subelements'] as $subElemId ) {
-                                       if ( isset( $elemValue[$subElemId] ) && !is_array( $elemValue[$subElemId] ) ) {
-                                               $elemValue[$subElemId] = array( '*' => $elemValue[$subElemId] );
-                                       }
+                               $oldv = $v;
+                               if ( is_bool( $v ) && !in_array( $k, $bcBools, true ) ) {
+                                       $v = $v ? 'true' : 'false';
                                }
-                               unset( $elemValue['_subelements'] );
-                       }
 
-                       $indElements = array();
-                       $subElements = array();
-                       foreach ( $elemValue as $subElemId => & $subElemValue ) {
-                               if ( is_int( $subElemId ) ) {
-                                       $indElements[] = $subElemValue;
-                                       unset( $elemValue[$subElemId] );
-                               } elseif ( is_array( $subElemValue ) ) {
-                                       $subElements[$subElemId] = $subElemValue;
-                                       unset( $elemValue[$subElemId] );
-                               } elseif ( is_bool( $subElemValue ) ) {
-                                       // treat true as empty string, skip false in xml format
-                                       if ( $subElemValue === true ) {
-                                               $subElemValue = '';
-                                       } else {
-                                               unset( $elemValue[$subElemId] );
+                               if ( $name !== null && $k === $contentKey ) {
+                                       $content = $v;
+                               } elseif ( is_int( $k ) ) {
+                                       $indexedSubelements[$k] = $v;
+                               } elseif ( is_array( $v ) || is_object( $v ) ) {
+                                       $subelements[self::mangleName( $k, $preserveKeys )] = $v;
+                               } elseif ( in_array( $k, $subelementKeys, true ) || $name === null ) {
+                                       $subelements[self::mangleName( $k, $preserveKeys )] = array(
+                                               'content' => $v,
+                                               ApiResult::META_CONTENT => 'content',
+                                               ApiResult::META_TYPE => 'assoc',
+                                       );
+                               } elseif ( is_bool( $oldv ) ) {
+                                       if ( $oldv ) {
+                                               $attributes[self::mangleName( $k, $preserveKeys )] = '';
                                        }
+                               } elseif ( $v !== null ) {
+                                       $attributes[self::mangleName( $k, $preserveKeys )] = $v;
                                }
                        }
 
-                       if ( is_null( $subElemIndName ) && count( $indElements ) ) {
-                               ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys " .
-                                       "without _element value. Use ApiResult::setIndexedTagName()." );
-                       }
-
-                       if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
-                               ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+                       if ( $content !== null ) {
+                               if ( $subelements || $indexedSubelements ) {
+                                       $subelements[self::mangleName( $contentKey, $preserveKeys )] = array(
+                                               'content' => $content,
+                                               ApiResult::META_CONTENT => 'content',
+                                               ApiResult::META_TYPE => 'assoc',
+                                       );
+                                       $content = null;
+                               } elseif ( is_scalar( $content ) ) {
+                                       // Add xml:space="preserve" to the element so XML parsers
+                                       // will leave whitespace in the content alone
+                                       $attributes += array( 'xml:space' => 'preserve' );
+                               }
                        }
 
-                       if ( !is_null( $subElemContent ) ) {
-                               $retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
-                       } elseif ( !count( $indElements ) && !count( $subElements ) ) {
-                               $retval .= $indstr . Xml::element( $elemName, $elemValue );
+                       if ( $content !== null ) {
+                               if ( is_scalar( $content ) ) {
+                                       $retval .= $indstr . Xml::element( $name, $attributes, $content );
+                               } else {
+                                       if ( $name !== null ) {
+                                               $retval .= $indstr . Xml::element( $name, $attributes, null );
+                                       }
+                                       $retval .= static::recXmlPrint( null, $content, $indent );
+                                       if ( $name !== null ) {
+                                               $retval .= $indstr . Xml::closeElement( $name );
+                                       }
+                               }
+                       } elseif ( !$indexedSubelements && !$subelements ) {
+                               if ( $name !== null ) {
+                                       $retval .= $indstr . Xml::element( $name, $attributes );
+                               }
                        } else {
-                               $retval .= $indstr . Xml::element( $elemName, $elemValue, null );
-
-                               foreach ( $subElements as $subElemId => & $subElemValue ) {
-                                       $retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
+                               if ( $name !== null ) {
+                                       $retval .= $indstr . Xml::element( $name, $attributes, null );
                                }
-
-                               foreach ( $indElements as &$subElemValue ) {
-                                       $retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
+                               foreach ( $subelements as $k => $v ) {
+                                       $retval .= static::recXmlPrint( $k, $v, $indent );
+                               }
+                               foreach ( $indexedSubelements as $k => $v ) {
+                                       $retval .= static::recXmlPrint( $indexedTagName, $v, $indent,
+                                               $indexSubelements ? array( '_idx' => $k ) : array()
+                                       );
+                               }
+                               if ( $name !== null ) {
+                                       $retval .= $indstr . Xml::closeElement( $name );
                                }
-
-                               $retval .= $indstr . Xml::closeElement( $elemName );
                        }
-               } elseif ( !is_object( $elemValue ) ) {
+               } else {
                        // to make sure null value doesn't produce unclosed element,
-                       // which is what Xml::element( $elemName, null, null ) returns
-                       if ( $elemValue === null ) {
-                               $retval .= $indstr . Xml::element( $elemName );
+                       // which is what Xml::element( $name, null, null ) returns
+                       if ( $value === null ) {
+                               $retval .= $indstr . Xml::element( $name, $attributes );
                        } else {
-                               $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+                               $retval .= $indstr . Xml::element( $name, $attributes, $value );
                        }
                }
 
                return $retval;
        }
 
+       /**
+        * Mangle XML-invalid names to be valid in XML
+        * @param string $name
+        * @param array $preserveKeys Names to not mangle
+        * @return string Mangled name
+        */
+       private static function mangleName( $name, $preserveKeys = array() ) {
+               static $nsc = null, $nc = null;
+
+               if ( in_array( $name, $preserveKeys, true ) ) {
+                       return $name;
+               }
+
+               if ( $name === '' ) {
+                       return '_';
+               }
+
+               if ( $nsc === null ) {
+                       // Note we omit ':' from $nsc and $nc because it's reserved for XML
+                       // namespacing, and we omit '_' from $nsc (but not $nc) because we
+                       // reserve it.
+                       $nsc = 'A-Za-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}' .
+                               '\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}' .
+                               '\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}';
+                       $nc = $nsc . '_\-.0-9\x{B7}\x{300}-\x{36F}\x{203F}-\x{2040}';
+               }
+
+               if ( preg_match( "/^[$nsc][$nc]*$/uS", $name ) ) {
+                       return $name;
+               }
+
+               return '_' . preg_replace_callback(
+                       "/[^$nc]/uS",
+                       function ( $m ) {
+                               return sprintf( '.%X.', utf8ToCodepoint( $m[0] ) );
+                       },
+                       str_replace( '.', '.2E.', $name )
+               );
+       }
+
        function addXslt() {
                $nt = Title::newFromText( $this->mXslt );
                if ( is_null( $nt ) || !$nt->exists() ) {
index dd05f45..1e30616 100644 (file)
@@ -60,7 +60,7 @@ class ApiHelp extends ApiBase {
                                'mime' => 'text/html',
                                'help' => $html,
                        );
-                       $result->setSubelements( $data, 'help' );
+                       ApiResult::setSubelementsList( $data, 'help' );
                        $result->addValue( null, $this->getModuleName(), $data );
                } else {
                        $result->reset();
@@ -164,17 +164,17 @@ class ApiHelp extends ApiBase {
                                $old = $href;
                                $href = rawurldecode( $href );
                        } while ( $old !== $href );
-                       if ( preg_match( '!Special:ApiHelp/([^&/|]+)!', $href, $m ) ) {
+                       if ( preg_match( '!Special:ApiHelp/([^&/|#]+)((?:#.*)?)!', $href, $m ) ) {
                                if ( isset( $localModules[$m[1]] ) ) {
-                                       $href = '#' . $m[1];
+                                       $href = $m[2] === '' ? '#' . $m[1] : $m[2];
                                } elseif ( $helptitle !== null ) {
-                                       $href = Title::newFromText( str_replace( '$1', $m[1], $helptitle ) )
+                                       $href = Title::newFromText( str_replace( '$1', $m[1], $helptitle ) . $m[2] )
                                                ->getFullUrl();
                                } else {
                                        $href = wfAppendQuery( wfScript( 'api' ), array(
                                                'action' => 'help',
                                                'modules' => $m[1],
-                                       ) );
+                                       ) ) . $m[2];
                                }
                                $node->setAttribute( 'href', $href );
                                $node->removeAttribute( 'title' );
@@ -277,25 +277,55 @@ class ApiHelp extends ApiBase {
                                );
                        }
 
-                       $flags = $module->getHelpFlags();
-                       if ( $flags ) {
-                               $help['flags'] .= Html::openElement( 'div',
-                                       array( 'class' => 'apihelp-block apihelp-flags' ) );
-                               $msg = $context->msg( 'api-help-flags' );
-                               if ( !$msg->isDisabled() ) {
-                                       $help['flags'] .= self::wrap(
-                                               $msg->numParams( count( $flags ) ), 'apihelp-block-head', 'div'
-                                       );
+                       $help['flags'] .= Html::openElement( 'div',
+                               array( 'class' => 'apihelp-block apihelp-flags' ) );
+                       $msg = $context->msg( 'api-help-flags' );
+                       if ( !$msg->isDisabled() ) {
+                               $help['flags'] .= self::wrap(
+                                       $msg->numParams( count( $flags ) ), 'apihelp-block-head', 'div'
+                               );
+                       }
+                       $help['flags'] .= Html::openElement( 'ul' );
+                       foreach ( $module->getHelpFlags() as $flag ) {
+                               $help['flags'] .= Html::rawElement( 'li', null,
+                                       self::wrap( $context->msg( "api-help-flag-$flag" ), "apihelp-flag-$flag" )
+                               );
+                       }
+                       $sourceInfo = $module->getModuleSourceInfo();
+                       if ( $sourceInfo ) {
+                               if ( isset( $sourceInfo['namemsg'] ) ) {
+                                       $extname = $context->msg( $sourceInfo['namemsg'] )->text();
+                               } else {
+                                       $extname = $sourceInfo['name'];
                                }
-                               $help['flags'] .= Html::openElement( 'ul' );
-                               foreach ( $flags as $flag ) {
-                                       $help['flags'] .= Html::rawElement( 'li', null,
-                                               self::wrap( $context->msg( "api-help-flag-$flag" ), "apihelp-flag-$flag" )
-                                       );
+                               $help['flags'] .= Html::rawElement( 'li', null,
+                                       self::wrap(
+                                               $context->msg( 'api-help-source', $extname, $sourceInfo['name'] ),
+                                               'apihelp-source'
+                                       )
+                               );
+
+                               $link = SpecialPage::getTitleFor( 'Version', 'License/' . $sourceInfo['name'] );
+                               if ( isset( $sourceInfo['license-name'] ) ) {
+                                       $msg = $context->msg( 'api-help-license', $link, $sourceInfo['license-name'] );
+                               } elseif ( SpecialVersion::getExtLicenseFileName( dirname( $sourceInfo['path'] ) ) ) {
+                                       $msg = $context->msg( 'api-help-license-noname', $link );
+                               } else {
+                                       $msg = $context->msg( 'api-help-license-unknown' );
                                }
-                               $help['flags'] .= Html::closeElement( 'ul' );
-                               $help['flags'] .= Html::closeElement( 'div' );
+                               $help['flags'] .= Html::rawElement( 'li', null,
+                                       self::wrap( $msg, 'apihelp-license' )
+                               );
+                       } else {
+                               $help['flags'] .= Html::rawElement( 'li', null,
+                                       self::wrap( $context->msg( 'api-help-source-unknown' ), 'apihelp-source' )
+                               );
+                               $help['flags'] .= Html::rawElement( 'li', null,
+                                       self::wrap( $context->msg( 'api-help-license-unknown' ), 'apihelp-license' )
+                               );
                        }
+                       $help['flags'] .= Html::closeElement( 'ul' );
+                       $help['flags'] .= Html::closeElement( 'div' );
 
                        foreach ( $module->getFinalDescription() as $msg ) {
                                $msg->setContext( $context );
@@ -442,6 +472,8 @@ class ApiHelp extends ApiBase {
                                                                                ->params( $context->getLanguage()->commaList( $submodules ) )
                                                                                ->parse();
                                                                        $hintPipeSeparated = false;
+                                                                       // No type message necessary, we have a list of values.
+                                                                       $type = null;
                                                                        break;
 
                                                                case 'namespace':
@@ -452,6 +484,8 @@ class ApiHelp extends ApiBase {
                                                                                ->params( $context->getLanguage()->commaList( $namespaces ) )
                                                                                ->parse();
                                                                        $hintPipeSeparated = false;
+                                                                       // No type message necessary, we have a list of values.
+                                                                       $type = null;
                                                                        break;
 
                                                                case 'limit':
@@ -494,7 +528,24 @@ class ApiHelp extends ApiBase {
                                                                case 'upload':
                                                                        $info[] = $context->msg( 'api-help-param-upload' )
                                                                                ->parse();
+                                                                       // No type message necessary, api-help-param-upload should handle it.
+                                                                       $type = null;
                                                                        break;
+
+                                                               case 'string':
+                                                                       // Displaying a type message here would be useless.
+                                                                       $type = null;
+                                                                       break;
+                                                       }
+                                               }
+
+                                               // Add type. Messages for grep: api-help-param-type-limit
+                                               // api-help-param-type-integer api-help-param-type-boolean
+                                               // api-help-param-type-timestamp api-help-param-type-user
+                                               if ( is_string( $type ) ) {
+                                                       $msg = $context->msg( "api-help-param-type-$type" );
+                                                       if ( !$msg->isDisabled() ) {
+                                                               $info[] = $msg->params( $multi ? 2 : 1 )->parse();
                                                        }
                                                }
 
index 6fd79f4..865d39f 100644 (file)
@@ -42,7 +42,7 @@ class ApiImageRotate extends ApiBase {
                                $v = $val;
                        }
                        if ( $flag !== null ) {
-                               $v[$flag] = '';
+                               $v[$flag] = true;
                        }
                        $result[] = $v;
                }
@@ -52,7 +52,8 @@ class ApiImageRotate extends ApiBase {
                $params = $this->extractRequestParams();
                $rotation = $params['rotation'];
 
-               $this->getResult()->beginContinuation( $params['continue'], array(), array() );
+               $continuationManager = new ApiContinuationManager( $this, array(), array() );
+               $this->setContinuationManager( $continuationManager );
 
                $pageSet = $this->getPageSet();
                $pageSet->execute();
@@ -70,7 +71,7 @@ class ApiImageRotate extends ApiBase {
                        $r['id'] = $title->getArticleID();
                        ApiQueryBase::addTitleInfo( $r, $title );
                        if ( !$title->exists() ) {
-                               $r['missing'] = '';
+                               $r['missing'] = true;
                        }
 
                        $file = wfFindFile( $title, array( 'latest' => true ) );
@@ -122,7 +123,7 @@ class ApiImageRotate extends ApiBase {
                                        $r['result'] = 'Success';
                                } else {
                                        $r['result'] = 'Failure';
-                                       $r['errormessage'] = $this->getResult()->convertStatusToArray( $status );
+                                       $r['errormessage'] = $this->getErrorFormatter()->arrayFromStatus( $status );
                                }
                        } else {
                                $r['result'] = 'Failure';
@@ -131,9 +132,11 @@ class ApiImageRotate extends ApiBase {
                        $result[] = $r;
                }
                $apiResult = $this->getResult();
-               $apiResult->setIndexedTagName( $result, 'page' );
+               ApiResult::setIndexedTagName( $result, 'page' );
                $apiResult->addValue( null, $this->getModuleName(), $result );
-               $apiResult->endContinuation();
+
+               $this->setContinuationManager( null );
+               $continuationManager->setContinuationIntoResult( $apiResult );
        }
 
        /**
index c7dcce8..40cf6e2 100644 (file)
@@ -63,8 +63,7 @@ class ApiImport extends ApiBase {
                $importer = new WikiImporter( $source->value, $this->getConfig() );
                if ( isset( $params['namespace'] ) ) {
                        $importer->setTargetNamespace( $params['namespace'] );
-               }
-               if ( isset( $params['rootpage'] ) ) {
+               } elseif ( isset( $params['rootpage'] ) ) {
                        $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
                        if ( !$statusRootPage->isGood() ) {
                                $this->dieStatus( $statusRootPage );
@@ -85,7 +84,7 @@ class ApiImport extends ApiBase {
 
                $resultData = $reporter->getData();
                $result = $this->getResult();
-               $result->setIndexedTagName( $resultData, 'page' );
+               ApiResult::setIndexedTagName( $resultData, 'page' );
                $result->addValue( null, $this->getModuleName(), $resultData );
        }
 
@@ -155,7 +154,7 @@ class ApiImportReporter extends ImportReporter {
                if ( $title === null ) {
                        # Invalid or non-importable title
                        $r['title'] = $pageInfo['title'];
-                       $r['invalid'] = '';
+                       $r['invalid'] = true;
                } else {
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $r['revisions'] = intval( $successCount );
index 1feb485..2ec3aa8 100644 (file)
@@ -89,6 +89,7 @@ class ApiMain extends ApiBase {
                'imagerotate' => 'ApiImageRotate',
                'revisiondelete' => 'ApiRevisionDelete',
                'managetags' => 'ApiManageTags',
+               'tag' => 'ApiTag',
        );
 
        /**
@@ -139,7 +140,7 @@ class ApiMain extends ApiBase {
         */
        private $mPrinter;
 
-       private $mModuleMgr, $mResult;
+       private $mModuleMgr, $mResult, $mErrorFormatter, $mContinuationManager;
        private $mAction;
        private $mEnableWrite;
        private $mInternalMode, $mSquidMaxage, $mModule;
@@ -217,7 +218,11 @@ class ApiMain extends ApiBase {
 
                Hooks::run( 'ApiMain::moduleManager', array( $this->mModuleMgr ) );
 
-               $this->mResult = new ApiResult( $this );
+               $this->mResult = new ApiResult( $this->getConfig()->get( 'APIMaxResultSize' ) );
+               $this->mErrorFormatter = new ApiErrorFormatter_BackCompat( $this->mResult );
+               $this->mResult->setErrorFormatter( $this->mErrorFormatter );
+               $this->mResult->setMainForContinuation( $this );
+               $this->mContinuationManager = null;
                $this->mEnableWrite = $enableWrite;
 
                $this->mSquidMaxage = -1; // flag for executeActionWithErrorHandling()
@@ -241,6 +246,43 @@ class ApiMain extends ApiBase {
                return $this->mResult;
        }
 
+       /**
+        * Get the ApiErrorFormatter object associated with current request
+        * @return ApiErrorFormatter
+        */
+       public function getErrorFormatter() {
+               return $this->mErrorFormatter;
+       }
+
+       /**
+        * Get the continuation manager
+        * @return ApiContinuationManager|null
+        */
+       public function getContinuationManager() {
+               return $this->mContinuationManager;
+       }
+
+       /**
+        * Set the continuation manager
+        * @param ApiContinuationManager|null
+        */
+       public function setContinuationManager( $manager ) {
+               if ( $manager !== null ) {
+                       if ( !$manager instanceof ApiContinuationManager ) {
+                               throw new InvalidArgumentException( __METHOD__ . ': Was passed ' .
+                                       is_object( $manager ) ? get_class( $manager ) : gettype( $manager )
+                               );
+                       }
+                       if ( $this->mContinuationManager !== null ) {
+                               throw new UnexpectedValueException(
+                                       __METHOD__ . ': tried to set manager from ' . $manager->getSource() .
+                                       ' when a manager is already set from ' . $this->mContinuationManager->getSource()
+                               );
+                       }
+               }
+               $this->mContinuationManager = $manager;
+       }
+
        /**
         * Get the API module object. Only works after executeAction()
         *
@@ -416,7 +458,13 @@ class ApiMain extends ApiBase {
                // Bug 63145: Rollback any open database transactions
                if ( !( $e instanceof UsageException ) ) {
                        // UsageExceptions are intentional, so don't rollback if that's the case
-                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+                       try {
+                               MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+                       } catch ( DBError $e2 ) {
+                               // Rollback threw an exception too. Log it, but don't interrupt
+                               // our regularly scheduled exception handling.
+                               MWExceptionHandler::logException( $e2 );
+                       }
                }
 
                // Allow extra cleanup and logging
@@ -447,7 +495,22 @@ class ApiMain extends ApiBase {
                // Reset and print just the error message
                ob_clean();
 
-               $this->printResult( true );
+               // Printer may not be initialized if the extractRequestParams() fails for the main module
+               $this->createErrorPrinter();
+
+               try {
+                       $this->printResult( true );
+               } catch ( UsageException $ex ) {
+                       // The error printer itself is failing. Try suppressing its request
+                       // parameters and redo.
+                       $this->setWarning(
+                               'Error printer failed (will retry without params): ' . $ex->getMessage()
+                       );
+                       $this->mPrinter = null;
+                       $this->createErrorPrinter();
+                       $this->mPrinter->forceDefaultParams();
+                       $this->printResult( true );
+               }
        }
 
        /**
@@ -744,22 +807,14 @@ class ApiMain extends ApiBase {
        }
 
        /**
-        * Replace the result data with the information about an exception.
-        * Returns the error code
-        * @param Exception $e
-        * @return string
+        * Create the printer for error output
         */
-       protected function substituteResultWithError( $e ) {
-               $result = $this->getResult();
-
-               // Printer may not be initialized if the extractRequestParams() fails for the main module
+       private function createErrorPrinter() {
                if ( !isset( $this->mPrinter ) ) {
-                       // The printer has not been created yet. Try to manually get formatter value.
                        $value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
                        if ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
                                $value = self::API_DEFAULT_FORMAT;
                        }
-
                        $this->mPrinter = $this->createPrinterByName( $value );
                }
 
@@ -768,17 +823,23 @@ class ApiMain extends ApiBase {
                if ( !$this->mPrinter->canPrintErrors() ) {
                        $this->mPrinter = $this->createPrinterByName( self::API_DEFAULT_FORMAT );
                }
+       }
 
-               // Update raw mode flag for the selected printer.
-               $result->setRawMode( $this->mPrinter->getNeedsRawData() );
-
+       /**
+        * Replace the result data with the information about an exception.
+        * Returns the error code
+        * @param Exception $e
+        * @return string
+        */
+       protected function substituteResultWithError( $e ) {
+               $result = $this->getResult();
                $config = $this->getConfig();
 
                if ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - generate error response
                        $errMessage = $e->getMessageArray();
                        $link = wfExpandUrl( wfScript( 'api' ) );
-                       ApiResult::setContent( $errMessage, "See $link for API usage" );
+                       ApiResult::setContentValue( $errMessage, 'docref', "See $link for API usage" );
                } else {
                        // Something is seriously wrong
                        if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
@@ -792,16 +853,16 @@ class ApiMain extends ApiBase {
                                'info' => '[' . MWExceptionHandler::getLogId( $e ) . '] ' . $info,
                        );
                        if ( $config->get( 'ShowExceptionDetails' ) ) {
-                               ApiResult::setContent(
+                               ApiResult::setContentValue(
                                        $errMessage,
+                                       'trace',
                                        MWExceptionHandler::getRedactedTraceAsString( $e )
                                );
                        }
                }
 
                // Remember all the warnings to re-add them later
-               $oldResult = $result->getData();
-               $warnings = isset( $oldResult['warnings'] ) ? $oldResult['warnings'] : null;
+               $warnings = $result->getResultData( array( 'warnings' ) );
 
                $result->reset();
                // Re-add the id
@@ -1184,9 +1245,7 @@ class ApiMain extends ApiBase {
                        $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
                }
 
-               $this->getResult()->cleanUpUTF8();
                $printer = $this->mPrinter;
-
                $printer->initPrinter( false );
                $printer->execute();
                $printer->closePrinter();
@@ -1259,6 +1318,7 @@ class ApiMain extends ApiBase {
                        }
                        $help[$k] = $v;
                }
+               $help['datatypes'] = '';
                $help['credits'] = '';
 
                // Fill 'permissions'
@@ -1291,10 +1351,18 @@ class ApiMain extends ApiBase {
                $help['permissions'] .= Html::closeElement( 'dl' );
                $help['permissions'] .= Html::closeElement( 'div' );
 
-               // Fill 'credits', if applicable
+               // Fill 'datatypes' and 'credits', if applicable
                if ( empty( $options['nolead'] ) ) {
-                       $help['credits'] .= Html::element( 'h' . min( 6, $options['headerlevel'] + 1 ),
-                               array( 'id' => '+credits', 'class' => 'apihelp-header' ),
+                       $help['datatypes'] .= Html::rawelement( 'h' . min( 6, $options['headerlevel'] + 1 ),
+                               array( 'id' => 'main/datatypes', 'class' => 'apihelp-header' ),
+                               Html::element( 'span', array( 'id' => Sanitizer::escapeId( 'main/datatypes' ) ) ) .
+                               $this->msg( 'api-help-datatypes-header' )->parse()
+                       );
+                       $help['datatypes'] .= $this->msg( 'api-help-datatypes' )->parseAsBlock();
+
+                       $help['credits'] .= Html::rawelement( 'h' . min( 6, $options['headerlevel'] + 1 ),
+                               array( 'id' => 'main/credits', 'class' => 'apihelp-header' ),
+                               Html::element( 'span', array( 'id' => Sanitizer::escapeId( 'main/credits' ) ) ) .
                                $this->msg( 'api-credits-header' )->parse()
                        );
                        $help['credits'] .= $this->msg( 'api-credits' )->useDatabase( false )->parseAsBlock();
index b027f33..240d350 100644 (file)
@@ -47,10 +47,10 @@ class ApiManageTags extends ApiBase {
                        'tag' => $params['tag'],
                );
                if ( !$status->isGood() ) {
-                       $ret['warnings'] = $result->convertStatusToArray( $status, 'warning' );
+                       $ret['warnings'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'warning' );
                }
-               if ( $status->value !== null ) {
-                       $ret['success'] = '';
+               $ret['success'] = $status->value !== null;
+               if ( $ret['success'] ) {
                        $ret['logid'] = $status->value;
                }
                $result->addValue( null, $this->getModuleName(), $ret );
diff --git a/includes/api/ApiMessage.php b/includes/api/ApiMessage.php
new file mode 100644 (file)
index 0000000..6717c39
--- /dev/null
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Defines an interface for messages with additional machine-readable data for
+ * use by the API, and provides concrete implementations of that interface.
+ *
+ * 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 for messages with machine-readable data for use by the API
+ * @since 1.25
+ * @ingroup API
+ */
+interface IApiMessage extends MessageSpecifier {
+       /**
+        * Returns a machine-readable code for use by the API
+        *
+        * The message key is often sufficient, but sometimes there are multiple
+        * messages used for what is really the same underlying condition (e.g.
+        * badaccess-groups and badaccess-group0)
+        * @return string
+        */
+       public function getApiCode();
+
+       /**
+        * Returns additional machine-readable data about the error condition
+        * @return array
+        */
+       public function getApiData();
+
+       /**
+        * Sets the machine-readable code for use by the API
+        * @param string|null $code If null, the message key should be returned by self::getApiCode()
+        * @param array|null $data If non-null, passed to self::setApiData()
+        */
+       public function setApiCode( $code, array $data = null );
+
+       /**
+        * Sets additional machine-readable data about the error condition
+        * @param array $data
+        */
+       public function setApiData( array $data );
+}
+
+/**
+ * Extension of Message implementing IApiMessage
+ * @since 1.25
+ * @ingroup API
+ * @todo: Would be nice to use a Trait here to avoid code duplication
+ */
+class ApiMessage extends Message implements IApiMessage {
+       protected $apiCode = null;
+       protected $apiData = array();
+
+       /**
+        * Create an IApiMessage for the message
+        *
+        * This returns $msg if it's an IApiMessage, calls 'new ApiRawMessage' if
+        * $msg is a RawMessage, or calls 'new ApiMessage' in all other cases.
+        *
+        * @param Message|RawMessage|array|string $msg
+        * @param string|null $code
+        * @param array|null $data
+        * @return ApiMessage
+        */
+       public static function create( $msg, $code = null, array $data = null ) {
+               if ( $msg instanceof IApiMessage ) {
+                       return $msg;
+               } elseif ( $msg instanceof RawMessage ) {
+                       return new ApiRawMessage( $msg, $code, $data );
+               } else {
+                       return new ApiMessage( $msg, $code, $data );
+               }
+       }
+
+       /**
+        * @param Message|string|array $msg
+        *  - Message: is cloned
+        *  - array: first element is $key, rest are $params to Message::__construct
+        *  - string: passed to Message::__construct
+        * @param string|null $code
+        * @param array|null $data
+        * @return ApiMessage
+        */
+       public function __construct( $msg, $code = null, array $data = null ) {
+               if ( $msg instanceof Message ) {
+                       foreach ( get_class_vars( get_class( $this ) ) as $key => $value ) {
+                               if ( isset( $msg->$key ) ) {
+                                       $this->$key = $msg->$key;
+                               }
+                       }
+               } elseif ( is_array( $msg ) ) {
+                       $key = array_shift( $msg );
+                       parent::__construct( $key, $msg );
+               } else {
+                       parent::__construct( $msg );
+               }
+               $this->apiCode = $code;
+               $this->apiData = (array)$data;
+       }
+
+       public function getApiCode() {
+               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+       }
+
+       public function setApiCode( $code, array $data = null ) {
+               $this->apiCode = $code;
+               if ( $data !== null ) {
+                       $this->setApiData( $data );
+               }
+       }
+
+       public function getApiData() {
+               return $this->apiData;
+       }
+
+       public function setApiData( array $data ) {
+               $this->apiData = $data;
+       }
+}
+
+/**
+ * Extension of RawMessage implementing IApiMessage
+ * @since 1.25
+ * @ingroup API
+ * @todo: Would be nice to use a Trait here to avoid code duplication
+ */
+class ApiRawMessage extends RawMessage implements IApiMessage {
+       protected $apiCode = null;
+       protected $apiData = array();
+
+       /**
+        * @param RawMessage|string|array $msg
+        *  - RawMessage: is cloned
+        *  - array: first element is $key, rest are $params to RawMessage::__construct
+        *  - string: passed to RawMessage::__construct
+        * @param string|null $code
+        * @param array|null $data
+        * @return ApiMessage
+        */
+       public function __construct( $msg, $code = null, array $data = null ) {
+               if ( $msg instanceof RawMessage ) {
+                       foreach ( get_class_vars( get_class( $this ) ) as $key => $value ) {
+                               if ( isset( $msg->$key ) ) {
+                                       $this->$key = $msg->$key;
+                               }
+                       }
+               } elseif ( is_array( $msg ) ) {
+                       $key = array_shift( $msg );
+                       parent::__construct( $key, $msg );
+               } else {
+                       parent::__construct( $msg );
+               }
+               $this->apiCode = $code;
+               $this->apiData = (array)$data;
+       }
+
+       public function getApiCode() {
+               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+       }
+
+       public function setApiCode( $code, array $data = null ) {
+               $this->apiCode = $code;
+               if ( $data !== null ) {
+                       $this->setApiData( $data );
+               }
+       }
+
+       public function getApiData() {
+               return $this->apiData;
+       }
+
+       public function setApiData( array $data ) {
+               $this->apiData = $data;
+       }
+}
index 7fb6303..e42958b 100644 (file)
@@ -83,18 +83,14 @@ class ApiMove extends ApiBase {
                        'reason' => $params['reason']
                );
 
-               if ( $fromTitle->exists() ) {
-                       //NOTE: we assume that if the old title exists, it's because it was re-created as
-                       // a redirect to the new title. This is not safe, but what we did before was
-                       // even worse: we just determined whether a redirect should have been created,
-                       // and reported that it was created if it should have, without any checks.
-                       // Also note that isRedirect() is unreliable because of bug 37209.
-                       $r['redirectcreated'] = '';
-               }
+               //NOTE: we assume that if the old title exists, it's because it was re-created as
+               // a redirect to the new title. This is not safe, but what we did before was
+               // even worse: we just determined whether a redirect should have been created,
+               // and reported that it was created if it should have, without any checks.
+               // Also note that isRedirect() is unreliable because of bug 37209.
+               $r['redirectcreated'] = $fromTitle->exists();
 
-               if ( $toTitleExists ) {
-                       $r['moveoverredirect'] = '';
-               }
+               $r['moveoverredirect'] = $toTitleExists;
 
                // Move the talk page
                if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
@@ -103,9 +99,7 @@ class ApiMove extends ApiBase {
                        if ( $status->isOK() ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
-                               if ( $toTalkExists ) {
-                                       $r['talkmoveoverredirect'] = '';
-                               }
+                               $r['talkmoveoverredirect'] = $toTalkExists;
                        } else {
                                // We're not gonna dieUsage() on failure, since we already changed something
                                $error = $this->getErrorFromStatus( $status );
@@ -120,12 +114,12 @@ class ApiMove extends ApiBase {
                if ( $params['movesubpages'] ) {
                        $r['subpages'] = $this->moveSubpages( $fromTitle, $toTitle,
                                $params['reason'], $params['noredirect'] );
-                       $result->setIndexedTagName( $r['subpages'], 'subpage' );
+                       ApiResult::setIndexedTagName( $r['subpages'], 'subpage' );
 
                        if ( $params['movetalk'] ) {
                                $r['subpages-talk'] = $this->moveSubpages( $fromTalk, $toTalk,
                                        $params['reason'], $params['noredirect'] );
-                               $result->setIndexedTagName( $r['subpages-talk'], 'subpage' );
+                               ApiResult::setIndexedTagName( $r['subpages-talk'], 'subpage' );
                        }
                }
 
index f24a03f..8c03dce 100644 (file)
@@ -212,6 +212,7 @@ class ApiOpenSearch extends ApiBase {
                switch ( $this->getFormat() ) {
                        case 'json':
                                // http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.1
+                               $result->addArrayType( null, 'array' );
                                $result->addValue( null, 0, strval( $search ) );
                                $terms = array();
                                $descriptions = array();
@@ -237,23 +238,24 @@ class ApiOpenSearch extends ApiBase {
                                );
                                $items = array();
                                foreach ( $results as $r ) {
-                                       $item = array();
-                                       $result->setContent( $item, $r['title']->getPrefixedText(), 'Text' );
-                                       $result->setContent( $item, $r['url'], 'Url' );
+                                       $item = array(
+                                               'Text' => $r['title']->getPrefixedText(),
+                                               'Url' => $r['url'],
+                                       );
                                        if ( is_string( $r['extract'] ) && $r['extract'] !== '' ) {
-                                               $result->setContent( $item, $r['extract'], 'Description' );
+                                               $item['Description'] = $r['extract'];
                                        }
                                        if ( is_array( $r['image'] ) && isset( $r['image']['source'] ) ) {
                                                $item['Image'] = array_intersect_key( $r['image'], $imageKeys );
                                        }
+                                       ApiResult::setSubelementsList( $item, array_keys( $item ) );
                                        $items[] = $item;
                                }
-                               $result->setIndexedTagName( $items, 'Item' );
+                               ApiResult::setIndexedTagName( $items, 'Item' );
                                $result->addValue( null, 'version', '2.0' );
                                $result->addValue( null, 'xmlns', 'http://opensearch.org/searchsuggest2' );
-                               $query = array();
-                               $result->setContent( $query, strval( $search ) );
-                               $result->addValue( null, 'Query', $query );
+                               $result->addValue( null, 'Query', strval( $search ) );
+                               $result->addSubelementsList( null, 'Query' );
                                $result->addValue( null, 'Section', $items );
                                break;
 
index d462862..e6f218d 100644 (file)
@@ -96,7 +96,7 @@ class ApiPageSet extends ApiBase {
                                $v = $val;
                        }
                        if ( $flag !== null ) {
-                               $v[$flag] = '';
+                               $v[$flag] = true;
                        }
                        $result[] = $v;
                }
@@ -442,7 +442,7 @@ class ApiPageSet extends ApiBase {
                        $values[] = $r;
                }
                if ( !empty( $values ) && $result ) {
-                       $result->setIndexedTagName( $values, 'r' );
+                       ApiResult::setIndexedTagName( $values, 'r' );
                }
 
                return $values;
@@ -473,7 +473,7 @@ class ApiPageSet extends ApiBase {
                        );
                }
                if ( !empty( $values ) && $result ) {
-                       $result->setIndexedTagName( $values, 'n' );
+                       ApiResult::setIndexedTagName( $values, 'n' );
                }
 
                return $values;
@@ -504,7 +504,7 @@ class ApiPageSet extends ApiBase {
                        );
                }
                if ( !empty( $values ) && $result ) {
-                       $result->setIndexedTagName( $values, 'c' );
+                       ApiResult::setIndexedTagName( $values, 'c' );
                }
 
                return $values;
@@ -541,7 +541,7 @@ class ApiPageSet extends ApiBase {
                        $values[] = $item;
                }
                if ( !empty( $values ) && $result ) {
-                       $result->setIndexedTagName( $values, 'i' );
+                       ApiResult::setIndexedTagName( $values, 'i' );
                }
 
                return $values;
@@ -633,7 +633,7 @@ class ApiPageSet extends ApiBase {
                        );
                }
                if ( !empty( $values ) && $result ) {
-                       $result->setIndexedTagName( $values, 'rev' );
+                       ApiResult::setIndexedTagName( $values, 'rev' );
                }
 
                return $values;
@@ -1188,17 +1188,20 @@ class ApiPageSet extends ApiBase {
         */
        public function populateGeneratorData( &$result, array $path = array() ) {
                if ( $result instanceof ApiResult ) {
-                       $data = $result->getData();
+                       $data = $result->getResultData( $path );
+                       if ( $data === null ) {
+                               return true;
+                       }
                } else {
                        $data = &$result;
-               }
-               foreach ( $path as $key ) {
-                       if ( !isset( $data[$key] ) ) {
-                               // Path isn't in $result, so nothing to add, so everything
-                               // "fits"
-                               return true;
+                       foreach ( $path as $key ) {
+                               if ( !isset( $data[$key] ) ) {
+                                       // Path isn't in $result, so nothing to add, so everything
+                                       // "fits"
+                                       return true;
+                               }
+                               $data = &$data[$key];
                        }
-                       $data = &$data[$key];
                }
                foreach ( $this->mGeneratorData as $ns => $dbkeys ) {
                        if ( $ns === -1 ) {
index f0a5daf..25069d9 100644 (file)
@@ -105,7 +105,7 @@ class ApiParamInfo extends ApiBase {
                $result->addValue( array( $this->getModuleName() ), 'helpformat', $this->helpFormat );
 
                foreach ( $res as $key => $stuff ) {
-                       $result->setIndexedTagName( $res[$key], 'module' );
+                       ApiResult::setIndexedTagName( $res[$key], 'module' );
                }
 
                if ( $params['mainmodule'] ) {
@@ -171,7 +171,7 @@ class ApiParamInfo extends ApiBase {
                                        }
                                        $res[$key][] = $a;
                                }
-                               $this->getResult()->setIndexedTagName( $res[$key], 'msg' );
+                               ApiResult::setIndexedTagName( $res[$key], 'msg' );
                                break;
                }
        }
@@ -195,17 +195,35 @@ class ApiParamInfo extends ApiBase {
                }
                $ret['prefix'] = $module->getModulePrefix();
 
+               $sourceInfo = $module->getModuleSourceInfo();
+               if ( $sourceInfo ) {
+                       $ret['source'] = $sourceInfo['name'];
+                       if ( isset( $sourceInfo['namemsg'] ) ) {
+                               $ret['sourcename'] = $this->context->msg( $sourceInfo['namemsg'] )->text();
+                       } else {
+                               $ret['sourcename'] = $ret['source'];
+                       }
+
+                       $link = SpecialPage::getTitleFor( 'Version', 'License/' . $sourceInfo['name'] )->getFullUrl();
+                       if ( isset( $sourceInfo['license-name'] ) ) {
+                               $ret['licensetag'] = $sourceInfo['license-name'];
+                               $ret['licenselink'] = (string)$link;
+                       } elseif ( SpecialVersion::getExtLicenseFileName( dirname( $sourceInfo['path'] ) ) ) {
+                               $ret['licenselink'] = (string)$link;
+                       }
+               }
+
                $this->formatHelpMessages( $ret, 'description', $module->getFinalDescription() );
 
                foreach ( $module->getHelpFlags() as $flag ) {
-                       $ret[$flag] = '';
+                       $ret[$flag] = true;
                }
 
                $ret['helpurls'] = (array)$module->getHelpUrls();
                if ( isset( $ret['helpurls'][0] ) && $ret['helpurls'][0] === false ) {
                        $ret['helpurls'] = array();
                }
-               $result->setIndexedTagName( $ret['helpurls'], 'helpurl' );
+               ApiResult::setIndexedTagName( $ret['helpurls'], 'helpurl' );
 
                if ( $this->helpFormat !== 'none' ) {
                        $ret['examples'] = array();
@@ -224,12 +242,12 @@ class ApiParamInfo extends ApiBase {
                                        if ( is_array( $item['description'] ) ) {
                                                $item['description'] = $item['description'][0];
                                        } else {
-                                               $result->setSubelements( $item, 'description' );
+                                               ApiResult::setSubelementsList( $item, 'description' );
                                        }
                                }
                                $ret['examples'][] = $item;
                        }
-                       $result->setIndexedTagName( $ret['examples'], 'example' );
+                       ApiResult::setIndexedTagName( $ret['examples'], 'example' );
                }
 
                $ret['parameters'] = array();
@@ -247,12 +265,10 @@ class ApiParamInfo extends ApiBase {
                                $this->formatHelpMessages( $item, 'description', $paramDesc[$name], true );
                        }
 
-                       if ( !empty( $settings[ApiBase::PARAM_REQUIRED] ) ) {
-                               $item['required'] = '';
-                       }
+                       $item['required'] = !empty( $settings[ApiBase::PARAM_REQUIRED] );
 
                        if ( !empty( $settings[ApiBase::PARAM_DEPRECATED] ) ) {
-                               $item['deprecated'] = '';
+                               $item['deprecated'] = true;
                        }
 
                        if ( $name === 'token' && $module->needsToken() ) {
@@ -289,8 +305,8 @@ class ApiParamInfo extends ApiBase {
                                }
                        }
 
-                       if ( !empty( $settings[ApiBase::PARAM_ISMULTI] ) ) {
-                               $item['multi'] = '';
+                       $item['multi'] = !empty( $settings[ApiBase::PARAM_ISMULTI] );
+                       if ( $item['multi'] ) {
                                $item['limit'] = $this->getMain()->canApiHighLimits() ?
                                        ApiBase::LIMIT_SML2 :
                                        ApiBase::LIMIT_SML1;
@@ -299,21 +315,21 @@ class ApiParamInfo extends ApiBase {
                        }
 
                        if ( !empty( $settings[ApiBase::PARAM_ALLOW_DUPLICATES] ) ) {
-                               $item['allowsduplicates'] = '';
+                               $item['allowsduplicates'] = true;
                        }
 
                        if ( isset( $settings[ApiBase::PARAM_TYPE] ) ) {
                                if ( $settings[ApiBase::PARAM_TYPE] === 'submodule' ) {
                                        $item['type'] = $module->getModuleManager()->getNames( $name );
                                        sort( $item['type'] );
-                                       $item['submodules'] = '';
+                                       $item['submodules'] = true;
                                } else {
                                        $item['type'] = $settings[ApiBase::PARAM_TYPE];
                                }
                                if ( is_array( $item['type'] ) ) {
                                        // To prevent sparse arrays from being serialized to JSON as objects
                                        $item['type'] = array_values( $item['type'] );
-                                       $result->setIndexedTagName( $item['type'], 't' );
+                                       ApiResult::setIndexedTagName( $item['type'], 't' );
                                }
                        }
                        if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
@@ -335,7 +351,7 @@ class ApiParamInfo extends ApiBase {
                                        );
                                        if ( count( $i ) ) {
                                                $info['values'] = $i;
-                                               $result->setIndexedTagName( $info['values'], 'v' );
+                                               ApiResult::setIndexedTagName( $info['values'], 'v' );
                                        }
                                        $this->formatHelpMessages( $info, 'text', array(
                                                $this->context->msg( "apihelp-{$path}-paraminfo-{$tag}" )
@@ -343,15 +359,15 @@ class ApiParamInfo extends ApiBase {
                                                        ->params( $this->context->getLanguage()->commaList( $i ) )
                                                        ->params( $module->getModulePrefix() )
                                        ) );
-                                       $result->setSubelements( $info, 'text' );
+                                       ApiResult::setSubelementsList( $info, 'text' );
                                        $item['info'][] = $info;
                                }
-                               $result->setIndexedTagName( $item['info'], 'i' );
+                               ApiResult::setIndexedTagName( $item['info'], 'i' );
                        }
 
                        $ret['parameters'][] = $item;
                }
-               $result->setIndexedTagName( $ret['parameters'], 'param' );
+               ApiResult::setIndexedTagName( $ret['parameters'], 'param' );
 
                return $ret;
        }
index 73bea83..fc004cf 100644 (file)
@@ -107,7 +107,10 @@ class ApiParse extends ApiBase {
                                $popts = $this->makeParserOptions( $pageObj, $params );
 
                                // If for some reason the "oldid" is actually the current revision, it may be cached
-                               if ( $rev->isCurrent() ) {
+                               // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than
+                               // checking $rev->isCurrent(), because $pageObj is what actually ends up being used,
+                               // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that.
+                               if ( $rev->getId() == $pageObj->getLatest() ) {
                                        // May get from/save to parser cache
                                        $p_result = $this->getParsedContent( $pageObj, $popts,
                                                $pageid, isset( $prop['wikitext'] ) );
@@ -124,7 +127,6 @@ class ApiParse extends ApiBase {
                        } else { // Not $oldid, but $pageid or $page
                                if ( $params['redirects'] ) {
                                        $reqParams = array(
-                                               'action' => 'query',
                                                'redirects' => '',
                                        );
                                        if ( !is_null( $pageid ) ) {
@@ -134,14 +136,12 @@ class ApiParse extends ApiBase {
                                        }
                                        $req = new FauxRequest( $reqParams );
                                        $main = new ApiMain( $req );
-                                       $main->execute();
-                                       $data = $main->getResultData();
-                                       $redirValues = isset( $data['query']['redirects'] )
-                                               ? $data['query']['redirects']
-                                               : array();
+                                       $pageSet = new ApiPageSet( $main );
+                                       $pageSet->execute();
+
                                        $to = $page;
-                                       foreach ( (array)$redirValues as $r ) {
-                                               $to = $r['to'];
+                                       foreach ( $pageSet->getRedirectTitles() as $title ) {
+                                               $to = $title->getFullText();
                                        }
                                        $pageParams = array( 'title' => $to );
                                } elseif ( !is_null( $pageid ) ) {
@@ -225,17 +225,17 @@ class ApiParse extends ApiBase {
                        if ( $params['onlypst'] ) {
                                // Build a result and bail out
                                $result_array = array();
-                               $result_array['text'] = array();
-                               ApiResult::setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
+                               $result_array['text'] = $this->pstContent->serialize( $format );
+                               $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
                                if ( isset( $prop['wikitext'] ) ) {
-                                       $result_array['wikitext'] = array();
-                                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                                       $result_array['wikitext'] = $this->content->serialize( $format );
+                                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'wikitext';
                                }
                                if ( !is_null( $params['summary'] ) ||
                                        ( !is_null( $params['sectiontitle'] ) && $this->section === 'new' )
                                ) {
-                                       $result_array['parsedsummary'] = array();
-                                       ApiResult::setContent( $result_array['parsedsummary'], $this->formatSummary( $titleObj, $params ) );
+                                       $result_array['parsedsummary'] = $this->formatSummary( $titleObj, $params );
+                                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'parsedsummary';
                                }
 
                                $result->addValue( null, $this->getModuleName(), $result_array );
@@ -268,15 +268,15 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['text'] ) ) {
-                       $result_array['text'] = array();
-                       ApiResult::setContent( $result_array['text'], $p_result->getText() );
+                       $result_array['text'] = $p_result->getText();
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
                }
 
                if ( !is_null( $params['summary'] ) ||
                        ( !is_null( $params['sectiontitle'] ) && $this->section === 'new' )
                ) {
-                       $result_array['parsedsummary'] = array();
-                       ApiResult::setContent( $result_array['parsedsummary'], $this->formatSummary( $titleObj, $params ) );
+                       $result_array['parsedsummary'] = $this->formatSummary( $titleObj, $params );
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'parsedsummary';
                }
 
                if ( isset( $prop['langlinks'] ) ) {
@@ -299,9 +299,8 @@ class ApiParse extends ApiBase {
                        $result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
                }
                if ( isset( $prop['categorieshtml'] ) ) {
-                       $categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
-                       $result_array['categorieshtml'] = array();
-                       ApiResult::setContent( $result_array['categorieshtml'], $categoriesHtml );
+                       $result_array['categorieshtml'] = $this->categoriesHtml( $p_result->getCategories() );
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'categorieshtml';
                }
                if ( isset( $prop['links'] ) ) {
                        $result_array['links'] = $this->formatLinks( $p_result->getLinks() );
@@ -341,11 +340,8 @@ class ApiParse extends ApiBase {
                        }
 
                        if ( isset( $prop['headhtml'] ) ) {
-                               $result_array['headhtml'] = array();
-                               ApiResult::setContent(
-                                       $result_array['headhtml'],
-                                       $context->getOutput()->headElement( $context->getSkin() )
-                               );
+                               $result_array['headhtml'] = $context->getOutput()->headElement( $context->getSkin() );
+                               $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml';
                        }
                }
 
@@ -357,11 +353,8 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['indicators'] ) ) {
-                       foreach ( $p_result->getIndicators() as $name => $content ) {
-                               $indicator = array( 'name' => $name );
-                               ApiResult::setContent( $indicator, $content );
-                               $result_array['indicators'][] = $indicator;
-                       }
+                       $result_array['indicators'] = (array)$p_result->getIndicators();
+                       ApiResult::setArrayType( $result_array['indicators'], 'BCkvp', 'name' );
                }
 
                if ( isset( $prop['iwlinks'] ) ) {
@@ -369,15 +362,16 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['wikitext'] ) ) {
-                       $result_array['wikitext'] = array();
-                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                       $result_array['wikitext'] = $this->content->serialize( $format );
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'wikitext';
                        if ( !is_null( $this->pstContent ) ) {
-                               $result_array['psttext'] = array();
-                               ApiResult::setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
+                               $result_array['psttext'] = $this->pstContent->serialize( $format );
+                               $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'psttext';
                        }
                }
                if ( isset( $prop['properties'] ) ) {
-                       $result_array['properties'] = $this->formatProperties( $p_result->getProperties() );
+                       $result_array['properties'] = (array)$p_result->getProperties();
+                       ApiResult::setArrayType( $result_array['properties'], 'BCkvp', 'name' );
                }
 
                if ( isset( $prop['limitreportdata'] ) ) {
@@ -385,9 +379,8 @@ class ApiParse extends ApiBase {
                                $this->formatLimitReportData( $p_result->getLimitReportData() );
                }
                if ( isset( $prop['limitreporthtml'] ) ) {
-                       $limitreportHtml = EditPage::getPreviewLimitReport( $p_result );
-                       $result_array['limitreporthtml'] = array();
-                       ApiResult::setContent( $result_array['limitreporthtml'], $limitreportHtml );
+                       $result_array['limitreporthtml'] = EditPage::getPreviewLimitReport( $p_result );
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'limitreporthtml';
                }
 
                if ( $params['generatexml'] ) {
@@ -402,8 +395,8 @@ class ApiParse extends ApiBase {
                        } else {
                                $xml = $dom->__toString();
                        }
-                       $result_array['parsetree'] = array();
-                       ApiResult::setContent( $result_array['parsetree'], $xml );
+                       $result_array['parsetree'] = $xml;
+                       $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'parsetree';
                }
 
                $result_mapping = array(
@@ -543,7 +536,7 @@ class ApiParse extends ApiBase {
                                // native language name
                                $entry['autonym'] = Language::fetchLanguageName( $title->getInterwiki() );
                        }
-                       ApiResult::setContent( $entry, $bits[1] );
+                       ApiResult::setContentValue( $entry, 'title', $bits[1] );
                        $result[] = $entry;
                }
 
@@ -578,11 +571,11 @@ class ApiParse extends ApiBase {
                foreach ( $links as $link => $sortkey ) {
                        $entry = array();
                        $entry['sortkey'] = $sortkey;
-                       ApiResult::setContent( $entry, $link );
+                       ApiResult::setContentValue( $entry, 'category', $link );
                        if ( !isset( $hiddencats[$link] ) ) {
-                               $entry['missing'] = '';
+                               $entry['missing'] = true;
                        } elseif ( $hiddencats[$link] ) {
-                               $entry['hidden'] = '';
+                               $entry['hidden'] = true;
                        }
                        $result[] = $entry;
                }
@@ -603,10 +596,8 @@ class ApiParse extends ApiBase {
                        foreach ( $nslinks as $title => $id ) {
                                $entry = array();
                                $entry['ns'] = $ns;
-                               ApiResult::setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
-                               if ( $id != 0 ) {
-                                       $entry['exists'] = '';
-                               }
+                               ApiResult::setContentValue( $entry, 'title', Title::makeTitle( $ns, $title )->getFullText() );
+                               $entry['exists'] = $id != 0;
                                $result[] = $entry;
                        }
                }
@@ -626,7 +617,7 @@ class ApiParse extends ApiBase {
                                        $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                }
 
-                               ApiResult::setContent( $entry, $title->getFullText() );
+                               ApiResult::setContentValue( $entry, 'title', $title->getFullText() );
                                $result[] = $entry;
                        }
                }
@@ -639,19 +630,7 @@ class ApiParse extends ApiBase {
                foreach ( $headItems as $tag => $content ) {
                        $entry = array();
                        $entry['tag'] = $tag;
-                       ApiResult::setContent( $entry, $content );
-                       $result[] = $entry;
-               }
-
-               return $result;
-       }
-
-       private function formatProperties( $properties ) {
-               $result = array();
-               foreach ( $properties as $name => $value ) {
-                       $entry = array();
-                       $entry['name'] = $name;
-                       ApiResult::setContent( $entry, $value );
+                       ApiResult::setContentValue( $entry, 'content', $content );
                        $result[] = $entry;
                }
 
@@ -663,7 +642,7 @@ class ApiParse extends ApiBase {
                foreach ( $css as $file => $link ) {
                        $entry = array();
                        $entry['file'] = $file;
-                       ApiResult::setContent( $entry, $link );
+                       ApiResult::setContentValue( $entry, 'link', $link );
                        $result[] = $entry;
                }
 
@@ -680,8 +659,7 @@ class ApiParse extends ApiBase {
                        if ( !is_array( $value ) ) {
                                $value = array( $value );
                        }
-                       $apiResult->setIndexedTagName( $value, 'param' );
-                       $apiResult->setIndexedTagName_recursive( $value, 'param' );
+                       ApiResult::setIndexedTagNameRecursive( $value, 'param' );
                        $entry = array_merge( $entry, $value );
                        $result[] = $entry;
                }
@@ -692,7 +670,7 @@ class ApiParse extends ApiBase {
        private function setIndexedTagNames( &$array, $mapping ) {
                foreach ( $mapping as $key => $name ) {
                        if ( isset( $array[$key] ) ) {
-                               $this->getResult()->setIndexedTagName( $array[$key], $name );
+                               ApiResult::setIndexedTagName( $array[$key], $name );
                        }
                }
        }
index 4736cfb..c07aaca 100644 (file)
@@ -29,6 +29,8 @@
  */
 class ApiProtect extends ApiBase {
        public function execute() {
+               global $wgContLang;
+
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
@@ -78,7 +80,7 @@ class ApiProtect extends ApiBase {
                        }
 
                        if ( wfIsInfinity( $expiry[$i] ) ) {
-                               $expiryarray[$p[0]] = $db->getInfinity();
+                               $expiryarray[$p[0]] = 'infinity';
                        } else {
                                $exp = strtotime( $expiry[$i] );
                                if ( $exp < 0 || !$exp ) {
@@ -93,10 +95,7 @@ class ApiProtect extends ApiBase {
                        }
                        $resultProtections[] = array(
                                $p[0] => $protections[$p[0]],
-                               'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity()
-                                       ? 'infinite'
-                                       : wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] )
-                               )
+                               'expiry' => $wgContLang->formatExpiry( $expiryarray[$p[0]], TS_ISO_8601, 'infinite' ),
                        );
                }
 
@@ -124,11 +123,11 @@ class ApiProtect extends ApiBase {
                        'reason' => $params['reason']
                );
                if ( $cascade ) {
-                       $res['cascade'] = '';
+                       $res['cascade'] = true;
                }
                $res['protections'] = $resultProtections;
                $result = $this->getResult();
-               $result->setIndexedTagName( $res['protections'], 'protection' );
+               ApiResult::setIndexedTagName( $res['protections'], 'protection' );
                $result->addValue( null, $this->getModuleName(), $res );
        }
 
index ec55137..a22be49 100644 (file)
@@ -38,7 +38,8 @@ class ApiPurge extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               $this->getResult()->beginContinuation( $params['continue'], array(), array() );
+               $continuationManager = new ApiContinuationManager( $this, array(), array() );
+               $this->setContinuationManager( $continuationManager );
 
                $forceLinkUpdate = $params['forcelinkupdate'];
                $forceRecursiveLinkUpdate = $params['forcerecursivelinkupdate'];
@@ -52,7 +53,7 @@ class ApiPurge extends ApiBase {
                        ApiQueryBase::addTitleInfo( $r, $title );
                        $page = WikiPage::factory( $title );
                        $page->doPurge(); // Directly purge and skip the UI part of purge().
-                       $r['purged'] = '';
+                       $r['purged'] = true;
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
                                if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
@@ -73,7 +74,7 @@ class ApiPurge extends ApiBase {
                                                $title, null, $forceRecursiveLinkUpdate, $p_result );
                                        DataUpdate::runUpdates( $updates );
 
-                                       $r['linkupdate'] = '';
+                                       $r['linkupdate'] = true;
 
                                        if ( $enableParserCache ) {
                                                $pcache = ParserCache::singleton();
@@ -89,7 +90,7 @@ class ApiPurge extends ApiBase {
                        $result[] = $r;
                }
                $apiResult = $this->getResult();
-               $apiResult->setIndexedTagName( $result, 'page' );
+               ApiResult::setIndexedTagName( $result, 'page' );
                $apiResult->addValue( null, $this->getModuleName(), $result );
 
                $values = $pageSet->getNormalizedTitlesAsResult( $apiResult );
@@ -105,7 +106,8 @@ class ApiPurge extends ApiBase {
                        $apiResult->addValue( null, 'redirects', $values );
                }
 
-               $apiResult->endContinuation();
+               $this->setContinuationManager( null );
+               $continuationManager->setContinuationIntoResult( $apiResult );
        }
 
        /**
index ac89419..082fccb 100644 (file)
@@ -257,11 +257,11 @@ class ApiQuery extends ApiBase {
                $this->instantiateModules( $allModules, 'meta' );
 
                // Filter modules based on continue parameter
-               list( $generatorDone, $modules ) = $this->getResult()->beginContinuation(
-                       $this->mParams['continue'], $allModules, $propModules
-               );
+               $continuationManager = new ApiContinuationManager( $this, $allModules, $propModules );
+               $this->setContinuationManager( $continuationManager );
+               $modules = $continuationManager->getRunModules();
 
-               if ( !$generatorDone ) {
+               if ( !$continuationManager->isGeneratorDone() ) {
                        // Query modules may optimize data requests through the $this->getPageSet()
                        // object by adding extra fields from the page table.
                        foreach ( $modules as $module ) {
@@ -291,12 +291,19 @@ class ApiQuery extends ApiBase {
                $this->getMain()->setCacheMode( $cacheMode );
 
                // Write the continuation data into the result
-               $this->getResult()->endContinuation(
-                       $this->mParams['continue'] === null ? 'raw' : 'standard'
-               );
+               $this->setContinuationManager( null );
+               if ( $this->mParams['continue'] === null ) {
+                       $data = $continuationManager->getRawContinuation();
+                       if ( $data ) {
+                               $this->getResult()->addValue( null, 'query-continue', $data,
+                                       ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
+                       }
+               } else {
+                       $continuationManager->setContinuationIntoResult( $this->getResult() );
+               }
 
                if ( $this->mParams['continue'] === null && !$this->mParams['rawcontinue'] &&
-                       array_key_exists( 'query-continue', $this->getResult()->getData() )
+                       $this->getResult()->getResultData( 'query-continue' ) !== null
                ) {
                        $this->logFeatureUsage( 'action=query&!rawcontinue&!continue' );
                        $this->setWarning(
@@ -396,18 +403,18 @@ class ApiQuery extends ApiBase {
                foreach ( $pageSet->getMissingTitles() as $fakeId => $title ) {
                        $vals = array();
                        ApiQueryBase::addTitleInfo( $vals, $title );
-                       $vals['missing'] = '';
+                       $vals['missing'] = true;
                        $pages[$fakeId] = $vals;
                }
                // Report any invalid titles
                foreach ( $pageSet->getInvalidTitles() as $fakeId => $title ) {
-                       $pages[$fakeId] = array( 'title' => $title, 'invalid' => '' );
+                       $pages[$fakeId] = array( 'title' => $title, 'invalid' => true );
                }
                // Report any missing page ids
                foreach ( $pageSet->getMissingPageIDs() as $pageid ) {
                        $pages[$pageid] = array(
                                'pageid' => $pageid,
-                               'missing' => ''
+                               'missing' => true
                        );
                }
                // Report special pages
@@ -415,15 +422,15 @@ class ApiQuery extends ApiBase {
                foreach ( $pageSet->getSpecialTitles() as $fakeId => $title ) {
                        $vals = array();
                        ApiQueryBase::addTitleInfo( $vals, $title );
-                       $vals['special'] = '';
+                       $vals['special'] = true;
                        if ( $title->isSpecialPage() &&
                                !SpecialPageFactory::exists( $title->getDBkey() )
                        ) {
-                               $vals['missing'] = '';
+                               $vals['missing'] = true;
                        } elseif ( $title->getNamespace() == NS_MEDIA &&
                                !wfFindFile( $title )
                        ) {
-                               $vals['missing'] = '';
+                               $vals['missing'] = true;
                        }
                        $pages[$fakeId] = $vals;
                }
@@ -438,16 +445,17 @@ class ApiQuery extends ApiBase {
 
                if ( count( $pages ) ) {
                        $pageSet->populateGeneratorData( $pages );
+                       ApiResult::setArrayType( $pages, 'BCarray' );
 
                        if ( $this->mParams['indexpageids'] ) {
                                $pageIDs = array_keys( $pages );
                                // json treats all map keys as strings - converting to match
                                $pageIDs = array_map( 'strval', $pageIDs );
-                               $result->setIndexedTagName( $pageIDs, 'id' );
+                               ApiResult::setIndexedTagName( $pageIDs, 'id' );
                                $fit = $fit && $result->addValue( 'query', 'pageids', $pageIDs );
                        }
 
-                       $result->setIndexedTagName( $pages, 'page' );
+                       ApiResult::setIndexedTagName( $pages, 'page' );
                        $fit = $fit && $result->addValue( 'query', 'pages', $pages );
                }
 
@@ -476,7 +484,7 @@ class ApiQuery extends ApiBase {
         */
        public function setGeneratorContinue( $module, $paramName, $paramValue ) {
                wfDeprecated( __METHOD__, '1.24' );
-               $this->getResult()->setGeneratorContinueParam( $module, $paramName, $paramValue );
+               $this->getContinuationManager()->addGeneratorContinueParam( $module, $paramName, $paramValue );
                return $this->getParameter( 'continue' ) !== null;
        }
 
@@ -518,9 +526,8 @@ class ApiQuery extends ApiBase {
                        $result->addValue( null, 'text', $exportxml, ApiResult::NO_SIZE_CHECK );
                        $result->addValue( null, 'mime', 'text/xml', ApiResult::NO_SIZE_CHECK );
                } else {
-                       $r = array();
-                       ApiResult::setContent( $r, $exportxml );
-                       $result->addValue( 'query', 'export', $r, ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( 'query', 'export', $exportxml, ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( 'query', ApiResult::META_BC_SUBELEMENTS, array( 'export' ) );
                }
        }
 
index 672c234..cc0b71a 100644 (file)
@@ -128,15 +128,15 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                $pages[] = $titleObj;
                        } else {
                                $item = array();
-                               ApiResult::setContent( $item, $titleObj->getText() );
+                               ApiResult::setContentValue( $item, 'category', $titleObj->getText() );
                                if ( isset( $prop['size'] ) ) {
                                        $item['size'] = intval( $row->cat_pages );
                                        $item['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
                                        $item['files'] = intval( $row->cat_files );
                                        $item['subcats'] = intval( $row->cat_subcats );
                                }
-                               if ( isset( $prop['hidden'] ) && $row->cat_hidden ) {
-                                       $item['hidden'] = '';
+                               if ( isset( $prop['hidden'] ) ) {
+                                       $item['hidden'] = (bool)$row->cat_hidden;
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $item );
                                if ( !$fit ) {
@@ -147,7 +147,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'c' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'c' );
                } else {
                        $resultPageSet->populateFromTitles( $pages );
                }
index 4e95f5b..4e4d2af 100644 (file)
@@ -319,7 +319,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                                'pageid' => $title->getArticleID(),
                                                'revisions' => array( $rev ),
                                        );
-                                       $result->setIndexedTagName( $a['revisions'], 'rev' );
+                                       ApiResult::setIndexedTagName( $a['revisions'], 'rev' );
                                        ApiQueryBase::addTitleInfo( $a, $title );
                                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), $index, $a );
                                } else {
@@ -348,7 +348,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                $resultPageSet->populateFromRevisionIDs( $generated );
                        }
                } else {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
                }
        }
 
index 6c962cd..381938b 100644 (file)
@@ -308,7 +308,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'img' );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
index a70d019..fadecfb 100644 (file)
@@ -200,7 +200,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        }
 
                        if ( is_null( $resultPageSet ) ) {
-                               $vals = array();
+                               $vals = array(
+                                       ApiResult::META_TYPE => 'assoc',
+                               );
                                if ( $fld_ids ) {
                                        $vals['fromid'] = intval( $row->pl_from );
                                }
@@ -230,7 +232,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $this->indexTag );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), $this->indexTag );
                } elseif ( $params['unique'] ) {
                        $resultPageSet->populateFromTitles( $titles );
                } else {
index 98552ba..44af83d 100644 (file)
@@ -146,7 +146,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                                        $messageIsCustomised = isset( $customisedMessages['pages'][$langObj->ucfirst( $message )] );
                                        if ( $customised === $messageIsCustomised ) {
                                                if ( $customised ) {
-                                                       $a['customised'] = '';
+                                                       $a['customised'] = true;
                                                }
                                        } else {
                                                continue;
@@ -156,7 +156,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                                $msg = wfMessage( $message, $args )->inLanguage( $langObj );
 
                                if ( !$msg->exists() ) {
-                                       $a['missing'] = '';
+                                       $a['missing'] = true;
                                } else {
                                        // Check if the parser is enabled:
                                        if ( $params['enableparser'] ) {
@@ -165,12 +165,12 @@ class ApiQueryAllMessages extends ApiQueryBase {
                                                $msgString = $msg->plain();
                                        }
                                        if ( !$params['nocontent'] ) {
-                                               ApiResult::setContent( $a, $msgString );
+                                               ApiResult::setContentValue( $a, 'content', $msgString );
                                        }
                                        if ( isset( $prop['default'] ) ) {
                                                $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
                                                if ( !$default->exists() ) {
-                                                       $a['defaultmissing'] = '';
+                                                       $a['defaultmissing'] = true;
                                                } elseif ( $default->plain() != $msgString ) {
                                                        $a['default'] = $default->plain();
                                                }
@@ -183,7 +183,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                                }
                        }
                }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'message' );
        }
 
        public function getCacheMode( $params ) {
index e243593..0149ad2 100644 (file)
@@ -234,7 +234,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'p' );
                }
        }
 
index 1c3f9fb..5168859 100644 (file)
@@ -48,11 +48,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $params = $this->extractRequestParams();
                $activeUserDays = $this->getConfig()->get( 'ActiveUserDays' );
 
-               if ( $params['activeusers'] ) {
-                       // Update active user cache
-                       SpecialActiveUsers::mergeActiveUsers( 300, $activeUserDays );
-               }
-
                $db = $this->getDB();
 
                $prop = $params['prop'];
@@ -100,7 +95,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                        // no group with the given right(s) exists, no need for a query
                        if ( !count( $groups ) ) {
-                               $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
+                               $this->getResult()->addIndexedTagName( array( 'query', $this->getModuleName() ), '' );
 
                                return;
                        }
@@ -253,7 +248,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                $data['blockexpiry'] = $row->ipb_expiry;
                        }
                        if ( $row->ipb_deleted ) {
-                               $data['hidden'] = '';
+                               $data['hidden'] = true;
                        }
                        if ( $fld_editcount ) {
                                $data['editcount'] = intval( $row->user_editcount );
@@ -279,17 +274,17 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                                if ( $fld_groups ) {
                                        $data['groups'] = $groups;
-                                       $result->setIndexedTagName( $data['groups'], 'g' );
+                                       ApiResult::setIndexedTagName( $data['groups'], 'g' );
                                }
 
                                if ( $fld_implicitgroups ) {
                                        $data['implicitgroups'] = $implicitGroups;
-                                       $result->setIndexedTagName( $data['implicitgroups'], 'g' );
+                                       ApiResult::setIndexedTagName( $data['implicitgroups'], 'g' );
                                }
 
                                if ( $fld_rights ) {
                                        $data['rights'] = User::getGroupPermissions( $groups );
-                                       $result->setIndexedTagName( $data['rights'], 'r' );
+                                       ApiResult::setIndexedTagName( $data['rights'], 'r' );
                                }
                        }
 
@@ -300,7 +295,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        }
                }
 
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'u' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'u' );
        }
 
        public function getCacheMode( $params ) {
index 5e17a5c..1df14e0 100644 (file)
@@ -194,7 +194,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                $a = array( 'pageid' => intval( $row->page_id ) );
                                ApiQueryBase::addTitleInfo( $a, $t );
                                if ( $row->page_is_redirect ) {
-                                       $a['redirect'] = '';
+                                       $a['redirect'] = true;
                                }
                                // Put all the results in an array first
                                $this->resultArr[$a['pageid']] = $a;
@@ -313,7 +313,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                $a['pageid'] = intval( $row->page_id );
                                ApiQueryBase::addTitleInfo( $a, Title::makeTitle( $row->page_namespace, $row->page_title ) );
                                if ( $row->page_is_redirect ) {
-                                       $a['redirect'] = '';
+                                       $a['redirect'] = true;
                                }
                                $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
                                // Put all the results in an array first
@@ -338,7 +338,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 
                if ( $this->params['limit'] == 'max' ) {
                        $this->params['limit'] = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
-                       $result->setParsedLimit( $this->getModuleName(), $this->params['limit'] );
+                       $result->addParsedLimit( $this->getModuleName(), $this->params['limit'] );
                } else {
                        $this->params['limit'] = intval( $this->params['limit'] );
                        $this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
@@ -426,7 +426,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        $data = array_map( function ( $arr ) use ( $result, $code ) {
                                if ( isset( $arr['redirlinks'] ) ) {
                                        $arr['redirlinks'] = array_values( $arr['redirlinks'] );
-                                       $result->setIndexedTagName( $arr['redirlinks'], $code );
+                                       ApiResult::setIndexedTagName( $arr['redirlinks'], $code );
                                }
                                return $arr;
                        }, array_values( $this->resultArr ) );
@@ -482,7 +482,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                                $hasRedirs = true;
                                        }
                                        if ( $hasRedirs ) {
-                                               $result->setIndexedTagName_internal(
+                                               $result->addIndexedTagName(
                                                        array( 'query', $this->getModuleName(), $idx, 'redirlinks' ),
                                                        $this->bl_code );
                                        }
@@ -494,7 +494,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                }
                        }
 
-                       $result->setIndexedTagName_internal(
+                       $result->addIndexedTagName(
                                array( 'query', $this->getModuleName() ),
                                $this->bl_code
                        );
index b4752ae..8e271e7 100644 (file)
@@ -287,8 +287,8 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                                if ( $fld_fragment && $row->rd_fragment !== null && $row->rd_fragment !== '' ) {
                                        $vals['fragment'] = $row->rd_fragment;
                                }
-                               if ( $fld_redirect && $row->page_is_redirect ) {
-                                       $vals['redirect'] = '';
+                               if ( $fld_redirect ) {
+                                       $vals['redirect'] = (bool)$row->page_is_redirect;
                                }
                                $fit = $this->addPageSubItem( $id, $vals );
                                if ( !$fit ) {
index 1d4cff9..89e92b8 100644 (file)
@@ -123,6 +123,7 @@ abstract class ApiQueryBase extends ApiBase {
         */
        public function selectNamedDB( $name, $db, $groups ) {
                $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
+               return $this->mDb;
        }
 
        /**
@@ -456,7 +457,7 @@ abstract class ApiQueryBase extends ApiBase {
         */
        protected function addPageSubItems( $pageId, $data ) {
                $result = $this->getResult();
-               $result->setIndexedTagName( $data, $this->getModulePrefix() );
+               ApiResult::setIndexedTagName( $data, $this->getModulePrefix() );
 
                return $result->addValue( array( 'query', 'pages', intval( $pageId ) ),
                        $this->getModuleName(),
@@ -481,7 +482,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( !$fit ) {
                        return false;
                }
-               $result->setIndexedTagName_internal( array( 'query', 'pages', $pageId,
+               $result->addIndexedTagName( array( 'query', 'pages', $pageId,
                        $this->getModuleName() ), $elemname );
 
                return true;
@@ -493,7 +494,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @param string|array $paramValue Parameter value
         */
        protected function setContinueEnumParameter( $paramName, $paramValue ) {
-               $this->getResult()->setContinueParam( $this, $paramName, $paramValue );
+               $this->getContinuationManager()->addContinueParam( $this, $paramName, $paramValue );
        }
 
        /**
@@ -710,7 +711,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
         */
        protected function setContinueEnumParameter( $paramName, $paramValue ) {
                if ( $this->mGeneratorPageSet !== null ) {
-                       $this->getResult()->setGeneratorContinueParam( $this, $paramName, $paramValue );
+                       $this->getContinuationManager()->addGeneratorContinueParam( $this, $paramName, $paramValue );
                } else {
                        parent::setContinueEnumParameter( $paramName, $paramValue );
                }
index f6bde41..4a7023b 100644 (file)
@@ -187,7 +187,9 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $this->setContinueEnumParameter( 'continue', "$row->ipb_timestamp|$row->ipb_id" );
                                break;
                        }
-                       $block = array();
+                       $block = array(
+                               ApiResult::META_TYPE => 'assoc',
+                       );
                        if ( $fld_id ) {
                                $block['id'] = $row->ipb_id;
                        }
@@ -218,27 +220,13 @@ class ApiQueryBlocks extends ApiQueryBase {
                        }
                        if ( $fld_flags ) {
                                // For clarity, these flags use the same names as their action=block counterparts
-                               if ( $row->ipb_auto ) {
-                                       $block['automatic'] = '';
-                               }
-                               if ( $row->ipb_anon_only ) {
-                                       $block['anononly'] = '';
-                               }
-                               if ( $row->ipb_create_account ) {
-                                       $block['nocreate'] = '';
-                               }
-                               if ( $row->ipb_enable_autoblock ) {
-                                       $block['autoblock'] = '';
-                               }
-                               if ( $row->ipb_block_email ) {
-                                       $block['noemail'] = '';
-                               }
-                               if ( $row->ipb_deleted ) {
-                                       $block['hidden'] = '';
-                               }
-                               if ( $row->ipb_allow_usertalk ) {
-                                       $block['allowusertalk'] = '';
-                               }
+                               $block['automatic'] = (bool)$row->ipb_auto;
+                               $block['anononly'] = (bool)$row->ipb_anon_only;
+                               $block['nocreate'] = (bool)$row->ipb_create_account;
+                               $block['autoblock'] = (bool)$row->ipb_enable_autoblock;
+                               $block['noemail'] = (bool)$row->ipb_block_email;
+                               $block['hidden'] = (bool)$row->ipb_deleted;
+                               $block['allowusertalk'] = (bool)$row->ipb_allow_usertalk;
                        }
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $block );
                        if ( !$fit ) {
@@ -246,7 +234,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                                break;
                        }
                }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'block' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'block' );
        }
 
        protected function prepareUsername( $user ) {
index 6aa714e..35fa56e 100644 (file)
@@ -150,8 +150,8 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                if ( isset( $prop['timestamp'] ) ) {
                                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->cl_timestamp );
                                }
-                               if ( isset( $prop['hidden'] ) && !is_null( $row->pp_propname ) ) {
-                                       $vals['hidden'] = '';
+                               if ( isset( $prop['hidden'] ) ) {
+                                       $vals['hidden'] = !is_null( $row->pp_propname );
                                }
 
                                $fit = $this->addPageSubItem( $row->cl_from, $vals );
index 5c67ebf..9f6c604 100644 (file)
@@ -86,9 +86,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                        $vals['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
                        $vals['files'] = intval( $row->cat_files );
                        $vals['subcats'] = intval( $row->cat_subcats );
-                       if ( $row->cat_hidden ) {
-                               $vals['hidden'] = '';
-                       }
+                       $vals['hidden'] = (bool)$row->cat_hidden;
                        $fit = $this->addPageSubItems( $catids[$row->cat_title], $vals );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', $row->cat_title );
index a6fc223..ec0c1d1 100644 (file)
@@ -246,7 +246,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        }
 
                        if ( is_null( $resultPageSet ) ) {
-                               $vals = array();
+                               $vals = array(
+                                       ApiResult::META_TYPE => 'assoc',
+                               );
                                if ( $fld_ids ) {
                                        $vals['pageid'] = intval( $row->page_id );
                                }
@@ -285,7 +287,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal(
+                       $result->addIndexedTagName(
                                array( 'query', $this->getModuleName() ), 'cm' );
                }
        }
index f46fb34..72a331f 100644 (file)
@@ -177,7 +177,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( $limit == 'max' ) {
                        $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
-                       $this->getResult()->setParsedLimit( $this->getModuleName(), $limit );
+                       $this->getResult()->addParsedLimit( $this->getModuleName(), $limit );
                }
 
                $this->validateLimit( 'limit', $limit, 1, $userMax, $botMax );
@@ -320,7 +320,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
                        if ( $fld_user || $fld_userid ) {
                                if ( $row->ar_deleted & Revision::DELETED_USER ) {
-                                       $rev['userhidden'] = '';
+                                       $rev['userhidden'] = true;
                                        $anyHidden = true;
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_USER, $user ) ) {
@@ -335,7 +335,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                        if ( $fld_comment || $fld_parsedcomment ) {
                                if ( $row->ar_deleted & Revision::DELETED_COMMENT ) {
-                                       $rev['commenthidden'] = '';
+                                       $rev['commenthidden'] = true;
                                        $anyHidden = true;
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_COMMENT, $user ) ) {
@@ -349,15 +349,15 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                }
                        }
 
-                       if ( $fld_minor && $row->ar_minor_edit == 1 ) {
-                               $rev['minor'] = '';
+                       if ( $fld_minor ) {
+                               $rev['minor'] = $row->ar_minor_edit == 1;
                        }
                        if ( $fld_len ) {
                                $rev['len'] = $row->ar_len;
                        }
                        if ( $fld_sha1 ) {
                                if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
-                                       $rev['sha1hidden'] = '';
+                                       $rev['sha1hidden'] = true;
                                        $anyHidden = true;
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
@@ -370,15 +370,15 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
                        if ( $fld_content ) {
                                if ( $row->ar_deleted & Revision::DELETED_TEXT ) {
-                                       $rev['texthidden'] = '';
+                                       $rev['texthidden'] = true;
                                        $anyHidden = true;
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
                                        if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
                                                // Pre-1.5 ar_text row (if condition from Revision::newFromArchiveRow)
-                                               ApiResult::setContent( $rev, Revision::getRevisionText( $row, 'ar_' ) );
+                                               ApiResult::setContentValue( $rev, 'text', Revision::getRevisionText( $row, 'ar_' ) );
                                        } else {
-                                               ApiResult::setContent( $rev, Revision::getRevisionText( $row ) );
+                                               ApiResult::setContentValue( $rev, 'text', Revision::getRevisionText( $row ) );
                                        }
                                }
                        }
@@ -386,7 +386,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( $fld_tags ) {
                                if ( $row->ts_tags ) {
                                        $tags = explode( ',', $row->ts_tags );
-                                       $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                                       ApiResult::setIndexedTagName( $tags, 'tag' );
                                        $rev['tags'] = $tags;
                                } else {
                                        $rev['tags'] = array();
@@ -394,14 +394,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        }
 
                        if ( $anyHidden && ( $row->ar_deleted & Revision::DELETED_RESTRICTED ) ) {
-                               $rev['suppressed'] = '';
+                               $rev['suppressed'] = true;
                        }
 
                        if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
                                $pageID = $newPageID++;
                                $pageMap[$row->ar_namespace][$row->ar_title] = $pageID;
                                $a['revisions'] = array( $rev );
-                               $result->setIndexedTagName( $a['revisions'], 'rev' );
+                               ApiResult::setIndexedTagName( $a['revisions'], 'rev' );
                                $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
                                ApiQueryBase::addTitleInfo( $a, $title );
                                if ( $fld_token ) {
@@ -425,7 +425,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                break;
                        }
                }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
        }
 
        public function isDeprecated() {
index 010f8d5..4d0bcfe 100644 (file)
@@ -137,11 +137,9 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                        $r = array(
                                                'name' => $dupName,
                                                'user' => $dupFile->getUser( 'text' ),
-                                               'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
+                                               'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() ),
+                                               'shared' => !$dupFile->isLocal(),
                                        );
-                                       if ( !$dupFile->isLocal() ) {
-                                               $r['shared'] = '';
-                                       }
                                        $fit = $this->addPageSubItem( $pageId, $r );
                                        if ( !$fit ) {
                                                $this->setContinueEnumParameter( 'continue', $image . '|' . $dupName );
index e77355b..3f65a19 100644 (file)
@@ -112,7 +112,9 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        }
 
                        if ( is_null( $resultPageSet ) ) {
-                               $vals = array();
+                               $vals = array(
+                                       ApiResult::META_TYPE => 'assoc',
+                               );
                                if ( $fld_ids ) {
                                        $vals['pageid'] = intval( $row->page_id );
                                }
@@ -139,7 +141,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ),
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ),
                                $this->getModulePrefix() );
                }
        }
index 6ddb6c8..ec3d9d2 100644 (file)
@@ -91,7 +91,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                        if ( $params['expandurl'] ) {
                                $to = wfExpandUrl( $to, PROTO_CANONICAL );
                        }
-                       ApiResult::setContent( $entry, $to );
+                       ApiResult::setContentValue( $entry, 'url', $to );
                        $fit = $this->addPageSubItem( $row->el_from, $entry );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
index 39c5902..9ad7e27 100644 (file)
@@ -55,7 +55,9 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
                $repos[] = array_intersect_key( $repoGroup->getLocalRepo()->getInfo(), $props );
 
                $result = $this->getResult();
-               $result->setIndexedTagName( $repos, 'repo' );
+               ApiResult::setIndexedTagName( $repos, 'repo' );
+               ApiResult::setArrayTypeRecursive( $repos, 'assoc' );
+               ApiResult::setArrayType( $repos, 'array' );
                $result->addValue( array( 'query' ), 'repos', $repos );
        }
 
index 6b92603..4d357a7 100644 (file)
@@ -218,17 +218,17 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        }
 
                        if ( $row->fa_deleted & File::DELETED_FILE ) {
-                               $file['filehidden'] = '';
+                               $file['filehidden'] = true;
                        }
                        if ( $row->fa_deleted & File::DELETED_COMMENT ) {
-                               $file['commenthidden'] = '';
+                               $file['commenthidden'] = true;
                        }
                        if ( $row->fa_deleted & File::DELETED_USER ) {
-                               $file['userhidden'] = '';
+                               $file['userhidden'] = true;
                        }
                        if ( $row->fa_deleted & File::DELETED_RESTRICTED ) {
                                // This file is deleted for normal admins
-                               $file['suppressed'] = '';
+                               $file['suppressed'] = true;
                        }
 
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
@@ -240,7 +240,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        }
                }
 
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'fa' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'fa' );
        }
 
        public function getAllowedParams() {
index a2af124..618387d 100644 (file)
@@ -132,7 +132,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                ApiQueryBase::addTitleInfo( $entry, $title );
 
                                if ( $row->page_is_redirect ) {
-                                       $entry['redirect'] = '';
+                                       $entry['redirect'] = true;
                                }
 
                                if ( $iwprefix ) {
@@ -155,7 +155,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'iw' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'iw' );
                } else {
                        $resultPageSet->populateFromTitles( $pages );
                }
index c1208cb..aca3f70 100644 (file)
@@ -129,7 +129,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                }
                        }
 
-                       ApiResult::setContent( $entry, $row->iwl_title );
+                       ApiResult::setContentValue( $entry, 'title', $row->iwl_title );
                        $fit = $this->addPageSubItem( $row->iwl_from, $entry );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter(
index c4ca5d6..94b4bbd 100644 (file)
@@ -373,7 +373,9 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        );
                }
                $version = $opts['version'];
-               $vals = array();
+               $vals = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
                // Timestamp is shown even if the file is revdelete'd in interface
                // so do same here.
                if ( isset( $prop['timestamp'] ) ) {
@@ -397,7 +399,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                if ( $user || $userid ) {
                        if ( $file->isDeleted( File::DELETED_USER ) ) {
-                               $vals['userhidden'] = '';
+                               $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $canShowField( File::DELETED_USER ) ) {
@@ -408,7 +410,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        $vals['userid'] = $file->getUser( 'id' );
                                }
                                if ( !$file->getUser( 'id' ) ) {
-                                       $vals['anon'] = '';
+                                       $vals['anon'] = true;
                                }
                        }
                }
@@ -438,7 +440,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                if ( $pcomment || $comment ) {
                        if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $canShowField( File::DELETED_COMMENT ) ) {
@@ -469,7 +471,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                       $vals['filehidden'] = '';
+                       $vals['filehidden'] = true;
                        $anyHidden = true;
                }
 
@@ -599,7 +601,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                $retval[] = $r;
                        }
                }
-               $result->setIndexedTagName( $retval, 'metadata' );
+               ApiResult::setIndexedTagName( $retval, 'metadata' );
 
                return $retval;
        }
index 5af44ee..66178d4 100644 (file)
@@ -395,10 +395,10 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['length'] = intval( $this->pageLength[$pageid] );
 
                        if ( isset( $this->pageIsRedir[$pageid] ) && $this->pageIsRedir[$pageid] ) {
-                               $pageInfo['redirect'] = '';
+                               $pageInfo['redirect'] = true;
                        }
                        if ( $this->pageIsNew[$pageid] ) {
-                               $pageInfo['new'] = '';
+                               $pageInfo['new'] = true;
                        }
                }
 
@@ -421,18 +421,18 @@ class ApiQueryInfo extends ApiQueryBase {
                                $pageInfo['protection'] =
                                        $this->protections[$ns][$dbkey];
                        }
-                       $this->getResult()->setIndexedTagName( $pageInfo['protection'], 'pr' );
+                       ApiResult::setIndexedTagName( $pageInfo['protection'], 'pr' );
 
                        $pageInfo['restrictiontypes'] = array();
                        if ( isset( $this->restrictionTypes[$ns][$dbkey] ) ) {
                                $pageInfo['restrictiontypes'] =
                                        $this->restrictionTypes[$ns][$dbkey];
                        }
-                       $this->getResult()->setIndexedTagName( $pageInfo['restrictiontypes'], 'rt' );
+                       ApiResult::setIndexedTagName( $pageInfo['restrictiontypes'], 'rt' );
                }
 
-               if ( $this->fld_watched && isset( $this->watched[$ns][$dbkey] ) ) {
-                       $pageInfo['watched'] = '';
+               if ( $this->fld_watched ) {
+                       $pageInfo['watched'] = isset( $this->watched[$ns][$dbkey] );
                }
 
                if ( $this->fld_watchers ) {
@@ -464,8 +464,8 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['editurl'] = wfExpandUrl( $title->getFullURL( 'action=edit' ), PROTO_CURRENT );
                        $pageInfo['canonicalurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CANONICAL );
                }
-               if ( $this->fld_readable && $title->userCan( 'read', $this->getUser() ) ) {
-                       $pageInfo['readable'] = '';
+               if ( $this->fld_readable ) {
+                       $pageInfo['readable'] = $title->userCan( 'read', $this->getUser() );
                }
 
                if ( $this->fld_preload ) {
@@ -497,9 +497,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $pageInfo['actions'] = array();
                        foreach ( $this->params['testactions'] as $action ) {
                                $this->countTestedActions++;
-                               if ( $title->userCan( $action, $user ) ) {
-                                       $pageInfo['actions'][$action] = '';
-                               }
+                               $pageInfo['actions'][$action] = $title->userCan( $action, $user );
                        }
                }
 
@@ -532,7 +530,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                        'expiry' => $wgContLang->formatExpiry( $row->pr_expiry, TS_ISO_8601 )
                                );
                                if ( $row->pr_cascade ) {
-                                       $a['cascade'] = '';
+                                       $a['cascade'] = true;
                                }
                                $this->protections[$title->getNamespace()][$title->getDBkey()][] = $a;
                        }
index b41b4b7..7be18b2 100644 (file)
@@ -131,7 +131,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                ApiQueryBase::addTitleInfo( $entry, $title );
 
                                if ( $row->page_is_redirect ) {
-                                       $entry['redirect'] = '';
+                                       $entry['redirect'] = true;
                                }
 
                                if ( $lllang ) {
@@ -154,7 +154,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'll' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'll' );
                } else {
                        $resultPageSet->populateFromTitles( $pages );
                }
index 2d03347..5919ee9 100644 (file)
@@ -124,7 +124,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        if ( isset( $prop['autonym'] ) ) {
                                $entry['autonym'] = Language::fetchLanguageName( $row->ll_lang );
                        }
-                       ApiResult::setContent( $entry, $row->ll_title );
+                       ApiResult::setContentValue( $entry, 'title', $row->ll_title );
                        $fit = $this->addPageSubItem( $row->ll_from, $entry );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', "{$row->ll_from}|{$row->ll_lang}" );
index adf96fd..7b2381f 100644 (file)
@@ -230,19 +230,17 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        }
 
                        $vals = $this->extractRowInfo( $row );
-                       if ( !$vals ) {
-                               continue;
-                       }
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'continue', "$row->log_timestamp|$row->log_id" );
                                break;
                        }
                }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'item' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'item' );
        }
 
        /**
+        * @deprecated since 1.25 Use LogFormatter::formatParametersForApi instead
         * @param ApiResult $result
         * @param array $vals
         * @param string $params
@@ -255,149 +253,23 @@ class ApiQueryLogEvents extends ApiQueryBase {
        public static function addLogParams( $result, &$vals, $params, $type,
                $action, $ts, $legacy = false
        ) {
-               switch ( $type ) {
-                       case 'move':
-                               if ( $legacy ) {
-                                       $targetKey = 0;
-                                       $noredirKey = 1;
-                               } else {
-                                       $targetKey = '4::target';
-                                       $noredirKey = '5::noredir';
-                               }
+               wfDeprecated( __METHOD__, '1.25' );
 
-                               if ( isset( $params[$targetKey] ) ) {
-                                       $title = Title::newFromText( $params[$targetKey] );
-                                       if ( $title ) {
-                                               $vals2 = array();
-                                               ApiQueryBase::addTitleInfo( $vals2, $title, 'new_' );
-                                               $vals[$type] = $vals2;
-                                       }
-                               }
-                               if ( isset( $params[$noredirKey] ) && $params[$noredirKey] ) {
-                                       $vals[$type]['suppressedredirect'] = '';
-                               }
-                               $params = null;
-                               break;
-                       case 'patrol':
-                               if ( $legacy ) {
-                                       $cur = 0;
-                                       $prev = 1;
-                                       $auto = 2;
-                               } else {
-                                       $cur = '4::curid';
-                                       $prev = '5::previd';
-                                       $auto = '6::auto';
-                               }
-                               $vals2 = array();
-                               $vals2['cur'] = $params[$cur];
-                               $vals2['prev'] = $params[$prev];
-                               $vals2['auto'] = $params[$auto];
-                               $vals[$type] = $vals2;
-                               $params = null;
-                               break;
-                       case 'rights':
-                               $vals2 = array();
-                               if ( $legacy ) {
-                                       list( $vals2['old'], $vals2['new'] ) = $params;
-                               } else {
-                                       $vals2['new'] = implode( ', ', $params['5::newgroups'] );
-                                       $vals2['old'] = implode( ', ', $params['4::oldgroups'] );
-                               }
-                               $vals[$type] = $vals2;
-                               $params = null;
-                               break;
-                       case 'block':
-                               if ( $action == 'unblock' ) {
-                                       break;
-                               }
-                               if ( $legacy ) {
-                                       $durationKey = 0;
-                                       $flagsKey = 1;
-                               } else {
-                                       $durationKey = '5::duration';
-                                       $flagsKey = '6::flags';
-                               }
-                               $vals2 = array();
-                               $vals2['duration'] = $params[$durationKey];
-                               $vals2['flags'] = isset( $params[$flagsKey] ) ? $params[$flagsKey] : '';
-
-                               // Indefinite blocks have no expiry time
-                               if ( SpecialBlock::parseExpiryInput( $params[$durationKey] ) !== wfGetDB( DB_SLAVE )->getInfinity() ) {
-                                       $vals2['expiry'] = wfTimestamp( TS_ISO_8601,
-                                               strtotime( $params[$durationKey], wfTimestamp( TS_UNIX, $ts ) ) );
-                               }
-                               $vals[$type] = $vals2;
-                               $params = null;
-                               break;
-                       case 'upload':
-                               if ( isset( $params['img_timestamp'] ) ) {
-                                       $params['img_timestamp'] = wfTimestamp( TS_ISO_8601, $params['img_timestamp'] );
-                               }
-                               break;
-                       case 'merge':
-                               // replace the named parameter with numbered for backward compatibility
-                               if ( isset( $params['4::dest'] ) ) {
-                                       $params[] = $params['4::dest'];
-                                       unset( $params['4::dest'] );
-                               }
-                               if ( isset( $params['5::mergepoint'] ) ) {
-                                       $params[] = $params['5::mergepoint'];
-                                       unset( $params['5::mergepoint'] );
-                               }
-                               break;
-                       case 'delete':
-                               if ( $action === 'event' || $action === 'revision' ) {
-                                       // replace the named parameter with numbered for backward compatibility
-                                       if ( $action === 'event' ) {
-                                               $idsKey = '4::ids';
-                                               $ofieldKey = '5::ofield';
-                                               $nfieldKey = '6::nfield';
-                                       } else {
-                                               if ( isset( $params['4::type'] ) ) {
-                                                       $params[] = $params['4::type'];
-                                                       unset( $params['4::type'] );
-                                               }
-                                               $idsKey = '5::ids';
-                                               $ofieldKey = '6::ofield';
-                                               $nfieldKey = '7::nfield';
-                                       }
-                                       if ( isset( $params[$idsKey] ) ) {
-                                               $params[] = implode( ',', $params[$idsKey] );
-                                               unset( $params[$idsKey] );
-                                       }
-                                       if ( isset( $params[$ofieldKey] ) ) {
-                                               $params[] = $params[$ofieldKey];
-                                               unset( $params[$ofieldKey] );
-                                       }
-                                       if ( isset( $params[$nfieldKey] ) ) {
-                                               $params[] = $params[$nfieldKey];
-                                               unset( $params[$nfieldKey] );
-                                       }
-                               }
-                               break;
-               }
-               if ( !is_null( $params ) ) {
-                       $logParams = array();
-                       // Keys like "4::paramname" can't be used for output so we change them to "paramname"
-                       foreach ( $params as $key => $value ) {
-                               if ( strpos( $key, ':' ) === false ) {
-                                       $logParams[$key] = $value;
-                                       continue;
-                               }
-                               $logParam = explode( ':', $key, 3 );
-                               $logParams[$logParam[2]] = $value;
-                       }
-                       $result->setIndexedTagName( $logParams, 'param' );
-                       $result->setIndexedTagName_recursive( $logParams, 'param' );
-                       $vals = array_merge( $vals, $logParams );
-               }
+               $entry = new ManualLogEntry( $type, $action );
+               $entry->setParameters( $params );
+               $entry->setTimestamp( $ts );
+               $entry->setLegacy( $legacy );
+               $formatter = LogFormatter::newFromEntry( $entry );
+               $vals['params'] = $formatter->formatParametersForApi();
 
                return $vals;
        }
 
        private function extractRowInfo( $row ) {
                $logEntry = DatabaseLogEntry::newFromRow( $row );
-               $vals = array();
+               $vals = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
                $anyHidden = false;
                $user = $this->getUser();
 
@@ -411,7 +283,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( $this->fld_title || $this->fld_ids || $this->fld_details && $row->log_params !== '' ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_ACTION ) ) {
-                               $vals['actionhidden'] = '';
+                               $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCan( $row, LogPage::DELETED_ACTION, $user ) ) {
@@ -422,16 +294,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                        $vals['pageid'] = intval( $row->page_id );
                                        $vals['logpage'] = intval( $row->log_page );
                                }
-                               if ( $this->fld_details && $row->log_params !== '' ) {
-                                       self::addLogParams(
-                                               $this->getResult(),
-                                               $vals,
-                                               $logEntry->getParameters(),
-                                               $logEntry->getType(),
-                                               $logEntry->getSubtype(),
-                                               $logEntry->getTimestamp(),
-                                               $logEntry->isLegacy()
-                                       );
+                               if ( $this->fld_details ) {
+                                       $vals['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi();
                                }
                        }
                }
@@ -443,7 +307,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
-                               $vals['userhidden'] = '';
+                               $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCan( $row, LogPage::DELETED_USER, $user ) ) {
@@ -455,7 +319,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                }
 
                                if ( !$row->log_user ) {
-                                       $vals['anon'] = '';
+                                       $vals['anon'] = true;
                                }
                        }
                }
@@ -465,7 +329,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->log_comment ) ) {
                        if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCan( $row, LogPage::DELETED_COMMENT, $user ) ) {
@@ -482,7 +346,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ( $this->fld_tags ) {
                        if ( $row->ts_tags ) {
                                $tags = explode( ',', $row->ts_tags );
-                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                               ApiResult::setIndexedTagName( $tags, 'tag' );
                                $vals['tags'] = $tags;
                        } else {
                                $vals['tags'] = array();
@@ -490,7 +354,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                if ( $anyHidden && LogEventsList::isDeleted( $row, LogPage::DELETED_RESTRICTED ) ) {
-                       $vals['suppressed'] = '';
+                       $vals['suppressed'] = true;
                }
 
                return $vals;
index 035f901..dc10c91 100644 (file)
@@ -205,7 +205,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
         * @param array $serializedResults
         */
        protected function setIndexedTagNames( array &$serializedResults ) {
-               $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() );
+               ApiResult::setIndexedTagName( $serializedResults, $this->getRowName() );
        }
 
        /**
index 026f061..11a29ff 100644 (file)
@@ -78,7 +78,7 @@ class ApiQueryPagePropNames extends ApiQueryBase {
                        }
                }
 
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'p' );
        }
 
        public function getAllowedParams() {
index 8c89a60..87f90c5 100644 (file)
@@ -110,6 +110,7 @@ class ApiQueryPageProps extends ApiQueryBase {
         * @return bool True if it fits in the result
         */
        private function addPageProps( $result, $page, $props ) {
+               ApiResult::setArrayType( $props, 'assoc' );
                $fit = $result->addValue( array( 'query', 'pages', $page ), 'pageprops', $props );
 
                if ( !$fit ) {
index 6ffe0ae..7bcaf24 100644 (file)
@@ -99,7 +99,9 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                        }
 
                        if ( $resultPageSet === null ) {
-                               $vals = array();
+                               $vals = array(
+                                       ApiResult::META_TYPE => 'assoc',
+                               );
                                if ( $fld_ids ) {
                                        $vals['pageid'] = (int)$row->page_id;
                                }
@@ -121,7 +123,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                }
 
                if ( $resultPageSet === null ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
                }
        }
 
index 7a31c48..8eb644f 100644 (file)
@@ -69,7 +69,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                                        'title' => $title->getPrefixedText(),
                                );
                                if ( $title->isSpecialPage() ) {
-                                       $vals['special'] = '';
+                                       $vals['special'] = true;
                                } else {
                                        $vals['pageid'] = intval( $title->getArticleId() );
                                }
@@ -79,7 +79,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                                        break;
                                }
                        }
-                       $result->setIndexedTagName_internal(
+                       $result->addIndexedTagName(
                                array( 'query', $this->getModuleName() ), $this->getModulePrefix()
                        );
                }
index f1e6d01..fb65e5e 100644 (file)
@@ -156,7 +156,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal(
+                       $result->addIndexedTagName(
                                array( 'query', $this->getModuleName() ),
                                $this->getModulePrefix()
                        );
index 74586bb..650ac8f 100644 (file)
@@ -68,9 +68,9 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                $r = array( 'name' => $params['page'] );
                if ( $qp->isCached() ) {
                        if ( !$qp->isCacheable() ) {
-                               $r['disabled'] = '';
+                               $r['disabled'] = true;
                        } else {
-                               $r['cached'] = '';
+                               $r['cached'] = true;
                                $ts = $qp->getCachedTimestamp();
                                if ( $ts ) {
                                        $r['cachedtimestamp'] = wfTimestamp( TS_ISO_8601, $ts );
@@ -119,7 +119,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                        }
                }
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal(
+                       $result->addIndexedTagName(
                                array( 'query', $this->getModuleName(), 'results' ),
                                'page'
                        );
index 282f498..a2c2844 100644 (file)
@@ -131,7 +131,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'page' );
                }
        }
 
index aa22264..f6a6478 100644 (file)
@@ -384,9 +384,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                $vals = $this->extractRowInfo( $row );
 
                                /* Add that row's data to our final output. */
-                               if ( !$vals ) {
-                                       continue;
-                               }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
                                        $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" );
@@ -399,7 +396,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( is_null( $resultPageSet ) ) {
                        /* Format the result */
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'rc' );
+                       $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'rc' );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
@@ -428,7 +425,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Create a new entry in the result for the title. */
                if ( $this->fld_title || $this->fld_ids ) {
                        if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) {
-                               $vals['actionhidden'] = '';
+                               $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $type !== RC_LOG ||
@@ -452,7 +449,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Add user data and 'anon' flag, if user is anonymous. */
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( $row->rc_deleted & Revision::DELETED_USER ) {
-                               $vals['userhidden'] = '';
+                               $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) {
@@ -465,22 +462,16 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                }
 
                                if ( !$row->rc_user ) {
-                                       $vals['anon'] = '';
+                                       $vals['anon'] = true;
                                }
                        }
                }
 
                /* Add flags, such as new, minor, bot. */
                if ( $this->fld_flags ) {
-                       if ( $row->rc_bot ) {
-                               $vals['bot'] = '';
-                       }
-                       if ( $row->rc_type == RC_NEW ) {
-                               $vals['new'] = '';
-                       }
-                       if ( $row->rc_minor ) {
-                               $vals['minor'] = '';
-                       }
+                       $vals['bot'] = (bool)$row->rc_bot;
+                       $vals['new'] = $row->rc_type == RC_NEW;
+                       $vals['minor'] = (bool)$row->rc_minor;
                }
 
                /* Add sizes of each revision. (Only available on 1.10+) */
@@ -497,7 +488,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Add edit summary / log summary. */
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
                        if ( $row->rc_deleted & Revision::DELETED_COMMENT ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
                        if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) {
@@ -512,46 +503,32 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                }
 
                if ( $this->fld_redirect ) {
-                       if ( $row->page_is_redirect ) {
-                               $vals['redirect'] = '';
-                       }
+                       $vals['redirect'] = (bool)$row->page_is_redirect;
                }
 
                /* Add the patrolled flag */
-               if ( $this->fld_patrolled && $row->rc_patrolled == 1 ) {
-                       $vals['patrolled'] = '';
-               }
-
-               if ( $this->fld_patrolled && ChangesList::isUnpatrolled( $row, $user ) ) {
-                       $vals['unpatrolled'] = '';
+               if ( $this->fld_patrolled ) {
+                       $vals['patrolled'] = $row->rc_patrolled == 1;
+                       $vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user );
                }
 
                if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
                        if ( $row->rc_deleted & LogPage::DELETED_ACTION ) {
-                               $vals['actionhidden'] = '';
+                               $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) {
                                $vals['logid'] = intval( $row->rc_logid );
                                $vals['logtype'] = $row->rc_log_type;
                                $vals['logaction'] = $row->rc_log_action;
-                               $logEntry = DatabaseLogEntry::newFromRow( $row );
-                               ApiQueryLogEvents::addLogParams(
-                                       $this->getResult(),
-                                       $vals,
-                                       $logEntry->getParameters(),
-                                       $logEntry->getType(),
-                                       $logEntry->getSubtype(),
-                                       $logEntry->getTimestamp(),
-                                       $logEntry->isLegacy()
-                               );
+                               $vals['logparams'] = LogFormatter::newFromRow( $row )->formatParametersForApi();
                        }
                }
 
                if ( $this->fld_tags ) {
                        if ( $row->ts_tags ) {
                                $tags = explode( ',', $row->ts_tags );
-                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                               ApiResult::setIndexedTagName( $tags, 'tag' );
                                $vals['tags'] = $tags;
                        } else {
                                $vals['tags'] = array();
@@ -560,7 +537,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                if ( $this->fld_sha1 && $row->rev_sha1 !== null ) {
                        if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
-                               $vals['sha1hidden'] = '';
+                               $vals['sha1hidden'] = true;
                                $anyHidden = true;
                        }
                        if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_TEXT, $user ) ) {
@@ -586,7 +563,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                }
 
                if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) {
-                       $vals['suppressed'] = '';
+                       $vals['suppressed'] = true;
                }
 
                return $vals;
index 281f838..64f6120 100644 (file)
@@ -138,7 +138,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                if ( $this->limit == 'max' ) {
                        $this->limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
                        if ( $this->setParsedLimit ) {
-                               $this->getResult()->setParsedLimit( $this->getModuleName(), $this->limit );
+                               $this->getResult()->addParsedLimit( $this->getModuleName(), $this->limit );
                        }
                }
 
@@ -168,13 +168,13 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                }
 
-               if ( $this->fld_flags && $revision->isMinor() ) {
-                       $vals['minor'] = '';
+               if ( $this->fld_flags ) {
+                       $vals['minor'] = $revision->isMinor();
                }
 
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( $revision->isDeleted( Revision::DELETED_USER ) ) {
-                               $vals['userhidden'] = '';
+                               $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $revision->userCan( Revision::DELETED_USER, $user ) ) {
@@ -183,7 +183,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                }
                                $userid = $revision->getUser( Revision::RAW );
                                if ( !$userid ) {
-                                       $vals['anon'] = '';
+                                       $vals['anon'] = true;
                                }
 
                                if ( $this->fld_userid ) {
@@ -206,7 +206,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                if ( $this->fld_sha1 ) {
                        if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $vals['sha1hidden'] = '';
+                               $vals['sha1hidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
@@ -224,7 +224,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
                        if ( $revision->isDeleted( Revision::DELETED_COMMENT ) ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $revision->userCan( Revision::DELETED_COMMENT, $user ) ) {
@@ -243,7 +243,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                if ( $this->fld_tags ) {
                        if ( $row->ts_tags ) {
                                $tags = explode( ',', $row->ts_tags );
-                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                               ApiResult::setIndexedTagName( $tags, 'tag' );
                                $vals['tags'] = $tags;
                        } else {
                                $vals['tags'] = array();
@@ -267,10 +267,10 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                }
                        }
                        if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $vals['texthidden'] = '';
+                               $vals['texthidden'] = true;
                                $anyHidden = true;
                        } elseif ( !$content ) {
-                               $vals['textmissing'] = '';
+                               $vals['textmissing'] = true;
                        }
                }
                if ( $this->fld_content && $content ) {
@@ -293,7 +293,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        }
                                        $vals['parsetree'] = $xml;
                                } else {
-                                       $vals['badcontentformatforparsetree'] = '';
+                                       $vals['badcontentformatforparsetree'] = true;
                                        $this->setWarning( "Conversion to XML is supported for wikitext only, " .
                                                $title->getPrefixedDBkey() .
                                                " uses content model " . $content->getModel() );
@@ -314,7 +314,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $this->setWarning( "Template expansion is supported for wikitext only, " .
                                                $title->getPrefixedDBkey() .
                                                " uses content model " . $content->getModel() );
-                                       $vals['badcontentformat'] = '';
+                                       $vals['badcontentformat'] = true;
                                        $text = false;
                                }
                        }
@@ -335,7 +335,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $name = $title->getPrefixedDBkey();
                                        $this->setWarning( "The requested format {$this->contentFormat} is not " .
                                                "supported for content model $model used by $name" );
-                                       $vals['badcontentformat'] = '';
+                                       $vals['badcontentformat'] = true;
                                        $text = false;
                                } else {
                                        $text = $content->serialize( $format );
@@ -347,7 +347,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
 
                        if ( $text !== false ) {
-                               ApiResult::setContent( $vals, $text );
+                               ApiResult::setContentValue( $vals, 'content', $text );
                        }
                }
 
@@ -369,7 +369,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                $name = $title->getPrefixedDBkey();
                                                $this->setWarning( "The requested format {$this->contentFormat} is not " .
                                                        "supported for content model $model used by $name" );
-                                               $vals['diff']['badcontentformat'] = '';
+                                               $vals['diff']['badcontentformat'] = true;
                                                $engine = null;
                                        } else {
                                                $difftocontent = ContentHandler::makeContent(
@@ -389,18 +389,18 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                }
                                if ( $engine ) {
                                        $difftext = $engine->getDiffBody();
-                                       ApiResult::setContent( $vals['diff'], $difftext );
+                                       ApiResult::setContentValue( $vals['diff'], 'body', $difftext );
                                        if ( !$engine->wasCacheHit() ) {
                                                $n++;
                                        }
                                }
                        } else {
-                               $vals['diff']['notcached'] = '';
+                               $vals['diff']['notcached'] = true;
                        }
                }
 
                if ( $anyHidden && $revision->isDeleted( Revision::DELETED_RESTRICTED ) ) {
-                       $vals['suppressed'] = '';
+                       $vals['suppressed'] = true;
                }
 
                return $vals;
index e489b2f..e29ef8d 100644 (file)
@@ -252,11 +252,11 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
 
                if ( $resultPageSet === null ) {
-                       $apiResult->setIndexedTagName_internal( array(
+                       $apiResult->addIndexedTagName( array(
                                'query', $this->getModuleName()
                        ), 'p' );
                        if ( $hasInterwikiResults ) {
-                               $apiResult->setIndexedTagName_internal( array(
+                               $apiResult->addIndexedTagName( array(
                                        'query', 'interwiki' . $this->getModuleName()
                                ), 'p' );
                        }
index 5ac1036..b81e993 100644 (file)
@@ -150,24 +150,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $allowFrom = array( '' );
                $allowException = true;
                if ( !$config->get( 'AllowExternalImages' ) ) {
-                       if ( $config->get( 'EnableImageWhitelist' ) ) {
-                               $data['imagewhitelistenabled'] = '';
-                       }
+                       $data['imagewhitelistenabled'] = (bool)$config->get( 'EnableImageWhitelist' );
                        $allowFrom = $config->get( 'AllowExternalImagesFrom' );
                        $allowException = !empty( $allowFrom );
                }
                if ( $allowException ) {
                        $data['externalimages'] = (array)$allowFrom;
-                       $this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
+                       ApiResult::setIndexedTagName( $data['externalimages'], 'prefix' );
                }
 
-               if ( !$config->get( 'DisableLangConversion' ) ) {
-                       $data['langconversion'] = '';
-               }
-
-               if ( !$config->get( 'DisableTitleConversion' ) ) {
-                       $data['titleconversion'] = '';
-               }
+               $data['langconversion'] = !$config->get( 'DisableLangConversion' );
+               $data['titleconversion'] = !$config->get( 'DisableTitleConversion' );
 
                if ( $wgContLang->linkPrefixExtension() ) {
                        $linkPrefixCharset = $wgContLang->linkPrefixCharset();
@@ -180,11 +173,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $linktrail = $wgContLang->linkTrail();
-               if ( $linktrail ) {
-                       $data['linktrail'] = $linktrail;
-               } else {
-                       $data['linktrail'] = '';
-               }
+               $data['linktrail'] = $linktrail ?: '';
 
                $data['legaltitlechars'] = Title::legalChars();
 
@@ -210,7 +199,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $fallbacks[] = array( 'code' => $code );
                }
                $data['fallback'] = $fallbacks;
-               $this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
+               ApiResult::setIndexedTagName( $data['fallback'], 'lang' );
 
                if ( $wgContLang->hasVariants() ) {
                        $variants = array();
@@ -221,21 +210,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                );
                        }
                        $data['variants'] = $variants;
-                       $this->getResult()->setIndexedTagName( $data['variants'], 'lang' );
+                       ApiResult::setIndexedTagName( $data['variants'], 'lang' );
                }
 
-               if ( $wgContLang->isRTL() ) {
-                       $data['rtl'] = '';
-               }
+               $data['rtl'] = $wgContLang->isRTL();
                $data['fallback8bitEncoding'] = $wgContLang->fallback8bitEncoding();
 
-               if ( wfReadOnly() ) {
-                       $data['readonly'] = '';
+               $data['readonly'] = wfReadOnly();
+               if ( $data['readonly'] ) {
                        $data['readonlyreason'] = wfReadOnlyReason();
                }
-               if ( $config->get( 'EnableWriteAPI' ) ) {
-                       $data['writeapi'] = '';
-               }
+               $data['writeapi'] = (bool)$config->get( 'EnableWriteAPI' );
 
                $tz = $config->get( 'Localtimezone' );
                $offset = $config->get( 'LocalTZoffset' );
@@ -251,21 +236,22 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['scriptpath'] = $config->get( 'ScriptPath' );
                $data['script'] = $config->get( 'Script' );
                $data['variantarticlepath'] = $config->get( 'VariantArticlePath' );
+               $data[ApiResult::META_BC_BOOLS][] = 'variantarticlepath';
                $data['server'] = $config->get( 'Server' );
                $data['servername'] = $config->get( 'ServerName' );
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
-               if ( $config->get( 'MiserMode' ) ) {
-                       $data['misermode'] = '';
-               }
+               $data['misermode'] = (bool)$config->get( 'MiserMode' );
 
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
 
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
-               $this->getResult()->setIndexedTagName( $data['thumblimits'], 'limit' );
+               ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
+               ApiResult::setIndexedTagName( $data['thumblimits'], 'limit' );
                $data['imagelimits'] = array();
-               $this->getResult()->setIndexedTagName( $data['imagelimits'], 'limit' );
+               ApiResult::setArrayType( $data['imagelimits'], 'BCassoc' );
+               ApiResult::setIndexedTagName( $data['imagelimits'], 'limit' );
                foreach ( $config->get( 'ImageLimits' ) as $k => $limit ) {
                        $data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
                }
@@ -284,30 +270,25 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        protected function appendNamespaces( $property ) {
                global $wgContLang;
-               $data = array();
+               $data = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
                foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
                        $data[$ns] = array(
                                'id' => intval( $ns ),
                                'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
                        );
-                       ApiResult::setContent( $data[$ns], $title );
+                       ApiResult::setContentValue( $data[$ns], 'name', $title );
                        $canonical = MWNamespace::getCanonicalName( $ns );
 
-                       if ( MWNamespace::hasSubpages( $ns ) ) {
-                               $data[$ns]['subpages'] = '';
-                       }
+                       $data[$ns]['subpages'] = MWNamespace::hasSubpages( $ns );
 
                        if ( $canonical ) {
                                $data[$ns]['canonical'] = strtr( $canonical, '_', ' ' );
                        }
 
-                       if ( MWNamespace::isContent( $ns ) ) {
-                               $data[$ns]['content'] = '';
-                       }
-
-                       if ( MWNamespace::isNonincludable( $ns ) ) {
-                               $data[$ns]['nonincludable'] = '';
-                       }
+                       $data[$ns]['content'] = MWNamespace::isContent( $ns );
+                       $data[$ns]['nonincludable'] = MWNamespace::isNonincludable( $ns );
 
                        $contentmodel = MWNamespace::getNamespaceContentModel( $ns );
                        if ( $contentmodel ) {
@@ -315,7 +296,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
                }
 
-               $this->getResult()->setIndexedTagName( $data, 'ns' );
+               ApiResult::setIndexedTagName( $data, 'ns' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -334,13 +315,13 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $item = array(
                                'id' => intval( $ns )
                        );
-                       ApiResult::setContent( $item, strtr( $title, '_', ' ' ) );
+                       ApiResult::setContentValue( $item, 'alias', strtr( $title, '_', ' ' ) );
                        $data[] = $item;
                }
 
                sort( $data );
 
-               $this->getResult()->setIndexedTagName( $data, 'ns' );
+               ApiResult::setIndexedTagName( $data, 'ns' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -352,11 +333,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                foreach ( SpecialPageFactory::getNames() as $specialpage ) {
                        if ( isset( $aliases[$specialpage] ) ) {
                                $arr = array( 'realname' => $specialpage, 'aliases' => $aliases[$specialpage] );
-                               $this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
+                               ApiResult::setIndexedTagName( $arr['aliases'], 'alias' );
                                $data[] = $arr;
                        }
                }
-               $this->getResult()->setIndexedTagName( $data, 'specialpage' );
+               ApiResult::setIndexedTagName( $data, 'specialpage' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -367,13 +348,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                foreach ( $wgContLang->getMagicWords() as $magicword => $aliases ) {
                        $caseSensitive = array_shift( $aliases );
                        $arr = array( 'name' => $magicword, 'aliases' => $aliases );
-                       if ( $caseSensitive ) {
-                               $arr['case-sensitive'] = '';
-                       }
-                       $this->getResult()->setIndexedTagName( $arr['aliases'], 'alias' );
+                       $arr['case-sensitive'] = (bool)$caseSensitive;
+                       ApiResult::setIndexedTagName( $arr['aliases'], 'alias' );
                        $data[] = $arr;
                }
-               $this->getResult()->setIndexedTagName( $data, 'magicword' );
+               ApiResult::setIndexedTagName( $data, 'magicword' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -402,20 +381,20 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $val = array();
                        $val['prefix'] = $prefix;
                        if ( isset( $row['iw_local'] ) && $row['iw_local'] == '1' ) {
-                               $val['local'] = '';
+                               $val['local'] = true;
                        }
                        if ( isset( $row['iw_trans'] ) && $row['iw_trans'] == '1' ) {
-                               $val['trans'] = '';
+                               $val['trans'] = true;
                        }
 
                        if ( isset( $langNames[$prefix] ) ) {
                                $val['language'] = $langNames[$prefix];
                        }
                        if ( in_array( $prefix, $localInterwikis ) ) {
-                               $val['localinterwiki'] = '';
+                               $val['localinterwiki'] = true;
                        }
                        if ( in_array( $prefix, $extraLangPrefixes ) ) {
-                               $val['extralanglink'] = '';
+                               $val['extralanglink'] = true;
 
                                $linktext = wfMessage( "interlanguage-link-$prefix" );
                                if ( !$linktext->isDisabled() ) {
@@ -429,9 +408,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
 
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
-                       if ( substr( $row['iw_url'], 0, 2 ) == '//' ) {
-                               $val['protorel'] = '';
-                       }
+                       $val['protorel'] = substr( $row['iw_url'], 0, 2 ) == '//';
                        if ( isset( $row['iw_wikiid'] ) && $row['iw_wikiid'] !== '' ) {
                                $val['wikiid'] = $row['iw_wikiid'];
                        }
@@ -442,7 +419,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[] = $val;
                }
 
-               $this->getResult()->setIndexedTagName( $data, 'iw' );
+               ApiResult::setIndexedTagName( $data, 'iw' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -477,7 +454,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $result = $this->getResult();
-               $result->setIndexedTagName( $data, 'db' );
+               ApiResult::setIndexedTagName( $data, 'db' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -533,16 +510,16 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        $groups = array_intersect( $rights[$group], $allGroups );
                                        if ( $groups ) {
                                                $arr[$type] = $groups;
-                                               $result->setIndexedTagName( $arr[$type], 'group' );
+                                               ApiResult::setIndexedTagName( $arr[$type], 'group' );
                                        }
                                }
                        }
 
-                       $result->setIndexedTagName( $arr['rights'], 'permission' );
+                       ApiResult::setIndexedTagName( $arr['rights'], 'permission' );
                        $data[] = $arr;
                }
 
-               $result->setIndexedTagName( $data, 'group' );
+               ApiResult::setIndexedTagName( $data, 'group' );
 
                return $result->addValue( 'query', $property, $data );
        }
@@ -552,7 +529,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                foreach ( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) as $ext ) {
                        $data[] = array( 'ext' => $ext );
                }
-               $this->getResult()->setIndexedTagName( $data, 'fe' );
+               ApiResult::setIndexedTagName( $data, 'fe' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -581,7 +558,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                'version' => $info['version'],
                        );
                }
-               $this->getResult()->setIndexedTagName( $data, 'library' );
+               ApiResult::setIndexedTagName( $data, 'library' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
 
@@ -607,7 +584,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        if ( is_array( $ext['descriptionmsg'] ) ) {
                                                $ret['descriptionmsg'] = $ext['descriptionmsg'][0];
                                                $ret['descriptionmsgparams'] = array_slice( $ext['descriptionmsg'], 1 );
-                                               $this->getResult()->setIndexedTagName( $ret['descriptionmsgparams'], 'param' );
+                                               ApiResult::setIndexedTagName( $ret['descriptionmsgparams'], 'param' );
                                        } else {
                                                $ret['descriptionmsg'] = $ext['descriptionmsg'];
                                        }
@@ -667,15 +644,21 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
                }
 
-               $this->getResult()->setIndexedTagName( $data, 'ext' );
+               ApiResult::setIndexedTagName( $data, 'ext' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
 
        protected function appendRightsInfo( $property ) {
                $config = $this->getConfig();
-               $title = Title::newFromText( $config->get( 'RightsPage' ) );
-               $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $config->get( 'RightsUrl' );
+               $rightsPage = $config->get( 'RightsPage' );
+               if ( is_string( $rightsPage ) ) {
+                       $title = Title::newFromText( $rightsPage );
+                       $url = wfExpandUrl( $title, PROTO_CURRENT );
+               } else {
+                       $title = false;
+                       $url = $config->get( 'RightsUrl' );
+               }
                $text = $config->get( 'RightsText' );
                if ( !$text && $title ) {
                        $text = $title->getPrefixedText();
@@ -698,10 +681,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        'semiprotectedlevels' => $config->get( 'SemiprotectedRestrictionLevels' ),
                );
 
-               $this->getResult()->setIndexedTagName( $data['types'], 'type' );
-               $this->getResult()->setIndexedTagName( $data['levels'], 'level' );
-               $this->getResult()->setIndexedTagName( $data['cascadinglevels'], 'level' );
-               $this->getResult()->setIndexedTagName( $data['semiprotectedlevels'], 'level' );
+               ApiResult::setIndexedTagName( $data['types'], 'type' );
+               ApiResult::setIndexedTagName( $data['levels'], 'level' );
+               ApiResult::setIndexedTagName( $data['cascadinglevels'], 'level' );
+               ApiResult::setIndexedTagName( $data['semiprotectedlevels'], 'level' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -715,10 +698,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                foreach ( $langNames as $code => $name ) {
                        $lang = array( 'code' => $code );
-                       ApiResult::setContent( $lang, $name );
+                       ApiResult::setContentValue( $lang, 'name', $name );
                        $data[] = $lang;
                }
-               $this->getResult()->setIndexedTagName( $data, 'lang' );
+               ApiResult::setIndexedTagName( $data, 'lang' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -739,16 +722,16 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                $displayName = $msg->text();
                        }
                        $skin = array( 'code' => $name );
-                       ApiResult::setContent( $skin, $displayName );
+                       ApiResult::setContentValue( $skin, 'name', $displayName );
                        if ( !isset( $allowed[$name] ) ) {
-                               $skin['unusable'] = '';
+                               $skin['unusable'] = true;
                        }
                        if ( $name === $default ) {
-                               $skin['default'] = '';
+                               $skin['default'] = true;
                        }
                        $data[] = $skin;
                }
-               $this->getResult()->setIndexedTagName( $data, 'skin' );
+               ApiResult::setIndexedTagName( $data, 'skin' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -757,7 +740,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                global $wgParser;
                $wgParser->firstCallInit();
                $tags = array_map( array( $this, 'formatParserTags' ), $wgParser->getTags() );
-               $this->getResult()->setIndexedTagName( $tags, 't' );
+               ApiResult::setIndexedTagName( $tags, 't' );
 
                return $this->getResult()->addValue( 'query', $property, $tags );
        }
@@ -766,14 +749,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                global $wgParser;
                $wgParser->firstCallInit();
                $hooks = $wgParser->getFunctionHooks();
-               $this->getResult()->setIndexedTagName( $hooks, 'h' );
+               ApiResult::setIndexedTagName( $hooks, 'h' );
 
                return $this->getResult()->addValue( 'query', $property, $hooks );
        }
 
        public function appendVariables( $property ) {
                $variables = MagicWord::getVariableIDs();
-               $this->getResult()->setIndexedTagName( $variables, 'v' );
+               ApiResult::setIndexedTagName( $variables, 'v' );
 
                return $this->getResult()->addValue( 'query', $property, $variables );
        }
@@ -781,13 +764,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        public function appendProtocols( $property ) {
                // Make a copy of the global so we don't try to set the _element key of it - bug 45130
                $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
-               $this->getResult()->setIndexedTagName( $protocols, 'p' );
+               ApiResult::setIndexedTagName( $protocols, 'p' );
 
                return $this->getResult()->addValue( 'query', $property, $protocols );
        }
 
        public function appendDefaultOptions( $property ) {
-               return $this->getResult()->addValue( 'query', $property, User::getDefaultOptions() );
+               $options = User::getDefaultOptions();
+               $options[ApiResult::META_BC_BOOLS] = array_keys( $options );
+               return $this->getResult()->addValue( 'query', $property, $options );
        }
 
        private function formatParserTags( $item ) {
@@ -806,11 +791,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
-                       $this->getResult()->setIndexedTagName( $arr['subscribers'], 's' );
+                       ApiResult::setIndexedTagName( $arr['subscribers'], 's' );
                        $data[] = $arr;
                }
 
-               $this->getResult()->setIndexedTagName( $data, 'hook' );
+               ApiResult::setIndexedTagName( $data, 'hook' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
index 342e367..1126842 100644 (file)
@@ -59,7 +59,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                                $finalThumbParam = $this->mergeThumbParams( $file, $scale, $params['urlparam'] );
                                $imageInfo = ApiQueryImageInfo::getInfo( $file, $prop, $result, $finalThumbParam );
                                $result->addValue( array( 'query', $this->getModuleName() ), null, $imageInfo );
-                               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $modulePrefix );
+                               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), $modulePrefix );
                        }
                // @todo Update exception handling here to understand current getFile exceptions
                } catch ( UploadStashFileNotFoundException $e ) {
index 0e3307b..45f73b2 100644 (file)
@@ -108,8 +108,8 @@ class ApiQueryTags extends ApiQueryBase {
                        $isExtension = isset( $extensionDefinedTags[$tagName] );
                        $isExplicit = isset( $explicitlyDefinedTags[$tagName] );
 
-                       if ( $fld_defined && ( $isExtension || $isExplicit ) ) {
-                               $tag['defined'] = '';
+                       if ( $fld_defined ) {
+                               $tag['defined'] = $isExtension || $isExplicit;
                        }
 
                        if ( $fld_source ) {
@@ -122,10 +122,8 @@ class ApiQueryTags extends ApiQueryBase {
                                }
                        }
 
-                       if ( $fld_active &&
-                               ( $isExplicit || isset( $extensionActivatedTags[$tagName] ) )
-                       ) {
-                               $tag['active'] = '';
+                       if ( $fld_active ) {
+                               $tag['active'] = $isExplicit || isset( $extensionActivatedTags[$tagName] );
                        }
 
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $tag );
@@ -135,7 +133,7 @@ class ApiQueryTags extends ApiQueryBase {
                        }
                }
 
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'tag' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'tag' );
        }
 
        public function getCacheMode( $params ) {
index f8eee8d..65a08a3 100644 (file)
@@ -35,7 +35,9 @@ class ApiQueryTokens extends ApiQueryBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $res = array();
+               $res = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
 
                if ( $this->lacksSameOriginSecurity() ) {
                        $this->setWarning( 'Tokens may not be obtained when the same-origin policy is not applied' );
index 41f7ee7..e5ec67d 100644 (file)
@@ -120,7 +120,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        }
                }
 
-               $this->getResult()->setIndexedTagName_internal(
+               $this->getResult()->addIndexedTagName(
                        array( 'query', $this->getModuleName() ),
                        'item'
                );
@@ -335,7 +335,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $anyHidden = false;
 
                if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
-                       $vals['texthidden'] = '';
+                       $vals['texthidden'] = true;
                        $anyHidden = true;
                }
 
@@ -343,7 +343,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $vals['userid'] = $row->rev_user;
                $vals['user'] = $row->rev_user_text;
                if ( $row->rev_deleted & Revision::DELETED_USER ) {
-                       $vals['userhidden'] = '';
+                       $vals['userhidden'] = true;
                        $anyHidden = true;
                }
                if ( $this->fld_ids ) {
@@ -367,20 +367,14 @@ class ApiQueryContributions extends ApiQueryBase {
                }
 
                if ( $this->fld_flags ) {
-                       if ( $row->rev_parent_id == 0 && !is_null( $row->rev_parent_id ) ) {
-                               $vals['new'] = '';
-                       }
-                       if ( $row->rev_minor_edit ) {
-                               $vals['minor'] = '';
-                       }
-                       if ( $row->page_latest == $row->rev_id ) {
-                               $vals['top'] = '';
-                       }
+                       $vals['new'] = $row->rev_parent_id == 0 && !is_null( $row->rev_parent_id );
+                       $vals['minor'] = (bool)$row->rev_minor_edit;
+                       $vals['top'] = $row->page_latest == $row->rev_id;
                }
 
                if ( ( $this->fld_comment || $this->fld_parsedcomment ) && isset( $row->rev_comment ) ) {
                        if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
 
@@ -400,8 +394,8 @@ class ApiQueryContributions extends ApiQueryBase {
                        }
                }
 
-               if ( $this->fld_patrolled && $row->rc_patrolled ) {
-                       $vals['patrolled'] = '';
+               if ( $this->fld_patrolled ) {
+                       $vals['patrolled'] = (bool)$row->rc_patrolled;
                }
 
                if ( $this->fld_size && !is_null( $row->rev_len ) ) {
@@ -421,7 +415,7 @@ class ApiQueryContributions extends ApiQueryBase {
                if ( $this->fld_tags ) {
                        if ( $row->ts_tags ) {
                                $tags = explode( ',', $row->ts_tags );
-                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                               ApiResult::setIndexedTagName( $tags, 'tag' );
                                $vals['tags'] = $tags;
                        } else {
                                $vals['tags'] = array();
@@ -429,7 +423,7 @@ class ApiQueryContributions extends ApiQueryBase {
                }
 
                if ( $anyHidden && $row->rev_deleted & Revision::DELETED_RESTRICTED ) {
-                       $vals['suppressed'] = '';
+                       $vals['suppressed'] = true;
                }
 
                return $vals;
index 1e3a432..3d3590c 100644 (file)
@@ -52,6 +52,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
+               global $wgContLang;
+
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -59,7 +61,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                $vals['name'] = $user->getName();
 
                if ( $user->isAnon() ) {
-                       $vals['anon'] = '';
+                       $vals['anon'] = true;
                }
 
                if ( isset( $this->prop['blockinfo'] ) ) {
@@ -70,42 +72,46 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                $vals['blockedbyid'] = $block->getBy();
                                $vals['blockreason'] = $user->blockedFor();
                                $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->mTimestamp );
-                               $vals['blockexpiry'] = $block->getExpiry() === 'infinity'
-                                       ? 'infinite'
-                                       : wfTimestamp( TS_ISO_8601, $block->getExpiry() );
+                               $vals['blockexpiry'] = $wgContLang->formatExpiry(
+                                       $block->getExpiry(), TS_ISO_8601, 'infinite'
+                               );
                        }
                }
 
-               if ( isset( $this->prop['hasmsg'] ) && $user->getNewtalk() ) {
-                       $vals['messages'] = '';
+               if ( isset( $this->prop['hasmsg'] ) ) {
+                       $vals['messages'] = $user->getNewtalk();
                }
 
                if ( isset( $this->prop['groups'] ) ) {
                        $vals['groups'] = $user->getEffectiveGroups();
-                       $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
+                       ApiResult::setArrayType( $vals['groups'], 'array' ); // even if empty
+                       ApiResult::setIndexedTagName( $vals['groups'], 'g' ); // even if empty
                }
 
                if ( isset( $this->prop['implicitgroups'] ) ) {
                        $vals['implicitgroups'] = $user->getAutomaticGroups();
-                       $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
+                       ApiResult::setArrayType( $vals['implicitgroups'], 'array' ); // even if empty
+                       ApiResult::setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
                }
 
                if ( isset( $this->prop['rights'] ) ) {
                        // User::getRights() may return duplicate values, strip them
                        $vals['rights'] = array_values( array_unique( $user->getRights() ) );
-                       $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
+                       ApiResult::setArrayType( $vals['rights'], 'array' ); // even if empty
+                       ApiResult::setIndexedTagName( $vals['rights'], 'r' ); // even if empty
                }
 
                if ( isset( $this->prop['changeablegroups'] ) ) {
                        $vals['changeablegroups'] = $user->changeableGroups();
-                       $result->setIndexedTagName( $vals['changeablegroups']['add'], 'g' );
-                       $result->setIndexedTagName( $vals['changeablegroups']['remove'], 'g' );
-                       $result->setIndexedTagName( $vals['changeablegroups']['add-self'], 'g' );
-                       $result->setIndexedTagName( $vals['changeablegroups']['remove-self'], 'g' );
+                       ApiResult::setIndexedTagName( $vals['changeablegroups']['add'], 'g' );
+                       ApiResult::setIndexedTagName( $vals['changeablegroups']['remove'], 'g' );
+                       ApiResult::setIndexedTagName( $vals['changeablegroups']['add-self'], 'g' );
+                       ApiResult::setIndexedTagName( $vals['changeablegroups']['remove-self'], 'g' );
                }
 
                if ( isset( $this->prop['options'] ) ) {
                        $vals['options'] = $user->getOptions();
+                       $vals['options'][ApiResult::META_BC_BOOLS] = array_keys( $vals['options'] );
                }
 
                if ( isset( $this->prop['preferencestoken'] ) ) {
@@ -157,10 +163,10 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $acceptLang = array();
                        foreach ( $langs as $lang => $val ) {
                                $r = array( 'q' => $val );
-                               ApiResult::setContent( $r, $lang );
+                               ApiResult::setContentValue( $r, 'code', $lang );
                                $acceptLang[] = $r;
                        }
-                       $result->setIndexedTagName( $acceptLang, 'lang' );
+                       ApiResult::setIndexedTagName( $acceptLang, 'lang' );
                        $vals['acceptlang'] = $acceptLang;
                }
 
@@ -189,9 +195,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getRateLimits() {
+               $retval = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
+
                $user = $this->getUser();
                if ( !$user->isPingLimitable() ) {
-                       return array(); // No limits
+                       return $retval; // No limits
                }
 
                // Find out which categories we belong to
@@ -211,7 +221,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
                $categories = array_merge( $categories, $user->getGroups() );
 
                // Now get the actual limits
-               $retval = array();
                foreach ( $this->getConfig()->get( 'RateLimits' ) as $action => $limits ) {
                        foreach ( $categories as $cat ) {
                                if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
index 52636cc..f22c213 100644 (file)
@@ -110,7 +110,7 @@ class ApiQueryUsers extends ApiQueryBase {
                foreach ( $users as $u ) {
                        $n = User::getCanonicalName( $u );
                        if ( $n === false || $n === '' ) {
-                               $vals = array( 'name' => $u, 'invalid' => '' );
+                               $vals = array( 'name' => $u, 'invalid' => true );
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ),
                                        null, $vals );
                                if ( !$fit ) {
@@ -190,7 +190,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$name]['rights'] = $user->getRights();
                                }
                                if ( $row->ipb_deleted ) {
-                                       $data[$name]['hidden'] = '';
+                                       $data[$name]['hidden'] = true;
                                }
                                if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
                                        $data[$name]['blockid'] = $row->ipb_id;
@@ -201,8 +201,8 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$name]['blockexpiry'] = $row->ipb_expiry;
                                }
 
-                               if ( isset( $this->prop['emailable'] ) && $user->canReceiveEmail() ) {
-                                       $data[$name]['emailable'] = '';
+                               if ( isset( $this->prop['emailable'] ) ) {
+                                       $data[$name]['emailable'] = $user->canReceiveEmail();
                                }
 
                                if ( isset( $this->prop['gender'] ) ) {
@@ -237,7 +237,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                $iwUser = $urPage->fetchUser( $u );
 
                                if ( $iwUser instanceof UserRightsProxy ) {
-                                       $data[$u]['interwiki'] = '';
+                                       $data[$u]['interwiki'] = true;
 
                                        if ( !is_null( $params['token'] ) ) {
                                                $tokenFunctions = $this->getTokenFunctions();
@@ -252,17 +252,20 @@ class ApiQueryUsers extends ApiQueryBase {
                                                }
                                        }
                                } else {
-                                       $data[$u]['missing'] = '';
+                                       $data[$u]['missing'] = true;
                                }
                        } else {
                                if ( isset( $this->prop['groups'] ) && isset( $data[$u]['groups'] ) ) {
-                                       $result->setIndexedTagName( $data[$u]['groups'], 'g' );
+                                       ApiResult::setArrayType( $data[$u]['groups'], 'array' );
+                                       ApiResult::setIndexedTagName( $data[$u]['groups'], 'g' );
                                }
                                if ( isset( $this->prop['implicitgroups'] ) && isset( $data[$u]['implicitgroups'] ) ) {
-                                       $result->setIndexedTagName( $data[$u]['implicitgroups'], 'g' );
+                                       ApiResult::setArrayType( $data[$u]['implicitgroups'], 'array' );
+                                       ApiResult::setIndexedTagName( $data[$u]['implicitgroups'], 'g' );
                                }
                                if ( isset( $this->prop['rights'] ) && isset( $data[$u]['rights'] ) ) {
-                                       $result->setIndexedTagName( $data[$u]['rights'], 'r' );
+                                       ApiResult::setArrayType( $data[$u]['rights'], 'array' );
+                                       ApiResult::setIndexedTagName( $data[$u]['rights'], 'r' );
                                }
                        }
 
@@ -275,7 +278,7 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
                        $done[] = $u;
                }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
+               $result->addIndexedTagName( array( 'query', $this->getModuleName() ), 'user' );
        }
 
        public function getCacheMode( $params ) {
index 3857a08..9f7387c 100644 (file)
@@ -281,7 +281,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                if ( is_null( $resultPageSet ) ) {
-                       $this->getResult()->setIndexedTagName_internal(
+                       $this->getResult()->addIndexedTagName(
                                array( 'query', $this->getModuleName() ),
                                'item'
                        );
@@ -307,7 +307,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                if ( $this->fld_title || $this->fld_ids ) {
                        // These should already have been filtered out of the query, but just in case.
                        if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) {
-                               $vals['actionhidden'] = '';
+                               $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( $type !== RC_LOG ||
@@ -327,7 +327,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                /* Add user data and 'anon' flag, if user is anonymous. */
                if ( $this->fld_user || $this->fld_userid ) {
                        if ( $row->rc_deleted & Revision::DELETED_USER ) {
-                               $vals['userhidden'] = '';
+                               $vals['userhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) {
@@ -342,22 +342,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                }
 
                                if ( !$row->rc_user ) {
-                                       $vals['anon'] = '';
+                                       $vals['anon'] = true;
                                }
                        }
                }
 
                /* Add flags, such as new, minor, bot. */
                if ( $this->fld_flags ) {
-                       if ( $row->rc_bot ) {
-                               $vals['bot'] = '';
-                       }
-                       if ( $row->rc_type == RC_NEW ) {
-                               $vals['new'] = '';
-                       }
-                       if ( $row->rc_minor ) {
-                               $vals['minor'] = '';
-                       }
+                       $vals['bot'] = (bool)$row->rc_bot;
+                       $vals['new'] = $row->rc_type == RC_NEW;
+                       $vals['minor'] = (bool)$row->rc_minor;
                }
 
                /* Add sizes of each revision. (Only available on 1.10+) */
@@ -380,7 +374,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                /* Add edit summary / log summary. */
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
                        if ( $row->rc_deleted & Revision::DELETED_COMMENT ) {
-                               $vals['commenthidden'] = '';
+                               $vals['commenthidden'] = true;
                                $anyHidden = true;
                        }
                        if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) {
@@ -395,38 +389,26 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                }
 
                /* Add the patrolled flag */
-               if ( $this->fld_patrol && $row->rc_patrolled == 1 ) {
-                       $vals['patrolled'] = '';
-               }
-
-               if ( $this->fld_patrol && ChangesList::isUnpatrolled( $row, $user ) ) {
-                       $vals['unpatrolled'] = '';
+               if ( $this->fld_patrol ) {
+                       $vals['patrolled'] = $row->rc_patrolled == 1;
+                       $vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user );
                }
 
                if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
                        if ( $row->rc_deleted & LogPage::DELETED_ACTION ) {
-                               $vals['actionhidden'] = '';
+                               $vals['actionhidden'] = true;
                                $anyHidden = true;
                        }
                        if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) {
                                $vals['logid'] = intval( $row->rc_logid );
                                $vals['logtype'] = $row->rc_log_type;
                                $vals['logaction'] = $row->rc_log_action;
-                               $logEntry = DatabaseLogEntry::newFromRow( $row );
-                               ApiQueryLogEvents::addLogParams(
-                                       $this->getResult(),
-                                       $vals,
-                                       $logEntry->getParameters(),
-                                       $logEntry->getType(),
-                                       $logEntry->getSubtype(),
-                                       $logEntry->getTimestamp(),
-                                       $logEntry->isLegacy()
-                               );
+                               $vals['logparams'] = LogFormatter::newFromRow( $row )->formatParametersForApi();
                        }
                }
 
                if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) {
-                       $vals['suppressed'] = '';
+                       $vals['suppressed'] = true;
                }
 
                return $vals;
index ae3596d..493c192 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        }
                }
                if ( is_null( $resultPageSet ) ) {
-                       $this->getResult()->setIndexedTagName_internal( $this->getModuleName(), 'wr' );
+                       $this->getResult()->addIndexedTagName( $this->getModuleName(), 'wr' );
                } else {
                        $resultPageSet->populateFromTitles( $titles );
                }
index 306c478..345cf43 100644 (file)
@@ -1,11 +1,5 @@
 <?php
 /**
- *
- *
- * Created on Sep 4, 2006
- *
- * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
- *
  * 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
  * Each subarray may either be a dictionary - key-value pairs with unique keys,
  * or lists, where the items are added using $data[] = $value notation.
  *
- * There are three special key values that change how XML output is generated:
- *   '_element'     This key sets the tag name for the rest of the elements in the current array.
- *                  It is only inserted if the formatter returned true for getNeedsRawData()
- *   '_subelements' This key causes the specified elements to be returned as subelements rather than attributes.
- *                  It is only inserted if the formatter returned true for getNeedsRawData()
- *   '*'            This key has special meaning only to the XML formatter, and is outputted as is
- *                  for all others. In XML it becomes the content of the current element.
- *
+ * @since 1.25 this is no longer a subclass of ApiBase
  * @ingroup API
  */
-class ApiResult extends ApiBase {
+class ApiResult implements ApiSerializable {
 
        /**
-        * override existing value in addValue() and setElement()
+        * Override existing value in addValue(), setValue(), and similar functions
         * @since 1.21
         */
        const OVERRIDE = 1;
 
        /**
-        * For addValue() and setElement(), if the value does not exist, add it as the first element.
-        * In case the new value has no name (numerical index), all indexes will be renumbered.
+        * For addValue(), setValue() and similar functions, if the value does not
+        * exist, add it as the first element. In case the new value has no name
+        * (numerical index), all indexes will be renumbered.
         * @since 1.21
         */
        const ADD_ON_TOP = 2;
 
        /**
-        * For addValue() and setElement(), do not check size while adding a value
+        * For addValue() and similar functions, do not check size while adding a value
         * Don't use this unless you REALLY know what you're doing.
-        * Values added while the size checking was disabled will never be counted
+        * Values added while the size checking was disabled will never be counted.
+        * Ignored for setValue() and similar functions.
         * @since 1.24
         */
        const NO_SIZE_CHECK = 4;
 
-       private $mData, $mIsRawMode, $mSize, $mCheckingSize;
+       /**
+        * For addValue(), setValue() and similar functions, do not validate data.
+        * Also disables size checking. If you think you need to use this, you're
+        * probably wrong.
+        * @since 1.25
+        */
+       const NO_VALIDATE = 12;
 
-       private $continueAllModules = array();
-       private $continueGeneratedModules = array();
-       private $continuationData = array();
-       private $generatorContinuationData = array();
-       private $generatorParams = array();
-       private $generatorDone = false;
+       /**
+        * Key for the 'indexed tag name' metadata item. Value is string.
+        * @since 1.25
+        */
+       const META_INDEXED_TAG_NAME = '_element';
 
        /**
-        * @param ApiMain $main
+        * Key for the 'subelements' metadata item. Value is string[].
+        * @since 1.25
         */
-       public function __construct( ApiMain $main ) {
-               parent::__construct( $main, 'result' );
-               $this->mIsRawMode = false;
-               $this->mCheckingSize = true;
-               $this->reset();
-       }
+       const META_SUBELEMENTS = '_subelements';
 
        /**
-        * Clear the current result data.
+        * Key for the 'preserve keys' metadata item. Value is string[].
+        * @since 1.25
         */
-       public function reset() {
-               $this->mData = array();
-               $this->mSize = 0;
-       }
+       const META_PRESERVE_KEYS = '_preservekeys';
 
        /**
-        * Call this function when special elements such as '_element'
-        * are needed by the formatter, for example in XML printing.
-        * @since 1.23 $flag parameter added
-        * @param bool $flag Set the raw mode flag to this state
+        * Key for the 'content' metadata item. Value is string.
+        * @since 1.25
         */
-       public function setRawMode( $flag = true ) {
-               $this->mIsRawMode = $flag;
-       }
+       const META_CONTENT = '_content';
 
        /**
-        * Returns true whether the formatter requested raw data.
-        * @return bool
+        * Key for the 'type' metadata item. Value is one of the following strings:
+        *  - default: Like 'array' if all (non-metadata) keys are numeric with no
+        *    gaps, otherwise like 'assoc'.
+        *  - array: Keys are used for ordering, but are not output. In a format
+        *    like JSON, outputs as [].
+        *  - assoc: In a format like JSON, outputs as {}.
+        *  - kvp: For a format like XML where object keys have a restricted
+        *    character set, use an alternative output format. For example,
+        *    <container><item name="key">value</item></container> rather than
+        *    <container key="value" />
+        *  - BCarray: Like 'array' normally, 'default' in backwards-compatibility mode.
+        *  - BCassoc: Like 'assoc' normally, 'default' in backwards-compatibility mode.
+        *  - BCkvp: Like 'kvp' normally. In backwards-compatibility mode, forces
+        *    the alternative output format for all formats, for example
+        *    [{"name":key,"*":value}] in JSON. META_KVP_KEY_NAME must also be set.
+        * @since 1.25
         */
-       public function getIsRawMode() {
-               return $this->mIsRawMode;
-       }
+       const META_TYPE = '_type';
 
        /**
-        * Get the result's internal data array (read-only)
-        * @return array
+        * Key (rather than "name" or other default) for when META_TYPE is 'kvp' or
+        * 'BCkvp'. Value is string.
+        * @since 1.25
         */
-       public function getData() {
-               return $this->mData;
-       }
+       const META_KVP_KEY_NAME = '_kvpkeyname';
 
        /**
-        * Get the 'real' size of a result item. This means the strlen() of the item,
-        * or the sum of the strlen()s of the elements if the item is an array.
-        * @param mixed $value
-        * @return int
+        * Key for the 'BC bools' metadata item. Value is string[].
+        * Note no setter is provided.
+        * @since 1.25
         */
-       public static function size( $value ) {
-               $s = 0;
-               if ( is_array( $value ) ) {
-                       foreach ( $value as $v ) {
-                               $s += self::size( $v );
-                       }
-               } elseif ( !is_object( $value ) ) {
-                       // Objects can't always be cast to string
-                       $s = strlen( $value );
+       const META_BC_BOOLS = '_BC_bools';
+
+       /**
+        * Key for the 'BC subelements' metadata item. Value is string[].
+        * Note no setter is provided.
+        * @since 1.25
+        */
+       const META_BC_SUBELEMENTS = '_BC_subelements';
+
+       private $data, $size, $maxSize;
+       private $errorFormatter;
+
+       // Deprecated fields
+       private $isRawMode, $checkingSize, $mainForContinuation;
+
+       /**
+        * @param int|bool $maxSize Maximum result "size", or false for no limit
+        * @since 1.25 Takes an integer|bool rather than an ApiMain
+        */
+       public function __construct( $maxSize ) {
+               if ( $maxSize instanceof ApiMain ) {
+                       wfDeprecated( 'ApiMain to ' . __METHOD__, '1.25' );
+                       $this->errorFormatter = $maxSize->getErrorFormatter();
+                       $this->mainForContinuation = $maxSize;
+                       $maxSize = $maxSize->getConfig()->get( 'APIMaxResultSize' );
                }
 
-               return $s;
+               $this->maxSize = $maxSize;
+               $this->isRawMode = false;
+               $this->checkingSize = true;
+               $this->reset();
        }
 
        /**
-        * Get the size of the result, i.e. the amount of bytes in it
-        * @return int
+        * Set the error formatter
+        * @since 1.25
+        * @param ApiErrorFormatter $formatter
         */
-       public function getSize() {
-               return $this->mSize;
+       public function setErrorFormatter( ApiErrorFormatter $formatter ) {
+               $this->errorFormatter = $formatter;
        }
 
        /**
-        * Disable size checking in addValue(). Don't use this unless you
-        * REALLY know what you're doing. Values added while size checking
-        * was disabled will not be counted (ever)
-        * @deprecated since 1.24, use ApiResult::NO_SIZE_CHECK
+        * Allow for adding one ApiResult into another
+        * @since 1.25
+        * @return mixed
         */
-       public function disableSizeCheck() {
-               $this->mCheckingSize = false;
+       public function serializeForApiResult() {
+               return $this->data;
        }
 
+       /************************************************************************//**
+        * @name   Content
+        * @{
+        */
+
        /**
-        * Re-enable size checking in addValue()
-        * @deprecated since 1.24, use ApiResult::NO_SIZE_CHECK
+        * Clear the current result data.
         */
-       public function enableSizeCheck() {
-               $this->mCheckingSize = true;
+       public function reset() {
+               $this->data = array(
+                       self::META_TYPE => 'assoc', // Usually what's desired
+               );
+               $this->size = 0;
+       }
+
+       /**
+        * Get the result data array
+        *
+        * The returned value should be considered read-only.
+        *
+        * Transformations include:
+        *
+        * Custom: (callable) Applied before other transformations. Signature is
+        *  function ( &$data, &$metadata ), return value is ignored. Called for
+        *  each nested array.
+        *
+        * BC: (array) This transformation does various adjustments to bring the
+        *  output in line with the pre-1.25 result format. The value array is a
+        *  list of flags: 'nobool', 'no*', 'nosub'.
+        *  - Boolean-valued items are changed to '' if true or removed if false,
+        *    unless listed in META_BC_BOOLS. This may be skipped by including
+        *    'nobool' in the value array.
+        *  - The tag named by META_CONTENT is renamed to '*', and META_CONTENT is
+        *    set to '*'. This may be skipped by including 'no*' in the value
+        *    array.
+        *  - Tags listed in META_BC_SUBELEMENTS will have their values changed to
+        *    array( '*' => $value ). This may be skipped by including 'nosub' in
+        *    the value array.
+        *  - If META_TYPE is 'BCarray', set it to 'default'
+        *  - If META_TYPE is 'BCassoc', set it to 'default'
+        *  - If META_TYPE is 'BCkvp', perform the transformation (even if
+        *    the Types transformation is not being applied).
+        *
+        * Types: (assoc) Apply transformations based on META_TYPE. The values
+        * array is an associative array with the following possible keys:
+        *  - AssocAsObject: (bool) If true, return arrays with META_TYPE 'assoc'
+        *    as objects.
+        *  - ArmorKVP: (string) If provided, transform arrays with META_TYPE 'kvp'
+        *    and 'BCkvp' into arrays of two-element arrays, something like this:
+        *      $output = array();
+        *      foreach ( $input as $key => $value ) {
+        *          $pair = array();
+        *          $pair[$META_KVP_KEY_NAME ?: $ArmorKVP_value] = $key;
+        *          ApiResult::setContentValue( $pair, 'value', $value );
+        *          $output[] = $pair;
+        *      }
+        *
+        * Strip: (string) Strips metadata keys from the result.
+        *  - 'all': Strip all metadata, recursively
+        *  - 'base': Strip metadata at the top-level only.
+        *  - 'none': Do not strip metadata.
+        *  - 'bc': Like 'all', but leave certain pre-1.25 keys.
+        *
+        * @since 1.25
+        * @param array|string|null $path Path to fetch, see ApiResult::addValue
+        * @param array $transforms See above
+        * @return mixed Result data, or null if not found
+        */
+       public function getResultData( $path = array(), $transforms = array() ) {
+               $path = (array)$path;
+               if ( !$path ) {
+                       return self::applyTransformations( $this->data, $transforms );
+               }
+
+               $last = array_pop( $path );
+               $ret = &$this->path( $path, 'dummy' );
+               if ( !isset( $ret[$last] ) ) {
+                       return null;
+               } elseif ( is_array( $ret[$last] ) ) {
+                       return self::applyTransformations( $ret[$last], $transforms );
+               } else {
+                       return $ret[$last];
+               }
+       }
+
+       /**
+        * Get the size of the result, i.e. the amount of bytes in it
+        * @return int
+        */
+       public function getSize() {
+               return $this->size;
        }
 
        /**
         * Add an output value to the array by name.
+        *
         * Verifies that value with the same name has not been added before.
-        * @param array $arr To add $value to
-        * @param string $name Index of $arr to add $value at
+        *
+        * @since 1.25
+        * @param array &$arr To add $value to
+        * @param string|int|null $name Index of $arr to add $value at,
+        *   or null to use the next numeric index.
         * @param mixed $value
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
-        *    This parameter used to be boolean, and the value of OVERRIDE=1 was
-        *    specifically chosen so that it would be backwards compatible with the
-        *    new method signature.
-        *
-        * @since 1.21 int $flags replaced boolean $override
         */
-       public static function setElement( &$arr, $name, $value, $flags = 0 ) {
-               if ( $arr === null || $name === null || $value === null
-                       || !is_array( $arr ) || is_array( $name )
-               ) {
-                       ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+       public static function setValue( array &$arr, $name, $value, $flags = 0 ) {
+               if ( $name === null ) {
+                       if ( $flags & ApiResult::ADD_ON_TOP ) {
+                               array_unshift( $arr, $value );
+                       } else {
+                               array_push( $arr, $value );
+                       }
+                       return;
+               }
+
+               if ( !( $flags & ApiResult::NO_VALIDATE ) ) {
+                       $value = self::validateValue( $value );
                }
 
                $exists = isset( $arr[$name] );
@@ -193,451 +297,1116 @@ class ApiResult extends ApiBase {
                                $arr[$name] = $value;
                        }
                } elseif ( is_array( $arr[$name] ) && is_array( $value ) ) {
-                       $merged = array_intersect_key( $arr[$name], $value );
-                       if ( !count( $merged ) ) {
+                       $conflicts = array_intersect_key( $arr[$name], $value );
+                       if ( !$conflicts ) {
                                $arr[$name] += $value;
                        } else {
-                               ApiBase::dieDebug( __METHOD__, "Attempting to merge element $name" );
+                               $keys = join( ', ', array_keys( $conflicts ) );
+                               throw new RuntimeException( "Conflicting keys ($keys) when attempting to merge element $name" );
                        }
                } else {
-                       ApiBase::dieDebug(
-                               __METHOD__,
-                               "Attempting to add element $name=$value, existing value is {$arr[$name]}"
-                       );
+                       throw new RuntimeException( "Attempting to add element $name=$value, existing value is {$arr[$name]}" );
                }
        }
 
        /**
-        * Adds a content element to an array.
-        * Use this function instead of hardcoding the '*' element.
-        * @param array $arr To add the content element to
+        * Validate a value for addition to the result
         * @param mixed $value
-        * @param string $subElemName When present, content element is created
-        *  as a sub item of $arr. Use this parameter to create elements in
-        *  format "<elem>text</elem>" without attributes.
         */
-       public static function setContent( &$arr, $value, $subElemName = null ) {
-               if ( is_array( $value ) ) {
-                       ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
+       private static function validateValue( $value ) {
+               global $wgContLang;
+
+               if ( is_object( $value ) ) {
+                       // Note we use is_callable() here instead of instanceof because
+                       // ApiSerializable is an informal protocol (see docs there for details).
+                       if ( is_callable( array( $value, 'serializeForApiResult' ) ) ) {
+                               $oldValue = $value;
+                               $value = $value->serializeForApiResult();
+                               if ( is_object( $value ) ) {
+                                       throw new UnexpectedValueException(
+                                               get_class( $oldValue ) . "::serializeForApiResult() returned an object of class " .
+                                                       get_class( $value )
+                                       );
+                               }
+
+                               // Recursive call instead of fall-through so we can throw a
+                               // better exception message.
+                               try {
+                                       return self::validateValue( $value );
+                               } catch ( Exception $ex ) {
+                                       throw new UnexpectedValueException(
+                                               get_class( $oldValue ) . "::serializeForApiResult() returned an invalid value: " .
+                                                       $ex->getMessage(),
+                                               0,
+                                               $ex
+                                       );
+                               }
+                       } elseif ( is_callable( array( $value, '__toString' ) ) ) {
+                               $value = (string)$value;
+                       } else {
+                               $value = (array)$value + array( self::META_TYPE => 'assoc' );
+                       }
                }
-               if ( is_null( $subElemName ) ) {
-                       ApiResult::setElement( $arr, '*', $value );
-               } else {
-                       if ( !isset( $arr[$subElemName] ) ) {
-                               $arr[$subElemName] = array();
+               if ( is_array( $value ) ) {
+                       foreach ( $value as $k => $v ) {
+                               $value[$k] = self::validateValue( $v );
+                       }
+               } elseif ( is_float( $value ) && !is_finite( $value ) ) {
+                       throw new InvalidArgumentException( "Cannot add non-finite floats to ApiResult" );
+               } elseif ( is_string( $value ) ) {
+                       $value = $wgContLang->normalize( $value );
+               } elseif ( $value !== null && !is_scalar( $value ) ) {
+                       $type = gettype( $value );
+                       if ( is_resource( $value ) ) {
+                               $type .= '(' . get_resource_type( $value ) . ')';
                        }
-                       ApiResult::setElement( $arr[$subElemName], '*', $value );
+                       throw new InvalidArgumentException( "Cannot add $type to ApiResult" );
                }
+
+               return $value;
        }
 
        /**
-        * Causes the elements with the specified names to be output as
-        * subelements rather than attributes.
-        * @param array $arr
-        * @param array|string $names The element name(s) to be output as subelements
+        * Add value to the output data at the given path.
+        *
+        * Path can be an indexed array, each element specifying the branch at which to add the new
+        * value. Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value.
+        * If $path is null, the value will be inserted at the data root.
+        *
+        * @param array|string|int|null $path
+        * @param string|int|null $name See ApiResult::setValue()
+        * @param mixed $value
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
+        *   This parameter used to be boolean, and the value of OVERRIDE=1 was specifically
+        *   chosen so that it would be backwards compatible with the new method signature.
+        * @return bool True if $value fits in the result, false if not
+        * @since 1.21 int $flags replaced boolean $override
         */
-       public function setSubelements( &$arr, $names ) {
-               // In raw mode, add the '_subelements', otherwise just ignore
-               if ( !$this->getIsRawMode() ) {
-                       return;
-               }
-               if ( $arr === null || $names === null || !is_array( $arr ) ) {
-                       ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
-               }
-               if ( !is_array( $names ) ) {
-                       $names = array( $names );
-               }
-               if ( !isset( $arr['_subelements'] ) ) {
-                       $arr['_subelements'] = $names;
-               } else {
-                       $arr['_subelements'] = array_merge( $arr['_subelements'], $names );
+       public function addValue( $path, $name, $value, $flags = 0 ) {
+               $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' );
+
+               if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
+                       $newsize = $this->size + self::valueSize( $value );
+                       if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
+                               /// @todo Add i18n message when replacing calls to ->setWarning()
+                               $msg = new ApiRawMessage( 'This result was truncated because it would otherwise ' .
+                                       ' be larger than the limit of $1 bytes', 'truncatedresult' );
+                               $msg->numParams( $this->maxSize );
+                               $this->errorFormatter->addWarning( 'result', $msg );
+                               return false;
+                       }
+                       $this->size = $newsize;
                }
+
+               self::setValue( $arr, $name, $value, $flags );
+               return true;
        }
 
        /**
-        * In case the array contains indexed values (in addition to named),
-        * give all indexed values the given tag name. This function MUST be
-        * called on every array that has numerical indexes.
-        * @param array $arr
-        * @param string $tag Tag name
+        * Remove an output value to the array by name.
+        * @param array &$arr To remove $value from
+        * @param string|int $name Index of $arr to remove
+        * @return mixed Old value, or null
         */
-       public function setIndexedTagName( &$arr, $tag ) {
-               // In raw mode, add the '_element', otherwise just ignore
-               if ( !$this->getIsRawMode() ) {
-                       return;
+       public static function unsetValue( array &$arr, $name ) {
+               $ret = null;
+               if ( isset( $arr[$name] ) ) {
+                       $ret = $arr[$name];
+                       unset( $arr[$name] );
                }
-               if ( $arr === null || $tag === null || !is_array( $arr ) || is_array( $tag ) ) {
-                       ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
-               }
-               // Do not use setElement() as it is ok to call this more than once
-               $arr['_element'] = $tag;
+               return $ret;
        }
 
        /**
-        * Calls setIndexedTagName() on each sub-array of $arr
-        * @param array $arr
-        * @param string $tag Tag name
+        * Remove value from the output data at the given path.
+        *
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string|int|null $name Index to remove at $path.
+        *   If null, $path itself is removed.
+        * @param int $flags Flags used when adding the value
+        * @return mixed Old value, or null
         */
-       public function setIndexedTagName_recursive( &$arr, $tag ) {
-               if ( !is_array( $arr ) ) {
-                       return;
-               }
-               foreach ( $arr as &$a ) {
-                       if ( !is_array( $a ) ) {
-                               continue;
+       public function removeValue( $path, $name, $flags = 0 ) {
+               $path = (array)$path;
+               if ( $name === null ) {
+                       if ( !$path ) {
+                               throw new InvalidArgumentException( 'Cannot remove the data root' );
                        }
-                       $this->setIndexedTagName( $a, $tag );
-                       $this->setIndexedTagName_recursive( $a, $tag );
+                       $name = array_pop( $path );
                }
+               $ret = self::unsetValue( $this->path( $path, 'dummy' ), $name );
+               if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
+                       $newsize = $this->size - self::valueSize( $ret );
+                       $this->size = max( $newsize, 0 );
+               }
+               return $ret;
        }
 
        /**
-        * Calls setIndexedTagName() on an array already in the result.
-        * Don't specify a path to a value that's not in the result, or
-        * you'll get nasty errors.
-        * @param array $path Path to the array, like addValue()'s $path
-        * @param string $tag
+        * Add an output value to the array by name and mark as META_CONTENT.
+        *
+        * @since 1.25
+        * @param array &$arr To add $value to
+        * @param string|int $name Index of $arr to add $value at.
+        * @param mixed $value
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         */
-       public function setIndexedTagName_internal( $path, $tag ) {
-               $data = &$this->mData;
-               foreach ( (array)$path as $p ) {
-                       if ( !isset( $data[$p] ) ) {
-                               $data[$p] = array();
-                       }
-                       $data = &$data[$p];
+       public static function setContentValue( array &$arr, $name, $value, $flags = 0 ) {
+               if ( $name === null ) {
+                       throw new InvalidArgumentException( 'Content value must be named' );
                }
-               if ( is_null( $data ) ) {
-                       return;
-               }
-               $this->setIndexedTagName( $data, $tag );
+               self::setContentField( $arr, $name, $flags );
+               self::setValue( $arr, $name, $value, $flags );
        }
 
        /**
-        * Add value to the output data at the given path.
-        * Path can be an indexed array, each element specifying the branch at which to add the new
-        * value. Setting $path to array('a','b','c') is equivalent to data['a']['b']['c'] = $value.
-        * If $path is null, the value will be inserted at the data root.
-        * If $name is empty, the $value is added as a next list element data[] = $value.
+        * Add value to the output data at the given path and mark as META_CONTENT
         *
-        * @param array|string|null $path
-        * @param string $name
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string|int $name See ApiResult::setValue()
         * @param mixed $value
         * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
-        *   This parameter used to be boolean, and the value of OVERRIDE=1 was specifically
-        *   chosen so that it would be backwards compatible with the new method signature.
         * @return bool True if $value fits in the result, false if not
-        *
-        * @since 1.21 int $flags replaced boolean $override
         */
-       public function addValue( $path, $name, $value, $flags = 0 ) {
-               $data = &$this->mData;
-               if ( $this->mCheckingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
-                       $newsize = $this->mSize + self::size( $value );
-                       $maxResultSize = $this->getConfig()->get( 'APIMaxResultSize' );
-                       if ( $newsize > $maxResultSize ) {
-                               $this->setWarning(
-                                       "This result was truncated because it would otherwise be larger than the " .
-                                               "limit of {$maxResultSize} bytes" );
-
-                               return false;
-                       }
-                       $this->mSize = $newsize;
-               }
-
-               $addOnTop = $flags & ApiResult::ADD_ON_TOP;
-               if ( $path !== null ) {
-                       foreach ( (array)$path as $p ) {
-                               if ( !isset( $data[$p] ) ) {
-                                       if ( $addOnTop ) {
-                                               $data = array( $p => array() ) + $data;
-                                               $addOnTop = false;
-                                       } else {
-                                               $data[$p] = array();
-                                       }
-                               }
-                               $data = &$data[$p];
-                       }
+       public function addContentValue( $path, $name, $value, $flags = 0 ) {
+               if ( $name === null ) {
+                       throw new InvalidArgumentException( 'Content value must be named' );
                }
-
-               if ( !$name ) {
-                       // Add list element
-                       if ( $addOnTop ) {
-                               // This element needs to be inserted in the beginning
-                               // Numerical indexes will be renumbered
-                               array_unshift( $data, $value );
-                       } else {
-                               // Add new value at the end
-                               $data[] = $value;
-                       }
-               } else {
-                       // Add named element
-                       self::setElement( $data, $name, $value, $flags );
-               }
-
-               return true;
+               $this->addContentField( $path, $name, $flags );
+               $this->addValue( $path, $name, $value, $flags );
        }
 
        /**
-        * Add a parsed limit=max to the result.
+        * Add the numeric limit for a limit=max to the result.
         *
+        * @since 1.25
         * @param string $moduleName
         * @param int $limit
         */
-       public function setParsedLimit( $moduleName, $limit ) {
+       public function addParsedLimit( $moduleName, $limit ) {
                // Add value, allowing overwriting
-               $this->addValue( 'limits', $moduleName, $limit, ApiResult::OVERRIDE );
+               $this->addValue( 'limits', $moduleName, $limit,
+                       ApiResult::OVERRIDE | ApiResult::NO_SIZE_CHECK );
        }
 
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Metadata
+        * @{
+        */
+
        /**
-        * Unset a value previously added to the result set.
-        * Fails silently if the value isn't found.
-        * For parameters, see addValue()
-        * @param array|null $path
-        * @param string $name
+        * Set the name of the content field name (META_CONTENT)
+        *
+        * @since 1.25
+        * @param array &$arr
+        * @param string|int $name Name of the field
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         */
-       public function unsetValue( $path, $name ) {
-               $data = &$this->mData;
-               if ( $path !== null ) {
-                       foreach ( (array)$path as $p ) {
-                               if ( !isset( $data[$p] ) ) {
-                                       return;
-                               }
-                               $data = &$data[$p];
-                       }
+       public static function setContentField( array &$arr, $name, $flags = 0 ) {
+               if ( isset( $arr[self::META_CONTENT] ) &&
+                       isset( $arr[$arr[self::META_CONTENT]] ) &&
+                       !( $flags & self::OVERRIDE )
+               ) {
+                       throw new RuntimeException(
+                               "Attempting to set content element as $name when " . $arr[self::META_CONTENT] .
+                                       " is already set as the content element"
+                       );
                }
-               $this->mSize -= self::size( $data[$name] );
-               unset( $data[$name] );
+               $arr[self::META_CONTENT] = $name;
        }
 
        /**
-        * Ensure all values in this result are valid UTF-8.
+        * Set the name of the content field name (META_CONTENT)
+        *
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string|int $name Name of the field
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
         */
-       public function cleanUpUTF8() {
-               array_walk_recursive( $this->mData, array( 'ApiResult', 'cleanUp_helper' ) );
+       public function addContentField( $path, $name, $flags = 0 ) {
+               $arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' );
+               self::setContentField( $arr, $name, $flags );
        }
 
        /**
-        * Callback function for cleanUpUTF8()
-        *
-        * @param string $s
+        * Causes the elements with the specified names to be output as
+        * subelements rather than attributes.
+        * @since 1.25 is static
+        * @param array &$arr
+        * @param array|string|int $names The element name(s) to be output as subelements
         */
-       private static function cleanUp_helper( &$s ) {
-               if ( !is_string( $s ) ) {
-                       return;
+       public static function setSubelementsList( array &$arr, $names ) {
+               if ( !isset( $arr[self::META_SUBELEMENTS] ) ) {
+                       $arr[self::META_SUBELEMENTS] = (array)$names;
+               } else {
+                       $arr[self::META_SUBELEMENTS] = array_merge( $arr[self::META_SUBELEMENTS], (array)$names );
                }
-               global $wgContLang;
-               $s = $wgContLang->normalize( $s );
        }
 
        /**
-        * Converts a Status object to an array suitable for addValue
-        * @param Status $status
-        * @param string $errorType
-        * @return array
+        * Causes the elements with the specified names to be output as
+        * subelements rather than attributes.
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param array|string|int $names The element name(s) to be output as subelements
         */
-       public function convertStatusToArray( $status, $errorType = 'error' ) {
-               if ( $status->isGood() ) {
-                       return array();
-               }
+       public function addSubelementsList( $path, $names ) {
+               $arr = &$this->path( $path );
+               self::setSubelementsList( $arr, $names );
+       }
 
-               $result = array();
-               foreach ( $status->getErrorsByType( $errorType ) as $error ) {
-                       $this->setIndexedTagName( $error['params'], 'param' );
-                       $result[] = $error;
+       /**
+        * Causes the elements with the specified names to be output as
+        * attributes (when possible) rather than as subelements.
+        * @since 1.25
+        * @param array &$arr
+        * @param array|string|int $names The element name(s) to not be output as subelements
+        */
+       public static function unsetSubelementsList( array &$arr, $names ) {
+               if ( isset( $arr[self::META_SUBELEMENTS] ) ) {
+                       $arr[self::META_SUBELEMENTS] = array_diff( $arr[self::META_SUBELEMENTS], (array)$names );
                }
-               $this->setIndexedTagName( $result, $errorType );
-
-               return $result;
        }
 
-       public function execute() {
-               ApiBase::dieDebug( __METHOD__, 'execute() is not supported on Result object' );
+       /**
+        * Causes the elements with the specified names to be output as
+        * attributes (when possible) rather than as subelements.
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param array|string|int $names The element name(s) to not be output as subelements
+        */
+       public function removeSubelementsList( $path, $names ) {
+               $arr = &$this->path( $path );
+               self::unsetSubelementsList( $arr, $names );
        }
 
        /**
-        * Parse a 'continue' parameter and return status information.
-        *
-        * This must be balanced by a call to endContinuation().
-        *
-        * @since 1.24
-        * @param string|null $continue The "continue" parameter, if any
-        * @param ApiBase[] $allModules Contains ApiBase instances that will be executed
-        * @param array $generatedModules Names of modules that depend on the generator
-        * @return array Two elements: a boolean indicating if the generator is done,
-        *   and an array of modules to actually execute.
+        * Set the tag name for numeric-keyed values in XML format
+        * @since 1.25 is static
+        * @param array &$arr
+        * @param string $tag Tag name
         */
-       public function beginContinuation(
-               $continue, array $allModules = array(), array $generatedModules = array()
-       ) {
-               $this->continueGeneratedModules = $generatedModules
-                       ? array_combine( $generatedModules, $generatedModules )
-                       : array();
-               $this->continuationData = array();
-               $this->generatorContinuationData = array();
-               $this->generatorParams = array();
-
-               $skip = array();
-               if ( is_string( $continue ) && $continue !== '' ) {
-                       $continue = explode( '||', $continue );
-                       $this->dieContinueUsageIf( count( $continue ) !== 2 );
-                       $this->generatorDone = ( $continue[0] === '-' );
-                       $skip = explode( '|', $continue[1] );
-                       if ( !$this->generatorDone ) {
-                               $this->generatorParams = explode( '|', $continue[0] );
-                       } else {
-                               // When the generator is complete, don't run any modules that
-                               // depend on it.
-                               $skip += $this->continueGeneratedModules;
-                       }
-               }
-
-               $this->continueAllModules = array();
-               $runModules = array();
-               foreach ( $allModules as $module ) {
-                       $name = $module->getModuleName();
-                       if ( in_array( $name, $skip ) ) {
-                               $this->continueAllModules[$name] = false;
-                               // Prevent spurious "unused parameter" warnings
-                               $module->extractRequestParams();
-                       } else {
-                               $this->continueAllModules[$name] = true;
-                               $runModules[] = $module;
-                       }
+       public static function setIndexedTagName( array &$arr, $tag ) {
+               if ( !is_string( $tag ) ) {
+                       throw new InvalidArgumentException( 'Bad tag name' );
                }
+               $arr[self::META_INDEXED_TAG_NAME] = $tag;
+       }
 
-               return array(
-                       $this->generatorDone,
-                       $runModules,
-               );
+       /**
+        * Set the tag name for numeric-keyed values in XML format
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string $tag Tag name
+        */
+       public function addIndexedTagName( $path, $tag ) {
+               $arr = &$this->path( $path );
+               self::setIndexedTagName( $arr, $tag );
        }
 
        /**
-        * Set the continuation parameter for a module
+        * Set indexed tag name on $arr and all subarrays
         *
-        * @since 1.24
+        * @since 1.25
+        * @param array &$arr
+        * @param string $tag Tag name
+        */
+       public static function setIndexedTagNameRecursive( array &$arr, $tag ) {
+               if ( !is_string( $tag ) ) {
+                       throw new InvalidArgumentException( 'Bad tag name' );
+               }
+               $arr[self::META_INDEXED_TAG_NAME] = $tag;
+               foreach ( $arr as $k => &$v ) {
+                       if ( !self::isMetadataKey( $k ) && is_array( $v ) ) {
+                               self::setIndexedTagNameRecursive( $v, $tag );
+                       }
+               }
+       }
+
+       /**
+        * Set indexed tag name on $path and all subarrays
+        *
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string $tag Tag name
+        */
+       public function addIndexedTagNameRecursive( $path, $tag ) {
+               $arr = &$this->path( $path );
+               self::setIndexedTagNameRecursive( $arr, $tag );
+       }
+
+       /**
+        * Preserve specified keys.
+        *
+        * This prevents XML name mangling and preventing keys from being removed
+        * by self::stripMetadata().
+        *
+        * @since 1.25
+        * @param array &$arr
+        * @param array|string $names The element name(s) to preserve
+        */
+       public static function setPreserveKeysList( array &$arr, $names ) {
+               if ( !isset( $arr[self::META_PRESERVE_KEYS] ) ) {
+                       $arr[self::META_PRESERVE_KEYS] = (array)$names;
+               } else {
+                       $arr[self::META_PRESERVE_KEYS] = array_merge( $arr[self::META_PRESERVE_KEYS], (array)$names );
+               }
+       }
+
+       /**
+        * Preserve specified keys.
+        * @since 1.25
+        * @see self::setPreserveKeysList()
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param array|string $names The element name(s) to preserve
+        */
+       public function addPreserveKeysList( $path, $names ) {
+               $arr = &$this->path( $path );
+               self::setPreserveKeysList( $arr, $names );
+       }
+
+       /**
+        * Don't preserve specified keys.
+        * @since 1.25
+        * @see self::setPreserveKeysList()
+        * @param array &$arr
+        * @param array|string $names The element name(s) to not preserve
+        */
+       public static function unsetPreserveKeysList( array &$arr, $names ) {
+               if ( isset( $arr[self::META_PRESERVE_KEYS] ) ) {
+                       $arr[self::META_PRESERVE_KEYS] = array_diff( $arr[self::META_PRESERVE_KEYS], (array)$names );
+               }
+       }
+
+       /**
+        * Don't preserve specified keys.
+        * @since 1.25
+        * @see self::setPreserveKeysList()
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param array|string $names The element name(s) to not preserve
+        */
+       public function removePreserveKeysList( $path, $names ) {
+               $arr = &$this->path( $path );
+               self::unsetPreserveKeysList( $arr, $names );
+       }
+
+       /**
+        * Set the array data type
+        *
+        * @since 1.25
+        * @param array &$arr
+        * @param string $type See ApiResult::META_TYPE
+        * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
+        */
+       public static function setArrayType( array &$arr, $type, $kvpKeyName = null ) {
+               if ( !in_array( $type, array( 'default', 'array', 'assoc', 'kvp', 'BCarray', 'BCassoc', 'BCkvp' ), true ) ) {
+                       throw new InvalidArgumentException( 'Bad type' );
+               }
+               $arr[self::META_TYPE] = $type;
+               if ( is_string( $kvpKeyName ) ) {
+                       $arr[self::META_KVP_KEY_NAME] = $kvpKeyName;
+               }
+       }
+
+       /**
+        * Set the array data type for a path
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string $type See ApiResult::META_TYPE
+        * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
+        */
+       public function addArrayType( $path, $tag, $kvpKeyName = null ) {
+               $arr = &$this->path( $path );
+               self::setArrayType( $arr, $tag, $kvpKeyName );
+       }
+
+       /**
+        * Set the array data type recursively
+        * @since 1.25
+        * @param array &$arr
+        * @param string $type See ApiResult::META_TYPE
+        * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
+        */
+       public static function setArrayTypeRecursive( array &$arr, $type, $kvpKeyName = null ) {
+               self::setArrayType( $arr, $type, $kvpKeyName );
+               foreach ( $arr as $k => &$v ) {
+                       if ( !self::isMetadataKey( $k ) && is_array( $v ) ) {
+                               self::setArrayTypeRecursive( $v, $type, $kvpKeyName );
+                       }
+               }
+       }
+
+       /**
+        * Set the array data type for a path recursively
+        * @since 1.25
+        * @param array|string|null $path See ApiResult::addValue()
+        * @param string $type See ApiResult::META_TYPE
+        * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
+        */
+       public function addArrayTypeRecursive( $path, $tag, $kvpKeyName = null ) {
+               $arr = &$this->path( $path );
+               self::setArrayTypeRecursive( $arr, $tag, $kvpKeyName );
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Utility
+        * @{
+        */
+
+       /**
+        * Test whether a key should be considered metadata
+        *
+        * @param string $key
+        * @return bool
+        */
+       public static function isMetadataKey( $key ) {
+               return substr( $key, 0, 1 ) === '_';
+       }
+
+       /**
+        * Apply transformations to an array, returning the transformed array.
+        *
+        * @see ApiResult::getResultData()
+        * @since 1.25
+        * @param array $data
+        * @param array $transforms
+        * @return array|object
+        */
+       protected static function applyTransformations( array $dataIn, array $transforms ) {
+               $strip = isset( $transforms['Strip'] ) ? $transforms['Strip'] : 'none';
+               if ( $strip === 'base' ) {
+                       $transforms['Strip'] = 'none';
+               }
+               $transformTypes = isset( $transforms['Types'] ) ? $transforms['Types'] : null;
+               if ( $transformTypes !== null && !is_array( $transformTypes ) ) {
+                       throw new InvalidArgumentException( __METHOD__ . ':Value for "Types" must be an array' );
+               }
+
+               $metadata = array();
+               $data = self::stripMetadataNonRecursive( $dataIn, $metadata );
+
+               if ( isset( $transforms['Custom'] ) ) {
+                       if ( !is_callable( $transforms['Custom'] ) ) {
+                               throw new InvalidArgumentException( __METHOD__ . ': Value for "Custom" must be callable' );
+                       }
+                       call_user_func_array( $transforms['Custom'], array( &$data, &$metadata ) );
+               }
+
+               if ( ( isset( $transforms['BC'] ) || $transformTypes !== null ) &&
+                       isset( $metadata[self::META_TYPE] ) && $metadata[self::META_TYPE] === 'BCkvp' &&
+                       !isset( $metadata[self::META_KVP_KEY_NAME] )
+               ) {
+                       throw new UnexpectedValueException( 'Type "BCkvp" used without setting ' .
+                               'ApiResult::META_KVP_KEY_NAME metadata item' );
+               }
+
+               // BC transformations
+               $boolKeys = null;
+               $forceKVP = false;
+               if ( isset( $transforms['BC'] ) ) {
+                       if ( !is_array( $transforms['BC'] ) ) {
+                               throw new InvalidArgumentException( __METHOD__ . ':Value for "BC" must be an array' );
+                       }
+                       if ( !in_array( 'nobool', $transforms['BC'], true ) ) {
+                               $boolKeys = isset( $metadata[self::META_BC_BOOLS] )
+                                       ? array_flip( $metadata[self::META_BC_BOOLS] )
+                                       : array();
+                       }
+
+                       if ( !in_array( 'no*', $transforms['BC'], true ) &&
+                               isset( $metadata[self::META_CONTENT] ) && $metadata[self::META_CONTENT] !== '*'
+                       ) {
+                               $k = $metadata[self::META_CONTENT];
+                               $data['*'] = $data[$k];
+                               unset( $data[$k] );
+                               $metadata[self::META_CONTENT] = '*';
+                       }
+
+                       if ( !in_array( 'nosub', $transforms['BC'], true ) &&
+                               isset( $metadata[self::META_BC_SUBELEMENTS] )
+                       ) {
+                               foreach ( $metadata[self::META_BC_SUBELEMENTS] as $k ) {
+                                       $data[$k] = array(
+                                               '*' => $data[$k],
+                                               self::META_CONTENT => '*',
+                                               self::META_TYPE => 'assoc',
+                                       );
+                               }
+                       }
+
+                       if ( isset( $metadata[self::META_TYPE] ) ) {
+                               switch ( $metadata[self::META_TYPE] ) {
+                                       case 'BCarray':
+                                       case 'BCassoc':
+                                               $metadata[self::META_TYPE] = 'default';
+                                               break;
+                                       case 'BCkvp':
+                                               $transformTypes['ArmorKVP'] = $metadata[self::META_KVP_KEY_NAME];
+                                               break;
+                               }
+                       }
+               }
+
+               // Figure out type, do recursive calls, and do boolean transform if necessary
+               $defaultType = 'array';
+               $maxKey = -1;
+               foreach ( $data as $k => &$v ) {
+                       $v = is_array( $v ) ? self::applyTransformations( $v, $transforms ) : $v;
+                       if ( $boolKeys !== null && is_bool( $v ) && !isset( $boolKeys[$k] ) ) {
+                               if ( !$v ) {
+                                       unset( $data[$k] );
+                                       continue;
+                               }
+                               $v = '';
+                       }
+                       if ( is_string( $k ) ) {
+                               $defaultType = 'assoc';
+                       } elseif ( $k > $maxKey ) {
+                               $maxKey = $k;
+                       }
+               }
+               unset( $v );
+
+               // Determine which metadata to keep
+               switch ( $strip ) {
+                       case 'all':
+                       case 'base':
+                               $keepMetadata = array();
+                               break;
+                       case 'none':
+                               $keepMetadata = &$metadata;
+                               break;
+                       case 'bc':
+                               $keepMetadata = array_intersect_key( $metadata, array(
+                                       self::META_INDEXED_TAG_NAME => 1,
+                                       self::META_SUBELEMENTS => 1,
+                               ) );
+                               break;
+                       default:
+                               throw new InvalidArgumentException( __METHOD__ . ': Unknown value for "Strip"' );
+               }
+
+               // Type transformation
+               if ( $transformTypes !== null ) {
+                       if ( $defaultType === 'array' && $maxKey !== count( $data ) - 1 ) {
+                               $defaultType = 'assoc';
+                       }
+
+                       // Override type, if provided
+                       $type = $defaultType;
+                       if ( isset( $metadata[self::META_TYPE] ) && $metadata[self::META_TYPE] !== 'default' ) {
+                               $type = $metadata[self::META_TYPE];
+                       }
+                       if ( ( $type === 'kvp' || $type === 'BCkvp' ) &&
+                               empty( $transformTypes['ArmorKVP'] )
+                       ) {
+                               $type = 'assoc';
+                       } elseif ( $type === 'BCarray' ) {
+                               $type = 'array';
+                       } elseif ( $type === 'BCassoc' ) {
+                               $type = 'assoc';
+                       }
+
+                       // Apply transformation
+                       switch ( $type ) {
+                               case 'assoc':
+                                       $metadata[self::META_TYPE] = 'assoc';
+                                       $data += $keepMetadata;
+                                       return empty( $transformTypes['AssocAsObject'] ) ? $data : (object)$data;
+
+                               case 'array':
+                                       ksort( $data );
+                                       $data = array_values( $data );
+                                       $metadata[self::META_TYPE] = 'array';
+                                       return $data + $keepMetadata;
+
+                               case 'kvp':
+                               case 'BCkvp':
+                                       $key = isset( $metadata[self::META_KVP_KEY_NAME] )
+                                               ? $metadata[self::META_KVP_KEY_NAME]
+                                               : $transformTypes['ArmorKVP'];
+                                       $valKey = isset( $transforms['BC'] ) ? '*' : 'value';
+                                       $assocAsObject = !empty( $transformTypes['AssocAsObject'] );
+
+                                       $ret = array();
+                                       foreach ( $data as $k => $v ) {
+                                               $item = array(
+                                                       $key => $k,
+                                                       $valKey => $v,
+                                               );
+                                               if ( $strip === 'none' ) {
+                                                       $item += array(
+                                                               self::META_PRESERVE_KEYS => array( $key ),
+                                                               self::META_CONTENT => $valKey,
+                                                               self::META_TYPE => 'assoc',
+                                                       );
+                                               }
+                                               $ret[] = $assocAsObject ? (object)$item : $item;
+                                       }
+                                       $metadata[self::META_TYPE] = 'array';
+
+                                       return $ret + $keepMetadata;
+
+                               default:
+                                       throw new UnexpectedValueException( "Unknown type '$type'" );
+                       }
+               } else {
+                       return $data + $keepMetadata;
+               }
+       }
+
+       /**
+        * Recursively remove metadata keys from a data array or object
+        *
+        * Note this removes all potential metadata keys, not just the defined
+        * ones.
+        *
+        * @since 1.25
+        * @param array|object $data
+        * @return array|object
+        */
+       public static function stripMetadata( $data ) {
+               if ( is_array( $data ) || is_object( $data ) ) {
+                       $isObj = is_object( $data );
+                       if ( $isObj ) {
+                               $data = (array)$data;
+                       }
+                       $preserveKeys = isset( $data[self::META_PRESERVE_KEYS] )
+                               ? (array)$data[self::META_PRESERVE_KEYS]
+                               : array();
+                       foreach ( $data as $k => $v ) {
+                               if ( self::isMetadataKey( $k ) && !in_array( $k, $preserveKeys, true ) ) {
+                                       unset( $data[$k] );
+                               } elseif ( is_array( $v ) || is_object( $v ) ) {
+                                       $data[$k] = self::stripMetadata( $v );
+                               }
+                       }
+                       if ( $isObj ) {
+                               $data = (object)$data;
+                       }
+               }
+               return $data;
+       }
+
+       /**
+        * Remove metadata keys from a data array or object, non-recursive
+        *
+        * Note this removes all potential metadata keys, not just the defined
+        * ones.
+        *
+        * @since 1.25
+        * @param array|object $data
+        * @param array &$metadata Store metadata here, if provided
+        * @return array|object
+        */
+       public static function stripMetadataNonRecursive( $data, &$metadata = null ) {
+               if ( !is_array( $metadata ) ) {
+                       $metadata = array();
+               }
+               if ( is_array( $data ) || is_object( $data ) ) {
+                       $isObj = is_object( $data );
+                       if ( $isObj ) {
+                               $data = (array)$data;
+                       }
+                       $preserveKeys = isset( $data[self::META_PRESERVE_KEYS] )
+                               ? (array)$data[self::META_PRESERVE_KEYS]
+                               : array();
+                       foreach ( $data as $k => $v ) {
+                               if ( self::isMetadataKey( $k ) && !in_array( $k, $preserveKeys, true ) ) {
+                                       $metadata[$k] = $v;
+                                       unset( $data[$k] );
+                               }
+                       }
+                       if ( $isObj ) {
+                               $data = (object)$data;
+                       }
+               }
+               return $data;
+       }
+
+       /**
+        * Get the 'real' size of a result item. This means the strlen() of the item,
+        * or the sum of the strlen()s of the elements if the item is an array.
+        * @note Once the deprecated public self::size is removed, we can rename this back to a less awkward name.
+        * @param mixed $value
+        * @return int
+        */
+       private static function valueSize( $value ) {
+               $s = 0;
+               if ( is_array( $value ) ||
+                       is_object( $value ) && !is_callable( array( $value, '__toString' ) )
+               ) {
+                       foreach ( $value as $k => $v ) {
+                               if ( !self::isMetadataKey( $s ) ) {
+                                       $s += self::valueSize( $v );
+                               }
+                       }
+               } elseif ( is_scalar( $value ) ) {
+                       $s = strlen( $value );
+               }
+
+               return $s;
+       }
+
+       /**
+        * Return a reference to the internal data at $path
+        *
+        * @param array|string|null $path
+        * @param string $create
+        *   If 'append', append empty arrays.
+        *   If 'prepend', prepend empty arrays.
+        *   If 'dummy', return a dummy array.
+        *   Else, raise an error.
+        * @return array
+        */
+       private function &path( $path, $create = 'append' ) {
+               $path = (array)$path;
+               $ret = &$this->data;
+               foreach ( $path as $i => $k ) {
+                       if ( !isset( $ret[$k] ) ) {
+                               switch ( $create ) {
+                                       case 'append':
+                                               $ret[$k] = array();
+                                               break;
+                                       case 'prepend':
+                                               $ret = array( $k => array() ) + $ret;
+                                               break;
+                                       case 'dummy':
+                                               $tmp = array();
+                                               return $tmp;
+                                       default:
+                                               $fail = join( '.', array_slice( $path, 0, $i + 1 ) );
+                                               throw new InvalidArgumentException( "Path $fail does not exist" );
+                               }
+                       }
+                       if ( !is_array( $ret[$k] ) ) {
+                               $fail = join( '.', array_slice( $path, 0, $i + 1 ) );
+                               throw new InvalidArgumentException( "Path $fail is not an array" );
+                       }
+                       $ret = &$ret[$k];
+               }
+               return $ret;
+       }
+
+       /**@}*/
+
+       /************************************************************************//**
+        * @name   Deprecated
+        * @{
+        */
+
+       /**
+        * Call this function when special elements such as '_element'
+        * are needed by the formatter, for example in XML printing.
+        * @deprecated since 1.25, you shouldn't have been using it in the first place
+        * @since 1.23 $flag parameter added
+        * @param bool $flag Set the raw mode flag to this state
+        */
+       public function setRawMode( $flag = true ) {
+               // Can't wfDeprecated() here, since we need to set this flag from
+               // ApiMain for BC with stuff using self::getIsRawMode as
+               // "self::getIsXMLMode".
+               $this->isRawMode = $flag;
+       }
+
+       /**
+        * Returns true whether the formatter requested raw data.
+        * @deprecated since 1.25, you shouldn't have been using it in the first place
+        * @return bool
+        */
+       public function getIsRawMode() {
+               /// @todo: After Wikibase stops calling this, warn
+               return $this->isRawMode;
+       }
+
+       /**
+        * Get the result's internal data array (read-only)
+        * @deprecated since 1.25, use $this->getResultData() instead
+        * @return array
+        */
+       public function getData() {
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->getResultData( null, array(
+                       'BC' => array(),
+                       'Types' => array(),
+                       'Strip' => $this->isRawMode ? 'bc' : 'all',
+               ) );
+       }
+
+       /**
+        * Disable size checking in addValue(). Don't use this unless you
+        * REALLY know what you're doing. Values added while size checking
+        * was disabled will not be counted (ever)
+        * @deprecated since 1.24, use ApiResult::NO_SIZE_CHECK
+        */
+       public function disableSizeCheck() {
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->checkingSize = false;
+       }
+
+       /**
+        * Re-enable size checking in addValue()
+        * @deprecated since 1.24, use ApiResult::NO_SIZE_CHECK
+        */
+       public function enableSizeCheck() {
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->checkingSize = true;
+       }
+
+       /**
+        * Alias for self::setValue()
+        *
+        * @since 1.21 int $flags replaced boolean $override
+        * @deprecated since 1.25, use self::setValue() instead
+        * @param array $arr To add $value to
+        * @param string $name Index of $arr to add $value at
+        * @param mixed $value
+        * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
+        *    This parameter used to be boolean, and the value of OVERRIDE=1 was
+        *    specifically chosen so that it would be backwards compatible with the
+        *    new method signature.
+        */
+       public static function setElement( &$arr, $name, $value, $flags = 0 ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               return self::setValue( $arr, $name, $value, $flags );
+       }
+
+       /**
+        * Adds a content element to an array.
+        * Use this function instead of hardcoding the '*' element.
+        * @deprecated since 1.25, use self::setContentValue() instead
+        * @param array $arr To add the content element to
+        * @param mixed $value
+        * @param string $subElemName When present, content element is created
+        *  as a sub item of $arr. Use this parameter to create elements in
+        *  format "<elem>text</elem>" without attributes.
+        */
+       public static function setContent( &$arr, $value, $subElemName = null ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( is_array( $value ) ) {
+                       throw new InvalidArgumentException( __METHOD__ . ': Bad parameter' );
+               }
+               if ( is_null( $subElemName ) ) {
+                       self::setContentValue( $arr, 'content', $value );
+               } else {
+                       if ( !isset( $arr[$subElemName] ) ) {
+                               $arr[$subElemName] = array();
+                       }
+                       self::setContentValue( $arr[$subElemName], 'content', $value );
+               }
+       }
+
+       /**
+        * Set indexed tag name on all subarrays of $arr
+        *
+        * Does not set the tag name for $arr itself.
+        *
+        * @deprecated since 1.25, use self::setIndexedTagNameRecursive() instead
+        * @param array $arr
+        * @param string $tag Tag name
+        */
+       public function setIndexedTagName_recursive( &$arr, $tag ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( !is_array( $arr ) ) {
+                       return;
+               }
+               if ( !is_string( $tag ) ) {
+                       throw new InvalidArgumentException( 'Bad tag name' );
+               }
+               foreach ( $arr as $k => &$v ) {
+                       if ( !self::isMetadataKey( $k ) && is_array( $v ) ) {
+                               $v[self::META_INDEXED_TAG_NAME] = $tag;
+                               $this->setIndexedTagName_recursive( $v, $tag );
+                       }
+               }
+       }
+
+       /**
+        * Alias for self::addIndexedTagName()
+        * @deprecated since 1.25, use $this->addIndexedTagName() instead
+        * @param array $path Path to the array, like addValue()'s $path
+        * @param string $tag
+        */
+       public function setIndexedTagName_internal( $path, $tag ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               $this->addIndexedTagName( $path, $tag );
+       }
+
+       /**
+        * Alias for self::addParsedLimit()
+        * @deprecated since 1.25, use $this->addParsedLimit() instead
+        * @param string $moduleName
+        * @param int $limit
+        */
+       public function setParsedLimit( $moduleName, $limit ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               $this->addParsedLimit( $moduleName, $limit );
+       }
+
+       /**
+        * Set the ApiMain for use by $this->beginContinuation()
+        * @since 1.25
+        * @deprecated for backwards compatibility only, do not use
+        * @param ApiMain $main
+        */
+       public function setMainForContinuation( ApiMain $main ) {
+               $this->mainForContinuation = $main;
+       }
+
+       /**
+        * Parse a 'continue' parameter and return status information.
+        *
+        * This must be balanced by a call to endContinuation().
+        *
+        * @since 1.24
+        * @deprecated since 1.25, use ApiContinuationManager instead
+        * @param string|null $continue
+        * @param ApiBase[] $allModules
+        * @param array $generatedModules
+        * @return array
+        */
+       public function beginContinuation(
+               $continue, array $allModules = array(), array $generatedModules = array()
+       ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( $this->mainForContinuation->getContinuationManager() ) {
+                       throw new UnexpectedValueException(
+                               __METHOD__ . ': Continuation already in progress from ' .
+                               $this->mainForContinuation->getContinuationManager()->getSource()
+                       );
+               }
+
+               // Ugh. If $continue doesn't match that in the request, temporarily
+               // replace the request when creating the ApiContinuationManager.
+               if ( $continue === null ) {
+                       $continue = '';
+               }
+               if ( $this->mainForContinuation->getVal( 'continue', '' ) !== $continue ) {
+                       $oldCtx = $this->mainForContinuation->getContext();
+                       $newCtx = new DerivativeContext( $oldCtx );
+                       $newCtx->setRequest( new DerivativeRequest(
+                               $oldCtx->getRequest(),
+                               array( 'continue' => $continue ) + $oldCtx->getRequest()->getValues(),
+                               $oldCtx->getRequest()->wasPosted()
+                       ) );
+                       $this->mainForContinuation->setContext( $newCtx );
+                       $reset = new ScopedCallback(
+                               array( $this->mainForContinuation, 'setContext' ),
+                               array( $oldCtx )
+                       );
+               }
+               $manager = new ApiContinuationManager(
+                       $this->mainForContinuation, $allModules, $generatedModules
+               );
+               $reset = null;
+
+               $this->mainForContinuation->setContinuationManager( $manager );
+
+               return array(
+                       $manager->isGeneratorDone(),
+                       $manager->getRunModules(),
+               );
+       }
+
+       /**
+        * @since 1.24
+        * @deprecated since 1.25, use ApiContinuationManager instead
         * @param ApiBase $module
         * @param string $paramName
         * @param string|array $paramValue
-        * @throws MWException
         */
        public function setContinueParam( ApiBase $module, $paramName, $paramValue ) {
-               $name = $module->getModuleName();
-               if ( !isset( $this->continueAllModules[$name] ) ) {
-                       throw new MWException(
-                               "Module '$name' called ApiResult::setContinueParam but was not " .
-                               'passed to ApiResult::beginContinuation'
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( $this->mainForContinuation->getContinuationManager() ) {
+                       $this->mainForContinuation->getContinuationManager()->addContinueParam(
+                               $module, $paramName, $paramValue
                        );
                }
-               if ( !$this->continueAllModules[$name] ) {
-                       throw new MWException(
-                               "Module '$name' was not supposed to have been executed, but " .
-                               'it was executed anyway'
-                       );
-               }
-               $paramName = $module->encodeParamName( $paramName );
-               if ( is_array( $paramValue ) ) {
-                       $paramValue = join( '|', $paramValue );
-               }
-               $this->continuationData[$name][$paramName] = $paramValue;
        }
 
        /**
-        * Set the continuation parameter for the generator module
-        *
         * @since 1.24
+        * @deprecated since 1.25, use ApiContinuationManager instead
         * @param ApiBase $module
         * @param string $paramName
         * @param string|array $paramValue
         */
        public function setGeneratorContinueParam( ApiBase $module, $paramName, $paramValue ) {
-               $name = $module->getModuleName();
-               $paramName = $module->encodeParamName( $paramName );
-               if ( is_array( $paramValue ) ) {
-                       $paramValue = join( '|', $paramValue );
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( $this->mainForContinuation->getContinuationManager() ) {
+                       $this->mainForContinuation->getContinuationManager()->addGeneratorContinueParam(
+                               $module, $paramName, $paramValue
+                       );
                }
-               $this->generatorContinuationData[$name][$paramName] = $paramValue;
        }
 
        /**
         * Close continuation, writing the data into the result
-        *
         * @since 1.24
+        * @deprecated since 1.25, use ApiContinuationManager instead
         * @param string $style 'standard' for the new style since 1.21, 'raw' for
         *   the style used in 1.20 and earlier.
         */
        public function endContinuation( $style = 'standard' ) {
-               if ( $style === 'raw' ) {
-                       $key = 'query-continue';
-                       $data = array_merge_recursive(
-                               $this->continuationData, $this->generatorContinuationData
-                       );
-               } else {
-                       $key = 'continue';
-                       $data = array();
-                       $batchcomplete = false;
-
-                       $finishedModules = array_diff(
-                               array_keys( $this->continueAllModules ),
-                               array_keys( $this->continuationData )
-                       );
+               wfDeprecated( __METHOD__, '1.25' );
+               if ( !$this->mainForContinuation->getContinuationManager() ) {
+                       return;
+               }
 
-                       // First, grab the non-generator-using continuation data
-                       $continuationData = array_diff_key(
-                               $this->continuationData, $this->continueGeneratedModules
-                       );
-                       foreach ( $continuationData as $module => $kvp ) {
-                               $data += $kvp;
+               if ( $style === 'raw' ) {
+                       $data = $this->mainForContinuation->getContinuationManager()->getRawContinuation();
+                       if ( $data ) {
+                               $this->addValue( null, 'query-continue', $data, self::ADD_ON_TOP | self::NO_SIZE_CHECK );
                        }
+               } else {
+                       $this->mainForContinuation->getContinuationManager()->setContinuationIntoResult( $this );
+               }
+       }
 
-                       // Next, handle the generator-using continuation data
-                       $continuationData = array_intersect_key(
-                               $this->continuationData, $this->continueGeneratedModules
-                       );
-                       if ( $continuationData ) {
-                               // Some modules are unfinished: include those params, and copy
-                               // the generator params.
-                               foreach ( $continuationData as $module => $kvp ) {
-                                       $data += $kvp;
-                               }
-                               $data += array_intersect_key(
-                                       $this->getMain()->getRequest()->getValues(),
-                                       array_flip( $this->generatorParams )
-                               );
-                       } elseif ( $this->generatorContinuationData ) {
-                               // All the generator-using modules are complete, but the
-                               // generator isn't. Continue the generator and restart the
-                               // generator-using modules
-                               $this->generatorParams = array();
-                               foreach ( $this->generatorContinuationData as $kvp ) {
-                                       $this->generatorParams = array_merge(
-                                               $this->generatorParams, array_keys( $kvp )
-                                       );
-                                       $data += $kvp;
-                               }
-                               $finishedModules = array_diff(
-                                       $finishedModules, $this->continueGeneratedModules
-                               );
-                               $batchcomplete = true;
-                       } else {
-                               // Generator and prop modules are all done. Mark it so.
-                               $this->generatorDone = true;
-                               $batchcomplete = true;
-                       }
+       /**
+        * No-op, this is now checked on insert.
+        * @deprecated since 1.25
+        */
+       public function cleanUpUTF8() {
+               wfDeprecated( __METHOD__, '1.25' );
+       }
 
-                       // Set 'continue' if any continuation data is set or if the generator
-                       // still needs to run
-                       if ( $data || !$this->generatorDone ) {
-                               $data['continue'] =
-                                       ( $this->generatorDone ? '-' : join( '|', $this->generatorParams ) ) .
-                                       '||' . join( '|', $finishedModules );
-                       }
+       /**
+        * Get the 'real' size of a result item. This means the strlen() of the item,
+        * or the sum of the strlen()s of the elements if the item is an array.
+        * @deprecated since 1.25, no external users known and there doesn't seem
+        *  to be any case for such use over just checking the return value from the
+        *  add/set methods.
+        * @param mixed $value
+        * @return int
+        */
+       public static function size( $value ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               return self::valueSize( $value );
+       }
 
-                       if ( $batchcomplete ) {
-                               $this->addValue( null, 'batchcomplete', '', ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
-                       }
-               }
-               if ( $data ) {
-                       $this->addValue( null, $key, $data, ApiResult::ADD_ON_TOP | ApiResult::NO_SIZE_CHECK );
-               }
+       /**
+        * Converts a Status object to an array suitable for addValue
+        * @deprecated since 1.25, use ApiErrorFormatter::arrayFromStatus()
+        * @param Status $status
+        * @param string $errorType
+        * @return array
+        */
+       public function convertStatusToArray( $status, $errorType = 'error' ) {
+               wfDeprecated( __METHOD__, '1.25' );
+               return $this->errorFormatter->arrayFromStatus( $status, $errorType );
        }
+
+       /**@}*/
 }
+
+/**
+ * For really cool vim folding this needs to be at the end:
+ * vim: foldmarker=@{,@} foldmethod=marker
+ */
index 783a39b..2896231 100644 (file)
@@ -111,7 +111,7 @@ class ApiRevisionDelete extends ApiBase {
                // @codingStandardsIgnoreEnd
 
                $data['items'] = array_values( $data['items'] );
-               $result->setIndexedTagName( $data['items'], 'i' );
+               ApiResult::setIndexedTagName( $data['items'], 'i' );
                $result->addValue( null, $this->getModuleName(), $data );
        }
 
@@ -121,12 +121,12 @@ class ApiRevisionDelete extends ApiBase {
                );
                $errors = $this->formatStatusMessages( $status->getErrorsByType( 'error' ) );
                if ( $errors ) {
-                       $this->getResult()->setIndexedTagName( $errors, 'e' );
+                       ApiResult::setIndexedTagName( $errors, 'e' );
                        $ret['errors'] = $errors;
                }
                $warnings = $this->formatStatusMessages( $status->getErrorsByType( 'warning' ) );
                if ( $warnings ) {
-                       $this->getResult()->setIndexedTagName( $warnings, 'w' );
+                       ApiResult::setIndexedTagName( $warnings, 'w' );
                        $ret['warnings'] = $warnings;
                }
 
@@ -146,14 +146,14 @@ class ApiRevisionDelete extends ApiBase {
                                $message = array( 'message' => $msg->getKey() );
                                if ( $msg->getParams() ) {
                                        $message['params'] = $msg->getParams();
-                                       $result->setIndexedTagName( $message['params'], 'p' );
+                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
                                }
                        } else {
                                $message = array( 'message' => $m['message'] );
                                $msg = wfMessage( $m['message'] );
                                if ( isset( $m['params'] ) ) {
                                        $message['params'] = $m['params'];
-                                       $result->setIndexedTagName( $message['params'], 'p' );
+                                       ApiResult::setIndexedTagName( $message['params'], 'p' );
                                        $msg->params( $m['params'] );
                                }
                        }
index f28e610..d466112 100644 (file)
@@ -37,12 +37,15 @@ class ApiRsd extends ApiBase {
                $result->addValue( null, 'version', '1.0' );
                $result->addValue( null, 'xmlns', 'http://archipelago.phrasewise.com/rsd' );
 
-               $service = array( 'apis' => $this->formatRsdApiList() );
-               ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
-               ApiResult::setContent( $service, 'https://www.mediawiki.org/', 'engineLink' );
-               ApiResult::setContent( $service, Title::newMainPage()->getCanonicalURL(), 'homePageLink' );
+               $service = array(
+                       'apis' => $this->formatRsdApiList(),
+                       'engineName' => 'MediaWiki',
+                       'engineLink' => 'https://www.mediawiki.org/',
+                       'homePageLink' => Title::newMainPage()->getCanonicalURL(),
+               );
 
-               $result->setIndexedTagName( $service['apis'], 'api' );
+               ApiResult::setSubelementsList( $service, array( 'engineName', 'engineLink', 'homePageLink' ) );
+               ApiResult::setIndexedTagName( $service['apis'], 'api' );
 
                $result->addValue( null, 'service', $service );
        }
@@ -123,7 +126,8 @@ class ApiRsd extends ApiBase {
                        );
                        $settings = array();
                        if ( isset( $info['docs'] ) ) {
-                               ApiResult::setContent( $settings, $info['docs'], 'docs' );
+                               $settings['docs'] = $info['docs'];
+                               ApiResult::setSubelementsList( $settings, 'docs' );
                        }
                        if ( isset( $info['settings'] ) ) {
                                foreach ( $info['settings'] as $setting => $val ) {
@@ -133,12 +137,12 @@ class ApiRsd extends ApiBase {
                                                $xmlVal = $val;
                                        }
                                        $setting = array( 'name' => $setting );
-                                       ApiResult::setContent( $setting, $xmlVal );
+                                       ApiResult::setContentValue( $setting, 'value', $xmlVal );
                                        $settings[] = $setting;
                                }
                        }
                        if ( count( $settings ) ) {
-                               $this->getResult()->setIndexedTagName( $settings, 'setting' );
+                               ApiResult::setIndexedTagName( $settings, 'setting' );
                                $data['settings'] = $settings;
                        }
                        $outputData[] = $data;
@@ -157,4 +161,9 @@ class ApiFormatXmlRsd extends ApiFormatXml {
        public function getMimeType() {
                return 'application/rsd+xml';
        }
+
+       public static function recXmlPrint( $name, $value, $indent, $attributes = array() ) {
+               unset( $attributes['_idx'] );
+               return parent::recXmlPrint( $name, $value, $indent, $attributes );
+       }
 }
diff --git a/includes/api/ApiSerializable.php b/includes/api/ApiSerializable.php
new file mode 100644 (file)
index 0000000..70e93a6
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Created on Feb 25, 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
+ */
+
+/**
+ * This interface allows for overriding the default conversion applied by
+ * ApiResult::validateValue().
+ *
+ * @note This is currently an informal interface; it need not be explicitly
+ *   implemented, as long as the method is provided. This allows for extension
+ *   code to maintain compatibility with older MediaWiki while still taking
+ *   advantage of this where it exists.
+ *
+ * @ingroup API
+ * @since 1.25
+ */
+interface ApiSerializable {
+       /**
+        * Return the value to be added to ApiResult in place of this object.
+        *
+        * The returned value must not be an object, and must pass
+        * all checks done by ApiResult::validateValue().
+        *
+        * @return mixed
+        */
+       public function serializeForApiResult();
+}
index dec64cc..86a3f6a 100644 (file)
@@ -46,7 +46,8 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $params = $this->extractRequestParams();
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
 
-               $this->getResult()->beginContinuation( $params['continue'], array(), array() );
+               $continuationManager = new ApiContinuationManager( $this, array(), array() );
+               $this->setContinuationManager( $continuationManager );
 
                $pageSet = $this->getPageSet();
                if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
@@ -114,21 +115,21 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        foreach ( $pageSet->getInvalidTitles() as $title ) {
                                $r = array();
                                $r['title'] = $title;
-                               $r['invalid'] = '';
+                               $r['invalid'] = true;
                                $result[] = $r;
                        }
                        foreach ( $pageSet->getMissingPageIDs() as $p ) {
                                $page = array();
                                $page['pageid'] = $p;
-                               $page['missing'] = '';
-                               $page['notwatched'] = '';
+                               $page['missing'] = true;
+                               $page['notwatched'] = true;
                                $result[] = $page;
                        }
                        foreach ( $pageSet->getMissingRevisionIDs() as $r ) {
                                $rev = array();
                                $rev['revid'] = $r;
-                               $rev['missing'] = '';
-                               $rev['notwatched'] = '';
+                               $rev['missing'] = true;
+                               $rev['notwatched'] = true;
                                $result[] = $rev;
                        }
 
@@ -162,7 +163,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                                'title' => $title->getPrefixedText(),
                                        );
                                        if ( !$title->exists() ) {
-                                               $r['missing'] = '';
+                                               $r['missing'] = true;
                                        }
                                        if ( isset( $timestamps[$ns] ) && array_key_exists( $dbkey, $timestamps[$ns] ) ) {
                                                $r['notificationtimestamp'] = '';
@@ -170,17 +171,18 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                                        $r['notificationtimestamp'] = wfTimestamp( TS_ISO_8601, $timestamps[$ns][$dbkey] );
                                                }
                                        } else {
-                                               $r['notwatched'] = '';
+                                               $r['notwatched'] = true;
                                        }
                                        $result[] = $r;
                                }
                        }
 
-                       $apiResult->setIndexedTagName( $result, 'page' );
+                       ApiResult::setIndexedTagName( $result, 'page' );
                }
                $apiResult->addValue( null, $this->getModuleName(), $result );
 
-               $apiResult->endContinuation();
+               $this->setContinuationManager( null );
+               $continuationManager->setContinuationIntoResult( $apiResult );
        }
 
        /**
diff --git a/includes/api/ApiTag.php b/includes/api/ApiTag.php
new file mode 100644 (file)
index 0000000..527c6cb
--- /dev/null
@@ -0,0 +1,177 @@
+<?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 ApiTag extends ApiBase {
+
+       protected function getAvailableTags() {
+               return ChangeTags::listExplicitlyDefinedTags();
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               // make sure the user is allowed
+               if ( !$this->getUser()->isAllowed( 'changetags' ) ) {
+                       $this->dieUsage( "You don't have permission to add or remove change tags from individual edits",
+                               'permissiondenied' );
+               }
+
+               // validate and process each revid, rcid and logid
+               $this->requireAtLeastOneParameter( $params, 'revid', 'rcid', 'logid' );
+               $ret = array();
+               if ( $params['revid'] ) {
+                       foreach ( $params['revid'] as $id ) {
+                               $ret[] = $this->processIndividual( 'revid', $params, $id );
+                       }
+               }
+               if ( $params['rcid'] ) {
+                       foreach ( $params['rcid'] as $id ) {
+                               $ret[] = $this->processIndividual( 'rcid', $params, $id );
+                       }
+               }
+               if ( $params['logid'] ) {
+                       foreach ( $params['logid'] as $id ) {
+                               $ret[] = $this->processIndividual( 'logid', $params, $id );
+                       }
+               }
+
+               ApiResult::setIndexedTagName( $ret, 'result' );
+               $this->getResult()->addValue( null, $this->getModuleName(), $ret );
+       }
+
+       protected static function validateLogId( $logid ) {
+               $dbr = wfGetDB( DB_SLAVE );
+               $result = $dbr->selectField( 'logging', 'log_id', array( 'log_id' => $logid ),
+                       __METHOD__ );
+               return (bool)$result;
+       }
+
+       protected function processIndividual( $type, $params, $id ) {
+               $idResult = array( $type => $id );
+
+               // validate the ID
+               $valid = false;
+               switch ( $type ) {
+                       case 'rcid':
+                               $valid = RecentChange::newFromId( $id );
+                               break;
+                       case 'revid':
+                               $valid = Revision::newFromId( $id );
+                               break;
+                       case 'logid':
+                               $valid = self::validateLogId( $id );
+                               break;
+               }
+
+               if ( !$valid ) {
+                       $idResult['status'] = 'error';
+                       $idResult += $this->parseMsg( array( "nosuch$type", $id ) );
+                       return $idResult;
+               }
+
+               $status = ChangeTags::updateTagsWithChecks( $params['add'],
+                       $params['remove'],
+                       ( $type === 'rcid' ? $id : null ),
+                       ( $type === 'revid' ? $id : null ),
+                       ( $type === 'logid' ? $id : null ),
+                       null,
+                       $params['reason'],
+                       $this->getUser() );
+
+               if ( !$status->isOK() ) {
+                       if ( $status->hasMessage( 'actionthrottledtext' ) ) {
+                               $idResult['status'] = 'skipped';
+                       } else {
+                               $idResult['status'] = 'failure';
+                               $idResult['errors'] = $this->getErrorFormatter()->arrayFromStatus( $status, 'error' );
+                       }
+               } else {
+                       $idResult['status'] = 'success';
+                       if ( is_null( $status->value->logId ) ) {
+                               $idResult['noop'] = '';
+                       } else {
+                               $idResult['actionlogid'] = $status->value->logId;
+                               $idResult['added'] = $status->value->addedTags;
+                               ApiResult::setIndexedTagName( $idResult['added'], 't' );
+                               $idResult['removed'] = $status->value->removedTags;
+                               ApiResult::setIndexedTagName( $idResult['removed'], 't' );
+                       }
+               }
+               return $idResult;
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'rcid' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'revid' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'logid' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'add' => array(
+                               ApiBase::PARAM_TYPE => $this->getAvailableTags(),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'remove' => array(
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'reason' => array(
+                               ApiBase::PARAM_DFLT => '',
+                       ),
+               );
+       }
+
+       public function needsToken() {
+               return 'csrf';
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=tag&revid=123&add=vandalism&token=123ABC'
+                               => 'apihelp-tag-example-rev',
+                       'action=tag&logid=123&remove=spam&reason=Wrongly+applied&token=123ABC'
+                               => 'apihelp-tag-example-log',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Tag';
+       }
+}
index 9eb4020..4d7fc5a 100644 (file)
@@ -37,7 +37,9 @@ class ApiTokens extends ApiBase {
                $this->logFeatureUsage( "action=tokens" );
 
                $params = $this->extractRequestParams();
-               $res = array();
+               $res = array(
+                       ApiResult::META_TYPE => 'assoc',
+               );
 
                $types = $this->getTokenTypes();
                foreach ( $params['type'] as $type ) {
index 78a4971..74ae05a 100644 (file)
@@ -514,20 +514,20 @@ class ApiUpload extends ApiBase {
                                        'filetype' => $verification['finalExt'],
                                        'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
                                );
-                               $this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
+                               ApiResult::setIndexedTagName( $extradata['allowed'], 'ext' );
 
                                $msg = "Filetype not permitted: ";
                                if ( isset( $verification['blacklistedExt'] ) ) {
                                        $msg .= join( ', ', $verification['blacklistedExt'] );
                                        $extradata['blacklisted'] = array_values( $verification['blacklistedExt'] );
-                                       $this->getResult()->setIndexedTagName( $extradata['blacklisted'], 'ext' );
+                                       ApiResult::setIndexedTagName( $extradata['blacklisted'], 'ext' );
                                } else {
                                        $msg .= $verification['finalExt'];
                                }
                                $this->dieUsage( $msg, 'filetype-banned', 0, $extradata );
                                break;
                        case UploadBase::VERIFICATION_ERROR:
-                               $this->getResult()->setIndexedTagName( $verification['details'], 'detail' );
+                               ApiResult::setIndexedTagName( $verification['details'], 'detail' );
                                $this->dieUsage( 'This file did not pass file verification', 'verification-error',
                                        0, array( 'details' => $verification['details'] ) );
                                break;
@@ -559,7 +559,7 @@ class ApiUpload extends ApiBase {
                if ( $warnings ) {
                        // Add indices
                        $result = $this->getResult();
-                       $result->setIndexedTagName( $warnings, 'warning' );
+                       ApiResult::setIndexedTagName( $warnings, 'warning' );
 
                        if ( isset( $warnings['duplicate'] ) ) {
                                $dupes = array();
@@ -567,7 +567,7 @@ class ApiUpload extends ApiBase {
                                foreach ( $warnings['duplicate'] as $dupe ) {
                                        $dupes[] = $dupe->getName();
                                }
-                               $result->setIndexedTagName( $dupes, 'duplicate' );
+                               ApiResult::setIndexedTagName( $dupes, 'duplicate' );
                                $warnings['duplicate'] = $dupes;
                        }
 
@@ -696,7 +696,7 @@ class ApiUpload extends ApiBase {
                                        );
                                }
 
-                               $this->getResult()->setIndexedTagName( $error, 'error' );
+                               ApiResult::setIndexedTagName( $error, 'error' );
                                $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
                        }
                        $result['result'] = 'Success';
index cf8ed5a..3ccdde2 100644 (file)
@@ -63,8 +63,8 @@ class ApiUserrights extends ApiBase {
                );
 
                $result = $this->getResult();
-               $result->setIndexedTagName( $r['added'], 'group' );
-               $result->setIndexedTagName( $r['removed'], 'group' );
+               ApiResult::setIndexedTagName( $r['added'], 'group' );
+               ApiResult::setIndexedTagName( $r['removed'], 'group' );
                $result->addValue( null, $this->getModuleName(), $r );
        }
 
index 09638f3..85d051d 100644 (file)
@@ -44,7 +44,8 @@ class ApiWatch extends ApiBase {
 
                $params = $this->extractRequestParams();
 
-               $this->getResult()->beginContinuation( $params['continue'], array(), array() );
+               $continuationManager = new ApiContinuationManager( $this, array(), array() );
+               $this->setContinuationManager( $continuationManager );
 
                $pageSet = $this->getPageSet();
                // by default we use pageset to extract the page to work on.
@@ -69,7 +70,7 @@ class ApiWatch extends ApiBase {
                                $r = $this->watchTitle( $title, $user, $params );
                                $res[] = $r;
                        }
-                       $this->getResult()->setIndexedTagName( $res, 'w' );
+                       ApiResult::setIndexedTagName( $res, 'w' );
                } else {
                        // dont allow use of old title parameter with new pageset parameters.
                        $extraParams = array_keys( array_filter( $pageSet->extractRequestParams(), function ( $x ) {
@@ -92,7 +93,9 @@ class ApiWatch extends ApiBase {
                        $res = $this->watchTitle( $title, $user, $params, true );
                }
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
-               $this->getResult()->endContinuation();
+
+               $this->setContinuationManager( null );
+               $continuationManager->setContinuationIntoResult( $this->getResult() );
        }
 
        private function watchTitle( Title $title, User $user, array $params,
@@ -106,15 +109,15 @@ class ApiWatch extends ApiBase {
 
                if ( $params['unwatch'] ) {
                        $status = UnwatchAction::doUnwatch( $title, $user );
+                       $res['unwatched'] = $status->isOK();
                        if ( $status->isOK() ) {
-                               $res['unwatched'] = '';
                                $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )
                                        ->title( $title )->parseAsBlock();
                        }
                } else {
                        $status = WatchAction::doWatch( $title, $user );
+                       $res['watched'] = $status->isOK();
                        if ( $status->isOK() ) {
-                               $res['watched'] = '';
                                $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )
                                        ->title( $title )->parseAsBlock();
                        }
diff --git a/includes/api/i18n/ast.json b/includes/api/i18n/ast.json
new file mode 100644 (file)
index 0000000..9494a7c
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Xuacu"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Llista d'alderique]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fallos y solicitúes]\n</div>\n<strong>Estau:</strong> Toles carauterístiques qu'apaecen nesta páxina tendríen de funcionar, pero la API inda ta en desendolcu activu, y puede camudar en cualquier momentu. Suscríbete a la [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ llista de corréu mediawiki-api-announce] p'avisos sobro anovamientos.\n\n<strong>Solicitúes incorreutes:</strong> Cuando s'unvíen solicitúes incorreutes a la API, unvíase una cabecera HTTP cola clave \"MediaWiki-API-Error\" y, darréu, tanto'l valor de la cabecera como'l códigu d'error devueltu pondránse al mesmu valor. Pa más información, consulta [[mw:API:Errors_and_warnings|API: Errores y avisos]].",
+       "apihelp-main-param-action": "Qué aición facer.",
+       "apihelp-main-param-format": "El formatu de la salida."
+}
index 1d866ba..5b05755 100644 (file)
@@ -8,5 +8,6 @@
        "apihelp-main-param-format": "Гойту формат.",
        "apihelp-main-param-curtimestamp": "Хилламийн юкъатоха ханна йолу билгало",
        "apihelp-createaccount-param-name": "Декъашхочун цӀе.",
-       "apihelp-userrights-param-userid": "Декъашхочун ID."
+       "apihelp-userrights-param-userid": "Декъашхочун ID.",
+       "api-help-datatypes-header": "Хаамийн тайпанаш"
 }
index 059eb82..d6a1fec 100644 (file)
        "apihelp-delete-param-title": "Název stránky, která se má smazat. Není možné použít společně s <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID stránky, která se má smazat. Není možné použít společně s <var>$1title</var>.",
        "apihelp-delete-param-watch": "Přidat stránku na seznam sledovaných.",
+       "apihelp-delete-param-unwatch": "Odstranit stránku ze seznamu sledovaných.",
        "apihelp-delete-example-simple": "Smazat stránku <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-reason": "Smazat stránku <kbd>Main Page</kbd> s odůvodněním <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Tento modul byl deaktivován.",
        "apihelp-edit-description": "Vytvářet a upravovat stránky.",
+       "apihelp-edit-param-title": "Název stránky, kterou chcete editovat. Nelze použít společně s <var>$1pageid</var>.",
+       "apihelp-edit-param-pageid": "ID stránky, která se má editovat. Není možné použít společně s <var>$1title</var>.",
        "apihelp-edit-param-sectiontitle": "Název nové sekce.",
        "apihelp-edit-param-text": "Obsah stránky.",
        "apihelp-edit-param-minor": "Malá editace.",
        "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-expandtemplates-description": "Rozbalí všechny šablony ve wikitextu.",
+       "apihelp-expandtemplates-param-title": "Název stránky.",
        "apihelp-expandtemplates-param-text": "Wikitext k převedení.",
+       "apihelp-expandtemplates-param-revid": "ID revize, pro <nowiki>{{REVISIONID}}</nowiki> a podobné proměnné.",
        "apihelp-feedcontributions-description": "Vrátí kanál příspěvků uživatele.",
        "apihelp-feedcontributions-param-feedformat": "Formát kanálu.",
        "apihelp-feedcontributions-param-year": "Od roku (a dříve).",
index 9617204..37a3b97 100644 (file)
        "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-description": "Listet alle Seiten in einem Namensraum nacheinander auf.",
+       "apihelp-query+allpages-param-from": "Seitentitel, bei dem die Auflistung beginnen soll.",
+       "apihelp-query+allpages-param-to": "Seitentitel, bei dem die Auflistung enden soll.",
+       "apihelp-query+allpages-param-prefix": "Nach Seitentiteln suchen, die mit diesem Wert beginnen.",
+       "apihelp-query+allpages-param-namespace": "Der zu untersuchende Namensraum.",
        "apihelp-query+allpages-param-filterredir": "Welche Seiten aufgelistet werden sollen.",
+       "apihelp-query+allpages-param-minsize": "Nur Seiten auflisten, die mindestens diese Größe in Byte haben.",
+       "apihelp-query+allpages-param-maxsize": "Nur Seiten auflisten, die höchstens diese Größe in Byte haben.",
+       "apihelp-query+allpages-param-prtype": "Nur geschützte Seiten auflisten.",
+       "apihelp-query+allpages-param-prlevel": "Seitenschutze nach Schutzstufe filtern (muss zusammen mit $1prtype=parameter angegeben werden).",
+       "apihelp-query+allpages-param-prfiltercascade": "Seitenschutze nach Kaskadierung filtern (wird ignoriert, wenn $1prtype nicht gesetzt ist).",
+       "apihelp-query+allpages-param-limit": "Gesamtanzahl der aufzulistenden Seiten.",
+       "apihelp-query+allpages-param-dir": "Aufzählungsrichtung.",
+       "apihelp-query+allpages-param-filterlanglinks": "Nur Seiten auflisten, die Sprachlinks haben. Beachte, dass von Erweiterungen gesetzte Sprachlinks möglicherweise nicht beachtet werden.",
+       "apihelp-query+allpages-param-prexpiry": "Ablaufzeit des Seitenschutzes, nach dem die Auflistung gefiltert werden soll:\n; indefinite: Nur unbeschränkt geschützte Seiten auflisten.\n; definite: Nur für einen bestimmten Zeitraum geschützte Seiten auflisten.\n; all: geschützte Seiten unabhängig von der Schutzlänge auflisten.",
+       "apihelp-query+allpages-example-B": "Bezieht eine Liste von Seiten, die mit dem Buchstaben <kbd>B</kbd> beginnen.",
+       "apihelp-query+allpages-example-generator": "Gibt Informationen über vier Seiten mit dem Anfangsbuchstaben <kbd>T</kbd> zurück.",
+       "apihelp-query+allpages-example-generator-revisions": "Übermittelt den Inhalt der ersten beiden Seiten, die mit <kbd>Re</kbd> beginnen und keine Weiterleitungen sind.",
+       "apihelp-query+allredirects-description": "Bezieht alle Weiterleitungen in einem Namensraum.",
+       "apihelp-query+allredirects-param-from": "Titel der Weiterleitung, bei der die Auflistung beginnen soll.",
+       "apihelp-query+allredirects-param-to": "Titel der Weiterleitung, bei der die Auflistung enden soll.",
+       "apihelp-query+allredirects-param-prefix": "Weiterleitungen auflisten, deren Zielseiten mit diesem Wert beginnen.",
+       "apihelp-query+allredirects-param-unique": "Nur Weiterleitungen mit unterschiedlichen Zielseiten anzeigen. Kann nicht zusammen mit $1prop=ids|fragment|interwiki benutzt werden. Bei Nutzung als Generator werden die Zielseiten anstelle der Ursprungsseiten zurückgegeben.",
+       "apihelp-query+allredirects-param-prop": "Zu beziehende Informationen:\n; ids: Ergänzt die Seitenkennung der Weiterleitungsseite (kann nicht zusammen mit <var>$1unique</var> benutzt werden).\n; title: Ergänzt den Titel der Weiterleitung.\n; fragment: Ergänzt das Abschnittsziel der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).\n; interwiki: Ergänzt das Interwiki-Präfix der Weiterleitung, falls vorhanden (kann nicht zusammen mit <var>$1unique</var> benutzt werden).",
+       "apihelp-query+allredirects-param-namespace": "Der zu untersuchende Namensraum.",
+       "apihelp-query+allredirects-param-limit": "Gesamtanzahl der aufzulistenden Einträge.",
+       "apihelp-query+allredirects-param-dir": "Aufzählungsrichtung.",
+       "apihelp-query+allredirects-example-B": "Listet Zielseiten, auch fehlende, mit den Seitenkennungen der Weiterleitung auf, beginnend bei <kbd>B</kbd>.",
        "apihelp-query+allredirects-example-unique": "Einzigartige Zielseiten auflisten.",
+       "apihelp-query+allredirects-example-unique-generator": "Bezieht alle Zielseiten und markiert die Fehlenden.",
        "apihelp-query+allredirects-example-generator": "Seiten abrufen, die die Weiterleitungen enthalten",
        "apihelp-query+alltransclusions-param-namespace": "Der aufzulistende Namensraum.",
        "apihelp-query+alltransclusions-example-unique": "Einzigartige eingebundene Titel auflisten.",
        "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-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. Standard, wenn <var>formatversion</var> nicht <kbd>1</kbd> ist.",
        "apihelp-jsonfm-description": "Daten im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-none-description": "Nichts ausgeben.",
        "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
index a6d9d61..5b3c076 100644 (file)
@@ -85,6 +85,7 @@
        "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-tags": "Change tags to apply to the revision.",
        "apihelp-edit-param-minor": "Minor edit.",
        "apihelp-edit-param-notminor": "Non-minor edit.",
        "apihelp-edit-param-bot": "Mark this edit as bot.",
        "apihelp-import-param-interwikipage": "For interwiki imports: page to import.",
        "apihelp-import-param-fullhistory": "For interwiki imports: import the full history, not just the current version.",
        "apihelp-import-param-templates": "For interwiki imports: import all included templates as well.",
-       "apihelp-import-param-namespace": "For interwiki imports: import to this namespace.",
-       "apihelp-import-param-rootpage": "Import as subpage of this page.",
+       "apihelp-import-param-namespace": "Import to this namespace. Overrides the <kbd>$1rootpage</kbd> parameter.",
+       "apihelp-import-param-rootpage": "Import as subpage of this page. Ignored if the <kbd>$1namespace</kbd> parameter is provided.",
        "apihelp-import-example-import": "Import [[meta:Help:Parserfunctions]] to namespace 100 with full history.",
 
        "apihelp-login-description": "Log in and get authentication cookies.\n\nIn the event of a successful log-in, the needed cookies will be included in the HTTP response headers. In the event of a failed log-in, further attempts may be throttled to limit automated password guessing attacks.",
        "apihelp-query+allfileusages-param-to": "The title of the file to stop enumerating at.",
        "apihelp-query+allfileusages-param-prefix": "Search for all file titles that begin with this value.",
        "apihelp-query+allfileusages-param-unique": "Only show distinct file titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "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-prop": "Which pieces of information to include:\n;ids:Adds the page IDs of the using pages (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 <kbd>B</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-tag-description": "Add or remove change tags from individual revisions or log entries.",
+       "apihelp-tag-param-rcid": "One or more recent changes IDs from which to add or remove the tag.",
+       "apihelp-tag-param-revid": "One or more revision IDs from which to add or remove the tag.",
+       "apihelp-tag-param-logid": "One or more log entry IDs from which to add or remove the tag.",
+       "apihelp-tag-param-add": "Tags to add. Only manually defined tags can be added.",
+       "apihelp-tag-param-remove": "Tags to remove. Only tags that are either manually defined or completely undefined can be removed.",
+       "apihelp-tag-param-reason": "Reason for the change.",
+       "apihelp-tag-example-rev": "Add the <kbd>vandalism</kbd> tag from revision ID 123 without specifying a reason",
+       "apihelp-tag-example-log": "Remove the <kbd>spam</kbd> tag from log entry ID 123 with the reason <kbd>Wrongly applied</kbd>",
+
        "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-edit": "Retrieve an edit token (the default).",
        "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-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences. Default when <var>formatversion</var> is not <kbd>1</kbd>.",
+       "apihelp-json-param-ascii": "If specified, encodes all non-ASCII using hexadecimal escape sequences. Default when <var>formatversion</var> is <kbd>1</kbd>.",
+       "apihelp-json-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, <samp>*</samp> keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently <kbd>2</kbd>), may change without warning.",
        "apihelp-jsonfm-description": "Output data in JSON format (pretty-print in HTML).",
        "apihelp-none-description": "Output nothing.",
        "apihelp-php-description": "Output data in serialized PHP format.",
+       "apihelp-php-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, <samp>*</samp> keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently <kbd>2</kbd>), may change without warning.",
        "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 <code>print_r()</code> format.",
        "api-help-flag-writerights": "This module requires write rights.",
        "api-help-flag-mustbeposted": "This module only accepts POST requests.",
        "api-help-flag-generator": "This module can be used as a generator.",
+       "api-help-source": "Source: $1",
+       "api-help-source-unknown": "Source: <span class=\"apihelp-unknown\">unknown</span>",
+       "api-help-license": "License: [[$1|$2]]",
+       "api-help-license-noname": "License: [[$1|See link]]",
+       "api-help-license-unknown": "License: <span class=\"apihelp-unknown\">unknown</span>",
        "api-help-help-urls": "",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Deprecated.",
        "api-help-param-required": "This parameter is required.",
+       "api-help-datatypes-header": "Data types",
+       "api-help-datatypes": "Some API parameter types need further explanation:\n;boolean\n:Boolean parameters work like HTML checkboxes: if the parameter is specified, regardless of value, it is considered true. For a false value, omit the parameter entirely.\n;timestamp\n:Timestamps may be specified in several formats. ISO 8601 date and time is recommended. All times are in UTC, any included timezone is ignored.\n:* ISO 8601 date and time, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (punctuation and <kbd>Z</kbd> are optional)\n:* ISO 8601 date and time with (ignored) fractional seconds, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (dashes, colons, and <kbd>Z</kbd> are optional)\n:* MediaWiki format, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Generic numeric format, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (optional timezone of <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, or <kbd>-<var>##</var></kbd> is ignored)\n:* EXIF format, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*RFC 2822 format (timezone may be omitted), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 format (timezone may be omitted), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime format, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Seconds since 1970-01-01T00:00:00Z as a 1 to 13 digit integer",
+       "api-help-param-type-limit": "Type: integer or <kbd>max</kbd>",
+       "api-help-param-type-integer": "Type: {{PLURAL:$1|1=integer|2=list of integers}}",
+       "api-help-param-type-boolean": "Type: boolean ([[Special:ApiHelp/main#main/datatypes|details]])",
+       "api-help-param-type-timestamp": "Type: {{PLURAL:$1|1=timestamp|2=list of timestamps}} ([[Special:ApiHelp/main#main/datatypes|allowed formats]])",
+       "api-help-param-type-user": "Type: {{PLURAL:$1|1=user name|2=list of user names}}",
        "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.",
index 318cd96..f42f549 100644 (file)
        "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-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.",
+       "apihelp-tag-param-reason": "Motivo del cambio.",
+       "apihelp-tag-example-log": "Eliminar la etiqueta <kbd>spam</kbd> de la entrada del registro con identificador 123 con el motivo <kbd>aplicada incorrectamente</kbd>",
        "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-param-watch": "Vigilar la página.",
        "api-help-flag-writerights": "Este módulo requiere permisos de escritura.",
        "api-help-flag-mustbeposted": "Este módulo solo acepta solicitudes POST.",
        "api-help-flag-generator": "Este módulo puede utilizarse como un generador.",
+       "api-help-source": "Fuente: $1",
+       "api-help-source-unknown": "Fuente: <span class=\"apihelp-unknown\">desconocida</span>",
+       "api-help-license": "Licencia: [[$1|$2]]",
+       "api-help-license-noname": "Licencia: [[$1|Ver enlace]]",
+       "api-help-license-unknown": "Licencia: <span class=\"apihelp-unknown\">desconocida</span>",
        "api-help-parameters": "{{PLURAL:$1|Parámetro|Parámetros}}:",
        "api-help-param-deprecated": "En desuso.",
        "api-help-param-required": "Este parámetro es obligatorio.",
+       "api-help-datatypes-header": "Tipos de datos",
+       "api-help-param-type-limit": "Tipo: entero o <kbd>max</kbd>",
+       "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=entero|2=lista de enteros}}",
+       "api-help-param-type-boolean": "Tipo: booleano/lógico ([[Special:ApiHelp/main#main/datatypes|detalles]])",
+       "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=timestamp|2=lista de timestamps}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
+       "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nombre de usuario|2=lista de nombres de usuarios}}",
        "api-help-param-list": "{{PLURAL:$1|1=Un valor|2=Valores (separados por <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Debe estar vacío|Puede estar vacío, o $2}}",
        "api-help-param-multi-separate": "Separar los valores con <kbd>|</kbd>.",
-       "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:"
+       "api-help-param-default": "Predeterminado: $1",
+       "api-help-param-default-empty": "Predeterminado: <span class=\"apihelp-empty\">(vacío)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(sin descripción)</span>",
+       "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:",
+       "api-help-permissions": "{{PLURAL:$1|Permiso|Permisos}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Concedido a|Concedidos a}}: $2",
+       "api-credits-header": "Créditos",
+       "api-credits": "Desarrolladores de la API:\n* Roan Kattouw (desarrollador principal, sep. 2007-2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (creador y desarrollador principal, sep. 2006-sep. 2007)\n* Brad Jorsch (desarrollador principal, 2013-actualidad)\n\nEnvía comentarios, sugerencias y preguntas a mediawiki-api@lists.wikimedia.org\no informa de un error en https://phabricator.wikimedia.org/."
 }
index 114e36c..64c7146 100644 (file)
@@ -11,7 +11,8 @@
                        "Nicolapps",
                        "Raulel",
                        "Arkanosis",
-                       "Ltrlg"
+                       "Ltrlg",
+                       "Crochet.david"
                ]
        },
        "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-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-tag-param-reason": "Motif de la modification.",
        "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).",
        "api-help-flag-writerights": "Ce module nécessite des droits d’écriture.",
        "api-help-flag-mustbeposted": "Ce module n’accepte que les requêtes POST.",
        "api-help-flag-generator": "Ce module peut être utilisé comme générateur.",
+       "api-help-source": "Source : $1",
+       "api-help-source-unknown": "Source : <span class=\"apihelp-unknown\">inconnue</span>",
+       "api-help-license": "Licence : [[$1|$2]]",
+       "api-help-license-noname": "Licence : [[$1|Voir le lien]]",
+       "api-help-license-unknown": "Licence : <span class=\"apihelp-unknown\">inconnue</span>",
        "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :",
        "api-help-param-deprecated": "Obsolète.",
        "api-help-param-required": "Ce paramètre est obligatoire.",
index 065ced3..16c23c8 100644 (file)
@@ -80,6 +80,7 @@
        "apihelp-edit-param-sectiontitle": "Título para unha nova sección.",
        "apihelp-edit-param-text": "Contido da páxina.",
        "apihelp-edit-param-summary": "Resumo de edición. Tamén título de sección cando $1section=new e $1sectiontitle non está definido.",
+       "apihelp-edit-param-tags": "Cambio de etiquetas a aplicar á revisión.",
        "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-paraminfo-param-pagesetmodule": "Obter información sobre o módulo pageset (proporcionando títulos= e amigos).",
        "apihelp-paraminfo-param-formatmodules": "Lista dos nomes de módulo de formato (valores do parámetro <var>formato</var>). No canto use <var>$1modules</var>.",
        "apihelp-paraminfo-example-1": "Amosar información para <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, e <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
+       "apihelp-parse-description": "Analiza o contido e devolve o resultado do analizador.\n\nVexa varios módulos propostos de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> para obter información sobre a versión actual dunha páxina.\n\nHai varias formas de especificar o texto a analizar:\n# Especificar unha páxina ou revisión, usando <var>$1page</var>, <var>$1pageid</var>, ou <var>$1oldid</var>.\n# Especificando contido explícitamente, usando <var>$1text</var>, <var>$1title</var>, and <var>$1contentmodel</var>.\n# Especificando só un resumo a analizar. <var>$1prop</var> debe ter un valor baleiro.",
        "apihelp-parse-param-title": "Título da páxina á que pertence o texto. Se non se indica, debe especificarse <var>$1contentmodel</var>, e [[API]] usarase como o título.",
        "apihelp-parse-param-text": "Texto a analizar. Use <var>$1title</var> ou <var>$1contentmodel</var> para controlar o modelo de contido.",
        "apihelp-parse-param-summary": "Resumo a analizar.",
        "apihelp-parse-param-pageid": "Analizar o contido desta páxina. Ignora <var>$1page</var>.",
        "apihelp-parse-param-redirects": "Se <var>$1page</var> ou <var>$1pageid</var> apuntar a unha redirección, resólvea.",
        "apihelp-parse-param-oldid": "Analizar o contido desta revisión. Ignora <var>$1page</var> e <var>$1pageid</var>.",
+       "apihelp-parse-param-prop": "Que información obter:\n;text:Devolve o texto analizado do texto wiki.\n;langlinks:Devolve as ligazóns de idioma do texto wiki analizado\n;categories:Devolve as categorías do texto wiki analizado.\n;categorieshtml:Devolve a versión HTML das categorías.\n;links:Devolve as ligazóns internas do texto wiki analizado.\n;templates:Devolve os modelos no texto wiki analizado.\n;images:Devolve as imaxes no texto wiki analizado.\n;externallinks:Devolve as ligazóns externas no texto wiki analizado.\n;sections:Devolve as seccións no texto wiki analizado.\n;revid:Engade o identificador da revisión da páxina analizada.\n;displaytitle:Engade o título do texto wiki analizado.\n;headitems:Devolve os obxectos a poñer na &lt;cabeceira&gt; da páxina\n;headhtml:Devolve a &lt;cabeceira&gt; analizada da páxina.\n;modules:Devolve os módulos ResourceLoader usados na páxina.\n;indicators:Devolve o HTML dos indicadores de estado usados na páxina.\n;iwlinks:Devolve as ligazóns interwiki analizados no texto wiki.\n;wikitext:Devolve o texto wiki orixinal que foi analizado.\n;properties:Devolve varias propiedades definidas no texto wiki analizado.\n;limitreportdata:Devolve o informe de límite de forma estruturada. Non devolve datos cando está activo $1disablepp.\n;limitreporthtml:Devolve a versión HTML do informe de límite. Non devolve datos cando está activo $1disablepp.",
        "apihelp-parse-param-pst": "Fai unha transformación antes de gardar a entrada antes de analizala. Válida unicamente para usar con texto.",
        "apihelp-parse-param-onlypst": "Facer unha transformación antes de gardar (PST) a entrada, pero sen analizala. Devolve o mesmo wikitexto, despois de que a PST foi aplicada. Só válida cando se usa con <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclúe ligazóns de idioma proporcionadas polas extensións (para usar con <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "Que lingua buscar en extmetadata. Isto afecta tanto á tradución a buscar, se hai varias dispoñibles, como a como se formatean cousas como os números e outros valores.",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "Se as traducións para a propiedade extmetadata están dispoñibles, búscaas todas.",
        "apihelp-query+imageinfo-param-extmetadatafilter": "Se está especificado e non baleiro, só se devolverán esas claves para $1prop=extmetadata.",
+       "apihelp-query+imageinfo-param-urlparam": "Unha cadea de parámetro específico no analizador. Por exemplo, os PDFs poden usar <kbd>page15-100px</kbd>. Debe usarse <var>$1urlwidth</var> que debe ser coherente con <var>$1urlparam</var>.",
        "apihelp-query+imageinfo-param-localonly": "Só buscar ficheiros no repositorio local.",
        "apihelp-query+imageinfo-example-simple": "Busca a información sobre a versión actual de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Busca información sobre as versións de [[:File:Test.jpg]] posteriores a 2008.",
        "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
+       "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.",
+       "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.",
+       "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.",
+       "apihelp-tag-param-logid": "Identificadores de unha ou máis entradas do rexistro nas que engadir ou eliminar a etiqueta.",
+       "apihelp-tag-param-add": "Etiquetas a engadir. Só poden engadirse etiquetas definidas manualmente.",
+       "apihelp-tag-param-remove": "Etiquetas a eliminar. Só se poden eliminar as etiquetas definidas manualmente ou que non teñen ningunha definición.",
+       "apihelp-tag-param-reason": "Razón para o cambio.",
+       "apihelp-tag-example-rev": "Engadir a marca <kbd>vandalismo</kbd> á modificación con identificador 123 sen indicar unha razón.",
+       "apihelp-tag-example-log": "Eliminar a etiqueta <kbd>publicidade</kbd> da entrada do rexistro con identificador 123 co motivo <kbd>aplicada incorrectamente</kbd>",
        "apihelp-tokens-description": "Obter os identificadores para accións de modificación de datos.\n\nEste módulo está obsoleto e foi reemprazado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "Tipos de identificadores a consultar.",
        "apihelp-tokens-example-edit": "Recuperar un identificador de modificación (por defecto).",
        "apihelp-dumpfm-description": "Datos de saída en formato <code>var_dump()</code> de PHP(impresión en HTML).",
        "apihelp-json-description": "Datos de saída en formato JSON.",
        "apihelp-json-param-callback": "Se está especificado, inclúe a saída na chamada da función indicada. Para maior seguridade, todos os datos específicos do usuario serán restrinxidos.",
-       "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais.",
+       "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais. Por defecto cando <var>formatversion</var> non é <kbd>1</kbd>.",
        "apihelp-jsonfm-description": "Datos de saída en formato JSON(impresión en HTML).",
        "apihelp-none-description": "Ningunha saída.",
        "apihelp-php-description": "Datos de saída en formato serializado de PHP.",
        "api-help-flag-writerights": "Este módulo precisa permisos de escritura.",
        "api-help-flag-mustbeposted": "Este módulo só acepta peticións POST.",
        "api-help-flag-generator": "Este módulo pode usarse como xenerador.",
+       "api-help-source": "Fonte: $1",
+       "api-help-source-unknown": "Fonte: <span class=\"apihelp-unknown\">descoñecida</span>",
+       "api-help-license": "Licenza: [[$1|$2]]",
+       "api-help-license-noname": "Licenza: [[$1|Ver ligazón]]",
+       "api-help-license-unknown": "Licenza: <span class=\"apihelp-unknown\">descoñecida</span>",
        "api-help-parameters": "{{PLURAL:$1|Parámetro|Parámetros}}:",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parámetro é obrigatorio.",
+       "api-help-datatypes-header": "Tipos de datos",
+       "api-help-param-type-limit": "Tipo: enteiro ou <kbd>max</kbd>",
+       "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=enteiro|2=lista de enteiros}}",
+       "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalles]])",
+       "api-help-param-type-timestamp": "Tipo: {{PLURAL:$1|1=selo de tempo|2=lista de selos de tempo}} ([[Special:ApiHelp/main#main/datatypes|formatos permitidos]])",
+       "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome de usuario|2=lista de nomes de usuarios}}",
        "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.",
index fcc7f7b..4002e54 100644 (file)
@@ -6,7 +6,8 @@
                        "Inkbug",
                        "Danny-w",
                        "YaronSh",
-                       "ערן"
+                       "ערן",
+                       "LaG roiL"
                ]
        },
        "apihelp-main-param-action": "איזו פעולה לבצע.",
@@ -42,6 +43,7 @@
        "apihelp-delete-param-unwatch": "הסרת הדף מרשימת המעקב של של המשתמש הנוכחי.",
        "apihelp-delete-example-simple": "מחיקת הדף הראשי",
        "apihelp-edit-param-text": "תוכן הדף.",
+       "apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
        "apihelp-edit-param-minor": "עריכה משנית.",
        "apihelp-edit-example-edit": "עריכת דף",
        "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
        "apihelp-query+redirects-param-limit": "כמה הפניות להחזיר.",
        "apihelp-query+revisions+base-param-limit": "הגבלת מספר הגרסאות שיוחזרו.",
        "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
+       "apihelp-tag-param-reason": "סיבה לשינוי.",
        "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:mediawiki}} במרחב שם המשתמש, המסתיים ב-  <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-help-flag-writerights": "יחידה זו דורשת הרשאות כתיבה.",
        "api-help-flag-mustbeposted": "יחידה זו מקבלת רק בקשות POST.",
        "api-help-flag-generator": "היחידה הזאת יכולה להיות מחולל.",
+       "api-help-source": "מקור: $1",
+       "api-help-source-unknown": "מקור: <span class=\"apihelp-unknown\">לא ידוע</span>",
+       "api-help-license": "רישיון: [[$1|$2]]",
+       "api-help-license-noname": "רישיון: [[$1|ראו קישור]]",
        "api-help-parameters": "{{PLURAL:$1|פרמטר|פרמטרים}}:",
        "api-help-param-deprecated": "מיושן.",
        "api-help-param-required": "פרמטר זה נדרש.",
diff --git a/includes/api/i18n/is.json b/includes/api/i18n/is.json
new file mode 100644 (file)
index 0000000..956ace8
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sveinn í Felli"
+               ]
+       },
+       "api-help-license": "Notkunarleyfi: [[$1|$2]]",
+       "api-help-license-noname": "Notkunarleyfi: [[$1|Sjá tengil]]",
+       "api-help-license-unknown": "Notkunarleyfi: <span class=\"apihelp-unknown\">óþekkt</span>"
+}
index e0e32f5..a9bcf30 100644 (file)
@@ -4,7 +4,8 @@
                        "Shirayuki",
                        "2nd-player",
                        "Los688",
-                       "Whym"
+                       "Whym",
+                       "Mfuji"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
@@ -18,6 +19,7 @@
        "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": "有効期限。相対的 (例: <kbd>5 months</kbd> または <kbd>2 weeks</kbd>) または絶対的 (e.g. <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": "アカウントの作成を禁止します。",
@@ -28,6 +30,7 @@
        "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-checktoken-description": "<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> のトークンの妥当性を確認します。",
        "apihelp-checktoken-param-type": "調べるトークンの種類。",
        "apihelp-checktoken-param-token": "調べるトークン。",
        "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
        "apihelp-edit-param-section": "節番号です。先頭の節の場合は <kbd>0</kbd>、新しい節の場合は <kbd>new</kbd>を指定します。",
        "apihelp-edit-param-sectiontitle": "新しい節の名前です。",
        "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-tags": "この版に適用する変更タグ。",
        "apihelp-edit-param-minor": "細部の編集",
+       "apihelp-edit-param-notminor": "細部の編集ではない。",
+       "apihelp-edit-param-basetimestamp": "編集前の版のタイムスタンプ。編集競合を検出するために使用されます。\n[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]] で取得できます。",
+       "apihelp-edit-param-starttimestamp": "編集作業を開始したときのタイムスタンプ。編集競合を検出するために使用されます。適切な値は <var>[[Special:ApiHelp/main|curtimestamp]]</var> を使用して編集作業を開始するとき (たとえば、編集するページの本文を読み込んだとき) に取得できます。",
        "apihelp-edit-param-createonly": "すでにそのページが存在する場合は編集を行いません。",
        "apihelp-edit-param-nocreate": "そのページが存在しない場合にエラーを返します。",
        "apihelp-edit-param-watch": "そのページを現在の利用者のウォッチリストに追加します。",
        "apihelp-edit-param-unwatch": "そのページを現在の利用者のウォッチリストから除去します。",
+       "apihelp-edit-param-prependtext": "このテキストをページの先頭に追加します。$1text をオーバーライドします。",
+       "apihelp-edit-param-undo": "この版を取り消します。$1text, $1prependtext および $1appendtext をオーバーライドします。",
+       "apihelp-edit-param-undoafter": "$1undo からこの版までのすべての版を取り消します。設定しない場合、ひとつの版のみ取り消されます。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
        "apihelp-edit-example-edit": "ページを編集",
+       "apihelp-edit-example-prepend": "<kbd>_&#95;NOTOC_&#95;</kbd> をページの先頭に挿入する。",
+       "apihelp-edit-example-undo": "版 13579 から 13585 まで要約を自動入力して取り消す。",
        "apihelp-emailuser-description": "利用者に電子メールを送信します。",
        "apihelp-emailuser-param-target": "送信先の利用者名。",
+       "apihelp-emailuser-param-subject": "題名。",
        "apihelp-emailuser-param-text": "電子メールの本文。",
        "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。",
        "apihelp-emailuser-example-email": "利用者 <kbd>WikiSysop</kbd> に <kbd>Content</kbd> という本文の電子メールを送信。",
        "apihelp-expandtemplates-description": "ウィキテキストに含まれるすべてのテンプレートを展開します。",
        "apihelp-expandtemplates-param-title": "ページの名前です。",
        "apihelp-expandtemplates-param-text": "変換するウィキテキストです。",
+       "apihelp-expandtemplates-param-includecomments": "HTMLコメントを出力に含めるかどうか。",
        "apihelp-expandtemplates-example-simple": "ウィキテキスト <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd> を展開する。",
+       "apihelp-feedcontributions-description": "利用者の投稿記録フィードを返します。",
+       "apihelp-feedcontributions-param-feedformat": "フィードの形式。",
+       "apihelp-feedcontributions-param-user": "投稿記録を取得する利用者。",
+       "apihelp-feedcontributions-param-namespace": "この名前空間への投稿記録に絞り込む。",
+       "apihelp-feedcontributions-param-year": "この年以前。",
+       "apihelp-feedcontributions-param-month": "この月以前。",
+       "apihelp-feedcontributions-param-tagfilter": "このタグが付与された投稿記録に絞り込む。",
        "apihelp-feedcontributions-param-deletedonly": "削除された投稿記録のみ表示します。",
        "apihelp-feedcontributions-param-toponly": "最新版の編集のみ表示します。",
        "apihelp-feedcontributions-param-newonly": "ページ作成を伴う編集のみを表示します。",
+       "apihelp-feedcontributions-param-showsizediff": "版間のサイズの増減を表示する。",
        "apihelp-feedcontributions-example-simple": "利用者 <kbd>Example</kbd> の投稿記録を取得する。",
+       "apihelp-feedrecentchanges-description": "最近の更新フィードを返します。",
+       "apihelp-feedrecentchanges-param-feedformat": "フィードの形式。",
+       "apihelp-feedrecentchanges-param-namespace": "この名前空間の結果のみに絞り込む。",
        "apihelp-feedrecentchanges-param-limit": "返す結果の最大数。",
+       "apihelp-feedrecentchanges-param-from": "これ以降の編集を表示する。",
        "apihelp-feedrecentchanges-param-hideminor": "細部の変更を隠す。",
        "apihelp-feedrecentchanges-param-hidebots": "ボットによる変更を隠す。",
        "apihelp-feedrecentchanges-param-hideanons": "未登録利用者による変更を隠す。",
        "apihelp-feedrecentchanges-param-hideliu": "登録利用者による変更を隠す。",
        "apihelp-feedrecentchanges-param-hidepatrolled": "巡回済みの変更を隠す。",
+       "apihelp-feedrecentchanges-param-hidemyself": "現在の利用者による編集を非表示にする。",
+       "apihelp-feedrecentchanges-param-tagfilter": "タグにより絞り込む。",
+       "apihelp-feedrecentchanges-param-target": "このページからリンクされているページの変更のみを表示する。",
        "apihelp-feedrecentchanges-example-simple": "最近の更新を表示する。",
        "apihelp-feedrecentchanges-example-30days": "最近30日間の変更を表示する。",
+       "apihelp-feedwatchlist-description": "ウォッチリストのフィードを返します。",
+       "apihelp-feedwatchlist-param-feedformat": "フィードの形式。",
+       "apihelp-feedwatchlist-example-default": "ウォッチリストのフィードを表示する。",
+       "apihelp-feedwatchlist-example-all6hrs": "ウォッチ中のページに対する過去6時間の更新をすべて表示する。",
+       "apihelp-filerevert-description": "ファイルを古い版に差し戻します。",
+       "apihelp-filerevert-param-filename": "対象のファイル名 (File: 接頭辞を含めない)。",
+       "apihelp-filerevert-param-comment": "アップロードのコメント。",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd> を <kbd>2011-03-05T15:27:40Z</kbd> の版に差し戻す。",
        "apihelp-help-description": "指定したモジュールのヘルプを表示します。",
        "apihelp-help-param-modules": "ヘルプを表示するモジュールです (<var>action</var> パラメーターおよび <var>format</var> パラメーターの値、または <kbd>main</kbd>)。<kbd>+</kbd> を使用して下位モジュールを指定できます。",
        "apihelp-help-example-recursive": "すべてのヘルプを1つのページに",
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
+       "apihelp-imagerotate-description": "1つ以上の画像を回転させます。",
        "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-summary": "ページ取り込みの要約。",
        "apihelp-import-param-xml": "XMLファイルをアップロード",
+       "apihelp-import-param-interwikisource": "ウィキ間の取り込みの場合: 取り込み元のウィキ。",
+       "apihelp-import-param-interwikipage": "ウィキ間の取り込みの場合: 取り込むページ。",
+       "apihelp-import-param-fullhistory": "ウィキ間の取り込みの場合: 現在の版のみではなく完全な履歴を取り込む。",
+       "apihelp-import-param-templates": "ウィキ間の取り込みの場合: 読み込まれているテンプレートも取り込む。",
+       "apihelp-import-param-namespace": "この名前空間に取り込む。<kbd>$1rootpage</kbd>パラメータをオーバーライドします。",
        "apihelp-import-param-rootpage": "このページの下位ページとしてインポートする。",
-       "apihelp-import-example-import": "[[meta:Help:Parserfunctions]] をすべての履歴とともに名前空間100 にインポートする。",
+       "apihelp-import-example-import": "[[meta:Help:Parserfunctions]] をすべての履歴とともに名前空間100に取り込む。",
        "apihelp-login-param-name": "利用者名。",
        "apihelp-login-param-password": "パスワード。",
        "apihelp-login-param-token": "最初のリクエストで取得したログイントークンです。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-logout-description": "ログアウトしてセッションデータを消去します。",
        "apihelp-logout-example-logout": "現在の利用者をログアウトする。",
+       "apihelp-managetags-example-create": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で作成する",
+       "apihelp-managetags-example-delete": "<kbd>vandlaism</kbd> タグを <kbd>Misspelt</kbd> という理由で削除する",
+       "apihelp-managetags-example-activate": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で有効化する",
        "apihelp-move-description": "ページを移動します。",
        "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-reason": "改名の理由。",
        "apihelp-move-param-movetalk": "存在する場合、トークページも名前を変更します。",
        "apihelp-move-param-movesubpages": "可能であれば、下位ページも名前を変更します。",
        "apihelp-move-param-noredirect": "転送ページを作成しません。",
        "apihelp-move-param-unwatch": "そのページと転送ページを現在の利用者のウォッチリストから除去します。",
        "apihelp-move-param-ignorewarnings": "あらゆる警告を無視",
        "apihelp-move-example-move": "<kbd>Badtitle</kbd> を <kbd>Goodtitle</kbd> に転送ページを残さず移動",
+       "apihelp-opensearch-description": "OpenSearch プロトコルを使用してWiki内を検索します。",
        "apihelp-opensearch-param-search": "検索文字列。",
        "apihelp-opensearch-param-limit": "返す結果の最大数。",
        "apihelp-opensearch-param-namespace": "検索する名前空間。",
        "apihelp-opensearch-param-suggest": "<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> が false の場合、何もしません。",
+       "apihelp-opensearch-param-format": "出力する形式。",
+       "apihelp-opensearch-example-te": "<kbd>Te</kbd> から始まるページを検索する。",
+       "apihelp-options-example-reset": "すべて初期設定に戻す。",
+       "apihelp-options-example-change": "<kbd>skin</kbd> および <kbd>hideminor</kbd> の個人設定を変更する。",
+       "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
        "apihelp-paraminfo-description": "API モジュールに関する情報を取得します。",
+       "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (<var>action</var> および <var>format</var> パラメーターの値, または <kbd>main</kbd>). <kbd>+</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>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
+       "apihelp-patrol-example-revid": "版を巡回済みにする。",
        "apihelp-protect-description": "ページの保護レベルを変更します。",
-       "apihelp-protect-param-title": "保護(解除)するページ名です。$1pageid とは同時に指定できません。",
-       "apihelp-protect-param-pageid": "保護(解除)するページIDです。$1title とは同時に指定できません。",
+       "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-purge-example-simple": "ページ <kbd>Main Page</kbd> および <kbd>API</kbd> をパージする。",
+       "apihelp-purge-example-generator": "標準名前空間にある最初の10ページをパージする。",
+       "apihelp-query+allcategories-description": "すべてのカテゴリを一覧表示します。",
+       "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
+       "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
+       "apihelp-query+allcategories-param-prefix": "この値で始まるタイトルのカテゴリを検索します。",
+       "apihelp-query+allcategories-param-limit": "返すカテゴリの数。",
+       "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
+       "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+alldeletedrevisions-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+alldeletedrevisions-param-from": "列挙の始点となるページ名。",
+       "apihelp-query+alldeletedrevisions-param-to": "列挙の終点となるページ名。",
+       "apihelp-query+alldeletedrevisions-param-prefix": "この値で始まるすべてのページ名を検索する。",
+       "apihelp-query+alldeletedrevisions-param-tag": "このタグが付与された版のみを一覧表示する。",
        "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "ジェネレーターとして使用する場合、版IDではなくタイトルを生成します。",
+       "apihelp-query+alldeletedrevisions-example-user": "利用者 <kbd>Example</kbd> による削除された直近の50版を一覧表示する。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
+       "apihelp-query+allfileusages-param-from": "列挙を開始するファイルのタイトル。",
+       "apihelp-query+allfileusages-param-to": "列挙を終了するファイルのタイトル。",
+       "apihelp-query+allfileusages-param-prefix": "この値で始まるすべてのファイルのタイトルを検索する。",
+       "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-to": "列挙の終点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-end": "列挙の終点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-prefix": "この値で始まるすべての画像タイトルを検索する。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-user": "この利用者によりアップロードされたファイルのみを返す。$1sort=timestamp を指定した場合のみ使用できます。 $1filterbots とは同時に使用できません。",
+       "apihelp-query+allimages-param-mime": "検索対象のMIMEタイプ、たとえば <kbd>image/jpeg</kbd>。",
+       "apihelp-query+allimages-param-limit": "返す画像の総数。",
+       "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": "<kbd>T</kbd> で始まる4つのファイルに関する情報を表示する。",
+       "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。",
+       "apihelp-query+alllinks-param-from": "列挙を開始するリンクのタイトル。",
+       "apihelp-query+alllinks-param-to": "列挙を終了するリンクのタイトル。",
+       "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
+       "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
+       "apihelp-query+allmessages-param-args": "メッセージ中に展開される引数。",
+       "apihelp-query+allmessages-param-filter": "この文字列を含んだ名前のメッセージのみを返す。",
+       "apihelp-query+allmessages-param-customised": "変更された状態のメッセージのみを返す。",
+       "apihelp-query+allmessages-param-lang": "返すメッセージの言語。",
+       "apihelp-query+allmessages-param-prefix": "この接頭辞を持つメッセージを返す。",
+       "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd> で始まるメッセージを表示する。",
+       "apihelp-query+allmessages-example-de": "ドイツ語のメッセージ <kbd>august</kbd> および <kbd>mainpage</kbd> を表示する。",
+       "apihelp-query+allpages-param-from": "列挙を開始するページ名。",
+       "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
+       "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
+       "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
+       "apihelp-query+allpages-param-limit": "返すページの総数。",
+       "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
+       "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
+       "apihelp-query+allpages-example-generator-revisions": "<kbd>Re</kbd> で始まる最初の非リダイレクトの2ページの内容を表示する。",
+       "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのタイトル。",
+       "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのタイトル。",
+       "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
+       "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
+       "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
+       "apihelp-query+allusers-param-to": "列挙を終了する利用者名。",
+       "apihelp-query+allusers-param-prefix": "この値で始まるすべての利用者を検索する。",
+       "apihelp-query+allusers-param-group": "このグループに所属する利用者のみを結果に含める。",
+       "apihelp-query+allusers-param-excludegroup": "このグループに所属する利用者を結果から除外する。",
+       "apihelp-query+allusers-param-limit": "返す利用者名の総数。",
+       "apihelp-query+allusers-param-witheditsonly": "編集履歴のある利用者のみ一覧表示する。",
+       "apihelp-query+allusers-param-activeusers": "最近 $1 {{PLURAL:$1|日間}}のアクティブな利用者のみを一覧表示する。",
+       "apihelp-query+allusers-example-Y": "<kbd>Y</kbd> で始まる利用者を一覧表示する。",
+       "apihelp-query+backlinks-description": "与えられたページにリンクしているすべてのページを検索します。",
+       "apihelp-query+backlinks-param-title": "検索するページ名。<var>$1pageid</var> とは同時に使用できません。",
+       "apihelp-query+backlinks-param-pageid": "検索するページID。<var>$1title</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-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+blocks-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。",
+       "apihelp-query+blocks-param-users": "検索対象の利用者のリスト (任意)。",
+       "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
+       "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
+       "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
+       "apihelp-query+categories-param-limit": "返すカテゴリの数。",
+       "apihelp-query+categories-example-simple": "ページ <kbd>Albert Einstein</kbd> が属しているカテゴリの一覧を取得する。",
+       "apihelp-query+categories-example-generator": "ページ <kbd>Albert Einstein</kbd> で使われているすべてのカテゴリに関する情報を取得する。",
+       "apihelp-query+categoryinfo-description": "与えられたカテゴリに関する情報を返します。",
+       "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-pageid": "一覧表示するカテゴリのページID. <var>$1title</var> とは同時に使用できません。",
+       "apihelp-query+categorymembers-param-limit": "返すページの最大数。",
+       "apihelp-query+categorymembers-param-start": "列挙の始点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
+       "apihelp-query+categorymembers-param-end": "列挙の終点となるタイムスタンプ。<kbd>$1sort=timestamp</kbd>を指定した場合のみ使用できます。",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "列挙の始点となるソートキーの接頭辞。<kbd>$1sort=sortkey</kbd>を指定した場合のみ使用できます。<var>$1starthexsortkey</var>をオーバーライドします。",
+       "apihelp-query+categorymembers-param-startsortkey": "代わりに $1starthexsortkey を使用してください。",
+       "apihelp-query+categorymembers-param-endsortkey": "代わりに $1endhexsortkey を使用してください。",
        "apihelp-query+categorymembers-example-simple": "<kbd>Category:Physics</kbd> に含まれる最初の10ページを取得する。",
        "apihelp-query+categorymembers-example-generator": "<kbd>Category:Physics</kbd> に含まれる最初の10ページのページ情報を取得する。",
+       "apihelp-query+contributors-description": "ページへのログインした投稿者の一覧と匿名投稿者の数を取得します。",
+       "apihelp-query+contributors-param-limit": "返す投稿者の数。",
        "apihelp-query+contributors-example-simple": "<kbd>Main Page</kbd> への投稿者を表示する。",
+       "apihelp-query+deletedrevisions-param-tag": "このタグが付与された版のみ表示します。",
        "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+disabled-description": "このクエリ モジュールは無効化されています。",
+       "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
+       "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> をトランスクルードしているページに関する情報を取得する。",
+       "apihelp-query+extlinks-description": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。",
+       "apihelp-query+extlinks-param-limit": "返すリンクの数。",
+       "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
+       "apihelp-query+extlinks-example-simple": "<kbd>Main Page<kbd> の外部リンクの一覧を取得する。",
+       "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
+       "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
+       "apihelp-query+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
+       "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
+       "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
+       "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
+       "apihelp-query+images-description": "与えられたページに含まれるすべてのファイルを返します。",
+       "apihelp-query+images-param-limit": "返す画像の数。",
+       "apihelp-query+images-example-simple": "[[Main Page]] で使用されているファイルの一覧を取得する。",
+       "apihelp-query+images-example-generator": "[[Main Page]] で使用されているファイルに関する情報を取得する。",
+       "apihelp-query+imageusage-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
+       "apihelp-query+imageusage-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
+       "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-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+iwlinks-param-limit": "返すウィキ間リンクの数。",
+       "apihelp-query+iwlinks-param-prefix": "この接頭辞のウィキ間リンクのみを返す。",
+       "apihelp-query+iwlinks-param-title": "検索するウィキ間リンク。<var>$1</var> と同時に使用しなければなりません。",
+       "apihelp-query+iwlinks-example-simple": "<kbd>Main Page</kbd> にあるウィキ間リンクを取得する。",
+       "apihelp-query+langbacklinks-param-lang": "言語間リンクの言語。",
+       "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
+       "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
+       "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-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": "<kbd>Main Page</kbd> からのリンクを取得する。",
+       "apihelp-query+links-example-generator": "<kbd>Main Page</kbd> からリンクされているページに関する情報を取得する。",
+       "apihelp-query+links-example-namespaces": "<kbd>Main Page</kbd> からの {{ns:user}} および {{ns:template}} 名前空間へのリンクを取得する。",
+       "apihelp-query+linkshere-example-simple": "[[Main Page]] にリンクしているページの一覧を取得する。",
+       "apihelp-query+linkshere-example-generator": "<kbd>[[Main page]]<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+logevents-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+logevents-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+logevents-param-user": "与えられた利用者による記録項目に絞り込む。",
+       "apihelp-query+logevents-param-title": "そのページに関連する記録項目に絞り込む。",
+       "apihelp-query+logevents-param-namespace": "与えられた名前空間内の記録項目に絞り込む。",
+       "apihelp-query+logevents-param-prefix": "この接頭辞ではじまる記録項目に絞り込む。",
+       "apihelp-query+logevents-param-tag": "このタグが付与された記録項目のみ表示する。",
+       "apihelp-query+logevents-param-limit": "返す記録項目の総数。",
+       "apihelp-query+logevents-example-simple": "最近の記録項目を一覧表示する。",
+       "apihelp-query+pagepropnames-description": "Wiki内で使用されているすべてのページプロパティ名を一覧表示します。",
+       "apihelp-query+pagepropnames-param-limit": "返す名前の最大数。",
+       "apihelp-query+pagepropnames-example-simple": "最初の10個のプロパティ名を取得する。",
+       "apihelp-query+pageprops-example-simple": "<kbd>Category:Foo</kbd> のプロパティを取得する。",
+       "apihelp-query+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
+       "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
+       "apihelp-query+pageswithprop-example-simple": "<code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code> を使用している最初の10ページを一覧表示する。",
+       "apihelp-query+pageswithprop-example-generator": "Get page info about first 10 pages using <code>_&#95;NOTOC_&#95;</code> を使用している最初の10ページのページ情報を取得する。",
+       "apihelp-query+prefixsearch-description": "ページ名の先頭一致検索を行います。",
+       "apihelp-query+prefixsearch-param-search": "検索文字列。",
+       "apihelp-query+prefixsearch-param-namespace": "検索する名前空間。",
+       "apihelp-query+prefixsearch-param-limit": "返す結果の最大数。",
+       "apihelp-query+prefixsearch-example-simple": "<kbd>meaning</kbd> で始まるページ名を検索する。",
+       "apihelp-query+protectedtitles-description": "作成保護が掛けられているページを一覧表示します。",
+       "apihelp-query+protectedtitles-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-query+protectedtitles-param-level": "この保護レベルのページのみを一覧表示します。",
+       "apihelp-query+protectedtitles-param-limit": "返すページの総数。",
+       "apihelp-query+protectedtitles-param-start": "一覧表示の始点となる保護タイムスタンプ。",
+       "apihelp-query+protectedtitles-param-end": "一覧表示の終点となる保護タイムスタンプ。",
+       "apihelp-query+protectedtitles-example-simple": "保護されているページを一覧表示する。",
+       "apihelp-query+protectedtitles-example-generator": "標準名前空間にある保護されたページへのリンクを検索する。",
+       "apihelp-query+querypage-param-page": "特別ページの名前です。これは大文字小文字を区別することに注意。",
+       "apihelp-query+querypage-param-limit": "返す結果の数。",
+       "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages]] の結果を返す。",
+       "apihelp-query+random-param-namespace": "この名前空間にあるページのみを返します。",
+       "apihelp-query+random-example-simple": "標準名前空間から2つのページを無作為に返す。",
+       "apihelp-query+random-example-generator": "標準名前空間から無作為に選ばれた2つのページのページ情報を返す。",
+       "apihelp-query+recentchanges-description": "最近の更新を一覧表示します。",
+       "apihelp-query+recentchanges-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+recentchanges-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+recentchanges-param-namespace": "この名前空間の変更のみに絞り込む。",
+       "apihelp-query+recentchanges-param-user": "この利用者による変更のみを一覧表示する。",
+       "apihelp-query+recentchanges-param-excludeuser": "この利用者による変更を一覧表示しない。",
+       "apihelp-query+recentchanges-param-tag": "このタグが付与された版のみ一覧表示する。",
+       "apihelp-query+recentchanges-param-limit": "返す変更の総数。",
+       "apihelp-query+recentchanges-param-toponly": "最新の版である変更のみを一覧表示する。",
+       "apihelp-query+recentchanges-example-simple": "最近の更新を一覧表示する。",
+       "apihelp-query+redirects-description": "ページへのすべての転送を返します。",
+       "apihelp-query+redirects-param-limit": "返す転送の数。",
+       "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
+       "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
+       "apihelp-query+revisions-param-user": "この利用者による版のみを結果に含める。",
+       "apihelp-query+revisions-param-excludeuser": "この利用者による版を結果に含めない。",
+       "apihelp-query+revisions-param-tag": "このタグが付与された版のみを一覧表示する。",
+       "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> の匿名利用者 <kbd>127.0.0.1</kbd> 以外による最初の5版を取得する。",
+       "apihelp-query+revisions-example-first5-user": "<kbd>Main Page</kbd> の <kbd>MediaWiki default</kbd> による最初の5版を取得する。",
+       "apihelp-query+search-description": "全文検索を行います。",
+       "apihelp-query+search-param-search": "この値を含むすべてのページ名 (または本文) を検索します。",
+       "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
+       "apihelp-query+search-param-what": "実行する検索の種類です。",
+       "apihelp-query+search-param-limit": "返すページの総数です。",
+       "apihelp-query+search-example-simple": "<kbd>meaning</kbd> を検索する。",
+       "apihelp-query+search-example-generator": "<kbd>meaning</kbd> の検索で返されたページのページ情報を取得する。",
+       "apihelp-query+tags-description": "変更タグを一覧表示します。",
+       "apihelp-query+tags-param-limit": "一覧表示するタグの最大数。",
+       "apihelp-query+tags-example-simple": "利用可能なタグを一覧表示する。",
+       "apihelp-query+templates-description": "与えられたページでトランスクルードされているすべてのページを返します。",
+       "apihelp-query+templates-param-namespace": "この名前空間のテンプレートのみ表示する。",
+       "apihelp-query+templates-param-limit": "返すテンプレートの数。",
+       "apihelp-query+templates-example-simple": "<kbd>Main Page</kbd> で使用されているテンプレートを取得する。",
+       "apihelp-query+templates-example-generator": "<kbd>Main Page</kbd> で使用されているテンプレートに関する情報を取得する。",
+       "apihelp-query+templates-example-namespaces": "<kbd>Main Page</kbd> でトランスクルードされている {{ns:user}} および {{ns:template}} 名前空間のページを取得する。",
+       "apihelp-query+tokens-description": "データ変更操作用のトークンを取得します。",
+       "apihelp-query+tokens-param-type": "リクエストするトークンの種類。",
+       "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。",
+       "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
+       "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
+       "apihelp-query+transcludedin-example-simple": "<kbd>Main Page</kbd> をトランスクルードしているページの一覧を取得する。",
+       "apihelp-query+transcludedin-example-generator": "<kbd>Main Page</kbd> をトランスクルードしているページに関する情報を取得する。",
+       "apihelp-query+usercontribs-description": "利用者によるすべての編集を取得します。",
+       "apihelp-query+usercontribs-param-limit": "返す投稿記録の最大数。",
+       "apihelp-query+usercontribs-param-user": "投稿記録を取得する利用者。",
+       "apihelp-query+usercontribs-param-userprefix": "この値で始まる名前のすべての利用者の投稿記録を取得します。$1user をオーバーライドします。",
+       "apihelp-query+usercontribs-param-namespace": "この名前空間への投稿記録のみを一覧表示する。",
+       "apihelp-query+usercontribs-param-tag": "このタグが付与された版のみを一覧表示する。",
+       "apihelp-query+usercontribs-param-toponly": "最新の版である変更のみを一覧表示する。",
+       "apihelp-query+usercontribs-example-user": "利用者 <kbd>Example</kbd> の投稿記録を表示する。",
+       "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-description": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。",
+       "apihelp-query+watchlist-param-start": "列挙の始点となるタイムスタンプ。",
+       "apihelp-query+watchlist-param-end": "列挙の終点となるタイムスタンプ。",
+       "apihelp-query+watchlist-param-namespace": "この名前空間の変更のみに絞り込む。",
+       "apihelp-query+watchlist-param-user": "この利用者による変更のみを一覧表示する。",
+       "apihelp-query+watchlist-param-excludeuser": "この利用者による変更を一覧表示しない。",
+       "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。",
+       "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
+       "apihelp-revisiondelete-description": "版の削除および復元を行います。",
+       "apihelp-revisiondelete-param-reason": "削除または復元の理由。",
+       "apihelp-revisiondelete-example-revision": "<kbd>Main Page</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-tag-param-reason": "変更の理由。",
+       "apihelp-tag-example-log": "<kbd>Wrongly applied</kbd> という理由で <kbd>spam</kbd> タグを 記録項目ID 123 から取り除く",
+       "apihelp-tokens-param-type": "リクエストするトークンの種類。",
+       "apihelp-tokens-example-edit": "編集トークンを取得する (既定)。",
+       "apihelp-unblock-description": "利用者のブロックを解除します。",
+       "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 #<kbd>105</kbd> を解除する。",
+       "apihelp-unblock-example-user": "<kbd>Sorry Bob</kbd> という理由で利用者 <kbd>Bob</kbd> のブロックを解除する。",
+       "apihelp-undelete-description": "削除されたページの版を復元します。\n\n削除された版の一覧 (タイムスタンプを含む) は[[Special:ApiHelp/query+deletedrevs|list=deletedrevs]]に、また削除されたファイルのID一覧は[[Special:ApiHelp/query+filearchive|list=filearchive]]で見つけることができます。",
+       "apihelp-undelete-param-title": "復元するページ名。",
+       "apihelp-undelete-param-reason": "復元の理由。",
+       "apihelp-undelete-param-timestamps": "復元する版のタイムスタンプ。<var>$1timestamps</var> と <var>$1fileids</var> の両方が空の場合、すべての版が復元されます。",
+       "apihelp-undelete-example-page": "<kbd>Main Page</kbd> を復元する。",
+       "apihelp-undelete-example-revisions": "<kbd>Main Page</kbd> の2つの版を復元する。",
+       "apihelp-upload-param-watch": "このページをウォッチする。",
+       "apihelp-upload-param-ignorewarnings": "あらゆる警告を無視する。",
+       "apihelp-userrights-param-user": "利用者名。",
+       "apihelp-userrights-param-userid": "利用者ID。",
+       "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
+       "apihelp-userrights-param-reason": "変更の理由。",
+       "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
+       "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
        "apihelp-dbg-description": "データを PHP の <code>var_export()</code> 形式で出力します。",
        "apihelp-dbgfm-description": "データを PHP の <code>var_export()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
index cdcca37..e165ceb 100644 (file)
@@ -13,6 +13,7 @@
        "apihelp-main-param-requestid": "Jehde Aanjahb vun heh weed widder med ußjejovve. Esuh kam_mer einzel Affrohre ussenein hallde.",
        "apihelp-main-param-servedby": "Donn däm ẞööver, dä et jedonn hät, singe Nahme med ußjävve.",
        "apihelp-main-param-curtimestamp": "Donn de aktoälle Zigg un et Dattum med ußjävve.",
+       "apihelp-main-param-uselang": "De schprohch för et Övversäzze vun Täxte un Nohreeschte. En Leß met de Köözelle kam_mer vun dä Sigg <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> holle, met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">siprop=languages</kbd>, udder jiff <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">user</kbd> aan, öm dem aktoälle Metmaacher sing eetzde Schprohch ze krijje, udder nemm <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">content</kbd> öm heh dämm Wikki singe Ennhald sing Schprohch ze krijje.",
        "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.",
@@ -22,6 +23,7 @@
        "apihelp-block-param-reblock": "Wann dä Metmaacher als jeschpächd es, donn dat övverschrihve.",
        "apihelp-block-param-watchuser": "Donn de Metmaachersigg un de Klaafsigg dohzoh op mig Oppaßleß säze.",
        "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-checktoken-param-token": "De Makehrong zom Pröhve.",
        "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-delete-description": "Schmieß en Sigg 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-param-oldimage": "Der Nahme vom ahle Beld zom fottschmiiße, wi hä vun [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] kütt.",
        "apihelp-delete-example-simple": "Schmiiß de <kbd>Houpsigg</kbd> fott",
        "apihelp-delete-example-reason": "Schmiiß de <kbd>Houpsigg</kbd> fott mem Jrond: <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Preparing for move</kbd>.",
        "apihelp-disabled-description": "Dat Moduhl wohd affjeschalldt.",
        "apihelp-edit-description": "Sigge aanlähje un verändere.",
+       "apihelp-edit-param-title": "De Övverschreff vun dä Sigg zom Ändere. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
+       "apihelp-edit-param-pageid": "De Känong vun dä Sigg zom Ändere. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
+       "apihelp-edit-param-section": "De Nommer vum Affschnedd. Nemm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">0</kbd>“ för wat vör der eezde Övverschreff schteihd. Ene neue Affscnedd määt mer met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</var>“.",
        "apihelp-edit-param-sectiontitle": "De Övverschreff för ene neue Affschnett.",
        "apihelp-edit-param-text": "Dä Sigg ehre Ennhalld.",
+       "apihelp-edit-param-tags": "De Mekhonge för op heh di väsjohn aanzewännde.",
        "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-param-recreate": "Övverjangk alle Fähler övver di Sigg, die en der Zweschezigg fott jeschneße wohd.",
        "apihelp-edit-param-createonly": "Donn di Sigg nit ändere, wann se ald doh es.",
        "apihelp-edit-param-nocreate": "Mäld ene Fähler, wann di Sigg nit doh es.",
        "apihelp-edit-param-watch": "Donn di Sigg op dem aktälle Metmaacher sing Oppaßleß.",
        "apihelp-edit-param-unwatch": "schmiiß di Sigg uß heh däm Metmaacher singe oppaßleß.",
+       "apihelp-edit-param-watchlist": "Donn en Sigg en däm aktoälle Metmaacher sing Opaßleß enndrahre udder ußdrahre udder donn däm sing Vörenschtällonge nämme udder jaa nix ändere.",
+       "apihelp-edit-param-prependtext": "Donn dä Täx aam Aanfng vun dä Sigg enndrahre. Övverjeiht „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</code>“.",
+       "apihelp-edit-param-appendtext": "Donn dä Täx aam Ängk vun dä Sigg aanhange. Övverjeiht „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</code>“.\n\nNemm „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$section=new</code>“ ömm ene neuje Affschnedd aanzehange, anschtatt vun heh dämm Parramehter.",
+       "apihelp-edit-param-undo": "Donn heh di Väsjohn widder retuhr nämme. Övverjeiht „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1text</code>“, „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prependtext </code>“ un „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1appendtext</code>“.",
+       "apihelp-edit-param-undoafter": "Donn alle Väsjohne vun „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1undo </code>“ bes zeläz heh di Väsjohn widder retuhr nämme. Wann nix ennjedrahre es, nämm blohß ein Väsjohn retuhr nämme.",
        "apihelp-edit-param-redirect": "Verfollsch de Ömleidonge automattesch.",
        "apihelp-edit-param-contentmodel": "Et Enhalltsmodäll för dä neue Ennhalld.",
        "apihelp-edit-example-edit": "Veränder en Sigg.",
        "apihelp-edit-example-prepend": "Donn <kbd>_&#95;NOTOC_&#95;</kbd> för en Sigg säze.",
+       "apihelp-edit-example-undo": "Donn alle Väsjohne vun „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">13579</code>“ bes zeläz „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">13585</code>“ widder retuhr nämme u en autmatesche Zersamfaßong derför enndrahre.",
        "apihelp-emailuser-description": "Donn en <i lang=\"en\" xml:lang=\"en\">e-mail</i> aan dä Metmaacher schecke.",
        "apihelp-emailuser-param-target": "D ä Metmaacher, dä di <i lang=\"en\" xml:lang=\"en\">e-mail</i> krijje sull.",
        "apihelp-emailuser-param-subject": "Koppeih mem Beträff.",
        "apihelp-expandtemplates-param-title": "De Övverschreff vun dä Sigg.",
        "apihelp-expandtemplates-param-text": "Dä Wikitäx zom ömwandelle.",
        "apihelp-expandtemplates-param-includecomments": "Ov Aanmärkonge em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>-Fommaht med ußjejovve wähde sulle.",
+       "apihelp-expandtemplates-param-generatexml": "Donn ene Boum vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Paaser opboue. Es dorsch „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=parsetree</code>“ ässäz.",
+       "apihelp-feedcontributions-description": "Jidd ene Kannahl met de Beidräsch vun enem Metmaacher uß.",
        "apihelp-feedcontributions-param-feedformat": "Däm Kannahl sing Fommaht.",
+       "apihelp-feedcontributions-param-user": "De Beijdrähsch för wat för en Metmaacher holle.",
+       "apihelp-feedcontributions-param-namespace": "Wat för ene Appachtemang för de Beijdrähsch ußjeschloße wähde sull.",
        "apihelp-feedcontributions-param-year": "Vum johr un fröhjer.",
        "apihelp-feedcontributions-param-month": "Vun däm Mohnd un derför",
+       "apihelp-feedcontributions-param-tagfilter": "Op wat för en Makkehronge de Beijdrähsch bschrängk wähde sulle.",
        "apihelp-feedcontributions-param-deletedonly": "zeijsch blohß de fottjeschmeße Beijdrähsch.",
        "apihelp-feedcontributions-param-toponly": "Zeich blohß de Änderonge, di och de neußte sin.",
        "apihelp-feedcontributions-param-newonly": "Zeich blohß de Änderonge, woh Sigge neu aanjelaat woode sin.",
        "apihelp-feedcontributions-param-showsizediff": "Zeijsch de Ongerscheijd en de Jrühße zwesche de Väsjohne.",
        "apihelp-feedcontributions-example-simple": "Zeijsch de Änderonge vum Metmaacher <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>.",
+       "apihelp-feedrecentchanges-description": "Donn ene Kannahl för de neuste Änderonge ußjävve.",
        "apihelp-feedrecentchanges-param-feedformat": "Däm Kannahl sing Fommaht.",
+       "apihelp-feedrecentchanges-param-namespace": "Op wat för ene Appachtemang de Beijdrähsch beschrängk wähde sulle.",
+       "apihelp-feedrecentchanges-param-invert": "Alle Appachtemangs ußer däm ußjesöhkte.",
+       "apihelp-feedrecentchanges-param-associated": "Donn et drop betroke Appachtemang — Klaafsigge udder Atikelle — med enschlehße.",
+       "apihelp-feedrecentchanges-param-days": "Wadd eruß küdd op di Dähsch enschrängke.",
        "apihelp-feedrecentchanges-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
        "apihelp-feedrecentchanges-param-from": "Zeijsch de Änderonge zigg dämm.",
        "apihelp-feedrecentchanges-param-hideminor": "De kein Minni_Änderonge verschteijsche.",
+       "apihelp-feedrecentchanges-param-hidebots": "Änderonge ußschlehße, di vun Bots jemaht wohde.",
+       "apihelp-feedrecentchanges-param-hideanons": "Änderonge ußschlehße, di vun nahmelohse Metmaacher jemaht wohde.",
+       "apihelp-feedrecentchanges-param-hideliu": "Änderonge ußschlehße, di vun aanjemälldete Metmaacher jemaht wohde.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Nohjelohrte Änderonge övverjonn.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderonge vun heh dämm Metmaacher övverjonn.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Noh Makehronge beschängke.",
+       "apihelp-feedrecentchanges-param-target": "Zeijsch Änderonge aan Sigge, op di vun heh dä Sigg ene Lengk jeihd.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Zeijsch Änderonge aan Sigge, op di vun dä ußjesöhk Sigg ene Lengk jeihd.",
+       "apihelp-feedrecentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
+       "apihelp-feedrecentchanges-example-30days": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}} vun de läzde 30 Dähsch.",
+       "apihelp-feedwatchlist-description": "Donn ene Kannahl met dä Oppaßleß zerökjävve.",
        "apihelp-feedwatchlist-param-feedformat": "Däm Kannahl sing Fommaht.",
+       "apihelp-feedwatchlist-param-hours": "Zeijsch de Sigge, di en de läzde su un esu vill Schtonde vun jäz aan veränder wohde sin.",
+       "apihelp-feedwatchlist-param-linktosections": "Lengk tirägg od der veränderte Affschnedd, woh müjjelesch.",
+       "apihelp-feedwatchlist-example-default": "Zeijsch ene Kannahl met dä Oppaßleß.",
+       "apihelp-feedwatchlist-example-all6hrs": "Zeijsch alle Änderonge aan Sgge obb Oppaßleßte us de läzde 6 Schtunde.",
+       "apihelp-filerevert-description": "Säz en Dattei obb en ahle Väsohn zerök.",
        "apihelp-filerevert-param-filename": "De Zih_Dattei, der ohne „{{ne:file}}“ derför.",
        "apihelp-filerevert-param-comment": "Aanmärkong huh lahde.",
+       "apihelp-filerevert-example-revert": "Donn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Wiki.png</kbd> op di Väsohn vum <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">2011-03-05T15:27:40Z</kbd> zerök säze.",
        "apihelp-help-description": "zeisch Hölp för de aanjejovve Moduhle.",
+       "apihelp-help-param-submodules": "Donn Hölp för de Ongermoduhle vun dämm aanjejovve Moduhl enschschlehße.",
+       "apihelp-help-param-recursivesubmodules": "Donn Hölp för de Ongermoduhle allesammp enschschlehße, esu deef, wi et jeiht.",
+       "apihelp-help-param-helpformat": "Et Fommaht vun de Ußjahbe för de Hölp.",
+       "apihelp-help-param-wrap": "Donn de Ußjahbe en dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> sing schtandattmähßejje Schtruktuhr vun de Antwood enschlehße.",
+       "apihelp-help-param-toc": "Donn en Enhhaldserzeijschensß en de Ußjahbe vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ennschlehße.",
+       "apihelp-help-example-main": "Hölp för et Houpmoduhl.",
        "apihelp-help-example-recursive": "Alle Hölp en eine Sigg.",
        "apihelp-help-example-help": "Alle Hölp övver de Hölp säälver.",
+       "apihelp-help-example-query": "Hölp för zwei Ongermoduhle för Frohre.",
        "apihelp-imagerotate-description": "Ein udder mieh Bellder driehje.",
        "apihelp-imagerotate-param-rotation": "Öm wi vill Jrahd sulle de Bellder noh de Uhr drieh wääde?",
        "apihelp-imagerotate-example-simple": "Drieh de <kbd>Dattei:Beijschpell.png</kbd> öm <kbd>90</kbd> Jrahd.",
        "apihelp-imagerotate-example-generator": "Drieh alle Bellder en dä <kbd>Saachjropp:Ömdriehje</kbd> öm <kbd>180</kbd> Jrahd.",
+       "apihelp-import-param-summary": "Zersammefaßong för der Empohrt.",
        "apihelp-import-param-xml": "Donn en Dattei em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommaht huhjahde.",
+       "apihelp-import-param-interwikisource": "För et Empottehre us enem andere Wikki: Dat Wikki vun woh der Empohrt kumme sull.",
+       "apihelp-import-param-interwikipage": "För et Empottehre us enem andere Wikki: De Sigg zom Empottehre.",
+       "apihelp-import-param-fullhistory": "För et Empottehre us enem andere Wikki: Donn de jannze Verjangeheid empottehre, nit blohß de aktoälle Väsjohn.",
+       "apihelp-import-param-templates": "För et Empottehre us enem andere Wikki: Donn all de nühdejje Schablohne met empottehre.",
+       "apihelp-import-param-namespace": "För et Empottehre us enem andere Wikki: Donn ene heh dat Appachtemang empottehre.",
        "apihelp-import-param-rootpage": "Als Ongersiff vun heh dä Sigg empottehre-",
+       "apihelp-import-example-import": "Donn di Sigg „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[meta:Help:Parserfunctions]]</code>“ en et Appachtemang 100 empottehre, met alle älldere Väsjohne.",
        "apihelp-login-param-name": "Metmaacher_Nahme.",
        "apihelp-login-param-password": "Paßwoot.",
        "apihelp-login-param-domain": "De Domaijn (kann fott bliehve)",
        "apihelp-login-example-login": "Enlogge.",
        "apihelp-logout-example-logout": "Donn dä aktoälle Metmaacher ußlogge.",
+       "apihelp-managetags-param-ignorewarnings": "Ov alle Warnonge övverjange wöhde sull, die bei dämm Opdracht opkumme.",
+       "apihelp-managetags-example-create": "Donn en Makkehrong aanlähje mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
+       "apihelp-managetags-example-delete": "Schmiiß de Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">vandlaism</kbd>“ fott mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Misspelt</kbd>“.",
+       "apihelp-managetags-example-activate": "Donn en Makkehrong aktevehre mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
+       "apihelp-managetags-example-deactivate": "Donn en Makkehrong mem Nahme „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ nit mieh aktihv maache, mem Jrond „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">For use in edit patrolling</kbd>“.",
        "apihelp-move-description": "Donn en Sigg ömbenänne",
+       "apihelp-move-param-from": "De Övverschreff vun dä Sigg zom Ömbenänne. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1fromid</var>“ bruche.",
+       "apihelp-move-param-fromid": "De ännong vun dä Sigg zom Ömbenänne. Kam_mer nit zesamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1from</var>“ bruche.",
        "apihelp-move-param-to": "De neue Övverschreff för di Sigg drop ömzebenänne.",
        "apihelp-move-param-reason": "Der jrond för di Sigg ömzebenänne.",
        "apihelp-move-param-movetalk": "Donn de Klaafsigg ömbenänne, wann et se jitt.",
        "apihelp-opensearch-param-search": "Noh wat söhke?",
        "apihelp-opensearch-param-limit": "De hühßte Aanzahl vun Äjeebnesse för zeröck ze jävve",
        "apihelp-opensearch-param-namespace": "En wällschem Appachtemang söhke.",
-       "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.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-opensearch-param-redirects/en\n-->",
+       "apihelp-opensearch-param-redirects": "Wi met Ömleidonge ömjonn?\n;return:Jivv de Ömleidonge sällver uß.\n;resolve:Jiff de Sigg uß, woh de Ömleidong hen jeiht. Dat künnt winnijer wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</code>“ Sigge ußjävve.\nTradizonäll es dä Schtandatt „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">return</code>“ för „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1format=json</code>“ un „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">resolve</code>“ för alle anndere.",
        "apihelp-opensearch-param-format": "Et Fommaht zom Ußjävve.",
        "apihelp-opensearch-example-te": "Fengk Sigge, di met <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Te</kbd> aanfange.",
        "apihelp-options-param-reset": "Säz de Enschtällonge op dem Wikki singe Standatt.",
        "apihelp-options-example-reset": "Alle enschtälloonge retuur schtälle.",
        "apihelp-paraminfo-description": "Holl Aanjahbe övver dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ier Moduhle.",
        "apihelp-paraminfo-param-helpformat": "Et Fommaht vun de Täxe för Hölp.",
-       "apihelp-paraminfo-param-formatmodules": "Leß met de Nahme vun de Moduhle zom Fommatehre (Wäät vum „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">format</var>“-Parramehter). Nemm schtatt dämm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1modules</kbd>“.",
+       "apihelp-paraminfo-param-formatmodules": "Leß met de Nahme vun de Moduhle zom Fommatehre (Wäät vum „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">format</var>“-Parramehter). Nemm schtatt dämm „<varlang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1modules</var>“.",
        "apihelp-paraminfo-example-1": "Zisch Aanjahbe övver <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, un <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-parse-param-summary": "De Zersammefaßong för ze pahse.",
        "apihelp-parse-param-section": "Holl blohß dann der Ennhalld vun däm Affschnett met dä Nommer, udder wann „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd>“ enjejovve es, maach ene neu Affschnett derbei.",
        "apihelp-parse-param-sectiontitle": "De Övverschreff för dä neuje Afschnet, wann <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">section</var> = <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</kbd> es.\n\nAnders wi beim Beärbeide vun dä Sigg weed dä Parramehter nit dorsch de <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">summary</var> ußjetuusch, wann hä fottjelohße udder läddesch es.",
+       "apihelp-parse-param-disabletoc": "Donn et Ennhaldsverzeijscheneß en de Ußjahbe vottlohze.",
        "apihelp-parse-example-page": "Donn en Sigg pahse.",
        "apihelp-parse-example-text": "Donn Wikkitäx pahse.",
        "apihelp-parse-example-texttitle": "Donn Wikkitäx pahse, un jiff derför en Övverschreff för en Sigg aan.",
        "apihelp-query+allcategories-param-to": "De Saachjropp, bes woh hen opzälle.",
        "apihelp-query+allcategories-param-dir": "De Reijefollsch zum Zotehre.",
        "apihelp-query+allcategories-param-limit": "Wi vell Saachjroppe ußjävve?",
-       "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;.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Ballcategories-param-prop/ksh\n-->",
+       "apihelp-query+allcategories-param-prop": "Wat för en Eijeschaffte holle: \n;size:Deiht de Aanzahl Sigge en dä Saachjropp derbei.\n;hidden:Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
        "apihelp-query+alldeletedrevisions-description": "Donn alle fottjeschmeße Väsjohne vun enem Metmaacher udder en enem Appachemang opleßte.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kam_mer blohß met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3user</var> bruche.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Kam_mer nit met <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$3user</var> bruche.",
        "apihelp-query+allfileusages-param-to": "De Övverschreff vun dä Dattei, woh de Leß medd ophühre sull.",
        "apihelp-query+allfileusages-param-prefix": "Söhk noh alle Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+allfileusages-param-unique": "Donn blohß ongerscheidlijje Övverschreffte vun Datteije aanzeije. Kammer nit zesamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1prop=ids<code>“ bruche.\nWann als ene  Jenerahtor enjesaz, bräng Zihlsigge un kein Kwällsigge.",
-       "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.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Ballfileusages-param-prop/ksh\n-->",
+       "apihelp-query+allfileusages-param-prop": "Wat för en Aanjahbe ennschlehße:\n;ids:Deiht de Kännonge vun dä Sigge derbei, di dat bruche. Kam_mer nit zersamme met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1unique</code>“ bruche.\n;title:Deiht dä Dattei ehr Övverschreff derbei.",
        "apihelp-query+allfileusages-param-limit": "Wi vill sulle överhoup aanjezeisch wähde?",
        "apihelp-query+allfileusages-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+allfileusages-example-B": "Donn Övverschreffte vun Datteije aanzeije, och vun Datteije, di (noch) nit doh sin, zesame met dä Kännonge vun dä Sigge, woh se vun sin, aanjevange vun <kbd>B</kbd>.",
        "apihelp-query+blocks-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+blocks-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
        "apihelp-query+blocks-param-limit": "De hühßde Aanzahl Spärre zom opleste.",
-       "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.).\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Bblocks-param-prop/ksh\n-->",
+       "apihelp-query+blocks-param-prop": "Wat för en Eijeschaffte holle:\n;id:Deiht dä Spärr iehr Kännonge derbei.\n;user:Deiht dä Nahme vom jeschpächte Metmaacher derbei.\n;userid:Deiht de Kännong vum jeschpächte Metmaacher derbei.\n;by:Deiht dä Nahme vun däm Metmaacher derbei, dä jeschpächt hät.\n;byid:Deiht de Kännong vun däm Metmaacher derbei, dä jeschpächt hät.\n;timestamp:Deihd et Dattum un de Uhrzigg derbei, wann jeschpächt wood.\n;expiry:Deihd et Dattum un de Uhrzigg derbei, wann di Schparr eröm es.\n;reason:Deiht der Jrond för di Schparr derbei.\n;range:Deiht dä Berätt vun <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße för di Schparr derbei.\n;flags:makkehrt di Spärr met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">autoblock</code>“, „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">anononly</code>“, un esu.",
        "apihelp-query+blocks-example-simple": "Schpärre opleßte.",
        "apihelp-query+blocks-example-users": "Donn de Schpärre vun dä Metmaacher <lang=\"en\" xml:lang=\"en\" dir=\"ltr\" kbd>Alice</kbd> un <lang=\"en\" xml:lang=\"en\" dir=\"ltr\" kbd>Bob</kbd> opleßte.",
        "apihelp-query+categories-description": "Donn alle Saachjroppe epleßte, woh di Sigge dren sin.",
-       "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;.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Bcategories-param-prop/ksh\n-->",
+       "apihelp-query+categories-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle för jehde Saachjropp:\n;sortkey:Deiht dä Schlößel zom Zottehre vun dä Saachjropp derbei, en lange häxadezimahle Zahl, un der Schlößelvörsaz, woh ene Minsch jät med aanfange kann.\n;timestamp:Deihd en Dattom un en Zigg derbei, wann di Sachjrobb aanjelaat woode es.\n;hidden:Makehrt de veschtoche Sachjroppe met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">_&#95;HIDDENCAT_&#95;</code>“.",
        "apihelp-query+categories-param-show": "Wat för en Zoot Saachjroppe zeije.",
        "apihelp-query+categories-param-limit": "Wi vell Saachjroppe ußjävve?",
        "apihelp-query+categories-param-dir": "En wälsche Reijefollsch?",
        "apihelp-query+deletedrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
        "apihelp-query+deletedrevisions-param-limit": "De hühßde Aanzahl Väsjohne för opzeleßte.",
-       "apihelp-query+deletedrevisions-param-prop": "Wat för en Eijeschaffte holle:\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.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Bdeletedrevisions-param-prop/en\n-->",
+       "apihelp-query+deletedrevisions-param-prop": "Wat för en Eijeschaffte holle:\n;revid:Deiht de Kännong vun de fottjeschmeße Väsjohn derbei.\n;parentid:Deiht de Kännong vun de vörrejje Väsjohn vun dä Sigg derbei.\n;user:Deiht dä Metmaacher derbei, dä di Väsjohn jemaat hät.\n;userid:Deiht de Kännong vun däm Metmaacher derbei, dä di Väsjohn jemaat hät.\n;comment:Deiht et Väld „{{int:summary}}“ vun dä Väsjohn derbei.\n;parsedcomment:Deiht et jepaaste Väld „{{int:summary}}“ vun dä Väsjohn derbei.\n;minor:Makehronge, wann di Väsjohn en klein Mini_Änderong es.\n;len:Deiht de Läng (Aanzahl <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Bytes</i>) vun dä Väsjohn derbei.\n;sha1:Deiht dä <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"secure hash algorithm\">SHA-1 (base 16)</i> vun dä Väsjohn derbei.\n;content:Deiht der Ennhalld vun dä Väsjohn derbei.\n;tags:Makehronge för di Väsjohn.",
        "apihelp-query+deletedrevisions-example-revids": "Donn de Aanjahbe för de fottjeschmeße Väsjohn <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">123456</kbd> holle.",
        "apihelp-query+duplicatefiles-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+embeddedin-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+siteinfo-param-numberingroup": "Donn de Aanzahl Metmaacher en de Jroppe vun Metmaacher opleßte.",
        "apihelp-query+tags-param-limit": "De hühßde Aanzahl !!FUZY tags zom opleste.",
-       "apihelp-query+tags-param-prop": "Wat för en Eijschaffte holle:\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.\n<!-- https://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Apihelp-query%2Btags-param-prop/ksh\n -->",
+       "apihelp-query+tags-param-prop": "Wat för en Eijschaffte holle:\n;name:Deiht dä Nahme vun dä Makehrong derbei.\n;displayname:Deiht der Täx vum Wikki för de Makehrong derbei.\n;description:Deiht dä Beschrievongstäx vun dä Makehrong derbei.\n;hitcount:Deiht de Aanzahl vun Väsjohne un Enndrähsch em Logbohch derbei, di di Makehrong han.\n;defined:Jivv aan, ov di Makehrong övverhoup doh es.\n;source:Hollt de Kwälle vun de Makehrong, dat kann ömfaße: „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">extension</samp>“ för Makehronge, di vun Zohsazprojramme faßjelaat wähde, un „<samp lang=\"en\" xml:lang=\"en\" dir=\"ltr\">manual</samp>“ för Makehronge, di vun de Metmaacher vun Hand verjovve wohde.\n;active:Ov de Makehrong emmer noch aktihv es.",
        "apihelp-query+templates-param-limit": "Wi vill Schablohne sulle ußjejovve wähde?",
        "apihelp-query+templates-param-dir": "En wälsche Reihjefollsch opleßte.",
        "apihelp-query+usercontribs-param-limit": "De hühßte Aanzahl vun Meddeilonge för zeröck ze jävve",
+       "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.",
+       "apihelp-tag-param-revid": "Ein Kännong udder mieh, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
+       "apihelp-tag-param-add": "De Makkehrong zom Zohföhje. Bloß de vun Hand aanjelaat Makkehronge künne heh zohjeföhsch wähde.",
+       "apihelp-tag-param-reason": "Dä Jrond för di Änderong.",
+       "apihelp-tag-example-rev": "Donn de Makkehrong „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">vandalism</kbd>“ vun dä Väsjohn met dä Kännong „<kbd>123</kbd>“ fott nämme, der ohne ene Jrond ze nänne.",
+       "apihelp-tag-example-log": "Donn de Makkehrong „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">spam</kbd>“ vun dämm Enndrahch met dä Kännong „<kbd>123</kbd>“ em Logbohch fott nämme un als Jrond draaach „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Wrongly applied</kbd>“ enn.",
+       "api-help-source": "Quäll: $1",
+       "api-help-source-unknown": "Quäll: <span class=\"apihelp-unknown\">onbikannt</span>",
+       "api-help-license": "Lezänz: [[$1|$2]]",
+       "api-help-license-noname": "Lezänz: [[$1|Loor noh dämm Lengk]]",
+       "api-help-license-unknown": "Lezänz: <span class=\"apihelp-unknown\">onbikannt</span>",
+       "api-help-datatypes-header": "Zoote Dahte",
+       "api-help-param-type-limit": "Zoot: en jannze Zahl udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">max</kbd>“",
+       "api-help-param-type-integer": "Zoot: {{PLURAL:$1|1=en jannze Zahl|2=en Leß met jannze Zahle}}",
+       "api-help-param-type-boolean": "Zoot: Boolsch ([[Special:ApiHelp/main#main/datatypes|Einjzelheijte]])",
+       "api-help-param-type-timestamp": "Zoot: {{PLURAL:$1|1=en Dattomm un en Zigg|2=en Leß met Aanjahbe us Dattom un Zigg}} (de [[Special:ApiHelp/main#main/datatypes|zohjelohße Fommahte]])",
+       "api-help-param-type-user": "Zoot: {{PLURAL:$1|1=ene Metmaacher_Nahme|2=en Leß met Metmaacher_Nahme}}",
        "api-help-param-default": "Schtandatt: $1",
        "api-help-param-default-empty": "Schtandatt: <span class=\"apihelp-empty\">(läddesch)</span>",
        "api-help-param-limited-in-miser-mode": "<strong>opjepaß:</strong> Weil der  [[mw:Manual:$wgMiserMode|miser mode]] enjeschalld es, künne heh winnijer wi <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1limit</var> Äjehpneße ußjejejovve wähde, vör em Wigger_Mache. En Jränzfäll künne et Noll sin.",
-       "api-help-param-direction": "En wälsche Reihjefollsch opleßte:\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.\n<!-- \nhttps://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Api-help-param-direction/ksh\n-->",
+       "api-help-param-direction": "En wälsche Reihjefollsch opleßte:\n;newer:De Ählsde et eez. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß fröhjer sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.\n;older:De Neuste et eez, der Schtanndatt. Opjepaß: „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1start</code>“ moß schpääder sin wi „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1end</code>“.",
        "api-help-param-continue": "Wann mih ze holle es, nemm dat för wigger ze maache.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nix drövver bikannt)</span>",
        "api-help-examples": "{{PLURAL:$1|Beijschpell|Beijschpelle|Beijschpell}}:",
index ac2a1d3..612625f 100644 (file)
@@ -78,6 +78,7 @@
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
+       "apihelp-tag-param-reason": "Grond fir d'Ännerung.",
        "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-userrights-param-userid": "Benotzer Id.",
        "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
        "apihelp-watch-example-watch": "D'Säit <kbd>Haaptsäit</kbd> iwwerwaachen.",
+       "api-help-source": "Quell: $1",
+       "api-help-source-unknown": "Quell: <span class=\"apihelp-unknown\">onbekannt</span>",
+       "api-help-license": "Lizenz: [[$1|$2]]",
+       "api-help-license-noname": "LiZenz: [[$1|Kuckt de Link]]",
+       "api-help-license-unknown": "Lizenz: <span class=\"apihelp-unknown\">onbekannt</span>",
        "api-help-param-deprecated": "Vereelst.",
        "api-help-param-required": "Dëse Parameter ass obligatoresch.",
+       "api-help-datatypes-header": "Datentypen",
+       "api-help-param-type-user": "Typ: {{PLURAL:$1|1=Benotzernumm|2=Lëscht vu Benotzernimm}}",
        "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:"
 }
index 1efb45f..449031f 100644 (file)
        "apihelp-block-param-nocreate": "Оневозможи создавање кориснички сметки.",
        "apihelp-block-param-autoblock": "Автоматски блокирај ја последно употребената IP-адреса и сите понатамошни IP-адреси од кои лицето ќе се обиде да се најави.",
        "apihelp-block-param-noemail": "Оневозможи му на корисникот да испаќа е-пошта преку викито. (Го бара правото „блокирање е-пошта“).",
-       "apihelp-block-param-hidename": "Скриј го корисничкото име од дневникот на блокирања. (Го бара правото „скривање корисник“)",
+       "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-ip-simple": "Блокирај ја IP-адресата <kbd>192.0.2.5</kbd> три дена со причината <kbd>Прва опомена</kbd>.",
        "apihelp-block-example-user-complex": "Блокирај го корисникот Вандал (Vandal) бесконечно со причината „Вандализам“ и оневозможи создавање на нови сметки и праќање е-пошта",
        "apihelp-clearhasmsg-description": "Ја отстранува ознаката „<code>hasmsg</code>“ од тековниот корисник.",
        "apihelp-clearhasmsg-example-1": "Отстрани ја ознаката „<code>hasmsg</code>“ од тековниот корисник",
        "apihelp-watch-example-unwatch": "Отстрани ја страницата „Главна страница“ од набљудуваните",
        "apihelp-watch-example-generator": "Набљудувај ги првите неколку страници во главниот именски простор",
        "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 знаци како UTF-8 наместо да ги заменува со хексадецимални изводни низи.",
index 72816b9..1b63f93 100644 (file)
@@ -55,6 +55,7 @@
        "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Verouderd.",
+       "api-help-datatypes-header": "Gegevenstypen",
        "api-help-param-default": "Standaard: $1",
        "api-credits-header": "Vermeldingen",
        "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://phabricator.wikimedia.org/."
index dc12b66..c4ade1a 100644 (file)
        "apihelp-block-param-reason": "Motiu del blocatge.",
        "apihelp-block-param-nocreate": "Empachar la creacion de compte.",
        "apihelp-checktoken-param-token": "Geton de testar.",
+       "apihelp-compare-param-fromtitle": "Primièr títol de comparar.",
+       "apihelp-compare-param-fromid": "ID de la primièra pagina de comparar.",
+       "apihelp-compare-param-fromrev": "Primièra revision de comparar.",
+       "apihelp-compare-param-totitle": "Segond títol de comparar.",
+       "apihelp-compare-param-toid": "ID de la segonda pagina de comparar.",
+       "apihelp-compare-param-torev": "Segonda revision de comparar.",
+       "apihelp-createaccount-description": "Creatz un novèl compte d'utilizaire.",
        "apihelp-createaccount-param-name": "Nom d'utilizaire.",
+       "apihelp-createaccount-param-password": "Senhal (ignorat se <var>$1mailpassword</var> es definit).",
+       "apihelp-createaccount-param-realname": "Nom vertadièr de l’utilizaire (facultatiu).",
+       "apihelp-delete-description": "Suprimir una pagina.",
        "apihelp-delete-example-simple": "Suprimir la <kbd>Pagina principala</kbd>.",
+       "apihelp-disabled-description": "Aqueste modul es estat desactivat.",
+       "apihelp-edit-description": "Crear e modificar las paginas.",
        "apihelp-edit-param-text": "Contengut de la pagina.",
-       "apihelp-edit-param-minor": "Modificacion menora."
+       "apihelp-edit-param-minor": "Modificacion menora.",
+       "apihelp-edit-param-notminor": "Modificacion pas menora.",
+       "apihelp-edit-param-bot": "Marcar aquesta modificacion coma robòt.",
+       "apihelp-edit-example-edit": "Modificar una pagina",
+       "apihelp-edit-example-prepend": "Prefixar una pagina per <kbd>_&#95;NOTOC_&#95;</kbd>",
+       "apihelp-emailuser-description": "Mandar un corrièr electronic un l’utilizaire.",
+       "apihelp-emailuser-param-subject": "Entèsta del subjècte.",
+       "apihelp-emailuser-param-text": "Còs del corrièr electronic.",
+       "apihelp-emailuser-param-ccme": "Me mandar una còpia d'aqueste corrièr electronic.",
+       "apihelp-expandtemplates-param-title": "Títol de la pagina.",
+       "apihelp-expandtemplates-param-text": "Wikitèxte de convertir.",
+       "apihelp-feedcontributions-param-feedformat": "Lo format del flux.",
+       "apihelp-feedcontributions-param-year": "A partir de l’annada (e mai recent) :",
+       "apihelp-feedcontributions-param-month": "A partir del mes (e mai recent) :",
+       "apihelp-feedrecentchanges-param-feedformat": "Lo format del flux.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrar per balisa.",
+       "apihelp-filerevert-param-comment": "Telecargar lo comentari.",
+       "apihelp-filerevert-param-archivename": "Nom d’archiu de la revision de restablir.",
+       "apihelp-import-param-summary": "Importar lo resumit.",
+       "apihelp-import-param-xml": "Fichièr XML telecargat.",
+       "apihelp-login-param-name": "Nom d'utilizaire.",
+       "apihelp-login-param-password": "Senhal.",
+       "apihelp-login-param-domain": "Domeni (facultatiu).",
+       "apihelp-login-example-login": "Se connectar.",
+       "apihelp-managetags-description": "Efectuar de prètzfaches de gestion relatius a la modificacion de las balisas.",
+       "apihelp-move-description": "Desplaçar una pagina.",
+       "apihelp-opensearch-param-search": "Cadena de recèrca.",
+       "apihelp-parse-example-page": "Analisar una pagina.",
+       "apihelp-parse-example-text": "Analisar lo wikitèxte.",
+       "apihelp-parse-example-summary": "Analisar un resumit.",
+       "apihelp-protect-example-protect": "Protegir una pagina",
+       "apihelp-query-param-list": "Quinas listas obténer.",
+       "apihelp-query-param-meta": "Quinas metadonadas obténer.",
+       "apihelp-query+alldeletedrevisions-param-from": "Aviar la lista a aqueste títol.",
+       "apihelp-query+allimages-param-sort": "Proprietat per la quala cal triar.",
+       "apihelp-query+blocks-example-simple": "Listar los blocatges",
+       "apihelp-query+blocks-example-users": "Listar los blocatges dels utilizaires <kbd>Alice</kbd> e <kbd>Bob</kbd>."
 }
index fc92c43..8428b36 100644 (file)
@@ -8,7 +8,8 @@
                        "Devwebtel",
                        "Macofe",
                        "Pio387",
-                       "Peter Bowman"
+                       "Peter Bowman",
+                       "Darellur"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
@@ -32,6 +33,8 @@
        "apihelp-edit-param-minor": "Drobna zmiana.",
        "apihelp-edit-param-notminor": "Nie drobna zmiana.",
        "apihelp-edit-param-bot": "Oznacz tę edycję jako edycję bota.",
+       "apihelp-edit-param-watch": "Dodaj stronę do aktualnej listy obserwacji użytkownika.",
+       "apihelp-edit-param-unwatch": "Usuń stronę z aktualnej listy obserwacji użytkownika.",
        "apihelp-edit-example-edit": "Edytuj stronę",
        "apihelp-emailuser-description": "Wyślij e‐mail do użytkownika.",
        "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
@@ -60,6 +63,7 @@
        "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-tag-param-reason": "Powód zmiany.",
        "apihelp-unblock-param-reason": "Powód odblokowania.",
        "apihelp-undelete-param-reason": "Powód przywracania.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "api-help-flag-writerights": "Ten moduł wymaga praw zapisu.",
        "api-help-flag-mustbeposted": "Ten moduł akceptuje tylko żądania POST.",
        "api-help-flag-generator": "Ten moduł może być użyty jako generator.",
+       "api-help-source": "Źródło: $1",
+       "api-help-source-unknown": "Źródło: <span class=\"apihelp-unknown\">nieznane</span>",
+       "api-help-license": "Licencja: [[$1|$2]]",
+       "api-help-license-noname": "Licencja: [[$1|Zobacz link]]",
+       "api-help-license-unknown": "Licencja: <span class=\"apihelp-unknown\">nieznana</span>",
        "api-help-parameters": "{{PLURAL:$1|Parametr|Parametry}}:",
        "api-help-param-deprecated": "Przestarzałe.",
        "api-help-param-required": "Ten parametr jest wymagany.",
+       "api-help-datatypes-header": "Typy danych",
+       "api-help-param-type-boolean": "Typ: wartość logiczna ([[Special:ApiHelp/main#main/datatypes|szczegóły]])",
+       "api-help-param-type-timestamp": "Typ: {{PLURAL:$1|1=znacznik czasu|2=lista znaczników czasu}} ([[Special:ApiHelp/main#main/datatypes|dozwolone formaty]])",
+       "api-help-param-type-user": "Typ: {{PLURAL:$1|1=nazwa użytkownika|2=lista nazw uzytkowników}}",
        "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-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 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-multi-max": "Maksymalna liczba 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>",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(bez opisu)</span>",
index b939902..c8f1ffd 100644 (file)
        "apihelp-move-description": "يو مخ لېږدول.",
        "apihelp-query+search-example-simple": "د <kbd>مانا</kbd> پلټل.",
        "apihelp-query+search-example-text": "د <kbd>مانا</kbd> لپاره متنونه پلټل.",
+       "apihelp-tag-param-reason": "د بدلون سبب.",
        "apihelp-userrights-param-user": "کارن نوم.",
        "apihelp-userrights-param-userid": "کارن پېژند.",
+       "api-help-source": "سرچينه: $1",
+       "api-help-source-unknown": "سرچينه: <span class=\"apihelp-unknown\">ناجوت</span>",
+       "api-help-license": "منښتليک: [[$1|$2]]",
+       "api-help-license-noname": "منښتليک: [[$1|تړنه وڅارئ]]",
+       "api-help-license-unknown": "منښتليک: <span class=\"apihelp-unknown\">ناجوت</span>",
+       "api-help-datatypes-header": "اومتوگ ډولونه",
        "api-help-param-default": "تلواليز: $1",
        "api-help-param-default-empty": "تلواليز: <span class=\"apihelp-empty\">(تش)</span>",
        "api-help-examples": "{{PLURAL:$1|بېلگه|بېلگې}}:",
index 72044db..4325c14 100644 (file)
        "api-help-title": "Ajuda API da MediaWiki",
        "api-help-main-header": "Módulo principal",
        "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-license": "Licença: [[$1|$2]]",
+       "api-help-license-noname": "Licença: [[$1|Ver ligação]]",
+       "api-help-license-unknown": "Licença: <span class=\"apihelp-unknown\">desconhecida</span>",
        "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
+       "api-help-datatypes-header": "Tipo de dados",
        "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>",
index 05b7722..876f598 100644 (file)
@@ -81,6 +81,7 @@
        "apihelp-edit-param-sectiontitle": "{{doc-apihelp-param|edit|sectiontitle}}",
        "apihelp-edit-param-text": "{{doc-apihelp-param|edit|text}}",
        "apihelp-edit-param-summary": "{{doc-apihelp-param|edit|summary}}",
+       "apihelp-edit-param-tags": "{{doc-apihelp-param|edit|tags}}",
        "apihelp-edit-param-minor": "{{doc-apihelp-param|edit|minor}}\n{{Identical|Minor edit}}",
        "apihelp-edit-param-notminor": "{{doc-apihelp-param|edit|notminor}}",
        "apihelp-edit-param-bot": "{{doc-apihelp-param|edit|bot}}",
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
+       "apihelp-tag-description": "{{doc-apihelp-description|tag}}",
+       "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}",
+       "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}",
+       "apihelp-tag-param-logid": "{{doc-apihelp-param|tag|logid}}",
+       "apihelp-tag-param-add": "{{doc-apihelp-param|tag|add}}",
+       "apihelp-tag-param-remove": "{{doc-apihelp-param|tag|remove}}",
+       "apihelp-tag-param-reason": "{{doc-apihelp-param|tag|reason}}",
+       "apihelp-tag-example-rev": "{{doc-apihelp-example|tag}}",
+       "apihelp-tag-example-log": "{{doc-apihelp-example|tag}}",
        "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}",
        "apihelp-tokens-param-type": "{{doc-apihelp-param|tokens|type}}",
        "apihelp-tokens-example-edit": "{{doc-apihelp-example|tokens}}",
        "apihelp-json-description": "{{doc-apihelp-description|json|seealso=* {{msg-mw|apihelp-jsonfm-description}}}}",
        "apihelp-json-param-callback": "{{doc-apihelp-param|json|callback}}",
        "apihelp-json-param-utf8": "{{doc-apihelp-param|json|utf8}}",
+       "apihelp-json-param-ascii": "{{doc-apihelp-param|json|ascii}}",
+       "apihelp-json-param-formatversion": "{{doc-apihelp-param|json|formatversion}}",
        "apihelp-jsonfm-description": "{{doc-apihelp-description|jsonfm|seealso=* {{msg-mw|apihelp-json-description}}}}",
        "apihelp-none-description": "{{doc-apihelp-description|none}}",
        "apihelp-php-description": "{{doc-apihelp-description|php|seealso=* {{msg-mw|apihelp-phpfm-description}}}}",
+       "apihelp-php-param-formatversion": "{{doc-apihelp-param|json|formatversion}}",
        "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}",
        "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
        "apihelp-txt-description": "{{doc-apihelp-description|txt|seealso=* {{msg-mw|apihelp-txtfm-description}}}}",
        "api-help-flag-writerights": "Flag displayed for an API module that requires write rights",
        "api-help-flag-mustbeposted": "Flag displayed for an API module that only accepts POST requests",
        "api-help-flag-generator": "Flag displayed for an API module that can be used as a generator",
+       "api-help-source": "Displayed in the flags box to indicate the source of an API module.\n\nParameters:\n* $1 - Possibly-localised extension name, or \"MediaWiki\" if it's a core module\n* $2 - Non-localised extension name.\n\nSee also:\n* {{msg-mw|api-help-source-unknown}}",
+       "api-help-source-unknown": "Displayed in the flags box to indicate that the source of an API module is not known.\n\nSee also:\n* {{msg-mw|api-help-source}}",
+       "api-help-license": "Displayed in the flags box to indicate the license of an API module.\n\nParameters:\n* $1 - Page to link to display the full license text\n* $2 - Display text for the link\n\nSee also:\n* {{msg-mw|api-help-license-noname}}\n* {{msg-mw|api-help-license-unknown}}",
+       "api-help-license-noname": "Displayed in the flags box to indicate the license of an API module, when the tag for the license is not known.\n\nParameters:\n* $1 - Page to link to display the full license text\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-unknown}}",
+       "api-help-license-unknown": "Displayed in the flags box to indicate that the license of the API module is not known.\n\nSee also:\n* {{msg-mw|api-help-license}}\n* {{msg-mw|api-help-license-noname}}",
        "api-help-help-urls": "{{optional}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
        "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed\n{{Identical|Parameter}}",
        "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
+       "api-help-datatypes-header": "Header for the data type section in the API help output",
+       "api-help-datatypes": "{{technical}} {{doc-important|Do not translate or reformat dates inside &lt;kbd%gt; tags}} Documentation of certain API data types\nSee also:\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-limit": "{{technical}} {{doc-important|Do not translate text inside &lt;kbd%gt; tags}} Used to indicate that a parameter is a \"limit\" type. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-integer": "{{technical}} Used to indicate that a parameter is an integer or list of integers. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-boolean": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a boolean. Parameters:\n* $1 - Always 1.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-timestamp": "{{technical}} {{doc-important|Do not translate <code>Special:ApiHelp</code> in this message.}} Used to indicate that a parameter is a timestamp or list of timestamps. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
+       "api-help-param-type-user": "{{technical}} Used to indicate that a parameter is a username or list of usernames. Parameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes a list of values.\nSee also:\n* {{msg-mw|api-help-datatypes}}\n* [[Special:PrefixIndex/MediaWiki:api-help-param-type]]",
        "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
        "api-help-param-list-can-be-empty": "Used to indicate that one of the possible values in the list is the empty string.\n\nParameters:\n* $1 - Number of items in the rest of the list; may be 0\n* $2 - Remainder of the list as a comma-separated string",
        "api-help-param-limit": "Used to display the maximum value of a limit parameter\n\nParameters:\n* $1 - Maximum value",
index e533d79..2ccfd92 100644 (file)
@@ -4,7 +4,8 @@
                        "Mahairod",
                        "Okras",
                        "Eakarpov",
-                       "Kaganer"
+                       "Kaganer",
+                       "Mariya"
                ]
        },
        "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: Ошибки и предупреждения]].",
@@ -44,6 +45,9 @@
        "apihelp-query+recentchanges-example-simple": "Список последних изменений.",
        "apihelp-upload-example-url": "Загрузить через URL",
        "api-help-main-header": "Главный модуль",
+       "api-help-source": "Источник: $1",
+       "api-help-source-unknown": "Источник: <span class=\"apihelp-unknown\">unknown</span>",
+       "api-help-license": "Лицензия: [[$1|$2]]",
        "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
        "api-help-param-deprecated": "Устаревший.",
        "api-help-param-required": "Этот параметр является обязательным.",
diff --git a/includes/api/i18n/ta.json b/includes/api/i18n/ta.json
new file mode 100644 (file)
index 0000000..04e9a43
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "@metadata": {
+               "authors": [
+                       "AntanO",
+                       "கலைவாணன்"
+               ]
+       },
+       "apihelp-import-param-namespace": "இதனைப் பெயர்வெளிக்கு இறக்குமதி செய்யவும். <kbd>$1rootpage</kbd> அளவுருவை மீறச்செய்யும்.",
+       "apihelp-import-param-rootpage": "இப்பக்கத்தின் துணைப்பக்கமாக இறக்குமதி செய்யவும். <kbd>$1namespace</kbd> அளவுரு வழங்கப்பட்டிருந்தால் இது புறக்கணிக்கப்படும்.",
+       "api-help-source": "மூலம்: $1",
+       "api-help-license": "அனுமதி: [[$1|$2]]",
+       "api-help-license-noname": "அனுமதி: [[$1|இணைப்பைப் பார்]]"
+}
index 13ce490..528f0b6 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Ата",
-                       "A1"
+                       "A1",
+                       "Ahonc"
                ]
        },
        "apihelp-main-param-action": "Яку дію виконати.",
@@ -26,5 +27,6 @@
        "apihelp-expandtemplates-description": "Розгортає усі шаблони у вікітекст.",
        "apihelp-expandtemplates-param-title": "Заголовок сторінки.",
        "apihelp-expandtemplates-param-text": "Вікітекст для перетворення.",
-       "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження"
+       "apihelp-move-param-ignorewarnings": "Ігнорувати всі попередження",
+       "api-help-datatypes-header": "Типи даних"
 }
diff --git a/includes/api/i18n/yi.json b/includes/api/i18n/yi.json
new file mode 100644 (file)
index 0000000..c24d4ce
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "פוילישער"
+               ]
+       },
+       "api-help-source": "מקור: $1"
+}
index 722803b..924f38b 100644 (file)
@@ -85,6 +85,7 @@
        "apihelp-edit-param-sectiontitle": "新小节的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
+       "apihelp-edit-param-tags": "更改标签以应用修订。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
        "apihelp-import-param-interwikipage": "用于跨wiki导入:导入的页面。",
        "apihelp-import-param-fullhistory": "用于跨wiki导入:完整导入历史,而不只是最新版本。",
        "apihelp-import-param-templates": "用于跨wiki导入:连带导入所有包含的模板。",
-       "apihelp-import-param-namespace": "用于跨wiki导入:导入到此名字空间。",
-       "apihelp-import-param-rootpage": "导入作为此页面的子页面。",
+       "apihelp-import-param-namespace": "导入至此名字空间。重写<kbd>$1rootpage</kbd>参数。",
+       "apihelp-import-param-rootpage": "作为此页面的子页面导入。如果提供<kbd>$1namespace</kbd>参数则忽略。",
        "apihelp-import-example-import": "将页面[[meta:Help:Parserfunctions]]连带完整历史导入至100名字空间。",
        "apihelp-login-description": "登录并获得身份验证Cookie。\n\n在成功登录的情况下,所需的Cookie将包含在HTTP响应头中。在登录失败的情况下,进一步的尝试可能会被自动密码猜解攻击的限制所遏制。",
        "apihelp-login-param-name": "用户名。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
        "apihelp-query+allcategories-param-prop": "要获取的属性:\n;size:在分类中添加页面数。\n;hidden:标记由_&#95;HIDDENCAT_&#95;隐藏的分类。",
        "apihelp-query+allcategories-example-size": "列出分类及其含有多少页面的信息。",
+       "apihelp-query+alldeletedrevisions-description": "列举由一位用户或在一个名字空间中所有已删除的修订。",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与<var>$3user</var>一起使用。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与<var>$3user</var>一起使用。",
        "apihelp-query+alldeletedrevisions-param-start": "枚举的起始时间戳。",
        "apihelp-query+allfileusages-param-prop": "要包含的信息束:\n;ids:添加使用中的页面的页面ID(不能与$1unique一起使用)。\n;title:添加文件的标题。",
        "apihelp-query+allfileusages-param-limit": "要返回的总计项目。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
-       "apihelp-query+allfileusages-example-unique": "列出唯一性的文件标题",
-       "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者",
-       "apihelp-query+allfileusages-example-generator": "获取包含这些文件的页面",
+       "apihelp-query+allfileusages-example-B": "列举文件标题,包含丢失的文件、它们来自的页面ID,以<kbd>B</kbd>开头。",
+       "apihelp-query+allfileusages-example-unique": "列出唯一文件标题。",
+       "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者。",
+       "apihelp-query+allfileusages-example-generator": "获取包含这些文件的页面。",
        "apihelp-query+allimages-description": "按顺序枚举所有图像。",
        "apihelp-query+allimages-param-sort": "要作为排序方式的属性。",
        "apihelp-query+allimages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
+       "apihelp-query+allpages-param-dir": "罗列所采用的方向。",
        "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+redirects-param-limit": "返回多少重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Project:首页]]的重定向列表",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[首页]]的信息",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "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-rsd-example-simple": "导出RSD架构",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "工作于所有已监视页面。",
        "apihelp-setnotificationtimestamp-example-all": "重置整个监视列表的通知状态。",
+       "apihelp-setnotificationtimestamp-example-page": "重置用于<kbd>Main page</kbd>的通知状态。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
+       "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
+       "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。",
+       "apihelp-tag-param-logid": "要添加或移除标签的一个或更多的日志记录ID。",
+       "apihelp-tag-param-add": "要添加的标签。只有手动定义的标签可以添加。",
+       "apihelp-tag-param-remove": "要移除的标签。只有手动定义或完全不明确的标签可以被移除。",
+       "apihelp-tag-param-reason": "更改原因。",
+       "apihelp-tag-example-rev": "从修订ID 123添加<kbd>vandalism</kbd>标签,而不指定原因",
+       "apihelp-tag-example-log": "从日志记录ID 123移除<kbd>spam</kbd>标签,原因为<kbd>Wrongly applied</kbd>",
        "apihelp-tokens-param-type": "要请求的令牌类型。",
        "apihelp-unblock-description": "解封一位用户。",
        "apihelp-unblock-param-id": "解封时需要的封禁ID(通过<kbd>list=blocks</kbd>获得)。不能与<var>$1user</var>一起使用。",
        "apihelp-dump-description": "输出数据为PHP的<code>var_dump()</code>格式。",
        "apihelp-dumpfm-description": "输出数据为PHP的<code>var_dump()</code>格式(HTML优质打印效果)。",
        "apihelp-json-description": "输出数据为JSON格式。",
+       "apihelp-json-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "apihelp-jsonfm-description": "输出数据为JSON格式(HTML优质打印效果)。",
        "apihelp-none-description": "不输出任何东西。",
        "apihelp-php-description": "输出数据为序列化PHP格式。",
+       "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,带调试元素(HTML优质打印效果)。",
        "apihelp-txt-description": "输出数据为PHP的<code>print_r()</code>格式。",
        "api-help-flag-writerights": "此模块需要写入权限。",
        "api-help-flag-mustbeposted": "此模块只允许POST请求。",
        "api-help-flag-generator": "此模块可作为发生器使用。",
+       "api-help-source": "来源:$1",
+       "api-help-source-unknown": "来源:<span class=\"apihelp-unknown\">未知</span>",
+       "api-help-license": "许可协议:[[$1|$2]]",
+       "api-help-license-noname": "许可协议:[[$1|参见链接]]",
+       "api-help-license-unknown": "许可协议:<span class=\"apihelp-unknown\">未知</span>",
        "api-help-parameters": "{{PLURAL:$1|参数}}:",
        "api-help-param-deprecated": "不推荐使用。",
        "api-help-param-required": "这个参数是必须的。",
+       "api-help-datatypes-header": "数据类型",
+       "api-help-param-type-limit": "类型:整数或<kbd>max</kbd>",
+       "api-help-param-type-integer": "类型:{{PLURAL:$1|1=整数|2=整数列表}}",
+       "api-help-param-type-boolean": "类型:布尔值([[Special:ApiHelp/main#main/datatypes|详细信息]])",
+       "api-help-param-type-timestamp": "类型:{{PLURAL:$1|1=时间戳|2=时间戳列表}}([[Special:ApiHelp/main#main/datatypes|允许格式]])",
+       "api-help-param-type-user": "类型:{{PLURAL:$1|1=用户名|2=用户名列表}}",
        "api-help-param-list": "{{PLURAL:$1|1=一个值|2=值(以<kbd>{{!}}</kbd>分隔)}}:$2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=必须为空|可以为空,或$2}}",
        "api-help-param-limit": "不允许超过$1。",
diff --git a/includes/cache/MessageBlobStore.php b/includes/cache/MessageBlobStore.php
new file mode 100644 (file)
index 0000000..011cae6
--- /dev/null
@@ -0,0 +1,390 @@
+<?php
+/**
+ * Resource message blobs storage used by the resource loader.
+ *
+ * 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 Roan Kattouw
+ * @author Trevor Parscal
+ */
+
+/**
+ * This class provides access to the resource message blobs storage used by
+ * the ResourceLoader.
+ *
+ * A message blob is a JSON object containing the interface messages for a
+ * certain resource in a certain language. These message blobs are cached
+ * in the msg_resource table and automatically invalidated when one of their
+ * constituent messages or the resource itself is changed.
+ */
+class MessageBlobStore {
+       /**
+        * Get the singleton instance
+        *
+        * @since 1.24
+        * @deprecated since 1.25
+        * @return MessageBlobStore
+        */
+       public static function getInstance() {
+               wfDeprecated( __METHOD__, '1.25' );
+               return new self;
+       }
+
+       /**
+        * Get the message blobs for a set of modules
+        *
+        * @param ResourceLoader $resourceLoader
+        * @param array $modules Array of module objects keyed by module name
+        * @param string $lang Language code
+        * @return array An array mapping module names to message blobs
+        */
+       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+               if ( !count( $modules ) ) {
+                       return array();
+               }
+               // Try getting from the DB first
+               $blobs = $this->getFromDB( $resourceLoader, array_keys( $modules ), $lang );
+
+               // Generate blobs for any missing modules and store them in the DB
+               $missing = array_diff( array_keys( $modules ), array_keys( $blobs ) );
+               foreach ( $missing as $name ) {
+                       $blob = $this->insertMessageBlob( $name, $modules[$name], $lang );
+                       if ( $blob ) {
+                               $blobs[$name] = $blob;
+                       }
+               }
+
+               return $blobs;
+       }
+
+       /**
+        * Generate and insert a new message blob. If the blob was already
+        * present, it is not regenerated; instead, the preexisting blob
+        * is fetched and returned.
+        *
+        * @param string $name Module name
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return mixed Message blob or false if the module has no messages
+        */
+       public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
+               $blob = $this->generateMessageBlob( $module, $lang );
+
+               if ( !$blob ) {
+                       return false;
+               }
+
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $success = $dbw->insert( 'msg_resource', array(
+                                       'mr_lang' => $lang,
+                                       'mr_resource' => $name,
+                                       'mr_blob' => $blob,
+                                       'mr_timestamp' => $dbw->timestamp()
+                               ),
+                               __METHOD__,
+                               array( 'IGNORE' )
+                       );
+
+                       if ( $success ) {
+                               if ( $dbw->affectedRows() == 0 ) {
+                                       // Blob was already present, fetch it
+                                       $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
+                                                       'mr_resource' => $name,
+                                                       'mr_lang' => $lang,
+                                               ),
+                                               __METHOD__
+                                       );
+                               } else {
+                                       // Update msg_resource_links
+                                       $rows = array();
+
+                                       foreach ( $module->getMessages() as $key ) {
+                                               $rows[] = array(
+                                                       'mrl_resource' => $name,
+                                                       'mrl_message' => $key
+                                               );
+                                       }
+                                       $dbw->insert( 'msg_resource_links', $rows,
+                                               __METHOD__, array( 'IGNORE' )
+                                       );
+                               }
+                       }
+               } catch ( DBError $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
+               return $blob;
+       }
+
+       /**
+        * Update the message blob for a given module in a given language
+        *
+        * @param string $name Module name
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return string Regenerated message blob, or null if there was no blob for
+        *   the given module/language pair.
+        */
+       public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $row = $dbw->selectRow( 'msg_resource', 'mr_blob',
+                       array( 'mr_resource' => $name, 'mr_lang' => $lang ),
+                       __METHOD__
+               );
+               if ( !$row ) {
+                       return null;
+               }
+
+               // Save the old and new blobs for later
+               $oldBlob = $row->mr_blob;
+               $newBlob = $this->generateMessageBlob( $module, $lang );
+
+               try {
+                       $newRow = array(
+                               'mr_resource' => $name,
+                               'mr_lang' => $lang,
+                               'mr_blob' => $newBlob,
+                               'mr_timestamp' => $dbw->timestamp()
+                       );
+
+                       $dbw->replace( 'msg_resource',
+                               array( array( 'mr_resource', 'mr_lang' ) ),
+                               $newRow, __METHOD__
+                       );
+
+                       // Figure out which messages were added and removed
+                       $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
+                       $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
+                       $added = array_diff( $newMessages, $oldMessages );
+                       $removed = array_diff( $oldMessages, $newMessages );
+
+                       // Delete removed messages, insert added ones
+                       if ( $removed ) {
+                               $dbw->delete( 'msg_resource_links', array(
+                                               'mrl_resource' => $name,
+                                               'mrl_message' => $removed
+                                       ), __METHOD__
+                               );
+                       }
+
+                       $newLinksRows = array();
+
+                       foreach ( $added as $message ) {
+                               $newLinksRows[] = array(
+                                       'mrl_resource' => $name,
+                                       'mrl_message' => $message
+                               );
+                       }
+
+                       if ( $newLinksRows ) {
+                               $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
+                                       array( 'IGNORE' ) // just in case
+                               );
+                       }
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
+               return $newBlob;
+       }
+
+       /**
+        * Update a single message in all message blobs it occurs in.
+        *
+        * @param string $key Message key
+        */
+       public function updateMessage( $key ) {
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+
+                       // Keep running until the updates queue is empty.
+                       // Due to update conflicts, the queue might not be emptied
+                       // in one iteration.
+                       $updates = null;
+                       do {
+                               $updates = $this->getUpdatesForMessage( $key, $updates );
+
+                               foreach ( $updates as $k => $update ) {
+                                       // Update the row on the condition that it
+                                       // didn't change since we fetched it by putting
+                                       // the timestamp in the WHERE clause.
+                                       $success = $dbw->update( 'msg_resource',
+                                               array(
+                                                       'mr_blob' => $update['newBlob'],
+                                                       'mr_timestamp' => $dbw->timestamp() ),
+                                               array(
+                                                       'mr_resource' => $update['resource'],
+                                                       'mr_lang' => $update['lang'],
+                                                       'mr_timestamp' => $update['timestamp'] ),
+                                               __METHOD__
+                                       );
+
+                                       // Only requeue conflicted updates.
+                                       // If update() returned false, don't retry, for
+                                       // fear of getting into an infinite loop
+                                       if ( !( $success && $dbw->affectedRows() == 0 ) ) {
+                                               // Not conflicted
+                                               unset( $updates[$k] );
+                                       }
+                               }
+                       } while ( count( $updates ) );
+
+                       // No need to update msg_resource_links because we didn't add
+                       // or remove any messages, we just changed their contents.
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
+       }
+
+       public function clear() {
+               // TODO: Give this some more thought
+               try {
+                       // Not using TRUNCATE, because that needs extra permissions,
+                       // which maybe not granted to the database user.
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->delete( 'msg_resource', '*', __METHOD__ );
+                       $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
+               } catch ( Exception $e ) {
+                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               }
+       }
+
+       /**
+        * Create an update queue for updateMessage()
+        *
+        * @param string $key Message key
+        * @param array $prevUpdates Updates queue to refresh or null to build a fresh update queue
+        * @return array Updates queue
+        */
+       private function getUpdatesForMessage( $key, $prevUpdates = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( is_null( $prevUpdates ) ) {
+                       // Fetch all blobs referencing $key
+                       $res = $dbw->select(
+                               array( 'msg_resource', 'msg_resource_links' ),
+                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
+                               array( 'mrl_message' => $key, 'mr_resource=mrl_resource' ),
+                               __METHOD__
+                       );
+               } else {
+                       // Refetch the blobs referenced by $prevUpdates
+
+                       // Reorganize the (resource, lang) pairs in the format
+                       // expected by makeWhereFrom2d()
+                       $twoD = array();
+
+                       foreach ( $prevUpdates as $update ) {
+                               $twoD[$update['resource']][$update['lang']] = true;
+                       }
+
+                       $res = $dbw->select( 'msg_resource',
+                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
+                               $dbw->makeWhereFrom2d( $twoD, 'mr_resource', 'mr_lang' ),
+                               __METHOD__
+                       );
+               }
+
+               // Build the new updates queue
+               $updates = array();
+
+               foreach ( $res as $row ) {
+                       $updates[] = array(
+                               'resource' => $row->mr_resource,
+                               'lang' => $row->mr_lang,
+                               'timestamp' => $row->mr_timestamp,
+                               'newBlob' => $this->reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
+                       );
+               }
+
+               return $updates;
+       }
+
+       /**
+        * Reencode a message blob with the updated value for a message
+        *
+        * @param string $blob Message blob (JSON object)
+        * @param string $key Message key
+        * @param string $lang Language code
+        * @return string Message blob with $key replaced with its new value
+        */
+       private function reencodeBlob( $blob, $key, $lang ) {
+               $decoded = FormatJson::decode( $blob, true );
+               $decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
+
+               return FormatJson::encode( (object)$decoded );
+       }
+
+       /**
+        * Get the message blobs for a set of modules from the database.
+        * Modules whose blobs are not in the database are silently dropped.
+        *
+        * @param ResourceLoader $resourceLoader
+        * @param array $modules Array of module names
+        * @param string $lang Language code
+        * @throws MWException
+        * @return array Array mapping module names to blobs
+        */
+       private function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
+               $config = $resourceLoader->getConfig();
+               $retval = array();
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'msg_resource',
+                       array( 'mr_blob', 'mr_resource', 'mr_timestamp' ),
+                       array( 'mr_resource' => $modules, 'mr_lang' => $lang ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $module = $resourceLoader->getModule( $row->mr_resource );
+                       if ( !$module ) {
+                               // This shouldn't be possible
+                               throw new MWException( __METHOD__ . ' passed an invalid module name' );
+                       }
+
+                       // Update the module's blobs if the set of messages changed or if the blob is
+                       // older than the CacheEpoch setting
+                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
+                       $values = array_values( array_unique( $module->getMessages() ) );
+                       if ( $keys !== $values
+                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $config->get( 'CacheEpoch' )
+                       ) {
+                               $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
+                       } else {
+                               $retval[$row->mr_resource] = $row->mr_blob;
+                       }
+               }
+
+               return $retval;
+       }
+
+       /**
+        * Generate the message blob for a given module in a given language.
+        *
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return string JSON object
+        */
+       private function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
+               $messages = array();
+
+               foreach ( $module->getMessages() as $key ) {
+                       $messages[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
+               }
+
+               return FormatJson::encode( (object)$messages );
+       }
+}
index 82919c7..a55e25a 100644 (file)
@@ -1049,7 +1049,7 @@ class MessageCache {
                if ( !$title ) {
                        # It's not uncommon having a null $wgTitle in scripts. See r80898
                        # Create a ghost title in such case
-                       $title = Title::newFromText( 'Dwimmerlaik' );
+                       $title = Title::makeTitle( NS_SPECIAL, 'Badtitle/title not set in ' . __METHOD__ );
                }
 
                $this->mInParser = true;
diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php
new file mode 100644 (file)
index 0000000..43f957c
--- /dev/null
@@ -0,0 +1,1222 @@
+<?php
+/**
+ * Recent changes tagging.
+ *
+ * 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 Change tagging
+ */
+
+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
+        *
+        * @param string $tags Comma-separated list of tags
+        * @param string $page A label for the type of action which is being displayed,
+        *   for example: 'history', 'contributions' or 'newpages'
+        * @return array Array with two items: (html, classes)
+        *   - html: String: HTML for displaying the tags (empty string when param $tags is empty)
+        *   - classes: Array of strings: CSS classes used in the generated html, one class for each tag
+        */
+       public static function formatSummaryRow( $tags, $page ) {
+               global $wgLang;
+
+               if ( !$tags ) {
+                       return array( '', array() );
+               }
+
+               $classes = array();
+
+               $tags = explode( ',', $tags );
+               $displayTags = array();
+               foreach ( $tags as $tag ) {
+                       if ( !$tag ) {
+                               continue;
+                       }
+                       $description = self::tagDescription( $tag );
+                       if ( $description === false ) {
+                               continue;
+                       }
+                       $displayTags[] = Xml::tags(
+                               'span',
+                               array( 'class' => 'mw-tag-marker ' .
+                                                               Sanitizer::escapeClass( "mw-tag-marker-$tag" ) ),
+                               $description
+                       );
+                       $classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
+               }
+
+               if ( !$displayTags ) {
+                       return array( '', array() );
+               }
+
+               $markers = wfMessage( 'tag-list-wrapper' )
+                       ->numParams( count( $displayTags ) )
+                       ->rawParams( $wgLang->commaList( $displayTags ) )
+                       ->parse();
+               $markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
+
+               return array( $markers, $classes );
+       }
+
+       /**
+        * Get a short description for a tag.
+        *
+        * Checks if message key "mediawiki:tag-$tag" exists. If it does not,
+        * returns the HTML-escaped tag name. Uses the message if the message
+        * exists, provided it is not disabled. If the message is disabled,
+        * we consider the tag hidden, and return false.
+        *
+        * @param string $tag Tag
+        * @return string|bool Tag description or false if tag is to be hidden.
+        * @since 1.25 Returns false if tag is to be hidden.
+        */
+       public static function tagDescription( $tag ) {
+               $msg = wfMessage( "tag-$tag" );
+               if ( !$msg->exists() ) {
+                       // No such message, so return the HTML-escaped tag name.
+                       return htmlspecialchars( $tag );
+               }
+               if ( $msg->isDisabled() ) {
+                       // The message exists but is disabled, hide the tag.
+                       return false;
+               }
+
+               // Message exists and isn't disabled, use it.
+               return $msg->parse();
+       }
+
+       /**
+        * Add tags to a change given its rc_id, rev_id and/or log_id
+        *
+        * @param string|array $tags Tags to add to the change
+        * @param int|null $rc_id The rc_id of the change to add the tags to
+        * @param int|null $rev_id The rev_id of the change to add the tags to
+        * @param int|null $log_id The log_id of the change to add the tags to
+        * @param string $params Params to put in the ct_params field of table 'change_tag'
+        *
+        * @throws MWException
+        * @return bool False if no changes are made, otherwise true
+        */
+       public static function addTags( $tags, $rc_id = null, $rev_id = null,
+               $log_id = null, $params = null
+       ) {
+               $result = self::updateTags( $tags, null, $rc_id, $rev_id, $log_id, $params );
+               return (bool)$result[0];
+       }
+
+       /**
+        * Add and remove tags to/from a change given its rc_id, rev_id and/or log_id,
+        * without verifying that the tags exist or are valid. If a tag is present in
+        * both $tagsToAdd and $tagsToRemove, it will be removed.
+        *
+        * This function should only be used by extensions to manipulate tags they
+        * have registered using the ListDefinedTags hook. When dealing with user
+        * input, call updateTagsWithChecks() instead.
+        *
+        * @param string|array|null $tagsToAdd Tags to add to the change
+        * @param string|array|null $tagsToRemove Tags to remove from the change
+        * @param int|null &$rc_id The rc_id of the change to add the tags to.
+        * Pass a variable whose value is null if the rc_id is not relevant or unknown.
+        * @param int|null &$rev_id The rev_id of the change to add the tags to.
+        * Pass a variable whose value is null if the rev_id is not relevant or unknown.
+        * @param int|null &$log_id The log_id of the change to add the tags to.
+        * Pass a variable whose value is null if the log_id is not relevant or unknown.
+        * @param string $params Params to put in the ct_params field of table
+        * 'change_tag' when adding tags
+        *
+        * @throws MWException When $rc_id, $rev_id and $log_id are all null
+        * @return array Index 0 is an array of tags actually added, index 1 is an
+        * array of tags actually removed, index 2 is an array of tags present on the
+        * revision or log entry before any changes were made
+        *
+        * @since 1.25
+        */
+       public static function updateTags( $tagsToAdd, $tagsToRemove, &$rc_id = null,
+               &$rev_id = null, &$log_id = null, $params = null ) {
+
+               $tagsToAdd = array_filter( (array)$tagsToAdd ); // Make sure we're submitting all tags...
+               $tagsToRemove = array_filter( (array)$tagsToRemove );
+
+               if ( !$rc_id && !$rev_id && !$log_id ) {
+                       throw new MWException( 'At least one of: RCID, revision ID, and log ID MUST be ' .
+                               'specified when adding or removing a tag from a change!' );
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Might as well look for rcids and so on.
+               if ( !$rc_id ) {
+                       // Info might be out of date, somewhat fractionally, on slave.
+                       if ( $log_id ) {
+                               $rc_id = $dbw->selectField(
+                                       'recentchanges',
+                                       'rc_id',
+                                       array( 'rc_logid' => $log_id ),
+                                       __METHOD__
+                               );
+                       } elseif ( $rev_id ) {
+                               $rc_id = $dbw->selectField(
+                                       'recentchanges',
+                                       'rc_id',
+                                       array( 'rc_this_oldid' => $rev_id ),
+                                       __METHOD__
+                               );
+                       }
+               } elseif ( !$log_id && !$rev_id ) {
+                       // Info might be out of date, somewhat fractionally, on slave.
+                       $log_id = $dbw->selectField(
+                               'recentchanges',
+                               'rc_logid',
+                               array( 'rc_id' => $rc_id ),
+                               __METHOD__
+                       );
+                       $rev_id = $dbw->selectField(
+                               'recentchanges',
+                               'rc_this_oldid',
+                               array( 'rc_id' => $rc_id ),
+                               __METHOD__
+                       );
+               }
+
+               // update the tag_summary row
+               $prevTags = array();
+               if ( !self::updateTagSummaryRow( $tagsToAdd, $tagsToRemove, $rc_id, $rev_id,
+                       $log_id, $prevTags ) ) {
+
+                       // nothing to do
+                       return array( array(), array(), $prevTags );
+               }
+
+               // insert a row into change_tag for each new tag
+               if ( count( $tagsToAdd ) ) {
+                       $tagsRows = array();
+                       foreach ( $tagsToAdd as $tag ) {
+                               // Filter so we don't insert NULLs as zero accidentally.
+                               // Keep in mind that $rc_id === null means "I don't care/know about the
+                               // rc_id, just delete $tag on this revision/log entry". It doesn't
+                               // mean "only delete tags on this revision/log WHERE rc_id IS NULL".
+                               $tagsRows[] = array_filter(
+                                       array(
+                                               'ct_tag' => $tag,
+                                               'ct_rc_id' => $rc_id,
+                                               'ct_log_id' => $log_id,
+                                               'ct_rev_id' => $rev_id,
+                                               'ct_params' => $params
+                                       )
+                               );
+                       }
+
+                       $dbw->insert( 'change_tag', $tagsRows, __METHOD__, array( 'IGNORE' ) );
+               }
+
+               // delete from change_tag
+               if ( count( $tagsToRemove ) ) {
+                       foreach ( $tagsToRemove as $tag ) {
+                               $conds = array_filter(
+                                       array(
+                                               'ct_tag' => $tag,
+                                               'ct_rc_id' => $rc_id,
+                                               'ct_log_id' => $log_id,
+                                               'ct_rev_id' => $rev_id
+                                       )
+                               );
+                               $dbw->delete( 'change_tag', $conds, __METHOD__ );
+                       }
+               }
+
+               self::purgeTagUsageCache();
+               return array( $tagsToAdd, $tagsToRemove, $prevTags );
+       }
+
+       /**
+        * Adds or removes a given set of tags to/from the relevant row of the
+        * tag_summary table. Modifies the tagsToAdd and tagsToRemove arrays to
+        * reflect the tags that were actually added and/or removed.
+        *
+        * @param array &$tagsToAdd
+        * @param array &$tagsToRemove If a tag is present in both $tagsToAdd and
+        * $tagsToRemove, it will be removed
+        * @param int|null $rc_id Null if not known or not applicable
+        * @param int|null $rev_id Null if not known or not applicable
+        * @param int|null $log_id Null if not known or not applicable
+        * @param array &$prevTags Optionally outputs a list of the tags that were
+        * in the tag_summary row to begin with
+        * @return bool True if any modifications were made, otherwise false
+        * @since 1.25
+        */
+       protected static function updateTagSummaryRow( &$tagsToAdd, &$tagsToRemove,
+               $rc_id, $rev_id, $log_id, &$prevTags = array() ) {
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $tsConds = array_filter( array(
+                       'ts_rc_id' => $rc_id,
+                       'ts_rev_id' => $rev_id,
+                       'ts_log_id' => $log_id
+               ) );
+
+               // Can't both add and remove a tag at the same time...
+               $tagsToAdd = array_diff( $tagsToAdd, $tagsToRemove );
+
+               // Update the summary row.
+               // $prevTags can be out of date on slaves, especially when addTags is called consecutively,
+               // causing loss of tags added recently in tag_summary table.
+               $prevTags = $dbw->selectField( 'tag_summary', 'ts_tags', $tsConds, __METHOD__ );
+               $prevTags = $prevTags ? $prevTags : '';
+               $prevTags = array_filter( explode( ',', $prevTags ) );
+
+               // add tags
+               $tagsToAdd = array_values( array_diff( $tagsToAdd, $prevTags ) );
+               $newTags = array_unique( array_merge( $prevTags, $tagsToAdd ) );
+
+               // remove tags
+               $tagsToRemove = array_values( array_intersect( $tagsToRemove, $newTags ) );
+               $newTags = array_values( array_diff( $newTags, $tagsToRemove ) );
+
+               sort( $prevTags );
+               sort( $newTags );
+               if ( $prevTags == $newTags ) {
+                       // No change.
+                       return false;
+               }
+
+               if ( !$newTags ) {
+                       // no tags left, so delete the row altogether
+                       $dbw->delete( 'tag_summary', $tsConds, __METHOD__ );
+               } else {
+                       $dbw->replace( 'tag_summary',
+                               array( 'ts_rev_id', 'ts_rc_id', 'ts_log_id' ),
+                               array_filter( array_merge( $tsConds, array( 'ts_tags' => implode( ',', $newTags ) ) ) ),
+                               __METHOD__
+                       );
+               }
+
+               return true;
+       }
+
+       /**
+        * Helper function to generate a fatal status with a 'not-allowed' type error.
+        *
+        * @param string $msgOne Message key to use in the case of one tag
+        * @param string $msgMulti Message key to use in the case of more than one tag
+        * @param array $tags Restricted tags (passed as $1 into the message, count of
+        * $tags passed as $2)
+        * @return Status
+        * @since 1.25
+        */
+       protected static function restrictedTagError( $msgOne, $msgMulti, $tags ) {
+               $lang = RequestContext::getMain()->getLanguage();
+               $count = count( $tags );
+               return Status::newFatal( ( $count > 1 ) ? $msgMulti : $msgOne,
+                       $lang->commaList( $tags ), $count );
+       }
+
+       /**
+        * Is it OK to allow the user to apply all the specified tags at the same time
+        * as they edit/make the change?
+        *
+        * @param array $tags Tags that you are interested in applying
+        * @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 canAddTagsAccompanyingChange( array $tags,
+               User $user = null ) {
+
+               if ( !is_null( $user ) && !$user->isAllowed( 'applychangetags' ) ) {
+                       return Status::newFatal( 'tags-apply-no-permission' );
+               }
+
+               // to be applied, a tag has to be explicitly defined
+               // @todo Allow extensions to define tags that can be applied by users...
+               $allowedTags = self::listExplicitlyDefinedTags();
+               $disallowedTags = array_diff( $tags, $allowedTags );
+               if ( $disallowedTags ) {
+                       return self::restrictedTagError( 'tags-apply-not-allowed-one',
+                               'tags-apply-not-allowed-multi', $disallowedTags );
+               }
+
+               return Status::newGood();
+       }
+
+       /**
+        * Adds tags to a given change, checking whether it is allowed first, but
+        * without adding a log entry. Useful for cases where the tag is being added
+        * along with the action that generated the change (e.g. tagging an edit as
+        * it is being made).
+        *
+        * Extensions should not use this function, unless directly handling a user
+        * request to add a particular tag. Normally, extensions should call
+        * ChangeTags::updateTags() instead.
+        *
+        * @param array $tags Tags to apply
+        * @param int|null $rc_id The rc_id of the change to add the tags to
+        * @param int|null $rev_id The rev_id of the change to add the tags to
+        * @param int|null $log_id The log_id of the change to add the tags to
+        * @param string $params Params to put in the ct_params field of table
+        * 'change_tag' when adding tags
+        * @param User $user Who to give credit for the action
+        * @return Status
+        * @since 1.25
+        */
+       public static function addTagsAccompanyingChangeWithChecks( array $tags,
+               $rc_id, $rev_id, $log_id, $params, User $user ) {
+
+               // are we allowed to do this?
+               $result = self::canAddTagsAccompanyingChange( $tags, $user );
+               if ( !$result->isOK() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // do it!
+               self::addTags( $tagsToAdd, $rc_id, $rev_id, $log_id, $params );
+
+               return Status::newGood( true );
+       }
+
+       /**
+        * Is it OK to allow the user to adds and remove the given tags tags to/from a
+        * change?
+        *
+        * @param array $tagsToAdd Tags that you are interested in adding
+        * @param array $tagsToRemove Tags that you are interested in removing
+        * @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 canUpdateTags( array $tagsToAdd, array $tagsToRemove,
+               User $user = null ) {
+
+               if ( !is_null( $user ) && !$user->isAllowed( 'changetags' ) ) {
+                       return Status::newFatal( 'tags-update-no-permission' );
+               }
+
+               // to be added, a tag has to be explicitly defined
+               // @todo Allow extensions to define tags that can be applied by users...
+               $explicitlyDefinedTags = self::listExplicitlyDefinedTags();
+               $diff = array_diff( $tagsToAdd, $explicitlyDefinedTags );
+               if ( $diff ) {
+                       return self::restrictedTagError( 'tags-update-add-not-allowed-one',
+                               'tags-update-add-not-allowed-multi', $diff );
+               }
+
+               // to be removed, a tag has to be either explicitly defined or not defined
+               // at all
+               $definedTags = self::listDefinedTags();
+               $diff = array_diff( $tagsToRemove, $explicitlyDefinedTags );
+               if ( $diff ) {
+                       $intersect = array_intersect( $diff, $definedTags );
+                       if ( $intersect ) {
+                               return self::restrictedTagError( 'tags-update-remove-not-allowed-one',
+                                       'tags-update-remove-not-allowed-multi', $intersect );
+                       }
+               }
+
+               return Status::newGood();
+       }
+
+       /**
+        * Adds and/or removes tags to/from a given change, checking whether it is
+        * allowed first, and adding a log entry afterwards.
+        *
+        * Includes a call to ChangeTag::canUpdateTags(), so your code doesn't need
+        * to do that. However, it doesn't check whether the *_id parameters are a
+        * valid combination. That is up to you to enforce. See ApiTag::execute() for
+        * an example.
+        *
+        * @param array|null $tagsToAdd If none, pass array() or null
+        * @param array|null $tagsToRemove If none, pass array() or null
+        * @param int|null $rc_id The rc_id of the change to add the tags to
+        * @param int|null $rev_id The rev_id of the change to add the tags to
+        * @param int|null $log_id The log_id of the change to add the tags to
+        * @param string $params Params to put in the ct_params field of table
+        * 'change_tag' when adding tags
+        * @param string $reason Comment for the log
+        * @param User $user Who to give credit for the action
+        * @return Status If successful, the value of this Status object will be an
+        * object (stdClass) with the following fields:
+        *  - logId: the ID of the added log entry, or null if no log entry was added
+        *    (i.e. no operation was performed)
+        *  - addedTags: an array containing the tags that were actually added
+        *  - removedTags: an array containing the tags that were actually removed
+        * @since 1.25
+        */
+       public static function updateTagsWithChecks( $tagsToAdd, $tagsToRemove,
+               $rc_id, $rev_id, $log_id, $params, $reason, User $user ) {
+
+               if ( is_null( $tagsToAdd ) ) {
+                       $tagsToAdd = array();
+               }
+               if ( is_null( $tagsToRemove ) ) {
+                       $tagsToRemove = array();
+               }
+               if ( !$tagsToAdd && !$tagsToRemove ) {
+                       // no-op, don't bother
+                       return Status::newGood( (object)array(
+                               'logId' => null,
+                               'addedTags' => array(),
+                               'removedTags' => array(),
+                       ) );
+               }
+
+               // are we allowed to do this?
+               $result = self::canUpdateTags( $tagsToAdd, $tagsToRemove, $user );
+               if ( !$result->isOK() ) {
+                       $result->value = null;
+                       return $result;
+               }
+
+               // basic rate limiting
+               if ( $user->pingLimiter( 'changetag' ) ) {
+                       return Status::newFatal( 'actionthrottledtext' );
+               }
+
+               // do it!
+               list( $tagsAdded, $tagsRemoved, $initialTags ) = self::updateTags( $tagsToAdd,
+                       $tagsToRemove, $rc_id, $rev_id, $log_id, $params );
+               if ( !$tagsAdded && !$tagsRemoved ) {
+                       // no-op, don't log it
+                       return Status::newGood( (object)array(
+                               'logId' => null,
+                               'addedTags' => array(),
+                               'removedTags' => array(),
+                       ) );
+               }
+
+               // log it
+               $logEntry = new ManualLogEntry( 'tag', 'update' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setComment( $reason );
+
+               // find the appropriate target page
+               if ( $rev_id ) {
+                       $rev = Revision::newFromId( $rev_id );
+                       if ( $rev ) {
+                               $title = $rev->getTitle();
+                               $logEntry->setTarget( $rev->getTitle() );
+                       }
+               } elseif ( $log_id ) {
+                       // This function is from revision deletion logic and has nothing to do with
+                       // change tags, but it appears to be the only other place in core where we
+                       // perform logged actions on log items.
+                       $logEntry->setTarget( RevDelLogList::suggestTarget( 0, array( $log_id ) ) );
+               }
+
+               if ( !$logEntry->getTarget() ) {
+                       // target is required, so we have to set something
+                       $logEntry->setTarget( SpecialPage::getTitleFor( 'Tags' ) );
+               }
+
+               $logParams = array(
+                       '4::revid' => $rev_id,
+                       '5::logid' => $log_id,
+                       '6:list:tagsAdded' => $tagsAdded,
+                       '7:number:tagsAddedCount' => count( $tagsAdded ),
+                       '8:list:tagsRemoved' => $tagsRemoved,
+                       '9:number:tagsRemovedCount' => count( $tagsRemoved ),
+                       'initialTags' => $initialTags,
+               );
+               $logEntry->setParameters( $logParams );
+               $logEntry->setRelations( array( 'Tag' => array_merge( $tagsAdded, $tagsRemoved ) ) );
+
+               $dbw = wfGetDB( DB_MASTER );
+               $logId = $logEntry->insert( $dbw );
+               // Only send this to UDP, not RC, similar to patrol events
+               $logEntry->publish( $logId, 'udp' );
+
+               return Status::newGood( (object)array(
+                       'logId' => $logId,
+                       'addedTags' => $tagsAdded,
+                       'removedTags' => $tagsRemoved,
+               ) );
+       }
+
+       /**
+        * Applies all tags-related changes to a query.
+        * Handles selecting tags, and filtering.
+        * Needs $tables to be set up properly, so we can figure out which join conditions to use.
+        *
+        * @param string|array $tables Table names, see DatabaseBase::select
+        * @param string|array $fields Fields used in query, see DatabaseBase::select
+        * @param string|array $conds Conditions used in query, see DatabaseBase::select
+        * @param array $join_conds Join conditions, see DatabaseBase::select
+        * @param array $options Options, see Database::select
+        * @param bool|string $filter_tag Tag to select on
+        *
+        * @throws MWException When unable to determine appropriate JOIN condition for tagging
+        */
+       public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
+                                                                               &$join_conds, &$options, $filter_tag = false ) {
+               global $wgRequest, $wgUseTagFilter;
+
+               if ( $filter_tag === false ) {
+                       $filter_tag = $wgRequest->getVal( 'tagfilter' );
+               }
+
+               // Figure out which conditions can be done.
+               if ( in_array( 'recentchanges', $tables ) ) {
+                       $join_cond = 'ct_rc_id=rc_id';
+               } elseif ( in_array( 'logging', $tables ) ) {
+                       $join_cond = 'ct_log_id=log_id';
+               } elseif ( in_array( 'revision', $tables ) ) {
+                       $join_cond = 'ct_rev_id=rev_id';
+               } elseif ( in_array( 'archive', $tables ) ) {
+                       $join_cond = 'ct_rev_id=ar_rev_id';
+               } else {
+                       throw new MWException( 'Unable to determine appropriate JOIN condition for tagging.' );
+               }
+
+               $fields['ts_tags'] = wfGetDB( DB_SLAVE )->buildGroupConcatField(
+                       ',', 'change_tag', 'ct_tag', $join_cond
+               );
+
+               if ( $wgUseTagFilter && $filter_tag ) {
+                       // Somebody wants to filter on a tag.
+                       // Add an INNER JOIN on change_tag
+
+                       $tables[] = 'change_tag';
+                       $join_conds['change_tag'] = array( 'INNER JOIN', $join_cond );
+                       $conds['ct_tag'] = $filter_tag;
+               }
+       }
+
+       /**
+        * Build a text box to select a change tag
+        *
+        * @param string $selected Tag to select by default
+        * @param bool $fullForm
+        *        - if false, then it returns an array of (label, form).
+        *        - if true, it returns an entire form around the selector.
+        * @param Title $title Title object to send the form to.
+        *        Used when, and only when $fullForm is true.
+        * @return string|array
+        *        - if $fullForm is false: Array with
+        *        - if $fullForm is true: String, html fragment
+        */
+       public static function buildTagFilterSelector( $selected = '',
+               $fullForm = false, Title $title = null
+       ) {
+               global $wgUseTagFilter;
+
+               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
+                       return $fullForm ? '' : array();
+               }
+
+               $data = array(
+                       Html::rawElement(
+                               'label',
+                               array( 'for' => 'tagfilter' ),
+                               wfMessage( 'tag-filter' )->parse()
+                       ),
+                       Xml::input(
+                               'tagfilter',
+                               20,
+                               $selected,
+                               array( 'class' => 'mw-tagfilter-input mw-ui-input mw-ui-input-inline', 'id' => 'tagfilter' )
+                       )
+               );
+
+               if ( !$fullForm ) {
+                       return $data;
+               }
+
+               $html = implode( '&#160;', $data );
+               $html .= "\n" .
+                       Xml::element(
+                               'input',
+                               array( 'type' => 'submit', 'value' => wfMessage( 'tag-filter-submit' )->text() )
+                       );
+               $html .= "\n" . Html::hidden( 'title', $title->getPrefixedText() );
+               $html = Xml::tags(
+                       'form',
+                       array( 'action' => $title->getLocalURL(), 'class' => 'mw-tagfilter-form', 'method' => 'get' ),
+                       $html
+               );
+
+               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 logTagManagementAction( $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::logTagManagementAction( '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::logTagManagementAction( '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::logTagManagementAction( '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->startAtomic( __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 ) {
+                       // remove the tag from the relevant row of tag_summary
+                       $tagsToAdd = array();
+                       $tagsToRemove = array( $tag );
+                       self::updateTagSummaryRow( $tagsToAdd, $tagsToRemove, $row->ct_rc_id,
+                               $row->ct_rev_id, $row->ct_log_id );
+               }
+
+               // delete from change_tag
+               $dbw->delete( 'change_tag', array( 'ct_tag' => $tag ), __METHOD__ );
+
+               $dbw->endAtomic( __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::logTagManagementAction( '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.
+        * 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 listExplicitlyDefinedTags() {
+               // Caching...
+               global $wgMemc;
+               $key = wfMemcKey( 'valid-tags-db' );
+               $tags = $wgMemc->get( $key );
+               if ( $tags ) {
+                       return $tags;
+               }
+
+               $emptyTags = array();
+
+               // Some DB stuff
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'valid_tag', 'vt_tag', array(), __METHOD__ );
+               foreach ( $res as $row ) {
+                       $emptyTags[] = $row->vt_tag;
+               }
+
+               $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.
+               $wgMemc->set( $key, $emptyTags, 300 );
+               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, 'vslow' );
+               $res = $dbr->select(
+                       'change_tag',
+                       array( 'ct_tag', 'hitcount' => 'count(*)' ),
+                       array(),
+                       __METHOD__,
+                       array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
+               );
+
+               foreach ( $res as $row ) {
+                       $out[$row->ct_tag] = $row->hitcount;
+               }
+               foreach ( self::listDefinedTags() as $tag ) {
+                       if ( !isset( $out[$tag] ) ) {
+                               $out[$tag] = 0;
+                       }
+               }
+
+               // Cache for a very short time
+               $wgMemc->set( $key, $out, 300 );
+               return $out;
+       }
+}
diff --git a/includes/changetags/ChangeTagsList.php b/includes/changetags/ChangeTagsList.php
new file mode 100644 (file)
index 0000000..dd8bab9
--- /dev/null
@@ -0,0 +1,77 @@
+<?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 Change tagging
+ */
+
+/**
+ * Generic list for change tagging.
+ */
+abstract class ChangeTagsList extends RevisionListBase {
+       function __construct( IContextSource $context, Title $title, array $ids ) {
+               parent::__construct( $context, $title );
+               $this->ids = $ids;
+       }
+
+       /**
+        * Creates a ChangeTags*List of the requested type.
+        *
+        * @param string $typeName 'revision' or 'logentry'
+        * @param IContextSource $context
+        * @param Title $title
+        * @param array $ids
+        * @return ChangeTagsList An instance of the requested subclass
+        * @throws Exception If you give an unknown $typeName
+        */
+       public static function factory( $typeName, IContextSource $context,
+               Title $title, array $ids ) {
+
+               switch ( $typeName ) {
+                       case 'revision':
+                               $className = 'ChangeTagsRevisionList';
+                               break;
+                       case 'logentry':
+                               $className = 'ChangeTagsLogList';
+                               break;
+                       default:
+                               throw new Exception( "Class $className requested, but does not exist" );
+               }
+               return new $className( $context, $title, $ids );
+       }
+
+       /**
+        * Reload the list data from the master DB.
+        */
+       function reloadFromMaster() {
+               $dbw = wfGetDB( DB_MASTER );
+               $this->res = $this->doQuery( $dbw );
+       }
+
+       /**
+        * Add/remove change tags from all the items in the list.
+        *
+        * @param array $tagsToAdd
+        * @param array $tagsToRemove
+        * @param array $params
+        * @param string $reason
+        * @param User $user
+        * @return Status
+        */
+       abstract function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params,
+               $reason, $user );
+}
diff --git a/includes/changetags/ChangeTagsLogItem.php b/includes/changetags/ChangeTagsLogItem.php
new file mode 100644 (file)
index 0000000..565d159
--- /dev/null
@@ -0,0 +1,100 @@
+<?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 Change tagging
+ */
+
+/**
+ * Item class for a logging table row with its associated change tags.
+ * @todo Abstract out a base class for this and RevDelLogItem, similar to the
+ * RevisionItem class but specifically for log items.
+ * @since 1.25
+ */
+class ChangeTagsLogItem extends RevisionItemBase {
+       public function getIdField() {
+               return 'log_id';
+       }
+
+       public function getTimestampField() {
+               return 'log_timestamp';
+       }
+
+       public function getAuthorIdField() {
+               return 'log_user';
+       }
+
+       public function getAuthorNameField() {
+               return 'log_user_text';
+       }
+
+       public function canView() {
+               return LogEventsList::userCan( $this->row, Revision::DELETED_RESTRICTED, $this->list->getUser() );
+       }
+
+       public function canViewContent() {
+               return true; // none
+       }
+
+       /**
+        * @return string Comma-separated list of tags
+        */
+       public function getTags() {
+               return $this->row->ts_tags;
+       }
+
+       /**
+        * @return string A HTML <li> element representing this revision, showing
+        * change tags and everything
+        */
+       public function getHTML() {
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->row->log_timestamp, $this->list->getUser() ) );
+               $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
+               $formatter = LogFormatter::newFromRow( $this->row );
+               $formatter->setContext( $this->list->getContext() );
+               $formatter->setAudience( LogFormatter::FOR_THIS_USER );
+
+               // Log link for this page
+               $loglink = Linker::link(
+                       SpecialPage::getTitleFor( 'Log' ),
+                       $this->list->msg( 'log' )->escaped(),
+                       array(),
+                       array( 'page' => $title->getPrefixedText() )
+               );
+               $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
+               // User links and action text
+               $action = $formatter->getActionText();
+               // Comment
+               $comment = $this->list->getLanguage()->getDirMark() .
+                       $formatter->getComment();
+
+               if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
+                       $comment = '<span class="history-deleted">' . $comment . '</span>';
+               }
+
+               $content = "$loglink $date $action $comment";
+               $attribs = array();
+               $tags = $this->getTags();
+               if ( $tags ) {
+                       list( $tagSummary, $classes ) = ChangeTags::formatSummaryRow( $tags, 'edittags' );
+                       $content .= " $tagSummary";
+                       $attribs['class'] = implode( ' ', $classes );
+               }
+               return Xml::tags( 'li', $attribs, $content );
+       }
+}
diff --git a/includes/changetags/ChangeTagsLogList.php b/includes/changetags/ChangeTagsLogList.php
new file mode 100644 (file)
index 0000000..fe80695
--- /dev/null
@@ -0,0 +1,89 @@
+<?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 Change tagging
+ */
+
+/**
+ * Stores a list of taggable log entries.
+ * @since 1.25
+ */
+class ChangeTagsLogList extends ChangeTagsList {
+       public function getType() {
+               return 'logentry';
+       }
+
+       /**
+        * @param DatabaseBase $db
+        * @return mixed
+        */
+       public function doQuery( $db ) {
+               $ids = array_map( 'intval', $this->ids );
+               $queryInfo = DatabaseLogEntry::getSelectQueryData();
+               $queryInfo['conds'] += array( 'log_id' => $ids );
+               $queryInfo['options'] += array( 'ORDER BY' => 'log_id DESC' );
+               ChangeTags::modifyDisplayQuery(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $queryInfo['conds'],
+                       $queryInfo['join_conds'],
+                       $queryInfo['options']
+               );
+               return $db->select(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $queryInfo['conds'],
+                       __METHOD__,
+                       $queryInfo['options'],
+                       $queryInfo['join_conds']
+               );
+       }
+
+       public function newItem( $row ) {
+               return new ChangeTagsLogItem( $this, $row );
+       }
+
+       /**
+        * Add/remove change tags from all the log entries in the list.
+        *
+        * @param array $tagsToAdd
+        * @param array $tagsToRemove
+        * @param array $params
+        * @param string $reason
+        * @param User $user
+        * @return Status
+        */
+       public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params,
+               $reason, $user ) {
+
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $this->current();
+                       $status = ChangeTags::updateTagsWithChecks( $tagsToAdd, $tagsToRemove,
+                               null, null, $item->getId(), $params, $reason, $user );
+                       // Should only fail on second and subsequent times if the user trips
+                       // the rate limiter
+                       if ( !$status->isOK() ) {
+                               break;
+                       }
+               }
+
+               return $status;
+       }
+}
diff --git a/includes/changetags/ChangeTagsRevisionItem.php b/includes/changetags/ChangeTagsRevisionItem.php
new file mode 100644 (file)
index 0000000..e90a1b4
--- /dev/null
@@ -0,0 +1,58 @@
+<?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 Change tagging
+ */
+
+/**
+ * Item class for a live revision table row with its associated change tags.
+ * @since 1.25
+ */
+class ChangeTagsRevisionItem extends RevisionItem {
+       /**
+        * @return string Comma-separated list of tags
+        */
+       public function getTags() {
+               return $this->row->ts_tags;
+       }
+
+       /**
+        * @return string A HTML <li> element representing this revision, showing
+        * change tags and everything
+        */
+       public function getHTML() {
+               $difflink = $this->list->msg( 'parentheses' )
+                       ->rawParams( $this->getDiffLink() )->escaped();
+               $revlink = $this->getRevisionLink();
+               $userlink = Linker::revUserLink( $this->revision );
+               $comment = Linker::revComment( $this->revision );
+               if ( $this->isDeleted() ) {
+                       $revlink = "<span class=\"history-deleted\">$revlink</span>";
+               }
+
+               $content = "$difflink $revlink $userlink $comment";
+               $attribs = array();
+               $tags = $this->getTags();
+               if ( $tags ) {
+                       list( $tagSummary, $classes ) = ChangeTags::formatSummaryRow( $tags, 'edittags' );
+                       $content .= " $tagSummary";
+                       $attribs['class'] = implode( ' ', $classes );
+               }
+               return Xml::tags( 'li', $attribs, $content );
+       }
+}
diff --git a/includes/changetags/ChangeTagsRevisionList.php b/includes/changetags/ChangeTagsRevisionList.php
new file mode 100644 (file)
index 0000000..842d327
--- /dev/null
@@ -0,0 +1,99 @@
+<?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 Change tagging
+ */
+
+/**
+ * Stores a list of taggable revisions.
+ * @since 1.25
+ */
+class ChangeTagsRevisionList extends ChangeTagsList {
+       public function getType() {
+               return 'revision';
+       }
+
+       /**
+        * @param DatabaseBase $db
+        * @return mixed
+        */
+       public function doQuery( $db ) {
+               $ids = array_map( 'intval', $this->ids );
+               $queryInfo = array(
+                       'tables' => array( 'revision', 'user' ),
+                       'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
+                       'conds' => array(
+                               'rev_page' => $this->title->getArticleID(),
+                               'rev_id' => $ids,
+                       ),
+                       'options' => array( 'ORDER BY' => 'rev_id DESC' ),
+                       'join_conds' => array(
+                               'page' => Revision::pageJoinCond(),
+                               'user' => Revision::userJoinCond(),
+                       ),
+               );
+               ChangeTags::modifyDisplayQuery(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $queryInfo['conds'],
+                       $queryInfo['join_conds'],
+                       $queryInfo['options']
+               );
+               return $db->select(
+                       $queryInfo['tables'],
+                       $queryInfo['fields'],
+                       $queryInfo['conds'],
+                       __METHOD__,
+                       $queryInfo['options'],
+                       $queryInfo['join_conds']
+               );
+       }
+
+       public function newItem( $row ) {
+               return new ChangeTagsRevisionItem( $this, $row );
+       }
+
+       /**
+        * Add/remove change tags from all the revisions in the list.
+        *
+        * @param array $tagsToAdd
+        * @param array $tagsToRemove
+        * @param array $params
+        * @param string $reason
+        * @param User $user
+        * @return Status
+        */
+       public function updateChangeTagsOnAll( $tagsToAdd, $tagsToRemove, $params,
+               $reason, $user ) {
+
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $this->current();
+                       $status = ChangeTags::updateTagsWithChecks( $tagsToAdd, $tagsToRemove,
+                               null, $item->getId(), null, $params, $reason, $user );
+                       // Should only fail on second and subsequent times if the user trips
+                       // the rate limiter
+                       if ( !$status->isOK() ) {
+                               break;
+                       }
+               }
+
+               return $status;
+       }
+}
index 371b267..9c2435a 100644 (file)
@@ -1057,6 +1057,24 @@ abstract class ContentHandler {
                return false;
        }
 
+       /**
+        * Return true if this content model supports direct editing, such as via EditPage.
+        *
+        * @return bool Default is false, and true for TextContent and it's derivatives.
+        */
+       public function supportsDirectEditing() {
+               return false;
+       }
+
+       /**
+        * Whether or not this content model supports direct editing via ApiEditPage
+        *
+        * @return bool Default is false, and true for TextContent and derivatives.
+        */
+       public function supportsDirectApiEditing() {
+               return $this->supportsDirectEditing();
+       }
+
        /**
         * Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
         * self::$enableDeprecationWarnings is set to true.
index ffe1acb..f5e8783 100644 (file)
@@ -134,4 +134,13 @@ class TextContentHandler extends ContentHandler {
                return new $class( '' );
        }
 
+       /**
+        * @see ContentHandler::supportsDirectEditing
+        *
+        * @return bool Default is true for TextContent and derivatives.
+        */
+       public function supportsDirectEditing() {
+               return true;
+       }
+
 }
index cbd8be5..8c1ebf9 100644 (file)
@@ -141,6 +141,13 @@ abstract class DatabaseBase implements IDatabase {
         */
        private $mTrxAutomaticAtomic = false;
 
+       /**
+        * Track the seconds spent in write queries for the current transaction
+        *
+        * @var float
+        */
+       private $mTrxWriteDuration = 0.0;
+
        /**
         * @since 1.21
         * @var resource File handle for upgrade
@@ -473,6 +480,18 @@ abstract class DatabaseBase implements IDatabase {
                );
        }
 
+       /**
+        * Get the time spend running write queries for this
+        *
+        * High times could be due to scanning, updates, locking, and such
+        *
+        * @return float|bool Returns false if not transaction is active
+        * @since 1.26
+        */
+       public function pendingWriteQueryDuration() {
+               return $this->mTrxLevel ? $this->mTrxWriteDuration : false;
+       }
+
        /**
         * Is a connection to the database open?
         * @return bool
@@ -1160,6 +1179,7 @@ abstract class DatabaseBase implements IDatabase {
                # Do the query and handle errors
                $startTime = microtime( true );
                $ret = $this->doQuery( $commentedSql );
+               $queryRuntime = microtime( true ) - $startTime;
                # Log the query time and feed it into the DB trx profiler
                $this->getTransactionProfiler()->recordQueryCompletion(
                        $queryProf, $startTime, $isWriteQuery, $this->affectedRows() );
@@ -1191,6 +1211,7 @@ abstract class DatabaseBase implements IDatabase {
                                        # Should be safe to silently retry (no trx and thus no callbacks)
                                        $startTime = microtime( true );
                                        $ret = $this->doQuery( $commentedSql );
+                                       $queryRuntime = microtime( true ) - $startTime;
                                        # Log the query time and feed it into the DB trx profiler
                                        $this->getTransactionProfiler()->recordQueryCompletion(
                                                $queryProf, $startTime, $isWriteQuery, $this->affectedRows() );
@@ -1211,6 +1232,10 @@ abstract class DatabaseBase implements IDatabase {
                $queryProfSection = false;
                $totalProfSection = false;
 
+               if ( $isWriteQuery && $this->mTrxLevel ) {
+                       $this->mTrxWriteDuration += $queryRuntime;
+               }
+
                return $res;
        }
 
@@ -1226,13 +1251,10 @@ abstract class DatabaseBase implements IDatabase {
         * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
-               # Ignore errors during error handling to avoid infinite recursion
-               $ignore = $this->ignoreErrors( true );
                ++$this->mErrorCount;
 
-               if ( $ignore || $tempIgnore ) {
+               if ( $this->ignoreErrors() || $tempIgnore ) {
                        wfDebug( "SQL ERROR (ignored): $error\n" );
-                       $this->ignoreErrors( $ignore );
                } else {
                        $sql1line = mb_substr( str_replace( "\n", "\\n", $sql ), 0, 5 * 1024 );
                        wfLogDBError(
@@ -3324,41 +3346,40 @@ abstract class DatabaseBase implements IDatabase {
         * @return bool
         */
        public function deadlockLoop() {
-               $this->begin( __METHOD__ );
                $args = func_get_args();
                $function = array_shift( $args );
-               $oldIgnore = $this->ignoreErrors( true );
                $tries = self::DEADLOCK_TRIES;
-
                if ( is_array( $function ) ) {
                        $fname = $function[0];
                } else {
                        $fname = $function;
                }
 
-               do {
-                       $retVal = call_user_func_array( $function, $args );
-                       $error = $this->lastError();
-                       $errno = $this->lastErrno();
-                       $sql = $this->lastQuery();
+               $this->begin( __METHOD__ );
 
-                       if ( $errno ) {
+               $e = null;
+               do {
+                       try {
+                               $retVal = call_user_func_array( $function, $args );
+                               break;
+                       } catch ( DBQueryError $e ) {
+                               $error = $this->lastError();
+                               $errno = $this->lastErrno();
+                               $sql = $this->lastQuery();
                                if ( $this->wasDeadlock() ) {
-                                       # Retry
+                                       // Retry after a randomized delay
                                        usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
                                } else {
-                                       $this->reportQueryError( $error, $errno, $sql, $fname );
+                                       // Throw the error back up
+                                       throw $e;
                                }
                        }
-               } while ( $this->wasDeadlock() && --$tries > 0 );
-
-               $this->ignoreErrors( $oldIgnore );
+               } while ( --$tries > 0 );
 
                if ( $tries <= 0 ) {
+                       // Too many deadlocks; give up
                        $this->rollback( __METHOD__ );
-                       $this->reportQueryError( $error, $errno, $sql, $fname );
-
-                       return false;
+                       throw $e;
                } else {
                        $this->commit( __METHOD__ );
 
@@ -3529,7 +3550,11 @@ abstract class DatabaseBase implements IDatabase {
                if ( !$this->mTrxLevel ) {
                        $this->begin( $fname );
                        $this->mTrxAutomatic = true;
-                       $this->mTrxAutomaticAtomic = true;
+                       // If DBO_TRX is set, a series of startAtomic/endAtomic pairs will result
+                       // in all changes being in one transaction to keep requests transactional.
+                       if ( !$this->getFlag( DBO_TRX ) ) {
+                               $this->mTrxAutomaticAtomic = true;
+                       }
                }
 
                $this->mTrxAtomicLevels->push( $fname );
@@ -3633,6 +3658,7 @@ abstract class DatabaseBase implements IDatabase {
                $this->mTrxIdleCallbacks = array();
                $this->mTrxPreCommitCallbacks = array();
                $this->mTrxShortId = wfRandomString( 12 );
+               $this->mTrxWriteDuration = 0.0;
        }
 
        /**
@@ -4332,7 +4358,7 @@ abstract class DatabaseBase implements IDatabase {
         * @return string
         */
        public function decodeExpiry( $expiry, $format = TS_MW ) {
-               return ( $expiry == '' || $expiry == $this->getInfinity() )
+               return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
                        ? 'infinity'
                        : wfTimestamp( $format, $expiry );
        }
index 3d0ed86..9287f7a 100644 (file)
@@ -530,10 +530,12 @@ class DatabasePostgres extends DatabaseBase {
                                return;
                        }
                }
-               /* Transaction stays in the ERROR state until rolledback */
+               /* Transaction stays in the ERROR state until rolled back */
                if ( $this->mTrxLevel ) {
+                       $ignore = $this->ignoreErrors( true );
                        $this->rollback( __METHOD__ );
-               };
+                       $this->ignoreErrors( $ignore );
+               }
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
index d9584e1..624f46b 100644 (file)
@@ -214,7 +214,7 @@ class LoadBalancer {
         * @return bool|int|string
         */
        public function getReaderIndex( $group = false, $wiki = false ) {
-               global $wgReadOnly, $wgDBtype;
+               global $wgDBtype;
 
                # @todo FIXME: For now, only go through all this for mysql databases
                if ( $wgDBtype != 'mysql' ) {
@@ -258,7 +258,7 @@ class LoadBalancer {
                # meets our criteria
                $currentLoads = $nonErrorLoads;
                while ( count( $currentLoads ) ) {
-                       if ( $wgReadOnly || $this->mAllowLagged || $laggedSlaveMode ) {
+                       if ( $this->mAllowLagged || $laggedSlaveMode ) {
                                $i = ArrayUtils::pickRandom( $currentLoads );
                        } else {
                                $i = false;
@@ -277,8 +277,6 @@ class LoadBalancer {
                                if ( $i === false && count( $currentLoads ) != 0 ) {
                                        # All slaves lagged. Switch to read-only mode
                                        wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode" );
-                                       $wgReadOnly = 'The database has been automatically locked ' .
-                                               'while the slave database servers catch up to the master';
                                        $i = ArrayUtils::pickRandom( $currentLoads );
                                        $laggedSlaveMode = true;
                                }
@@ -330,6 +328,10 @@ class LoadBalancer {
                        }
                        if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $group === false ) {
                                $this->mReadIndex = $i;
+                               # Record if the generic reader index is in "lagged slave" mode
+                               if ( $laggedSlaveMode ) {
+                                       $this->mLaggedSlaveMode = true;
+                               }
                        }
                        $serverName = $this->getServerName( $i );
                        wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
@@ -356,6 +358,37 @@ class LoadBalancer {
                }
        }
 
+       /**
+        * Set the master wait position and wait for a "generic" slave to catch up to it
+        *
+        * This can be used a faster proxy for waitForAll()
+        *
+        * @param DBMasterPos $pos
+        * @param int $timeout Max seconds to wait; default is mWaitTimeout
+        * @return bool Success (able to connect and no timeouts reached)
+        * @since 1.26
+        */
+       public function waitForOne( $pos, $timeout = null ) {
+               $this->mWaitForPos = $pos;
+
+               $i = $this->mReadIndex;
+               if ( $i <= 0 ) {
+                       // Pick a generic slave if there isn't one yet
+                       $readLoads = $this->mLoads;
+                       unset( $readLoads[$this->getWriterIndex()] ); // slaves only
+                       $readLoads = array_filter( $readLoads ); // with non-zero load
+                       $i = ArrayUtils::pickRandom( $readLoads );
+               }
+
+               if ( $i > 0 ) {
+                       $ok = $this->doWait( $i, true, $timeout );
+               } else {
+                       $ok = true; // no applicable loads
+               }
+
+               return $ok;
+       }
+
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
         * @param DBMasterPos $pos
@@ -1096,9 +1129,12 @@ class LoadBalancer {
        }
 
        /**
-        * @return bool
+        * @return bool Whether the generic connection for reads is highly "lagged"
         */
        public function getLaggedSlaveMode() {
+               # Get a generic reader connection
+               $this->getConnection( DB_SLAVE );
+
                return $this->mLaggedSlaveMode;
        }
 
index 1939e06..1249eba 100644 (file)
@@ -432,10 +432,8 @@ class MWDebug {
 
                        // Cannot use OutputPage::addJsConfigVars because those are already outputted
                        // by the time this method is called.
-                       $html = Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript(
-                                       ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
-                               )
+                       $html = ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
                        );
                }
 
@@ -540,11 +538,11 @@ class MWDebug {
                MWDebug::log( 'MWDebug output complete' );
                $debugInfo = self::getDebugInfo( $context );
 
-               $result->setIndexedTagName( $debugInfo, 'debuginfo' );
-               $result->setIndexedTagName( $debugInfo['log'], 'line' );
-               $result->setIndexedTagName( $debugInfo['debugLog'], 'msg' );
-               $result->setIndexedTagName( $debugInfo['queries'], 'query' );
-               $result->setIndexedTagName( $debugInfo['includes'], 'queries' );
+               ApiResult::setIndexedTagName( $debugInfo, 'debuginfo' );
+               ApiResult::setIndexedTagName( $debugInfo['log'], 'line' );
+               ApiResult::setIndexedTagName( $debugInfo['debugLog'], 'msg' );
+               ApiResult::setIndexedTagName( $debugInfo['queries'], 'query' );
+               ApiResult::setIndexedTagName( $debugInfo['includes'], 'queries' );
                $result->addValue( null, 'debuginfo', $debugInfo );
        }
 
index 9cf104a..edaef4a 100644 (file)
@@ -20,6 +20,7 @@
 
 namespace MediaWiki\Logger;
 
+use DateTimeZone;
 use MWDebug;
 use Psr\Log\AbstractLogger;
 use Psr\Log\LogLevel;
index b3078b9..f6699ec 100644 (file)
@@ -47,7 +47,7 @@ class LoggerFactory {
 
        /**
         * Service provider.
-        * @var Spi $spi
+        * @var \MediaWiki\Logger\Spi $spi
         */
        private static $spi;
 
@@ -56,7 +56,7 @@ class LoggerFactory {
         * Register a service provider to create new \Psr\Log\LoggerInterface
         * instances.
         *
-        * @param Spi $provider Provider to register
+        * @param \MediaWiki\Logger\Spi $provider Provider to register
         */
        public static function registerProvider( Spi $provider ) {
                self::$spi = $provider;
@@ -71,7 +71,7 @@ class LoggerFactory {
         * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
         * array usable by ObjectFactory::getObjectFromSpec() to create a class.
         *
-        * @return Spi
+        * @return \MediaWiki\Logger\Spi
         * @see registerProvider()
         * @see ObjectFactory::getObjectFromSpec()
         */
index c78b0dc..0476d0f 100644 (file)
@@ -100,56 +100,6 @@ class MWLoggerLegacyLogger extends \MediaWiki\Logger\LegacyLogger {
 class MWLoggerLegacySpi extends \MediaWiki\Logger\LegacySpi {
 }
 
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * the MediaWiki\Logger namespace.
- *
- * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyHandler
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLoggerMonologHandler extends \MediaWiki\Logger\Monolog\LegacyHandler {
-}
-
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * the MediaWiki\Logger namespace.
- *
- * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyFormatter
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLoggerMonologLegacyFormatter extends \MediaWiki\Logger\Monolog\LegacyFormatter {
-}
-
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * the MediaWiki\Logger namespace.
- *
- * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\WikiProcessor
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLoggerMonologProcessor extends \MediaWiki\Logger\Monolog\WikiProcessor {
-}
-
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * the MediaWiki\Logger namespace.
- *
- * @deprecated since 1.25 Use \MediaWiki\Logger\MonologSpi
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLoggerMonologSpi extends \MediaWiki\Logger\MonologSpi {
-}
-
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * the MediaWiki\Logger namespace.
- *
- * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\SyslogHandler
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLoggerMonologSyslogHandler extends \MediaWiki\Logger\Monolog\SyslogHandler {
-}
-
 /**
  * Backwards compatibility stub for usage from before the introduction of
  * the MediaWiki\Logger namespace.
diff --git a/includes/debug/logger/monolog/Shims.php b/includes/debug/logger/monolog/Shims.php
new file mode 100644 (file)
index 0000000..f250713
--- /dev/null
@@ -0,0 +1,69 @@
+<?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
+ */
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyHandler
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologHandler extends \MediaWiki\Logger\Monolog\LegacyHandler {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyFormatter
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologLegacyFormatter extends \MediaWiki\Logger\Monolog\LegacyFormatter {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\WikiProcessor
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologProcessor extends \MediaWiki\Logger\Monolog\WikiProcessor {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\MonologSpi
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologSpi extends \MediaWiki\Logger\MonologSpi {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\SyslogHandler
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologSyslogHandler extends \MediaWiki\Logger\Monolog\SyslogHandler {
+}
index 97a17c3..3c77238 100644 (file)
@@ -128,7 +128,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
         */
        public static function cacheUpdate( $dbw ) {
                global $wgActiveUserDays;
-               $dbr = wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow' ) );
+               $dbr = wfGetDB( DB_SLAVE, 'vslow' );
                # Get non-bot users than did some recent action other than making accounts.
                # If account creation is included, the number gets inflated ~20+ fold on enwiki.
                $activeUsers = $dbr->selectField(
index 5823b2e..49164e3 100644 (file)
@@ -111,39 +111,40 @@ abstract class SqlDataUpdate extends DataUpdate {
                        return;
                }
 
-               /**
-                * Determine which pages need to be updated
-                * This is necessary to prevent the job queue from smashing the DB with
-                * large numbers of concurrent invalidations of the same page
-                */
-               $now = $this->mDb->timestamp();
-               $ids = array();
-               $res = $this->mDb->select( 'page', array( 'page_id' ),
-                       array(
-                               'page_namespace' => $namespace,
-                               'page_title' => $dbkeys,
-                               'page_touched < ' . $this->mDb->addQuotes( $now )
-                       ), __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $ids[] = $row->page_id;
-               }
-
-               if ( $ids === array() ) {
-                       return;
-               }
-
-               /**
-                * Do the update
-                * We still need the page_touched condition, in case the row has changed since
-                * the non-locking select above.
-                */
-               $this->mDb->update( 'page', array( 'page_touched' => $now ),
-                       array(
-                               'page_id' => $ids,
-                               'page_touched < ' . $this->mDb->addQuotes( $now )
-                       ), __METHOD__
-               );
+               $dbw = $this->mDb;
+               $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $namespace, $dbkeys ) {
+                       /**
+                        * Determine which pages need to be updated
+                        * This is necessary to prevent the job queue from smashing the DB with
+                        * large numbers of concurrent invalidations of the same page
+                        */
+                       $now = $dbw->timestamp();
+                       $ids = $dbw->selectFieldValues( 'page',
+                               'page_id',
+                               array(
+                                       'page_namespace' => $namespace,
+                                       'page_title' => $dbkeys,
+                                       'page_touched < ' . $dbw->addQuotes( $now )
+                               ),
+                               __METHOD__
+                       );
+
+                       if ( $ids === array() ) {
+                               return;
+                       }
+
+                       /**
+                        * Do the update
+                        * We still need the page_touched condition, in case the row has changed since
+                        * the non-locking select above.
+                        */
+                       $dbw->update( 'page',
+                               array( 'page_touched' => $now ),
+                               array(
+                                       'page_id' => $ids,
+                                       'page_touched < ' . $dbw->addQuotes( $now )
+                               ), __METHOD__
+                       );
+               } );
        }
 }
index 77bbd36..2c63dfb 100644 (file)
@@ -1077,10 +1077,11 @@ class DifferenceEngine extends ContextSource {
                // is often in a different language, mostly the page content language/dir
                $tableClass = 'diff diff-contentalign-' . htmlspecialchars( $this->getDiffLang()->alignStart() );
                $header = "<table class='$tableClass'>";
+               $userLang = htmlspecialchars( $this->getLanguage()->getHtmlCode() );
 
                if ( !$diff && !$otitle ) {
                        $header .= "
-                       <tr style='vertical-align: top;'>
+                       <tr style='vertical-align: top;' lang='{$userLang}'>
                        <td class='diff-ntitle'>{$ntitle}</td>
                        </tr>";
                        $multiColspan = 1;
@@ -1099,7 +1100,7 @@ class DifferenceEngine extends ContextSource {
                        }
                        if ( $otitle || $ntitle ) {
                                $header .= "
-                               <tr style='vertical-align: top;'>
+                               <tr style='vertical-align: top;' lang='{$userLang}'>
                                <td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
                                <td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
                                </tr>";
@@ -1108,10 +1109,11 @@ class DifferenceEngine extends ContextSource {
 
                if ( $multi != '' ) {
                        $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;' " .
-                               "class='diff-multi'>{$multi}</td></tr>";
+                               "class='diff-multi' lang='{$userLang}'>{$multi}</td></tr>";
                }
                if ( $notice != '' ) {
-                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;'>{$notice}</td></tr>";
+                       $header .= "<tr><td colspan='{$multiColspan}' style='text-align: center;' " .
+                               "lang='{$userLang}'>{$notice}</td></tr>";
                }
 
                return $header . $diff . "</table>";
diff --git a/includes/eventrelayer/EventRelayer.php b/includes/eventrelayer/EventRelayer.php
new file mode 100755 (executable)
index 0000000..a3d214f
--- /dev/null
@@ -0,0 +1,64 @@
+<?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
+ */
+
+/**
+ * Base class for reliable event relays
+ */
+abstract class EventRelayer {
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params ) {}
+
+       /**
+        * @param string $channel
+        * @param array $event Event data map
+        * @return bool Success
+        */
+       final public function notify( $channel, $event ) {
+               return $this->doNotify( $channel, array( $event ) );
+       }
+
+       /**
+        * @param string $channel
+        * @param array $events List of event data maps
+        * @return bool Success
+        */
+       final public function notifyMulti( $channel, $events ) {
+               return $this->doNotify( $channel, $events );
+       }
+
+       /**
+        * @param string $channel
+        * @param array $events List of event data maps
+        * @return bool Success
+        */
+       abstract protected function doNotify( $channel, array $events );
+}
+
+/**
+ * No-op class for publishing messages into a PubSub system
+ */
+class EventRelayerNull extends EventRelayer {
+       public function doNotify( $channel, array $events ) {
+               return true;
+       }
+}
diff --git a/includes/eventrelayer/EventRelayerMCRD.php b/includes/eventrelayer/EventRelayerMCRD.php
new file mode 100755 (executable)
index 0000000..1e8b2a4
--- /dev/null
@@ -0,0 +1,66 @@
+<?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
+ */
+
+/**
+ * Relayed that uses the mcrelaypushd server
+ */
+class EventRelayerMCRD extends EventRelayer {
+       /** @var MultiHttpClient */
+       protected $http;
+       /** @var string */
+       protected $baseUrl;
+
+       /**
+        * Additional params include 'mcrdConfig', which is a map of:
+        *   - url : The base URL of the service (without paths)
+        * @param array $params
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+
+               $this->baseUrl = $params['mcrdConfig']['url'];
+
+               $httpConfig = isset( $params['httpConfig'] ) ? $params['httpConfig'] : array();
+               if ( !isset( $httpConfig['connTimeout'] ) ) {
+                       $httpConfig['connTimeout'] = 1;
+               }
+               if ( !isset( $httpConfig['reqTimeout'] ) ) {
+                       $httpConfig['reqTimeout'] = .25;
+               }
+
+               $this->http = new MultiHttpClient( $httpConfig );
+       }
+
+       protected function doNotify( $channel, array $events ) {
+               if ( !count( $events ) ) {
+                       return true;
+               }
+
+               $response = $this->http->run( array(
+                       'url'     => "{$this->baseUrl}/relayer/api/v1.0/" . rawurlencode( $channel ),
+                       'method'  => 'POST',
+                       'body'    => json_encode( array( 'events' => $events ) ),
+                       'headers' => array( 'content-type' => 'application/json' )
+               ) );
+
+               return $response['code'] == 201;
+       }
+}
index ed0f3c2..c50b6c8 100644 (file)
@@ -150,22 +150,24 @@ class MWExceptionHandler {
         * @since 1.25
         * @param Exception $e
         */
-       public static function handleException( $e ) {
-               global $wgFullyInitialised;
+       public static function handleException( Exception $e ) {
+               try {
+                       // Rollback DBs to avoid transaction notices. This may fail
+                       // to rollback some DB due to connection issues or exceptions.
+                       // However, any sane DB driver will rollback implicitly anyway.
+                       self::rollbackMasterChangesAndLog( $e );
+               } catch ( DBError $e2 ) {
+                       // If the DB is unreacheable, rollback() will throw an error
+                       // and the error report() method might need messages from the DB,
+                       // which would result in an exception loop. PHP may escalate such
+                       // errors to "Exception thrown without a stack frame" fatals, but
+                       // it's better to be explicit here.
+                       self::logException( $e2 );
+               }
 
-               self::rollbackMasterChangesAndLog( $e );
                self::logException( $e );
                self::report( $e );
 
-               // Final cleanup
-               if ( $wgFullyInitialised ) {
-                       try {
-                               // uses $wgRequest, hence the $wgFullyInitialised condition
-                               wfLogProfilingData();
-                       } catch ( Exception $e ) {
-                       }
-               }
-
                // Exit value should be nonzero for the benefit of shell jobs
                exit( 1 );
        }
index 12ef91a..702f850 100644 (file)
@@ -934,6 +934,7 @@ abstract class DatabaseUpdater {
                }
                $blobStore = new MessageBlobStore();
                $blobStore->clear();
+               $this->db->delete( 'module_deps', '*', __METHOD__ );
                $this->output( "done.\n" );
        }
 
index b40b3f1..f9c885d 100644 (file)
@@ -1492,16 +1492,31 @@ abstract class Installer {
                 */
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
+               $queue = array();
 
                require "$IP/includes/DefaultSettings.php";
 
                foreach ( $exts as $e ) {
-                       require_once "$IP/extensions/$e/$e.php";
+                       if ( file_exists( "$IP/extensions/$e/extension.json" ) ) {
+                               $queue["$IP/extensions/$e/extension.json"] = 1;
+                       } else {
+                               require_once "$IP/extensions/$e/$e.php";
+                       }
                }
 
+               $registry = new ExtensionRegistry();
+               $data = $registry->readFromQueue( $queue );
+               $wgAutoloadClasses += $data['autoload'];
+
                $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
                        $wgHooks['LoadExtensionSchemaUpdates'] : array();
 
+               if ( isset( $data['globals']['wgHooks']['LoadExtensionSchemaUpdates'] ) ) {
+                       $hooksWeWant = array_merge_recursive(
+                               $hooksWeWant,
+                               $data['globals']['wgHooks']['LoadExtensionSchemaUpdates']
+                       );
+               }
                // Unset everyone else's hooks. Lord knows what someone might be doing
                // in ParserFirstCallInit (see bug 27171)
                $GLOBALS['wgHooks'] = array( 'LoadExtensionSchemaUpdates' => $hooksWeWant );
diff --git a/includes/installer/i18n/azb.json b/includes/installer/i18n/azb.json
new file mode 100644 (file)
index 0000000..baf4f6d
--- /dev/null
@@ -0,0 +1,27 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mousa"
+               ]
+       },
+       "config-desc": "مئدیاویکی قوروجوسو",
+       "config-title": "مئدیاویکی $1 قورماغی",
+       "config-information": "بیلگیلر",
+       "config-localsettings-key": "یوکسلتمک کلیدی:",
+       "config-localsettings-badkey": "وئردیگینیز کیلید دوغرو دئییل.",
+       "config-your-language": "دیلینیز:",
+       "config-wiki-language": "ویکی دیلی:",
+       "config-back": "→ دالی",
+       "config-continue": "سونرا ←",
+       "config-page-language": "دیل",
+       "config-page-welcome": "مئدیاویکی‌یه خوش گلدینیز!",
+       "config-page-name": "آد",
+       "config-page-options": "سئچیملر",
+       "config-page-install": "قور",
+       "config-page-readme": "منی اوخو",
+       "config-env-php": "PHP $1 قورولوبدور.",
+       "config-env-hhvm": "HHVM $1 قورولوبدور.",
+       "config-help": "یاردیم",
+       "config-help-tooltip": "گئنیشلتمک اوچون کلیک ائدین",
+       "config-nofile": "«$1» فایلی تاپیلانمادی. سیلینیبدیرمی؟"
+}
index 0cffa94..1178a1a 100644 (file)
@@ -87,6 +87,6 @@
        "config-download-localsettings": "Чуяккха <code>LocalSettings.php</code>",
        "config-help": "гӀо",
        "config-nofile": "Файл \"$1\" каро цаелира. И дӀаяьккхина ярий?",
-       "mainpagetext": "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
+       "mainpagetext": "'''Вики-белхан гӀирс «MediaWiki» кхочуш дика дӀахӀоттийна.'''",
        "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 Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index b45b8f2..b348a1b 100644 (file)
        "config-restart": "Ja, erneut starten",
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
        "config-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
-       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzeranleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratorenanleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versionsinformationen</doclink>\n* <doclink href=Copying>Lizenzbestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
+       "config-sidebar": "* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzer­anleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratoren­anleitung]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versions­informationen</doclink>\n* <doclink href=Copying>Lizenz­bestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
        "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
        "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
        "config-env-php": "Die Skriptsprache „PHP“ ($1) ist installiert.",
        "config-env-hhvm": "HHVM $1 ist installiert.",
-       "config-unicode-using-utf8": "Zur Unicode-Normalisierung wird Brion Vibbers <code>utf8_normalize.so</code> eingesetzt.",
        "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [http://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
        "config-unicode-pure-php-warning": "'''Warnung:''' Die [http://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
        "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
index 27b930a..e163a9b 100644 (file)
@@ -4,7 +4,8 @@
                        "Glavkos",
                        "Protnet",
                        "ZaDiak",
-                       "Astralnet"
+                       "Astralnet",
+                       "Geraki"
                ]
        },
        "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
        "config-install-interwiki-list": "Αδυναμία ανάγνωσης του αρχείου <code>interwiki.list</code>.",
        "config-help": "βοήθεια",
        "mainpagetext": "<strong>To MediaWiki εγκαταστάθηκε με επιτυχία.</strong>",
-       "mainpagedocfooter": "ΠεÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81εÏ\82 Ï\80ληÏ\81οÏ\86οÏ\81ίεÏ\82 Ï\83Ï\87εÏ\84ικά Î¼Îµ Ï\84η Ï\87Ï\81ήÏ\83η ÎºÎ±Î¹ Î¼Îµ Ï\84η Ï\81Ï\8dθμιÏ\83η Ï\80αÏ\81αμέÏ\84Ï\81Ï\89ν Î¸Î± Î²Ï\81είÏ\84ε Ï\83Ï\84οÏ\85Ï\82 Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82: [//meta.wikimedia.org/wiki/MediaWiki_localisation Î\9fδηγίεÏ\82 Î³Î¹Î± Ï\84Ï\81οÏ\80οÏ\80οίηÏ\83η Ï\84οÏ\85 Ï\80εÏ\81ιβάλλονÏ\84οÏ\82 ÎµÏ\81γαÏ\83ίαÏ\82] ÎºÎ±Î¹ [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Î\95γÏ\87ειÏ\81ίδιο Ï\87Ï\81ήÏ\83Ï\84η]."
+       "mainpagedocfooter": "ΣÏ\85μβοÏ\85λεÏ\85Ï\84είÏ\84ε Ï\84ο [//meta.wikimedia.org/wiki/Help:Contents Î\95γÏ\87ειÏ\81ίδιο Ï\87Ï\81ήÏ\83Ï\84η] Î³Î¹Î± Ï\80ληÏ\81οÏ\86οÏ\81ίεÏ\82 Ï\83Ï\87εÏ\84ικά Î¼Îµ Ï\84η Ï\87Ï\81ήÏ\83η Ï\84οÏ\85 Î»Î¿Î³Î¹Ï\83μικοÏ\8d wiki.\n\n== Î\9eεκινÏ\8eνÏ\84αÏ\82 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Î\9aαÏ\84άλογοÏ\82 Ï\81Ï\85θμίÏ\83εÏ\89ν]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Î\9bίÏ\83Ï\84α Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎµÎºÎ´Ï\8cÏ\83εÏ\89ν MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Î¤Î¿Ï\80ικοÏ\80οιήÏ\83Ï\84ε Ï\84ο MediaWiki Î³Î¹Î± Ï\84η Î³Î»Ï\8eÏ\83Ï\83α Ï\83αÏ\82]"
 }
index 629b53b..42dbd4f 100644 (file)
@@ -4,7 +4,8 @@
                        "Smtchahal",
                        "Vivek Rai",
                        "Phoenix303",
-                       "संजीव कुमार"
+                       "संजीव कुमार",
+                       "Sahilrathod"
                ]
        },
        "config-desc": "साँचा लिए इंस्टॉलर",
        "config-restart": "हाँ, इसे पुनः आरंभ करें",
        "config-env-php": "PHP $1 स्थापित किया गया है।",
        "config-db-wiki-settings": "इस विकि को पहचानें",
+       "config-db-install-account": "इंस्टालेशन के लिए उपयोगकर्ता खाता",
        "config-mssql-auth": "प्रमाणन प्रकार:",
        "config-mssql-sqlauth": "SQL सर्वर प्रमाणन",
        "config-site-name": "विकि का नाम:",
+       "config-site-name-blank": "एक साइट का नाम लिखें",
        "config-project-namespace": "प्रकल्प नामस्थान:",
        "config-ns-generic": "प्रकल्प",
        "config-ns-other": "अन्य (निर्दिष्ट करें)",
        "config-ns-other-default": "मेरा विकि",
+       "config-admin-box": "व्यवस्थापक खाता",
+       "config-admin-name": "आपका उपयोगकर्ता नाम:",
        "config-admin-password": "कूटशब्द:",
        "config-admin-password-confirm": "फिर से कूटशब्द:",
        "config-admin-email": "ईमेल पता:",
@@ -52,6 +57,7 @@
        "config-profile-no-anon": "खाता बनाने की आवश्यकता",
        "config-profile-fishbowl": "केवल प्रमाषित संपादक ही",
        "config-profile-private": "निजी विकि",
+       "config-license-cc-by": "क्रिएटिव कॉमन्स ऍट्रीब्यूशन",
        "config-email-watchlist": "ध्यानसूची अधिसूचना को सक्षम करें",
        "config-extensions": "एक्सटेंशन",
        "config-help": "सहायता",
index 10ca898..f7160b6 100644 (file)
@@ -52,7 +52,6 @@
        "config-env-bad": "환경이 확인되었습니다.\n미디어위키를 설치할 수 없습니다.",
        "config-env-php": "PHP $1이(가) 설치되어 있습니다.",
        "config-env-hhvm": "HHMV $1이(가) 설치되어 있습니다.",
-       "config-unicode-using-utf8": "유니코드 정규화에 Brion Vibber의 utf8_normalize.so를 사용합니다.",
        "config-unicode-using-intl": "유니코드 정규화에 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용합니다.",
        "config-unicode-pure-php-warning": "<strong>경고</strong>: 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]을 사용할 수 없기 때문에 느린 pure-PHP 구현을 대신 사용합니다.\n트래픽이 높은 사이트에서 실행하시려면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 유니코드 정규화]를 읽어보셔야 합니다.",
        "config-unicode-update-warning": "<strong>경고</strong>: 유니코드 정규화 래퍼의 설치된 버전은 [http://site.icu-project.org/ ICU 프로젝트]의 라이브러리의 이전 버전을 사용합니다.\n만약 유니코드를 사용하는 것에 대해 우려가 된다면 [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations 업그레이드]해야합니다.",
index 367db40..113c7ab 100644 (file)
        "config-env-bad": "De Ömjävung es jeprööf.\nDo kanns MediaWiki nit opsäze.",
        "config-env-php": "PHP $1 es doh.",
        "config-env-hhvm": "HHVM $1 es enschtalleerd.",
-       "config-unicode-using-utf8": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer däm <i lang=\"en\">Brion Vibber</i> sing Projramm <code lang=\"en\">utf8_normalize.so</code> nämme.",
        "config-unicode-using-intl": "För et <i lang=\"en\">Unicode</i>-Nommaliseere dom_mer dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] nämme.",
        "config-unicode-pure-php-warning": "'''Opjepaß:''' Mer kunnte dä [http://pecl.php.net/intl Zohsaz <code lang=\"en\">intl</code> uss em <code lang=\"en\">PECL</code>] för et <i lang=\"en\">Unicode</i>-Nommaliseere nit fenge. Dröm nämme mer dat eijfache, ävver ärsh lahme, <i lang=\"en\">PHP</i>-Projrammshtöck doför.\nFör jruuße Wikis met vill Metmaachere doht Üsch die Sigg övver et [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations <i lang=\"en\">Unicode</i>-Nommaliseere] (es op Änglesch) aanloore.",
        "config-unicode-update-warning": "'''Opjepaß:''' Dat Projramm för der <i lang=\"en\">Unicode</i> zo normaliseere boud em Momang op en  ählter Version vun dä Bibliothek vum [http://site.icu-project.org/ ICU-Projäk] op.\nDoht di [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations op der neuste Shtand bränge], wann auf dat Wiki em Äänz <i lang=\"en\">Unicode</i> bruche sull.",
-       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä Daatebangke ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
+       "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge <i lang=\"en\">provider</i> bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: <code  lang=\"en\">./configure --with-mysql</code>.\nWann De PHP uss enem <i lang=\"en\">Debian</i> udder <i lang=\"en\">Ubuntu</i> Pakätt enjeresht häs, moß De dann och noch et <code lang=\"en\">php5-mysql</code> op Dinge Räschner bränge.",
        "config-outdated-sqlite": "'''Opjepaß:''' <i lang=\"en\">SQLite</i> $1 es enschtaleert. Avver MediaWiki bruch <i lang=\"en\">SQLite</i> $2 udder hühter. <i lang=\"en\">SQLite</i> kann dröm nit enjesaz wääde.",
        "config-no-fts3": "'''Opjepaß:''' De Projramme vum <i lang=\"en\">SQLite</i> sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.",
        "config-register-globals-error": "<strong>Fähler: dem PHP sing Enschtällong <code>[http://php.net/register_globals register_globals]</code> es aanjeschalldt.\nSe moß ußjeschalldt sin, domet mer heh wigger maache kann.</strong>\nLoor op dä Sigg [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] wi mer se ußschallde kann.",
index 2dccc50..ac54d87 100644 (file)
@@ -37,7 +37,7 @@
        "config-page-copying": "Kopéieren",
        "config-page-upgradedoc": "Aktualiséieren",
        "config-page-existingwiki": "Wiki déi et gëtt",
-       "config-help-restart": "Wëllt dir all gespäichert Donnéeë läschen déi dir bis elo aginn hutt an den Installatiounsprozess nei starten?",
+       "config-help-restart": "Wëllt Dir all gespäichert Donnéeë läschen déi Dir bis elo aginn hutt an den Installatiounsprozess nei starten?",
        "config-restart": "Jo, neistarten",
        "config-welcome": "=== Iwwerpréifung vum Installatiounsenvironnement ===\nEt gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.\nDir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
        "config-sidebar": "* [//www.mediawiki.org MediaWiki Haaptsäit]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Benotzerguide]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guide fir Administrateuren]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Liest dëst</doclink>\n* <doclink href=ReleaseNotes>Informatioune vun der aktueller Versioun</doclink>\n* <doclink href=Copying>Lizenzbedingungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisatioun</doclink>",
@@ -45,7 +45,6 @@
        "config-env-bad": "Den Environnement gouf iwwerpréift.\nDir kënnt MediWiki net installéieren.",
        "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.\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.",
index 836e0fc..b3d40d2 100644 (file)
        "config-your-language": "तपाईंको भाषा:",
        "config-your-language-help": "इन्स्टल गर्दा उपयोग गर्ने भाषा छान्नुहोस् ।",
        "config-wiki-language": "विकि भाषाहरू",
+       "config-back": "← पछाडी",
+       "config-continue": "जारी राख्ने →",
+       "config-page-language": "भाषा",
+       "config-page-welcome": "मिडीयाविकिमा तपाईंलाई स्वागत छ!",
+       "config-page-dbconnect": "डेटाबेससँग सम्बन्ध बनाउने",
        "config-page-name": "नाम",
        "config-page-options": "विकल्पहरु",
        "config-page-install": "स्थापना गर्ने",
@@ -20,6 +25,7 @@
        "config-page-restart": "स्थापना फेरि सुरु गर्ने",
        "config-page-readme": "पढ्नुहोस्",
        "config-page-releasenotes": "प्रकाशन टिप्पणी",
+       "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 132644d..003507f 100644 (file)
@@ -14,7 +14,8 @@
                        "Rodrigo codignoli",
                        "Tuliouel",
                        "Marcos dias de oliveira",
-                       "Fasouzafreitas"
+                       "Fasouzafreitas",
+                       "TheEduGobi"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-env-bad": "O ambiente foi verificado.\nVocê não pode instalar o MediaWiki.",
        "config-env-php": "O PHP $1 está instalado.",
        "config-env-hhvm": "HHVM $1 está instalado.",
-       "config-unicode-using-utf8": "Usando o utf8_normalize.so, de Brion Vibber, para a normalização Unicode.",
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
        "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.\nSão suportados os seguintes tipos de bancos de dados: $1.\n\nSe você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo <code>./configure --with-mysqli</code>.\nSe você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, então será também necessário instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
+       "config-register-globals-error": "<strong>Erro: a opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.\nA mesma deve ser desativada para continuar a instalação.</strong>\nVeja [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] para obter ajuda com isto.",
+       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] está ativa!</strong>\nEsta opção corrompe a entrada de dados imprevisivelmente.\nVocê não pode instalar ou usar a MediaWiki a menos que esta opção seja desativada.",
        "config-magic-quotes-runtime": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!</strong>\nEsta opção causa corrupção dos dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-magic-quotes-sybase": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!</strong>\nEsta opção corrompe os dados de entrada de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
        "config-mbstring": "<strong>Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!</strong>\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.",
@@ -77,6 +79,7 @@
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!",
        "config-ctype": "<strong>Erro fatal:</strong> O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-iconv": "<strong>Fatal:</strong> O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/iconv.installation.php extensão iconv].",
        "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no <code>/etc/php.ini</code> ou no <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote <code>php5-json</code> ou do <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado",
        "config-apc": "[http://www.php.net/apc APC] está instalado",
index 91fe86c..7df85ff 100644 (file)
@@ -359,7 +359,7 @@ abstract class JobQueue {
                // Flag this job as an old duplicate based on its "root" job...
                try {
                        if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
-                               JobQueue::incrStats( 'job-pop-duplicate', $this->type, 1, $this->wiki );
+                               JobQueue::incrStats( 'job-pop-duplicate', $this->type );
                                $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
                        }
                } catch ( Exception $e ) {
@@ -615,6 +615,20 @@ abstract class JobQueue {
                return new ArrayIterator( array() ); // not implemented
        }
 
+       /**
+        * Get an iterator to traverse over all claimed jobs in this queue
+        *
+        * Callers should be quick to iterator over it or few results
+        * will be returned due to jobs being acknowledged and deleted
+        *
+        * @return Iterator
+        * @throws JobQueueError
+        * @since 1.26
+        */
+       public function getAllAcquiredJobs() {
+               return new ArrayIterator( array() ); // not implemented
+       }
+
        /**
         * Get an iterator to traverse over all abandoned jobs in this queue
         *
@@ -689,15 +703,11 @@ abstract class JobQueue {
         * @param string $key Event type
         * @param string $type Job type
         * @param int $delta
-        * @param string $wiki Wiki ID (added in 1.23)
         * @since 1.22
         */
-       public static function incrStats( $key, $type, $delta = 1, $wiki = null ) {
+       public static function incrStats( $key, $type, $delta = 1 ) {
                wfIncrStats( $key, $delta );
                wfIncrStats( "{$key}-{$type}", $delta );
-               if ( $wiki !== null ) {
-                       wfIncrStats( "{$key}-{$type}-{$wiki}", $delta );
-               }
        }
 
        /**
index d5f47ff..320b1b1 100644 (file)
@@ -256,12 +256,11 @@ class JobQueueDB extends JobQueue {
                        foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
                                $dbw->insert( 'job', $rowBatch, $method );
                        }
-                       JobQueue::incrStats( 'job-insert', $this->type, count( $rows ), $this->wiki );
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
                        JobQueue::incrStats(
                                'job-insert-duplicate',
                                $this->type,
-                               count( $rowSet ) + count( $rowList ) - count( $rows ),
-                               $this->wiki
+                               count( $rowSet ) + count( $rowList ) - count( $rows )
                        );
                } catch ( DBError $e ) {
                        if ( $flags & self::QOS_ATOMIC ) {
@@ -312,14 +311,9 @@ class JobQueueDB extends JobQueue {
                                        $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
                                        break; // nothing to do
                                }
-                               JobQueue::incrStats( 'job-pop', $this->type, 1, $this->wiki );
+                               JobQueue::incrStats( 'job-pop', $this->type );
                                // Get the job object from the row...
-                               $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
-                               if ( !$title ) {
-                                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                                       wfDebug( "Row has invalid title '{$row->job_title}'.\n" );
-                                       continue; // try again
-                               }
+                               $title = Title::makeTitle( $row->job_namespace, $row->job_title );
                                $job = Job::factory( $row->job_cmd, $title,
                                        self::extractBlob( $row->job_params ), $row->job_id );
                                $job->metadata['id'] = $row->job_id;
@@ -685,7 +679,7 @@ class JobQueueDB extends JobQueue {
                                        );
                                        $affected = $dbw->affectedRows();
                                        $count += $affected;
-                                       JobQueue::incrStats( 'job-recycle', $this->type, $affected, $this->wiki );
+                                       JobQueue::incrStats( 'job-recycle', $this->type, $affected );
                                        // The tasks recycled jobs or release delayed jobs into the queue
                                        $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
                                        $this->aggr->notifyQueueNonEmpty( $this->wiki, $this->type );
@@ -714,7 +708,7 @@ class JobQueueDB extends JobQueue {
                                $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
                                $affected = $dbw->affectedRows();
                                $count += $affected;
-                               JobQueue::incrStats( 'job-abandon', $this->type, $affected, $this->wiki );
+                               JobQueue::incrStats( 'job-abandon', $this->type, $affected );
                        }
 
                        $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
index d985d44..178ce8a 100644 (file)
@@ -422,6 +422,17 @@ class JobQueueFederated extends JobQueue {
                return $iterator;
        }
 
+       public function getAllAcquiredJobs() {
+               $iterator = new AppendIterator();
+
+               /** @var JobQueue $queue */
+               foreach ( $this->partitionQueues as $queue ) {
+                       $iterator->append( $queue->getAllAcquiredJobs() );
+               }
+
+               return $iterator;
+       }
+
        public function getAllAbandonedJobs() {
                $iterator = new AppendIterator();
 
index 6c823fb..275d027 100644 (file)
@@ -222,9 +222,9 @@ class JobQueueRedis extends JobQueue {
 
                                throw new RedisException( "Could not insert {$failed} {$this->type} job(s)." );
                        }
-                       JobQueue::incrStats( 'job-insert', $this->type, count( $items ), $this->wiki );
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
                        JobQueue::incrStats( 'job-insert-duplicate', $this->type,
-                               count( $items ) - $failed - $pushed, $this->wiki );
+                               count( $items ) - $failed - $pushed );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -300,7 +300,7 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               JobQueue::incrStats( 'job-pop', $this->type, 1, $this->wiki );
+                               JobQueue::incrStats( 'job-pop', $this->type );
                                $item = $this->unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
@@ -473,70 +473,84 @@ LUA;
        /**
         * @see JobQueue::getAllQueuedJobs()
         * @return Iterator
+        * @throws JobQueueError
         */
        public function getAllQueuedJobs() {
                $conn = $this->getConnection();
                try {
-                       $that = $this;
-
-                       return new MappedIterator(
-                               $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
-                               function ( $uid ) use ( $that, $conn ) {
-                                       return $that->getJobFromUidInternal( $uid, $conn );
-                               },
-                               array( 'accept' => function ( $job ) {
-                                       return is_object( $job );
-                               } )
-                       );
+                       $uids = $conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
+
+               return $this->getJobIterator( $conn, $uids );
        }
 
        /**
-        * @see JobQueue::getAllQueuedJobs()
+        * @see JobQueue::getAllDelayedJobs()
         * @return Iterator
+        * @throws JobQueueError
         */
        public function getAllDelayedJobs() {
                $conn = $this->getConnection();
                try {
-                       $that = $this;
-
-                       return new MappedIterator( // delayed jobs
-                               $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
-                               function ( $uid ) use ( $that, $conn ) {
-                                       return $that->getJobFromUidInternal( $uid, $conn );
-                               },
-                               array( 'accept' => function ( $job ) {
-                                       return is_object( $job );
-                               } )
-                       );
+                       $uids = $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $conn, $e );
+               }
+
+               return $this->getJobIterator( $conn, $uids );
+       }
+
+       /**
+        * @see JobQueue::getAllAcquiredJobs()
+        * @return Iterator
+        * @throws JobQueueError
+        */
+       public function getAllAcquiredJobs() {
+               $conn = $this->getConnection();
+               try {
+                       $uids = $conn->zRange( $this->getQueueKey( 'z-claimed' ), 0, -1 );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
+
+               return $this->getJobIterator( $conn, $uids );
        }
 
        /**
         * @see JobQueue::getAllAbandonedJobs()
         * @return Iterator
+        * @throws JobQueueError
         */
        public function getAllAbandonedJobs() {
                $conn = $this->getConnection();
                try {
-                       $that = $this;
-
-                       return new MappedIterator( // delayed jobs
-                               $conn->zRange( $this->getQueueKey( 'z-abandoned' ), 0, -1 ),
-                               function ( $uid ) use ( $that, $conn ) {
-                                       return $that->getJobFromUidInternal( $uid, $conn );
-                               },
-                               array( 'accept' => function ( $job ) {
-                                       return is_object( $job );
-                               } )
-                       );
+                       $uids = $conn->zRange( $this->getQueueKey( 'z-abandoned' ), 0, -1 );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
+
+               return $this->getJobIterator( $conn, $uids );
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @param array $uids List of job UUIDs
+        * @return MappedIterator
+        */
+       protected function getJobIterator( RedisConnRef $conn, array $uids ) {
+               $that = $this;
+
+               return new MappedIterator(
+                       $uids,
+                       function ( $uid ) use ( $that, $conn ) {
+                               return $that->getJobFromUidInternal( $uid, $conn );
+                       },
+                       array( 'accept' => function ( $job ) {
+                               return is_object( $job );
+                       } )
+               );
        }
 
        public function getCoalesceLocationInternal() {
@@ -583,7 +597,7 @@ LUA;
                        if ( $data === false ) {
                                return false; // not found
                        }
-                       $item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+                       $item = $this->unserialize( $data );
                        if ( !is_array( $item ) ) { // this shouldn't happen
                                throw new MWException( "Could not find job with ID '$uid'." );
                        }
@@ -631,15 +645,11 @@ LUA;
         * @return Job|bool
         */
        protected function getJobFromFields( array $fields ) {
-               $title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
-               if ( $title ) {
-                       $job = Job::factory( $fields['type'], $title, $fields['params'] );
-                       $job->metadata['uuid'] = $fields['uuid'];
+               $title = Title::makeTitle( $fields['namespace'], $fields['title'] );
+               $job = Job::factory( $fields['type'], $title, $fields['params'] );
+               $job->metadata['uuid'] = $fields['uuid'];
 
-                       return $job;
-               }
-
-               return false;
+               return $job;
        }
 
        /**
index b8c5d6c..9425423 100644 (file)
@@ -117,9 +117,16 @@ class JobRunner implements LoggerAwareInterface {
                        return $response;
                }
 
-               // Bail out if there is too much DB lag
-               list( , $maxLag ) = wfGetLBFactory()->getMainLB( wfWikiID() )->getMaxLag();
-               if ( $maxLag >= 5 ) {
+               // Catch huge single updates that lead to slave lag
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
+               $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
+
+               // Bail out if there is too much DB lag.
+               // This check should not block as we want to try other wiki queues.
+               $maxAllowedLag = 3;
+               list( , $maxLag ) = wfGetLB( wfWikiID() )->getMaxLag();
+               if ( $maxLag >= $maxAllowedLag ) {
                        $response['reached'] = 'slave-lag-limit';
                        return $response;
                }
@@ -135,10 +142,9 @@ class JobRunner implements LoggerAwareInterface {
                $jobsRun = 0;
                $timeMsTotal = 0;
                $flags = JobQueueGroup::USE_CACHE;
-               $checkPeriod = 5.0; // seconds
-               $checkPhase = mt_rand( 0, 1000 * $checkPeriod ) / 1000; // avoid stampedes
                $startTime = microtime( true ); // time since jobs started running
-               $lastTime = microtime( true ) - $checkPhase; // time since last slave check
+               $checkLagPeriod = 1.0; // check slave lag this many seconds
+               $lastCheckTime = 1; // timestamp of last slave check
                do {
                        // Sync the persistent backoffs with concurrent runners
                        $backoffs = $this->syncBackoffDeltas( $backoffs, $backoffDeltas, $wait );
@@ -229,13 +235,13 @@ class JobRunner implements LoggerAwareInterface {
                                // Don't let any of the main DB slaves get backed up.
                                // This only waits for so long before exiting and letting
                                // other wikis in the farm (on different masters) get a chance.
-                               $timePassed = microtime( true ) - $lastTime;
-                               if ( $timePassed >= 5 || $timePassed < 0 ) {
-                                       if ( !wfWaitForSlaves( $lastTime, false, '*', 5 ) ) {
+                               $timePassed = microtime( true ) - $lastCheckTime;
+                               if ( $timePassed >= $checkLagPeriod || $timePassed < 0 ) {
+                                       if ( !wfWaitForSlaves( $lastCheckTime, false, '*', $maxAllowedLag ) ) {
                                                $response['reached'] = 'slave-lag-limit';
                                                break;
                                        }
-                                       $lastTime = microtime( true );
+                                       $lastCheckTime = microtime( true );
                                }
                                // Don't let any queue slaves/backups fall behind
                                if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
index 42d2a39..84cfd47 100644 (file)
@@ -108,7 +108,7 @@ class JobSpecification implements IJobSpecification {
 
                $this->type = $type;
                $this->params = $params;
-               $this->title = $title ?: Title::newMainPage();
+               $this->title = $title ?: Title::makeTitle( NS_SPECIAL, 'Badtitle/' . get_class( $this ) );
                $this->opts = $opts;
        }
 
index b550f50..cc04595 100644 (file)
@@ -46,11 +46,24 @@ class RecentChangesUpdateJob extends Job {
                );
        }
 
+       /**
+        * @return RecentChangesUpdateJob
+        * @since 1.26
+        */
+       final public static function newCacheUpdateJob() {
+               return new self(
+                       SpecialPage::getTitleFor( 'Recentchanges' ), array( 'type' => 'cacheUpdate' )
+               );
+       }
+
        public function run() {
                if ( $this->params['type'] === 'purge' ) {
                        $this->purgeExpiredRows();
+               } elseif ( $this->params['type'] === 'cacheUpdate' ) {
+                       $this->updateActiveUsers();
                } else {
-                       throw new Exception( "Invalid 'type' parameter '{$this->params['type']}'." );
+                       throw new InvalidArgumentException(
+                               "Invalid 'type' parameter '{$this->params['type']}'." );
                }
 
                return true;
@@ -78,7 +91,7 @@ class RecentChangesUpdateJob extends Job {
                        if ( $rcIds ) {
                                $dbw->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ );
                        }
-                       // No need for this to be in a transaction.
+                       // Commit in chunks to avoid slave lag
                        $dbw->commit( __METHOD__, 'flush' );
 
                        if ( count( $rcIds ) === $batchSize ) {
@@ -92,4 +105,119 @@ class RecentChangesUpdateJob extends Job {
 
                $dbw->unlock( $lockKey, __METHOD__ );
        }
+
+       protected function updateActiveUsers() {
+               global $wgActiveUserDays;
+
+               // Users that made edits at least this many days ago are "active"
+               $days = $wgActiveUserDays;
+               // Pull in the full window of active users in this update
+               $window = $wgActiveUserDays * 86400;
+
+               $dbw = wfGetDB( DB_MASTER );
+               // JobRunner uses DBO_TRX, but doesn't call begin/commit itself;
+               // onTransactionIdle() will run immediately since there is no trx.
+               $dbw->onTransactionIdle( function() use ( $dbw, $days, $window ) {
+                       // Avoid disconnect/ping() cycle that makes locks fall off
+                       $dbw->setSessionOptions( array( 'connTimeout' => 900 ) );
+
+                       $lockKey = wfWikiID() . '-activeusers';
+                       if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
+                               return false; // exclusive update (avoids duplicate entries)
+                       }
+
+                       $nowUnix = time();
+                       // Get the last-updated timestamp for the cache
+                       $cTime = $dbw->selectField( 'querycache_info',
+                               'qci_timestamp',
+                               array( 'qci_type' => 'activeusers' )
+                       );
+                       $cTimeUnix = $cTime ? wfTimestamp( TS_UNIX, $cTime ) : 1;
+
+                       // Pick the date range to fetch from. This is normally from the last
+                       // update to till the present time, but has a limited window for sanity.
+                       // If the window is limited, multiple runs are need to fully populate it.
+                       $sTimestamp = max( $cTimeUnix, $nowUnix - $days * 86400 );
+                       $eTimestamp = min( $sTimestamp + $window, $nowUnix );
+
+                       // Get all the users active since the last update
+                       $res = $dbw->select(
+                               array( 'recentchanges' ),
+                               array( 'rc_user_text', 'lastedittime' => 'MAX(rc_timestamp)' ),
+                               array(
+                                       'rc_user > 0', // actual accounts
+                                       'rc_type != ' . $dbw->addQuotes( RC_EXTERNAL ), // no wikidata
+                                       'rc_log_type IS NULL OR rc_log_type != ' . $dbw->addQuotes( 'newusers' ),
+                                       'rc_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $sTimestamp ) ),
+                                       'rc_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $eTimestamp ) )
+                               ),
+                               __METHOD__,
+                               array(
+                                       'GROUP BY' => array( 'rc_user_text' ),
+                                       'ORDER BY' => 'NULL' // avoid filesort
+                               )
+                       );
+                       $names = array();
+                       foreach ( $res as $row ) {
+                               $names[$row->rc_user_text] = $row->lastedittime;
+                       }
+
+                       // Rotate out users that have not edited in too long (according to old data set)
+                       $dbw->delete( 'querycachetwo',
+                               array(
+                                       'qcc_type' => 'activeusers',
+                                       'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
+                               ),
+                               __METHOD__
+                       );
+
+                       // Find which of the recently active users are already accounted for
+                       if ( count( $names ) ) {
+                               $res = $dbw->select( 'querycachetwo',
+                                       array( 'user_name' => 'qcc_title' ),
+                                       array(
+                                               'qcc_type' => 'activeusers',
+                                               'qcc_namespace' => NS_USER,
+                                               'qcc_title' => array_keys( $names ) ),
+                                       __METHOD__
+                               );
+                               foreach ( $res as $row ) {
+                                       unset( $names[$row->user_name] );
+                               }
+                       }
+
+                       // Insert the users that need to be added to the list
+                       if ( count( $names ) ) {
+                               $newRows = array();
+                               foreach ( $names as $name => $lastEditTime ) {
+                                       $newRows[] = array(
+                                               'qcc_type' => 'activeusers',
+                                               'qcc_namespace' => NS_USER,
+                                               'qcc_title' => $name,
+                                               'qcc_value' => wfTimestamp( TS_UNIX, $lastEditTime ),
+                                               'qcc_namespacetwo' => 0, // unused
+                                               'qcc_titletwo' => '' // unused
+                                       );
+                               }
+                               foreach ( array_chunk( $newRows, 500 ) as $rowBatch ) {
+                                       $dbw->insert( 'querycachetwo', $rowBatch, __METHOD__ );
+                                       wfWaitForSlaves();
+                               }
+                       }
+
+                       // If a transaction was already started, it might have an old
+                       // snapshot, so kludge the timestamp range back as needed.
+                       $asOfTimestamp = min( $eTimestamp, (int)$dbw->trxTimestamp() );
+
+                       // Touch the data freshness timestamp
+                       $dbw->replace( 'querycache_info',
+                               array( 'qci_type' ),
+                               array( 'qci_type' => 'activeusers',
+                                       'qci_timestamp' => $dbw->timestamp( $asOfTimestamp ) ), // not always $now
+                               __METHOD__
+                       );
+
+                       $dbw->unlock( $lockKey, __METHOD__ );
+               } );
+       }
 }
index ea5b09d..457237a 100644 (file)
  * @file
  */
 
+use Liuggio\StatsdClient\Entity\StatsdDataInterface;
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
 
+
 /**
  * A factory for application metric data.
  *
@@ -38,8 +40,8 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
                $this->prefix = $prefix;
        }
 
-       public function produceStatsdData( $key, $value = 1, $metric = self::STATSD_METRIC_COUNT ) {
-               $this->buffer[] = $entity = $this->produceStatsdDataEntity();
+       public function produceStatsdData( $key, $value = 1, $metric = StatsdDataInterface::STATSD_METRIC_COUNT ) {
+               $entity = $this->produceStatsdDataEntity();
                if ( $key !== null ) {
                        $prefixedKey = ltrim( $this->prefix . '.' . $key, '.' );
                        $entity->setKey( $prefixedKey );
@@ -50,6 +52,10 @@ class BufferingStatsdDataFactory extends StatsdDataFactory {
                if ( $metric !== null ) {
                        $entity->setMetric( $metric );
                }
+               // Don't bother buffering a counter update with a delta of zero.
+               if ( !( $metric === StatsdDataInterface::STATSD_METRIC_COUNT && !$value ) ) {
+                       $this->buffer[] = $entity;
+               }
                return $entity;
        }
 
index b0cb078..0b6db32 100644 (file)
@@ -74,11 +74,7 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
-               if ( is_string( $key ) || is_integer( $key ) ) {
-                       return array_key_exists( $key, $this->cache );
-               }
-               wfWarn( __METHOD__ . ": Key passed isn't a string or an integer.", 2 );
-               return false;
+               return array_key_exists( $key, $this->cache );
        }
 
        /**
index fb2daa6..8e5c17d 100644 (file)
@@ -58,8 +58,8 @@ class MultiHttpClient {
 
        /**
         * @param array $options
-        *   - connTimeout     : default connection timeout
-        *   - reqTimeout      : default request timeout
+        *   - connTimeout     : default connection timeout (seconds)
+        *   - reqTimeout      : default request timeout (seconds)
         *   - proxy           : HTTP proxy to use
         *   - usePipelining   : whether to use HTTP pipelining if possible (for all hosts)
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
@@ -95,8 +95,8 @@ class MultiHttpClient {
         *  </code>
         * @param array $req HTTP request array
         * @param array $opts
-        *   - connTimeout    : connection timeout per request
-        *   - reqTimeout     : post-connection timeout per request
+        *   - connTimeout    : connection timeout per request (seconds)
+        *   - reqTimeout     : post-connection timeout per request (seconds)
         * @return array Response array for request
         */
        final public function run( array $req, array $opts = array() ) {
@@ -123,8 +123,8 @@ class MultiHttpClient {
         *
         * @param array $reqs Map of HTTP request arrays
         * @param array $opts
-        *   - connTimeout     : connection timeout per request
-        *   - reqTimeout      : post-connection timeout per request
+        *   - connTimeout     : connection timeout per request (seconds)
+        *   - reqTimeout      : post-connection timeout per request (seconds)
         *   - usePipelining   : whether to use HTTP pipelining if possible
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
         * @return array $reqs With response array populated for each
index 0b791e5..5447ee7 100644 (file)
@@ -47,6 +47,7 @@ use Psr\Log\NullLogger;
 abstract class BagOStuff implements LoggerAwareInterface {
        private $debugMode = false;
 
+       /** @var integer */
        protected $lastError = self::ERR_NONE;
 
        /**
@@ -109,8 +110,9 @@ abstract class BagOStuff implements LoggerAwareInterface {
 
        /**
         * Merge changes into the existing cache value (possibly creating a new one).
-        * The callback function returns the new value given the current value (possibly false),
-        * and takes the arguments: (this BagOStuff object, cache key, current value).
+        * The callback function returns the new value given the current value
+        * (which will be false if not present), and takes the arguments:
+        * (this BagOStuff, cache key, current value).
         *
         * @param string $key
         * @param callable $callback Callback method to be executed
@@ -334,7 +336,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * Decrease stored value of $key by $value while preserving its TTL
         * @param string $key
         * @param int $value
-        * @return int
+        * @return int|bool New value or false on failure
         */
        public function decr( $key, $value = 1 ) {
                return $this->incr( $key, - $value );
@@ -383,6 +385,24 @@ abstract class BagOStuff implements LoggerAwareInterface {
                $this->lastError = $err;
        }
 
+       /**
+        * Modify a cache update operation array for EventRelayer::notify()
+        *
+        * This is used for relayed writes, e.g. for broadcasting a change
+        * to multiple data-centers. If the array contains a 'val' field
+        * then the command involves setting a key to that value. Note that
+        * for simplicity, 'val' is always a simple scalar value. This method
+        * is used to possibly serialize the value and add any cache-specific
+        * key/values needed for the relayer daemon (e.g. memcached flags).
+        *
+        * @param array $event
+        * @return array
+        * @since 1.26
+        */
+       public function modifySimpleRelayEvent( array $event ) {
+               return $event;
+       }
+
        /**
         * @param string $text
         */
index 436fed8..07ef24b 100644 (file)
@@ -168,4 +168,57 @@ class BlockLogFormatter extends LogFormatter {
 
                return $messages[$flag];
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       // While this looks wrong to be starting at 5 rather than 4, it's
+                       // because getMessageParameters uses $4 for its own purposes.
+                       '5::duration',
+                       '6:array:flags',
+                       '6::flags' => '6:array:flags',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               $subtype = $entry->getSubtype();
+               if ( $subtype === 'block' || $subtype === 'reblock' ) {
+                       // Defaults for old log entries missing some fields
+                       $params += array(
+                               '5::duration' => 'infinite',
+                               '6:array:flags' => array(),
+                       );
+
+                       if ( !is_array( $params['6:array:flags'] ) ) {
+                               $params['6:array:flags'] = $params['6:array:flags'] === ''
+                                       ? array()
+                                       : explode( ',', $params['6:array:flags'] );
+                       }
+
+                       if ( !wfIsInfinity( $params['5::duration'] ) ) {
+                               $ts = wfTimestamp( TS_UNIX, $entry->getTimestamp() );
+                               $expiry = strtotime( $params['5::duration'], $ts );
+                               if ( $expiry !== false && $expiry > 0 ) {
+                                       $params[':timestamp:expiry'] = $expiry;
+                               }
+                       }
+               }
+
+               return $params;
+       }
+
+       public function formatParametersForApi() {
+               $ret = parent::formatParametersForApi();
+               if ( isset( $ret['flags'] ) ) {
+                       ApiResult::setIndexedTagName( $ret['flags'], 'f' );
+               }
+               return $ret;
+       }
+
 }
index 4f13d37..f0598aa 100644 (file)
@@ -196,6 +196,9 @@ class DeleteLogFormatter extends LogFormatter {
                                }
                                // This is a CSV of the IDs
                                $query = $params[3];
+                               if ( is_array( $query ) ) {
+                                       $query = implode( ',', $query );
+                               }
                                // Link to each hidden object ID, $params[1] is the url param
                                $revert = Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Revisiondelete' ),
@@ -213,4 +216,67 @@ class DeleteLogFormatter extends LogFormatter {
                                return '';
                }
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = array();
+
+               $subtype = $this->entry->getSubtype();
+               if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+                       $rawParams = $entry->getParameters();
+                       if ( $subtype === 'event' ) {
+                               array_unshift( $rawParams, 'logging' );
+                       }
+
+                       static $map = array(
+                               '4::type',
+                               '5::ids',
+                               '6::ofield',
+                               '7::nfield',
+                               '4::ids' => '5::ids',
+                               '5::ofield' => '6::ofield',
+                               '6::nfield' => '7::nfield',
+                       );
+                       foreach ( $map as $index => $key ) {
+                               if ( isset( $rawParams[$index] ) ) {
+                                       $rawParams[$key] = $rawParams[$index];
+                                       unset( $rawParams[$index] );
+                               }
+                       }
+
+                       $old = $this->parseBitField( $rawParams['6::ofield'] );
+                       $new = $this->parseBitField( $rawParams['7::nfield'] );
+                       if ( !is_array( $rawParams['5::ids'] ) ) {
+                               $rawParams['5::ids'] = explode( ',', $rawParams['5::ids'] );
+                       }
+
+                       $params = array(
+                               '::type' => $rawParams['4::type'],
+                               ':array:ids' => $rawParams['5::ids'],
+                               ':assoc:old' => array( 'bitmask' => $old ),
+                               ':assoc:new' => array( 'bitmask' => $new ),
+                       );
+
+                       static $fields = array(
+                               Revision::DELETED_TEXT => 'content',
+                               Revision::DELETED_COMMENT => 'comment',
+                               Revision::DELETED_USER => 'user',
+                               Revision::DELETED_RESTRICTED => 'restricted',
+                       );
+                       foreach ( $fields as $bit => $key ) {
+                               $params[':assoc:old'][$key] = (bool)( $old & $bit );
+                               $params[':assoc:new'][$key] = (bool)( $new & $bit );
+                       }
+               }
+
+               return $params;
+       }
+
+       public function formatParametersForApi() {
+               $ret = parent::formatParametersForApi();
+               if ( isset( $ret['ids'] ) ) {
+                       ApiResult::setIndexedTagName( $ret['ids'], 'id' );
+               }
+               return $ret;
+       }
 }
index 66c2bde..b391be3 100644 (file)
@@ -115,6 +115,28 @@ abstract class LogEntryBase implements LogEntry {
        public function isLegacy() {
                return false;
        }
+
+       /**
+        * Create a blob from a parameter array
+        *
+        * @param array $params
+        * @return string
+        * @since 1.26
+        */
+       public static function makeParamBlob( $params ) {
+               return serialize( (array)$params );
+       }
+
+       /**
+        * Extract a parameter array from a blob
+        *
+        * @param string $blob
+        * @return array
+        * @since 1.26
+        */
+       public static function extractParams( $blob ) {
+               return unserialize( $blob );
+       }
 }
 
 /**
@@ -225,13 +247,13 @@ class DatabaseLogEntry extends LogEntryBase {
                if ( !isset( $this->params ) ) {
                        $blob = $this->getRawParameters();
                        wfSuppressWarnings();
-                       $params = unserialize( $blob );
+                       $params = LogEntryBase::extractParams( $blob );
                        wfRestoreWarnings();
                        if ( $params !== false ) {
                                $this->params = $params;
                                $this->legacy = false;
                        } else {
-                               $this->params = $blob === '' ? array() : explode( "\n", $blob );
+                               $this->params = LogPage::extractParams( $blob );
                                $this->legacy = true;
                        }
                }
@@ -516,7 +538,7 @@ class ManualLogEntry extends LogEntryBase {
                        'log_title' => $this->getTarget()->getDBkey(),
                        'log_page' => $this->getTarget()->getArticleID(),
                        'log_comment' => $comment,
-                       'log_params' => serialize( (array)$this->getParameters() ),
+                       'log_params' => LogEntryBase::makeParamBlob( $this->getParameters() ),
                );
                if ( isset( $this->deleted ) ) {
                        $data['log_deleted'] = $this->deleted;
@@ -584,7 +606,7 @@ class ManualLogEntry extends LogEntryBase {
                        $this->getSubtype(),
                        $this->getTarget(),
                        $this->getComment(),
-                       serialize( (array)$this->getParameters() ),
+                       LogEntryBase::makeParamBlob( $this->getParameters() ),
                        $newId,
                        $formatter->getIRCActionComment() // Used for IRC feeds
                );
index cf9fb53..9c2fdd3 100644 (file)
@@ -472,7 +472,9 @@ class LogFormatter {
                                continue;
                        }
                        list( $index, $type, ) = explode( ':', $key, 3 );
-                       $params[$index - 1] = $this->formatParameterValue( $type, $value );
+                       if ( ctype_digit( $index ) ) {
+                               $params[$index - 1] = $this->formatParameterValue( $type, $value );
+                       }
                }
 
                /* Message class doesn't like non consecutive numbering.
@@ -540,8 +542,8 @@ class LogFormatter {
         *     * title-link: The value is a page title,
         *                   returns link to this page
         *     * number: Format value as number
-        * @param string $value The parameter value that should
-        *                      be formated
+        *     * list: Format value as a comma-separated list
+        * @param mixed $value The parameter value that should be formatted
         * @return string|array Formated value
         * @since 1.21
         */
@@ -552,6 +554,9 @@ class LogFormatter {
                        case 'raw':
                                $value = Message::rawParam( $value );
                                break;
+                       case 'list':
+                               $value = $this->context->getLanguage()->commaList( $value );
+                               break;
                        case 'msg':
                                $value = $this->msg( $value )->text();
                                break;
@@ -728,6 +733,120 @@ class LogFormatter {
                // problems with extensions
                return $this->getMessageParameters();
        }
+
+       /**
+        * Get the array of parameters, converted from legacy format if necessary.
+        * @since 1.25
+        * @return array
+        */
+       protected function getParametersForApi() {
+               return $this->entry->getParameters();
+       }
+
+       /**
+        * Format parameters for API output
+        *
+        * The result array should generally map named keys to values. Index and
+        * type should be omitted, e.g. "4::foo" should be returned as "foo" in the
+        * output. Values should generally be unformatted.
+        *
+        * Renames or removals of keys besides from the legacy numeric format to
+        * modern named style should be avoided. Any renames should be announced to
+        * the mediawiki-api-announce mailing list.
+        *
+        * @since 1.25
+        * @return array
+        */
+       public function formatParametersForApi() {
+               $logParams = array();
+               foreach ( $this->getParametersForApi() as $key => $value ) {
+                       $vals = explode( ':', $key, 3 );
+                       if ( count( $vals ) !== 3 ) {
+                               $logParams[$key] = $value;
+                               continue;
+                       }
+                       $logParams += $this->formatParameterValueForApi( $vals[2], $vals[1], $value );
+               }
+               ApiResult::setIndexedTagName( $logParams, 'param' );
+               ApiResult::setArrayType( $logParams, 'assoc' );
+
+               return $logParams;
+       }
+
+       /**
+        * Format a single parameter value for API output
+        *
+        * @since 1.25
+        * @param string $name
+        * @param string $type
+        * @param string $value
+        * @return array
+        */
+       protected function formatParameterValueForApi( $name, $type, $value ) {
+               $type = strtolower( trim( $type ) );
+               switch ( $type ) {
+                       case 'bool':
+                               $value = (bool)$value;
+                               break;
+
+                       case 'number':
+                               if ( ctype_digit( $value ) ) {
+                                       $value = (int)$value;
+                               } else {
+                                       $value = (float)$value;
+                               }
+                               break;
+
+                       case 'array':
+                       case 'assoc':
+                       case 'kvp':
+                               if ( is_array( $value ) ) {
+                                       ApiResult::setArrayType( $value, $type );
+                               }
+                               break;
+
+                       case 'timestamp':
+                               $value = wfTimestamp( TS_ISO_8601, $value );
+                               break;
+
+                       case 'msg':
+                       case 'msg-content':
+                               $msg = $this->msg( $value );
+                               if ( $type === 'msg-content' ) {
+                                       $msg->inContentLanguage();
+                               }
+                               $value = array();
+                               $value["{$name}_key"] = $msg->getKey();
+                               if ( $msg->getParams() ) {
+                                       $value["{$name}_params"] = $msg->getParams();
+                               }
+                               $value["{$name}_text"] = $msg->text();
+                               return $value;
+
+                       case 'title':
+                       case 'title-link':
+                               $title = Title::newFromText( $value );
+                               if ( $title ) {
+                                       $value = array();
+                                       ApiQueryBase::addTitleInfo( $value, $title, "{$name}_" );
+                               }
+                               return $value;
+
+                       case 'user':
+                       case 'user-link':
+                               $user = User::newFromName( $value );
+                               if ( $user ) {
+                                       $value = $user->getName();
+                               }
+                               break;
+
+                       default:
+                               // do nothing
+                               break;
+               }
+
+               return array( $name => $value );
+       }
 }
 
 /**
index 6763dbd..36e383b 100644 (file)
@@ -68,4 +68,24 @@ class MergeLogFormatter extends LogFormatter {
 
                return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       '4:title:dest',
+                       '5:timestamp:mergepoint',
+                       '4::dest' => '4:title:dest',
+                       '5::mergepoint' => '5:timestamp:mergepoint',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               return $params;
+       }
 }
index 35da113..7f5e9ef 100644 (file)
@@ -85,4 +85,29 @@ class MoveLogFormatter extends LogFormatter {
 
                return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       '4:title:target',
+                       '5:bool:suppressredirect',
+                       '4::target' => '4:title:target',
+                       '5::noredir' => '5:bool:suppressredirect',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               if ( !isset( $params['5:bool:suppressredirect'] ) ) {
+                       $params['5:bool:suppressredirect'] = false;
+               }
+
+               return $params;
+       }
+
 }
index 2abaf17..0033743 100644 (file)
@@ -62,4 +62,24 @@ class PatrolLogFormatter extends LogFormatter {
 
                return $params;
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       '4::curid',
+                       '5::previd',
+                       '6:bool:auto',
+                       '6::auto' => '6:bool:auto',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               return $params;
+       }
 }
index ac252ae..352bda5 100644 (file)
@@ -67,20 +67,8 @@ class RightsLogFormatter extends LogFormatter {
                        return $params;
                }
 
-               $oldGroups = $params[3];
-               $newGroups = $params[4];
-
-               // Less old entries
-               if ( $oldGroups === '' ) {
-                       $oldGroups = array();
-               } elseif ( is_string( $oldGroups ) ) {
-                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
-               }
-               if ( $newGroups === '' ) {
-                       $newGroups = array();
-               } elseif ( is_string( $newGroups ) ) {
-                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
-               }
+               $oldGroups = $this->makeGroupArray( $params[3] );
+               $newGroups = $this->makeGroupArray( $params[4] );
 
                $userName = $this->entry->getTarget()->getText();
                if ( !$this->plaintext && count( $oldGroups ) ) {
@@ -110,4 +98,53 @@ class RightsLogFormatter extends LogFormatter {
 
                return $params;
        }
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       '4:array:oldgroups',
+                       '5:array:newgroups',
+                       '4::oldgroups' => '4:array:oldgroups',
+                       '5::newgroups' => '5:array:newgroups',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               // Really old entries does not have log params
+               if ( isset( $params['4:array:oldgroups'] ) ) {
+                       $params['4:array:oldgroups'] = $this->makeGroupArray( $params['4:array:oldgroups'] );
+               }
+               if ( isset( $params['5:array:newgroups'] ) ) {
+                       $params['5:array:newgroups'] = $this->makeGroupArray( $params['5:array:newgroups'] );
+               }
+
+               return $params;
+       }
+
+       public function formatParametersForApi() {
+               $ret = parent::formatParametersForApi();
+               if ( isset( $ret['oldgroups'] ) ) {
+                       ApiResult::setIndexedTagName( $ret['oldgroups'], 'g' );
+               }
+               if ( isset( $ret['newgroups'] ) ) {
+                       ApiResult::setIndexedTagName( $ret['newgroups'], 'g' );
+               }
+               return $ret;
+       }
+
+       private function makeGroupArray( $group ) {
+               // Migrate old group params from string to array
+               if ( $group === '' ) {
+                       $group = array();
+               } elseif ( is_string( $group ) ) {
+                       $group = array_map( 'trim', explode( ',', $group ) );
+               }
+               return $group;
+       }
 }
diff --git a/includes/logging/TagLogFormatter.php b/includes/logging/TagLogFormatter.php
new file mode 100644 (file)
index 0000000..5a58c33
--- /dev/null
@@ -0,0 +1,49 @@
+<?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
+ */
+
+/**
+ * This class formats tag log entries.
+ *
+ * Parameters (one-based indexes):
+ * 4::revid
+ * 5::logid
+ * 6:list:tagsAdded
+ * 7:number:tagsAddedCount
+ * 8:list:tagsRemoved
+ * 9:number:tagsRemovedCount
+ *
+ * @since 1.25
+ */
+class TagLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+
+               $add = ( isset( $params[6] ) && isset( $params[6]['num'] ) && $params[6]['num'] );
+               $remove = ( isset( $params[8] ) && isset( $params[8]['num'] ) && $params[8]['num'] );
+               $key .= ( $remove ? ( $add ? '' : '-remove' ) : '-add' );
+
+               if ( isset( $params[4] ) && $params[4] ) {
+                       $key .= '-logentry';
+               } else {
+                       $key .= '-revision';
+               }
+
+               return $key;
+       }
+}
diff --git a/includes/logging/UploadLogFormatter.php b/includes/logging/UploadLogFormatter.php
new file mode 100644 (file)
index 0000000..52961dc
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Formatter for upload log entries.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.25
+ */
+
+/**
+ * This class formats upload log entries.
+ *
+ * @since 1.25
+ */
+class UploadLogFormatter extends LogFormatter {
+
+       protected function getParametersForApi() {
+               $entry = $this->entry;
+               $params = $entry->getParameters();
+
+               static $map = array(
+                       'img_timestamp' => ':timestamp:img_timestamp',
+               );
+               foreach ( $map as $index => $key ) {
+                       if ( isset( $params[$index] ) ) {
+                               $params[$key] = $params[$index];
+                               unset( $params[$index] );
+                       }
+               }
+
+               return $params;
+       }
+
+}
index 8fdfa47..b505280 100644 (file)
@@ -307,9 +307,9 @@ class SvgHandler extends ImageHandler {
         */
        function getImageSize( $file, $path, $metadata = false ) {
                if ( $metadata === false ) {
-                       $metadata = $file->getMetaData();
+                       $metadata = $file->getMetadata();
                }
-               $metadata = $this->unpackMetaData( $metadata );
+               $metadata = $this->unpackMetadata( $metadata );
 
                if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
                        return array( $metadata['width'], $metadata['height'], 'SVG',
index 07b2495..243e280 100644 (file)
@@ -72,6 +72,7 @@ text/tab-separated-values     [TEXT]
 application/zip application/x-zip      [ARCHIVE]
 application/x-gzip     [ARCHIVE]
 application/x-bzip     [ARCHIVE]
+application/x-bzip2    [ARCHIVE]
 application/x-tar      [ARCHIVE]
 application/x-stuffit  [ARCHIVE]
 application/x-opc+zip  [ARCHIVE]
index 75017db..210610a 100644 (file)
@@ -21,7 +21,8 @@ application/vnd.wap.wmlc wmlc
 application/vnd.wap.wmlscriptc wmlsc
 application/voicexml+xml vxml
 application/x-bcpio bcpio
-application/x-bzip gz bz2
+application/x-bzip bz
+application/x-bzip2 bz2
 application/x-cdlink vcd
 application/x-chess-pgn pgn
 application/x-cpio cpio
index 83bee70..eeca9b1 100644 (file)
@@ -183,4 +183,12 @@ class MemcachedBagOStuff extends BagOStuff {
        protected function debugLog( $text ) {
                $this->logger->debug( $text );
        }
+
+       public function modifySimpleRelayEvent( array $event ) {
+               if ( array_key_exists( 'val', $event ) ) {
+                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
+               }
+
+               return $event;
+       }
 }
index 2e47e24..301336f 100644 (file)
@@ -29,7 +29,10 @@ use MediaWiki\Logger\LoggerFactory;
  * @ingroup Cache
  */
 class ObjectCache {
+       /** @var Array Map of (id => BagOStuff) */
        public static $instances = array();
+       /** @var Array Map of (id => WANObjectCache) */
+       public static $wanInstances = array();
 
        /**
         * Get a cached instance of the specified type of cache object.
@@ -48,11 +51,29 @@ class ObjectCache {
                return $object;
        }
 
+       /**
+        * Get a cached instance of the specified type of cache object.
+        *
+        * @param string $id
+        *
+        * @return WANObjectCache
+        */
+       static function getWANInstance( $id ) {
+               if ( isset( self::$wanInstances[$id] ) ) {
+                       return self::$wanInstances[$id];
+               }
+
+               $object = self::newWANCacheFromId( $id );
+               self::$wanInstances[$id] = $object;
+               return $object;
+       }
+
        /**
         * Clear all the cached instances.
         */
        static function clear() {
                self::$instances = array();
+               self::$wanInstances = array();
        }
 
        /**
@@ -167,4 +188,29 @@ class ObjectCache {
        static function newMemcached( $params ) {
                return new MemcachedPhpBagOStuff( $params );
        }
+
+       /**
+        * Create a new cache object of the specified type
+        *
+        * @param string $id
+        *
+        * @throws MWException
+        * @return WANObjectCache
+        */
+       static function newWANCacheFromId( $id ) {
+               global $wgWANObjectCaches;
+
+               if ( !isset( $wgWANObjectCaches[$id] ) ) {
+                       throw new MWException( "Invalid object cache type \"$id\" requested. " .
+                               "It is not present in \$wgWANObjectCaches." );
+               }
+
+               $params = $wgWANObjectCaches[$id];
+               $class = $params['relayerConfig']['class'];
+               $params['relayer'] = new $class( $params['relayerConfig'] );
+               $params['cache'] = self::newFromId( $params['cacheId'] );
+               $class = $params['class'];
+
+               return new $class( $params );
+       }
 }
index de3511d..9d5d0ef 100644 (file)
@@ -25,6 +25,8 @@ class RedisBagOStuff extends BagOStuff {
        protected $redisPool;
        /** @var array List of server names */
        protected $servers;
+       /** @var array Map of (tag => server name) */
+       protected $serverTagMap;
        /** @var bool */
        protected $automaticFailover;
 
@@ -34,7 +36,8 @@ class RedisBagOStuff extends BagOStuff {
         *   - servers: An array of server names. A server name may be a hostname,
         *     a hostname/port combination or the absolute path of a UNIX socket.
         *     If a hostname is specified but no port, the standard port number
-        *     6379 will be used. Required.
+        *     6379 will be used. Arrays keys can be used to specify the tag to
+        *     hash on in place of the host/port. Required.
         *
         *   - connectTimeout: The timeout for new connections, in seconds. Optional,
         *     default is 1 second.
@@ -66,6 +69,10 @@ class RedisBagOStuff extends BagOStuff {
                $this->redisPool = RedisConnectionPool::singleton( $redisConf );
 
                $this->servers = $params['servers'];
+               foreach ( $this->servers as $key => $server ) {
+                       $this->serverTagMap[is_int( $key ) ? $server : $key] = $server;
+               }
+
                if ( isset( $params['automaticFailover'] ) ) {
                        $this->automaticFailover = $params['automaticFailover'];
                } else {
@@ -324,6 +331,14 @@ class RedisBagOStuff extends BagOStuff {
                return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
        }
 
+       public function modifySimpleRelayEvent( array $event ) {
+               if ( array_key_exists( 'val', $event ) ) {
+                       $event['val'] = serialize( $event['val'] ); // this class uses PHP serialization
+               }
+
+               return $event;
+       }
+
        /**
         * @param mixed $data
         * @return string
@@ -348,23 +363,25 @@ class RedisBagOStuff extends BagOStuff {
         * @return array (server, RedisConnRef) or (false, false)
         */
        protected function getConnection( $key ) {
-               if ( count( $this->servers ) === 1 ) {
-                       $candidates = $this->servers;
-               } else {
-                       $candidates = $this->servers;
+               $candidates = array_keys( $this->serverTagMap );
+
+               if ( count( $this->servers ) > 1 ) {
                        ArrayUtils::consistentHashSort( $candidates, $key, '/' );
                        if ( !$this->automaticFailover ) {
                                $candidates = array_slice( $candidates, 0, 1 );
                        }
                }
 
-               foreach ( $candidates as $server ) {
+               foreach ( $candidates as $tag ) {
+                       $server = $this->serverTagMap[$tag];
                        $conn = $this->redisPool->getConnection( $server );
                        if ( $conn ) {
                                return array( $server, $conn );
                        }
                }
+
                $this->setLastError( BagOStuff::ERR_UNREACHABLE );
+
                return array( false, false );
        }
 
diff --git a/includes/objectcache/WANObjectCache.php b/includes/objectcache/WANObjectCache.php
new file mode 100755 (executable)
index 0000000..6e5cad6
--- /dev/null
@@ -0,0 +1,600 @@
+<?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 Cache
+ * @author Aaron Schulz
+ */
+
+/**
+ * Multi-datacenter aware caching interface
+ *
+ * All operations go to the local cache, except the delete()
+ * and touchCheckKey(), which broadcast to all clusters.
+ * This class is intended for caching data from primary stores.
+ * If the get() method does not return a value, then the caller
+ * should query the new value and backfill the cache using set().
+ * When the source data changes, the delete() method should be called.
+ * Since delete() is expensive, it should be avoided. One can do so if:
+ *   - a) The object cached is immutable; or
+ *   - b) Validity is checked against the source after get(); or
+ *   - c) Using a modest TTL is reasonably correct and performant
+ * Consider using getWithSetCallback() instead of the get()/set() cycle.
+ *
+ * Instances of this class must be configured to point to a valid
+ * PubSub endpoint, and there must be listeners on the cache servers
+ * that subscribe to the endpoint and update the caches.
+ *
+ * Broadcasted operations like delete() and touchCheckKey() are done
+ * synchronously in the local cluster, but are relayed asynchronously.
+ * This means that callers in other datacenters will see older values
+ * for a however many milliseconds the datacenters are apart. As with
+ * any cache, this should not be relied on for cases where reads are
+ * used to determine writes to source (e.g. non-cache) data stores.
+ *
+ * All values are wrapped in metadata arrays. Keys use a "WANCache:" prefix
+ * to avoid collisions with keys that are not wrapped as metadata arrays. The
+ * prefixes are as follows:
+ *   - a) "WANCache:v" : used for regular value keys
+ *   - b) "WANCache:s" : used for temporarily storing values of tombstoned keys
+ *   - c) "WANCache:t" : used for storing timestamp "check" keys
+ *
+ * @ingroup Cache
+ * @since 1.26
+ */
+class WANObjectCache {
+       /** @var BagOStuff The local cluster cache */
+       protected $cache;
+       /** @var string Cache pool name */
+       protected $pool;
+       /** @var EventRelayer */
+       protected $relayer;
+
+       /** @var int */
+       protected $lastRelayError = self::ERR_NONE;
+
+       /** Seconds to tombstone keys on delete() */
+       const HOLDOFF_TTL = 10;
+       /** Seconds to keep dependency purge keys around */
+       const CHECK_KEY_TTL = 31536000; // 1 year
+       /** Seconds to keep lock keys around */
+       const LOCK_TTL = 5;
+
+       /** Cache format version number */
+       const VERSION = 1;
+
+       /** Fields of value holder arrays */
+       const FLD_VERSION = 0;
+       const FLD_VALUE = 1;
+       const FLD_TTL = 2;
+       const FLD_TIME = 3;
+
+       /** 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
+       const ERR_RELAY = 4; // relay broadcast failed
+
+       const VALUE_KEY_PREFIX = 'WANCache:v:';
+       const STASH_KEY_PREFIX = 'WANCache:s:';
+       const TIME_KEY_PREFIX = 'WANCache:t:';
+
+       const PURGE_VAL_PREFIX = 'PURGED:';
+
+       /**
+        * @param array $params
+        *   - cache   : BagOStuff object
+        *   - pool    : pool name
+        *   - relayer : EventRelayer object
+        */
+       public function __construct( array $params ) {
+               $this->cache = $params['cache'];
+               $this->pool = $params['pool'];
+               $this->relayer = $params['relayer'];
+       }
+
+       /**
+        * Fetch the value of a key from cache
+        *
+        * If passed in, $curTTL is set to the remaining TTL (current time left):
+        *   - a) INF; if the key exists and has no TTL
+        *   - b) float (>=0); if the key exists and has a TTL
+        *   - c) float (<0); if the key is tombstoned or expired by $checkKeys
+        *   - d) null; if the key does not exist and is not tombstoned
+        *
+        * If a key is tombstoned, $curTTL will reflect the time since delete().
+        *
+        * The timestamp of $key will be checked against the last-purge timestamp
+        * of each of $checkKeys. Those $checkKeys not in cache will have the last-purge
+        * initialized to the current timestamp. If any of $checkKeys have a timestamp
+        * greater than that of $key, then $curTTL will reflect how long ago $key
+        * became invalid. Callers can use $curTTL to know when the value is stale.
+        * The $checkKeys parameter allow mass invalidations by updating a single key:
+        *   - a) Each "check" key represents "last purged" of some source data
+        *   - b) Callers pass in relevant "check" keys as $checkKeys in get()
+        *   - c) When the source data that "check" keys represent changes,
+        *        the touchCheckKey() method is called on them
+        *
+        * For keys that are hot/expensive, consider using getWithSetCallback() instead.
+        *
+        * @param string $key Cache key
+        * @param mixed $curTTL Approximate TTL left on the key if present [returned]
+        * @param array $checkKeys List of "check" keys
+        * @return mixed Value of cache key or false on failure
+        */
+       final public function get( $key, &$curTTL = null, array $checkKeys = array() ) {
+               $curTTLs = array();
+               $values = $this->getMulti( array( $key ), $curTTLs, $checkKeys );
+               $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
+
+               return isset( $values[$key] ) ? $values[$key] : false;
+       }
+
+       /**
+        * Fetch the value of several keys from cache
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param array $keys List of cache keys
+        * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
+        * @param array $checkKeys List of "check" keys
+        * @return array Map of (key => value) for keys that exist
+        */
+       final public function getMulti(
+               array $keys, &$curTTLs = array(), array $checkKeys = array()
+       ) {
+               $result = array();
+               $curTTLs = array();
+
+               $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
+               $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
+               $checkKeys = self::prefixCacheKeys( $checkKeys, self::TIME_KEY_PREFIX );
+
+               // Fetch all of the raw values
+               $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeys ) );
+               $now = microtime( true );
+
+               // Get/initialize the timestamp of all the "check" keys
+               $checkKeyTimes = array();
+               foreach ( $checkKeys as $checkKey ) {
+                       $timestamp = isset( $wrappedValues[$checkKey] )
+                               ? self::parsePurgeValue( $wrappedValues[$checkKey] )
+                               : false;
+                       if ( !is_float( $timestamp ) ) {
+                               // Key is not set or invalid; regenerate
+                               $this->cache->add( $checkKey,
+                                       self::PURGE_VAL_PREFIX . $now, self::CHECK_KEY_TTL );
+                               $timestamp = $now;
+                       }
+
+                       $checkKeyTimes[] = $timestamp;
+               }
+
+               // Get the main cache value for each key and validate them
+               foreach ( $valueKeys as $vKey ) {
+                       if ( !isset( $wrappedValues[$vKey] ) ) {
+                               continue; // not found
+                       }
+
+                       $key = substr( $vKey, $vPrefixLen ); // unprefix
+
+                       list( $value, $curTTL ) = $this->unwrap( $wrappedValues[$vKey], $now );
+                       if ( $value !== false ) {
+                               $result[$key] = $value;
+                               foreach ( $checkKeyTimes as $checkKeyTime ) {
+                                       // Force dependant keys to be invalid for a while after purging
+                                       // to reduce race conditions involving stale data getting cached
+                                       $safeTimestamp = $checkKeyTime + self::HOLDOFF_TTL;
+                                       if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
+                                               $curTTL = min( $curTTL, $checkKeyTime - $now );
+                                       }
+                               }
+                       }
+
+                       $curTTLs[$key] = $curTTL;
+               }
+
+               return $result;
+       }
+
+       /**
+        * Set the value of a key from cache
+        *
+        * Simply calling this method when source data changes is not valid because
+        * the changes do not replicate to the other WAN sites. In that case, delete()
+        * should be used instead. This method is intended for use on cache misses.
+        *
+        * @param string $key Cache key
+        * @param mixed $value
+        * @param integer $ttl Seconds to live [0=forever]
+        * @return bool Success
+        */
+       final public function set( $key, $value, $ttl = 0 ) {
+               $key = self::VALUE_KEY_PREFIX . $key;
+               $wrapped = $this->wrap( $value, $ttl );
+
+               $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
+                       return ( is_string( $cWrapped ) )
+                               ? false // key is tombstoned; do nothing
+                               : $wrapped;
+               };
+
+               return $this->cache->merge( $key, $func, $ttl, 1 );
+       }
+
+       /**
+        * Purge a key from all clusters
+        *
+        * This instantiates a hold-off period where the key cannot be
+        * written to avoid race conditions where dependent keys get updated
+        * with a stale value (e.g. from a DB slave).
+        *
+        * This should only be called when the underlying data (being cached)
+        * changes in a significant way. If called twice on the same key, then
+        * the last TTL takes precedence.
+        *
+        * @param string $key Cache key
+        * @param integer $ttl How long to block writes to the key [seconds]
+        * @return bool True if the item was purged or not found, false on failure
+        */
+       final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
+               $key = self::VALUE_KEY_PREFIX . $key;
+               // Update the local cluster immediately
+               $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
+               // Publish the purge to all clusters
+               return $this->relayPurge( $key, $ttl ) && $ok;
+       }
+
+       /**
+        * Fetch the value of a timestamp "check" key
+        *
+        * @param string $key
+        * @return float|bool TS_UNIX timestamp of the key; false if not present
+        */
+       final public function getCheckKeyTime( $key ) {
+               return self::parsePurgeValue( $this->cache->get( self::TIME_KEY_PREFIX . $key ) );
+       }
+
+       /**
+        * Purge a "check" key from all clusters, invalidating keys that use it
+        *
+        * This should only be called when the underlying data (being cached)
+        * changes in a significant way, and it is impractical to call delete()
+        * on all keys that should be changed. When get() is called on those
+        * keys, the relevant "check" keys must be supplied for this to work.
+        *
+        * The "check" key essentially represents a last-modified field.
+        * It is set in the future a few seconds when this is called, to
+        * avoid race conditions where dependent keys get updated with a
+        * stale value (e.g. from a DB slave).
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param string $key Cache key
+        * @return bool True if the item was purged or not found, false on failure
+        */
+       final public function touchCheckKey( $key ) {
+               $key = self::TIME_KEY_PREFIX . $key;
+               // Update the local cluster immediately
+               $ok = $this->cache->set( $key,
+                       self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
+               // Publish the purge to all clusters
+               return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
+       }
+
+       /**
+        * Method to fetch/regenerate cache keys
+        *
+        * On cache miss, the key will be set to the callback result.
+        * The callback function returns the new value given the current
+        * value (false if not present). If false is returned, then nothing
+        * will be saved to cache.
+        *
+        * Most callers should ignore the current value, but it can be used
+        * to maintain "most recent X" values that come from time or sequence
+        * based source data, provided that the "as of" id/time is tracked.
+        *
+        * Usage of $checkKeys is the same as with get().
+        *
+        * The simplest way to avoid stampedes for hot keys is to use
+        * the 'lockTSE' option in $opts. If cache purges are needed, also:
+        *   a) Pass $key into $checkKeys
+        *   b) Use touchCheckKey( $key ) instead of delete( $key )
+        * Following this pattern lets the old cache be used until a
+        * single thread updates it as needed. Also consider tweaking
+        * the 'lowTTL' parameter.
+        *
+        * Example usage:
+        * <code>
+        *     $key = wfMemcKey( 'cat-recent-actions', $catId );
+        *     // Function that derives the new key value given the old value
+        *     $callback = function( $cValue ) { ... };
+        *     // Get the key value from cache or from source on cache miss;
+        *     // try to only let one cluster thread manage doing cache updates
+        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
+        *     $value = $cache->getWithSetCallback( $key, $callback, 60, array(), $opts );
+        * </code>
+        *
+        * Example usage:
+        * <code>
+        *     $key = wfMemcKey( 'cat-state', $catId );
+        *     // The "check" keys that represent things the value depends on;
+        *     // Calling touchCheckKey() on them invalidates "cat-state"
+        *     $checkKeys = array(
+        *         wfMemcKey( 'water-bowls', $houseId ),
+        *         wfMemcKey( 'food-bowls', $houseId ),
+        *         wfMemcKey( 'people-present', $houseId )
+        *     );
+        *     // Function that derives the new key value
+        *     $callback = function() { ... };
+        *     // Get the key value from cache or from source on cache miss;
+        *     // try to only let one cluster thread manage doing cache updates
+        *     $opts = array( 'lockTSE' => 5, 'lowTTL' => 10 );
+        *     $value = $cache->getWithSetCallback( $key, $callback, 60, $checkKeys, $opts );
+        * </code>
+        *
+        * @see WANObjectCache::get()
+        *
+        * @param string $key Cache key
+        * @param callable $callback Value generation function
+        * @param integer $ttl Seconds to live when the key is updated [0=forever]
+        * @param array $checkKeys List of "check" keys
+        * @param array $opts Options map:
+        *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
+        *               of the key is less than this. It becomes more likely
+        *               over time, becoming a certainty once the key is expired.
+        *   - lockTSE : if the key is tombstoned or expired less (by $checkKeys)
+        *               than this many seconds ago, then try to have a single
+        *               thread handle cache regeneration at any given time.
+        *               Other threads will try to use stale values if possible.
+        *   - tempTTL : when 'lockTSE' is set, this determines the TTL of the temp
+        *               key used to cache values while a key is tombstoned.
+        *               This avoids excessive regeneration of hot keys on delete() but
+        *               may result in stale values.
+        * @return mixed Value to use for the key
+        */
+       final public function getWithSetCallback(
+               $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
+       ) {
+               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( 10, $ttl );
+               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : -1;
+               $tempTTL = isset( $opts['tempTTL'] ) ? $opts['tempTTL'] : 5;
+
+               // Get the current key value
+               $curTTL = null;
+               $cValue = $this->get( $key, $curTTL, $checkKeys ); // current value
+               $value = $cValue; // return value
+
+               // Determine if a regeneration is desired
+               if ( $value !== false && $curTTL > 0 && !$this->worthRefresh( $curTTL, $lowTTL ) ) {
+                       return $value;
+               }
+
+               if ( !is_callable( $callback ) ) {
+                       throw new InvalidArgumentException( "Invalid cache miss callback provided." );
+               }
+
+               // Assume a key is hot if requested soon after invalidation
+               $isHot = ( $curTTL !== null && $curTTL <= 0 && abs( $curTTL ) <= $lockTSE );
+               $isTombstone = ( $curTTL !== null && $value === false );
+
+               $locked = false;
+               if ( $isHot || $isTombstone ) {
+                       // Acquire a cluster-local non-blocking lock
+                       if ( $this->cache->lock( $key, 0, self::LOCK_TTL ) ) {
+                               // Lock acquired; this thread should update the key
+                               $locked = true;
+                       } elseif ( $value !== false ) {
+                               // If it cannot be acquired; then the stale value can be used
+                               return $value;
+                       } else {
+                               // Either another thread has the lock or the lock failed.
+                               // Use the stash value, which is likely from the prior thread.
+                               $value = $this->cache->get( self::STASH_KEY_PREFIX . $key );
+                               // Regenerate on timeout or if the other thread failed
+                               if ( $value !== false ) {
+                                       return $value;
+                               }
+                       }
+               }
+
+               // Generate the new value from the callback...
+               $value = call_user_func( $callback, $cValue );
+               // When delete() is called, writes are write-holed by the tombstone,
+               // so use a special stash key to pass the new value around threads.
+               if ( $value !== false && ( $isHot || $isTombstone ) ) {
+                       $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
+               }
+
+               if ( $locked ) {
+                       $this->cache->unlock( $key );
+               }
+
+               if ( $value !== false ) {
+                       // Update the cache; this will fail if the key is tombstoned
+                       $this->set( $key, $value, $ttl );
+               }
+
+               return $value;
+       }
+
+       /**
+        * Get the "last error" registered; clearLastError() should be called manually
+        * @return int ERR_* constant for the "last error" registry
+        */
+       final public function getLastError() {
+               if ( $this->lastRelayError ) {
+                       // If the cache and the relayer failed, focus on the later.
+                       // An update not making it to the relayer means it won't show up
+                       // in other DCs (nor will consistent re-hashing see up-to-date values).
+                       // On the other hand, if just the cache update failed, then it should
+                       // eventually be applied by the relayer.
+                       return $this->lastRelayError;
+               }
+
+               $code = $this->cache->getLastError();
+               switch ( $code ) {
+                       case BagOStuff::ERR_NONE:
+                               return self::ERR_NONE;
+                       case BagOStuff::ERR_NO_RESPONSE:
+                               return self::ERR_NO_RESPONSE;
+                       case BagOStuff::ERR_UNREACHABLE:
+                               return self::ERR_UNREACHABLE;
+                       default:
+                               return self::ERR_UNEXPECTED;
+               }
+       }
+
+       /**
+        * Clear the "last error" registry
+        */
+       final public function clearLastError() {
+               $this->cache->clearLastError();
+               $this->lastRelayError = self::ERR_NONE;
+       }
+
+       /**
+        * Do the actual async bus purge of a key
+        *
+        * This must set the key to "PURGED:<UNIX timestamp>"
+        *
+        * @param string $key Cache key
+        * @param integer $ttl How long to keep the tombstone [seconds]
+        * @return bool Success
+        */
+       protected function relayPurge( $key, $ttl ) {
+               $event = $this->cache->modifySimpleRelayEvent( array(
+                       'cmd' => 'set',
+                       'key' => $key,
+                       'val' => 'PURGED:$UNIXTIME$',
+                       'ttl' => max( $ttl, 1 ),
+                       'sbt' => true, // substitute $UNIXTIME$ with actual microtime
+               ) );
+
+               $ok = $this->relayer->notify( "{$this->pool}:purge", $event );
+               if ( !$ok ) {
+                       $this->lastRelayError = self::ERR_RELAY;
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Check if a key should be regenerated (using random probability)
+        *
+        * This returns false if $curTTL >= $lowTTL. Otherwise, the chance
+        * of returning true increases steadily from 0% to 100% as the $curTTL
+        * moves from $lowTTL to 0 seconds. This handles widely varying
+        * levels of cache access traffic.
+        *
+        * @param float|INF $curTTL Approximate TTL left on the key if present
+        * @param float $lowTTL Consider a refresh when $curTTL is less than this
+        * @return bool
+        */
+       protected function worthRefresh( $curTTL, $lowTTL ) {
+               if ( $curTTL >= $lowTTL ) {
+                       return false;
+               } elseif ( $curTTL <= 0 ) {
+                       return true;
+               }
+
+               $chance = ( 1 - $curTTL / $lowTTL );
+
+               return mt_rand( 1, 1e9 ) <= 1e9 * $chance;
+       }
+
+       /**
+        * Do not use this method outside WANObjectCache
+        *
+        * @param mixed $value
+        * @param integer $ttl [0=forever]
+        * @return string
+        */
+       protected function wrap( $value, $ttl ) {
+               return array(
+                       self::FLD_VERSION => self::VERSION,
+                       self::FLD_VALUE => $value,
+                       self::FLD_TTL => $ttl,
+                       self::FLD_TIME => microtime( true )
+               );
+       }
+
+       /**
+        * Do not use this method outside WANObjectCache
+        *
+        * @param array|string|bool $wrapped
+        * @param float $now Unix Current timestamp (preferrable pre-query)
+        * @return array (mixed; false if absent/invalid, current time left)
+        */
+       protected function unwrap( $wrapped, $now ) {
+               // Check if the value is a tombstone
+               $purgeTimestamp = self::parsePurgeValue( $wrapped );
+               if ( is_float( $purgeTimestamp ) ) {
+                       // Purged values should always have a negative current $ttl
+                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
+                       return array( false, $curTTL );
+               }
+
+               if ( !is_array( $wrapped ) // not found
+                       || !isset( $wrapped[self::FLD_VERSION] ) // wrong format
+                       || $wrapped[self::FLD_VERSION] !== self::VERSION // wrong version
+               ) {
+                       return array( false, null );
+               }
+
+               if ( $wrapped[self::FLD_TTL] > 0 ) {
+                       // Get the approximate time left on the key
+                       $age = $now - $wrapped[self::FLD_TIME];
+                       $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
+               } else {
+                       // Key had no TTL, so the time left is unbounded
+                       $curTTL = INF;
+               }
+
+               return array( $wrapped[self::FLD_VALUE], $curTTL );
+       }
+
+       /**
+        * @param array $keys
+        * @param string $prefix
+        * @return string
+        */
+       protected static function prefixCacheKeys( array $keys, $prefix ) {
+               $res = array();
+               foreach ( $keys as $key ) {
+                       $res[] = $prefix . $key;
+               }
+
+               return $res;
+       }
+
+       /**
+        * @param string $value String like "PURGED:<timestamp>"
+        * @return float|bool UNIX timestamp or false on failure
+        */
+       protected static function parsePurgeValue( $value ) {
+               $m = array();
+               if ( is_string( $value ) &&
+                       preg_match( '/^' . self::PURGE_VAL_PREFIX . '([^:]+)$/', $value, $m )
+               ) {
+                       return (float)$m[1];
+               } else {
+                       return false;
+               }
+       }
+}
index eb597d2..91e9971 100644 (file)
@@ -378,7 +378,7 @@ class Article implements Page {
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
                //XXX: this isn't page content but a UI message. horrible.
-               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
+               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
 
                if ( $oldid ) {
                        # $this->mRevision might already be fetched by getOldIDFromRequest()
@@ -390,17 +390,20 @@ class Article implements Page {
                                }
                        }
                } else {
-                       if ( !$this->mPage->getLatest() ) {
+                       $oldid = $this->mPage->getLatest();
+                       if ( !$oldid ) {
                                wfDebug( __METHOD__ . " failed to find page data for title " .
                                        $this->getTitle()->getPrefixedText() . "\n" );
                                return false;
                        }
 
+                       # Update error message with correct oldid
+                       $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ) );
+
                        $this->mRevision = $this->mPage->getRevision();
 
                        if ( !$this->mRevision ) {
-                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
-                                       $this->mPage->getLatest() . "\n" );
+                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id $oldid\n" );
                                return false;
                        }
                }
index 03a5b89..2edf1af 100644 (file)
@@ -113,6 +113,8 @@ class CategoryPage extends Article {
                        $until,
                        $reqArray
                );
-               $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
+               $out = $this->getContext()->getOutput();
+               $out->addHTML( $viewer->getHTML() );
+               $out->addHelpLink( 'Help:Categories' );
        }
 }
index b435c5c..752565d 100644 (file)
@@ -367,14 +367,12 @@ class WikiPage implements Page, IDBAccessObject {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                } elseif ( $from === self::READ_NORMAL ) {
                        $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
-                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
-                       // Note that DB also stores the master position in the session and checks it.
-                       $touched = $this->getCachedLastEditTime();
-                       if ( $touched ) { // key set
-                               if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
-                                       $from = self::READ_LATEST;
-                                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-                               }
+                       if ( !$data
+                               && wfGetLB()->getServerCount() > 1
+                               && wfGetLB()->hasOrMadeRecentMasterChanges()
+                       ) {
+                               $from = self::READ_LATEST;
+                               $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
                        }
                } else {
                        // No idea from where the caller got this data, assume slave database.
@@ -810,29 +808,6 @@ class WikiPage implements Page, IDBAccessObject {
                }
        }
 
-       /**
-        * Get the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @return string MW timestamp
-        */
-       protected function getCachedLastEditTime() {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               return $wgMemc->get( $key );
-       }
-
-       /**
-        * Set the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @param string $timestamp
-        * @return void
-        */
-       public function setCachedLastEditTime( $timestamp ) {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
-       }
-
        /**
         * Determine whether a page would be suitable for being counted as an
         * article in the site_stats table based on the title & its content
@@ -1167,7 +1142,12 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Update newtalk / watchlist notification status
-               $user->clearNotification( $this->mTitle, $oldid );
+               try {
+                       $user->clearNotification( $this->mTitle, $oldid );
+               } catch ( DBError $e ) {
+                       // Avoid outage if the master is not reachable
+                       MWExceptionHandler::logException( $e );
+               }
        }
 
        /**
@@ -1175,28 +1155,24 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function doPurge() {
-               global $wgUseSquid;
-
                if ( !Hooks::run( 'ArticlePurge', array( &$this ) ) ) {
                        return false;
                }
 
-               // Invalidate the cache
-               $this->mTitle->invalidateCache();
-
-               if ( $wgUseSquid ) {
-                       // Commit the transaction before the purge is sent
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->commit( __METHOD__ );
-
-                       // Send purge
-                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
-                       $update->doUpdate();
-               }
+               $title = $this->mTitle;
+               wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
+                       global $wgUseSquid;
+                       // Invalidate the cache in auto-commit mode
+                       $title->invalidateCache();
+                       if ( $wgUseSquid ) {
+                               // Send purge now that page_touched update was committed above
+                               $update = SquidUpdate::newSimplePurge( $title );
+                               $update->doUpdate();
+                       }
+               } );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo move this logic to MessageCache
-
                        if ( $this->exists() ) {
                                // NOTE: use transclusion text for messages.
                                //       This is consistent with  MessageCache::getMsgFromNamespace()
@@ -1213,6 +1189,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
                }
+
                return true;
        }
 
@@ -1311,7 +1288,6 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $result ) {
                        $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
                        $this->setLastEdit( $revision );
-                       $this->setCachedLastEditTime( $now );
                        $this->mLatest = $revision->getId();
                        $this->mIsRedirect = (bool)$rt;
                        // Update the LinkCache.
@@ -1513,8 +1489,18 @@ class WikiPage implements Page, IDBAccessObject {
 
                $baseRevId = null;
                if ( $edittime && $sectionId !== 'new' ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $rev = Revision::loadFromTimestamp( $dbr, $this->mTitle, $edittime );
+                       // Try the master if this thread may have just added it.
+                       // This could be abstracted into a Revision method, but we don't want
+                       // to encourage loading of revisions by timestamp.
+                       if ( !$rev
+                               && wfGetLB()->getServerCount() > 1
+                               && wfGetLB()->hasOrMadeRecentMasterChanges()
+                       ) {
+                               $dbw = wfGetDB( DB_MASTER );
+                               $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                       }
                        if ( $rev ) {
                                $baseRevId = $rev->getId();
                        }
@@ -1553,10 +1539,7 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
                                $oldContent = $this->getContent();
                        } else {
-                               // TODO: try DB_SLAVE first
-                               $dbw = wfGetDB( DB_MASTER );
-                               $rev = Revision::loadFromId( $dbw, $baseRevId );
-
+                               $rev = Revision::newFromId( $baseRevId );
                                if ( !$rev ) {
                                        wfDebug( __METHOD__ . " asked for bogus section (page: " .
                                                $this->getId() . "; section: $sectionId)\n" );
@@ -2097,7 +2080,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // The edit may have already been prepared via api.php?action=stashedit
-               $cachedEdit = $useCache && $wgAjaxEditStash
+               $cachedEdit = $useCache && $wgAjaxEditStash && !$user->isAllowed( 'bot' )
                        ? ApiStashEdit::checkCache( $this->getTitle(), $content, $user )
                        : false;
 
@@ -2222,8 +2205,12 @@ class WikiPage implements Page, IDBAccessObject {
                Hooks::run( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 
                if ( Hooks::run( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
-                       // Flush old entries from the `recentchanges` table
-                       JobQueueGroup::singleton()->push( RecentChangesUpdateJob::newPurgeJob() );
+                       JobQueueGroup::singleton()->push( array(
+                               // Flush old entries from the `recentchanges` table
+                               RecentChangesUpdateJob::newPurgeJob(),
+                               // Update the cached list of active users
+                               RecentChangesUpdateJob::newCacheUpdateJob()
+                       ) );
                }
 
                if ( !$this->exists() ) {
@@ -2389,8 +2376,8 @@ class WikiPage implements Page, IDBAccessObject {
                $dbw = wfGetDB( DB_MASTER );
 
                foreach ( $restrictionTypes as $action ) {
-                       if ( !isset( $expiry[$action] ) ) {
-                               $expiry[$action] = $dbw->getInfinity();
+                       if ( !isset( $expiry[$action] ) || $expiry[$action] === $dbw->getInfinity() ) {
+                               $expiry[$action] = 'infinity';
                        }
                        if ( !isset( $limit[$action] ) ) {
                                $limit[$action] = '';
@@ -2630,10 +2617,8 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected function formatExpiry( $expiry ) {
                global $wgContLang;
-               $dbr = wfGetDB( DB_SLAVE );
 
-               $encodedExpiry = $dbr->encodeExpiry( $expiry );
-               if ( $encodedExpiry != 'infinity' ) {
+               if ( $expiry != 'infinity' ) {
                        return wfMessage(
                                'protect-expiring',
                                $wgContLang->timeanddate( $expiry, false, false ),
index 7c221d8..ace63a0 100644 (file)
@@ -4945,7 +4945,7 @@ class Parser {
        /**
         * Clean up signature text
         *
-        * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures @see cleanSigInSig
+        * 1) Strip 3, 4 or 5 tildes out of signatures @see cleanSigInSig
         * 2) Substitute all transclusions
         *
         * @param string $text
@@ -4984,7 +4984,7 @@ class Parser {
        }
 
        /**
-        * Strip ~~~, ~~~~ and ~~~~~ out of signatures
+        * Strip 3, 4 or 5 tildes out of signatures.
         *
         * @param string $text
         * @return string Signature text with /~{3,5}/ removed
index 5fa52ff..100656d 100644 (file)
@@ -145,9 +145,7 @@ class ParserOptions {
 
        /**
         * Clean up signature texts?
-        *
-        * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
-        * 2) Substitute all transclusions
+        * @see Parser::cleanSig
         */
        public $mCleanSignatures;
 
index 245022d..bab8eba 100644 (file)
@@ -451,15 +451,14 @@ class SectionProfiler {
        }
 
        /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
+        * Get the initial time of the request, based on getrusage()
         *
         * @param string|bool $metric Metric to use, with the following possibilities:
         *   - user: User CPU time (without system calls)
         *   - cpu: Total CPU time (user and system calls)
         *   - wall (or any other string): elapsed time
         *   - false (default): will fall back to default metric
-        * @return float|null
+        * @return float
         */
        protected function getTime( $metric = 'wall' ) {
                if ( $metric === 'cpu' || $metric === 'user' ) {
index baec181..f02d66f 100644 (file)
@@ -263,10 +263,12 @@ class TransactionProfiler implements LoggerAwareInterface {
         * @param string $query
         */
        protected function reportExpectationViolated( $expect, $query ) {
+               global $wgRequest;
+
                $n = $this->expect[$expect];
                $by = $this->expectBy[$expect];
                $this->logger->info(
-                       "Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true )
+                       "[{$wgRequest->getMethod()}] Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true )
                );
        }
 }
index f85b878..a5349fb 100644 (file)
@@ -54,6 +54,7 @@ class ExtensionProcessor implements Processor {
         */
        protected static $creditsAttributes = array(
                'name',
+               'namemsg',
                'author',
                'version',
                'url',
@@ -193,15 +194,17 @@ class ExtensionProcessor implements Processor {
                        $defaultPaths['localBasePath'] = "$dir/{$defaultPaths['localBasePath']}";
                }
 
-               if ( isset( $info['ResourceModules'] ) ) {
-                       foreach ( $info['ResourceModules'] as $name => $data ) {
-                               if ( isset( $data['localBasePath'] ) ) {
-                                       $data['localBasePath'] = "$dir/{$data['localBasePath']}";
+               foreach ( array( 'ResourceModules', 'ResourceModuleSkinStyles' ) as $setting ) {
+                       if ( isset( $info[$setting] ) ) {
+                               foreach ( $info[$setting] as $name => $data ) {
+                                       if ( isset( $data['localBasePath'] ) ) {
+                                               $data['localBasePath'] = "$dir/{$data['localBasePath']}";
+                                       }
+                                       if ( $defaultPaths ) {
+                                               $data += $defaultPaths;
+                                       }
+                                       $this->globals["wg$setting"][$name] = $data;
                                }
-                               if ( $defaultPaths ) {
-                                       $data += $defaultPaths;
-                               }
-                               $this->globals['wgResourceModules'][$name] = $data;
                        }
                }
        }
index c06f7e3..5ef3853 100644 (file)
@@ -91,41 +91,55 @@ class ExtensionRegistry {
                if ( $data ) {
                        $this->exportExtractedData( $data );
                } else {
-                       $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
-                       $autoloadClasses = array();
-                       foreach ( $this->queued as $path => $mtime ) {
-                               $json = file_get_contents( $path );
-                               $info = json_decode( $json, /* $assoc = */ true );
-                               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;
-                               $autoloadClasses += $autoload;
-                               if ( isset( $info['processor'] ) ) {
-                                       $processor = $this->getProcessor( $info['processor'] );
-                               } else {
-                                       $processor = $this->getProcessor( 'default' );
-                               }
-                               $processor->extractInfo( $path, $info );
-                       }
-                       foreach ( $this->processors as $processor ) {
-                               $data = array_merge_recursive( $data, $processor->getExtractedInfo() );
-                       }
-                       foreach ( $data['credits'] as $credit ) {
-                               $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit;
-                       }
-                       $this->processors = array(); // Reset
+                       $data = $this->readFromQueue( $this->queued );
                        $this->exportExtractedData( $data );
                        // Do this late since we don't want to extract it since we already
                        // did that, but it should be cached
-                       $data['globals']['wgAutoloadClasses'] += $autoloadClasses;
+                       $data['globals']['wgAutoloadClasses'] += $data['autoload'];
+                       unset( $data['autoload'] );
                        $this->cache->set( $key, $data );
                }
                $this->queued = array();
        }
 
+       /**
+        * Process a queue of extensions and return their extracted data
+        *
+        * @param array $queue keys are filenames, values are ignored
+        * @return array extracted info
+        * @throws Exception
+        */
+       public function readFromQueue( array $queue ) {
+               $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
+               $autoloadClasses = array();
+               foreach ( $queue 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;
+                       $autoloadClasses += $autoload;
+                       if ( isset( $info['processor'] ) ) {
+                               $processor = $this->getProcessor( $info['processor'] );
+                       } else {
+                               $processor = $this->getProcessor( 'default' );
+                       }
+                       $processor->extractInfo( $path, $info );
+               }
+               foreach ( $this->processors as $processor ) {
+                       $data = array_merge_recursive( $data, $processor->getExtractedInfo() );
+               }
+               foreach ( $data['credits'] as $credit ) {
+                       $data['globals']['wgExtensionCredits'][$credit['type']][] = $credit;
+               }
+               $this->processors = array(); // Reset
+               $data['autoload'] = $autoloadClasses;
+               return $data;
+       }
+
        protected function getProcessor( $type ) {
                if ( !isset( $this->processors[$type] ) ) {
                        $processor = $type === 'default' ? new ExtensionProcessor() : new $type();
index 976275b..f8d8d2f 100644 (file)
@@ -346,12 +346,9 @@ class ResourceLoader {
                                        }
 
                                        // Add new file paths, remapping them to refer to our directories and not use settings
-                                       // from the module we're modifying. These can come from the base definition or be defined
-                                       // for each module.
+                                       // from the module we're modifying, which come from the base definition.
                                        list( $localBasePath, $remoteBasePath ) =
                                                ResourceLoaderFileModule::extractBasePaths( $skinStyles );
-                                       list( $localBasePath, $remoteBasePath ) =
-                                               ResourceLoaderFileModule::extractBasePaths( $paths, $localBasePath, $remoteBasePath );
 
                                        foreach ( $paths as $path ) {
                                                $styleFiles[] = new ResourceLoaderFilePath( $path, $localBasePath, $remoteBasePath );
@@ -1349,6 +1346,7 @@ MESSAGE;
         * Returns JS code which runs given JS code if the client-side framework is
         * present.
         *
+        * @deprecated since 1.25; use makeInlineScript instead
         * @param string $script JavaScript code
         * @return string
         */
@@ -1356,6 +1354,20 @@ MESSAGE;
                return "if(window.mw){\n" . trim( $script ) . "\n}";
        }
 
+       /**
+        * Construct an inline script tag with given JS code.
+        *
+        * The code will be wrapped in a closure, and it will be executed by ResourceLoader
+        * only if the client has adequate support for MediaWiki JavaScript code.
+        *
+        * @param string $script JavaScript code
+        * @return string HTML
+        */
+       public static function makeInlineScript( $script ) {
+               $js = self::makeLoaderConditionalScript( $script );
+               return Html::inlineScript( $js );
+       }
+
        /**
         * Returns JS code which will set the MediaWiki configuration array to
         * the given value.
index 12d1e82..bf68fdd 100644 (file)
@@ -117,7 +117,7 @@ class ResourceLoaderImage {
         * @param ResourceLoaderContext $context Any context
         * @return string
         */
-       protected function getPath( ResourceLoaderContext $context ) {
+       public function getPath( ResourceLoaderContext $context ) {
                $desc = $this->descriptor;
                if ( is_string( $desc ) ) {
                        return $this->basePath . '/' . $desc;
index bf6a7dd..7efdb26 100644 (file)
@@ -303,6 +303,49 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                return false;
        }
 
+       /**
+        * Get the definition summary for this module.
+        *
+        * @param ResourceLoaderContext $context
+        * @return array
+        */
+       public function getDefinitionSummary( ResourceLoaderContext $context ) {
+               $summary = parent::getDefinitionSummary( $context );
+               foreach ( array(
+                       'localBasePath',
+                       'images',
+                       'variants',
+                       'prefix',
+                       'selectorWithoutVariant',
+                       'selectorWithVariant',
+               ) as $member ) {
+                       $summary[$member] = $this->{$member};
+               };
+               return $summary;
+       }
+
+       /**
+        * Get the last modified timestamp of this module.
+        *
+        * @param ResourceLoaderContext $context Context in which to calculate
+        *     the modified time
+        * @return int UNIX timestamp
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               $files = array();
+               foreach ( $this->getImages() as $name => $image ) {
+                       $files[] = $image->getPath( $context );
+               }
+
+               $files = array_values( array_unique( $files ) );
+               $filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
+
+               return max(
+                       $filesMtime,
+                       $this->getDefinitionMtime( $context )
+               );
+       }
+
        /**
         * Extract a local base path from module definition information.
         *
index 840fd77..f16fd15 100644 (file)
@@ -92,7 +92,7 @@ abstract class RevDelList extends RevisionListBase {
                $this->res = false;
                $dbw = wfGetDB( DB_MASTER );
                $this->doQuery( $dbw );
-               $dbw->begin( __METHOD__ );
+               $dbw->startAtomic( __METHOD__ );
                $status = Status::newGood();
                $missing = array_flip( $this->ids );
                $this->clearFileOps();
@@ -207,10 +207,15 @@ abstract class RevDelList extends RevisionListBase {
                        'authorIds' => $authorIds,
                        'authorIPs' => $authorIPs
                ) );
-               $dbw->commit( __METHOD__ );
 
                // Clear caches
-               $status->merge( $this->doPostCommitUpdates() );
+               $that = $this;
+               $dbw->onTransactionIdle( function() use ( $that ) {
+                       $that->doPostCommitUpdates();
+               } );
+
+               $dbw->endAtomic( __METHOD__ );
+
                return $status;
        }
 
index 5c8b8c9..49adf20 100644 (file)
@@ -124,15 +124,7 @@ class RevDelLogItem extends RevDelItem {
                        : array();
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
-                       ApiQueryLogEvents::addLogParams(
-                               $result,
-                               $ret,
-                               $logEntry->getParameters(),
-                               $logEntry->getType(),
-                               $logEntry->getSubtype(),
-                               $logEntry->getTimestamp(),
-                               $logEntry->isLegacy()
-                       );
+                       $ret['params'] = LogFormatter::newFromEntry( $logEntry )->formatParametersForApi();
                }
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_USER, $user ) ) {
                        $ret += array(
index dc25c6c..07a2e87 100644 (file)
@@ -365,8 +365,8 @@ abstract class Skin extends ContextSource {
         */
        static function makeVariablesScript( $data ) {
                if ( $data ) {
-                       return Html::inlineScript(
-                               ResourceLoader::makeLoaderConditionalScript( ResourceLoader::makeConfigSetScript( $data ) )
+                       return ResourceLoader::makeInlineScript(
+                               ResourceLoader::makeConfigSetScript( $data )
                        );
                } else {
                        return '';
@@ -1477,7 +1477,8 @@ abstract class Skin extends ContextSource {
         * Get a cached notice
         *
         * @param string $name Message name, or 'default' for $wgSiteNotice
-        * @return string HTML fragment
+        * @return string|bool HTML fragment, or false to indicate that the caller
+        *   should fall back to the next notice in its sequence
         */
        private function getCachedNotice( $name ) {
                global $wgRenderHashAppend, $parserMemc, $wgContLang;
@@ -1493,7 +1494,9 @@ abstract class Skin extends ContextSource {
                        }
                } else {
                        $msg = $this->msg( $name )->inContentLanguage();
-                       if ( $msg->isDisabled() ) {
+                       if ( $msg->isBlank() ) {
+                               return '';
+                       } elseif ( $msg->isDisabled() ) {
                                return false;
                        }
                        $notice = $msg->plain();
@@ -1554,13 +1557,13 @@ abstract class Skin extends ContextSource {
                                $siteNotice = $this->getCachedNotice( 'sitenotice' );
                        } else {
                                $anonNotice = $this->getCachedNotice( 'anonnotice' );
-                               if ( !$anonNotice ) {
+                               if ( $anonNotice === false ) {
                                        $siteNotice = $this->getCachedNotice( 'sitenotice' );
                                } else {
                                        $siteNotice = $anonNotice;
                                }
                        }
-                       if ( !$siteNotice ) {
+                       if ( $siteNotice === false ) {
                                $siteNotice = $this->getCachedNotice( 'default' );
                        }
                }
index 1c5f3a6..312769f 100644 (file)
@@ -65,7 +65,9 @@ class SkinFallbackTemplate extends BaseTemplate {
                        return $this->getMsg( 'default-skin-not-found' )->params(
                                $defaultSkin,
                                implode( "\n", $skinsInstalledText ),
-                               implode( "\n", $skinsInstalledSnippet )
+                               implode( "\n", $skinsInstalledSnippet ) )->numParams(
+                                       count( $skinsInstalledText ),
+                                       count( $skinsInstalledSnippet )
                        )->parseAsBlock();
                } else {
                        return $this->getMsg( 'default-skin-not-found-no-skins' )->params(
index b0390e9..61aad92 100644 (file)
@@ -717,7 +717,7 @@ class SkinTemplate extends Skin {
                        $text = $msg->text();
                } else {
                        global $wgContLang;
-                       $text = $wgContLang->getFormattedNsText(
+                       $text = $wgContLang->getConverter()->convertNamespace(
                                MWNamespace::getSubject( $title->getNamespace() ) );
                }
 
index 1ff7e3f..da752f6 100644 (file)
@@ -527,7 +527,7 @@ abstract class QueryPage extends SpecialPage {
 
                $this->numRows = $res->numRows();
 
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbr = $this->getRecacheDB();
                $this->preprocessResults( $dbr, $res );
 
                $out->addHTML( Xml::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) );
index 2e6e55a..a866ba7 100644 (file)
@@ -33,8 +33,11 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
        // Query parameters added by redirects
        protected $mAddedRedirectParams = array();
 
-       public function execute( $par ) {
-               $redirect = $this->getRedirect( $par );
+       /**
+        * @param string|null $subpage
+        */
+       public function execute( $subpage ) {
+               $redirect = $this->getRedirect( $subpage );
                $query = $this->getRedirectQuery();
                // Redirect to a page title with possible query parameters
                if ( $redirect instanceof Title ) {
@@ -58,10 +61,10 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
         * If the special page is a redirect, then get the Title object it redirects to.
         * False otherwise.
         *
-        * @param string $par Subpage string
+        * @param string|null $subpage
         * @return Title|bool
         */
-       abstract public function getRedirect( $par );
+       abstract public function getRedirect( $subpage );
 
        /**
         * Return part of the request string for a special redirect page
@@ -112,12 +115,16 @@ abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
                $this->mAddedRedirectParams = $addedRedirectParams;
        }
 
+       /**
+        * @param string|null $subpage
+        * @return Title|bool
+        */
        public function getRedirect( $subpage ) {
                if ( $this->redirSubpage === false ) {
                        return SpecialPage::getTitleFor( $this->redirName, $subpage );
-               } else {
-                       return SpecialPage::getTitleFor( $this->redirName, $this->redirSubpage );
                }
+
+               return SpecialPage::getTitleFor( $this->redirName, $this->redirSubpage );
        }
 }
 
index c262519..dedfcb6 100644 (file)
@@ -159,6 +159,7 @@ class SpecialPageFactory {
                'ApiHelp' => 'SpecialApiHelp',
                'Blankpage' => 'SpecialBlankpage',
                'Diff' => 'SpecialDiff',
+               'EditTags' => 'SpecialEditTags',
                'Emailuser' => 'SpecialEmailUser',
                'Movepage' => 'MovePageForm',
                'Mycontributions' => 'SpecialMycontributions',
index a031dad..5e2ee1c 100644 (file)
@@ -267,12 +267,21 @@ class SpecialActiveUsers extends SpecialPage {
                $out->wrapWikiMsg( "<div class='mw-activeusers-intro'>\n$1\n</div>",
                        array( 'activeusers-intro', $this->getLanguage()->formatNum( $days ) ) );
 
-               // Occasionally merge in new updates
-               $seconds = min( self::mergeActiveUsers( 300, $days ), $days * 86400 );
-               if ( $seconds > 0 ) {
+               // Get the timestamp of the last cache update
+               $dbr = wfGetDB( DB_SLAVE, 'recentchanges' );
+               $cTime = $dbr->selectField( 'querycache_info',
+                       'qci_timestamp',
+                       array( 'qci_type' => 'activeusers' )
+               );
+
+               $secondsOld = $cTime
+                       ? time() - wfTimestamp( TS_UNIX, $cTime )
+                       : $days * 86400; // fully stale :)
+
+               if ( $secondsOld > 0 ) {
                        // Mention the level of staleness
                        $out->addWikiMsg( 'cachedspecial-viewing-cached-ttl',
-                               $this->getLanguage()->formatDuration( $seconds ) );
+                               $this->getLanguage()->formatDuration( $secondsOld ) );
                }
 
                $up = new ActiveUsersPager( $this->getContext(), null, $par );
@@ -295,163 +304,4 @@ class SpecialActiveUsers extends SpecialPage {
        protected function getGroupName() {
                return 'users';
        }
-
-       /**
-        * @param int $period Seconds (do updates no more often than this)
-        * @param int $days How many days user must be idle before he is considered inactive
-        * @return int How many seconds old the cache is
-        */
-       public static function mergeActiveUsers( $period, $days ) {
-               $dbr = wfGetDB( DB_SLAVE );
-               $cTime = $dbr->selectField( 'querycache_info',
-                       'qci_timestamp',
-                       array( 'qci_type' => 'activeusers' )
-               );
-
-               if ( !wfReadOnly() ) {
-                       if ( !$cTime || ( time() - wfTimestamp( TS_UNIX, $cTime ) ) > $period ) {
-                               $dbw = wfGetDB( DB_MASTER );
-                               $cond = $cTime
-                                       ? array( 'rc_timestamp > ' . $dbw->addQuotes( $cTime ) )
-                                       : array();
-                               if ( $dbw->estimateRowCount( 'recentchanges', '*', $cond ) <= 10000 ) {
-                                       $window = $days * 86400; // small wiki
-                               } else {
-                                       $window = $period * 2;
-                               }
-                               $cTime = self::doQueryCacheUpdate( $dbw, $days, $window ) ?: $cTime;
-                       }
-               }
-
-               return ( time() -
-                       ( $cTime ? wfTimestamp( TS_UNIX, $cTime ) : $days * 86400 ) );
-       }
-
-       /**
-        * @param IDatabase $dbw Passed in from updateSpecialPages.php
-        * @return void
-        */
-       public static function cacheUpdate( IDatabase $dbw ) {
-               global $wgActiveUserDays;
-
-               self::doQueryCacheUpdate( $dbw, $wgActiveUserDays, $wgActiveUserDays * 86400 );
-       }
-
-       /**
-        * Update the query cache as needed
-        *
-        * @param IDatabase $dbw
-        * @param int $days How many days user must be idle before he is considered inactive
-        * @param int $window Maximum time range of new data to scan (in seconds)
-        * @return int|bool UNIX timestamp the cache is now up-to-date as of (false on error)
-        */
-       protected static function doQueryCacheUpdate( IDatabase $dbw, $days, $window ) {
-               $dbw->startAtomic( __METHOD__ );
-
-               $lockKey = wfWikiID() . '-activeusers';
-               if ( !$dbw->lock( $lockKey, __METHOD__, 1 ) ) {
-                       return false; // exclusive update (avoids duplicate entries)
-               }
-
-               $nowUnix = time();
-               // Get the last-updated timestamp for the cache
-               $cTime = $dbw->selectField( 'querycache_info',
-                       'qci_timestamp',
-                       array( 'qci_type' => 'activeusers' )
-               );
-               $cTimeUnix = $cTime ? wfTimestamp( TS_UNIX, $cTime ) : 1;
-
-               // Pick the date range to fetch from. This is normally from the last
-               // update to till the present time, but has a limited window for sanity.
-               // If the window is limited, multiple runs are need to fully populate it.
-               $sTimestamp = max( $cTimeUnix, $nowUnix - $days * 86400 );
-               $eTimestamp = min( $sTimestamp + $window, $nowUnix );
-
-               // Get all the users active since the last update
-               $res = $dbw->select(
-                       array( 'recentchanges' ),
-                       array( 'rc_user_text', 'lastedittime' => 'MAX(rc_timestamp)' ),
-                       array(
-                               'rc_user > 0', // actual accounts
-                               'rc_type != ' . $dbw->addQuotes( RC_EXTERNAL ), // no wikidata
-                               'rc_log_type IS NULL OR rc_log_type != ' . $dbw->addQuotes( 'newusers' ),
-                               'rc_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $sTimestamp ) ),
-                               'rc_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $eTimestamp ) )
-                       ),
-                       __METHOD__,
-                       array(
-                               'GROUP BY' => array( 'rc_user_text' ),
-                               'ORDER BY' => 'NULL' // avoid filesort
-                       )
-               );
-               $names = array();
-               foreach ( $res as $row ) {
-                       $names[$row->rc_user_text] = $row->lastedittime;
-               }
-
-               // Rotate out users that have not edited in too long (according to old data set)
-               $dbw->delete( 'querycachetwo',
-                       array(
-                               'qcc_type' => 'activeusers',
-                               'qcc_value < ' . $dbw->addQuotes( $nowUnix - $days * 86400 ) // TS_UNIX
-                       ),
-                       __METHOD__
-               );
-
-               // Find which of the recently active users are already accounted for
-               if ( count( $names ) ) {
-                       $res = $dbw->select( 'querycachetwo',
-                               array( 'user_name' => 'qcc_title' ),
-                               array(
-                                       'qcc_type' => 'activeusers',
-                                       'qcc_namespace' => NS_USER,
-                                       'qcc_title' => array_keys( $names ) ),
-                               __METHOD__,
-                               // See the latest data (ignoring trx snapshot) to avoid
-                               // duplicates if this method was called in a transaction
-                               array( 'LOCK IN SHARE MODE' )
-                       );
-                       foreach ( $res as $row ) {
-                               unset( $names[$row->user_name] );
-                       }
-               }
-
-               // Insert the users that need to be added to the list (which their last edit time
-               if ( count( $names ) ) {
-                       $newRows = array();
-                       foreach ( $names as $name => $lastEditTime ) {
-                               $newRows[] = array(
-                                       'qcc_type' => 'activeusers',
-                                       'qcc_namespace' => NS_USER,
-                                       'qcc_title' => $name,
-                                       'qcc_value' => wfTimestamp( TS_UNIX, $lastEditTime ),
-                                       'qcc_namespacetwo' => 0, // unused
-                                       'qcc_titletwo' => '' // unused
-                               );
-                       }
-                       foreach ( array_chunk( $newRows, 500 ) as $rowBatch ) {
-                               $dbw->insert( 'querycachetwo', $rowBatch, __METHOD__ );
-                               if ( !$dbw->trxLevel() ) {
-                                       wfWaitForSlaves();
-                               }
-                       }
-               }
-
-               // If a transaction was already started, it might have an old
-               // snapshot, so kludge the timestamp range back as needed.
-               $asOfTimestamp = min( $eTimestamp, (int)$dbw->trxTimestamp() );
-
-               // Touch the data freshness timestamp
-               $dbw->replace( 'querycache_info',
-                       array( 'qci_type' ),
-                       array( 'qci_type' => 'activeusers',
-                               'qci_timestamp' => $dbw->timestamp( $asOfTimestamp ) ), // not always $now
-                       __METHOD__
-               );
-
-               $dbw->unlock( $lockKey, __METHOD__ );
-               $dbw->endAtomic( __METHOD__ );
-
-               return $eTimestamp;
-       }
 }
index c237401..3f13510 100644 (file)
@@ -848,16 +848,11 @@ class SpecialBlock extends FormSpecialPage {
         * Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
         * ("24 May 2034", etc), into an absolute timestamp we can put into the database.
         * @param string $expiry Whatever was typed into the form
-        * @return string Timestamp or "infinity" string for the DB implementation
+        * @return string Timestamp or 'infinity'
         */
        public static function parseExpiryInput( $expiry ) {
-               static $infinity;
-               if ( $infinity == null ) {
-                       $infinity = wfGetDB( DB_SLAVE )->getInfinity();
-               }
-
                if ( wfIsInfinity( $expiry ) ) {
-                       $expiry = $infinity;
+                       $expiry = 'infinity';
                } else {
                        $expiry = strtotime( $expiry );
 
index 4583430..0ec144a 100644 (file)
@@ -113,11 +113,6 @@ class SpecialBlockList extends SpecialPage {
        }
 
        function showList() {
-               # Purge expired entries on one in every 10 queries
-               if ( !mt_rand( 0, 10 ) ) {
-                       Block::purgeExpired();
-               }
-
                $conds = array();
                # Is the user allowed to see hidden blocks?
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
@@ -398,6 +393,10 @@ class BlockListPager extends TablePager {
                        'join_conds' => array( 'user' => array( 'LEFT JOIN', 'user_id = ipb_by' ) )
                );
 
+               # Filter out any expired blocks
+               $db = $this->getDatabase();
+               $info['conds'][] = 'ipb_expiry > ' . $db->addQuotes( $db->timestamp() );
+
                # Is the user allowed to see hidden blocks?
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $info['conds']['ipb_deleted'] = 0;
index eca307d..babb315 100644 (file)
@@ -92,14 +92,14 @@ class SpecialChangeEmail extends FormSpecialPage {
                        'NewEmail' => array(
                                'type' => 'email',
                                'label-message' => 'changeemail-newemail',
+                               'autofocus' => true
                        ),
                );
 
                if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
                        $fields['Password'] = array(
                                'type' => 'password',
-                               'label-message' => 'changeemail-password',
-                               'autofocus' => true,
+                               'label-message' => 'changeemail-password'
                        );
                }
 
@@ -129,7 +129,8 @@ class SpecialChangeEmail extends FormSpecialPage {
        public function onSuccess() {
                $request = $this->getRequest();
 
-               $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
+               $returnto = $request->getVal( 'returnto' );
+               $titleObj = $returnto !== null ? Title::newFromText( $returnto ) : null;
                if ( !$titleObj instanceof Title ) {
                        $titleObj = Title::newMainPage();
                }
index 168095f..6a4347d 100644 (file)
@@ -179,7 +179,8 @@ class SpecialChangePassword extends FormSpecialPage {
                }
 
                if ( $request->getCheck( 'wpCancel' ) ) {
-                       $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
+                       $returnto = $request->getVal( 'returnto' );
+                       $titleObj = $returnto !== null ? Title::newFromText( $returnto ) : null;
                        if ( !$titleObj instanceof Title ) {
                                $titleObj = Title::newMainPage();
                        }
index 799e526..9f91a10 100644 (file)
  * @since 1.23
  */
 class SpecialDiff extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Diff' );
                $this->mAllowedRedirectParams = array();
        }
 
-       function getRedirect( $subpage ) {
+       /**
+        * @param string|null $subpage
+        * @return Title|bool
+        */
+       public function getRedirect( $subpage ) {
                $parts = explode( '/', $subpage );
 
                // Try to parse the values given, generating somewhat pretty URLs if possible
diff --git a/includes/specials/SpecialEditTags.php b/includes/specials/SpecialEditTags.php
new file mode 100644 (file)
index 0000000..bfd1717
--- /dev/null
@@ -0,0 +1,460 @@
+<?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 SpecialPage
+ */
+
+/**
+ * Special page for adding and removing change tags to individual revisions.
+ * A lot of this is copied out of SpecialRevisiondelete.
+ *
+ * @ingroup SpecialPage
+ * @since 1.25
+ */
+class SpecialEditTags extends UnlistedSpecialPage {
+       /** @var bool Was the DB modified in this request */
+       protected $wasSaved = false;
+
+       /** @var bool True if the submit button was clicked, and the form was posted */
+       private $submitClicked;
+
+       /** @var array Target ID list */
+       private $ids;
+
+       /** @var Title Title object for target parameter */
+       private $targetObj;
+
+       /** @var string Deletion type, may be revision or logentry */
+       private $typeName;
+
+       /** @var ChangeTagsList Storing the list of items to be tagged */
+       private $revList;
+
+       /** @var bool Whether user is allowed to perform the action */
+       private $isAllowed;
+
+       /** @var string */
+       private $reason;
+
+       public function __construct() {
+               parent::__construct( 'EditTags', 'changetags' );
+       }
+
+       public function execute( $par ) {
+               $this->checkPermissions();
+               $this->checkReadOnly();
+
+               $output = $this->getOutput();
+               $user = $this->getUser();
+               $request = $this->getRequest();
+
+               $this->setHeaders();
+               $this->outputHeader();
+
+               $this->getOutput()->addModules( array( 'mediawiki.special.edittags',
+                       'mediawiki.special.edittags.styles' ) );
+
+               $this->submitClicked = $request->wasPosted() && $request->getBool( 'wpSubmit' );
+
+               // Handle our many different possible input types
+               $ids = $request->getVal( 'ids' );
+               if ( !is_null( $ids ) ) {
+                       // Allow CSV from the form hidden field, or a single ID for show/hide links
+                       $this->ids = explode( ',', $ids );
+               } else {
+                       // Array input
+                       $this->ids = array_keys( $request->getArray( 'ids', array() ) );
+               }
+               $this->ids = array_unique( array_filter( $this->ids ) );
+
+               // No targets?
+               if ( count( $this->ids ) == 0 ) {
+                       throw new ErrorPageError( 'tags-edit-nooldid-title', 'tags-edit-nooldid-text' );
+               }
+
+               $this->typeName = $request->getVal( 'type' );
+               $this->targetObj = Title::newFromText( $request->getText( 'target' ) );
+
+               // sanity check of parameter
+               switch ( $this->typeName ) {
+                       case 'logentry':
+                       case 'logging':
+                               $this->typeName = 'logentry';
+                               break;
+                       default:
+                               $this->typeName = 'revision';
+                               break;
+               }
+
+               // Allow the list type to adjust the passed target
+               // Yuck! Copied straight out of SpecialRevisiondelete, but it does exactly
+               // what we want
+               $this->targetObj = RevisionDeleter::suggestTarget(
+                       $this->typeName === 'revision' ? 'revision' : 'logging',
+                       $this->targetObj,
+                       $this->ids
+               );
+
+               $this->isAllowed = $user->isAllowed( 'changetags' );
+
+               $this->reason = $request->getVal( 'wpReason' );
+               // We need a target page!
+               if ( is_null( $this->targetObj ) ) {
+                       $output->addWikiMsg( 'undelete-header' );
+                       return;
+               }
+               // Give a link to the logs/hist for this page
+               $this->showConvenienceLinks();
+
+               // Either submit or create our form
+               if ( $this->isAllowed && $this->submitClicked ) {
+                       $this->submit( $request );
+               } else {
+                       $this->showForm();
+               }
+
+               // Show relevant lines from the tag log
+               $tagLogPage = new LogPage( 'tag' );
+               $output->addHTML( "<h2>" . $tagLogPage->getName()->escaped() . "</h2>\n" );
+               LogEventsList::showLogExtract(
+                       $output,
+                       'tag',
+                       $this->targetObj,
+                       '', /* user */
+                       array( 'lim' => 25, 'conds' => array(), 'useMaster' => $this->wasSaved )
+               );
+       }
+
+       /**
+        * Show some useful links in the subtitle
+        */
+       protected function showConvenienceLinks() {
+               // Give a link to the logs/hist for this page
+               if ( $this->targetObj ) {
+                       // Also set header tabs to be for the target.
+                       $this->getSkin()->setRelevantTitle( $this->targetObj );
+
+                       $links = array();
+                       $links[] = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Log' ),
+                               $this->msg( 'viewpagelogs' )->escaped(),
+                               array(),
+                               array(
+                                       'page' => $this->targetObj->getPrefixedText(),
+                                       'hide_tag_log' => '0',
+                               )
+                       );
+                       if ( !$this->targetObj->isSpecialPage() ) {
+                               // Give a link to the page history
+                               $links[] = Linker::linkKnown(
+                                       $this->targetObj,
+                                       $this->msg( 'pagehist' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'history' )
+                               );
+                       }
+                       // Link to Special:Tags
+                       $links[] = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Tags' ),
+                               $this->msg( 'tags-edit-manage-link' )->escaped()
+                       );
+                       // Logs themselves don't have histories or archived revisions
+                       $this->getOutput()->addSubtitle( $this->getLanguage()->pipeList( $links ) );
+               }
+       }
+
+       /**
+        * Get the list object for this request
+        * @return ChangeTagsList
+        */
+       protected function getList() {
+               if ( is_null( $this->revList ) ) {
+                       $this->revList = ChangeTagsList::factory( $this->typeName, $this->getContext(),
+                               $this->targetObj, $this->ids );
+               }
+
+               return $this->revList;
+       }
+
+       /**
+        * Show a list of items that we will operate on, and show a form which allows
+        * the user to modify the tags applied to those items.
+        */
+       protected function showForm() {
+               $userAllowed = true;
+
+               $out = $this->getOutput();
+               // Messages: tags-edit-revision-selected, tags-edit-logentry-selected
+               $out->wrapWikiMsg( "<strong>$1</strong>", array(
+                       "tags-edit-{$this->typeName}-selected",
+                       $this->getLanguage()->formatNum( count( $this->ids ) ),
+                       $this->targetObj->getPrefixedText()
+               ) );
+
+               $out->addHelpLink( 'Help:Tags' );
+               $out->addHTML( "<ul>" );
+
+               $numRevisions = 0;
+               // Live revisions...
+               $list = $this->getList();
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $list->reset(); $list->current(); $list->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $list->current();
+                       $numRevisions++;
+                       $out->addHTML( $item->getHTML() );
+               }
+
+               if ( !$numRevisions ) {
+                       throw new ErrorPageError( 'tags-edit-nooldid-title', 'tags-edit-nooldid-text' );
+               }
+
+               $out->addHTML( "</ul>" );
+               // Explanation text
+               $out->wrapWikiMsg( '<p>$1</p>', "tags-edit-{$this->typeName}-explanation" );
+
+               // Show form if the user can submit
+               if ( $this->isAllowed ) {
+                       $form = Xml::openElement( 'form', array( 'method' => 'post',
+                                       'action' => $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) ),
+                                       'id' => 'mw-revdel-form-revisions' ) ) .
+                               Xml::fieldset( $this->msg( "tags-edit-{$this->typeName}-legend",
+                                       count( $this->ids ) )->text() ) .
+                               $this->buildCheckBoxes() .
+                               Xml::openElement( 'table' ) .
+                               "<tr>\n" .
+                                       '<td class="mw-label">' .
+                                               Xml::label( $this->msg( 'tags-edit-reason' )->text(), 'wpReason' ) .
+                                       '</td>' .
+                                       '<td class="mw-input">' .
+                                               Xml::input(
+                                                       'wpReason',
+                                                       60,
+                                                       $this->reason,
+                                                       array( 'id' => 'wpReason', 'maxlength' => 100 )
+                                               ) .
+                                       '</td>' .
+                               "</tr><tr>\n" .
+                                       '<td></td>' .
+                                       '<td class="mw-submit">' .
+                                               Xml::submitButton( $this->msg( "tags-edit-{$this->typeName}-submit",
+                                                       $numRevisions )->text(), array( 'name' => 'wpSubmit' ) ) .
+                                       '</td>' .
+                               "</tr>\n" .
+                               Xml::closeElement( 'table' ) .
+                               Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ) .
+                               Html::hidden( 'target', $this->targetObj->getPrefixedText() ) .
+                               Html::hidden( 'type', $this->typeName ) .
+                               Html::hidden( 'ids', implode( ',', $this->ids ) ) .
+                               Xml::closeElement( 'fieldset' ) . "\n" .
+                               Xml::closeElement( 'form' ) . "\n";
+               } else {
+                       $form = '';
+               }
+               $out->addHTML( $form );
+       }
+
+       /**
+        * @return string HTML
+        */
+       protected function buildCheckBoxes() {
+               // If there is just one item, provide the user with a multi-select field
+               $list = $this->getList();
+               if ( $list->length() == 1 ) {
+                       $list->reset();
+                       $tags = $list->current()->getTags();
+                       if ( $tags ) {
+                               $tags = explode( ',', $tags );
+                       } else {
+                               $tags = array();
+                       }
+
+                       $html = '<table id="mw-edittags-tags-selector">';
+                       $html .= '<tr><td>' . $this->msg( 'tags-edit-existing-tags' )->escaped() .
+                               '</td><td>';
+                       if ( $tags ) {
+                               $html .= $this->getLanguage()->commaList( array_map( 'htmlspecialchars', $tags ) );
+                       } else {
+                               $html .= $this->msg( 'tags-edit-existing-tags-none' )->parse();
+                       }
+                       $html .= '</td></tr>';
+                       $tagSelect = $this->getTagSelect( $tags, $this->msg( 'tags-edit-new-tags' )->plain() );
+                       $html .= '<tr><td>' . $tagSelect[0] . '</td><td>' . $tagSelect[1];
+                       // also output the tags currently applied as a hidden form field, so we
+                       // know what to remove from the revision/log entry when the form is submitted
+                       $html .= Html::hidden( 'wpExistingTags', implode( ',', $tags ) );
+                       $html .= '</td></tr></table>';
+               } else {
+                       // Otherwise, use a multi-select field for adding tags, and a list of
+                       // checkboxes for removing them
+                       $tags = array();
+
+                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+                       for ( $list->reset(); $list->current(); $list->next() ) {
+                               // @codingStandardsIgnoreEnd
+                               $currentTags = $list->current()->getTags();
+                               if ( $currentTags ) {
+                                       $tags = array_merge( $tags, explode( ',', $currentTags ) );
+                               }
+                       }
+                       $tags = array_unique( $tags );
+
+                       $html = '<table id="mw-edittags-tags-selector-multi"><tr><td>';
+                       $tagSelect = $this->getTagSelect( array(), $this->msg( 'tags-edit-add' )->plain() );
+                       $html .= '<p>' . $tagSelect[0] . '</p>' . $tagSelect[1] . '</td><td>';
+                       $html .= Xml::element( 'p', null, $this->msg( 'tags-edit-remove' )->plain() );
+                       $html .= Xml::checkLabel( $this->msg( 'tags-edit-remove-all-tags' )->plain(),
+                               'wpRemoveAllTags', 'mw-edittags-remove-all' );
+                       $i = 0; // used for generating checkbox IDs only
+                       foreach ( $tags as $tag ) {
+                               $html .= Xml::element( 'br' ) . "\n" . Xml::checkLabel( $tag,
+                                       'wpTagsToRemove[]', 'mw-edittags-remove-' . $i++, false, array(
+                                               'value' => $tag,
+                                               'class' => 'mw-edittags-remove-checkbox',
+                                       ) );
+                       }
+                       $html .= '</td></tr></table>';
+               }
+
+               return $html;
+       }
+
+       /**
+        * Returns a <select multiple> element with a list of change tags that can be
+        * applied by users.
+        *
+        * @param array $selectedTags The tags that should be preselected in the
+        * list. Any tags in this list, but not in the list returned by
+        * ChangeTags::listExplicitlyDefinedTags, will be appended to the <select>
+        * element.
+        * @param string $label The text of a <label> to precede the <select>
+        * @return array HTML <label> element at index 0, HTML <select> element at
+        * index 1
+        */
+       protected function getTagSelect( $selectedTags, $label ) {
+               $result = array();
+               $result[0] = Xml::label( $label, 'mw-edittags-tag-list' );
+               $result[1] = Xml::openElement( 'select', array(
+                       'name' => 'wpTagList[]',
+                       'id' => 'mw-edittags-tag-list',
+                       'multiple' => 'multiple',
+                       'size' => '8',
+               ) );
+
+               $tags = ChangeTags::listExplicitlyDefinedTags();
+               $tags = array_unique( array_merge( $tags, $selectedTags ) );
+               foreach ( $tags as $tag ) {
+                       $result[1] .= Xml::option( $tag, $tag, in_array( $tag, $selectedTags ) );
+               }
+
+               $result[1] .= Xml::closeElement( 'select' );
+               return $result;
+       }
+
+       /**
+        * UI entry point for form submission.
+        * @throws PermissionsError
+        * @return bool
+        */
+       protected function submit() {
+               // Check edit token on submission
+               $request = $this->getRequest();
+               $token = $request->getVal( 'wpEditToken' );
+               if ( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
+                       $this->getOutput()->addWikiMsg( 'sessionfailure' );
+                       return false;
+               }
+
+               // Evaluate incoming request data
+               $tagList = $request->getArray( 'wpTagList' );
+               if ( is_null( $tagList ) ) {
+                       $tagList = array();
+               }
+               $existingTags = $request->getVal( 'wpExistingTags' );
+               if ( is_null( $existingTags ) || $existingTags === '' ) {
+                       $existingTags = array();
+               } else {
+                       $existingTags = explode( ',', $existingTags );
+               }
+
+               if ( count( $this->ids ) > 1 ) {
+                       // multiple revisions selected
+                       $tagsToAdd = $tagList;
+                       if ( $request->getBool( 'wpRemoveAllTags' ) ) {
+                               $tagsToRemove = $existingTags;
+                       } else {
+                               $tagsToRemove = $request->getArray( 'wpTagsToRemove' );
+                       }
+               } else {
+                       // single revision selected
+                       // The user tells us which tags they want associated to the revision.
+                       // We have to figure out which ones to add, and which to remove.
+                       $tagsToAdd = array_diff( $tagList, $existingTags );
+                       $tagsToRemove = array_diff( $existingTags, $tagList );
+               }
+
+               if ( !$tagsToAdd && !$tagsToRemove ) {
+                       $status = Status::newFatal( 'tags-edit-none-selected' );
+               } else {
+                       $status = $this->getList()->updateChangeTagsOnAll( $tagsToAdd,
+                               $tagsToRemove, null, $this->reason, $this->getUser() );
+               }
+
+               if ( $status->isGood() ) {
+                       $this->success();
+                       return true;
+               } else {
+                       $this->failure( $status );
+                       return false;
+               }
+       }
+
+       /**
+        * Report that the submit operation succeeded
+        */
+       protected function success() {
+               $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
+               $this->getOutput()->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>",
+                       'tags-edit-success' );
+               $this->wasSaved = true;
+               $this->revList->reloadFromMaster();
+               $this->reason = ''; // no need to spew the reason back at the user
+               $this->showForm();
+       }
+
+       /**
+        * Report that the submit operation failed
+        * @param Status $status
+        */
+       protected function failure( $status ) {
+               $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
+               $this->getOutput()->addWikiText( '<div class="errorbox">' .
+                       $status->getWikiText( 'tags-edit-failure' ) .
+                       '</div>'
+               );
+               $this->showForm();
+       }
+
+       public function getDescription() {
+               return $this->msg( 'tags-edit-title' )->text();
+       }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
+}
index ffe7892..910fe25 100644 (file)
@@ -344,7 +344,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        protected function getWatchlistInfo() {
                $titles = array();
-               $dbr = wfGetDB( DB_MASTER );
+               $dbr = wfGetDB( DB_SLAVE );
 
                $res = $dbr->select(
                        array( 'watchlist' ),
index 9323211..542589f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialFilepath extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Filepath' );
                $this->mAllowedRedirectParams = array( 'width', 'height' );
        }
 
-       // implement by redirecting through Special:Redirect/file
-       function getRedirect( $par ) {
+       /**
+        * Implement by redirecting through Special:Redirect/file.
+        *
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $par ) {
                $file = $par ?: $this->getRequest()->getText( 'file' );
 
                if ( $file ) {
index af86964..8124f10 100644 (file)
@@ -34,6 +34,7 @@ class SpecialImport extends SpecialPage {
        private $interwiki = false;
        private $subproject;
        private $fullInterwikiPrefix;
+       private $mapping = 'default';
        private $namespace;
        private $rootpage = '';
        private $frompage = '';
@@ -101,26 +102,33 @@ class SpecialImport extends SpecialPage {
        private function doImport() {
                $isUpload = false;
                $request = $this->getRequest();
-               $this->namespace = $request->getIntOrNull( 'namespace' );
                $this->sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
                $this->pageLinkDepth = $this->getConfig()->get( 'ExportMaxLinkDepth' ) == 0
                        ? 0
                        : $request->getIntOrNull( 'pagelink-depth' );
-               $this->rootpage = $request->getText( 'rootpage' );
+
+               $this->mapping = $request->getVal( 'mapping' );
+               if ( $this->mapping === 'namespace' ) {
+                       $this->namespace = $request->getIntOrNull( 'namespace' );
+               } elseif ( $this->mapping === 'subpage' ) {
+                       $this->rootpage = $request->getText( 'rootpage' );
+               } else {
+                       $this->mapping = 'default';
+               }
 
                $user = $this->getUser();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
                        $source = Status::newFatal( 'import-token-mismatch' );
-               } elseif ( $this->sourceName == 'upload' ) {
+               } elseif ( $this->sourceName === 'upload' ) {
                        $isUpload = true;
                        if ( $user->isAllowed( 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
-               } elseif ( $this->sourceName == "interwiki" ) {
+               } elseif ( $this->sourceName === 'interwiki' ) {
                        if ( !$user->isAllowed( 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
@@ -163,8 +171,7 @@ class SpecialImport extends SpecialPage {
                        $importer = new WikiImporter( $source->value, $this->getConfig() );
                        if ( !is_null( $this->namespace ) ) {
                                $importer->setTargetNamespace( $this->namespace );
-                       }
-                       if ( !is_null( $this->rootpage ) ) {
+                       } elseif ( !is_null( $this->rootpage ) ) {
                                $statusRootPage = $importer->setTargetRootPage( $this->rootpage );
                                if ( !$statusRootPage->isGood() ) {
                                        $out->wrapWikiMsg(
@@ -219,6 +226,79 @@ class SpecialImport extends SpecialPage {
                }
        }
 
+       private function getMappingFormPart( $sourceName ) {
+               $isSameSourceAsBefore = ( $this->sourceName === $sourceName );
+               $defaultNamespace = $this->getConfig()->get( 'ImportTargetNamespace' );
+               return "<tr>
+                                       <td>
+                                       </td>
+                                       <td class='mw-input'>" .
+                                       Xml::radioLabel(
+                                               $this->msg( 'import-mapping-default' )->text(),
+                                               'mapping',
+                                               'default',
+                                               // mw-import-mapping-interwiki-default, mw-import-mapping-upload-default
+                                               "mw-import-mapping-$sourceName-default",
+                                               ( $isSameSourceAsBefore ?
+                                                       ( $this->mapping === 'default' ) :
+                                                       is_null( $defaultNamespace ) )
+                                       ) .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td>
+                                       </td>
+                                       <td class='mw-input'>" .
+                                       Xml::radioLabel(
+                                               $this->msg( 'import-mapping-namespace' )->text(),
+                                               'mapping',
+                                               'namespace',
+                                               // mw-import-mapping-interwiki-namespace, mw-import-mapping-upload-namespace
+                                               "mw-import-mapping-$sourceName-namespace",
+                                               ( $isSameSourceAsBefore ?
+                                                       ( $this->mapping === 'namespace' ) :
+                                                       !is_null( $defaultNamespace ) )
+                                       ) . ' ' .
+                                       Html::namespaceSelector(
+                                               array(
+                                                       'selected' => ( $isSameSourceAsBefore ?
+                                                               $this->namespace :
+                                                               ( $defaultNamespace || '' ) ),
+                                               ), array(
+                                                       'name' => "namespace",
+                                                       // mw-import-namespace-interwiki, mw-import-namespace-upload
+                                                       'id' => "mw-import-namespace-$sourceName",
+                                                       'class' => 'namespaceselector',
+                                               )
+                                       ) .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td>
+                                       </td>
+                                       <td class='mw-input'>" .
+                                       Xml::radioLabel(
+                                               $this->msg( 'import-mapping-subpage' )->text(),
+                                               'mapping',
+                                               'subpage',
+                                               // mw-import-mapping-interwiki-subpage, mw-import-mapping-upload-subpage
+                                               "mw-import-mapping-$sourceName-subpage",
+                                               ( $isSameSourceAsBefore ? ( $this->mapping === 'subpage' ) : '' )
+                                       ) . ' ' .
+                                       Xml::input( 'rootpage', 50,
+                                               ( $isSameSourceAsBefore ? $this->rootpage : '' ),
+                                               array(
+                                                       // Should be "mw-import-rootpage-...", but we keep this inaccurate
+                                                       // ID for legacy reasons
+                                                       // mw-interwiki-rootpage-interwiki, mw-interwiki-rootpage-upload
+                                                       'id' => "mw-interwiki-rootpage-$sourceName",
+                                                       'type' => 'text'
+                                               )
+                                       ) . ' ' .
+                                       "</td>
+                               </tr>";
+       }
+
        private function showForm() {
                $action = $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) );
                $user = $this->getUser();
@@ -226,6 +306,7 @@ class SpecialImport extends SpecialPage {
                $importSources = $this->getConfig()->get( 'ImportSources' );
 
                if ( $user->isAllowed( 'importupload' ) ) {
+                       $mappingSelection = $this->getMappingFormPart( 'upload' );
                        $out->addHTML(
                                Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
                                        Xml::openElement(
@@ -255,22 +336,11 @@ class SpecialImport extends SpecialPage {
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::input( 'log-comment', 50,
-                                               ( $this->sourceName == 'upload' ? $this->logcomment : '' ),
+                                               ( $this->sourceName === 'upload' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
-                               <tr>
-                                       <td class='mw-label'>" .
-                                       Xml::label(
-                                               $this->msg( 'import-interwiki-rootpage' )->text(),
-                                               'mw-interwiki-rootpage-upload'
-                                       ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                       Xml::input( 'rootpage', 50, $this->rootpage,
-                                               array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
-                                       "</td>
-                               </tr>
+                               $mappingSelection
                                <tr>
                                        <td></td>
                                        <td class='mw-submit'>" .
@@ -301,6 +371,7 @@ class SpecialImport extends SpecialPage {
                                        "</td>
                                </tr>";
                        }
+                       $mappingSelection = $this->getMappingFormPart( 'interwiki' );
 
                        $out->addHTML(
                                Xml::fieldset( $this->msg( 'importinterwiki' )->text() ) .
@@ -413,45 +484,17 @@ class SpecialImport extends SpecialPage {
                                        "</td>
                                </tr>
                                $importDepth
-                               <tr>
-                                       <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                       Html::namespaceSelector(
-                                               array(
-                                                       'selected' => $this->namespace,
-                                                       'all' => '',
-                                               ), array(
-                                                       'name' => 'namespace',
-                                                       'id' => 'namespace',
-                                                       'class' => 'namespaceselector',
-                                               )
-                                       ) .
-                                       "</td>
-                               </tr>
                                <tr>
                                        <td class='mw-label'>" .
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::input( 'log-comment', 50,
-                                               ( $this->sourceName == 'interwiki' ? $this->logcomment : '' ),
+                                               ( $this->sourceName === 'interwiki' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
-                               <tr>
-                                       <td class='mw-label'>" .
-                                       Xml::label(
-                                               $this->msg( 'import-interwiki-rootpage' )->text(),
-                                               'mw-interwiki-rootpage-interwiki'
-                                       ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                       Xml::input( 'rootpage', 50, $this->rootpage,
-                                               array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
-                                       "</td>
-                               </tr>
+                               $mappingSelection
                                <tr>
                                        <td>
                                        </td>
index ecb166a..e9639e1 100644 (file)
@@ -168,15 +168,13 @@ HTML;
                // The testrunner configures QUnit and essentially depends on it. However, test suites
                // are reusable in environments that preload QUnit (or a compatibility interface to
                // another framework). Therefore we have to load it ourselves.
-               $out->addHtml( Html::inlineScript(
-                       ResourceLoader::makeLoaderConditionalScript(
-                               Xml::encodeJsCall( 'mw.loader.using', array(
-                                       array( 'jquery.qunit', 'jquery.qunit.completenessTest' ),
-                                       new XmlJsCode(
-                                               'function () {' . Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) . '}'
-                                       )
-                               ) )
-                       )
+               $out->addHtml( ResourceLoader::makeInlineScript(
+                       Xml::encodeJsCall( 'mw.loader.using', array(
+                               array( 'jquery.qunit', 'jquery.qunit.completenessTest' ),
+                               new XmlJsCode(
+                                       'function () {' . Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) . '}'
+                               )
+                       ) )
                ) );
        }
 
index d4b45fb..2d79aaf 100644 (file)
@@ -84,14 +84,26 @@ class ImageListPager extends TablePager {
        function __construct( IContextSource $context, $userName = null, $search = '',
                $including = false, $showAll = false
        ) {
+               $this->setContext( $context );
                $this->mIncluding = $including;
                $this->mShowAll = $showAll;
 
                if ( $userName !== null && $userName !== '' ) {
                        $nt = Title::newFromText( $userName, NS_USER );
+                       $user = User::newFromName( $userName, false );
                        if ( !is_null( $nt ) ) {
                                $this->mUserName = $nt->getText();
                        }
+                       if ( !$user || ( $user->isAnon() && !User::isIP( $user->getName() ) ) ) {
+                               $this->getOutput()->wrapWikiMsg(
+                                       "<div class=\"mw-userpage-userdoesnotexist error\">\n$1\n</div>",
+                                       array(
+                                               'listfiles-userdoesnotexist',
+                                               wfEscapeWikiText( $userName ),
+                                       )
+                               );
+                       }
+
                }
 
                if ( $search !== '' && !$this->getConfig()->get( 'MiserMode' ) ) {
@@ -107,7 +119,7 @@ class ImageListPager extends TablePager {
                }
 
                if ( !$including ) {
-                       if ( $context->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) {
+                       if ( $this->getRequest()->getText( 'sort', 'img_date' ) == 'img_date' ) {
                                $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                        } else {
                                $this->mDefaultDirection = IndexPager::DIR_ASCENDING;
index 88184f9..f16e5ba 100644 (file)
@@ -203,7 +203,7 @@ class SpecialLog extends SpecialPage {
                if ( $logBody ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                                       $this->getRevisionButton(
+                                       $this->getActionButtons(
                                                $loglist->beginLogEventsList() .
                                                        $logBody .
                                                        $loglist->endLogEventsList()
@@ -215,30 +215,50 @@ class SpecialLog extends SpecialPage {
                }
        }
 
-       private function getRevisionButton( $formcontents ) {
-               # If the user doesn't have the ability to delete log entries,
-               # don't bother showing them the button.
-               if ( !$this->getUser()->isAllowedAll( 'deletedhistory', 'deletelogentry' ) ) {
+       private function getActionButtons( $formcontents ) {
+               $user = $this->getUser();
+               $canRevDelete = $user->isAllowedAll( 'deletedhistory', 'deletelogentry' );
+               $canModifyTags = $user->isAllowed( 'changetags' );
+               # If the user doesn't have the ability to delete log entries nor edit tags,
+               # don't bother showing them the button(s).
+               if ( !$canRevDelete && !$canModifyTags ) {
                        return $formcontents;
                }
 
-               # Show button to hide log entries
+               # Show button to hide log entries and/or edit change tags
                $s = Html::openElement(
                        'form',
                        array( 'action' => wfScript(), 'id' => 'mw-log-deleterevision-submit' )
                ) . "\n";
-               $s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
-               $s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
+               $s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
                $s .= Html::hidden( 'type', 'logging' ) . "\n";
-               $button = Html::element(
-                       'button',
-                       array(
-                               'type' => 'submit',
-                               'class' => "deleterevision-log-submit mw-log-deleterevision-button"
-                       ),
-                       $this->msg( 'showhideselectedlogentries' )->text()
-               ) . "\n";
-               $s .= $button . $formcontents . $button;
+
+               $buttons = '';
+               if ( $canRevDelete ) {
+                       $buttons .= Html::element(
+                               'button',
+                               array(
+                                       'type' => 'submit',
+                                       'name' => 'revisiondelete',
+                                       'value' => '1',
+                                       'class' => "deleterevision-log-submit mw-log-deleterevision-button"
+                               ),
+                               $this->msg( 'showhideselectedlogentries' )->text()
+                       ) . "\n";
+               }
+               if ( $canModifyTags ) {
+                       $buttons .= Html::element(
+                               'button',
+                               array(
+                                       'type' => 'submit',
+                                       'name' => 'editchangetags',
+                                       'value' => '1',
+                                       'class' => "editchangetags-log-submit mw-log-editchangetags-button"
+                               ),
+                               $this->msg( 'log-edit-tags' )->text()
+                       ) . "\n";
+               }
+               $s .= $buttons . $formcontents . $buttons;
                $s .= Html::closeElement( 'form' );
 
                return $s;
index 368d491..b6cf8e4 100644 (file)
@@ -152,7 +152,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                if ( count( $errors ) ) {
                        $this->showMergeForm();
-                       $out->addHTML( implode( "\n", $errors ) );
+                       $this->getOutput()->addHTML( implode( "\n", $errors ) );
                } else {
                        $this->showHistory();
                }
index 6cea158..3d8ff97 100644 (file)
@@ -41,11 +41,11 @@ class SpecialMyLanguage extends RedirectSpecialArticle {
         * If the special page is a redirect, then get the Title object it redirects to.
         * False otherwise.
         *
-        * @param string $par Subpage string
-        * @return Title|bool
+        * @param string|null $subpage
+        * @return Title
         */
-       public function getRedirect( $par ) {
-               $title = $this->findTitle( $par );
+       public function getRedirect( $subpage ) {
+               $title = $this->findTitle( $subpage );
                // Go to the main page if given invalid title.
                if ( !$title ) {
                        $title = Title::newMainPage();
@@ -59,18 +59,22 @@ class SpecialMyLanguage extends RedirectSpecialArticle {
         * it returns Page/fi if it exists, otherwise Page/de if it exists,
         * otherwise Page.
         *
-        * @param string $par
+        * @param string|null $subpage
         * @return Title|null
         */
-       public function findTitle( $par ) {
+       public function findTitle( $subpage ) {
                // base = title without language code suffix
                // provided = the title as it was given
-               $base = $provided = Title::newFromText( $par );
+               $base = $provided = null;
+               if ( $subpage !== null ) {
+                       $provided = Title::newFromText( $subpage );
+                       $base = $provided;
+               }
 
-               if ( $base && strpos( $par, '/' ) !== false ) {
-                       $pos = strrpos( $par, '/' );
-                       $basepage = substr( $par, 0, $pos );
-                       $code = substr( $par, $pos + 1 );
+               if ( $provided && strpos( $subpage, '/' ) !== false ) {
+                       $pos = strrpos( $subpage, '/' );
+                       $basepage = substr( $subpage, 0, $pos );
+                       $code = substr( $subpage, $pos + 1 );
                        if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) {
                                $base = Title::newFromText( $basepage );
                        }
index 9b8d52b..c8db1d8 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMypage extends RedirectSpecialArticle {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Mypage' );
        }
 
-       function getRedirect( $subpage ) {
-               if ( strval( $subpage ) !== '' ) {
-                       return Title::makeTitle( NS_USER, $this->getUser()->getName() . '/' . $subpage );
-               } else {
+       /**
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $subpage ) {
+               if ( $subpage === null || $subpage === '' ) {
                        return Title::makeTitle( NS_USER, $this->getUser()->getName() );
                }
+
+               return Title::makeTitle( NS_USER, $this->getUser()->getName() . '/' . $subpage );
        }
 }
 
@@ -49,16 +53,20 @@ class SpecialMypage extends RedirectSpecialArticle {
  * @ingroup SpecialPage
  */
 class SpecialMytalk extends RedirectSpecialArticle {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Mytalk' );
        }
 
-       function getRedirect( $subpage ) {
-               if ( strval( $subpage ) !== '' ) {
-                       return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() . '/' . $subpage );
-               } else {
+       /**
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $subpage ) {
+               if ( $subpage === null || $subpage === '' ) {
                        return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() );
                }
+
+               return Title::makeTitle( NS_USER_TALK, $this->getUser()->getName() . '/' . $subpage );
        }
 }
 
@@ -68,13 +76,17 @@ class SpecialMytalk extends RedirectSpecialArticle {
  * @ingroup SpecialPage
  */
 class SpecialMycontributions extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Mycontributions' );
                $this->mAllowedRedirectParams = array( 'limit', 'namespace', 'tagfilter',
                        'offset', 'dir', 'year', 'month', 'feed' );
        }
 
-       function getRedirect( $subpage ) {
+       /**
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $subpage ) {
                return SpecialPage::getTitleFor( 'Contributions', $this->getUser()->getName() );
        }
 }
@@ -85,12 +97,16 @@ class SpecialMycontributions extends RedirectSpecialPage {
  * @ingroup SpecialPage
  */
 class SpecialMyuploads extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'Myuploads' );
                $this->mAllowedRedirectParams = array( 'limit', 'ilshowall', 'ilsearch' );
        }
 
-       function getRedirect( $subpage ) {
+       /**
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $subpage ) {
                return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
        }
 }
@@ -101,12 +117,16 @@ class SpecialMyuploads extends RedirectSpecialPage {
  * @ingroup SpecialPage
  */
 class SpecialAllMyUploads extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'AllMyUploads' );
                $this->mAllowedRedirectParams = array( 'limit', 'ilsearch' );
        }
 
-       function getRedirect( $subpage ) {
+       /**
+        * @param string|null $subpage
+        * @return Title
+        */
+       public function getRedirect( $subpage ) {
                $this->mAddedRedirectParams['ilshowall'] = 1;
 
                return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
index 17115e8..53789c0 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialPermanentLink extends RedirectSpecialPage {
-       function __construct() {
+       public function __construct() {
                parent::__construct( 'PermanentLink' );
                $this->mAllowedRedirectParams = array();
        }
 
-       function getRedirect( $subpage ) {
+       /**
+        * @param string|null $subpage
+        * @return Title|bool
+        */
+       public function getRedirect( $subpage ) {
                $subpage = intval( $subpage );
                if ( $subpage === 0 ) {
                        # throw an error page when no subpage was given
index cea00fa..ef61f94 100644 (file)
@@ -55,6 +55,8 @@ class SpecialPreferences extends SpecialPage {
                        );
                }
 
+               $out->addHelpLink( 'Help:Preferences' );
+
                $htmlForm = Preferences::getFormObject( $this->getUser(), $this->getContext() );
                $htmlForm->setSubmitCallback( array( 'Preferences', 'tryUISubmit' ) );
 
index dd9198c..0e1ce53 100644 (file)
@@ -68,12 +68,6 @@ class SpecialProtectedtitles extends SpecialPage {
         */
        function formatRow( $row ) {
 
-               static $infinity = null;
-
-               if ( is_null( $infinity ) ) {
-                       $infinity = wfGetDB( DB_SLAVE )->getInfinity();
-               }
-
                $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
                if ( !$title ) {
 
@@ -100,9 +94,9 @@ class SpecialProtectedtitles extends SpecialPage {
                $lang = $this->getLanguage();
                $expiry = strlen( $row->pt_expiry ) ?
                        $lang->formatExpiry( $row->pt_expiry, TS_MW ) :
-                       $infinity;
+                       'infinity';
 
-               if ( $expiry != $infinity ) {
+               if ( $expiry !== 'infinity' ) {
                        $user = $this->getUser();
                        $description_items[] = $this->msg(
                                'protect-expiring-local',
index 64b0eca..1387988 100644 (file)
@@ -263,6 +263,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        );
        }
 
+       protected function getDB() {
+               return wfGetDB( DB_SLAVE, 'recentchanges' );
+       }
+
        public function outputFeedLinks() {
                $this->addFeedLinks( $this->getFeedQuery() );
        }
index e0a964e..62025e7 100644 (file)
@@ -132,18 +132,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // $this->ids = array_map( 'intval', $this->ids );
                $this->ids = array_unique( array_filter( $this->ids ) );
 
-               if ( $request->getVal( 'action' ) == 'historysubmit'
-                       || $request->getVal( 'action' ) == 'revisiondelete'
-               ) {
-                       // For show/hide form submission from history page
-                       // Since we are access through index.php?title=XXX&action=historysubmit
-                       // getFullTitle() will contain the target title and not our title
-                       $this->targetObj = $this->getFullTitle();
-                       $this->typeName = 'revision';
-               } else {
-                       $this->typeName = $request->getVal( 'type' );
-                       $this->targetObj = Title::newFromText( $request->getText( 'target' ) );
-               }
+               $this->typeName = $request->getVal( 'type' );
+               $this->targetObj = Title::newFromText( $request->getText( 'target' ) );
 
                # For reviewing deleted files...
                $this->archiveName = $request->getVal( 'file' );
@@ -616,7 +606,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // Messages: revdelete-success, logdelete-success
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
                $this->getOutput()->wrapWikiMsg(
-                       "<span class=\"success\">\n$1\n</span>",
+                       "<div class=\"successbox\">\n$1\n</div>",
                        $this->typeLabels['success']
                );
                $this->wasSaved = true;
@@ -631,7 +621,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function failure( $status ) {
                // Messages: revdelete-failure, logdelete-failure
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
-               $this->getOutput()->addWikiText( $status->getWikiText( $this->typeLabels['failure'] ) );
+               $this->getOutput()->addWikiText( '<div class="errorbox">' .
+                       $status->getWikiText( $this->typeLabels['failure'] ) .
+                       '</div>'
+               );
                $this->showForm();
        }
 
index eff06f4..c3234e1 100644 (file)
@@ -45,6 +45,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                        return;
                }
 
+               $out->addHelpLink( 'Help:Special pages' );
                $this->outputPageList( $groups );
        }
 
@@ -95,22 +96,14 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                $includesCachedPages = false;
 
                foreach ( $groups as $group => $sortedPages ) {
-                       $total = count( $sortedPages );
-                       $middle = ceil( $total / 2 );
-                       $count = 0;
 
                        $out->wrapWikiMsg(
                                "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n",
                                "specialpages-group-$group"
                        );
                        $out->addHTML(
-                               Html::openElement(
-                                       'table',
-                                       array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' )
-                               ) . "\n" .
-                               Html::openElement( 'tr' ) . "\n" .
-                               Html::openElement( 'td', array( 'style' => 'width:30%;vertical-align:top' ) ) . "\n" .
-                               Html::openElement( 'ul' ) . "\n"
+                               Html::openElement( 'div', array( 'class' => 'mw-specialpages-list' ) )
+                               . '<ul>'
                        );
                        foreach ( $sortedPages as $desc => $specialpage ) {
                                list( $title, $restricted, $cached ) = $specialpage;
@@ -131,21 +124,10 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                                array( 'class' => implode( ' ', $pageClasses ) ),
                                                $link
                                        ) . "\n" );
-
-                               # Split up the larger groups
-                               $count++;
-                               if ( $total > 3 && $count == $middle ) {
-                                       $out->addHTML(
-                                               Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
-                                               Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
-                                               Html::openElement( 'td', array( 'style' => 'width:30%' ) ) . Html::openElement( 'ul' ) . "\n"
-                                       );
-                               }
                        }
                        $out->addHTML(
-                               Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
-                               Html::element( 'td', array( 'style' => 'width:30%' ), '' ) .
-                               Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n"
+                               Html::closeElement( 'ul' ) .
+                               Html::closeElement( 'div' )
                        );
                }
 
index 1f339d1..0acbf95 100644 (file)
@@ -126,7 +126,7 @@ class SpecialStatistics extends SpecialPage {
         * @return string
         */
        private function getPageStats() {
-               return Xml::openElement( 'tr' ) .
+               $pageStatsHtml = Xml::openElement( 'tr' ) .
                        Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-pages' )->parse() ) .
                        Xml::closeElement( 'tr' ) .
                                $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Allpages' ),
@@ -136,11 +136,17 @@ class SpecialStatistics extends SpecialPage {
                                $this->formatRow( $this->msg( 'statistics-pages' )->parse(),
                                        $this->getLanguage()->formatNum( $this->total ),
                                        array( 'class' => 'mw-statistics-pages' ),
-                                       'statistics-pages-desc' ) .
-                               $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'MediaStatistics' ),
-                                       $this->msg( 'statistics-files' )->parse() ),
-                                       $this->getLanguage()->formatNum( $this->images ),
-                                       array( 'class' => 'mw-statistics-files' ) );
+                                       'statistics-pages-desc' );
+
+               // Show the image row only, when there are files or upload is possible
+               if ( $this->images !== 0 || $this->getConfig()->get( 'EnableUploads' ) ) {
+                       $pageStatsHtml .= $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'MediaStatistics' ),
+                               $this->msg( 'statistics-files' )->parse() ),
+                               $this->getLanguage()->formatNum( $this->images ),
+                               array( 'class' => 'mw-statistics-files' ) );
+               }
+
+               return $pageStatsHtml;
        }
 
        private function getEditStats() {
index 6f9254b..3f1ea42 100644 (file)
@@ -787,6 +787,10 @@ class UploadForm extends HTMLForm {
        protected $mMaxUploadSize = array();
 
        public function __construct( array $options = array(), IContextSource $context = null ) {
+               if ( $context instanceof IContextSource ) {
+                       $this->setContext( $context );
+               }
+
                $this->mWatch = !empty( $options['watch'] );
                $this->mForReUpload = !empty( $options['forreupload'] );
                $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
index 10edbcf..c4da642 100644 (file)
@@ -194,13 +194,13 @@ class LoginForm extends SpecialPage {
                        && in_array( $entryError->getKey(), self::getValidErrorMessages() )
                ) {
                        $this->mEntryErrorType = 'error';
-                       $this->mEntryError = $entryError->rawParams( $loginreqlink )->escaped();
+                       $this->mEntryError = $entryError->rawParams( $loginreqlink )->parse();
 
                } elseif ( $entryWarning->exists()
                        && in_array( $entryWarning->getKey(), self::getValidErrorMessages() )
                ) {
                        $this->mEntryErrorType = 'warning';
-                       $this->mEntryError = $entryWarning->rawParams( $loginreqlink )->escaped();
+                       $this->mEntryError = $entryWarning->rawParams( $loginreqlink )->parse();
                }
 
                if ( $wgEnableEmail ) {
index c1a9593..9a1c5e5 100644 (file)
@@ -265,8 +265,8 @@ class SpecialVersion extends SpecialPage {
                        $version = $wgVersion . ' ' .
                                wfMessage(
                                        'version-svn-revision',
-                                       isset( $info['directory-rev'] ) ? $info['directory-rev'] : '',
-                                       $info['checkout-rev']
+                                       isset( $svnInfo['directory-rev'] ) ? $svnInfo['directory-rev'] : '',
+                                       isset( $svnInfo['checkout-rev'] ) ? $svnInfo['checkout-rev'] : ''
                                )->text();
                }
 
index 40cce5e..0b3175a 100644 (file)
@@ -73,7 +73,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
 
                $this->target = Title::newFromURL( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
-                       $out->addHTML( $this->whatlinkshereForm() );
+                       if ( !$this->including() ) {
+                               $out->addHTML( $this->whatlinkshereForm() );
+                       }
 
                        return;
                }
index b2ffe50..2a65c71 100644 (file)
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './index.php';
index 24ca33f..ae723e9 100644 (file)
@@ -15,6 +15,7 @@
                "resources/src/mediawiki.action",
                "resources/src/mediawiki.api",
                "resources/src/mediawiki.language",
+               "resources/src/mediawiki.messagePoster",
                "resources/src/mediawiki.page",
                "resources/src/mediawiki.special",
                "resources/src/mediawiki.toolbar",
index 07d47ed..e1a2047 100644 (file)
@@ -4483,21 +4483,20 @@ class Language {
        /**
         * Decode an expiry (block, protection, etc) which has come from the DB
         *
-        * @todo FIXME: why are we returnings DBMS-dependent strings???
-        *
         * @param string $expiry Database expiry String
         * @param bool|int $format True to process using language functions, or TS_ constant
         *     to return the expiry in a given timestamp
+        * @param string $inifinity If $format is not true, use this string for infinite expiry
         * @return string
         * @since 1.18
         */
-       public function formatExpiry( $expiry, $format = true ) {
-               static $infinity;
-               if ( $infinity === null ) {
-                       $infinity = wfGetDB( DB_SLAVE )->getInfinity();
+       public function formatExpiry( $expiry, $format = true, $infinity = 'infinity' ) {
+               static $dbInfinity;
+               if ( $dbInfinity === null ) {
+                       $dbInfinity = wfGetDB( DB_SLAVE )->getInfinity();
                }
 
-               if ( $expiry == '' || $expiry == $infinity ) {
+               if ( $expiry == '' || $expiry === 'infinity' || $expiry == $dbInfinity ) {
                        return $format === true
                                ? $this->getMessageFromDB( 'infiniteblock' )
                                : $infinity;
index d4df1ab..fb6f0eb 100644 (file)
@@ -41,7 +41,9 @@
        'aa' => 'Qafár af',    # Afar
        'ab' => 'Аҧсшәа', # Abkhaz
        'ace' => 'Acèh',       # Aceh
-       'aeb' => 'تونسي',  # Tunisian Arabic
+       'aeb' => 'تونسي/Tûnsi',   # Tunisian Arabic (multiple scripts - defaults to Arabic)
+       'aeb-arab' => 'تونسي',     # Tunisian Arabic (Arabic Script)
+       'aeb-latn' => 'Tûnsi', # Tunisian Arabic (Latin Script)
        'af' => 'Afrikaans',    # Afrikaans
        'ak' => 'Akan',         # Akan
        'aln' => 'Gegë',       # Gheg Albanian
index 6ef231d..02bcc5f 100644 (file)
        "metadata-expand": "Peuleumah tapeusili teunamah",
        "metadata-collapse": "Peusom tapeusili teunamah",
        "metadata-fields": "Bideuëng mètadata gamba nyang na lam peusan nyoë keuneuk geupasoë bak tampilan halaman gamba 'oh watèë tabel mètadata geutôp.\nData nyang la'én eunteuk teupeusom keudroë.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Orientasi",
        "exif-xresolution": "Resolusi linteuëng",
        "exif-yresolution": "Rèsolusi buju",
+       "exif-software": "Software geungui",
+       "exif-exifversion": "Versi Exif",
+       "exif-datetimedigitized": "Uroë buleuën ngön watèë digital",
+       "exif-orientation-1": "Biasa",
        "namespacesall": "ban dum",
        "monthsall": "ban dum",
        "recreate": "Peugöt ulang",
diff --git a/languages/i18n/aeb-arab.json b/languages/i18n/aeb-arab.json
new file mode 100644 (file)
index 0000000..721b6d6
--- /dev/null
@@ -0,0 +1,652 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Abanima",
+                       "Csisc",
+                       "Kuwaity26",
+                       "Malekbr",
+                       "아라",
+                       "Aħmedbaɛl",
+                       "GeekEmad"
+               ]
+       },
+       "tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
+       "tog-showtoolbar": "أظهر شريط التحرير (يتطلب جافاسكربت)",
+       "tog-editondblclick": "عدل الصفحات عند الضغط المزدوج (جافاسكربت)",
+       "tog-editsectiononrightclick": "فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)",
+       "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": "أزل الفرق بعد القيام باسترجاع",
+       "underline-default": "تبعا لإعدادات المتصفح",
+       "editfont-style": "نمط خط منطقة التحرير:",
+       "editfont-default": "تبعا لإعدادات المتصفح",
+       "editfont-monospace": "خط ثابت العرض",
+       "editfont-sansserif": "خط بلا زوائد",
+       "editfont-serif": "خط بزوائد",
+       "category_header": "صفحات تصنيف \"$1\"",
+       "subcategories": "التصنيفات الفرعية",
+       "category-media-header": "الوسائط في التصنيف \"$1\"",
+       "category-empty": "''هذا التصنيف لا يحتوي حاليا على صفحات أو وسائط.''",
+       "hidden-category-category": "تصنيفات مخفية",
+       "category-subcat-count": "{{PLURAL:$2|لا تصانيف فرعية في هذا التصنيف|هذا التصنيف فيه التصنيف الفرعي التالي فقط.|هذا التصنيف فيه {{PLURAL:$1||هذا التصنيف الفرعي|هذين التصنيفين الفرعيين|هذه ال$1 تصانيف الفرعية|هذه ال$1 تصنيفا فرعيا|هذه ال$1 تصنيف فرعي}}، من إجمالي $2.}}",
+       "category-subcat-count-limited": "هذا التصنيف فيه {{PLURAL:$1||التصنيف الفرعي التالي|التصنيفين الفرعيين التاليين|$1 تصانيف فرعية تالية|$1 تصنيفا فرعيا تاليا|$1 تصنيف فرعي تالي}}.",
+       "category-article-count": "{{PLURAL:$2|لا يحتوي هذا التصنيف أي صفحات.|هذا التصنيف يحتوي على الصفحة التالية فقط.|{{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|ال$1 صفحات التالية|ال$1 صفحة التالية|ال$1 صفحة التالية}} في هذا التصنيف، من إجمالي $2.}}",
+       "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": "صفحات مفهرسة",
+       "noindex-category": "صفحات غير مفهرسة",
+       "broken-file-category": "صفحات تحتوي وصلات ملفات معطوبة",
+       "about": "عن",
+       "article": "صفحة محتوى",
+       "newwindow": "(تفتح في نافذة جديدة)",
+       "mypage": "صفحتي",
+       "mytalk": "نقاشي",
+       "copyright": "المحتوى متوفر تحت $1.",
+       "badaccess": "خطأ في السماح",
+       "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
+       "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
+       "versionrequired": "تلزم نسخة $1 من ميدياويكي",
+       "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
+       "youhavenewmessages": "توجد لديك $1 ($2).",
+       "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
+       "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}",
+       "feedlinks": "التغذية:",
+       "feed-invalid": "نوع اشتراك التلقيم غير صحيح.",
+       "feed-unavailable": "التلقيمات غير متوفرة",
+       "site-rss-feed": "$1 تلقيم أر إس إس",
+       "page-rss-feed": "\"$1\" تلقيم أر إس إس",
+       "page-atom-feed": "$1 تلقيم أتوم",
+       "sort-descending": "ترتيب تنازلي",
+       "sort-ascending": "ترتيب تصاعدي",
+       "nstab-user": "صفحة مستخدم",
+       "nstab-media": "صفحة وسيط",
+       "nstab-project": "صفحة مشروع",
+       "nstab-template": "قالب",
+       "nstab-help": "صفحة مساعدة",
+       "nstab-category": "تصنيف",
+       "nosuchaction": "لا يوجد فعل كهذا",
+       "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.\nهذا ربما يشير أيضا إلى علة في {{SITENAME}}.",
+       "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
+       "nospecialpagetext": "<strong>لقد طلبت صفحة خاصة غير صحيحة.</strong>\n\nقائمة بالصفحات الخاصة الصحيحة يمكن إيجادها في [[Special:SpecialPages|{{int:specialpages}}]].",
+       "databaseerror": "خطأ في قاعدة البيانات",
+       "laggedslavemode": "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
+       "readonly": "قاعدة البيانات مغلقة",
+       "enterlockreason": "أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق",
+       "readonlytext": "قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.\n\nالإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1",
+       "missingarticle-rev": "(رقم المراجعة: $1)",
+       "missingarticle-diff": "(فرق: $1، $2)",
+       "readonly_lag": "تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي",
+       "internalerror": "خطأ داخلي",
+       "internalerror_info": "خطأ داخلي: $1",
+       "filecopyerror": "لم يمكن نسخ الملف \"$1\" إلى \"$2\".",
+       "filerenameerror": "لم يمكن إعادة تسمية الملف \"$1\" إلى \"$2\".",
+       "filedeleteerror": "لم يمكن حذف الملف \"$1\".",
+       "directorycreateerror": "لم يمكن إنشاء المجلد \"$1\".",
+       "filenotfound": "لم يمكن إيجاد الملف \"$1\".",
+       "unexpected": "قيمة غير متوقعة: \"$1\"=\"$2\".",
+       "formerror": "خطأ: لم يمكن تنفيذ الاستمارة",
+       "badarticleerror": "لا يمكن إجراء هذا الفعل على هذه الصفحة.",
+       "cannotdelete": "تعذر حذف الصفحة أو الملف \"$1\".\nربما حذفها شحص آخر.",
+       "cannotdelete-title": "لا يمكن حذف الصفحة \"$1\"",
+       "badtitle": "عنوان سيء",
+       "badtitletext": "عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.\nومن الممكن وجود رموز لا تصلح للاستخدام في العناوين.",
+       "perfcached": "البيانات التالية مختزنة وقد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مختزنة|مختزنتان|مختزنة}}.",
+       "perfcachedts": "البيانات التالية مختزنة وكان آخر تحديث لها في $1. {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}} على الأكثر {{PLURAL:$4||مختزنة|مختزنتان|مختزنة}}.",
+       "querypage-no-updates": "التحديثات لهذه الصفحة معطلة حاليا.\nالبيانات هنا لن يتم تحديثها حاليا.",
+       "viewsource": "اعرض المصدر",
+       "viewsource-title": "إظهار مصدر $1",
+       "actionthrottled": "لا يمكن عمل المزيد من هذا الفعل",
+       "actionthrottledtext": "كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
+       "protectedpagetext": "هذه الصفحة تمت حمايتها لمنع التعديل.",
+       "viewsourcetext": "يمكنك رؤية ونسخ مصدر هذه الصفحة:",
+       "viewyourtext": "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
+       "protectedinterface": "هذه الصفحة توفر نص الواجهة للبرنامج، وهي مقفلة لمنع التخريب.",
+       "editinginterface": "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.\nسوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.\nللترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
+       "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
+       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
+       "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
+       "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
+       "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.",
+       "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو ''$2''.",
+       "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nالمدير الذي قام بغلقه قدم التفسير التالي: \"$3\".",
+       "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
+       "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»",
+       "exception-nologin": "غير مسجل الدخول",
+       "virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
+       "virus-scanfailed": "فشل المسح (كود $1)",
+       "virus-unknownscanner": "مضاد فيروسات غير معروف:",
+       "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
+       "yourname": "اسم المستخدم:",
+       "yourpassword": "كلمة السر:",
+       "yourpasswordagain": "أعد كتابة كلمة السر:",
+       "remembermypassword": "تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)",
+       "yourdomainname": "نطاقك:",
+       "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
+       "login": "ادخل",
+       "userlogin": "ادخل / أنشئ حسابا",
+       "userloginnocreate": "دخول",
+       "logout": "اخرج",
+       "userlogout": "خروج",
+       "notloggedin": "غير مسجل الدخول",
+       "nologin": "ألا تمتلك حسابا؟ '''$1'''.",
+       "nologinlink": "أنشئ حسابا",
+       "createaccount": "أنشئ حسابا",
+       "gotaccount": "تمتلك حسابا بالفعل؟ '''$1'''.",
+       "gotaccountlink": "ادخل",
+       "userlogin-resetlink": "أنسيت بيانات الولوج؟",
+       "createaccountmail": "بواسطة البريد الإلكتروني",
+       "createaccountreason": "السبب:",
+       "badretype": "كلمات السر التي أدخلتها لا تتطابق.",
+       "userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
+       "loginerror": "خطأ في الدخول",
+       "createaccounterror": "تعذر إنشاء حساب المستخدم: $1",
+       "nocookiesnew": "تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.\nيستخدم {{SITENAME}} كوكيز لتسجيل الدخول.\nلديك الكوكيز معطلة.\nمن فضلك فعلها، ثم سجل الدخول باسم المستخدم وكلمة السر الجديدين.",
+       "nocookieslogin": "يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.\nالكوكيز معطلة لديك.\nمن فضلك فعلها ثم حاول مرة أخرى.",
+       "nocookiesfornew": "لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. \nتأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.",
+       "noname": "لم تحدد اسم مستخدم صحيح.",
+       "loginsuccesstitle": "تم الدخول بشكل صحيح",
+       "loginsuccess": "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"$1\".'''",
+       "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].",
+       "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
+       "nouserspecified": "يجب عليك تحديد اسم مستخدم.",
+       "login-userblocked": "هذا المستخدم ممنوع. لا يسمح بالولوج.",
+       "wrongpassword": "كلمة السر التي أدخلتها غير صحيحة.\nمن فضلك حاول مرة أخرى.",
+       "wrongpasswordempty": "كلمة السر المدخلة كانت فارغة.\nمن فضلك حاول مرة أخرى.",
+       "passwordtooshort": "يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.",
+       "password-name-match": "يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.",
+       "password-login-forbidden": "تم منع استخدام اسم المستخدم هذا وكلمة السر.",
+       "mailmypassword": "أرسل لي كلمة سر جديدة",
+       "passwordremindertitle": "كلمة سر مؤقتة جديدة ل{{SITENAME}}",
+       "passwordremindertext": "لقد طلب شخص ما (غالبا أنت، من عنوان الآيبي $1) كلمة سر جديدة ل{{SITENAME}} ($4).\nأنشئت كلمة سر مؤقتة للمستخدم \"$2\" وجعلت \"$3\".\nلو أن هذا ما تريده، فعليك أن تقوم بتسجيل الدخول واختيار كلمة سر جديدة الآن.\nسوف تنتهي مدة صلاحية كلمة سرك المؤقتة في غضون {{PLURAL:$5|أقل من يوم واحد|يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}.\n\nإذا كان الذي قام بهذا الطلب شخص آخر أو إذا تذكرت كلمة سرك ولا ترغب  في تغييرها، فبإمكانك أن تتجاهل هذه الرسالة وأن تستمر في استخدام كلمة سرك القديمة.",
+       "noemail": "لا يوجد عنوان بريد إلكتروني مسجل للمستخدم \"$1\".",
+       "noemailcreate": "عليك تقديم عنوان بريد إلكتروني صالح",
+       "passwordsent": "تم إرسال كلمة سر جديدة إلى عنوان البريد الإلكتروني المسجل للمستخدم \"$1\".\nمن فضلك حاول تسجيل الدخول مرة ثانية بعد استلامها.",
+       "blocked-mailpassword": "تم منع عنوان الأيبي الخاص بك من التحرير، ولمنع التخريب لا يمكنك أن تستخدم خاصية استرجاع كلمة السر.",
+       "eauthentsent": "تم إرسال رسالة تأكيد إلكترونية إلى العنوان المسمى.\nحتى ترسل أي رسالة أخرى لذلك الحساب عليك أن تتبع التعليمات الواردة في الرسالة لتأكيد أن هذا الحساب هو لك بالفعل.",
+       "throttled-mailpassword": "تم بالفعل إرسال تذكير بكلمة السر، في ال{{PLURAL:$1||ساعة الماضية|ساعتين الماضيتين|$1 ساعات الماضية|$1 ساعة الماضية}}.\nلمنع التخريب، سيتم إرسال تذكير واحد كل {{PLURAL:$1||ساعة|ساعتين|$1 ساعات|$1 ساعة}}.",
+       "mailerror": "خطأ أثناء إرسال البريد: $1",
+       "acct_creation_throttle_hit": "أنشأ زوار هذه الويكي باستخدام عنوان آيبيك {{PLURAL:$1||حسابا واحدا|حسابين|$1 حسابات|$1 حسابا|$1 حساب}} في اليوم الماضي، وهو الحد الأقصى المسموح به في هذه الفترة الزمنية.\nوكنتيجة لذلك، لن يتمكن الزوار الذين يستخدمون عنوان الأيبي هذا من إنشاء أي حسابات أخرى حاليا.",
+       "emailauthenticated": "تم تأكيد بريدك الإلكتروني في $2 الساعة $3.",
+       "emailnotauthenticated": "لم يتم التحقق من بريدك الإلكتروني.\nلن يتم إرسال رسائل لأي من الميزات التالية.",
+       "noemailprefs": "حدد عنوان بريد إلكتروني في تفضيلاتك لهذه الخصائص لتعمل.",
+       "emailconfirmlink": "أكد عنوان بريدك الإلكتروني",
+       "invalidemailaddress": "لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.\nضع عنوانا مضبوطا أو أفرغ هذا الحقل.",
+       "cannotchangeemail": "تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي",
+       "emaildisabled": "لا يمكن إرسال رسائل البريد الإلكتروني من هذا الموقع.",
+       "accountcreated": "تم إنشاء الحساب",
+       "accountcreatedtext": "تم إنشاء الحساب الخاص ب$1.",
+       "createaccount-title": "إنشاء حساب في {{SITENAME}}",
+       "createaccount-text": "شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم \"$2\"، كلمة السر \"$3\".\nينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.\n\nيمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.",
+       "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر قبل المحاولة مرة أخرى.",
+       "login-abort-generic": "لم ينجح ولوجك - إجهاض",
+       "loginlanguagelabel": "اللغة: $1",
+       "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
+       "pt-login": "Odkul",
+       "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
+       "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
+       "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
+       "resetpass_header": "غير كلمة سر الحساب",
+       "oldpassword": "كلمة السر القديمة:",
+       "newpassword": "كلمة السر الجديدة:",
+       "retypenew": "أعد كتابة كلمة السر الجديدة:",
+       "resetpass_submit": "ضبط كلمة السر والدخول",
+       "changepassword-success": "تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...",
+       "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
+       "resetpass-no-info": "يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.",
+       "resetpass-submit-loggedin": "تغيير كلمة السر",
+       "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
+       "resetpass-temp-password": "كلمة سر مؤقتة:",
+       "passwordreset": "إعادة ضبط كلمة السر",
+       "passwordreset-legend": "إعادة تعيين كلمة السر",
+       "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
+       "passwordreset-username": "اسم المستخدم:",
+       "passwordreset-domain": "النطاق:",
+       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
+       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
+       "passwordreset-email": "عنوان البريد الإلكتروني:",
+       "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
+       "passwordreset-emailtext-ip": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
+       "passwordreset-emailtext-user": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
+       "passwordreset-emailelement": "اسم المستخدم: $1\nكلمة السر المؤقتة: $2",
+       "passwordreset-emailsent": "أرسل بريد إلكتروني تذكيري",
+       "passwordreset-emailsent-capture": "أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.",
+       "passwordreset-emailerror-capture": "ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1",
+       "changeemail": "تغيير عنوان البريد الإلكتروني",
+       "changeemail-text": "أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
+       "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
+       "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
+       "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
+       "changeemail-none": "(لا شيء)",
+       "changeemail-submit": "غيّر البريد الإلكتروني",
+       "bold_sample": "نص غليظ",
+       "bold_tip": "نص غليظ",
+       "italic_sample": "نص مائل",
+       "italic_tip": "نص مائل",
+       "link_sample": "عنوان وصلة",
+       "link_tip": "وصلة داخلية",
+       "extlink_sample": "http://www.example.com عنوان الوصلة",
+       "extlink_tip": "وصلة خارجية (تذكر بادئة http://)",
+       "headline_sample": "نص عنوان رئيسي",
+       "headline_tip": "عنوان من المستوى الثاني",
+       "nowiki_sample": "أدخل النص غير المنسق هنا",
+       "nowiki_tip": "أهمل تهيئة الويكي",
+       "image_tip": "ملف مدرج",
+       "media_tip": "وصلة ملف",
+       "sig_tip": "توقيعك مع الساعة والتاريخ",
+       "hr_tip": "خط أفقي (تجنب الاستخدام بكثرة)",
+       "summary": "ملخص:",
+       "subject": "موضوع/عنوان:",
+       "minoredit": "هذا تعديل طفيف",
+       "watchthis": "راقب هذه الصفحة",
+       "savearticle": "احفظ الصفحة",
+       "preview": "معاينة",
+       "showpreview": "أظهر معاينة",
+       "showdiff": "أظهر التغييرات",
+       "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
+       "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
+       "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
+       "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
+       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
+       "summary-preview": "معاينة الملخص:",
+       "subject-preview": "معاينة للموضوع/العنوان:",
+       "blockedtitle": "المستخدم ممنوع",
+       "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "autoblockedtext": "تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.\nالسبب الممنوح هو التالي:\n\n:''$2''\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
+       "blockednoreason": "لا سبب معطى",
+       "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
+       "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
+       "nosuchsectiontitle": "تعذر إيجاد القسم",
+       "nosuchsectiontext": "لقد حاولت تحرير قسم غير موجود.\nربما يكون قد تم نقله أو حذفه أثناء مشاهدتك للصفحة.",
+       "loginreqtitle": "تسجيل الدخول مطلوب",
+       "loginreqlink": "الولوج",
+       "loginreqpagetext": "يجب عليك $1 لتشاهد صفحات أخرى.",
+       "accmailtitle": "تم إرسال كلمة السر.",
+       "accmailtext": "كلمة سر مولدة عشوائيا ل [[User talk:$1|$1]] تم إرسالها إلى $2.\n\nكلمة السر لهذا الحساب الجديد يمكن تغييرها في صفحة ''[[Special:ChangePassword|تغيير كلمة السر]]'' عند تسجيل الدخول.",
+       "newarticle": "(جديد)",
+       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر ''رجوع'' في متصفح الإنترنت لديك.",
+       "anontalkpagetext": "----''هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب.\nلذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.\nمثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.\nلو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:UserLogin/signup|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.''",
+       "noarticletext-nopermission": "لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.",
+       "userpage-userdoesnotexist": "حساب المستخدم \"<nowiki>$1</nowiki>\" غير مسجل.\nمن فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.",
+       "userpage-userdoesnotexist-view": "حساب المستخدم \"$1\" غير مسجل.",
+       "blocked-notice-logextract": "هذا المستخدم ممنوع حاليا.\nآخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:",
+       "clearyourcache": "'''ملاحظة:''' بعد الحفظ, أنت ربما تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.\n* '''فيرفكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload'', أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)\n* '''جوجل كروم:''' اضغط ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)\n* '''إنترنت إكسبلورر:''' اضغط ''Ctrl'' أثناء ضغط ''Refresh''، أو اضغط ''Ctrl-F5''\n* '''كنكرر:''' اضغط ''Reload'' أو اضغط ''F5''\n* '''أوبرا:''' أفرغ الكاش في ''Tools → Preferences''",
+       "usercssyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
+       "userjsyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل حفظ الصفحة.",
+       "usercsspreview": "'''تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط\nلم يتم حفظها بعد!'''",
+       "userjspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''لم يتم الحفظ بعد!'''",
+       "sitecsspreview": "''' تذكر أنك فقط في وضع المعاينة لهذا CSS ''' \n''' ولم يتم حفظ الصفحة بعد! '''",
+       "sitejspreview": "''' تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا''' \n''' ولم يتم حفظه بعد! '''",
+       "userinvalidcssjstitle": "'''تحذير:''' لا توجد واجهة  \"$1\".\nتذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
+       "updated": "(محدثة)",
+       "note": "'''ملاحظة:'''",
+       "previewnote": "'''تذكر أن هذه مجرد معاينة أولية.'''\nلم تحفظ تغييراتك إلى الآن!",
+       "continue-editing": "أكمل التحرير",
+       "previewconflict": "هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.",
+       "session_fail_preview": "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\nمن فضلك حاول مرة أخرى.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى.'''",
+       "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها 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'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
+       "yourtext": "نصك",
+       "storedversion": "النسخة المخزنة",
+       "nonunicodebrowser": "'''تحذير: متصفحك لا يتوافق مع الترميز الموحد.\nتمت معالجة هذا لكي تتمكن من تحرير الصفحات بأمان: الحروف التي ليست ASCII سوف تظهر في صندوق التحرير كأكواد سداسي عشرية.'''",
+       "editingold": "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
+       "yourdiff": "الفروق",
+       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل {{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر في $1 للمزيد من التفاصيل)\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n'''لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق'''.",
+       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n'''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
+       "longpageerror": "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''\nو يتعذر حفظه.",
+       "readonlywarning": "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''\n\nالإداري الذي أغلقها أعطى هذا التفسير: $1",
+       "protectedpagewarning": "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
+       "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
+       "templatesused": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:",
+       "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
+       "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
+       "template-semiprotected": "(حماية جزئية)",
+       "hiddencategories": "{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:",
+       "nocreatetext": "قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.\nيمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].",
+       "nocreate-loggedin": "أنت لا تمتلك الصلاحية لإنشاء صفحات جديدة.",
+       "sectioneditnotsupported-title": "تعديل الأقسام غير مدعوم",
+       "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
+       "permissionserrors": "أخطاء السماحات",
+       "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
+       "permissionserrorstext-withaction": "لا تملك الصلاحيات ل$2، لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:",
+       "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
+       "moveddeleted-notice": "هذه الصفحة تم حذفها.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
+       "log-fulllog": "أظهر السجل الكامل",
+       "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
+       "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
+       "edit-conflict": "تضارب تحريري.",
+       "edit-no-change": "تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.",
+       "edit-already-exists": "لم يمكن إنشاء صفحة جديدة.\nهي موجودة بالفعل.",
+       "defaultmessagetext": "نص الرسالة الافتراضي",
+       "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
+       "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-warning": "تجاوزت هذه الصفحة تعداد العقد",
+       "expansion-depth-exceeded-category": "الصفحات التي حدث فيها تجاوز عمق التوسيع",
+       "expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
+       "parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
+       "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
+       "undo-success": "يمكن استرجاع التعديل.\nمن فضلك تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، وبعد ذلك احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.",
+       "undo-failure": "لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.",
+       "undo-norev": "فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.",
+       "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
+       "cantcreateaccounttitle": "لا يمكن إنشاء حساب",
+       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
+       "viewpagelogs": "اعرض سجلات هذه الصفحة",
+       "nohistory": "لا يوجد تاريخ للتعديلات لهذه الصفحة.",
+       "currentrev": "المراجعة الحالية",
+       "currentrev-asof": "المراجعة الحالية بتاريخ $1",
+       "revision-info": "مراجعة $1 بواسطة $2",
+       "previousrevision": "→ مراجعة أقدم",
+       "nextrevision": "مراجعة أحدث ←",
+       "currentrevisionlink": "المراجعة الحالية",
+       "cur": "الحالي",
+       "next": "التالي",
+       "last": "السابق",
+       "page_first": "الأولى",
+       "page_last": "الأخيرة",
+       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
+       "history-fieldset-title": "تصفح التاريخ",
+       "history-show-deleted": "المحذوفة فقط",
+       "histfirst": "أول",
+       "histlast": "آخر",
+       "historysize": "({{PLURAL:$1|1 بايت|$1 بايت}})",
+       "historyempty": "(فارغ)",
+       "history-feed-title": "تاريخ المراجعة",
+       "history-feed-description": "تاريخ التعديل لهذه الصفحة في الويكي",
+       "history-feed-item-nocomment": "$1 في $2",
+       "history-feed-empty": "الصفحة المطلوبة غير موجودة.\nمن المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.\nحاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.",
+       "rev-deleted-comment": "(أزيل ملخص التعديل)",
+       "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
+       "rev-deleted-event": "(فعل السجل تمت إزالته)",
+       "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
+       "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-deleted-text-unhide": "'''حُذِفت''' مراجعة الصفحة هذه.\nيمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات '''حُذِفت'''.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات '''حذفت'''.",
+       "rev-deleted-unhide-diff": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
+       "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+       "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
+       "rev-delundel": "أظهر/أخف",
+       "rev-showdeleted": "أظهر",
+       "revisiondelete": "حذف/استرجاع المراجعات",
+       "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
+       "revdelete-nooldid-text": "إما أنك لم تحدد مراجعة (أو مراجعات) معينة هدفا لهذه الوظيفة، أو أن المراجعة المحددة غير موجودة، أو أنك تحاول إخفاء المراجعة الحالية.",
+       "revdelete-no-file": "الملف المحدد غير موجود.",
+       "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
+       "revdelete-show-file-submit": "نعم",
+       "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
+       "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
+       "revdelete-suppress-text": "الإخفاء ينبغي أن يتم استخدامه '''فقط''' في الحالات التالية:\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام التليفونات، أرقام الضمان الاجتماعي، إلى آخره.''",
+       "revdelete-legend": "وضع ضوابط رؤية",
+       "revdelete-hide-text": "أخف نص المراجعة",
+       "revdelete-hide-image": "أخف محتوى الملف",
+       "revdelete-hide-name": "أخف الفعل والهدف",
+       "revdelete-hide-comment": "أخف تعليق التعديل",
+       "revdelete-hide-user": "أخف اسم/آيبي المستخدم",
+       "revdelete-hide-restricted": "أخف البيانات عن الإداريين إضافة إلى الآخرين",
+       "revdelete-radio-same": "(لا تغير)",
+       "revdelete-radio-set": "نعم",
+       "revdelete-radio-unset": "لا",
+       "revdelete-suppress": "أخف البيانات عن مديري النظام والبقية",
+       "revdelete-unsuppress": "إزالة الضوابط من المراجعات المسترجعة",
+       "revdelete-log": "السبب:",
+       "revdelete-submit": "طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
+       "revdelete-success": "'''تم تحديث رؤية المراجعات بنجاح.'''",
+       "revdelete-failure": "'''تعذر تحديث رؤية المراجعة:'''\n$1",
+       "logdelete-success": "'''تم ضبط رؤية السجلات بنجاح.'''",
+       "logdelete-failure": "'''تعذر ضبط رؤية السجل:'''\n$1",
+       "revdel-restore": "تغيير الرؤية",
+       "pagehist": "تاريخ صفحة",
+       "deletedhist": "التاريخ المحذوف",
+       "revdelete-hide-current": "خطأ عند إحفاء العنصر المؤرخ في $2 $1: هذه هي المراجعة الحالية.\nلا يمكن إخفاؤها.",
+       "revdelete-show-no-access": "خطأ في إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
+       "revdelete-modify-no-access": "خطأ في تعديل العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\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**معلومات تشهيرية محتملة",
+       "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": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
+       "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": "إلغاء الدمج",
+       "mergelogpagetext": "بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.",
+       "history-title": " «$1»: تاريخ المراجعة",
+       "difference-title": "«$1»: الفرق بين المراجعتين",
+       "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
+       "difference-multipage": "(الفرق بين الصفحتين)",
+       "lineno": "Sţar $1:",
+       "compareselectedversions": "قارن بين النسختين المختارتين",
+       "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
+       "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
+       "prevn": "{{PLURAL:$1|$1}} السابقة",
+       "nextn": "{{PLURAL:$1|$1}} التالية",
+       "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
+       "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
+       "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
+       "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
+       "search-redirect": "(تحويلة $1)",
+       "search-suggest": "هل كنت تقصد: $1",
+       "searchrelated": "مرتبطة",
+       "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
+       "mypreferences": "تفضيلاتي",
+       "youremail": "البريد:",
+       "yourrealname": "الاسم الحقيقي:",
+       "prefs-help-email": "عنوان البريد الإلكتروني هو أمر اختياري، ولكن ستحتاج لإعادة تعيين كلمة المرور، إن نسيت كلمة المرور الخاصة بك.",
+       "prefs-help-email-others": "يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صفحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكشف عن الهوية الخاصة بك.",
+       "newuserlogpage": "سجل إنشاء المستخدمين",
+       "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
+       "recentchanges-legend": "خيارات أحدث التغييرات",
+       "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
+       "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
+       "recentchanges-label-newpage": "أنشأ هذا التعديل صفحة جديدة",
+       "recentchanges-label-minor": "هذا تعديل طفيف",
+       "recentchanges-label-bot": "أجرى هذا التعديل بوت",
+       "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
+       "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
+       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
+       "rcshowhideminor": "$1 التعديلات الطفيفة",
+       "rcshowhidebots": "$1 البوتات",
+       "rcshowhideliu": "$1 المستخدمين المسجلين",
+       "rcshowhideanons": "$1 المستخدمين المجهولين",
+       "rcshowhidepatr": "$1 التعديلات المراجعة",
+       "rcshowhidemine": "$1 تعديلاتي",
+       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
+       "hide": "أخف",
+       "show": "اعرض",
+       "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
+       "rc-enhanced-hide": "أخفِ التفاصيل",
+       "recentchangeslinked": "تغييرات ذات علاقة",
+       "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
+       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
+       "recentchangeslinked-page": "اسم الصفحة:",
+       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "uploadlogpage": "سجل الرفع",
+       "filedesc": "ملخص:",
+       "license": "ترخيص:",
+       "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
+       "filehist-revert": "استرجع",
+       "filehist-current": "حالي",
+       "filehist-datetime": "وقت/زمن",
+       "filehist-thumb": "صورة مصغرة",
+       "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
+       "filehist-user": "مستخدم",
+       "filehist-dimensions": "الأبعاد",
+       "imagelinks": "استخدام الملف",
+       "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
+       "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
+       "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
+       "statistics": "إحصاءات",
+       "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
+       "prefixindex": "كل الصفحات بالبادئة",
+       "usercreated": "{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2",
+       "move": "انقل",
+       "pager-newer-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
+       "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
+       "booksources": "مصادر كتاب",
+       "booksources-search-legend": "البحث عن مصادر الكتب",
+       "log": "سجلات",
+       "allpagessubmit": "اذهب",
+       "categories": "تصنيفات",
+       "linksearch-line": "$1 موصولة من $2",
+       "listgrouprights-members": "(قائمة الأعضاء)",
+       "emailuser": "إرسال رسالة لهذا المستخدم",
+       "watchlist": "قائمة مراقبتي",
+       "mywatchlist": "قائمة مراقبتي",
+       "watchlistfor2": "ل$1 $2",
+       "watch": "راقب",
+       "unwatch": "أوقف المراقبة",
+       "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.",
+       "wlshowlast": "عرض آخر $1 ساعات $2 أيام",
+       "watchlist-options": "خيارات قائمة المراقبة",
+       "actioncomplete": "انتهاء العملية",
+       "actionfailed": "الفعل فشل",
+       "dellogpage": "سجل الحذف",
+       "protectlogpage": "سجل الحماية",
+       "protectedarticle": "حمى \"[[$1]]\"",
+       "undeletelink": "اعرض/استعد",
+       "undeleteviewlink": "اعرض",
+       "namespace": "النطاق",
+       "invert": "اعكس الاختيار",
+       "contributions": "مساهماتي",
+       "contributions-title": "مساهمات المستخدم $1",
+       "mycontris": "مساهماتي",
+       "contribsub2": "ل$1 ($2)",
+       "month": "من سنة (وأقدم):",
+       "year": "من سنة (وأقدم):",
+       "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
+       "sp-contributions-blocklog": "سجل المنع",
+       "sp-contributions-uploads": "مرفوعات",
+       "sp-contributions-logs": "سجلات",
+       "sp-contributions-talk": "نقاش",
+       "sp-contributions-search": "بحث عن مساهمات",
+       "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
+       "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
+       "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
+       "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
+       "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
+       "isredirect": "صفحة تحويل",
+       "istemplate": "مضمن",
+       "isimage": "وصلة ملف",
+       "whatlinkshere-next": "{{PLURAL:$1|القادمة|ال$1 القادمة}}",
+       "whatlinkshere-links": "← وصلات",
+       "whatlinkshere-hideredirs": "$1 التحويلات",
+       "whatlinkshere-hidetrans": "$1 التضمينات",
+       "whatlinkshere-hidelinks": "$1 الوصلات",
+       "whatlinkshere-hideimages": "$1 وصلة صورة",
+       "whatlinkshere-filters": "مرشحات",
+       "ipboptions": "ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite",
+       "ipblocklist": "المستخدمون الممنوعون",
+       "unblocklink": "ارفع المنع",
+       "change-blocklink": "تغيير المنع",
+       "blocklogpage": "سجل المنع",
+       "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
+       "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
+       "movelogpage": "سجل النقل",
+       "revertmove": "استرجع",
+       "export": "تصدير صفحات",
+       "allmessagesname": "الاسم",
+       "allmessagesdefault": "النص الافتراضي",
+       "thumbnail_error": "خطأ في إنشاء صورة مصغرة: $1",
+       "tooltip-pt-userpage": "صفحة المستخدم الخاصة بك",
+       "tooltip-pt-mytalk": "صفحة نقاشك",
+       "tooltip-pt-preferences": "تفضيلاتي",
+       "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
+       "tooltip-pt-mycontris": "قائمة مساهماتك",
+       "tooltip-pt-logout": "خروج",
+       "tooltip-ca-addsection": "ابدأ قسما جديدا",
+       "tooltip-ca-protect": "احم هذه الصفحة",
+       "tooltip-ca-delete": "احذف هذه الصفحة",
+       "tooltip-ca-move": "علم هذه الصفحة",
+       "tooltip-ca-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
+       "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
+       "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
+       "tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
+       "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+       "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
+       "tooltip-ca-nstab-special": "هذه صفحة خاصة، لا تستطيع أن تعدل الصفحة نفسها",
+       "tooltip-ca-nstab-project": "رؤية صفحة المحتوى",
+       "tooltip-ca-nstab-image": "رؤية صفحة الملف",
+       "tooltip-ca-nstab-template": "رؤية القالب",
+       "tooltip-ca-nstab-category": "رؤية صفحة التصنيف",
+       "tooltip-minoredit": "علم على هذا كتعديل طفيف",
+       "tooltip-save": "احفظ تغييراتك",
+       "tooltip-preview": "اعرض تغييراتك، من فضلك استخدم هذا قبل الحفظ!",
+       "tooltip-diff": "اعرض التغييرات التي قمت بها للنص.",
+       "tooltip-compareselectedversions": "شاهد الفروق بين النسختين المختارتين من هذه الصفحة.",
+       "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
+       "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.\n\"Annuler\" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f'ettalkhis.",
+       "tooltip-summary": "أدخل ملخصا قصيرا",
+       "previousdiff": "→ التعديل السابق",
+       "nextdiff": "التعديل اللاحق ←",
+       "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
+       "file-nohires": "لا توجد دقة أعلى متوفرة.",
+       "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
+       "metadata": "بيانات ميتا",
+       "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
+       "metadata-fields": "حقول معطيات الميتا الموجودة في هذه الرسالة سوف تعرض في صفحة الصورة عندما يكون جدول معطيات الميتا مضغوطا.\nالحقول الأخرى ستكون مخفية افتراضيا.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "namespacesall": "الكل",
+       "monthsall": "الكل",
+       "watchlisttools-view": "اعرض التغييرات المرتبطة",
+       "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
+       "watchlisttools-raw": "عدل قائمة المراقبة الخام",
+       "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
+       "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
+       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
+}
diff --git a/languages/i18n/aeb-latn.json b/languages/i18n/aeb-latn.json
new file mode 100644 (file)
index 0000000..23e30d5
--- /dev/null
@@ -0,0 +1,285 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Abanima",
+                       "Csisc",
+                       "Kuwaity26",
+                       "Malekbr",
+                       "아라",
+                       "Aħmedbaɛl",
+                       "GeekEmad"
+               ]
+       },
+       "tog-underline": "Ħotʾ stʾar taħt errabtʾa:",
+       "tog-hideminor": "Khabbi ettabdilàt essʾgħàr m ettabdilàt lekhrànìn",
+       "tog-hidepatrolled": "Khabbi ettabdilàt elmagħsous għlihom m ettabdilàt lekhrànìn",
+       "tog-newpageshidepatrolled": "Khabbi elpàjàt elmagħsous għlihom m ellista mtagħ elpàjàt ejjdida",
+       "tog-extendwatchlist": "Wassegħ ellista mtagħ elgħassa bech twarri ettabdilàt elkoll, w mouch lekhrànìn kahaw",
+       "tog-numberheadings": "Nwàmer otomatik l ettitrouàt mtagħ esseksyon",
+       "tog-watchcreations": "Zid elpàjàt elli għmalt'hom w elfichyéàt elli tʾallagħt'hom l ellista mtagħ elgħassa mtagħi",
+       "tog-watchdefault": "Zid elpàjàt w elfichyéàt elli nbaddelhom l ellista mtagħ elgħassa mtagħi",
+       "tog-watchmoves": "Zid elpàjàt w elfichyéàt elli nhezzhom, l ellista mtagħ elgħassa mtagħi",
+       "tog-watchdeletion": "Zid elpàjàt w elfichyéàt elli nnaħħihom l ellista mtagħ elgħassa mtagħi",
+       "tog-minordefault": "Marki ettabdilàt essʾghàr elkoll par défo",
+       "tog-previewontop": "Warri tʾalla għla chsʾàr qbal ħokket ettabdil",
+       "tog-previewonfirst": "Warri tʾalla għla chsʾàr f ettabdila lawlàniya",
+       "tog-enotifwatchlistpages": "Abgħethli mail waqtelli pàj wella fichyé m ellista mtagħ elgħassa mtagħi tbaddel",
+       "tog-enotifusertalkpages": "Abgħethli mail watelli elpàj mtagħ leħdith mtagħi tetbaddel",
+       "tog-enotifminoredits": "Abgħethli mail zàda għattabdilàt essʾghàr mtagħ elpàjàt w elfichyéàt",
+       "tog-enotifrevealaddr": "Warri ladrisa mail mtagħi f elmailàt mtagħ ennotifikasyon",
+       "tog-shownumberswatching": "Warri għdad lutilizateuràt elgħassàsa",
+       "tog-oldsig": "Ettosʾħàħa elmawjouda:",
+       "underline-always": "Dima",
+       "underline-never": "Jemla",
+       "sunday": "Il-Eḩed",
+       "monday": "Il-Iŧnîn",
+       "tuesday": "Iŧ-Ŧlêŧ",
+       "wednesday": "Il-Irbģe",
+       "thursday": "Il-Xmîs",
+       "friday": "Ij-Jimģe",
+       "saturday": "Is-Sibt",
+       "sun": "Il-Eḩed",
+       "mon": "el ithnaine",
+       "tue": "ethlath",
+       "wed": "elirb3a",
+       "thu": "el5mis",
+       "fri": "ejjom3a",
+       "sat": "essibt",
+       "january": "Jânfi",
+       "february": "Fîvrî",
+       "march": "Mâris",
+       "april": "Avrîl",
+       "may_long": "Mêy",
+       "june": "Jweñ",
+       "july": "Jwîlye",
+       "august": "Ût",
+       "september": "Siptombir",
+       "october": "Uktobir",
+       "november": "Nuvombir",
+       "december": "Disombir",
+       "january-gen": "Janvi",
+       "february-gen": "Fîvrî",
+       "march-gen": "Mars",
+       "april-gen": "Avril",
+       "may-gen": "Mai",
+       "june-gen": "Juin",
+       "july-gen": "Juilia",
+       "august-gen": "Août",
+       "september-gen": "Septembre",
+       "october-gen": "Octobre",
+       "november-gen": "Novembre",
+       "december-gen": "Décembre",
+       "jan": "Jan.",
+       "feb": ".Fiv",
+       "mar": "Mâris",
+       "apr": "Avr.",
+       "may": "Mêy",
+       "jun": "Jweñ",
+       "jul": "Jwi.",
+       "aug": "Ût",
+       "sep": "Sep.",
+       "oct": "Okt.",
+       "nov": ".Nov",
+       "dec": "Des.",
+       "pagecategories": "{{PLURAL:Catégorie weħed|Zouz catégories|$1 catégories|$1 en catégorie}}",
+       "hidden-categories": "{{PLURAL:Catégorie mkhabia waħda|Zouz catégories mkhabbin|$1 catégories mkhabbin|$1 en catégorie mkhabia}}",
+       "cancel": "ifsa5",
+       "moredotdotdot": "Akther...",
+       "anontalk": "Tħaddeth mgħa ladrisa IP hadhi",
+       "navigation": "Ḩawwis",
+       "and": "&#32;w",
+       "qbfind": "Lawwej",
+       "qbbrowse": "Navigi",
+       "qbedit": "Baddel",
+       "qbpageoptions": "Elpàj hadhi",
+       "qbmyoptions": "Pàjàti",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "actions": "Aksyonàt",
+       "namespaces": "Blâyiş il-asêmî",
+       "variants": "Tanwîģât",
+       "navigation-heading": "il-mënü mtêģ in-navigâsyioñ",
+       "errorpagetitle": "Għaltʾa",
+       "returnto": "Arjagħ l $1.",
+       "tagline": "Min {{SITENAME}}",
+       "help": "Mģâwne",
+       "search": "Lawwij",
+       "searchbutton": "Lawwij",
+       "go": "Emchi",
+       "searcharticle": "Imcî",
+       "history": "Listorik mtagħ elpàj",
+       "history_short": "Il-istorîk",
+       "updatedmarker": "tbaddlet melli jit àkher marra",
+       "printableversion": "Kopî bêc tiţbaģhê",
+       "permalink": "lieñ yoqģod dîme dîme",
+       "print": "Atʾbagħ",
+       "view": "Aqra",
+       "edit": "Baddil",
+       "create": "Agħmel",
+       "editthispage": "Baddel f elpàj hadhi",
+       "create-this-page": "Agħmel elpàj hadhi",
+       "delete": "Afsakh",
+       "deletethispage": "Afsakh elpàj hadhi",
+       "undelete_short": "Rajjagħ{{PLURAL:$1|tabdila waħda|$1 tabdila}}",
+       "viewdeleted_short": "Warri {{PLURAL:$1|tabdila waħda mafsoukha|$1 tabdila mafsoukha}}",
+       "protect": "Ħàmi",
+       "protect_change": "baddel",
+       "protectthispage": "Ħàmi għal pàj hadhi",
+       "unprotect": "Baddel elħimàya",
+       "unprotectthispage": "Baddel elħimàya mtagħ elpàj hadhi",
+       "newpage": "Pàj jdida",
+       "talkpage": "Tħaddeth għal pàj hadhi",
+       "talkpagelinktext": "Ḩdîŧ",
+       "specialpage": "Sʾafħa spesyàl",
+       "personaltools": "Mêģûnik",
+       "articlepage": "Warri elpàj mtagħ elkontenu",
+       "talk": "Ḩdiŧ",
+       "views": "Manḑer",
+       "toolbox": "Mêģûn",
+       "userpage": "Chour elpàj mtagħ lutilizateur",
+       "projectpage": "Chouf elpàj mtagħ leprojé",
+       "imagepage": "Chouf elpàj mtagħ elfichyé",
+       "mediawikipage": "Chouf elpàj mtagħ elmessàj",
+       "templatepage": "Chouf elpàj mtagħ elmodàl",
+       "viewhelppage": "Chouf elpàj mtagħ lemgħàwna",
+       "categorypage": "Chouf elpàj mtagħ elkatégori",
+       "viewtalkpage": "Chouf leħdith",
+       "otherlanguages": "B-lûğât okhrîne",
+       "redirectedfrom": "(Tħawwelt men $1)",
+       "redirectpagesub": "Pàj mtagħ taħwil",
+       "lastmodifiedat": "Il-pâj hêđî tbadlit êxir merre nhâr $1, mģa $2.",
+       "viewcount": "Elpàj hadhi dakhloulha {{PLURAL:$1|marra waħda|$1 marra}}.",
+       "protectedpage": "Pàj protéjé",
+       "jumpto": "Imcî l-:",
+       "jumptonavigation": "Ḩawwis",
+       "jumptosearch": "Lawwij",
+       "view-pool-error": "Pardon, esserveuràt tàgħba tawwa.\nBarcha għbàd yħebbou ychoufou nafs elpàj.\nYgħaychek estanna chway qbal ma tjarreb bech todkhel l elpàj hadhi marra okhra.\n\n\n$1",
+       "pool-timeout": "Waqt esstennya wfa",
+       "pool-queuefull": "Essʾaf mgħabbi",
+       "pool-errorunknown": "Ghaltʾa ma nagħrfouhàch",
+       "aboutsite": "Fîme yxoş {{SITENAME}}",
+       "aboutpage": "Project:Fîme yxoş",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Elli sʾàyer tawwa",
+       "currentevents-url": "Project:Elli sʾàyer tawwa",
+       "disclaimers": "Tambîhêt",
+       "disclaimerpage": "Project:Tambîhêt ģâmme",
+       "edithelp": "Mgħàwna f elktiba",
+       "mainpage": "Il-pâj il-ewelêniye",
+       "mainpage-description": "Il-Pâj il-ewelêniye",
+       "policy-url": "Project:Elpolitik",
+       "portal": "Daxlit il-mujtamaģ",
+       "portal-url": "Project:Mujtamaģ",
+       "privacy": "Is-siyêse mteģ il-konfîdonsyalîtê",
+       "privacypage": "Project:Il-polîtîk mtêģ il-konfîdoñsyalîtê",
+       "ok": "ok",
+       "retrievedfrom": "Tixđêt min- \"$1\"",
+       "editsection": "Baddil iş-şafḩa",
+       "editold": "Baddil",
+       "viewsourceold": "Warri essours",
+       "editlink": "baddil",
+       "viewsourcelink": "Warri is-sûrs",
+       "editsectionhint": "Baddil is-sêksyioñ: $1",
+       "toc": "Contenu",
+       "showtoc": "Warri",
+       "hidetoc": "Khabbi",
+       "collapsible-collapse": "Tʾabbes",
+       "collapsible-expand": "Wassegħ",
+       "thisisdeleted": "Warri wella rajjagħ $1؟",
+       "viewdeleted": "Warri $1؟",
+       "site-atom-feed": "Flü Atom mtêģ $1",
+       "red-link-title": "$1 (Iş-Şafḩa mûc mawjûde)",
+       "nstab-main": "Şafḩa",
+       "nstab-special": "Safḩa spêsyâl",
+       "nstab-image": "Fichier",
+       "nstab-mediawiki": "Messàj",
+       "error": "ghalath",
+       "missing-article": "Elbase de données malqatech ettexte mtaε essafħa elli supposée talqaha, welli esmha \"$1\" $2.\n\nHedha elli ysir elεada waqtelli tħel farq qdim walla lien mtaε l'historique mtaε safħa tnaħħat.\n\nIdha ken mouch hedheka li sar, rak momken lqit mochkla fel programme.\nAman qoul elweħeb mel les [[Special:ListUsers/sysop|administrateurs]], waεtih ellien elli ħabit temchilou.",
+       "delete-hook-aborted": "faskhan wa9fou flash.\nmahouwech mobarrar",
+       "exception-nologin-text": "hedhi ess'af7a wa 2ella el action te7tej mennek bech etloginni il hedha el wiki",
+       "nav-login-createaccount": "Connecti / aεmel compte",
+       "pt-login": "Odkul",
+       "pt-createaccount": "Aģmil koñt",
+       "resetpass-submit-cancel": "ifsa5",
+       "template-protected": "(protégé)",
+       "revisionasof": "Version mtaε $1",
+       "lineno": "Sţar $1:",
+       "editundo": "Rajjaģ",
+       "searchresults": "Ir-rêzultâ mtêģ it-talwîj",
+       "searchresults-title": "Ir-rêzultâ mtêģ it-talwîj ģlâ \"$1\"",
+       "shown-title": " Warri{{PLURAL:Résultat weħed|Zouz résultats|$1  résultats|$1 en résultat}} men kol safħa",
+       "viewprevnext": "Chouf ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "'''famma ss'af7a ismha \"[[:$1]]\" fi hedha el wiki.'''",
+       "searchprofile-articles": "Safħat mtaε contenu",
+       "searchprofile-images": "Multimédia",
+       "searchprofile-everything": "Kol chay",
+       "searchprofile-advanced": "Avancé",
+       "searchprofile-articles-tooltip": "Farkes fi $1",
+       "searchprofile-images-tooltip": "Farkes f'elfichiers",
+       "searchprofile-everything-tooltip": "Farkes kol chay (ħatta safħat leħdith)",
+       "searchprofile-advanced-tooltip": "Ekhtar les espaces de noms elli bech tfarkes εlihom",
+       "search-result-size": "$1 ({{PLURAL:Ħatta kelma|Kelma waħda|Kelmtin|$2 kelmat|$2 en kelma}})",
+       "search-section": "(section $1)",
+       "action-edit": "modifi hal page",
+       "recentchanges": "Ajadd tabdîlêt",
+       "diff": "Farq",
+       "hist": "Hîst",
+       "minoreditletter": "thafif",
+       "newpageletter": "jadid",
+       "boteditletter": "bot",
+       "rc-change-size-new": "$1 {{PLURAL:$1|oktê}} baģd it-tabdîl",
+       "recentchangeslinked-toolbox": "Tabdilet them",
+       "upload": "Abεeth des fichiers l'esserveur",
+       "license-header": "licence",
+       "file-anchor-link": "milaf (Fichier)",
+       "filehist": "Têrîx il-mîlaf",
+       "filehist-comment": "ta3li9at",
+       "randompage": "Şafħa kîmê tjî",
+       "nbytes": "{{PLURAL:Octet weħed|Zouz octets|$1 octets|$1 en octet}}",
+       "newpages": "Safħat jdod",
+       "allpages": "kol ess'afa7at",
+       "allarticles": "kol ess'afa7at",
+       "rollbacklink": "rajjaε",
+       "blanknamespace": "(Ra'îsî)",
+       "uctop": "(top)",
+       "sp-contributions-submit": "lawwej",
+       "whatlinkshere": "Cnûwwe illi ywassil l-hûnî",
+       "whatlinkshere-page": "ss'af7a:",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "blocklink": "Bloqui",
+       "contribslink": "Mûsêhmêt",
+       "thumbnail-more": "Kabbir",
+       "tooltip-pt-login": "Međebîne kên itkoññektî, eme mûc bis-sîf",
+       "tooltip-pt-createaccount": "Međebîne law kên taģmil koñt w todxul, Lêkin mêkc maţlûb bêc taģmil hêđê.",
+       "tooltip-ca-talk": "Disküsyioñ ģal-koñtënü mtêģ il-pâj",
+       "tooltip-ca-edit": "Tnejjem tbaddil iş-şafḩa hêđi. Amân inzil ģal-bûtoñ mtêģ il-vû il-msebqa qbal mê tsijjil.",
+       "tooltip-ca-viewsource": "Essʾafħa protéjé.\nTnajjem tchouf essours mtaħħa.",
+       "tooltip-ca-history": "Copiet qdom mtaε essafħa hedhi",
+       "tooltip-search": "Lawwij fî- {{SITENAME}}",
+       "tooltip-search-go": "Imcî l-pâj b-nafs il-ism îđê lqîthê",
+       "tooltip-search-fulltext": "Farkis fiş-şafḩât ģat-têkst hêđa",
+       "tooltip-p-logo": "Emchi lil-pâj il-ewelêniye",
+       "tooltip-n-mainpage": "Imchi lil-pâj il-ewelêniye",
+       "tooltip-n-mainpage-description": "Imchi lil-pâj il-ewelêniye",
+       "tooltip-n-portal": "Ģal-macrûģ, cnûwwe tnijjim taģmil, wîn tilqâ illi ḩajtik bîh",
+       "tooltip-n-currentevents": " Alqa information εla aham laħdeth mtaε tawa",
+       "tooltip-n-recentchanges": "Lîste mtêģ ajadd it-tabdîlêt fil-wiki",
+       "tooltip-n-randompage": "Ḩil iş-şafḩe illî tjî",
+       "tooltip-n-help": "Il-blâşa bêc tilqâ fîhe",
+       "tooltip-t-whatlinkshere": "Lîste mtêģ iş-şafḩât il-wiki il-kul illi twassil l-hûni",
+       "tooltip-t-recentchangeslinked": "Aham ettabldilet f'essafħat elli ywaslou l'essafħa hedhi",
+       "tooltip-t-upload": "Abεeth des fichiers l'esserveur",
+       "tooltip-t-specialpages": "Lîste mtêģ iş-şafħât is-spêsyal il-kul",
+       "tooltip-t-print": "Vêrsyoñ titiţbaģ min hal-pâj..",
+       "tooltip-t-permalink": "Lien dayem l'elversion hedhi mtaε essafħa",
+       "tooltip-ca-nstab-main": "Chouf elcontenu mtaε essafħa",
+       "tooltip-rollback": "\"Rajjaģ\" yrajjiģ it-tabdîlêt f'hassafħa el'ekher weħed baddel fi nazla waħda.",
+       "pageinfo-toolboxlink": "Maģlûmêt ģalâ hal-pâj",
+       "show-big-image": "il-fîcyê il-aşlî",
+       "bad_image_list": "Elformat kima hakka:\nLes élements mtaε lista (lostra elli yabdew b' *) yetħesbou.\nEllien lowel fi star yelzmou ykoun lien el fichier khayeb.\nAy lien ekher fi nafs estar yetħseb exception, maħneha des pages win elfichier ynajem ykoun fi star.",
+       "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
+       "watchlistedit-clear-titles": "Elɛanawin",
+       "watchlistedit-too-many": "Famma barcha pajet w'manajmouch nħotouhom lkol lahné",
+       "specialpages": "Safḩât spêsyâl",
+       "searchsuggest-search": "Lawwij"
+}
diff --git a/languages/i18n/aeb.json b/languages/i18n/aeb.json
deleted file mode 100644 (file)
index c535e51..0000000
+++ /dev/null
@@ -1,917 +0,0 @@
-{
-       "@metadata": {
-               "authors": [
-                       "Abanima",
-                       "Csisc",
-                       "Kuwaity26",
-                       "Malekbr",
-                       "아라",
-                       "Aħmedbaɛl",
-                       "GeekEmad"
-               ]
-       },
-       "tog-underline": "Ħotʾ stʾar taħt errabtʾa:",
-       "tog-hideminor": "Khabbi ettabdilàt essʾgħàr m ettabdilàt lekhrànìn",
-       "tog-hidepatrolled": "Khabbi ettabdilàt elmagħsous għlihom m ettabdilàt lekhrànìn",
-       "tog-newpageshidepatrolled": "Khabbi elpàjàt elmagħsous għlihom m ellista mtagħ elpàjàt ejjdida",
-       "tog-extendwatchlist": "Wassegħ ellista mtagħ elgħassa bech twarri ettabdilàt elkoll, w mouch lekhrànìn kahaw",
-       "tog-usenewrc": ")جمّع التعديلات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت",
-       "tog-numberheadings": "Nwàmer otomatik l ettitrouàt mtagħ esseksyon",
-       "tog-showtoolbar": "أظهر شريط التحرير (يتطلب جافاسكربت)",
-       "tog-editondblclick": "عدل الصفحات عند الضغط المزدوج (جافاسكربت)",
-       "tog-editsectiononrightclick": "فعل تعديل الأقسام بواسطة كبسة الفأرة اليمين على عناوين الأقسام (جافاسكريبت)",
-       "tog-watchcreations": "Zid elpàjàt elli għmalt'hom w elfichyéàt elli tʾallagħt'hom l ellista mtagħ elgħassa mtagħi",
-       "tog-watchdefault": "Zid elpàjàt w elfichyéàt elli nbaddelhom l ellista mtagħ elgħassa mtagħi",
-       "tog-watchmoves": "Zid elpàjàt w elfichyéàt elli nhezzhom, l ellista mtagħ elgħassa mtagħi",
-       "tog-watchdeletion": "Zid elpàjàt w elfichyéàt elli nnaħħihom l ellista mtagħ elgħassa mtagħi",
-       "tog-minordefault": "Marki ettabdilàt essʾghàr elkoll par défo",
-       "tog-previewontop": "Warri tʾalla għla chsʾàr qbal ħokket ettabdil",
-       "tog-previewonfirst": "Warri tʾalla għla chsʾàr f ettabdila lawlàniya",
-       "tog-enotifwatchlistpages": "Abgħethli mail waqtelli pàj wella fichyé m ellista mtagħ elgħassa mtagħi tbaddel",
-       "tog-enotifusertalkpages": "Abgħethli mail watelli elpàj mtagħ leħdith mtagħi tetbaddel",
-       "tog-enotifminoredits": "Abgħethli mail zàda għattabdilàt essʾghàr mtagħ elpàjàt w elfichyéàt",
-       "tog-enotifrevealaddr": "Warri ladrisa mail mtagħi f elmailàt mtagħ ennotifikasyon",
-       "tog-shownumberswatching": "Warri għdad lutilizateuràt elgħassàsa",
-       "tog-oldsig": "Ettosʾħàħa elmawjouda:",
-       "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": "أزل الفرق بعد القيام باسترجاع",
-       "underline-always": "Dima",
-       "underline-never": "Jemla",
-       "underline-default": "تبعا لإعدادات المتصفح",
-       "editfont-style": "نمط خط منطقة التحرير:",
-       "editfont-default": "تبعا لإعدادات المتصفح",
-       "editfont-monospace": "خط ثابت العرض",
-       "editfont-sansserif": "خط بلا زوائد",
-       "editfont-serif": "خط بزوائد",
-       "sunday": "ela7ad",
-       "monday": "elithnaine",
-       "tuesday": "etholatha",
-       "wednesday": "elirbi3a",
-       "thursday": "el5amis",
-       "friday": "eljom3a",
-       "saturday": "essibt",
-       "sun": "ela7ad",
-       "mon": "el ithnaine",
-       "tue": "ethlath",
-       "wed": "elirb3a",
-       "thu": "el5mis",
-       "fri": "ejjom3a",
-       "sat": "essibt",
-       "january": "Janvi",
-       "february": "Fivri",
-       "march": "Mars",
-       "april": "Avril",
-       "may_long": "Mai",
-       "june": "Juin",
-       "july": "Juilia",
-       "august": "Août",
-       "september": "Septembre",
-       "october": "Octobre",
-       "november": "Novembre",
-       "december": "Décembre",
-       "january-gen": "Janvi",
-       "february-gen": "Fivri",
-       "march-gen": "Mars",
-       "april-gen": "Avril",
-       "may-gen": "Mai",
-       "june-gen": "Juin",
-       "july-gen": "Juilia",
-       "august-gen": "Août",
-       "september-gen": "Septembre",
-       "october-gen": "Octobre",
-       "november-gen": "Novembre",
-       "december-gen": "Décembre",
-       "jan": "Janv",
-       "feb": "Fivr",
-       "mar": "Mars",
-       "apr": "Avrl",
-       "may": "Mai",
-       "jun": "Juin",
-       "jul": "Juil",
-       "aug": "Août",
-       "sep": "Sept",
-       "oct": "Oct",
-       "nov": "Nov",
-       "dec": "Déc",
-       "pagecategories": "{{PLURAL:Catégorie weħed|Zouz catégories|$1 catégories|$1 en catégorie}}",
-       "category_header": "صفحات تصنيف \"$1\"",
-       "subcategories": "التصنيفات الفرعية",
-       "category-media-header": "الوسائط في التصنيف \"$1\"",
-       "category-empty": "''هذا التصنيف لا يحتوي حاليا على صفحات أو وسائط.''",
-       "hidden-categories": "{{PLURAL:Catégorie mkhabia waħda|Zouz catégories mkhabbin|$1 catégories mkhabbin|$1 en catégorie mkhabia}}",
-       "hidden-category-category": "تصنيفات مخفية",
-       "category-subcat-count": "{{PLURAL:$2|لا تصانيف فرعية في هذا التصنيف|هذا التصنيف فيه التصنيف الفرعي التالي فقط.|هذا التصنيف فيه {{PLURAL:$1||هذا التصنيف الفرعي|هذين التصنيفين الفرعيين|هذه ال$1 تصانيف الفرعية|هذه ال$1 تصنيفا فرعيا|هذه ال$1 تصنيف فرعي}}، من إجمالي $2.}}",
-       "category-subcat-count-limited": "هذا التصنيف فيه {{PLURAL:$1||التصنيف الفرعي التالي|التصنيفين الفرعيين التاليين|$1 تصانيف فرعية تالية|$1 تصنيفا فرعيا تاليا|$1 تصنيف فرعي تالي}}.",
-       "category-article-count": "{{PLURAL:$2|لا يحتوي هذا التصنيف أي صفحات.|هذا التصنيف يحتوي على الصفحة التالية فقط.|{{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|ال$1 صفحات التالية|ال$1 صفحة التالية|ال$1 صفحة التالية}} في هذا التصنيف، من إجمالي $2.}}",
-       "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": "صفحات مفهرسة",
-       "noindex-category": "صفحات غير مفهرسة",
-       "broken-file-category": "صفحات تحتوي وصلات ملفات معطوبة",
-       "about": "عن",
-       "article": "صفحة محتوى",
-       "newwindow": "(تفتح في نافذة جديدة)",
-       "cancel": "ifsa5",
-       "moredotdotdot": "Akther...",
-       "mypage": "صفحتي",
-       "mytalk": "نقاشي",
-       "anontalk": "Tħaddeth mgħa ladrisa IP hadhi",
-       "navigation": "Ħawwes",
-       "and": "&#32;w",
-       "qbfind": "Lawwej",
-       "qbbrowse": "Navigi",
-       "qbedit": "Baddel",
-       "qbpageoptions": "Elpàj hadhi",
-       "qbmyoptions": "Pàjàti",
-       "faq": "FAQ",
-       "faqpage": "Project:FAQ",
-       "actions": "Aksyonàt",
-       "namespaces": "Blàsʾàt làsàmi",
-       "variants": "Tanwigħàt",
-       "errorpagetitle": "Għaltʾa",
-       "returnto": "Arjagħ l $1.",
-       "tagline": "Men {{SITENAME}}",
-       "help": "Mgħàwna",
-       "search": "Lawwej",
-       "searchbutton": "Lawwej",
-       "go": "Emchi",
-       "searcharticle": "Lawwej",
-       "history": "Listorik mtagħ elpàj",
-       "history_short": "Listorik",
-       "updatedmarker": "tbaddlet melli jit àkher marra",
-       "printableversion": "Kopi bech tatʾbaħħa",
-       "permalink": "Rabtʾa għla tʾoul",
-       "print": "Atʾbagħ",
-       "view": "Aqra",
-       "edit": "Baddel",
-       "create": "Agħmel",
-       "editthispage": "Baddel f elpàj hadhi",
-       "create-this-page": "Agħmel elpàj hadhi",
-       "delete": "Afsakh",
-       "deletethispage": "Afsakh elpàj hadhi",
-       "undelete_short": "Rajjagħ{{PLURAL:$1|tabdila waħda|$1 tabdila}}",
-       "viewdeleted_short": "Warri {{PLURAL:$1|tabdila waħda mafsoukha|$1 tabdila mafsoukha}}",
-       "protect": "Ħàmi",
-       "protect_change": "baddel",
-       "protectthispage": "Ħàmi għal pàj hadhi",
-       "unprotect": "Baddel elħimàya",
-       "unprotectthispage": "Baddel elħimàya mtagħ elpàj hadhi",
-       "newpage": "Pàj jdida",
-       "talkpage": "Tħaddeth għal pàj hadhi",
-       "talkpagelinktext": "Ħdith",
-       "specialpage": "Sʾafħa spesyàl",
-       "personaltools": "Magħounek",
-       "articlepage": "Warri elpàj mtagħ elkontenu",
-       "talk": "Ħdith",
-       "views": "Mandhʾer",
-       "toolbox": "Magħoun",
-       "userpage": "Chour elpàj mtagħ lutilizateur",
-       "projectpage": "Chouf elpàj mtagħ leprojé",
-       "imagepage": "Chouf elpàj mtagħ elfichyé",
-       "mediawikipage": "Chouf elpàj mtagħ elmessàj",
-       "templatepage": "Chouf elpàj mtagħ elmodàl",
-       "viewhelppage": "Chouf elpàj mtagħ lemgħàwna",
-       "categorypage": "Chouf elpàj mtagħ elkatégori",
-       "viewtalkpage": "Chouf leħdith",
-       "otherlanguages": "B loughat okhra",
-       "redirectedfrom": "(Tħawwelt men $1)",
-       "redirectpagesub": "Pàj mtagħ taħwil",
-       "lastmodifiedat": "Elpàj hadhi tbaddlet àkher marra nhàr $1, mgħa $2.",
-       "viewcount": "Elpàj hadhi dakhloulha {{PLURAL:$1|marra waħda|$1 marra}}.",
-       "protectedpage": "Pàj protéjé",
-       "jumpto": "Emchi l:",
-       "jumptonavigation": "Ħawwes",
-       "jumptosearch": "Lawwej",
-       "view-pool-error": "Pardon, esserveuràt tàgħba tawwa.\nBarcha għbàd yħebbou ychoufou nafs elpàj.\nYgħaychek estanna chway qbal ma tjarreb bech todkhel l elpàj hadhi marra okhra.\n\n\n$1",
-       "pool-timeout": "Waqt esstennya wfa",
-       "pool-queuefull": "Essʾaf mgħabbi",
-       "pool-errorunknown": "Ghaltʾa ma nagħrfouhàch",
-       "aboutsite": "Fima ykhosʾ {{SITENAME}}",
-       "aboutpage": "Project:Fima ykhosʾ",
-       "copyright": "المحتوى متوفر تحت $1.",
-       "copyrightpage": "{{ns:project}}:Copyrights",
-       "currentevents": "Elli sʾàyer tawwa",
-       "currentevents-url": "Project:Elli sʾàyer tawwa",
-       "disclaimers": "Tambihàt",
-       "disclaimerpage": "Project:Tambihàt għàmma",
-       "edithelp": "Mgħàwna f elktiba",
-       "mainpage": "Elpàj Lawlàniya",
-       "mainpage-description": "Elpàj Lawlàniya",
-       "policy-url": "Project:Elpolitik",
-       "portal": "Dakhlet elmojtamagħ",
-       "portal-url": "Project:Mojtamagħ",
-       "privacy": "Elpolitik mtagħ elkonfidonsyalité",
-       "privacypage": "Project:Elpolitik mtagħ elkonfidonsyalité",
-       "badaccess": "خطأ في السماح",
-       "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
-       "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
-       "versionrequired": "تلزم نسخة $1 من ميدياويكي",
-       "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
-       "ok": "ok",
-       "retrievedfrom": "Tekhdhet men \"$1\"",
-       "youhavenewmessages": "توجد لديك $1 ($2).",
-       "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
-       "editsection": "Baddel essʾafħa",
-       "editold": "Baddel",
-       "viewsourceold": "Warri essours",
-       "editlink": "baddel",
-       "viewsourcelink": "Warri essource",
-       "editsectionhint": "Baddel essection: $1",
-       "toc": "Contenu",
-       "showtoc": "Warri",
-       "hidetoc": "Khabbi",
-       "collapsible-collapse": "Tʾabbes",
-       "collapsible-expand": "Wassegħ",
-       "thisisdeleted": "Warri wella rajjagħ $1؟",
-       "viewdeleted": "Warri $1؟",
-       "restorelink": "{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديلا محذوفا}}",
-       "feedlinks": "التغذية:",
-       "feed-invalid": "نوع اشتراك التلقيم غير صحيح.",
-       "feed-unavailable": "التلقيمات غير متوفرة",
-       "site-rss-feed": "$1 تلقيم أر إس إس",
-       "site-atom-feed": "Flux Atom mtaε $1",
-       "page-rss-feed": "\"$1\" تلقيم أر إس إس",
-       "page-atom-feed": "$1 تلقيم أتوم",
-       "red-link-title": "$1 (Essafħa mouch mawjouda)",
-       "sort-descending": "ترتيب تنازلي",
-       "sort-ascending": "ترتيب تصاعدي",
-       "nstab-main": "Sʾafħa",
-       "nstab-user": "صفحة مستخدم",
-       "nstab-media": "صفحة وسيط",
-       "nstab-special": "Sʾafħa spesyàl",
-       "nstab-project": "صفحة مشروع",
-       "nstab-image": "Fichier",
-       "nstab-mediawiki": "Messàj",
-       "nstab-template": "قالب",
-       "nstab-help": "صفحة مساعدة",
-       "nstab-category": "تصنيف",
-       "nosuchaction": "لا يوجد فعل كهذا",
-       "nosuchactiontext": "الفعل المحدد بواسطة المسار غير صحيح.\nربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.\nهذا ربما يشير أيضا إلى علة في {{SITENAME}}.",
-       "nosuchspecialpage": "لا توجد صفحة خاصة بهذا الاسم",
-       "nospecialpagetext": "<strong>لقد طلبت صفحة خاصة غير صحيحة.</strong>\n\nقائمة بالصفحات الخاصة الصحيحة يمكن إيجادها في [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "ghalath",
-       "databaseerror": "خطأ في قاعدة البيانات",
-       "laggedslavemode": "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
-       "readonly": "قاعدة البيانات مغلقة",
-       "enterlockreason": "أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق",
-       "readonlytext": "قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.\n\nالإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1",
-       "missing-article": "Elbase de données malqatech ettexte mtaε essafħa elli supposée talqaha, welli esmha \"$1\" $2.\n\nHedha elli ysir elεada waqtelli tħel farq qdim walla lien mtaε l'historique mtaε safħa tnaħħat.\n\nIdha ken mouch hedheka li sar, rak momken lqit mochkla fel programme.\nAman qoul elweħeb mel les [[Special:ListUsers/sysop|administrateurs]], waεtih ellien elli ħabit temchilou.",
-       "missingarticle-rev": "(رقم المراجعة: $1)",
-       "missingarticle-diff": "(فرق: $1، $2)",
-       "readonly_lag": "تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي",
-       "internalerror": "خطأ داخلي",
-       "internalerror_info": "خطأ داخلي: $1",
-       "filecopyerror": "لم يمكن نسخ الملف \"$1\" إلى \"$2\".",
-       "filerenameerror": "لم يمكن إعادة تسمية الملف \"$1\" إلى \"$2\".",
-       "filedeleteerror": "لم يمكن حذف الملف \"$1\".",
-       "directorycreateerror": "لم يمكن إنشاء المجلد \"$1\".",
-       "filenotfound": "لم يمكن إيجاد الملف \"$1\".",
-       "unexpected": "قيمة غير متوقعة: \"$1\"=\"$2\".",
-       "formerror": "خطأ: لم يمكن تنفيذ الاستمارة",
-       "badarticleerror": "لا يمكن إجراء هذا الفعل على هذه الصفحة.",
-       "cannotdelete": "تعذر حذف الصفحة أو الملف \"$1\".\nربما حذفها شحص آخر.",
-       "cannotdelete-title": "لا يمكن حذف الصفحة \"$1\"",
-       "delete-hook-aborted": "faskhan wa9fou flash.\nmahouwech mobarrar",
-       "badtitle": "عنوان سيء",
-       "badtitletext": "عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.\nومن الممكن وجود رموز لا تصلح للاستخدام في العناوين.",
-       "perfcached": "البيانات التالية مختزنة وقد لا تكون محدثة. {{PLURAL:$1||نتيجة واحدة|نتيجتان|$1 نتائج|$1 نتيجة}} على الأكثر {{PLURAL:$1||مختزنة|مختزنتان|مختزنة}}.",
-       "perfcachedts": "البيانات التالية مختزنة وكان آخر تحديث لها في $1. {{PLURAL:$4||نتيجة واحدة|نتيجتان|$4 نتائج|$4 نتيجة}} على الأكثر {{PLURAL:$4||مختزنة|مختزنتان|مختزنة}}.",
-       "querypage-no-updates": "التحديثات لهذه الصفحة معطلة حاليا.\nالبيانات هنا لن يتم تحديثها حاليا.",
-       "viewsource": "اعرض المصدر",
-       "viewsource-title": "إظهار مصدر $1",
-       "actionthrottled": "لا يمكن عمل المزيد من هذا الفعل",
-       "actionthrottledtext": "كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.\nمن فضلك حاول مرة ثانية خلال عدة دقائق.",
-       "protectedpagetext": "هذه الصفحة تمت حمايتها لمنع التعديل.",
-       "viewsourcetext": "يمكنك رؤية ونسخ مصدر هذه الصفحة:",
-       "viewyourtext": "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
-       "protectedinterface": "هذه الصفحة توفر نص الواجهة للبرنامج، وهي مقفلة لمنع التخريب.",
-       "editinginterface": "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.\nسوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.\nللترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
-       "cascadeprotected": "تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية \"حماية الصفحات المدمجة\" {{PLURAL:$1||بها|بهما|بها}}:\n$2",
-       "namespaceprotected": "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
-       "customcssprotected": "أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
-       "customjsprotected": "أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.",
-       "ns-specialprotected": "الصفحات الخاصة لا يمكن تعديلها.",
-       "titleprotected": "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.\nالسبب المعطى هو ''$2''.",
-       "filereadonlyerror": "تعذر تعديل الملف \"$1\" لأن مستودع الملف \"$2\" في وضع القراءة فقط. \n\nالمدير الذي قام بغلقه قدم التفسير التالي: \"$3\".",
-       "invalidtitle-knownnamespace": "عنوان غير صالح في النطاق «$2» مع نص «$3»",
-       "invalidtitle-unknownnamespace": "عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»",
-       "exception-nologin": "غير مسجل الدخول",
-       "exception-nologin-text": "hedhi ess'af7a wa 2ella el action te7tej mennek bech etloginni il hedha el wiki",
-       "virus-badscanner": "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
-       "virus-scanfailed": "فشل المسح (كود $1)",
-       "virus-unknownscanner": "مضاد فيروسات غير معروف:",
-       "logouttext": "'''أنت الآن غير مسجل الدخول.'''\n\nتستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.\nمن الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
-       "yourname": "اسم المستخدم:",
-       "yourpassword": "كلمة السر:",
-       "yourpasswordagain": "أعد كتابة كلمة السر:",
-       "remembermypassword": "تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)",
-       "yourdomainname": "نطاقك:",
-       "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
-       "login": "ادخل",
-       "nav-login-createaccount": "Connecti / aεmel compte",
-       "userlogin": "ادخل / أنشئ حسابا",
-       "userloginnocreate": "دخول",
-       "logout": "اخرج",
-       "userlogout": "خروج",
-       "notloggedin": "غير مسجل الدخول",
-       "nologin": "ألا تمتلك حسابا؟ '''$1'''.",
-       "nologinlink": "أنشئ حسابا",
-       "createaccount": "أنشئ حسابا",
-       "gotaccount": "تمتلك حسابا بالفعل؟ '''$1'''.",
-       "gotaccountlink": "ادخل",
-       "userlogin-resetlink": "أنسيت بيانات الولوج؟",
-       "createaccountmail": "بواسطة البريد الإلكتروني",
-       "createaccountreason": "السبب:",
-       "badretype": "كلمات السر التي أدخلتها لا تتطابق.",
-       "userexists": "اسم المستخدم الذي تم إدخاله مستعمل بالفعل.\nالرجاء اختيار اسم مختلف.",
-       "loginerror": "خطأ في الدخول",
-       "createaccounterror": "تعذر إنشاء حساب المستخدم: $1",
-       "nocookiesnew": "تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.\nيستخدم {{SITENAME}} كوكيز لتسجيل الدخول.\nلديك الكوكيز معطلة.\nمن فضلك فعلها، ثم سجل الدخول باسم المستخدم وكلمة السر الجديدين.",
-       "nocookieslogin": "يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.\nالكوكيز معطلة لديك.\nمن فضلك فعلها ثم حاول مرة أخرى.",
-       "nocookiesfornew": "لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. \nتأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.",
-       "noname": "لم تحدد اسم مستخدم صحيح.",
-       "loginsuccesstitle": "تم الدخول بشكل صحيح",
-       "loginsuccess": "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"$1\".'''",
-       "nosuchuser": "لا يوجد مستخدم بالاسم \"$1\".\nأسماء المستخدمين حساسة لحالة الحروف.\nتأكد من إملاء الاسم، أو [[Special:UserLogin/signup|قم بإنشاء حساب جديد]].",
-       "nosuchusershort": "لا يوجد مستخدم باسم $1\".\nتأكد من إملاء الاسم.",
-       "nouserspecified": "يجب عليك تحديد اسم مستخدم.",
-       "login-userblocked": "هذا المستخدم ممنوع. لا يسمح بالولوج.",
-       "wrongpassword": "كلمة السر التي أدخلتها غير صحيحة.\nمن فضلك حاول مرة أخرى.",
-       "wrongpasswordempty": "كلمة السر المدخلة كانت فارغة.\nمن فضلك حاول مرة أخرى.",
-       "passwordtooshort": "يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.",
-       "password-name-match": "يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.",
-       "password-login-forbidden": "تم منع استخدام اسم المستخدم هذا وكلمة السر.",
-       "mailmypassword": "أرسل لي كلمة سر جديدة",
-       "passwordremindertitle": "كلمة سر مؤقتة جديدة ل{{SITENAME}}",
-       "passwordremindertext": "لقد طلب شخص ما (غالبا أنت، من عنوان الآيبي $1) كلمة سر جديدة ل{{SITENAME}} ($4).\nأنشئت كلمة سر مؤقتة للمستخدم \"$2\" وجعلت \"$3\".\nلو أن هذا ما تريده، فعليك أن تقوم بتسجيل الدخول واختيار كلمة سر جديدة الآن.\nسوف تنتهي مدة صلاحية كلمة سرك المؤقتة في غضون {{PLURAL:$5|أقل من يوم واحد|يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}.\n\nإذا كان الذي قام بهذا الطلب شخص آخر أو إذا تذكرت كلمة سرك ولا ترغب  في تغييرها، فبإمكانك أن تتجاهل هذه الرسالة وأن تستمر في استخدام كلمة سرك القديمة.",
-       "noemail": "لا يوجد عنوان بريد إلكتروني مسجل للمستخدم \"$1\".",
-       "noemailcreate": "عليك تقديم عنوان بريد إلكتروني صالح",
-       "passwordsent": "تم إرسال كلمة سر جديدة إلى عنوان البريد الإلكتروني المسجل للمستخدم \"$1\".\nمن فضلك حاول تسجيل الدخول مرة ثانية بعد استلامها.",
-       "blocked-mailpassword": "تم منع عنوان الأيبي الخاص بك من التحرير، ولمنع التخريب لا يمكنك أن تستخدم خاصية استرجاع كلمة السر.",
-       "eauthentsent": "تم إرسال رسالة تأكيد إلكترونية إلى العنوان المسمى.\nحتى ترسل أي رسالة أخرى لذلك الحساب عليك أن تتبع التعليمات الواردة في الرسالة لتأكيد أن هذا الحساب هو لك بالفعل.",
-       "throttled-mailpassword": "تم بالفعل إرسال تذكير بكلمة السر، في ال{{PLURAL:$1||ساعة الماضية|ساعتين الماضيتين|$1 ساعات الماضية|$1 ساعة الماضية}}.\nلمنع التخريب، سيتم إرسال تذكير واحد كل {{PLURAL:$1||ساعة|ساعتين|$1 ساعات|$1 ساعة}}.",
-       "mailerror": "خطأ أثناء إرسال البريد: $1",
-       "acct_creation_throttle_hit": "أنشأ زوار هذه الويكي باستخدام عنوان آيبيك {{PLURAL:$1||حسابا واحدا|حسابين|$1 حسابات|$1 حسابا|$1 حساب}} في اليوم الماضي، وهو الحد الأقصى المسموح به في هذه الفترة الزمنية.\nوكنتيجة لذلك، لن يتمكن الزوار الذين يستخدمون عنوان الأيبي هذا من إنشاء أي حسابات أخرى حاليا.",
-       "emailauthenticated": "تم تأكيد بريدك الإلكتروني في $2 الساعة $3.",
-       "emailnotauthenticated": "لم يتم التحقق من بريدك الإلكتروني.\nلن يتم إرسال رسائل لأي من الميزات التالية.",
-       "noemailprefs": "حدد عنوان بريد إلكتروني في تفضيلاتك لهذه الخصائص لتعمل.",
-       "emailconfirmlink": "أكد عنوان بريدك الإلكتروني",
-       "invalidemailaddress": "لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.\nضع عنوانا مضبوطا أو أفرغ هذا الحقل.",
-       "cannotchangeemail": "تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي",
-       "emaildisabled": "لا يمكن إرسال رسائل البريد الإلكتروني من هذا الموقع.",
-       "accountcreated": "تم إنشاء الحساب",
-       "accountcreatedtext": "تم إنشاء الحساب الخاص ب$1.",
-       "createaccount-title": "إنشاء حساب في {{SITENAME}}",
-       "createaccount-text": "شخص ما أنشأ حسابا لعنوان بريدك الإلكتروني في {{SITENAME}} ($4) بالاسم \"$2\"، كلمة السر \"$3\".\nينبغي عليك تسجيل الدخول وتغيير كلمة السر الخاصة بك الآن.\n\nيمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.",
-       "login-throttled": "لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.\nمن فضلك انتظر قبل المحاولة مرة أخرى.",
-       "login-abort-generic": "لم ينجح ولوجك - إجهاض",
-       "loginlanguagelabel": "اللغة: $1",
-       "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
-       "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
-       "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
-       "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
-       "resetpass_header": "غير كلمة سر الحساب",
-       "oldpassword": "كلمة السر القديمة:",
-       "newpassword": "كلمة السر الجديدة:",
-       "retypenew": "أعد كتابة كلمة السر الجديدة:",
-       "resetpass_submit": "ضبط كلمة السر والدخول",
-       "changepassword-success": "تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...",
-       "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
-       "resetpass-no-info": "يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.",
-       "resetpass-submit-loggedin": "تغيير كلمة السر",
-       "resetpass-submit-cancel": "ifsa5",
-       "resetpass-wrong-oldpass": "كلمة سر حالية أو مؤقتة غير صحيحة.\nربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.",
-       "resetpass-temp-password": "كلمة سر مؤقتة:",
-       "passwordreset": "إعادة ضبط كلمة السر",
-       "passwordreset-legend": "إعادة تعيين كلمة السر",
-       "passwordreset-disabled": "عُطّلت إعادة تعيين كلمة السر على هذه الويكي.",
-       "passwordreset-username": "اسم المستخدم:",
-       "passwordreset-domain": "النطاق:",
-       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
-       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
-       "passwordreset-email": "عنوان البريد الإلكتروني:",
-       "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
-       "passwordreset-emailtext-ip": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
-       "passwordreset-emailtext-user": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
-       "passwordreset-emailelement": "اسم المستخدم: $1\nكلمة السر المؤقتة: $2",
-       "passwordreset-emailsent": "أرسل بريد إلكتروني تذكيري",
-       "passwordreset-emailsent-capture": "أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.",
-       "passwordreset-emailerror-capture": "ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1",
-       "changeemail": "تغيير عنوان البريد الإلكتروني",
-       "changeemail-text": "أكمل هذا النموذج لتغيير عنوان البريد الإلكتروني. سوف تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
-       "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
-       "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
-       "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
-       "changeemail-none": "(لا شيء)",
-       "changeemail-submit": "غيّر البريد الإلكتروني",
-       "bold_sample": "نص غليظ",
-       "bold_tip": "نص غليظ",
-       "italic_sample": "نص مائل",
-       "italic_tip": "نص مائل",
-       "link_sample": "عنوان وصلة",
-       "link_tip": "وصلة داخلية",
-       "extlink_sample": "http://www.example.com عنوان الوصلة",
-       "extlink_tip": "وصلة خارجية (تذكر بادئة http://)",
-       "headline_sample": "نص عنوان رئيسي",
-       "headline_tip": "عنوان من المستوى الثاني",
-       "nowiki_sample": "أدخل النص غير المنسق هنا",
-       "nowiki_tip": "أهمل تهيئة الويكي",
-       "image_tip": "ملف مدرج",
-       "media_tip": "وصلة ملف",
-       "sig_tip": "توقيعك مع الساعة والتاريخ",
-       "hr_tip": "خط أفقي (تجنب الاستخدام بكثرة)",
-       "summary": "ملخص:",
-       "subject": "موضوع/عنوان:",
-       "minoredit": "هذا تعديل طفيف",
-       "watchthis": "راقب هذه الصفحة",
-       "savearticle": "احفظ الصفحة",
-       "preview": "معاينة",
-       "showpreview": "أظهر معاينة",
-       "showdiff": "أظهر التغييرات",
-       "anoneditwarning": "'''تحذير:''' لم تقم بالدخول.\nسيسجل عنوان الآيبي خاصتك في تاريخ هذه الصفحة.",
-       "anonpreviewwarning": "''أنت غير مسجل الدخول. الحفظ سيسجل عنوان الأيبي الخاص بك في تاريخ هذه الصفحة.''",
-       "missingsummary": "'''تنبيه:''' لم تقم بكتابة ملخص للتعديل.\nإذا قمت بضغط حفظ الصفحة مرة أخرى، فيتم حفظ تعديلك بدون ملخص.",
-       "missingcommenttext": "من فضلك أدخل تعليقا في الأسفل.",
-       "missingcommentheader": "'''تنبيه:''' لم تقم بوضع موضوع/عنوان لهذا التعليق.\nإذا قمت بالضغط على \"{{int:savearticle}}\" مجددا، سيتم حفظ تعليقك بدون عنوان.",
-       "summary-preview": "معاينة الملخص:",
-       "subject-preview": "معاينة للموضوع/العنوان:",
-       "blockedtitle": "المستخدم ممنوع",
-       "blockedtext": "'''اسم المستخدم أو عنوان الأيبي الخاص بك تم منعه.'''\n\nقام بالمنع $1.\nسبب المنع هو: ''$2''.\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك الاتصال ب$1 أو مع أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] للنقاش حول المنع.\nلا يمكنك استخدام خاصية 'مراسلة هذا المستخدم' إلا إذا كنت قد وضعت عنوان بريدي صحيح في [[Special:Preferences|تفضيلات حسابك]] ولم يتم منعك من استخدامها.\nعنوان الأيبي الخاص بك حاليا هو $3، ورقم المنع هو #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
-       "autoblockedtext": "تم منع عنوان آيبيك تلقائيا لأن مستخدما آخرا ممنوعا بواسطة $1 استخدمه.\nالسبب الممنوح هو التالي:\n\n:''$2''\n\n* بداية المنع: $8\n* انتهاء المنع: $6\n* الممنوع المقصود: $7\n\nيمكنك أن تتصل ب $1 أو أحد [[{{MediaWiki:Grouppage-sysop}}|الإداريين]] الآخرين لمناقشة المنع.\n\nلاحظ أنه لا يمكنك استخدام خاصية \"إرسال رسالة لهذا المستخدم\" إلا لو كان لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]] ولم يتم منعك من استخدامه.\n\nعنوان آيبيك الحالي $3، ورقم المنع #$5.\nمن فضلك اذكر كل التفاصيل بالأعلى في أي استعلامات تقوم بها.",
-       "blockednoreason": "لا سبب معطى",
-       "whitelistedittext": "يجب عليك $1 لتتمكن من تعديل الصفحات.",
-       "confirmedittext": "يجب عليك تأكيد بريدك الإلكتروني قبل تعديل الصفحات.\nمن فضلك اكتب وأكد بريدك الإلكتروني من خلال [[Special:Preferences|تفضيلاتك]].",
-       "nosuchsectiontitle": "تعذر إيجاد القسم",
-       "nosuchsectiontext": "لقد حاولت تحرير قسم غير موجود.\nربما يكون قد تم نقله أو حذفه أثناء مشاهدتك للصفحة.",
-       "loginreqtitle": "تسجيل الدخول مطلوب",
-       "loginreqlink": "الولوج",
-       "loginreqpagetext": "يجب عليك $1 لتشاهد صفحات أخرى.",
-       "accmailtitle": "تم إرسال كلمة السر.",
-       "accmailtext": "كلمة سر مولدة عشوائيا ل [[User talk:$1|$1]] تم إرسالها إلى $2.\n\nكلمة السر لهذا الحساب الجديد يمكن تغييرها في صفحة ''[[Special:ChangePassword|تغيير كلمة السر]]'' عند تسجيل الدخول.",
-       "newarticle": "(جديد)",
-       "newarticletext": "لقد تبعت وصلة لصفحة لم يتم إنشائها بعد.\nلإنشاء هذه الصفحة ابدأ الكتابة في الصندوق بالأسفل (انظر في [$1 صفحة المساعدة] للمزيد من المعلومات).\nإذا كانت زيارتك لهذه الصفحة بالخطأ، اضغط على زر ''رجوع'' في متصفح الإنترنت لديك.",
-       "anontalkpagetext": "----''هذه صفحة نقاش لمستخدم مجهول لم يقم بإنشاء حساب بعد أو لا يستعمل ذلك الحساب.\nلذا فيجب علينا استعمال رقم الأيبي للتعرف عليه/عليها.\nمثل هذا العنوان يمكن أن يشترك فيه عدة مستخدمين.\nلو كنت مستخدما مجهولا وتشعر بأن تعليقات لا تخصك تم توجيهها إليك، من فضلك [[Special:UserLogin/signup|أنشئ حسابا]] أو [[Special:UserLogin|سجل الدخول]] لتجنب الارتباك المستقبلي مع مستخدمين مجهولين آخرين.''",
-       "noarticletext": "Mafamma ħatta texte tawa f'essafħa hedhi.\nTnajjem [[Special:Search/{{PAGENAME}}|tfarkes εal titre mtaε essafħa]] fi safħat okhrine, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tfarkes f'elhistoriques elli εandhom εaleqa], \nwalla [{{fullurl:{{FULLPAGENAME}}|action=edit}} tbaddel essafħa hedhi]</span>",
-       "noarticletext-nopermission": "لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.",
-       "userpage-userdoesnotexist": "حساب المستخدم \"<nowiki>$1</nowiki>\" غير مسجل.\nمن فضلك تأكد أنك تريد إنشاء/تعديل هذه الصفحة.",
-       "userpage-userdoesnotexist-view": "حساب المستخدم \"$1\" غير مسجل.",
-       "blocked-notice-logextract": "هذا المستخدم ممنوع حاليا.\nآخر مدخلة في سجل المنع موفرة بالأسفل كمرجع:",
-       "clearyourcache": "'''ملاحظة:''' بعد الحفظ, أنت ربما تحتاج إلى إفراغ كاش متصفحك لرؤية التغييرات.\n* '''فيرفكس / سفاري:''' اضغط ''Shift'' أثناء ضغط ''Reload'', أو اضغط أيا من ''Ctrl-F5'' أو ''Ctrl-R'' (''⌘-R'' على ماك)\n* '''جوجل كروم:''' اضغط ''Ctrl-Shift-R'' (''⌘-Shift-R'' على ماك)\n* '''إنترنت إكسبلورر:''' اضغط ''Ctrl'' أثناء ضغط ''Refresh''، أو اضغط ''Ctrl-F5''\n* '''كنكرر:''' اضغط ''Reload'' أو اضغط ''F5''\n* '''أوبرا:''' أفرغ الكاش في ''Tools → Preferences''",
-       "usercssyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة CSS الجديد قبل حفظ الصفحة.",
-       "userjsyoucanpreview": "'''ملاحظة:''' استعمل زر \"{{int:showpreview}}\" لتجربة جافاسكربت الجديدة قبل حفظ الصفحة.",
-       "usercsspreview": "'''تذكر أنك تقوم بعرض الأنماط المتراصة (CSS) الخاصة بك فقط\nلم يتم حفظها بعد!'''",
-       "userjspreview": "'''تذكر أنك فقط تجرب/تعاين جافاسكربت.'''\n'''لم يتم الحفظ بعد!'''",
-       "sitecsspreview": "''' تذكر أنك فقط في وضع المعاينة لهذا CSS ''' \n''' ولم يتم حفظ الصفحة بعد! '''",
-       "sitejspreview": "''' تذكر أنك فقط في وضع المعاينة لكود JavaScript هذا''' \n''' ولم يتم حفظه بعد! '''",
-       "userinvalidcssjstitle": "'''تحذير:''' لا توجد واجهة  \"$1\".\nتذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
-       "updated": "(محدثة)",
-       "note": "'''ملاحظة:'''",
-       "previewnote": "'''تذكر أن هذه مجرد معاينة أولية.'''\nلم تحفظ تغييراتك إلى الآن!",
-       "continue-editing": "أكمل التحرير",
-       "previewconflict": "هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.",
-       "session_fail_preview": "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.\nمن فضلك حاول مرة أخرى.\nفي حال استمرار المشكلة حاول أن تقوم [[Special:UserLogout|بالخروج]] ومن ثم الولوج مرة أخرى.'''",
-       "session_fail_preview_html": "'''عذرا! لم نستطع معالجة تعديلك بسبب فقدان بيانات الجلسة.'''\n\n''لأن {{SITENAME}} بها 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'''فقط''' ما هو موجود في الصندوق العلوي هو ما سيتم حفظه عند الضغط على زر \"حفظ الصفحة\".",
-       "yourtext": "نصك",
-       "storedversion": "النسخة المخزنة",
-       "nonunicodebrowser": "'''تحذير: متصفحك لا يتوافق مع الترميز الموحد.\nتمت معالجة هذا لكي تتمكن من تحرير الصفحات بأمان: الحروف التي ليست ASCII سوف تظهر في صندوق التحرير كأكواد سداسي عشرية.'''",
-       "editingold": "''' تحذير: أنت تقوم الآن بتحرير نسخة قديمة من هذه الصفحة.\nإذا قمت بحفظها، ستفقد كافة التغييرات التي حدثت بعد هذه النسخة. '''",
-       "yourdiff": "الفروق",
-       "copyrightwarning": "من فضلك لاحظ أن جميع المساهمات ل {{SITENAME}} خاضعة وصادرة تحت ترخيص $2 (انظر في $1 للمزيد من التفاصيل)\nإذا لم ترد أن تخضع كتابتك للتعديل والتوزيع الحر، لا تضعها هنا<br />.\nكما أنك تتعهد بأنك قمت بكتابة ما هو موجود بنفسك، أو قمت بنسخها من مصدر يخضع ضمن الملكية العامة، أو مصدر حر آخر.\n'''لا ترسل أي عمل ذي حقوق محفوظة بدون الإذن من صاحب الحق'''.",
-       "copyrightwarning2": "من فضلك لاحظ أن جميع المساهمات في {{SITENAME}} يمكن أن تعدل أو تتغير أو تزال من قبل المساهمين الآخرين.\nإذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />\nأنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).\n'''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
-       "longpageerror": "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''\nو يتعذر حفظه.",
-       "readonlywarning": "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.\nإذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''\n\nالإداري الذي أغلقها أعطى هذا التفسير: $1",
-       "protectedpagewarning": "'''تحذير: تمت حماية هذه الصفحة حتى يمكن للمستخدمين ذوي الصلاحيات الإدارية فقط تعديلها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "semiprotectedpagewarning": "'''ملاحظة:''' تمت حماية هذه الصفحة بحيث يمكن للمستخدمين المسجلين فقط تعديلها.\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "cascadeprotectedwarning": "'''تحذير:''' تمت حماية هذه الصفحة بحيث يستطيع المستخدمون ذوو الصلاحيات الإدارية فقط تعديلها، وذلك لأنها مدمجة في {{PLURAL:$1||الصفحة التالية والتي تمت حمايتها|الصفحتين التاليتين واللتين تمت حمايتها|الصفحات التالية والتي تمت حمايتها}} بخاصية \"حماية الصفحات المدمجة\":",
-       "titleprotectedwarning": "'''تحذير:  هذه الصفحة تمت حمايتها بحيث أن [[Special:ListGroupRights|صلاحيات معينة]] مطلوبة لإنشائها.'''\nآخر مدخلة سجل موفرة بالأسفل كمرجع:",
-       "templatesused": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:",
-       "templatesusedpreview": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه المعاينة:",
-       "templatesusedsection": "{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذا القسم:",
-       "template-protected": "(protégé)",
-       "template-semiprotected": "(حماية جزئية)",
-       "hiddencategories": "{{PLURAL:$1|هذه الصفحة غير موجودة في أي تصنايف مخفية|هذه الصفحة موجودة في تصنيف مخفي واحد|هذه الصفحة موجودة في تصنيفين مخفيين|هذه الصفحة موجودة في $1 تصانيف مخفية|هذه الصفحة موجودة في $1 تصنيفا مخفيا|هذه الصفحة موجودة في $1 تصنيف مخفي}}:",
-       "nocreatetext": "قام {{SITENAME}} بتحديد القدرة على إنشاء صفحات جديدة.\nيمكنك العودة وتحرير صفحة موجودة بالفعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].",
-       "nocreate-loggedin": "أنت لا تمتلك الصلاحية لإنشاء صفحات جديدة.",
-       "sectioneditnotsupported-title": "تعديل الأقسام غير مدعوم",
-       "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
-       "permissionserrors": "أخطاء السماحات",
-       "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
-       "permissionserrorstext-withaction": "لا تملك الصلاحيات ل$2، لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:",
-       "recreate-moveddeleted-warn": "'''تحذير: أنت تقوم بإعادة إنشاء صفحة سبق حذفها.'''\n\nيجب عليك التيقن من أن الاستمرار بتحرير هذه الصفحة ملائم.\nسجلا الحذف والنقل لهذه الصفحة معروضان هنا للتيسير:",
-       "moveddeleted-notice": "هذه الصفحة تم حذفها.\nسجلا الحذف والنقل للصفحة معروضان بالأسفل كمرجع.",
-       "log-fulllog": "أظهر السجل الكامل",
-       "edit-hook-aborted": "التعديل تم تركه بواسطة الخطاف.\nلم يعط تفسيرا.",
-       "edit-gone-missing": "لم يمكن تحديث الصفحة.\nيبدو أنه تم حذفها.",
-       "edit-conflict": "تضارب تحريري.",
-       "edit-no-change": "تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.",
-       "edit-already-exists": "لم يمكن إنشاء صفحة جديدة.\nهي موجودة بالفعل.",
-       "defaultmessagetext": "نص الرسالة الافتراضي",
-       "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
-       "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-warning": "تجاوزت هذه الصفحة تعداد العقد",
-       "expansion-depth-exceeded-category": "الصفحات التي حدث فيها تجاوز عمق التوسيع",
-       "expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
-       "parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
-       "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
-       "undo-success": "يمكن استرجاع التعديل.\nمن فضلك تحقق من المقارنة بالأسفل للتأكد من أن هذا هو ما تريد أن تفعله، وبعد ذلك احفظ التغييرات بالأسفل للانتهاء من استرجاع التعديل.",
-       "undo-failure": "لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.",
-       "undo-norev": "فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.",
-       "undo-summary": "الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])",
-       "cantcreateaccounttitle": "لا يمكن إنشاء حساب",
-       "cantcreateaccount-text": "إنشاء الحسابات من عنوان الأيبي هذا ('''$1''') تم منعه بواسطة [[User:$3|$3]].\n\nالسبب المعطى بواسطة $3 هو ''$2''",
-       "viewpagelogs": "اعرض سجلات هذه الصفحة",
-       "nohistory": "لا يوجد تاريخ للتعديلات لهذه الصفحة.",
-       "currentrev": "المراجعة الحالية",
-       "currentrev-asof": "المراجعة الحالية بتاريخ $1",
-       "revisionasof": "Version mtaε $1",
-       "revision-info": "مراجعة $1 بواسطة $2",
-       "previousrevision": "→ مراجعة أقدم",
-       "nextrevision": "مراجعة أحدث ←",
-       "currentrevisionlink": "المراجعة الحالية",
-       "cur": "الحالي",
-       "next": "التالي",
-       "last": "السابق",
-       "page_first": "الأولى",
-       "page_last": "الأخيرة",
-       "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
-       "history-fieldset-title": "تصفح التاريخ",
-       "history-show-deleted": "المحذوفة فقط",
-       "histfirst": "أول",
-       "histlast": "آخر",
-       "historysize": "({{PLURAL:$1|1 بايت|$1 بايت}})",
-       "historyempty": "(فارغ)",
-       "history-feed-title": "تاريخ المراجعة",
-       "history-feed-description": "تاريخ التعديل لهذه الصفحة في الويكي",
-       "history-feed-item-nocomment": "$1 في $2",
-       "history-feed-empty": "الصفحة المطلوبة غير موجودة.\nمن المحتمل أن تكون هذه الصفحة قد حذفت من الويكي، أو نقلت.\nحاول [[Special:Search|البحث في الويكي]] عن صفحات جديدة ذات صلة.",
-       "rev-deleted-comment": "(أزيل ملخص التعديل)",
-       "rev-deleted-user": "(اسم المستخدم تمت إزالته)",
-       "rev-deleted-event": "(فعل السجل تمت إزالته)",
-       "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
-       "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-deleted-text-unhide": "'''حُذِفت''' مراجعة الصفحة هذه.\nيمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
-       "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-deleted-no-diff": "لا يمكنك رؤية هذا الفرق لأن إحدى المراجعات '''حُذِفت'''.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-no-diff": "ليس بإمكانك مشاهدة هذا الفرق لأن إحدى المراجعات '''حذفت'''.",
-       "rev-deleted-unhide-diff": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-suppressed-unhide-diff": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذا الفرق] إذا أردت المتابعة.",
-       "rev-deleted-diff-view": "'''حُذِفت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-suppressed-diff-view": "'''أُخفيت''' إحدى مراجعتي هذا الفرق.\nيمكنك رؤية هذا الفرق؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
-       "rev-delundel": "أظهر/أخف",
-       "rev-showdeleted": "أظهر",
-       "revisiondelete": "حذف/استرجاع المراجعات",
-       "revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
-       "revdelete-nooldid-text": "إما أنك لم تحدد مراجعة (أو مراجعات) معينة هدفا لهذه الوظيفة، أو أن المراجعة المحددة غير موجودة، أو أنك تحاول إخفاء المراجعة الحالية.",
-       "revdelete-no-file": "الملف المحدد غير موجود.",
-       "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
-       "revdelete-show-file-submit": "نعم",
-       "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
-       "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
-       "revdelete-suppress-text": "الإخفاء ينبغي أن يتم استخدامه '''فقط''' في الحالات التالية:\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام التليفونات، أرقام الضمان الاجتماعي، إلى آخره.''",
-       "revdelete-legend": "وضع ضوابط رؤية",
-       "revdelete-hide-text": "أخف نص المراجعة",
-       "revdelete-hide-image": "أخف محتوى الملف",
-       "revdelete-hide-name": "أخف الفعل والهدف",
-       "revdelete-hide-comment": "أخف تعليق التعديل",
-       "revdelete-hide-user": "أخف اسم/آيبي المستخدم",
-       "revdelete-hide-restricted": "أخف البيانات عن الإداريين إضافة إلى الآخرين",
-       "revdelete-radio-same": "(لا تغير)",
-       "revdelete-radio-set": "نعم",
-       "revdelete-radio-unset": "لا",
-       "revdelete-suppress": "أخف البيانات عن مديري النظام والبقية",
-       "revdelete-unsuppress": "إزالة الضوابط من المراجعات المسترجعة",
-       "revdelete-log": "السبب:",
-       "revdelete-submit": "طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
-       "revdelete-success": "'''تم تحديث رؤية المراجعات بنجاح.'''",
-       "revdelete-failure": "'''تعذر تحديث رؤية المراجعة:'''\n$1",
-       "logdelete-success": "'''تم ضبط رؤية السجلات بنجاح.'''",
-       "logdelete-failure": "'''تعذر ضبط رؤية السجل:'''\n$1",
-       "revdel-restore": "تغيير الرؤية",
-       "pagehist": "تاريخ صفحة",
-       "deletedhist": "التاريخ المحذوف",
-       "revdelete-hide-current": "خطأ عند إحفاء العنصر المؤرخ في $2 $1: هذه هي المراجعة الحالية.\nلا يمكن إخفاؤها.",
-       "revdelete-show-no-access": "خطأ في إظهار العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\nليس لك صلاحية الوصول إليه.",
-       "revdelete-modify-no-access": "خطأ في تعديل العنصر ذا التاريخ $2 $1: هذا العنصر معلم ك\"مقيد\".\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**معلومات تشهيرية محتملة",
-       "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": "$3 {{PLURAL:$3|مراجعة|مراجعة}} من [[:$1]] تم دمجها بنجاح في [[:$2]].",
-       "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": "إلغاء الدمج",
-       "mergelogpagetext": "بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.",
-       "history-title": " «$1»: تاريخ المراجعة",
-       "difference-title": "«$1»: الفرق بين المراجعتين",
-       "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
-       "difference-multipage": "(الفرق بين الصفحتين)",
-       "lineno": "Star $1:",
-       "compareselectedversions": "قارن بين النسختين المختارتين",
-       "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
-       "editundo": "Rajjaε",
-       "diff-multi-manyusers": "({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)",
-       "searchresults": "Errézultʾa mtagħ ettalwij",
-       "searchresults-title": "Errézultʾa mtagħ ettalwij għla \"$1\"",
-       "prevn": "{{PLURAL:$1|$1}} السابقة",
-       "nextn": "{{PLURAL:$1|$1}} التالية",
-       "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
-       "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
-       "shown-title": " Warri{{PLURAL:Résultat weħed|Zouz résultats|$1  résultats|$1 en résultat}} men kol safħa",
-       "viewprevnext": "Chouf ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''famma ss'af7a ismha \"[[:$1]]\" fi hedha el wiki.'''",
-       "searchmenu-new": "'''أنشئ الصفحة \"[[:$1]]\" في هذا الويكي!'''",
-       "searchprofile-articles": "Safħat mtaε contenu",
-       "searchprofile-images": "Multimédia",
-       "searchprofile-everything": "Kol chay",
-       "searchprofile-advanced": "Avancé",
-       "searchprofile-articles-tooltip": "Farkes fi $1",
-       "searchprofile-images-tooltip": "Farkes f'elfichiers",
-       "searchprofile-everything-tooltip": "Farkes kol chay (ħatta safħat leħdith)",
-       "searchprofile-advanced-tooltip": "Ekhtar les espaces de noms elli bech tfarkes εlihom",
-       "search-result-size": "$1 ({{PLURAL:Ħatta kelma|Kelma waħda|Kelmtin|$2 kelmat|$2 en kelma}})",
-       "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
-       "search-redirect": "(تحويلة $1)",
-       "search-section": "(section $1)",
-       "search-suggest": "هل كنت تقصد: $1",
-       "searchrelated": "مرتبطة",
-       "searchall": "Elkol",
-       "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
-       "mypreferences": "تفضيلاتي",
-       "youremail": "البريد:",
-       "yourrealname": "الاسم الحقيقي:",
-       "prefs-help-email": "عنوان البريد الإلكتروني هو أمر اختياري، ولكن ستحتاج لإعادة تعيين كلمة المرور، إن نسيت كلمة المرور الخاصة بك.",
-       "prefs-help-email-others": "يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صفحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكشف عن الهوية الخاصة بك.",
-       "newuserlogpage": "سجل إنشاء المستخدمين",
-       "action-edit": "modifi hal page",
-       "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
-       "recentchanges": "Ajad tabdilet",
-       "recentchanges-legend": "خيارات أحدث التغييرات",
-       "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
-       "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
-       "recentchanges-label-newpage": "أنشأ هذا التعديل صفحة جديدة",
-       "recentchanges-label-minor": "هذا تعديل طفيف",
-       "recentchanges-label-bot": "أجرى هذا التعديل بوت",
-       "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
-       "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
-       "rclistfrom": "أظهر التغييرات بدءا من $3 $2",
-       "rcshowhideminor": "$1 التعديلات الطفيفة",
-       "rcshowhidebots": "$1 البوتات",
-       "rcshowhideliu": "$1 المستخدمين المسجلين",
-       "rcshowhideanons": "$1 المستخدمين المجهولين",
-       "rcshowhidepatr": "$1 التعديلات المراجعة",
-       "rcshowhidemine": "$1 تعديلاتي",
-       "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
-       "diff": "Farq",
-       "hist": "Hist",
-       "hide": "أخف",
-       "show": "اعرض",
-       "minoreditletter": "thafif",
-       "newpageletter": "jadid",
-       "boteditletter": "bot",
-       "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
-       "rc-enhanced-hide": "أخفِ التفاصيل",
-       "recentchangeslinked": "تغييرات ذات علاقة",
-       "recentchangeslinked-toolbox": "Tabdilet them",
-       "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
-       "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
-       "recentchangeslinked-page": "اسم الصفحة:",
-       "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
-       "upload": "Abεeth des fichiers l'esserveur",
-       "uploadlogpage": "سجل الرفع",
-       "filedesc": "ملخص:",
-       "license": "ترخيص:",
-       "license-header": "licence",
-       "file-anchor-link": "milaf (Fichier)",
-       "filehist": "teri5 el milaf",
-       "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
-       "filehist-revert": "استرجع",
-       "filehist-current": "حالي",
-       "filehist-datetime": "وقت/زمن",
-       "filehist-thumb": "صورة مصغرة",
-       "filehist-thumbtext": "تصغير للنسخة بتاريخ $1",
-       "filehist-user": "مستخدم",
-       "filehist-dimensions": "الأبعاد",
-       "filehist-comment": "ta3li9at",
-       "imagelinks": "استخدام الملف",
-       "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
-       "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
-       "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
-       "randompage": "Sʾafħa elli tji",
-       "statistics": "إحصاءات",
-       "nbytes": "{{PLURAL:Octet weħed|Zouz octets|$1 octets|$1 en octet}}",
-       "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
-       "prefixindex": "كل الصفحات بالبادئة",
-       "usercreated": "{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2",
-       "newpages": "Safħat jdod",
-       "move": "انقل",
-       "pager-newer-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
-       "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
-       "booksources": "مصادر كتاب",
-       "booksources-search-legend": "البحث عن مصادر الكتب",
-       "log": "سجلات",
-       "allpages": "kol ess'afa7at",
-       "allarticles": "kol ess'afa7at",
-       "allpagessubmit": "اذهب",
-       "categories": "تصنيفات",
-       "linksearch-line": "$1 موصولة من $2",
-       "listgrouprights-members": "(قائمة الأعضاء)",
-       "emailuser": "إرسال رسالة لهذا المستخدم",
-       "watchlist": "قائمة مراقبتي",
-       "mywatchlist": "قائمة مراقبتي",
-       "watchlistfor2": "ل$1 $2",
-       "watch": "راقب",
-       "unwatch": "أوقف المراقبة",
-       "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.",
-       "wlshowlast": "عرض آخر $1 ساعات $2 أيام",
-       "watchlist-options": "خيارات قائمة المراقبة",
-       "actioncomplete": "انتهاء العملية",
-       "actionfailed": "الفعل فشل",
-       "dellogpage": "سجل الحذف",
-       "rollbacklink": "rajjaε",
-       "protectlogpage": "سجل الحماية",
-       "protectedarticle": "حمى \"[[$1]]\"",
-       "undeletelink": "اعرض/استعد",
-       "undeleteviewlink": "اعرض",
-       "namespace": "النطاق",
-       "invert": "اعكس الاختيار",
-       "blanknamespace": "(Principal)",
-       "contributions": "مساهماتي",
-       "contributions-title": "مساهمات المستخدم $1",
-       "mycontris": "مساهماتي",
-       "contribsub2": "ل$1 ($2)",
-       "uctop": "(top)",
-       "month": "من سنة (وأقدم):",
-       "year": "من سنة (وأقدم):",
-       "sp-contributions-newbies": "اعرض مساهمات الحسابات الجديدة فقط",
-       "sp-contributions-blocklog": "سجل المنع",
-       "sp-contributions-uploads": "مرفوعات",
-       "sp-contributions-logs": "سجلات",
-       "sp-contributions-talk": "نقاش",
-       "sp-contributions-search": "بحث عن مساهمات",
-       "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
-       "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
-       "sp-contributions-submit": "lawwej",
-       "whatlinkshere": "Chnowa elli ywassel elhouni",
-       "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
-       "whatlinkshere-page": "ss'af7a:",
-       "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
-       "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
-       "isredirect": "صفحة تحويل",
-       "istemplate": "مضمن",
-       "isimage": "وصلة ملف",
-       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|القادمة|ال$1 القادمة}}",
-       "whatlinkshere-links": "← وصلات",
-       "whatlinkshere-hideredirs": "$1 التحويلات",
-       "whatlinkshere-hidetrans": "$1 التضمينات",
-       "whatlinkshere-hidelinks": "$1 الوصلات",
-       "whatlinkshere-hideimages": "$1 وصلة صورة",
-       "whatlinkshere-filters": "مرشحات",
-       "ipboptions": "ساعتين:2 hours,يوم واحد:1 day,3 أيام:3 days,أسبوع واحد:1 week,أسبوعين:2 weeks,شهر واحد:1 month,3 أشهر:3 months,6 أشهر:6 months,سنة واحدة:1 year,دائم:infinite",
-       "ipblocklist": "المستخدمون الممنوعون",
-       "blocklink": "Bloqui",
-       "unblocklink": "ارفع المنع",
-       "change-blocklink": "تغيير المنع",
-       "contribslink": "Mousehmet",
-       "blocklogpage": "سجل المنع",
-       "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
-       "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
-       "movelogpage": "سجل النقل",
-       "revertmove": "استرجع",
-       "export": "تصدير صفحات",
-       "allmessagesname": "الاسم",
-       "allmessagesdefault": "النص الافتراضي",
-       "thumbnail-more": "Kabber",
-       "thumbnail_error": "خطأ في إنشاء صورة مصغرة: $1",
-       "tooltip-pt-userpage": "صفحة المستخدم الخاصة بك",
-       "tooltip-pt-mytalk": "صفحة نقاشك",
-       "tooltip-pt-preferences": "تفضيلاتي",
-       "tooltip-pt-watchlist": "قائمة الصفحات التي تراقب التغييرات التي تحدث بها",
-       "tooltip-pt-mycontris": "قائمة مساهماتك",
-       "tooltip-pt-login": "Madhabina ken tconnecti, ama mouch bessif",
-       "tooltip-pt-logout": "خروج",
-       "tooltip-ca-talk": "Discussion εal contenu mtaε essafħa",
-       "tooltip-ca-edit": "Tannjem tbaddel essafħa hedhi. Aman enzel εal bouton mtaε elvue el msabqa qbal matsajjel.",
-       "tooltip-ca-addsection": "ابدأ قسما جديدا",
-       "tooltip-ca-viewsource": "Essʾafħa protéjé.\nTnajjem tchouf essours mtaħħa.",
-       "tooltip-ca-history": "Copiet qdom mtaε essafħa hedhi",
-       "tooltip-ca-protect": "احم هذه الصفحة",
-       "tooltip-ca-delete": "احذف هذه الصفحة",
-       "tooltip-ca-move": "علم هذه الصفحة",
-       "tooltip-ca-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
-       "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
-       "tooltip-search": "Lawwej fi {{SITENAME}}",
-       "tooltip-search-go": "اذهب إلى صفحة بالاسم نفسه إن وجدت",
-       "tooltip-search-fulltext": "Farkes f'essafħat εattexte hedha",
-       "tooltip-p-logo": "Emchi l'elpage principale",
-       "tooltip-n-mainpage": "Emchi l'elpage principale",
-       "tooltip-n-mainpage-description": "Emchi l'elpage principale",
-       "tooltip-n-portal": "Ɛ'almachrouε, chnowa tnajem taεmel, win talqa elli ħajtek bih",
-       "tooltip-n-currentevents": " Alqa information εla aham laħdeth mtaε tawa",
-       "tooltip-n-recentchanges": "Lista mtaε ajad ettabdilat f'elwiki",
-       "tooltip-n-randompage": "Ħell sʾafħa elli tji",
-       "tooltip-n-help": "Mouεawna",
-       "tooltip-t-whatlinkshere": "Lista mtaε safħat elwiki elkol elli twassel elhouni",
-       "tooltip-t-recentchangeslinked": "Aham ettabldilet f'essafħat elli ywaslou l'essafħa hedhi",
-       "tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
-       "tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
-       "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
-       "tooltip-t-upload": "Abεeth des fichiers l'esserveur",
-       "tooltip-t-specialpages": "Lista mtaε essafħat esspéciales elkol",
-       "tooltip-t-print": "Version l'ettabεan mtaε essafħa hedhi.",
-       "tooltip-t-permalink": "Lien dayem l'elversion hedhi mtaε essafħa",
-       "tooltip-ca-nstab-main": "Chouf elcontenu mtaε essafħa",
-       "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
-       "tooltip-ca-nstab-special": "هذه صفحة خاصة، لا تستطيع أن تعدل الصفحة نفسها",
-       "tooltip-ca-nstab-project": "رؤية صفحة المحتوى",
-       "tooltip-ca-nstab-image": "رؤية صفحة الملف",
-       "tooltip-ca-nstab-template": "رؤية القالب",
-       "tooltip-ca-nstab-category": "رؤية صفحة التصنيف",
-       "tooltip-minoredit": "علم على هذا كتعديل طفيف",
-       "tooltip-save": "احفظ تغييراتك",
-       "tooltip-preview": "اعرض تغييراتك، من فضلك استخدم هذا قبل الحفظ!",
-       "tooltip-diff": "اعرض التغييرات التي قمت بها للنص.",
-       "tooltip-compareselectedversions": "شاهد الفروق بين النسختين المختارتين من هذه الصفحة.",
-       "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
-       "tooltip-rollback": "\"Rajjaε\" yrajjeε ettabdilet f'hassafħa el'ekher weħed baddel fi nazla waħda.",
-       "tooltip-undo": "\"رجوع\" تسترجع هذا التعديل وتفتح نافذة التعديل في نمط العرض المسبق. تسمح بإضافة سبب في الملخص.\n\"Annuler\" trajjeε eltabdila lekhra w tħel fenêtre mtaε  el tabdil mtaε elvue el msabqa. Tnajjem tqoul εlech f'ettalkhis.",
-       "tooltip-summary": "أدخل ملخصا قصيرا",
-       "previousdiff": "→ التعديل السابق",
-       "nextdiff": "التعديل اللاحق ←",
-       "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
-       "file-nohires": "لا توجد دقة أعلى متوفرة.",
-       "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
-       "show-big-image": "دقة كاملة",
-       "bad_image_list": "Elformat kima hakka:\nLes élements mtaε lista (lostra elli yabdew b' *) yetħesbou.\nEllien lowel fi star yelzmou ykoun lien el fichier khayeb.\nAy lien ekher fi nafs estar yetħseb exception, maħneha des pages win elfichier ynajem ykoun fi star.",
-       "metadata": "بيانات ميتا",
-       "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
-       "metadata-fields": "حقول معطيات الميتا الموجودة في هذه الرسالة سوف تعرض في صفحة الصورة عندما يكون جدول معطيات الميتا مضغوطا.\nالحقول الأخرى ستكون مخفية افتراضيا.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "namespacesall": "الكل",
-       "monthsall": "الكل",
-       "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
-       "watchlistedit-clear-titles": "Elɛanawin",
-       "watchlistedit-too-many": "Famma barcha pajet w'manajmouch nħotouhom lkol lahné",
-       "watchlisttools-view": "اعرض التغييرات المرتبطة",
-       "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
-       "watchlisttools-raw": "عدل قائمة المراقبة الخام",
-       "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
-       "specialpages": "Safħat spéciales",
-       "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
-       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
-}
index e9547e9..393c3e0 100644 (file)
        "preview": "Voorskou",
        "showpreview": "Wys voorskou",
        "showdiff": "Wys veranderings",
-       "anoneditwarning": "'''Waarskuwing:''' Aangesien u nie aangeteken is nie, sal u IP-adres in dié blad se wysigingsgeskiedenis gestoor word.",
+       "anoneditwarning": "'''Waarskuwing:''' u is nie aangemeld nie. U IP-adres sal in die bladsy se wysigingsgeskiedenis gestoor word. As u <strong>[$1 aanmeld]</strong> of <strong>[$2 'n gebruiker skep]</strong verskyn u wysigings, naas andere voordele, onder u gebruikersnaam.",
        "anonpreviewwarning": "''U is nie aangeteken nie.''\n''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
        "missingsummary": "'''Neem kennis''': Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer gekliek word, word die wysiging sonder 'n opsomming gestoor.",
        "missingcommenttext": "Tik die opsomming onder.",
        "currentrev": "Huidige wysiging",
        "currentrev-asof": "Huidige wysiging per $1",
        "revisionasof": "Wysiging soos op $1",
-       "revision-info": "Weergawe soos op $1 deur $2",
+       "revision-info": "Weergawe deur {{GENDER:$6|$2}} op $4 om $5$7",
        "previousrevision": "← Ouer weergawe",
        "nextrevision": "Nuwer weergawe →",
        "currentrevisionlink": "Huidige weergawe",
        "searchrelated": "verwante",
        "searchall": "alle",
        "showingresults": "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} vanaf #'''$2'''.",
+       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$2</strong>|Resultate <strong>$1 - $2</strong> van <strong>$3</strong>}}",
        "search-nonefound": "Daar is geen resultate vir u soekopdrag nie.",
        "powersearch-legend": "Gevorderde soektog",
        "powersearch-ns": "Soek in naamruimtes:",
        "recentchanges-label-unpatrolled": "Die wysiging is nog nie gekontroleer nie",
        "recentchanges-label-plusminus": "Bladsy is met die aantal grepe gewysig",
        "recentchanges-legend-heading": "'''Sleutel:'''",
-       "recentchanges-legend-newpage": "$1 - nuwe bladsy",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
        "import-interwiki-history": "Kopieer ook volledige geskiedenis van hierdie bladsy",
        "import-interwiki-templates": "Sluit alle sjablone in",
        "import-interwiki-submit": "Importeer",
-       "import-interwiki-namespace": "Doelnaamruimte:",
-       "import-interwiki-rootpage": "Basisblad van bestemming (opsioneel):",
        "import-upload-filename": "Lêernaam:",
        "import-comment": "Opmerking:",
        "importtext": "Gebruik die [[Special:Export|eksport-funksie]] van die wiki waar die inligting vandaan kom.\nStoor die afvoer op u eie rekenaar, en laai dit hier op.",
        "tooltip-pt-mycontris": "Lys van my bydraes",
        "tooltip-pt-login": "U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie.",
        "tooltip-pt-logout": "Teken uit",
+       "tooltip-pt-createaccount": "U word aangemoedig om 'n gebruiker te skep en aan te meld, hoewel dit nie verpligtend is nie.",
        "tooltip-ca-talk": "Bespreking oor die inhoudbladsy",
        "tooltip-ca-edit": "U kan hierdie bladsy wysig. Gebruik asseblief die voorskoufunksie vóór u dit stoor.",
        "tooltip-ca-addsection": "Begin 'n nuwe bespreking",
        "spam_reverting": "Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie",
        "spam_blanking": "Alle weergawes met 'n skakel na $1 word verwyder",
        "spam_deleting": "Alle weergawes bevat verwysings na $1. Bladsy verwyder",
-       "simpleantispam-label": "Anti-spam kontrole.\n'''Moenie''' die veld invul nie!",
+       "simpleantispam-label": "Antispam-kontrole.\n<strong>Moenie</strong> die veld invul nie!",
        "pageinfo-title": "Inligting oor \"$1\"",
        "pageinfo-not-current": "Hierdie gegewens is slegs vir die huidige weergawe beskikbaar.",
        "pageinfo-header-basic": "Basiese inligting",
index 9221af9..921072d 100644 (file)
@@ -21,7 +21,7 @@
        "tog-newpageshidepatrolled": "Hȳdan weardode trametas in nīwra andwendinga getæle",
        "tog-extendwatchlist": "Sprǣdan behealdungtæl tō īwenne ealla andwendinga, nā synderlīce þā nīwostan",
        "tog-usenewrc": "Settan andwendunga on hēapas on trametum on nīwra andwendunga getæle and behealdungtæle",
-       "tog-numberheadings": "Settan rīm on fōrecwidas selflīce",
+       "tog-numberheadings": "Settan rīm on forecwidas selflīce",
        "tog-showtoolbar": "Īwan þā adihtunge tōlmearce",
        "tog-editondblclick": "Adihtan trametas mid twifealdum mȳs swenge",
        "tog-editsectiononrightclick": "Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum",
        "disclaimers": "Ætsacunga",
        "disclaimerpage": "Project:Gemǣne ætsacung",
        "edithelp": "Help on adihtunge",
+       "helppage-top-gethelp": "Help",
        "mainpage": "Hēafodtramet",
        "mainpage-description": "Hēafodtramet",
        "policy-url": "Project:Rǣd",
        "exception-nologin": "Ne inloggod",
        "virus-badscanner": "Yfel gesetedness: Uncūþ wyrmsēcend: <em>$1</em>",
        "virus-unknownscanner": "uncūþ andgund:",
-       "logouttext": "'''Þū eart nū ūtmeldod.'''\n\nÞū canst ætfeolan þǣre nytte {{SITENAME}} tō ungecūðum, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō þǣm ylcan oþþe ōðrum brūcende.\nCnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles hord.",
+       "logouttext": "'''Þū eart nū ūtmeldod.'''\n\nWit þū þe sume trametas wēnunga sīen gīet geīwed swā þū sīe inmeldod, ōþ þū ǣmetgie þīnes webbsēcendes hord.",
        "welcomeuser": "Wilcume, $1!",
        "yourname": "Þīn brūcendnama:",
        "userlogin-yourname": "Brūcendnama:",
        "gotaccount": "Hafast þū reccinge ǣr? $1.",
        "gotaccountlink": "Inmeldian",
        "userlogin-resetpassword-link": "Forgēate þū þīn gelēafword?",
+       "createacct-emailrequired": "Spearcǣrenda nama",
+       "createacct-emailoptional": "Spearcǣrenda nama (ungenēdedlic)",
+       "createacct-email-ph": "Besettan þīnne spearcǣrenda naman",
+       "createacct-another-email-ph": "Besettan spearcǣrenda naman",
        "createaccountmail": "Notian hwīlendlic hlīetlic þafungword and sendan hit tō þǣm genamodan spearcǣrendnaman",
+       "createacct-realname": "Sōt nama (ungenēdedlic)",
        "createaccountreason": "Racu:",
+       "createacct-reason": "Racu",
+       "createacct-reason-ph": "For hwȳ wyrcest þū ōðerne grīman",
+       "createacct-imgcaptcha-ph": "Besettan þone traht þe þū sīhst būfan",
+       "createacct-submit": "Scieppan þīnne grīman",
+       "createacct-another-submit": "Scieppan ōðerne grīman",
+       "createacct-benefit-heading": "{{SITENAME}} is geworht fram hādum swilce þū.",
+       "createacct-benefit-body1": "{{PLURAL:$1|adihtung|adihtunga}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|tramet|trameta}}",
        "badretype": "Þā þafungword þe write þū, bēoþ ungelīc.",
        "userexists": "Se brūcendnama is ǣr gebrocen. Cēos lā ōðerne naman.",
        "loginerror": "Inmeldunge wōh",
+       "createacct-error": "Grīman scieppunge misfeng",
        "createaccounterror": "Ne cūðe scieppan reccinge: $1",
        "nocookiesnew": "Sēo brūcendreccing wæs gemacod, ac þū neart inmeldod.\n{{SITENAME}} brȳcþ cȳþþu grētunga tō inmeldienne brūcendas.\nÞū hafast forwierned cȳþþu grētunga.\nLīef him lā, and siþþan inmelda þīnne nīwan brūcendnaman and þīn nīwe þafungword.",
+       "noname": "Þū nafast gewriten gengne brūcendes naman.",
        "loginsuccesstitle": "Inmeldung gesǣlde",
        "loginsuccess": "'''Þu eart nū inmeldod tō {{SITENAME}} tō \"$1\".'''",
        "nosuchuser": "Þǣr nis nān brūcend þe hæfþ þone naman \"$1\".\nStafena micelnessa sind hefiga and ānlica on brūcendnamum.\nScēawa þīne wrītunge eft, oþþe [[Special:UserLogin/signup|sciepp nīwe reccinge]].",
        "nosuchusershort": "Þǣr nis nān brūcend mid þǣm naman \"$1\".  Scēawa þīne wrītunge.",
+       "nouserspecified": "Þū scealt wrītan brūcendes naman.",
+       "login-userblocked": "Þes brūcend is fortȳned. Inmeldung nis gelīfed.",
+       "wrongpassword": "Nā riht þafungword wæs gewriten. Sēc þū eft lā.",
+       "wrongpasswordempty": "Þū ne write nǣnig þafungword. \nSēc þū eft lā.",
        "passwordtooshort": "Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.",
+       "passwordtoolong": "Þafungword ne cunnon wesan lengran þonne {{PLURAL:$1|1 stafa|$1 stafena}}.",
+       "password-name-match": "Þīn þafungword sceal wesan ungelīc þīnum brūcendes naman.",
+       "password-login-forbidden": "Sēo nytt þisses brūcendes naman and þafungwordes nis gelīfed.",
        "mailmypassword": "Settan þafungword eft",
+       "passwordremindertitle": "Nīwe hwīlendlic þafungword for {{SITENAME}}",
+       "noemail": "Þær nis nǣnig spearcǣrenda nama gewriten for \"$1\" brūcende.",
+       "noemailcreate": "Þū þearft wrītan gengne spearcǣrenda naman.",
+       "blocked-mailpassword": "Þīn IP nama is fortȳned and ne cann adihtan; þæs ne cann  hit brūcan þone þafungworda eftgemyndgunge tōl swā þæt man ne miswende hine.",
        "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",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
        "recentchanges-label-plusminus": "Þæs trametes micelness wæs andwended þȳs rīme grēatbitena",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
-       "rcnotefrom": "Niðer sind þā andwendunga fram <strong>$2</strong> (mǣst īweþ <strong>$1</strong>).",
+       "rcnotefrom": "Niðer {{PLURAL:$5|is sēo andwendung|sindon þā andwendunga}} fram <strong>$4 of $3</strong> (swā fela swā <strong>$1</strong> sind geīwed).",
        "rclistfrom": "Īwan nīwa andwendunga fram $3 $2 and siþþan",
        "rcshowhideminor": "$1 lytela adihtunga",
        "rcshowhideminor-show": "Īwan",
        "uploadbtn": "Hladan ymelan forþ",
        "uploadnologin": "Nā inmeldod",
        "uploaderror": "Wōh on forþhladunge",
-       "upload-permitted": "Geþafod ymelena cynn: $1.",
-       "upload-preferred": "Fōreboren ymelena cynn: $1.",
-       "upload-prohibited": "Forboden ymelena cynn: $1.",
+       "upload-permitted": "Geþafod ymelena {{PLURAL:$2|cynn|cynn}}: $1.",
+       "upload-preferred": "Foreboren ymelena {{PLURAL:$2|cynn|cynn}}: $1.",
+       "upload-prohibited": "Forboden ymelena {{PLURAL:$2|cynn|cynn}}: $1.",
        "uploadlogpage": "Hladan ealdhord forþ",
        "filename": "Ymelan nama",
        "filedesc": "Scortness",
        "wantedpages": "Gewilnode trametas",
        "mostlinked": "Trametas mid þǣm mǣstan rīme hlencena",
        "mostlinkedcategories": "Floccas mid þǣm mǣstan rīme hlencena",
-       "mostlinkedtemplates": "Bysena mid þǣm mǣstan rīme hlencena",
-       "prefixindex": "Ealle trametas mid fōredǣle",
+       "mostlinkedtemplates": "Trametas mid þǣm mǣstan rīme hlencena",
+       "prefixindex": "Ealle trametas mid foredǣle",
        "shortpages": "Scorte trametas",
        "longpages": "Lange trametas",
        "listusers": "Brūcenda getæl",
        "unwatch": "Ablinnan behealdunge",
        "unwatchthispage": "Ablinnan behealdunge",
        "watchlist-details": "{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā sunderlīce arīmedum mōtunga trametum.",
-       "wlnote": "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
+       "wlnote": "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre nīwostan tīde|þǣm nīwostum '''$2''' tīda}}, fram $4 of $3.",
        "wlshowlast": "Īwan þā nīwostan $1 tīda $2 daga",
        "watchlist-options": "Behealdungtæles cyras",
        "watching": "Behealdende...",
        "tooltip-pt-logout": "Ūtmeldian",
        "tooltip-pt-createaccount": "Þū āhst wyrcan grīman tō brūcenne, ac þū ne þearft þæt dōn.",
        "tooltip-ca-talk": "Mōtung ymbe þone innunge tramet",
-       "tooltip-ca-edit": "Þū meaht þisne tramet adihtan. Brūc lā þone fōrebysene cnæpp ǣr þū hordie.",
+       "tooltip-ca-edit": "Þū meaht þisne tramet adihtan. Brūc lā þone forebysene cnæpp ǣr þū hordie.",
        "tooltip-ca-addsection": "Beginnan nīwne dǣl",
        "tooltip-ca-viewsource": "Þes tramet is borgen.\nÞū canst his fruman sēon.",
        "tooltip-ca-history": "Ǣrran fadunga þisses trametes",
        "tooltip-ca-nstab-category": "Sēon þone flocces tramet",
        "tooltip-minoredit": "Mearcian þās tō lytelre adihtunge",
        "tooltip-save": "Hordian þīna andwendunga",
-       "tooltip-preview": "Seoh fōrebysene þīnra andwendunga. Brūc þis lā ǣr þū hordie!",
+       "tooltip-preview": "Seoh forebysene þīnra andwendunga. Brūc þis lā ǣr þū hordie!",
        "tooltip-diff": "Īwan þā andwendunga þā þū dydest wiþ þone traht",
        "tooltip-compareselectedversions": "Sēon þā gescēad betweonan þǣm twǣm gecorenum fadungum þisses trametes",
        "tooltip-watch": "Ēacnian þīn behealdungtæl mid þissum tramete",
-       "tooltip-undo": "\"Undōn\" undēþ þās adihtunge and openaþ þǣre adihtunge bysene tō fōrebysene. Man cann secgan race on þǣre sceortnesse.",
+       "tooltip-undo": "\"Undōn\" undēþ þās adihtunge and openaþ þǣre adihtunge bysene tō forebysene. Man cann secgan race on þǣre sceortnesse.",
        "tooltip-summary": "Wrītan sceorte gemearcunge",
        "anonymous": "{{PLURAL:$1|uncūþ brūcend|uncūðra brūcenda}} of {{SITENAME}}",
        "siteuser": "{{SITENAME}}n brūcend $1",
        "exif-gpsdirection-t": "Sōþ rihtung",
        "namespacesall": "eall",
        "monthsall": "eall",
-       "confirmemail_body": "Hwilchwega, gewēne þu of IP stōwe $1, hæfþ in namanbēc gestt ǣnne hordcleofan\n\"$2\" mid þissum e-ǣrendes naman on {{SITENAME}}n.\n\nTō āsēðenne þæt þes hordcleofa tō þē gebyraþ and tō openienne\ne-ǣrenda hwilcnessa on {{SITENAME}}n, opena þisne bend in þīnum webbscēawere:\n\n$3\n\nGif þis is *nā* þū, ne folga þisne bend.\n\n$5\n\nÞēos āsēðungrūn forealdaþ æt $4.",
+       "confirmemail_body": "Hwilchwega, gewēne þu of IP stōwe $1, hæfþ in namanbēc gesett ǣnne grīman\n\"$2\" mid þissum spearcǣrenda naman on {{SITENAME}}.\n\nTō asēðenne þæt þes grīma tō þē gebȳraþ and tō openienne\nspearcǣrenda hwilcnessa on {{SITENAME}}, opena þisne bend in þīnum webbsēcende:\n\n$3\n\nGif þis *nis* þū, ne folga þisne bend.\n\n$5\n\nÞis asēðunge rūnword forealdaþ æt $4.",
        "scarytranscludefailed": "[Bysene feccung trucode for $1]",
        "scarytranscludetoolong": "[URL is tō lang]",
        "imgmultigo": "Gān!",
        "logentry-delete-delete": "$1 {{GENDER:$2|forlēas}} tramet $3",
        "logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
        "revdelete-summary": "ādihtscortnes",
-       "searchsuggest-search": "Sēcan"
+       "searchsuggest-search": "Sēcan",
+       "special-characters-group-latin": "Lǣden",
+       "special-characters-group-latinextended": "Ēacnod Lǣden",
+       "special-characters-group-symbols": "Tācnu",
+       "special-characters-group-greek": "Grēcisc",
+       "special-characters-group-cyrillic": "Cyrillisc",
+       "special-characters-group-arabic": "Arabisc",
+       "special-characters-group-persian": "Perseanisc"
 }
index a702bf7..f0b1caf 100644 (file)
@@ -50,7 +50,8 @@
                        "Bibas",
                        "Khaled",
                        "Emara",
-                       "Macofe"
+                       "Macofe",
+                       "Yahya Sakhnini"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "notextmatches": "لم يتم إيجاد أي نص مطابق",
        "prevn": "{{PLURAL:$1|$1}} السابقة",
        "nextn": "{{PLURAL:$1|$1}} التالية",
+       "prev-page": "الصفحة السابقة",
+       "next-page": "الصفحة التالية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "nextn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} تالية",
        "shown-title": "عرض $1 {{PLURAL:$1|نتيجة|نتيجة}} لكل صفحة",
        "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-deactivate": "تعطيل",
        "tags-hitcount": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "tags-create-tag-name": "اسم الوسم:",
        "tags-create-reason": "السبب:",
        "tags-create-submit": "أنشئ",
+       "tags-delete-reason": "سبب:",
+       "tags-activate-submit": "تفعيل",
+       "tags-deactivate-reason": "سبب",
        "comparepages": "قارن صفحات",
        "compare-page1": "صفحة 1",
        "compare-page2": "صفحة 2",
index 1b0c089..06899e8 100644 (file)
        "hidden-category-category": "Categoríes anubríes",
        "category-subcat-count": "{{PLURAL:$2|Esta categoría tien namái la subcategoría siguiente.|Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}, d'un total de $2.}}",
        "category-subcat-count-limited": "Esta categoría tien {{PLURAL:$1|la subcategoría siguiente|les $1 subcategoríes siguientes}}.",
-       "category-article-count": "{{PLURAL:$2|Esta categoría contién namái la páxina siguiente.|{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
+       "category-article-count": "{{PLURAL:$2|Esta categoría contien namái la páxina siguiente.|{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
        "category-article-count-limited": "{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} na categoría actual.",
-       "category-file-count": "{{PLURAL:$2|Esta categoría contién namái'l ficheru siguiente.|{{PLURAL:$1|El ficheru siguiente ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
+       "category-file-count": "{{PLURAL:$2|Esta categoría contien namái el ficheru siguiente.|{{PLURAL:$1|El ficheru siguiente ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
        "category-file-count-limited": "{{PLURAL:$1El ficheru siguiente ta|Los $1 ficheeros siguientes tán}} na categoría actual.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Páxines indexaes",
        "disclaimers": "Avisu llegal",
        "disclaimerpage": "Project:Avisu xeneral",
        "edithelp": "Ayuda d'edición",
+       "helppage-top-gethelp": "Ayuda",
        "mainpage": "Portada",
        "mainpage-description": "Portada",
        "policy-url": "Project:Polítiques",
        "translateinterface": "P'amestar o camudar les traducciones pa toles wikis, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
        "cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
        "namespaceprotected": "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
-       "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
-       "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
+       "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
+       "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
        "mycustomcssprotected": "Nun tien permisu pa editar esta páxina CSS.",
        "mycustomjsprotected": "Nun tien permisu pa editar esta páxina JavaScript.",
        "myprivateinfoprotected": "Nun tien permisu pa editar la so información privada.",
        "wrongpassword": "Escribisti una contraseña incorreuta.\nVuelvi a intentalo.",
        "wrongpasswordempty": "La contraseña taba en blanco.\nVuelvi a intentalo.",
        "passwordtooshort": "Les contraseñes han de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
+       "passwordtoolong": "Les contraseñes nun puen ser mayores de {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
        "password-name-match": "La contraseña tien de ser distinta del nome d'usuariu.",
        "password-login-forbidden": "Ta torgao usar esti nome d'usuariu y contraseña.",
        "mailmypassword": "Reaniciar contraseña",
        "missingcommentheader": "'''Recordatoriu:''' Nun conseñasti un asuntu/titular pa esti comentariu.\nSi calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin dengún.",
        "summary-preview": "Vista previa del resume:",
        "subject-preview": "Vista previa del asuntu/titular:",
+       "previewerrortext": "Hebo un error al intentar entever los cambios.",
        "blockedtitle": "L'usuariu ta bloquiáu",
        "blockedtext": "'''El to nome d'usuariu o direición IP ta bloquiáu.'''\n\nEl bloquéu fexolu $1.\nEl motivu conseñáu ye ''$2''.\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.\nNun pues usar la función 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de\ncorréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "autoblockedtext": "La to direición IP bloquióse automáticamente porque usóla otru usuariu que foi bloquiáu por $1.\nEl motivu conseñáu ye:\n\n:''$2''\n\n* Principiu del bloquéu: $8\n* Caducidá del bloquéu: $6\n* Usuariu a bloquiar: $7\n\nPues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] p'aldericar sobre'l bloquéu.\n\nTen en cuenta que nun pues usar la función «manda-y un corréu electrónicu a esti usuariu» a nun ser que tengas rexistrada una direición de corréu electrónicu válida nes [[Special:Preferences|preferencies d'usuariu]] y que nun tengas torgao usala.\n\nLa to direición IP actual ye $3, y la ID del bloquéu ye #$5.\nPor favor, incluye tolos detalles anteriores nes consultes que faigas.",
        "accmailtitle": "Clave unviada",
        "accmailtext": "Unvióse a $2 una contraseña xenerada al debalu pal usuariu [[User talk:$1|$1]]. Pue camudase na páxina ''[[Special:ChangePassword|camudar contraseña]]'' depués d'aniciar sesión.",
        "newarticle": "(Nuevu)",
-       "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
+       "newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
        "anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
        "noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina]</span>.",
        "noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
        "editingsection": "Editando $1 (seición)",
        "editingcomment": "Editando $1 (seición nueva)",
        "editconflict": "Conflictu d'edición: $1",
-       "explainconflict": "Daquién más camudó esta páxina dende qu'empecipiasti a editala.\nL'área de testu d'arriba contién el testu de la páxina como ta nestos momentos.\nLos tos cambios s'amuesen nel área de testu d'abaxo.\nVas tener que fusionar los tos cambios dientro del testu esistente.\n'''Namái''' va guardase'l testu del área d'arriba cuando calques \"{{int:savearticle}}\".",
+       "explainconflict": "Daquién más camudó esta páxina dende qu'empecipiasti a editala.\nL'área de testu d'arriba contien el testu de la páxina como ta nestos momentos.\nLos tos cambios s'amuesen nel área de testu d'abaxo.\nVas tener que fusionar los tos cambios dientro del testu esistente.\n'''Namái''' va guardase'l testu del área d'arriba cuando calques \"{{int:savearticle}}\".",
        "yourtext": "El to testu",
        "storedversion": "Versión almacenada",
        "nonunicodebrowser": "'''Avisu: El to navegador nun cumple la norma Unicode.''' Hai un sistema alternativu que te permite editar páxines de forma segura: los caráuteres non-ASCII apaecerán nel cuadru d'edición como códigos hexadecimales.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
        "postedit-confirmation-created": "Creóse la páxina.",
        "postedit-confirmation-restored": "Restauróse la páxina.",
-       "postedit-confirmation-saved": "Guardose la edición.",
+       "postedit-confirmation-saved": "Guardóse la edición.",
        "edit-already-exists": "Nun pudo crease una páxina nueva.\nEsta yá esiste.",
        "defaultmessagetext": "Testu predetermináu",
        "content-failed-to-parse": "Fallu al analizar el conteníu $2 pal modelu $1: $3",
        "content-json-empty-object": "Oxetu baleru",
        "content-json-empty-array": "Matriz balera",
        "duplicate-args-category": "Páxines con argumentos duplicaos nes llamaes a plantíes",
-       "duplicate-args-category-desc": "La páxina contién llamaes a plantíes qu'usen argumentos duplicaos, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "'''Avisu:''' Esta páxina contién demasiaes llamaes costoses a funciones d'análisis sintáuticu.\n\nHabría tener menos de $2 {{PLURAL:$2|llamada|llamaes}}, y agora tien $1 {{PLURAL:$1|llamada|llamaes}}.",
+       "duplicate-args-category-desc": "La páxina contien llamaes a plantíes qu'usen argumentos duplicaos, como <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "'''Avisu:''' Esta páxina contien demasiaes llamaes costoses a funciones d'análisis sintácticu.\n\nHabría tener menos de $2 {{PLURAL:$2|llamada|llamaes}}, y agora tien $1 {{PLURAL:$1|llamada|llamaes}}.",
        "expensive-parserfunction-category": "Páxines con demasiaes llamaes costoses a funciones analítiques",
        "post-expand-template-inclusion-warning": "'''Avisu:''' El tamañu de les plantíes incluyíes ye demasiao grande.\nDelles plantíes nun se van incluir.",
        "post-expand-template-inclusion-category": "Páxines con escesu d'inclusiones de plantíes",
-       "post-expand-template-argument-warning": "'''Avisu:''' Esta páxina contién polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.\nEstos parámetros s'omitieron.",
+       "post-expand-template-argument-warning": "<strong>Avisu:</strong> Esta páxina contien polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.\nEstos parámetros s'omitieron.",
        "post-expand-template-argument-category": "Páxines con parámetros de plantía omitíos",
        "parser-template-loop-warning": "Deteutóse un bucle de plantíes: [[$1]]",
        "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)",
        "history-feed-description": "Historial de revisiones d'esta páxina na wiki",
        "history-feed-item-nocomment": "$1 en $2",
        "history-feed-empty": "La páxina solicitada nun esiste.\nSeique fuera desaniciada de la wiki, o renomada.\nPrueba a [[Special:Search|buscar na wiki]] otres páxines nueves.",
+       "history-edit-tags": "Editar les etiquetes de les revisiones esbillaes",
        "rev-deleted-comment": "(resume d'edición desaniciáu)",
        "rev-deleted-user": "(nome d'usuariu desaniciáu)",
        "rev-deleted-event": "(detalles del rexistru desaniciaos)",
        "rev-showdeleted": "amosar",
        "revisiondelete": "Desaniciar/restaurar revisiones",
        "revdelete-nooldid-title": "Revisión de destín inválida",
-       "revdelete-nooldid-text": "Nun especificasti una revisión o revisiones destín sobre les que realizar esta función, la revisión especificada nun esiste, o tas intentando anubrir la revisión actual.",
+       "revdelete-nooldid-text": "Nun especificasti nenguna revisión o revisiones destín sobre les que realizar esta función, la revisión especificada nun esiste, o tas intentando anubrir la revisión actual.",
        "revdelete-no-file": "El ficheru conseñáu nun esiste.",
        "revdelete-show-file-confirm": "¿Tas seguru de que quies ver una versión desaniciada del ficheru \"<nowiki>$1</nowiki>\" del $2 a les $3?",
        "revdelete-show-file-submit": "Sí",
        "revdelete-no-change": "'''Avisu:''' l'elementu con data $2, $1 yá tien los axustes de visibilidá pidíos.",
        "revdelete-concurrent-change": "Error al camudar l'elementu con data $2, $1: paez que'l so estáu camudólu otra persona mientres tentabes camudalu tu.\nComprueba los rexistros, por favor.",
        "revdelete-only-restricted": "Fallu al anubrir l'elementu con data $1, $2: nun se puen quitar elementos de la vista de los alministradores ensin escoyer tamién una de les otres opciones de visibilidá.",
-       "revdelete-reason-dropdown": "*Razones comúnes de desaniciu \n** Violación del Copyright\n** Información personal o comentariu non apropiáu\n** Nome d'usuariu non apropiáu\n** Información potencialmente falsa",
+       "revdelete-reason-dropdown": "*Razones comunes de desaniciu \n** Violación del Copyright\n** Información personal o comentariu inapropiáu\n** Nome d'usuariu inapropiáu\n** Información potencialmente falsa",
        "revdelete-otherreason": "Motivu distintu/adicional:",
        "revdelete-reasonotherlist": "Otru motivu",
        "revdelete-edit-reasonlist": "Editar motivos del desaniciu",
        "notextmatches": "Nun hai coincidencies nel testu de la páxina",
        "prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "nextn": "{{PLURAL:$1|siguiente|$1 siguientes}}",
+       "prev-page": "páxina anterior",
+       "next-page": "páxina siguiente",
        "prevn-title": "$1 {{PLURAL:$1|resultáu anterior|resultaos anteriores}}",
        "nextn-title": "{{PLURAL:$1|Siguiente resultáu|Siguientes $1 resultaos}}",
        "shown-title": "Amosar $1 {{PLURAL:$1|resultáu|resultaos}} por páxina",
        "right-sendemail": "Unviar corréu a otros usuarios",
        "right-passwordreset": "Ver los correos de reestablecimientu de conseña",
        "right-managechangetags": "Crear y desaniciar [[Special:Tags|etiquetes]] dende la base de datos",
+       "right-applychangetags": "Aplicar [[Special:Tags|etiquetes]] xunto colos cambios propios",
+       "right-changetags": "Amestar y desaniciar [[Special:Tags|etiquetes]] arbitraries en revisiones individuales y entraes del rexistru",
        "newuserlogpage": "Rexistru de creación d'usuarios",
        "newuserlogpagetext": "Esti ye un rexistru de creación d'usuarios.",
        "rightslog": "Rexistru de perfil d'usuariu",
        "action-editmyprivateinfo": "editar la so información privada",
        "action-editcontentmodel": "editar el modelu de conteníu d'una páxina",
        "action-managechangetags": "crear y desaniciar etiquetes dende la base de datos",
+       "action-applychangetags": "aplicar etiquetes xunto colos cambios",
+       "action-changetags": "amestar y desaniciar etiquetes arbitraries en revisiones individuales y entraes del rexistru",
        "nchanges": "{{PLURAL:$1|un cambiu|$1 cambios}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dende la última visita}}",
        "enhancedrc-history": "historial",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
-       "rclistfrom": "Amosar los nuevos cambios dende $3 $2",
+       "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Amosar",
        "rcshowhideminor-hide": "Anubrir",
        "ignorewarning": "Inorar l'avisu y grabar l'archivu de toes formes",
        "ignorewarnings": "Inorar tolos avisos",
        "minlength1": "Los nomes d'archivu han tener a lo menos una lletra.",
-       "illegalfilename": "El nome d'archivu \"$1\" contién carauteres non permitíos en títulos de páxina. Por favor renoma l'archivu y xúbilu otra vuelta.",
+       "illegalfilename": "El nome del ficheru \"$1\" contien caráuteres non permitíos en títulos de páxina. Por favor renoma l'archivu ya intenta xubilu otra vuelta.",
        "filename-toolong": "Los nomes de ficheru nun puen tener más de 240 bytes.",
        "badfilename": "Nome de la imaxe camudáu a \"$1\".",
        "filetype-mime-mismatch": "La estensión de ficheru \".$1\" nun casa cola triba MIME detectada del ficheru ($2).",
        "copyuploaddisabled": "Xubir por URL ta desactivao.",
        "uploaddisabledtext": "Les xubíes de ficheros tán desactivaes.",
        "php-uploaddisabledtext": "Les xubíes de ficheros tan desactivaes en PHP.\nPor favor, comprueba la configuración de file_uploads.",
-       "uploadscripted": "Esti ficheru contién códigu HTML o scripts que se puen interpretar equivocadamente por un navegador.",
-       "uploadscriptednamespace": "Esti ficheru SVG contién l'espaciu de nomes illegal «$1»",
+       "uploadscripted": "Esti ficheru contien códigu HTML o scripts que pueden interpretase de mou equivocáu por un navegador.",
+       "uploadscriptednamespace": "Esti ficheru SVG contien l'espaciu de nomes illegal «$1»",
        "uploadinvalidxml": "Nun pudo interpretase'l XML del ficheru cargáu.",
        "uploadvirus": "¡El ficheru tien un virus!\nDetalles: $1",
-       "uploadjava": "El ficheru ye un archivu ZIP que contién un ficheru .class de Java.\nXubir ficheros Java nun ta permitío, porque puen facer que se salten les torgues de seguridá.",
+       "uploadjava": "El ficheru ye un archivu ZIP que contien un ficheru .class de Java.\nXubir ficheros Java nun ta permitío, porque puede facer que se salten les torgues de seguridá.",
        "upload-source": "Ficheru orixe",
        "sourcefilename": "Nome d'orixe:",
        "sourceurl": "URL d'orixe:",
        "listfiles-delete": "desaniciar",
        "listfiles-summary": "Esta páxina especial amuesa tolos ficheros xubíos.",
        "listfiles_search_for": "Buscar por nome d'archivu multimedia:",
-       "imgfile": "archivu",
+       "listfiles-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
+       "imgfile": "ficheru",
        "listfiles": "Llista d'imáxenes",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "pageswithprop-prophidden-long": "valor de propiedá de testu llargu tapecíu ($1)",
        "pageswithprop-prophidden-binary": "valor de propiedá binaria tapecíu ($1)",
        "doubleredirects": "Redireiciones dobles",
-       "doubleredirectstext": "Esta páxina llista páxines que redireicionen a otres páxines de redireición.\nCada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu \"real\", onde tendría d'empobinar la primer redireición.\nLes entraes <del>tachaes</del> tan resueltes.",
+       "doubleredirectstext": "Esta páxina llista páxines que redireicionen a otres páxines de redireición.\nCada filera contien enllaces a la primera y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu \"real\", onde tendría d'empobinar la primera redireición.\nLes entraes <del>tachaes</del> tan resueltes.",
        "double-redirect-fixed-move": "[[$1]] treslladóse.\nAnovóse automáticamente y agora redirixe haza [[$2]].",
        "double-redirect-fixed-maintenance": "Iguando automáticamente la doble redireición de [[$1]] a [[$2]] nuna xera de mantenimientu.",
        "double-redirect-fixer": "Iguador de redireiciones",
        "logempty": "Nun hai coincidencies nel rexistru.",
        "log-title-wildcard": "Buscar títulos qu'emprimen con esti testu",
        "showhideselectedlogentries": "Amosar/anubrir les entraes del rexistru seleicionaes",
+       "log-edit-tags": "Editar les etiquetes de les entraes del rexistru seleicionaes",
        "allpages": "Toles páxines",
        "nextpage": "Páxina siguiente ($1)",
        "prevpage": "Páxina anterior ($1)",
        "trackingcategories-msg": "Categoría de siguimientu",
        "trackingcategories-name": "Nome del mensaxe",
        "trackingcategories-desc": "Criterios d'inclusión de categoría",
-       "noindex-category-desc": "La páxina contién una pallabra máxica <code><nowiki>__NOINDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots nun la indexarán.",
-       "index-category-desc": "La páxina contién una pallabra máxica <code><nowiki>__INDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robots la indexarán anque normalmente nun lo faigan.",
+       "noindex-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__NOINDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós nun la indexarán.",
+       "index-category-desc": "La páxina contien una pallabra máxica <code><nowiki>__INDEX__</nowiki></code> (y ta nun espaciu de nomes nel que se permite esta marca) y, poro, los robós la indexarán anque normalmente nun lo faigan.",
        "post-expand-template-inclusion-category-desc": "El tamañu de la páxina ye mayor que <code>$wgMaxArticleSize</code> después de espander toles plantíes, de mou qu'algunes plantíes nun s'espandieron.",
        "post-expand-template-argument-category-desc": "La páxina ye mayor que <code>$wgMaxArticleSize</code> después d'espander l'argumentu d'una plantía (daqué ente llaves triples, como <code>{{{Daqué}}}</code>).",
        "expensive-parserfunction-category-desc": "La páxina usa demasiaes funciones analítiques costoses (como <code>#ifexist</code>). Llei [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "emailccsubject": "Copia del to mensaxe a $1: $2",
        "emailsent": "Corréu unviáu",
        "emailsenttext": "Unviose'l to mensaxe de corréu.",
-       "emailuserfooter": "Esti corréu electrónicu unviolu $1 a $2 per aciu de la función \"Manda-y un corréu a un usuariu\" de {{SITENAME}}.",
+       "emailuserfooter": "Esti corréu electrónicu unviólu $1 a $2 per aciu de la función «{{int:emailpage}}» de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
        "watchlist": "Llista de siguimientu",
        "deletecomment": "Motivu:",
        "deleteotherreason": "Motivu distintu/adicional:",
        "deletereasonotherlist": "Otru motivu",
-       "deletereason-dropdown": "*Motivos comúnes d'esborráu\n** Puxarra\n** Vandalismu\n** Violación de drechos d'autor\n** A pidimientu del autor\n** Redireición frañada",
+       "deletereason-dropdown": "*Motivos comunes d'esborráu\n** Puxarra\n** Vandalismu\n** Violación de drechos d'autor\n** A pidimientu del autor\n** Redireición frañada",
        "delete-edit-reasonlist": "Editar los motivos d'esborráu",
        "delete-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nRestrinxóse l'esborráu d'estes páxines pa evitar perturbaciones accidentales de {{SITENAME}}.",
        "delete-warning-toobig": "Esta páxina tien un historial d'ediciones grande, más de $1 {{PLURAL:$1|revisión|revisiones}}.\nEsborralu pue perturbar les operaciones de la base de datos de {{SITENAME}};\nobra con precaución.",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "pagemovedsub": "Treslláu correctu",
-       "movepage-moved": "'''\"$1\" treslladóse a \"$2\"'''",
+       "movepage-moved": "<strong>«$1» treslladóse a «$2»</strong>",
        "movepage-moved-redirect": "Creóse una redireición.",
        "movepage-moved-noredirect": "Desaniciose la creación d'una redireición.",
        "articleexists": "Yá hai una páxina con esi nome, o'l nome qu'escoyisti nun ye válidu. Por favor, escueyi otru nome.",
        "import-interwiki-history": "Copiar toles versiones d'historial d'esta páxina",
        "import-interwiki-templates": "Incluyir toles plantíes",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Espaciu de nomes de destín:",
-       "import-interwiki-rootpage": "Páxina raíz de destín (opcional):",
        "import-upload-filename": "Nome del ficheru:",
        "import-comment": "Comentariu:",
        "importtext": "Por favor, esporta'l ficheru dende la wiki d'orixe usando la [[Special:Export|ferramienta d'esportación]].\nGuárdalu nel ordenador y xúbilu equí.",
        "import-rootpage-nosubpage": "L'espaciu de nomes \"$1\" de la páxina raíz nun permite subpáxines.",
        "importlogpage": "Rexistru d'importaciones",
        "importlogpagetext": "Importaciones alministrativas de páxines con historial d'ediciones d'otres wikis.",
-       "import-logentry-upload": "importada [[$1]] per aciu d'una xuba d'archivu",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importaes}}",
-       "import-logentry-interwiki": "treswikificada $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisión importada|revisiones importaes}} dende $2",
        "javascripttest": "Prueba de JavaScript",
        "javascripttest-pagetext-noframework": "Esta páxina ta acutada pa executar pruebes de javascript.",
        "spamprotectiontext": "La páxina que queríes guardar foi bloquiada pol filtru de spam.\nProbablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.",
        "spamprotectionmatch": "El testu siguiente foi'l qu'activó'l nuesu filtru de spam: $1",
        "spambot_username": "Llimpieza de spam de MediaWiki",
-       "spam_reverting": "Revirtiendo a la cabera versión que nun contién enllaces a $1",
+       "spam_reverting": "Revirtiendo a la cabera versión que nun contien enllaces a $1",
        "spam_blanking": "Toles revisiones teníen enllaces a $1; dexando en blanco",
        "spam_deleting": "Toles revisiones teníen enllaces a $1, desaniciando",
        "simpleantispam-label": "Comprobación anti-spam.\n¡'''NUN''' rellenes esto!",
        "pageinfo-protect-cascading-yes": "Sí",
        "pageinfo-protect-cascading-from": "Les proteiciones s'activen en serie dende",
        "pageinfo-category-info": "Información de la categoría",
+       "pageinfo-category-total": "Númberu total de miembros",
        "pageinfo-category-pages": "Númberu de páxines",
        "pageinfo-category-subcats": "Númberu de subcategoríes",
        "pageinfo-category-files": "Númberu de ficheros",
        "patrol-log-page": "Rexistru de supervisión",
        "patrol-log-header": "Esti ye un rexistru de les revisiones supervisaes.",
        "log-show-hide-patrol": "$1 rexistru de supervisión",
+       "log-show-hide-tag": "$1 rexistru d'etiquetes",
        "deletedrevision": "Esborrada la reversión vieya $1",
        "filedeleteerror-short": "Error al esborrar l'archivu: $1",
        "filedeleteerror-long": "Atopáronse errores al esborrar l'archivu:\n\n$1",
        "exif-primarychromaticities": "Cromacidá de los primarios",
        "exif-ycbcrcoefficients": "Coeficientes de la matriz de tresformación del espaciu de color",
        "exif-referenceblackwhite": "Pareya de valores blancu y negru de referencia",
-       "exif-datetime": "Fecha y hora de modificación del archivu",
+       "exif-datetime": "Data y hora de cambiu del ficheru",
        "exif-imagedescription": "Títulu de la imaxe",
        "exif-make": "Fabricante de la cámara",
        "exif-model": "Modelu de cámara",
        "exif-software": "Software usáu",
        "exif-artist": "Autor",
        "exif-copyright": "Titular del Copyright",
-       "exif-exifversion": "Versión Exif",
+       "exif-exifversion": "Versión d'Exif",
        "exif-flashpixversion": "Versión almitida de Flashpix",
        "exif-colorspace": "Espaciu de color",
        "exif-componentsconfiguration": "Significáu de cada componente",
        "exif-pixelxdimension": "Altor d'imaxe",
        "exif-usercomment": "Comentarios del usuariu",
        "exif-relatedsoundfile": "Archivu d'audiu rellacionáu",
-       "exif-datetimeoriginal": "Fecha y hora de la xeneración de datos",
-       "exif-datetimedigitized": "Fecha y hora de la dixitalización",
+       "exif-datetimeoriginal": "Data y hora de xeneración de los datos",
+       "exif-datetimedigitized": "Data y hora de dixitalización",
        "exif-subsectime": "Fecha y hora (precisión infrasegundu)",
        "exif-subsectimeoriginal": "Fecha y hora del orixinal (precisión infrasegundu)",
        "exif-subsectimedigitized": "Fecha y hora de la dixitalización (precisión infrasegundu)",
        "tags-delete-submit": "Desaniciar esta etiqueta de mou irreversible",
        "tags-delete-not-allowed": "Les etiquetes definíes por una estensión nun puen desaniciase mentanto la estensión nun lo permita específicamente.",
        "tags-delete-not-found": "La etiqueta «$1» nun esiste.",
+       "tags-delete-too-many-uses": "La etiqueta «$1» aplícase a más {{PLURAL:$2|d'una revisión|de $2 revisiones}}, lo que quier dicir que nun pue desaniciase.",
+       "tags-delete-warnings-after-delete": "La etiqueta «$1» desanicióse correutamente, pero {{PLURAL:$2|alcontróse'l siguiente avisu|alcontráronse los siguientes avisos}}:",
+       "tags-activate-title": "Activar etiqueta",
+       "tags-activate-question": "Tas a piques d'activar la etiqueta «$1».",
        "tags-activate-reason": "Motivu:",
+       "tags-activate-not-allowed": "Nun ye posible activar la etiqueta «$1».",
+       "tags-activate-not-found": "La etiqueta «$1» nun esiste.",
        "tags-activate-submit": "Activar",
        "tags-deactivate-title": "Desactivar etiqueta",
+       "tags-deactivate-question": "Tas a piques de desactivar la etiqueta «$1».",
        "tags-deactivate-reason": "Motivu:",
+       "tags-deactivate-not-allowed": "Nun ye posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
+       "tags-apply-no-permission": "Nun tienes permisu p'aplicar etiquetes de cambios xunto colos cambios.",
+       "tags-apply-not-allowed-one": "Nun se permite aplicar manualmente la etiqueta «$1».",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} aplicase manualmente: $1",
+       "tags-update-no-permission": "Nun tienes permisu p'amestar o desaniciar etiquetes de cambiu nes revisiones individuales o entraes del rexistru.",
+       "tags-update-add-not-allowed-one": "Nun se permite amestar manualmente la etiqueta «$1».",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} amestase manualmente: $1",
+       "tags-update-remove-not-allowed-one": "Nun se permite desaniciar la etiqueta «$1».",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} desaniciase manualmente: $1",
+       "tags-edit-title": "Editar etiquetes",
+       "tags-edit-manage-link": "Xestionar etiquetes",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisión seleicionada|Revisiones seleicionaes}} de [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Socesu del rexistru seleicionáu|Socesos del rexistru seleicionaos}}:",
+       "tags-edit-revision-legend": "Amestar o desaniciar etiquetes {{PLURAL:$1|d'esta revisión|de toles $1 revisiones}}",
+       "tags-edit-logentry-legend": "Amestar o desaniciar etiquetes {{PLURAL:$1|d'esta entrada del rexistru|de les $1 entraes del rexistru}}",
+       "tags-edit-existing-tags": "Etiquetes esistentes:",
+       "tags-edit-existing-tags-none": "''Nenguna''",
+       "tags-edit-new-tags": "Etiquetes nueves:",
+       "tags-edit-add": "Amestar estes etiquetes:",
+       "tags-edit-remove": "Desaniciar estes etiquetes:",
+       "tags-edit-remove-all-tags": "(desaniciar toles etiquetes)",
+       "tags-edit-chosen-placeholder": "Seleiciona delles etiquetes",
+       "tags-edit-chosen-no-results": "Nun s'alcontraron etiquetes que concuayen",
+       "tags-edit-reason": "Motivu:",
+       "tags-edit-revision-submit": "Aplicar los cambios a {{PLURAL:$1|esta revisión|$1 revisiones}}",
+       "tags-edit-logentry-submit": "Aplicar los cambios a {{PLURAL:$1|esta entrada del rexistru|$1 entraes del rexistru}}",
+       "tags-edit-success": "Los cambios aplicáronse correutamente.",
+       "tags-edit-failure": "Nun pudieron aplicase los cambios:\n$1",
+       "tags-edit-nooldid-title": "Revisión de destín inválida",
+       "tags-edit-nooldid-text": "O nun conseñasti una revisión sobre la qu'aplicar esta función, o la revisión conseñada nun esiste.",
+       "tags-edit-none-selected": "Seleiciona polo menos una etiqueta p'amestar o desaniciar.",
        "comparepages": "Comparar páxines",
        "compare-page1": "Páxina 1",
        "compare-page2": "Páxina 2",
        "revdelete-unrestricted": "eliminaes les restricciones a los alministradores",
        "logentry-block-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} con un tiempu de duración de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloquió a}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuracion del bloquéu a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuracion del bloquéu a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 xubiendo un ficheru",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importó}} $3 dende otra wiki",
+       "logentry-merge-merge": "$1 {{GENDER:$2|fusionó}} «$3» con «$4» (revisiones fasta la $5)",
        "logentry-move-move": "$1 {{GENDER:$2|treslladó}} la páxina \"$3\" a \"$4\"",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|treslladó}} la páxina \"$3\" a \"$4\" ensin dexar una redireición",
        "logentry-move-move_redir": "$1 {{GENDER:$2|treslladó}} la páxina \"$3\" a \"$4\" sobre una redireición",
        "logentry-upload-upload": "$1 {{GENDER:$2|xubió}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|xubió}} una versión nueva de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|xubió}} $3",
+       "log-name-managetags": "Rexistru de xestión d'etiquetes",
+       "log-description-managetags": "Esta páxina tien la llista de les xeres de xestión rellacionaes coles [[Special:Tags|etiquetes]]. El rexistru contien namái les aiciones feches manuamente por un alministrador; les etiquetes pueden crease o desaniciase pol software wiki ensin que quede grabada una entrada nesti rexistru.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|creó}} la etiqueta «$4»",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|desanició}} la etiqueta «$4» (quitada de $5 {{PLURAL:$5|revisión o entrada del rexistru|revisiones o entraes del rexistru}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|activó}} la etiqueta «$4» pa que la usen los usuarios y bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|desactivó}} la etiqueta «$4» pa torgar que la usen los usuarios y bots",
+       "log-name-tag": "Rexistru d'etiquetes",
+       "log-description-tag": "Esta páxina amuesa cuándo los usuarios amestaron o desaniciaron [[Special:Tags|etiquetes]] de revisiones individuales o entraes del rexistru. El rexistru nun recueye les aiciones d'etiquetáu cuando asoceden como parte d'una edición, desaniciu o aición asemeyada.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|amestó}} {{PLURAL:$7|la etiqueta|les etiquetes}} $6 a la revisión $4 de la páxina $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|amestó}} {{PLURAL:$7|la etiqueta|les etiquetes}} $6 a la entrada del rexistru $5 de la páxina $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|desanició}} {{PLURAL:$9|la etiqueta|les etiquetes}} $8 de la revisión $4 de la páxina $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|desanició}} {{PLURAL:$9|la etiqueta|les etiquetes}} $8 de la entrada del rexistru $5 de la páxina $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|anovó}} etiquetes na revisión $4 de la páxina $3 ({{PLURAL:$7|amestó}} $6; {{PLURAL:$9|desanició}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|anovó}} etiquetes na entrada del rexistru $5 de la páxina $3 ({{PLURAL:$7|amestó}} $6; {{PLURAL:$9|desanició}} $8)",
        "rightsnone": "(nengún)",
        "revdelete-summary": "editar resume",
        "feedback-adding": "Amestando el comentariu a la páxina...",
+       "feedback-back": "Anterior",
        "feedback-bugcheck": "¡Perfeuto! Comprueba que nun tea yá ente los [$1 fallos conocíos].",
        "feedback-bugnew": "Yá lo comprobé. Informar d'esti fallu nuevu",
        "feedback-bugornote": "Si tas preparáu pa describir un problema técnicu en detalle, [$1 informa del fallu].\nD'otra miente, pues usar el formulariu cenciellu d'abaxo. El to comentariu apaecerá na páxina \"[$3 $2]\" xunto col to nome d'usuariu y el restolador qu'uses.",
        "feedback-cancel": "Encaboxar",
        "feedback-close": "Fecho",
+       "feedback-external-bug-report-button": "Rexistrar una xera técnica",
+       "feedback-dialog-title": "Unviar opinión",
+       "feedback-dialog-intro": "Puedes usar el formulariu fácil de más abaxo pa unviar comentarios. Estos amestaránse a la páxina «$1», xunto col to nome d'usuariu.",
+       "feedback-error-title": "Error",
        "feedback-error1": "Fallu: Resultáu de la API non reconocíu",
        "feedback-error2": "Fallu: Falló la edición",
        "feedback-error3": "Fallu: Ensin respuesta de la API",
+       "feedback-error4": "Error: Nun pudo espublizase nel títulu de comentarios dau",
        "feedback-message": "Mensaxe:",
        "feedback-subject": "Asuntu:",
        "feedback-submit": "Unviar",
+       "feedback-terms": "Entiendo que la información del mio axente d'usuariu incluye información sobro la versión exauta del mio restolador y sistema operativu, y que se compartirá públicamente xunto colos comentarios.",
+       "feedback-termsofuse": "Acepto dar la mio opinión acordies colos Términos d'usu.",
        "feedback-thanks": "¡Gracies! La to opinión s'espublizó na páxina «[$2  $1]».",
+       "feedback-thanks-title": "¡Gracies!",
+       "feedback-useragent": "Axente d'usuariu:",
        "searchsuggest-search": "Buscar",
-       "searchsuggest-containing": "que contién...",
+       "searchsuggest-containing": "que contien...",
        "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "api-error-badtoken": "Fallu internu: token incorreutu.",
        "api-error-copyuploaddisabled": "Xubir d'una URL ta desactivao nesti sirvidor.",
        "api-error-stashfailed": "Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.",
        "api-error-publishfailed": "Fallu internu: el sirvidor nun pudo espublizar el ficheru temporal.",
        "api-error-stasherror": "Hebo un error al xubir el ficheru al almacén.",
+       "api-error-stashedfilenotfound": "Nun s'alcontró'l ficheru na reserva al intentar cargalu dende allí.",
+       "api-error-stashpathinvalid": "El camín onde tenía qu'alcontrase'l ficheru de la reserva ye inválidu.",
+       "api-error-stashfilestorage": "Hebo un error al atroxar el ficheru nel depósitu.",
+       "api-error-stashzerolength": "El sirvidor nun pudo atroxar el ficheru nel depósitu porque tien tamañu cero.",
+       "api-error-stashnotloggedin": "Tienes d'aniciar sesión p'atroxar ficheros nel depósitu de carga.",
+       "api-error-stashwrongowner": "El ficheru al qu'intentabes acceder nel depósitu nun te pertenez.",
+       "api-error-stashnosuchfilekey": "La clave de ficheru a la qu'intentabes acceder nel depósitu nun esiste.",
        "api-error-timeout": "El sirvidor nun respondió nel tiempu esperáu.",
        "api-error-unclassified": "Hebo un fallu desconocíu",
        "api-error-unknown-code": "Fallu desconocíu: «$1»",
        "expand_templates_generate_xml": "Amosar l'árbole d'análisis sintáuticu XML",
        "expand_templates_generate_rawhtml": "Ver el HTML en bruto",
        "expand_templates_preview": "Vista previa",
+       "expand_templates_preview_fail_html": "<em>Como {{SITENAME}} tien activáu el códigu HTML puru y hebo una perda de datos de la sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.</em>\n\n<strong>Si esti ye un intentu llexítimu d'accesu a la vista previa, vuelvi a intentalo.</strong>\nSi inda nun funciona, intenta [[Special:UserLogout|salir]] y volver a entrar na to cuenta.",
+       "expand_templates_preview_fail_html_anon": "<em>Como {{SITENAME}} tien activáu el códigu HTML puru y nun aniciasti sesión, la vista previa ta tapecida como precaución escontra ataques de JavaScript.</em>\n\n<strong>Si esti ye un intentu llexítimu d'accesu a la vista previa, intenta [[Special:UserLogin|entrar]] y vuelvi a intentalo.</strong>",
        "pagelanguage": "Selector de llingua de la páxina",
        "pagelang-name": "Páxina",
        "pagelang-language": "Llingua",
        "log-name-pagelang": "Rexistru de cambios de llingua",
        "log-description-pagelang": "Esti ye un rexistru de los cambios de llingua de les páxines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambió}} la llingua de la páxina $3 del $4 al $5.",
-       "default-skin-not-found": "¡Vaya! L'aspeutu predetermináu pa la to wiki, definíu en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code> nun ta disponible.\n\nLa instalación paez qu'incluye los siguientes aspeutos. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activalos y escoyer el predetermináu.\n\n$2\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o direutamente'l códigu fonte usando algún otru métodu. Esto ye d'esperar. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org's], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Descargando paquetes tar d'aspeutu individuales de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code dir=\"ltr\">skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki.\n\n; Si acabes d'anovar MediaWiki:\n: MediaWiki 1.24 y más nuevu yá nun activa automáticamente los aspeutos instalaos (llei [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Pues apegar les llinies siguientes en <code>LocalSettings.php</code> p'activar tolos aspeutos instalaos actualmente:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabes d'editar <code>LocalSettings.php</code>:\n: Vuelvi a comprobar los nomes de los aspeutos por si hai errores d'escritura.",
+       "default-skin-not-found": "¡Vaya! L'aspeutu predetermináu pa la to wiki, definíu en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code> nun ta disponible.\n\nLa instalación paez qu'incluye {{PLURAL:$4|el siguiente aspeutu|los siguientes aspeutos}}. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo {{PLURAL:$4|activalu|activalos y escoyer el predetermináu}}.\n\n$2\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o direutamente'l códigu fonte usando algún otru métodu. Esto ye d'esperar. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org's], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Descargando paquetes tar d'aspeutu individuales de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code dir=\"ltr\">skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki.\n\n; Si acabes d'anovar MediaWiki:\n: MediaWiki 1.24 y más nuevu yá nun activa automáticamente los aspeutos instalaos (llei [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Pues apegar {{PLURAL:$5|la llinia siguiente|les llinies siguientes}} en <code>LocalSettings.php</code> p'activar {{PLURAL:$5|l'aspeutu instaláu|tolos aspeutos instalaos}} actualmente:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si acabes d'editar <code>LocalSettings.php</code>:\n: Vuelvi a comprobar los nomes de los aspeutos por si hai errores d'escritura.",
        "default-skin-not-found-no-skins": "L'aspeutu predetermináu pa la to wiki, definíu en <code>$wgDefaultSkin</code> como <code>$1</code> nun ta disponible.\n\nNun tienes aspeutos instalaos.\n\n; Si acabes d'instalar MediaWiki:\n: Probablemente instalasti dende git, o'l códigu fonte direutamente usando algún otru métodu. Esto ye d'esperar. MediaWiki 1.24 y más nuevu nun incluye nengún aspeutu nel repositoriu principal. Intenta instalar dellos aspeutos dende'l [https://www.mediawiki.org/wiki/Category:All_skins direutoriu d'aspeutos de mediawiki.org], asina:\n:* Descargando [https://www.mediawiki.org/wiki/Download l'instalador tarball], que vien con dellos aspeutos y estensiones. Pues copiar y apegar el direutoriu <code>skins/</code> d'ehí.\n:* Descargando paquetes tar d'aspeutu individuales de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando unu de los direutorios <code>mediawiki/skins/*</code> via git nel direutoriu <code dir=\"ltr\">skins/</code> de la to instalación de MediaWiki.\n: Facer esto nun tendría d'interferir col to repositoriu git si yes un desendolcador de MediaWiki. Llei [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pa más información sobro cómo activar los aspeutos y escoyer el predetermináu.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activáu)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desactiváu''')",
        "json-error-recursion": "Una o más referencies recursives nel valor a codificar",
        "json-error-inf-or-nan": "Unu o más valores NAN (númberu nun conseñáu) o INF (infinitu) nel valor a codificar",
        "json-error-unsupported-type": "Diose un valor d'un tipu que nun pue codificase",
-       "headline-anchor-title": "Enllaz a esta sección"
+       "headline-anchor-title": "Enllaz a esta sección",
+       "special-characters-group-latin": "Llatín",
+       "special-characters-group-latinextended": "Llatín estendíu",
+       "special-characters-group-ipa": "AFI",
+       "special-characters-group-symbols": "Símbolos",
+       "special-characters-group-greek": "Griegu",
+       "special-characters-group-cyrillic": "Cirílicu",
+       "special-characters-group-arabic": "Árabe",
+       "special-characters-group-arabicextended": "Árabe estendíu",
+       "special-characters-group-persian": "Persa",
+       "special-characters-group-hebrew": "Hebréu",
+       "special-characters-group-bangla": "Bengalín",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Cingalés",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tailandés",
+       "special-characters-group-lao": "Laosianu",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "guión curtiu",
+       "special-characters-title-emdash": "guión llargu",
+       "special-characters-title-minus": "signu menos"
 }
index 218fa2e..e6e4c07 100644 (file)
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
+       "internalerror-fatal-exception": "प्रकार की गंभीर अपवाद \"$1\"",
        "filecopyerror": "\"$1\" फ़ाइल कय \"$2\" पे प्रतिलिपि नाई बनी पाए।",
        "filerenameerror": "\"$1\" फ़ाइल कय नावँ बदली कय \"$2\" नाई राखी गय।",
        "filedeleteerror": "\"$1\" फ़ाइल कय नाइ मेटाई  गय।",
        "wrongpassword": "आप जवन कूटशब्द लिखा गा है उ गलत है। कृपया फिरसे प्रयास करा जाय।",
        "wrongpasswordempty": "गुप्त कुंजी खाली है।\nफिरसे लिखो।",
        "passwordtooshort": "आप कय गुप्त कुंजी  कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरन्}} कय होएक चाहि।",
+       "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से ढेर लम्मा नाइ होइ सकत है।",
        "password-name-match": "आप कय गुप्त कुंजी आप कय सदस्यनावँ से फरक होएक चाहि।",
        "password-login-forbidden": "इ सदस्यनाँव अउर गुप्त कुंजी कय उपयोग नाई कै सका जात अहै।",
        "mailmypassword": "गुप्त कुंजी पुनःस्थापित करा जाय",
        "missingcommentheader": "'''ध्यान दिहा जाय:''' आप इ टिप्पणी कय कवनो शिर्षक नाइ दिहा गा है।\nअगर आप दुबारा \"{{int:savearticle}}\" पे क्लिक करा जाई तव आप कय बदलाव बिना शिर्षक कय सहेज जाई।",
        "summary-preview": "सारांश कय झलक:",
        "subject-preview": "विषय/शीर्षक कय झलक:",
+       "previewerrortext": "आपके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "blockedtitle": "सदस्य अवरुद्ध है",
        "blockedtext": "'''आप कय सदस्यनाँव या आइ॰पी ठहर पे रोक लाग है ।'''\n\nरोक $1 लगायँ रहें।\nरोक कय कारण ''$2'' होय \n\n* रोक कय सुरुवात भय: $8\n* रोक खतम होइ: $6\n* रोक इकाई: $7\n\nइ रोक कय बारे में चर्चा करेक लिए आप $1 या कवनो दुसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कै सका जात है।\nअगर आप [[Special:Preferences|आपन पसंद]] में वैध ई-मेल पता देवा गा है तब्बै आप 'ई-मेल भेजय' वाला सुविधा कय इस्तेमाल कई सका जात है औ आप कय एकर इस्तेमाल करै कय कवनो रोक नाइ लगावा है।\nआप कय अभीन कय आइ॰पी ठहर $3 होय अव रोक क्रमांक #$5 होय।\nआपन कवनो भी प्रश्न में कृपया इ कुल जानकारी शामिल करा जाइ।",
        "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आप कय कवनो प्रश्न में कृपया ई कुल जानकारी शामिल होएक चाही।",
        "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 से कम दाइ होएक चाहि, इ समय प्रयोग $1 दाइ कै गा {{PLURAL:$1|है}}।",
        "expensive-parserfunction-category": "अईसन पन्ना जवन महङा पार्सर फ़ंक्शनन् कय ढेर प्रयोग करत हैं",
        "post-expand-template-inclusion-warning": "'''चेतावनी:''' साँचा जोडे कय सीमा पार होई चुका है।\nकवनो-कवनो साँचा नाई जुड़ी।",
        "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": "पन्ना में विस्तार गहराई पार कई गा है",
        "rev-showdeleted": "देखावा जाय",
        "revisiondelete": "अवतरण हटावा जाय/पुनर्स्थापित करा जाय",
        "revdelete-nooldid-title": "अमान्य लक्ष्य अवतरण",
-       "revdelete-nooldid-text": "à¤\87स à¤\95à¥\8dरिया को करने के लिये आपने लक्ष्य अवतरण नहीं दिये हैं, या फिर आपने दिया हुआ अवतरण अस्तित्व में नहीं हैं या फिर आप सद्य अवतरण को छुपाने का प्रयत्न कर रहे हैं।",
+       "revdelete-nooldid-text": "à¤\87स à¤\95ाम को करने के लिये आपने लक्ष्य अवतरण नहीं दिये हैं, या फिर आपने दिया हुआ अवतरण अस्तित्व में नहीं हैं या फिर आप सद्य अवतरण को छुपाने का प्रयत्न कर रहे हैं।",
        "revdelete-no-file": "निर्दिष्ट फ़ाइल मौजूद नाई है।",
        "revdelete-show-file-confirm": "का आप सही में फ़ाइल \"<nowiki>$1</nowiki>\" कय $2 कय $3 बजे बना, हटावल अवतरण कय देखय चाहा जात है?",
        "revdelete-show-file-submit": "हाँ",
        "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|कय}} चयनित अवतरण:",
        "revdelete-selected-file": "[[:$2]] {{PLURAL:$1|कय}} चयनित फ़ाइल अवतरण:",
        "logdelete-selected": "{{PLURAL:$1|चुनल}} लॉग इवेंट:",
+       "revdelete-text-text": "हटाए गए अवतरण पृष्ठ इतिहास में दर्शाए जाएँगे परन्तु उनकी सामग्री सार्वजनिक रूप से नहीं देखी जा सकेगी।",
+       "revdelete-text-file": "हटाए गए फ़ाइल अवतरण फ़ाइल इतिहास में दर्शाए जायेंगे परन्तु सामग्री सार्वजनिक रूप से नहीं देखी जा सकेगी।",
+       "logdelete-text": "हटाए गए प्रवेश घटनाओं अभी भी लॉग में दिखाई देंगे, लेकिन उनकी सामग्री के कुछ हिस्सों को सार्वजनिक करने के लिए दुर्गम हो जाएगा।",
+       "revdelete-text-others": "अन्य प्रशासकों अभी भी छिपा सामग्री का उपयोग करने के लिए और अतिरिक्त प्रतिबंध सेट कर रहे हैं, जब तक यह अ-नष्ट करने में सक्षम हो जाएगा।",
        "revdelete-confirm": "यकिन करावा जाय कि आप इ काम करय चाहा जात है, आप एकर परिणाम समझा जात है, औ आप इ [[{{MediaWiki:Policy-url}}|नीति]] कय अनुसार करा जात है।",
        "revdelete-suppress-text": "लुकुआवेक प्रयोग <strong>खाली</strong> इ परिस्थितन् में होएक चाहि:\n* संभावित अपमानजनक जानकारी\n* अनुपयुक्त निजी जानकारी\n*: <em>घर कय ठहर या दूरभाष, राष्ट्रीय पहिचान क्रमांक आदि।</em>",
        "revdelete-legend": "दृश्य प्रतिबंध निश्चित करा जाय",
        "mergehistory-empty": "कवनो भी अवतरण नाई मिलाई सका जात अहै।",
        "mergehistory-success": "[[:$1]] {{PLURAL:$3|कय}} $3 अवतरण [[:$2]] में एकट्ठा कई {{PLURAL:$3|गय}}।",
        "mergehistory-fail": "इतिहास एकट्ठा नाई कई सका जात है, कृपया पन्ना औ समय कय फिरसे जाँच करा जाय।",
+       "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पन्ना $1 मौजूद नाई है।",
        "mergehistory-no-destination": "लक्ष्य पन्ना $1 मौजूद नाई है।",
        "mergehistory-invalid-source": "स्रोत पन्ना कय शीर्षक वैध होब आवश्यक है।",
        "notextmatches": "कवनो भी पन्ना में ई सामान नाई मिला",
        "prevn": "पहिलका {{PLURAL:$1|$1}}",
        "nextn": "अगला {{PLURAL:$1|$1}}",
+       "prev-page": "पिछलका पन्ना",
+       "next-page": "अगला पन्ना",
        "prevn-title": "{{PLURAL:$1|पहिलका|}} $1 परिणाम",
        "nextn-title": "{{PLURAL:$1|अगला}} $1 परिणाम",
        "shown-title": "हर पन्ना पे $1 {{PLURAL:$1|परिणाम}} देखावा जाय",
        "searchrelated": "सम्बंधित",
        "searchall": "कुल",
        "showingresults": "नीचे क्रमांक '''$2''' से सुरु कै कय सबसे ढेर '''$1''' परिणाम {{PLURAL:$1|देखाइ गा है}}।",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> में से <strong>$1</strong> परिणाम|<strong>$3</strong> में से परिणाम <strong>$1 - $2</strong>}}",
        "search-nonefound": "आप कय खोज से मिलत जुलत कवनो परिणाम नाई मिला।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानन् में खोजा जाय:",
        "prefs-watchlist": "अवलोकन सुची",
        "prefs-editwatchlist": "ध्यानसूची संपादन करा जाय",
        "prefs-editwatchlist-label": "अपने धियान सुचीमा एन्ट्रि सम्पादन कीन जाय",
+       "prefs-editwatchlist-edit": "अपने धियानसूची कय टाइटिल देखा जाय अव हटावा जाय",
        "prefs-editwatchlist-raw": "कच्चा निगरानी सूची सम्पादन करा जाय",
        "prefs-editwatchlist-clear": "आपन ध्यानसूची साफ करा जाय",
        "prefs-watchlist-days": "ध्यानसूची में दिखावै कय दिन:",
        "prefs-emailconfirm-label": "ईमेल सुनीश्चित करा जाय:",
        "youremail": "ई-मेल:",
        "username": "{{GENDER:$1|सदस्यनाँव}}:",
-       "prefs-memberingroups": "निचे दिहा {{PLURAL:$1|समूह|समूहन्}} कय {{GENDER:$2|सदस्य}}:",
+       "prefs-memberingroups": "{{GENDER:$2|सदस्य}} {{PLURAL:$1|समूह}}:",
        "prefs-registration": "रजिष्ट्रेसन समय:",
        "yourrealname": "वास्तविक नाँव:",
        "yourlanguage": "भाषा",
        "right-deletedtext": "हटावल पाठ औ हटावल अवतरणन् कय बीचे अंतर देखा जाय",
        "right-browsearchive": "हटावल पन्ना खोजा जाय",
        "right-undelete": "ई पन्ना कय पुनर्स्थापित करा जाय।",
+       "right-suppressrevision": "किसी भी सदस्य से छुपे हुए अवतरण देखें, छुपायें और पुनर्स्थापित करें",
        "right-viewsuppressed": "कवनो भि सदस्य कय लुकुआवल अवतरण देखा जाय",
        "right-suppressionlog": "खासगी लॉग देखा जाय",
        "right-block": "अउर सदस्यन् कय सम्पादन करय से ब्लॉक करा जाय",
        "right-override-export-depth": "पन्ना निर्यात करा जाय, पाँच स्तर कय गहराई तक जुड़ल पन्ना लइकय",
        "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": "इतिहास",
        "recentchanges-label-plusminus": "पन्ना कय आकार इ बाइट संख्या से बदला",
        "recentchanges-legend-heading": "'''कुंजी:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नवा पन्नन् कय सूची]] कय भी देखा जाय)",
+       "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfrom": "$3 $2 से नँवा बदलाव देखावा जाय",
        "rcshowhideminor": "छोट बदलाव $1",
        "rcshowhideminor-show": "देखावा जाय",
        "largefileserver": "इ फ़ाइल कय आकार निर्धारित आकार सीमा कय पार है।",
        "emptyfile": "आप कय अपलोड करल फ़ाइल खाली है।इ फ़ाइल कय नाँव लिखय में गलती होएक कारण होइ सकत है। कृपया जाँचा जाय कि का आप इहय फ़ाइल अपलोड करय चाहा जात है।",
        "windows-nonascii-filename": "इ विकि विशेष कैरैक्टरन् कय वाले फ़ाइलनाँव नाइ स्वीकार करि।",
+       "fileexists": "इस नाम की फ़ाइल पहले से मौजूद है, यदि यह फ़ाइल बदलने में आप साशंक हैं तो कृपया <strong>[[:$1]]</strong> देखें। [[$1|thumb]]",
        "filepageexists": "इ फ़ाइल कय लिए विवरण पृष्ठ पहलवे <strong>[[:$1]]</strong> पे बनाइ गा है, लेकिन इ नाँव कय कवनो फ़ाइल अभीन उपस्थित नाइ है। \nआप जवन विवरण दिहा जाइ उ विवरण पन्ना पे नाइ देखाइ। \nआप कय आपन विवरण कय उहाँ डारए कय लिए ओकर हस्त्य सम्पादन करेक परि।\n[[$1|thumb]]",
        "fileexists-extension": "इ नाँव से मिलत-जुलत नाँव कय एकठु फ़ाइल पहलवे से है: [[$2|thumb]]\n* अपलोड होए वाला फ़ाइल कय नाँव: <strong>[[:$1]]</strong>\n* मौजूदा फ़ाइल कय नावँ: <strong>[[:$2]]</strong>\nशायद आप कवनो विशिष्ट नाँव कय प्रयोग करय चाहा जाइ?",
        "fileexists-thumbnail-yes": "इ फ़ाइल बड़ा चित्र कय छोटा आकार ''(अंगूठाकार)'' जैसन लागत है। [[$1|thumb]]\n<strong>[[:$1]]</strong> फ़ाइल कय देखा जाय।\nअगर जाँचल फ़ाइल इही आकार कय है तव छोट आकार कय फ़ाइल अपलोड करेक आवश्यकता नाइ है।",
        "nolicense": "कवनो नाइ चुना गय",
        "licenses-edit": "लाइसेंस विकल्प सम्पादन",
        "license-nopreview": "(झलक उपलब्ध नाइ है)",
+       "upload_source_url": "(आपकी चुनी फ़ाइल एक वैध, सार्वजनिक रूप से उपलब्ध यू॰आर॰एल से)",
        "upload_source_file": "(आप कय कम्प्युटरसे लिहल फाइल)",
        "listfiles-delete": "मिटावा जाय",
        "listfiles-summary": "इ विशेष पन्ना अपलोड करल कुल फ़ाइल देखावत है।",
        "listfiles_search_for": "मीडिया नाँव कय खर्तिन खोजा जाय:",
+       "listfiles-userdoesnotexist": "सदस्य \"$1\" पंजीकृत नाइ है।",
        "imgfile": "फ़ाइल",
        "listfiles": "फ़ाइल सूची",
        "listfiles_thumb": "अंगूठाकार",
        "unwatchedpages": "ध्यान ना दिहल पन्ना",
        "listredirects": "पुनर्निर्देशन कय सूची",
        "listduplicatedfiles": "डुप्लिकेट वाले फाइल",
+       "listduplicatedfiles-summary": "यह एैसे फ़ाइलों की सूची है जिनका नवीनतम संस्करण दूसरे फ़ाइलों के नवीनतम संस्करण की प्रतिलिपि हैं। सिर्फ़ स्थानीय फ़ाइलों को विचारा गया है।",
        "listduplicatedfiles-entry": "[[:फाइल:$1|$1]] कय लगे [[$3|{{PLURAL:$2|एक्ठु डुप्लिकेट|$2 डुप्लिकेट}}]].",
        "unusedtemplates": "अप्रयुक्त साँचा",
        "unusedtemplatestext": "इस पृष्ठ पर {{ns:template}} नामस्थान वाले वे सभी पृष्ठ इंगित है जो किसी अन्य पृष्ठ में शामिल नहीं हैं।\nइन्हें हटाने के पहले इन साँचों की और कड़ियाँ जाँच लें।",
        "doubleredirects": "दुईठु पुनर्निर्देश",
        "doubleredirectstext": "यह पृष्ठ उन पृष्ठों की सूची देता है जो अन्य पुनर्निर्देशित पृष्ठों की ओर पुनर्निर्देशित हैं।\nहर कतार में पहले और दूसरे पुनर्निर्देशन की कड़ियाँ, तथा दूसरे पुनर्निर्देशन का लक्ष्य भी है, आमतौर पर यही \"वास्तविक\" लक्ष्यित पृष्ठ होगा, और पहला पुनर्देशन वास्तव में इसी को लक्ष्यित होना चाहिए।\n<del>काटी गई</del> प्रविष्टियाँ सुलझा दी गई हैं।",
        "double-redirect-fixed-move": "[[$1]] कय घुस्काइ गय । इ अपने आप अपडेट होइ गवा है अव [[$2]] पे पुनर्निर्देशीत होइ ।",
+       "double-redirect-fixed-maintenance": "[[$1]] से [[$2]] को दुगुने पुनर्प्रेषण को रखरखाव कार्य में स्वतः ठीक कर रहा है।",
        "double-redirect-fixer": "पुनर्निर्देशन मिस्त्री",
        "brokenredirects": "टूटल पुनर्निर्देशन पन्ना",
        "brokenredirectstext": "ई कुल पुनर्निर्देश नामौजुद पन्नन मा लैजात हैं :",
        "ancientpages": "सबसे पुरान पन्ना",
        "move": "घुस्कावा जाय",
        "movethispage": "ई पन्ना कय नाँव बदला जाय",
+       "unusedimagestext": "निम्न फ़ाइलें मौजूद हैं, पर किसी भी पृष्ठ में प्रयुक्त नहीं हैं।\nकृपया ध्यान दें कि अन्य वेब साइट एक सीधी कड़ी से फ़ाइल से जुड़ी हो सकती हैं, और सक्रिय उपयोग में होने के बावजूद यहाँ दिखाई जा सकती है।",
        "unusedcategoriestext": "निचे दिहा श्रेणी पन्ना मौजूद है लेकिन कवनो भी पन्ना या अउर श्रेणि एकर प्रयोग नाँइ करत हैं।",
        "notargettitle": "लक्ष्य नाइ",
        "notargettext": "इ काम कय करेक लिये आप लक्ष्य पन्ना या सदस्य नाइ बतावा गा है।",
        "speciallogtitlelabel": "प्रयोजन (शीर्षक या सदस्यनाँव):",
        "log": "लॉग",
        "all-logs-page": "कुल सार्वजनिक लॉग",
+       "alllogstext": "{{SITENAME}} की सभी उपलब्ध लॉगों की प्रविष्टियों का मिला-जुला प्रदर्शन।\nआप और बारीकी के लिए लॉग का प्रकार, सदस्य नाम (लघु-दीर्घ-अक्षर संवेदी), या प्रभावित पृष्ठ (लघु-दीर्घ-अक्षर संवेदी) चुन सकते हैं।",
        "logempty": "लॉग में अइसन कवनो चिज नाइ है।",
        "log-title-wildcard": "इ पाठ से शुरू होय वाला शीर्षक खोजा जाय",
        "showhideselectedlogentries": "चुनल लाग प्रविष्टि देखावा जाय/लुकुआवा जाय",
        "watchlist-details": "बातचीत पन्ना कय अलावा {{PLURAL:$1|$1 पन्ना}} आप कय ध्यानसूची में है।",
        "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम है।",
        "wlheader-showupdated": "पन्ना जवन आपकय द्वारा देखय जाएक बाद बदलि गा है '''बोल्ड''' मे देखाइ।",
+       "wlnote": "$3 को $4 बजे तक पिछले <strong>$2</strong> {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
        "wlshowlast": "पिछला $1 घंटा $2 दिन  देखा जाय",
        "watchlist-options": "ध्यानसूची विकल्प",
        "watching": "ध्यान देत हँय...",
        "exbeforeblank": "खाली करय से पहिले पाठ रहा: '$1'",
        "delete-confirm": "\"$1\" मिटावा जाय",
        "delete-legend": "मेटावा जाय",
+       "historywarning": "<strong>चेतावनी:<strong> आप जो पृष्ठ हटाने जा रहे हैं उसके इतिहास में $1 {{PLURAL:$1|अवतरण}} हैं:",
        "confirmdeletetext": "आप एकठु पन्ना कय अव ओकरे कुल अवतरण सहित हटावे जावा जात है।\nजाँच लीन जाय कि आप इ करय चाहा जात है, आप एकरे परिणाम कय जाना जात है, औ आप इ [[{{MediaWiki:Policy-url}}|नीति]] कय अनुसार करा जात है।",
        "actioncomplete": "काम पुरा होइ गवा",
        "actionfailed": "काम असफल",
        "protect-othertime": "कवनो अउर समय:",
        "protect-othertime-op": "कवनो अउर समय",
        "protect-existing-expiry": "वर्तमान समय सीमा :$3, $2",
+       "protect-existing-expiry-infinity": "मौजुदा समाप्ति समय: अनंत",
        "protect-otherreason": "अउर/दुसर कारण:",
        "protect-otherreason-op": "दुसर कारण",
        "protect-dropdown": "*सुरक्षा कय आम कारण\n**ढेर बर्बरता \n**ढेर स्पैम\n**अफलदायी सम्पादन युद्ध\n**ढेर खोल जाय वाला पृष्ठ",
        "import-interwiki-history": "इस पृष्ठ के सभी इतिहास अवतरण कॉपी करें",
        "import-interwiki-templates": "कुल साँचा शामिल करा जाय",
        "import-interwiki-submit": "आयात",
-       "import-interwiki-namespace": "गंतव्य नामस्थान:",
-       "import-interwiki-rootpage": "गंतव्य पृष्ठ उपसर्ग (वैकल्पिक):",
        "import-upload-filename": "फ़ाइल कय नाँव",
        "import-comment": "टिप्पणी:",
        "importtext": "कृपया स्रोत विकि से संचिका निर्यातित करने के लिए [[Special:Export|निर्यात सुविधा]] का इस्तेमाल करें।\nइसे अपने संगणक पर सँजो के यहाँ चढ़ा दें।",
        "sunday-at": "अत्तवार कय $1",
        "yesterday-at": "कल्हीँया",
        "metadata": "मेटाडाटा",
+       "metadata-help": "इस फ़ाइल में बढ़ाई हुई जानकारी हैं, हो सकता है कि यह फ़ाइल बनाने में इस्तेमाल किये गए स्कैनर अथवा कैमेरा से यह प्राप्त हुई हैं। अगर यह फ़ाइल बदलदी गई है तो यह जानकारी नई फ़ाइल से मेल नहीं खाने की आशंका है।",
        "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",
        "revdelete-restricted": "प्रबंधक पे प्रतिबंध लागू",
        "revdelete-unrestricted": "प्रबंधक कय प्रबंधन हटावा जाय",
        "logentry-move-move": "$1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} कै गय",
+       "logentry-newusers-create": "सदस्य खाता $1 {{GENDER:$2|बनावा}} गय",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ने}} $3 अपलोड किया",
        "rightsnone": "(कउनो नाहीं)",
        "revdelete-summary": "संपादन सारांश",
        "feedback-adding": "पृष्ठ पे प्रतिक्रिया जोडत है ...",
index 40a7b4c..ccd793c 100644 (file)
        "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
        "actions": "چالیشمالار",
        "namespaces": "آد فضالاری",
-       "variants": "واریانتلار",
+       "variants": "دئییش‌لر",
        "navigation-heading": "دوْلانماق مِنوسو",
        "errorpagetitle": "خطا",
        "returnto": "$1-ه قاییت.",
        "tagline": "{{SITENAME}} سایتیندان",
-       "help": "یاردیم",
+       "help": "کؤمک",
        "search": "آختار",
        "searchbutton": "آختار",
        "go": "گئت",
        "history": "صفحه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
        "updatedmarker": "سوْن باخیشیمدان سوْنرا یئنی‌لنیب‌دیر",
-       "printableversion": "یازدیریرا بیلن نۆسخه",
-       "permalink": "قالان باغلانتی",
+       "printableversion": "یازدیریرا بیلن سۆروم",
+       "permalink": "قالیجی باغلانتی",
        "print": "یازدیر",
        "view": "باخ",
        "view-foreign": "$1 گور",
        "talkpage": "بۇ صحیفه‌نی دانیش",
        "talkpagelinktext": "دانیشیق",
        "specialpage": "اؤزل صفحه",
-       "personaltools": "شخصی آراجلار",
+       "personaltools": "شخصی آراجلار",
        "articlepage": "ایچری‌لی صحیفه‌یه باخ",
        "talk": "دانیشیق",
-       "views": "گؤرونوشلر",
-       "toolbox": "آراجلار",
+       "views": "گؤرونوشلر",
+       "toolbox": "آراجلار",
        "userpage": "ایستیفاده‌چی صحیفه‌‌سینه باخ",
        "projectpage": "پروژه صحیفه‌سینه باخ",
        "imagepage": "فایل صحیفه‌سینه باخ",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
        "redirectpagesub": "یوْل‌لاندیرما صحیفه‌سی",
        "redirectto": "مسیزپرین دَییشیب:",
-       "lastmodifiedat": "بۇ صحیفه‌‌ سوْن دفعه‌‌ $1، $2 چاغیندا دَییشیلمیشدیر.",
+       "lastmodifiedat": "بۇ صفحه‌‌ سوْن کز $1، $2 چاغیندا دَییشیلمیش‌دیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
        "protectedpage": "قوْرونموش صحیفه",
        "jumpto": "آتیل:",
        "jumptonavigation": "دوْلانماق",
        "jumptosearch": "آختار",
        "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یۆک آلتیندادیلار.\nچوْخلو ایستیفاده‌چیلر بۇ صحیفه‌نی گؤرمک ایسته‌ییرلر.\nلۆطفاً یئنی‌دن بۇ صحیفه‌یه ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
+       "generic-pool-error": "تاسوف لرله ایندیلیکده سئرور لر آرتیق یوکون آلتیندادیلار.\nچوخلو ایشلدن لر چالیشیرلار بو صفحه لری گورسون لر.\nلوطفا بو صفحه نین گورمگ چالیشماسیندان اونجه بیر آز دوزم ائدین.",
        "pool-timeout": "قیفیلا دؤزماغین واختی بیتیردی",
        "pool-queuefull": "مخزن صفی دوْلودور",
        "pool-errorunknown": "بیلینمه‌ین خطا",
        "pool-servererror": "پول سنتر سئرویسی الده دئییل ( $1 ).",
        "poolcounter-usage-error": "$1:ایشلتمک خطاسی",
-       "aboutsite": "{{SITENAME}} حاقیندا",
-       "aboutpage": "Project:حاقیندا",
+       "aboutsite": "{{SITENAME}} گؤره",
+       "aboutpage": "Project:گؤره",
        "copyright": "ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.",
        "copyrightpage": "{{ns:project}}:کوْپی حاقلاری",
-       "currentevents": "ایندیکی اولایلار",
-       "currentevents-url": "Project:ایندیکی اولایلار",
-       "disclaimers": "رد ائتمک",
-       "disclaimerpage": "Project:عمومی رد ائتمک",
+       "currentevents": "ایندیکی اولایلار",
+       "currentevents-url": "Project:ایندیکی اولایلار",
+       "disclaimers": "یالانلامالار",
+       "disclaimerpage": "Project:گنل یالانلاما",
        "edithelp": "ديَیشتیرمک یاردیمی",
+       "helppage-top-gethelp": "یاردیم",
        "mainpage": "آنا صفحه",
        "mainpage-description": "آنا صفحه",
        "policy-url": "Project:قایدالار",
        "versionrequired": "مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیمدیر",
        "versionrequiredtext": "بۇ صحیفه‌نی ایشلتمک اۆچون، مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیم‌دیر.\n[[Special:Version|نۆسخه صحیفه‌سینه]] باخ.",
        "ok": "اوْلسون",
-       "retrievedfrom": "«$1»-دن آلینمیشدیر",
+       "retrievedfrom": "«$1»-دن آلینمیشدیر",
        "youhavenewmessages": "سیزین $1 ($2) وارینیزدیر.",
        "youhavenewmessagesfromusers": "سیزین {{PLURAL:$3|بیر آیری ایستیفاده‌چی‌دن|$3 ایستیفاده‌چی‌دن}} $1 وارینیزدیر ($2).",
        "youhavenewmessagesmanyusers": "سیزین چوْخلو ایستیفاده‌چیلردن $1 وارینیزدیر ($2).",
        "hidetoc": "گیزلت",
        "collapsible-collapse": "ییغیشلات",
        "collapsible-expand": "گئنیشلت",
+       "confirmable-confirm": "{{GENDER:$1|سیز}} اطمینانیز وار می؟",
        "confirmable-yes": "هن",
        "confirmable-no": "یوْخ",
        "thisisdeleted": "$1-نا باخ یا اوْنو قایتار؟",
        "site-atom-feed": "$1 آتوم فید",
        "page-rss-feed": "«$1» آراِس‌اِس فید",
        "page-atom-feed": "«$1» آتوم فید",
-       "red-link-title": "$1 (صحیفه یوْخدور)",
+       "red-link-title": "$1 (صفحه یوْخ‌دور)",
        "sort-descending": "آزالان سیرالاماق",
        "sort-ascending": "چوْخالان سیرالاماق",
        "nstab-main": "صفحه",
        "nstab-user": "ایشلدن صفحه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
-       "nstab-special": "اؤزل صحیفه",
+       "nstab-special": "اؤزل صفحه",
        "nstab-project": "پروژه صحیفه‌سی",
        "nstab-image": "فایل",
        "nstab-mediawiki": "مئساژ",
        "readonly_lag": "ایکینجی درجه‌لی دیتابیس خیدمت‌چیلری، آنا دیتابیسه یئتیشماغا گؤره، بو دیتابیس اوتوماتیک باغلانیب‌دیر",
        "internalerror": "ایچ خطاسی",
        "internalerror_info": "ایچ خطاسی: $1",
+       "internalerror-fatal-exception": "استثنای مخرب \"$1\"نوعو",
        "filecopyerror": "«$1» فایلی، «$2»-ه کوپی اولانمادی.",
        "filerenameerror": "«$1» فایلین آدی «$2»-نا دَییشدیریلنمه‌دی.",
        "filedeleteerror": "«$1» فایلی سیلیننمه‌دی.",
        "virus-badscanner": "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
        "virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
        "virus-unknownscanner": "تانینمامیش آنتی‌ویروس:",
-       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nسÛ\8cز {{SITENAME}}-Û\8c ØªØ§Ù\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ Ø§Ù\88Ù\84اراÙ\82 Ø§Û\8cØ´Ù\84دÙ\87 Ø¨Û\8cÙ\84رسÛ\8cÙ\86Û\8cزØ\8c Û\8cÙ\88خسا Ù\87Ù\85Ù\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ø¯Û\8c Û\8cا Ø¨Ø§Ø´Ù\82ا Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø¢Ø¯Û\8c Ø§Û\8cÙ\84Ù\87 <span class='plainlinks'>[$1Û\8cئÙ\86Û\8câ\80\8cدÙ\86 Ú¯Û\8cرÛ\8cØ´]</span> Ø§Ø¦Ø¯Ù\87 Ø¨Û\8cÙ\84رسÛ\8cÙ\86Û\8cز.\nبÙ\88Ù\86ا Ø¯Û\8cÙ\82ت Ø§Ø¦Ø¯Û\8cÙ\86 Ú©Û\8c Ø¨Ø¹Ø¶Û\8c ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84رØ\8c کَش-ینیزی سیلمه‌میش کیمی، هله ده سیزین گیریش ائتدیگینیز کیمی گؤستریله‌جکلر.",
+       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nبÙ\88Ù\86ا Ø¯Û\8cÙ\82ت Ø§Ø¦Ø¯Û\8cÙ\86 Ú©Û\8c Ù\88ب Ø­Ø§Ù\81Û\8cظÙ\87 Ù\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87 Û\8cÙ\86Ø\8cبعضÛ\8c ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر کَش-ینیزی سیلمه‌میش کیمی، هله ده سیزین گیریش ائتدیگینیز کیمی گؤستریله‌جکلر.",
        "welcomeuser": "خوش گلمیسینیز، $1!",
        "welcomecreation-msg": "حسابینیز آچیلدی.\n[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.",
        "yourname": "ایستیفاده‌چی آدی:",
-       "userlogin-yourname": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c آدی",
+       "userlogin-yourname": "اÛ\8cØ´Ù\84دÙ\86 آدی",
        "userlogin-yourname-ph": "ایستیفاده‌چی آدینیزی دَییشدیرین",
        "createacct-another-username-ph": "ایستیفاده‌چی آدینیزی داخیل ائدین",
        "yourpassword": "رمز:",
        "wrongpassword": "یانلیش رمز وئریلدی.\nیئنی‌دن یازین.",
        "wrongpasswordempty": "بوش رمز وئردینیز.\nیئنی‌دن یازین.",
        "passwordtooshort": "رمز، آزی {{PLURAL:$1|بیر|$1}} کاراکتئر اولمالی‌دیر.",
+       "passwordtoolong": "رمز،سوزو چوخلوغو {{PLURAL:$1|۱ سوز|$1 سوز}} کاراکتئر اولمامالی‌دیر.",
        "password-name-match": "رمزینیز ایستیفاده‌چی آدینیزلا فرق‌لی اولمالی‌دیر.",
        "password-login-forbidden": "بو ایستیفاده‌چی آدی و رمزی ایشلدمک، قاداغان اولوب‌دور.",
        "mailmypassword": "یئنی رمزی ایمیل ایله گؤندر",
        "resetpass-submit-cancel": "لغو ائت",
        "resetpass-wrong-oldpass": "یانلیش گئچیجی یا ایندیکی رمز.\nاولا بیلر سیز باشاریلیق‌لا رمزینیزی دَییشمیسینیز یوخسا یئنی گئچرلی رمز ایسته‌میسینیز.",
        "resetpass-recycled": "لوطفا گیریش رمزینیزی ایندیکی اولمایان بیر ایری گیریش رمزینه دَییشین",
+       "resetpass-temp-emailed": "سیز بیر کدلانمیش موقت ایمیل له گیریش ائدیب سیز.\nگیریشینیزه سون وئرمک اوچون یئنی دن بیر گیریش رمزی وئرمه لی سیز:",
        "resetpass-temp-password": "گئچیجی رمز:",
        "resetpass-abort-generic": "رمز دَییشدیرمک، بیر اوزانتی ایله یاریدا کسیلیب‌دیر.",
+       "resetpass-expired": "گیریش رمزینیز بایات اولوب.لطفا گیریشینیز اوچون یئنی بیر گیریش رمزی سئچین.",
+       "resetpass-expired-soft": "گیریش رمزینیز بایات اولوب و یئنی دن تنظیم اولونمالی دیر. لوطفا ایندی بیر یئنی رمز سئچیب یا دا یئنی دن تنظیم ائتمک اوچون سونرالیقدا\"{{int:resetpass-submit-cancel}}\" دویمه سین باسین.",
+       "resetpass-validity-soft": "گیریش رمزینیز دوز دئیییل:$1\nلوطفا ایندی بیر یئنی گیریش رمزی سئچین یا دا\"{{int:resetpass-submit-cancel}}\" باسین کی سونرا اونو یئنی دن سئچرسیز.",
        "passwordreset": "رمزی یئنی‌له",
        "passwordreset-text-one": "رمزینیزی صیفیرلاماق اوچون بو فورمو باشا چاتدیرین.",
        "passwordreset-text-many": "{{PLURAL:$1|رمزینیزی صیفیرلاماق اوچون، بیرینی دولدورون.}}",
        "changeemail-none": "(هئچ)",
        "changeemail-password": "سیزین {{SITENAME}} رمزینیز:",
        "changeemail-submit": "ایمیلی دَییشدیر",
+       "changeemail-throttled": "سیز دفعه لرجه گیریش اوچون چالیشیب سیز.\nلوطفا یئنی دن چالیشمامیشدان اونجه $1 دوزوم ائدین.",
+       "resettokens": "نیشانلی لاری یئنیلمه",
+       "resettokens-no-tokens": "هئچ بیر نیشانلی یئنیلنمک اوچون یوخدور.",
+       "resettokens-legend": "نیشانلی لاری یئنیلمه",
+       "resettokens-tokens": "نیشانلی:",
+       "resettokens-token-label": "$1 (ایندیکی میقداری: $2)",
+       "resettokens-watchlist-token": "نیشانلامیش یئمک وپی [[Special:Watchlist|ایزلنمیش سون دییشیک اولان صفحه لر]](اتم/آراس‌اس)",
+       "resettokens-done": "رمز لری دَییشلندی.",
+       "resettokens-resetbutton": "سئچیلمیش دَییشلنن رمزلر.",
        "bold_sample": "قالین یازی",
        "bold_tip": "قالین یازی",
        "italic_sample": "اَیری یازی",
        "link_sample": "باغلانتی باشلیغی",
        "link_tip": "ایچری باغلانتی‌سی",
        "extlink_sample": "http://www.example.com باغلانتی باشلیغی",
-       "extlink_tip": "خارÛ\8cجÛ\8c باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)",
+       "extlink_tip": "ائشÛ\8cÚ© باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)",
        "headline_sample": "باشلیق متنی",
        "headline_tip": "۲ یوکسک باشلیق",
        "nowiki_sample": "فورمت‌لشدیریلمه‌میش یازی‌نی بورا داخیل ائدین",
        "subject": "قونو/باشلیق:",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "watchthis": "بو صفحه‌نی ایزله",
-       "savearticle": "صحیفه‌نی قئید ائت",
+       "savearticle": "صفحه‌نی ساخلا",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
+       "blankarticle": "<strong>دیققت:</strong>سیز بیر بوش صفحه نین یاراتماق حالیندا سیز .\nایر«{{int:savearticle}}» بیر ده باسایلا،بوش صفحه یاراناجاق.",
        "anoneditwarning": "<strong>دیقت:</strong> سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صفحه‌نین دییشیک تاریخچه‌سین‌ده یازیلب و گورسنجک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریلجک و آرتیق مزیت لرله.",
        "anonpreviewwarning": "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
        "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
+       "selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"{{int:savearticle}}\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
        "missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
        "missingcommentheader": "'''یادا سالما:''' سیز یورومونوز اوچون بیر قونو/باشلیق یازمامیسینیز.\n«{{int:savearticle}}»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونو/باشلیق-ی اولمایاراق قئید اولوناجاق‌دیر.",
        "summary-preview": "قیسا اؤن‌گؤستریش:",
        "subject-preview": "قونو/باشلیق اؤن‌گؤستریشی:",
+       "previewerrortext": "سیزین دَییشدیرمه‌لرینیزین اؤن‌گؤسترمه‌سینده بیر خطا قاباغا گلدی.",
        "blockedtitle": "ایستیفاده‌چی باغلانیب",
        "blockedtext": "' 'ایستیفاده‌چی آدی و یا آی پی عنوانینیز قاباغی باغلانیب دیر.'\n\nسیزی باغلایان$ 1. الیله اولوب دیر \nباغلاماق سببی:' $ 2.\n\n* باغلانمانین باشلانان زامانی: $ 8\n* باغلانمانین قورتولان زامانی: $ 6\n* باغلانما مدتی: $ 7\n\nگؤستریلن سببه گؤره ائنگئللئنمئنیزین اویغون اولمادیغینی دوشونورسونوزسه، $ 1 یا دا باشقا بیر [[{{MediaWiki:Grouppage-sysop}}|مدیر]]  ایله بو وضعیتی گؤروشه بیلرسینیز. [[Special:Preferences|ترجیح لرینیز]] قیسمینده اعتبارلی بیر ائ-پوچت اونوانی گیرمئدیسئنیز \"ایستیفاده‌چییه ائ-پوچت گؤندر\" خصوصیتینی ایستیفاده ائده، ترجیهلرینیز ایمیل عنوانینیزی علاوه ایمیل گؤندرمک حقوقونا صاحب اولاجاقسینیز.\nبو آنکی باغلانما عنوانینیز $ 3، ائنگئللئنمئ نؤمره‌نیز # $ 5.\nبیر ایداره‌چی‌لر وضعیتینیز حاقیندا معلومات آلماق ایستدیگینیزده و یا هر هانسی بیر سورگودا بو معلومات‌لار لازیم اولا‌جاق، خاهیش ائدیریک نوت ائدین.",
        "autoblockedtext": "\n' 'ایستیفاده‌چی آدی و یا آی پی عنوانینیز قاباغی باغلانیب دیر.'\n\nسیزی باغلایان$ 1. الیله اولوب دیر \nباغلاماق سببی:' $ 2.\n\n* باغلانمانین باشلانان زامانی: $ 8\n* باغلانمانین قورتولان زامانی: $ 6\n* باغلانما مدتی: $ 7\n\nگؤستریلن سببه گؤره ائنگئللئنمئنیزین اویغون اولمادیغینی دوشونورسونوزسه، $ 1 یا دا باشقا بیر [[{{MediaWiki:Grouppage-sysop}}|مدیر]]  ایله بو وضعیتی گؤروشه بیلرسینیز. [[Special:Preferences|ترجیح لرینیز]] قیسمینده اعتبارلی بیر ائ-پوچت اونوانی گیرمئدیسئنیز \"ایستیفاده‌چییه ائ-پوچت گؤندر\" خصوصیتینی ایستیفاده ائده، ترجیهلرینیز ایمیل عنوانینیزی علاوه ایمیل گؤندرمک حقوقونا صاحب اولاجاقسینیز.\nبو آنکی باغلانما عنوانینیز $ 3، ائنگئللئنمئ نؤمره‌نیز # $ 5.\nبیر ایداره‌چی‌لر وضعیتینیز حاقیندا معلومات آلماق ایستدیگینیزده و یا هر هانسی بیر سورگودا بو معلومات‌لار لازیم اولا‌جاق، خاهیش ائدیریک نوت ائدین.",
        "edit-conflict": "سیزله برابر دییشدیرمه",
        "edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
        "postedit-confirmation-created": "به صفحه یارانیب‌دیر.",
+       "postedit-confirmation-restored": "صفحه گئری یوکلندی.",
        "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
        "edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
        "defaultmessagetext": "دفالت دانیشیق متنی",
        "invalid-content-data": "اعتبارسیز مضمون معلوماتی",
        "content-not-allowed-here": "\"$1\" مقاله‌سینه، [[$2]] صحیفه‌سینده ایجازه وئریلممیش دیر.",
        "editwarning-warning": "بو صحیفه‌نی ترک ائتمک، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، \"{{int:prefs-editing}}\"ایشدن سالا بیلرسینیز.",
+       "editpage-notsupportedcontentformat-title": "فایلین فرمتی دستکلنمیر.",
+       "editpage-notsupportedcontentformat-text": "$1 فایلین فرمتی  $2 فایل مدلی ایله دستکلنمیر.",
        "content-model-wikitext": "ویکی‌یازی",
        "content-model-text": "ساده یازی",
        "content-model-javascript": "جاوااسکریپت",
        "content-model-css": "سی‌اس‌اس",
+       "content-json-empty-object": "مقصدی بوش",
+       "content-json-empty-array": "بوش ماتریس",
+       "duplicate-args-category": "تیکراری داده قالیب لریندن ایشلنمیش صفحه لر",
        "expensive-parserfunction-warning": "خبردارلیق: بو ​​صحیفه چوخ چوخ زنگین ییغیجی تجزیه ائدن چاغیریشی دستورلار ائدیر.\n\nبو $2 مراجعت آز اولما‌لی، بو آندا {{PLURAL:$2|چاغیرش وار|چاغریش وار}} و اینک {{PLURAL:$1|چاغیرش وار|$1چاغریش وار}} .",
        "expensive-parserfunction-category": "کیفایت قدر بؤیوک سایدا گئنیشرئسورس‌لو فونکسیا‌لارین مراجعت اولوندوغو صحیفه‌لر",
        "post-expand-template-inclusion-warning": "'''دیققت!''' داخیل ائدیلن شابلوْنلارین حجمی حددیندن آرتیق بؤيوکدور.\nبعضی شابلوْنلار علاوه‌‌ اوْلونماياجاق.",
        "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-warning": "صحیفه گئنیشلنمه درین‌لیگی آشیلدی",
        "undo-success": "بو دَییشیک‌لیک گئری آلینا بیلر. لطفاً آشاغی‌داکی موقاییسه ائتمیی نظارت ائدین، حقیقتن بو دییشیک‌لیگی ائتمک ایستدیگینیزدن امین اولون و صحیفنی یازا‌راق بیر اوولکی دییشیک‌لیگی گئرییه آلین.",
        "undo-failure": "دییشیک‌لیک‌لرین توققوشماسی نتیجه‌سینده گئرییه قایتارما ایشی اوغورسوز اولدو.",
        "undo-norev": "دوزلیش‌لر گئری قایتاریلا بیلینمیر، چونکی اونلار یا مؤوجود دئییل، یا دا سیلینیب.",
+       "undo-nochange": "نظره گلیر دَییشدیرمه قاباغجادان قایتاریلیب.",
        "undo-summary": "$1 دییشیک‌لیک [[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرفین‌دن گئری آلیندی​​.",
        "undo-summary-username-hidden": "گیزلی ایستیفاده‌چی ایله ائدیلمیش $1 نوسخه‌سینی قایتارماق",
        "cantcreateaccounttitle": "حساب یارادماق اولمور",
        "cantcreateaccount-text": "بو ای پی عنوانین‌دان ('$1) ایستیفاده‌چی حسابی یارادیلماسی [[User:$3|$3]] طرفین‌دن انگللنمیش‌دیر.\n\n$3 طرفین‌دن وئریلن سبب '$2",
+       "cantcreateaccount-range-text": "'''$1''' آی‌پی آدرس آرالیغیندان حساب یارانماق، [[User:$3|$3]] ایشلدنی طرفیندن یاساقلانیب‌دیر. سیزین‌ده آی‌پی آدرسیز ('''$4''') بو آرادادیر.\n\n$3 طرفین‌دن وئریلن سبب بودور: «$2»",
        "viewpagelogs": "بو صحیفه‌نین قئیدلرینه باخ",
        "nohistory": "بو صحیفه اوچون دَییشدیرمه گئچمیشی یوخدور.",
        "currentrev": "سون نوسخه",
        "currentrev-asof": "$1 تاریخینه کیمی سون حال",
        "revisionasof": "$1 نوسخه‌سی",
        "revision-info": "$1- یارادیلمیش نوسخه{{GENDER:$6|$2}}$7 الیله",
-       "previousrevision": "اونجه‌کی وئرسیيا",
+       "previousrevision": "قاباق‌کی سۆروم",
        "nextrevision": "داها یئنی نوسخه ←",
        "currentrevisionlink": "سون نوسخه",
        "cur": "ایندی",
        "rev-deleted-event": "(قئيد سیلیندی)",
        "rev-deleted-user-contribs": "[ایستیفاده‌چی آدی و يا ای-پی اونوانی سیلیندی - ديَیشیکلیک چالیشمالاردان چیخاریلدی]",
        "rev-deleted-text-permission": "بو ديَیشیکلیک بو صحیفه‌دن '''سیلینیب دیر.'''",
+       "rev-suppressed-text-permission": "بو صفحه نوسخه‌سی <strong>باسدیریلیب‌دیر</strong>.\nآرتیق بیلگیلری [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} باسدیری قئیدین‌دن] تاپا بیلرسیز.",
        "rev-deleted-text-unhide": "بو صحیفه رئویزیونو 'سیلینمیش.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاهه سیلینمش] دئتال‌لاری بیلر.\nبیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو رئویزیونو هله گؤره بیلرسینیز].",
        "rev-suppressed-text-unhide": "صحیفه‌نین بو نوسخه سی سیلینیب.\nمومکون‌دور کی، بونون سببی [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه قئیدلرینده]گؤستریلمیش‌دیر.\nسیز ایداره‌چی اولدوغونوزا گؤره سیلینن [$1 بو وئرسیانی] نظردن کئچیره بیلرسینیز.",
        "rev-deleted-text-view": "صحیفه‌نین بو نوسخه سی سیلینیب.\nسیز ایداره‌چی اولدوغونوزا گؤره سیلینن بو وئرسیانی نظردن کئچیره بیلرسینیز. مومکون‌دور کی، سیلینمه‌نین سببی [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه قئیدلرینده] گؤستریلمیش‌دیر.",
        "rev-suppressed-unhide-diff": "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'باسدیریلمیش.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} دایاندیرما گوندلیگینده] دئتال‌لار اولا بیلر.\nبیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو دییشیک‌لیگی هله گؤره بیلرسینیز].",
        "rev-deleted-diff-view": "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'سیلینمیش.\nبیر خیدمتله اولا‌راق بو دییشیک‌لیگی گؤره بیلرسینیز؛ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه گوندلیگینده] دئتال‌لار اولا بیلر.",
        "rev-suppressed-diff-view": "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'باسدیریلمیش.\nبیر خیدمتله اولا‌راق بو دییشیک‌لیگی گؤره بیلرسینیز؛ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دایاندیرما گوندلیگینده] دئتال‌لار اولا بیلر.",
-       "rev-delundel": "گؤستر/گیزلت",
+       "rev-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-text": "سیلینمیش نوسخه لرین بیلگی لر هله لیک صفحه نین گئچمیشینده گورسنجک سانکی بو نوسخه لرین ایچرینه لرینه ال تاپماق هامی اوچون امکانلی دئییل.",
+       "revdelete-text-file": "سیلنمیش نوسخه لر هله لیک پرونده نین گئچمیشینده گورستریلیر سانکی اونون ایچریسینین بولوملریندن هامی اوچون ال تاپماق ایمکانی یوخدور.",
+       "logdelete-text": "سیلینمیش نوسخه لرین هله لیک صفحه نین گئچمیشینده گورسنجک سانکی ایچرینین بولملریندن ال تاپماق هامی اوچون امکانلی دئییل.",
+       "revdelete-text-others": "آیری مودیرلر ائلیه بیلرلر گیزلنمیش بو یازیلاری گورسونلر بو یوللا پوزولموش موردلری قایترلر یوخسا بو ایشه ایجازه وئریلمیه.",
        "revdelete-confirm": "خاهیش ائدیریک، بونو ائتمک ایستدیگینیزی، نتیجه‌لرینی آنلادیغینیزی، و بونو [[{{MediaWiki:Policy-url}}| پرینسیپ‌لره]] گؤره ائدیر اولدوغونوزو تسدیق ائدین.",
        "revdelete-suppress-text": "ساخلاما <strong>یالنیز</strong> آشاغی‌داکی حال‌لار اوچون ایستیفاده ائدیلمه‌لی‌دیر:\n* اویگون‌سوز فردی معلومات\n*:<em> ائو اونوان‌لاری و تئلئفون نؤمره‌لری، سوسیال تهلوکه‌سیزلیک نؤمره‌لری، و س.</em>",
        "revdelete-legend": "گؤرونوش محدودیتلری قوی:",
        "mergehistory-empty": "نوسخه‌لرین هئچ بیری بیرلشدیریلنمزلر.",
        "mergehistory-success": "[[:$1]]-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.",
        "mergehistory-fail": "گئچمیش بیرلشدیریلنمه‌دی، لوطفاً صحیفه و زامان پارامئترلرینی یئنی‌دن یوخلایین.",
+       "mergehistory-fail-toobig": "گئچمیش بیرلشمک ایشینی گورمک اولمور نئجه کی $1 محدودیتی چوخلوغوندان{{PLURAL:$1|نوسخه}} انتقال تاپاجاق.",
        "mergehistory-no-source": "$1 قایناق صحیفه‌سی یوخدور.",
        "mergehistory-no-destination": "$1 مقصد صحیفه‌سی یوخدور.",
        "mergehistory-invalid-source": "قایناق صحیفه‌نین گرک دوزگون باشلیغی اولسون.",
        "compareselectedversions": "سئچیلمیش نوسخه‌لری قارشیلاشدیر",
        "showhideselectedversions": "سئچیلمیش نوسخه‌لری گؤستر/گیزلد",
        "editundo": "قایتار",
+       "diff-empty": "فرقیسیز",
+       "diff-multi-sameuser": "(همن کی ایشلدیچی طرفیندن ائدیلمیش  {{PLURAL:$1|بیر دَییشلیک|$1 بیر نئچه دَییشلیک}} گوستریلمیر)",
+       "diff-multi-otherusers": "({{PLURAL:$1|۱ میانی نوسخه لر|$1 میانی نوسخه لر}} دَییک اولونموش {{PLURAL:$2|۱ ایشلدچی|$2 ایشلدچی}}طرفیندن گوستریلمیر)",
        "diff-multi-manyusers": "{{PLURAL:$2|بیر|$2}}-دن چوخ ایستیفاده‌چی یارادان {{PLURAL:$1|بیر|$1}} نوسخه، گؤستریلمه‌ییب‌دیر",
        "difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.",
-       "searchresults": "آختاریش سونوجلاری",
-       "searchresults-title": "«$1» اوچون آختاریش نتیجه‌لری",
+       "searchresults": "آختاریش سونوجلاری",
+       "searchresults-title": "«$1» اوچون آختاریش سونوج‌لاری",
        "titlematches": "صحیفه‌‌ آدی عینیدیر",
        "textmatches": "یازی عینی‌دیر",
        "notextmatches": "هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی",
        "prevn": "اؤنجه‌کی {{PLURAL:$1|$1}}",
        "nextn": "سونراکی {{PLURAL:$1|$1}}",
+       "prev-page": "قاباغکی صحیفه",
+       "next-page": "سونراکی صفحه",
        "prevn-title": "قاباقکی {{PLURAL:$1|بیر|$1}} نتیجه",
        "nextn-title": "سونراکی {{PLURAL:$1|بیر|$1}} سونوج",
-       "shown-title": "هر صحیفه‌ده {{PLURAL:$1|بیر|$1}} نتیجه گؤستر",
+       "shown-title": "هر صفحه‌ده {{PLURAL:$1|بیر|$1}} نتیجه گؤرست",
        "viewprevnext": "گؤستر ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
        "searchmenu-new": "<strong>بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!</strong> {{PLURAL:$2|0=|هابئله تاپیلمیش صفحه نی آختاریشینیزلا گورون.|هابئله تاپیلمیش آختاریشین نتیجه سین گورون.}}",
        "search-result-category-size": "{{PLURAL:$1|بیر|$1}} عوضو ({{PLURAL:$2|بیر|$}} آلت‌بؤلمه، {{PLURAL:$3|بیر|$3}} فایل)",
        "search-redirect": "یول‌لاندیرما $1",
        "search-section": "(بؤلوم $1)",
+       "search-category": "(رده  $1)",
+       "search-file-match": "(فایلین ایچری اوخشاری)",
        "search-suggest": "بونو نظرده توتوردونوزمو: $1",
        "search-interwiki-caption": "قارداش پروژه‌لر",
-       "search-interwiki-default": "$1 Ø³Ù\88Ù\86Ù\88ج:",
+       "search-interwiki-default": "$1 Ø¯Ø§Ù\86 Ø³Ù\88Ù\86Ù\88جÙ\84ار:",
        "search-interwiki-more": "(داها)",
        "search-relatedarticle": "ایلگیلی",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "showingresults": "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
+       "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-togglelabel": "یوخلا:",
        "powersearch-toggleall": "بوتون",
        "powersearch-togglenone": "هئچ بیری",
+       "powersearch-remember": "سچمگی گلجک سون آختاریشلارا یاد دا ساخلا",
        "search-external": "ائشیک آختاریش",
        "searchdisabled": "{{SITENAME}} آختاریشی باغلانیب‌دیر.\nایندی گوگل ایله آختارا بیلرسینیز.\nدیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.",
        "search-error": "آختاراندا بیر خطا قاباغا گلدی: $1",
        "preferences": "ترجیحلر",
        "mypreferences": "ترجیحلر",
        "prefs-edits": "دَییشمه‌لرین سایی:",
+       "prefsnologintext2": "خواهیش اولونور تنظیملرینیزی دَییشمک اوچون گیریش ائدین.",
        "prefs-skin": "قابیق",
        "skin-preview": "اؤن‌گؤستریش",
        "datedefault": "سئچیم‌سیز",
        "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": "گنیشلنمیش ایزله‌مه‌لرده گؤستریلن دَییشیکلیکلرین چوخو:",
        "recentchangesdays-max": "ماکسیموم $1 {{PLURAL:$1|گون |گون}}",
        "recentchangescount": "سون ديَیشیکلیکلرده باشلیق سايی:",
        "prefs-help-recentchangescount": "بورایا یئنی دییشیک‌لیک‌لر، صحیفه‌لرین و ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.",
+       "prefs-help-watchlist-token2": "بو کیلید ایزلدیگیز لیستین وب تغذیه سی رمزی دیر.\nهر کیم اونا ال تاپسا ایزلدیکلرینیز لیستی اوخویا بیلر بئله لیکله اونا پایلاشمایین [[Special:ResetTokens|لازیم اولسا اونو دَییشدیرمک اوچون بورانی باسین]].",
        "savedprefs": "سئچیمینیز قئيد ائدیلدی.",
        "timezonelegend": "چاغ بؤلگه‌سی:",
        "localtime": "یئرلی چاغ:",
        "prefs-help-signature": "دانیشیق صحیفه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز و تاریخه دؤنه‌جک‌دیر.",
        "badsig": "یانلیش خام ایمضا.\nاچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.",
        "badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
-       "yourgender": "جÛ\8cÙ\86س:",
-       "gender-unknown": "بÛ\8cÙ\84Û\8cÙ\86دÛ\8cرÙ\85Ù\87â\80\8cÙ\85Û\8cØ´",
+       "yourgender": "ترجÛ\8cØ­ Ù\88ئرÛ\8cرسÛ\8cز Ù\86جÙ\88ر ØªÙ\88صÛ\8cÙ\81 Ø§Ù\88Ù\84Ù\88Ù\86سÙ\88Ù\86Ø\9f",
+       "gender-unknown": "ترجÛ\8cØ­ Ù\88ئرÛ\8cرÙ\85 Ø¨Û\8cÙ\84Û\8cÙ\86دÛ\8cرÙ\85Û\8cÛ\8cÙ\85",
        "gender-male": "کیشی",
        "gender-female": "قادین",
-       "prefs-help-gender": "اÛ\8cستگÙ\87 Û\8cاغÙ\84Û\8c: Û\8cازÛ\8cÙ\84Û\8cÙ\85â\80\8cÙ\84اØ\8c Ø¯Ù\88زگÙ\88Ù\86 Ø¬Ù\86سÛ\8cتÙ\87 Ø§Û\8cÙ\84Ú¯Û\8câ\80\8cÙ\84Û\8c Ø¢Ø¯Ø±Ø³ Ù\88ئرÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Û\8cØ´Ù\86یر.\nبو بیلگی، عمومی اولاجاق‌دیر.",
+       "prefs-help-gender": "بÙ\88 ØªØ±Ø¬Û\8cØ­ Ø§Û\8cستگÙ\87 Ø¨Ø§ØºÙ\84Û\8câ\80\8cدÛ\8cر.\nبÙ\88Ù\86Ù\88Ù\86 Ù\85Û\8cÙ\82دارÛ\8cØ\8c Ø³Û\8cزÛ\8c Ø¨Ø§Ø´Ù\82اÙ\84ارا Ø¯Ù\88زگÙ\88Ù\86 Ø¢Ø¯Ø±Ø³ Ù\88ئرÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 Ø§Û\8cØ´Ù\84Ù\86Ù\87â\80\8cجکدیر.\nبو بیلگی، عمومی اولاجاق‌دیر.",
        "email": "ایمیل",
-       "prefs-help-realname": "اصÙ\84Û\8c Ø¢Ø¯ Ø§Û\8cستگÙ\87 Ø¨Ø§ØºÙ\84Û\8câ\80\8cدیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
+       "prefs-help-realname": "اصÙ\84Û\8c Ø¢Ø¯ Ø§Û\8cختÛ\8cارÛ\8c دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
        "prefs-help-email": "ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.",
        "prefs-help-email-others": "سیز هم‌ده آیری ایستیفاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیفاده‌چی یا دانیشیق صحیفه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.\nآیری ایستیفاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.",
        "prefs-help-email-required": "ایمیل آدرس گرکلی‌دیر.",
        "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": "گئچرلی بیر ایمیل آدرسی وئرین",
        "userrights": "ایستیفاده‌چی حاقلاری ایداره‌سی",
        "userrights-notallowed": "سیزین ایستیفاده‌چی حسابینیزا دیگر ایستیفاده‌چی‌لره حقوق‌لار وئرمک و یا آلماغا ایجازه وئریلمه‌ییب.",
        "userrights-changeable-col": "ديَیشدیره بیلدیگینیز قروپلار",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
-       "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
+       "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
        "userrights-removed-self": "سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.",
        "group": "قروپ:",
        "group-user": "ایستفاده‌چیلر",
        "right-move": "صحیفه‌لرین آدینی دَییشدیر",
        "right-move-subpages": "صحیفه‌لرین آدلارینی، آلت‌صحیفه‌لری ایله بیرلیکده، دَییشدیر",
        "right-move-rootuserpages": "ایستیفاده‌چی کؤک صحیفه‌لرینین آدلارینی دَییشدیر",
+       "right-move-categorypages": "صفحهٔ رده نین داشینماسی",
        "right-movefile": "فایل‌لارین آدلارینی دَییشدیر",
        "right-suppressredirect": "صحیفه‌لرین آدینی دَییشدیرنده، قایناق صحیفه‌لردن یوللاندیرما یارادما",
        "right-upload": "فایل یوکله‌یین",
        "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": "باشقا ایستیفاده‌چیلرین سی‌اس‌اس و جاوااسکریپت فایل‌لارینی دَییشدیر",
        "right-editusercss": "باشقا ایستفاده‌چیلرین سی‌اس‌اس فایل‌لارینی دَییشدیر",
        "action-createpage": "صحیفه یارات",
        "action-createtalk": "دانیشیق صحیفه‌سی یاراد",
        "action-createaccount": "بو ایستیفاده‌چی حسابینی یاراد",
+       "action-history": "بو صفحه نین گئچمیشین گور",
        "action-minoredit": "بو دَییشیکلیگی، کیچیک اولاراق نیشانلا",
        "action-move": "بو صحیفه‌‌نین آدینی ديَیشدیر",
        "action-move-subpages": "بو صحیفه‌نین آدینی، آلت‌صحیفه‌لری ایله بیرلیکده دَییشدیر",
        "action-move-rootuserpages": "ایستیفاده‌چی کؤک صحیفه‌لرینین آدلارینی دَییشدیر",
+       "action-move-categorypages": "صفحهٔ رده نین داشینماسی",
        "action-movefile": "بو فایلین آدینی دَییشدیر",
        "action-upload": "بو فایلی یوکله",
        "action-reupload": "بو اؤنجه‌دن اولان فایلین اوستونه یاز",
        "action-block": "بو ایستیفاده‌چی‌نین دَییشدیرمه‌سینین قاباغینی آل",
        "action-protect": "بو صحیفه اوچون قورونماق سطحلرینی دَییشدیر",
        "action-rollback": "بیر خاص صحیفه‌نی سون دفعه دَییشدیرن ایستیفاده‌چینین دَییشیکلیکلرینی تئزلیکله قایتار",
-       "action-import": "بÙ\88 ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\86Û\8c Ø¨Ø§Ø´Ù\82ا Ø¨Û\8cر Ù\88Û\8cÚ©Û\8câ\80\8cدÙ\86 Ú¯Û\8cردÛ\8cر",
+       "action-import": "صحÛ\8cÙ\81Ù\87â\80\8c Ø¨Ø§Ø´Ù\82ا Ø¨Û\8cر Ù\88Û\8cÚ©Û\8câ\80\8cدÙ\86 Ú¯Û\8cردÛ\8cرÙ\85Ù\87 Ø³Û\8c",
        "action-importupload": "بو صحیفه‌نی بیر فایل یوکلمه‌سیندن گیردیر",
        "action-patrol": "باشقالارین دَییشیکلیکلرینی، نظارتلنمیش اولاراق نیشانلا",
        "action-autopatrol": "اؤز دَییشیکلیکلرینیزی نظارتلنمیش اولاراق نیشانلا",
        "action-viewmywatchlist": "ایزله‌دیکلرینی گؤر",
        "action-viewmyprivateinfo": "گیزلی بیلگیلرینی گؤر",
        "action-editmyprivateinfo": "گیزلی بیلگیلرینی دَییشدیر",
+       "action-editcontentmodel": "بیر صفحه نین ایچریک مودلین دَییشدیر",
        "nchanges": "$1 {{PLURAL:$1|دَییشیکلیک}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|سون گوروش دن}}",
        "enhancedrc-history": "گئچمیش",
-       "recentchanges": "سون دَییشیکلیکلر",
+       "recentchanges": "سون دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
        "recentchanges-summary": "بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.",
        "recentchanges-noresult": "وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
        "recentchanges-feed-description": "ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.",
-       "recentchanges-label-newpage": "بو دییشیک یئنی بیر صحیفه یاراتدی",
+       "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": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
+       "rcnotefrom": "آشاغی داکی دَییشیک لرده <strong>$3, $4</strong> (دن <strong>$1</strong> {{PLURAL:$5|چان گوستریلیب|چان گوستریلیب دیر}}).",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
        "rcshowhideminor-show": "گؤستر",
        "diff": "فرق",
        "hist": "گئچمیش",
        "hide": "گیزلت",
-       "show": "گؤستر",
+       "show": "گؤرست",
        "minoreditletter": "ک",
        "newpageletter": "ی",
        "boteditletter": "ب",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
        "recentchangeslinked": "ایلگیلی دَییشیکلیکلر",
        "recentchangeslinked-feed": "ایلگیلی دَییشیکلیکلر",
-       "recentchangeslinked-toolbox": "ایلگیلی دَییشیکلیکلر",
+       "recentchangeslinked-toolbox": "ایلگیلی دَییشیکلیکلر",
        "recentchangeslinked-title": "''$1'' ایله ایلگی‌لی دییشیکلر",
        "recentchangeslinked-summary": "آشاغیداکی سیياهی، قئيد اوْلونان صحیفه‌‌يه (و يا قئيد اوْلونان کاتئقوْرياداکی صحیفه‌‌لره) داخیلی کئچید وئرن صحیفه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر. \n[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
-       "recentchangeslinked-page": "صحیفه آدی:",
+       "recentchangeslinked-page": "صفحه آدی:",
        "recentchangeslinked-to": "قئيد اوْلونان صحیفه‌‌ده‌کی دئيیل، اوْنا داخیلی کئچید وئرن صحیفه‌‌لرده‌کی ديَیشیکلیکلری گؤستر",
        "upload": "فایل یوکله‌",
        "uploadbtn": "فایل یوکله‌یین",
        "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* فایلین 200 پیکسئلدک کیچیلدیلمیش وئرسیاسینی متن‌دن سولدا، آلتیندا ایزاهلا یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|təsvir]]</nowiki></code>''';\n* صحیفه‌ده فایلین اؤزونو گؤسترمه‌دن اونا بیرباشا کئچید یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''.",
-       "upload-permitted": "ایجازه وئریلن فايل تیپلری: $1.",
-       "upload-preferred": "اÛ\8cجازÙ\87 Ù\88ئرÛ\8cÙ\84Ù\86 Ù\81اÙ\8aÙ\84 ØªÛ\8cÙ¾Ù\84رÛ\8c: $1.",
-       "upload-prohibited": "ایجازه وئریلمه‌ين فايل تیپلری: $1.",
+       "upload-permitted": "{{PLURAL:$2|تیپ|تیپ لر}} مجاز پرونده لر: $1.",
+       "upload-preferred": "ترجÛ\8cØ­ Ù\88ئرÛ\8cÙ\84Ù\86 Ù\81اÙ\8aÙ\84 ØªÛ\8cÙ¾Ù\84رÛ\8c{{PLURAL:$2|تÛ\8cÙ¾|تÛ\8cÙ¾ Ù\84ر}}: $1.",
+       "upload-prohibited": "ایجازه وئریلمه‌ين فايل تیپلری{{PLURAL:$2|تیپ|تیپ لر}}: $1.",
        "uploadlogpage": "یوکلمه قئیدلری",
        "uploadlogpagetext": "آشاغیدا ان سون یوکله‌نیلن فایل‌لارین لیستی گؤستریلیر.\nداها گؤرونوش‌لو گؤسترمک اوچون، [[Special:NewFiles|یئنی فایل‌لار گالئری‌سینه]] باخین.",
        "filename": "فایل آدی",
        "largefileserver": "فایلین اؤلچوسو یول وئریلن حدی آشیر.",
        "emptyfile": "یوکلدیگینیز فایل بوش‌دور. بو فایلین آدیندا اولان هرف سهوی ایله باغ‌لی اولا بیلر. خاهیش اولونور کی، دوغوردان دا بو فای‌لی یوکلمک ایستدیگینیزی یوخلایاسینیز.",
        "windows-nonascii-filename": "بو wiki فایل آدلاریندا خصوصی کاراکتئر ایستیفاده‌سینی دستکلمیر",
-       "fileexists": "یوکلمک ایستدیگینیز آددا فایل مؤوجوددور.\nلطفاً <strong>[[:$1]]</strong> کئچیدینی یوخلایین و بو فای‌لی یوکلمک ایستدیگینیزدن عمین اولون.\n[[$1|thumb]]",
+       "fileexists": "\nیوکلمک ایستدیگینیز آددا فایل مؤوجوددور،ایر اطمینانیز {{GENDER:|یوخدور}} ایستیرسیز فایلی دَییشه سیز  لوطفاً <strong>[[:$1]]</strong> گوزله ین.\n[[$1|thumb]]",
        "filepageexists": "بو فایل اوچون شرح صحیفه‌سی <strong>[[:$1]]</strong> عنوانیندا اونسوز دا یارادیلمیش، لاکین بو آددا بیر فایل بو آندا مؤوجود دئییل.\nگیرجیینیز خلاصه شرح صحیفه‌سینده گؤرونمه‌یه‌جک.\nاؤزئتینیزین اورادا گؤرونمه‌سی اوچون، بونو الله دییشدیرملیسینیز.\n[[$1|کیچیک شکیل]]",
-       "fileexists-extension": "بئÙ\86زئر Ø¢Ø¯Ù\84ا Ø¨Ø§Ø´Ù\82ا Ø¨Û\8cر Ù\81اÛ\8cÙ\84 Ù\85ؤÙ\88جÙ\88د: [[$2|thumb]]\n* Ú\86Ú©Û\8cÙ\84Ù\85Û\8cØ´ Ù\81اÛ\8cÙ\84Û\8cÙ\86 Ø¢Ø¯Û\8c: <strong>[[:$1]]</strong>\n* Ù\85ؤÙ\88جÙ\88د Ù\81اÛ\8cÙ\84Û\8cÙ\86 Ø¢Ø¯Û\8c: <strong>[[:$2]]</strong>\nخاÙ\87Û\8cØ´ Ø§Ø¦Ø¯Û\8cرÛ\8cÚ© Ø¨Ø§Ø´Ù\82ا Ø¨Û\8cر Ø¢Ø¯ Ø³Ø¦Ú\86Û\8cÙ\86",
+       "fileexists-extension": "اÙ\88خشار Ø¢Ø¯Ù\84ا Ø¨Ø§Ø´Ù\82ا Ø¨Û\8cر Ù\81اÛ\8cÙ\84 Ù\85ؤÙ\88جÙ\88د: [[$2|thumb]]\n* Ú\86Ú©Û\8cÙ\84Ù\85Û\8cØ´ Ù\81اÛ\8cÙ\84Û\8cÙ\86 Ø¢Ø¯Û\8c: <strong>[[:$1]]</strong>\n* Ù\85ؤÙ\88جÙ\88د Ù\81اÛ\8cÙ\84Û\8cÙ\86 Ø¢Ø¯Û\8c: <strong>[[:$2]]</strong>\nاÛ\8cستÛ\8cرسÛ\8cز Ø¨Û\8cر Ú\86Ù\88Ø® Ù\81رÙ\82Û\8cÙ\84Û\8c Ø¢Ø¯ Ø§Û\8cØ´Ù\84دسÛ\8cÙ\86Û\8cزØ\9f",
        "fileexists-thumbnail-yes": "بو فایل، بیر رسمی فور وئرسیاسی کیمی گؤرونور (تهومبنایل)'. [[$1|thumb]]\nخاهیش ائدیریک <سترونگ> [[:$1]] </strong> فایلینی نظارت ائدین.\nاگر نظارت ائدیلن فایل ایله خصوصی اؤلچوسون‌دکی عینی دوسیایسا آرتیق کیچیک شکیل یوکلمه‌یه احتیاج یوخ‌دور.",
        "file-thumbnail-no": "بو فایلین آدی <strong>$1</strong> ایله باشلاییر.\nبو باشقا بیر شکیل فور نوسخه سینه بنزییر (thumbnail)'\nاگر سیزده بو شکیلین تام نظر گلیر نسخه سی وارسا اونو یوکلیین، عکس حالدا خاهیش ائدیریک فایل آدینی دییش‌دیرین.",
        "fileexists-forbidden": "بو آددا بیر فايل وار، و اوزرینه يازیلما اولماز. \nفايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری دؤنوب يئنی بیر آد ایستیفاده ائدین.\n[[File:$1|thumb|center|$1]]",
        "license": "لیسانس:",
        "license-header": "لیسانس",
        "nolicense": "هئچ‌بیری سئچیلمه‌ییب",
+       "licenses-edit": "مجویزلی اولان سئچکیلری دَییشدیر",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
-       "upload_source_url": "(بÛ\8cر Ú¯Ø¦Ú\86رÙ\84Û\8c Ù\88 Ø¹Ù\85Ù\88Ù\85 Ú¯Ø¤Ø±Ù\87 Ø¨Û\8cÙ\84Ù\86 Ø§Û\8cÙ\86ترÙ\86ت Ø¢Ø¯Ø±Ø³Û\8c)",
-       "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
+       "upload_source_url": "(سÛ\8cز Ø¯Ù\88زگÙ\88Ù\86Ø\8c Ù\87ر Ú©Ø³Û\8cÙ\86 Ø¯Ø§Ø®Û\8cÙ\84 Ø§Ù\88Ù\84ا Ø¨Û\8cÙ\84جÛ\8cÛ\8c Ø§Ù\88رÙ\84 Ø³Ø¦Ú\86دÛ\8cÙ\86Û\8cز)",
+       "upload_source_file": "(بیلگی‌سایارینیزدان بیر فایل سئچیلیب دیر)",
        "listfiles-delete": "سیل",
        "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
+       "listfiles-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
        "imgfile": "فایل",
        "listfiles": "فایل لیستی",
        "listfiles_thumb": "کیچیک شکیل",
        "filehist-current": "ایندیکی",
        "filehist-datetime": "تاریخ/واخت",
        "filehist-thumb": "کیچیک شکیل",
-       "filehist-thumbtext": "$1 تاریخینده‌کی نوسخه‌نین کیچیک گؤرونتوسو",
+       "filehist-thumbtext": "$1 تاریخینده‌کی سۆروموندن کیچیک گؤرونتوسو",
        "filehist-nothumb": "کیچیک شکیل یوخدو",
-       "filehist-user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c",
+       "filehist-user": "اÛ\8cØ´Ù\84دÙ\86",
        "filehist-dimensions": "اؤلچولر",
        "filehist-filesize": "فایل اؤلچوسو",
        "filehist-comment": "باخیش",
        "filedelete-maintenance": "ساخلاماق سیراسیندا، فایل‌لاری سیلمک و قایتارماق، گئچرلی اولاراق باغلی‌دیر.",
        "filedelete-maintenance-title": "فایل سیلیننمه‌دی",
        "mimesearch": "MIME آختار",
-       "mimesearch-summary": "بو صحیفه، فایل‌لارین MIME-لارینا گؤره فیلترله‌مگی آچار.\nوئرمک: contenttype/subtype، میثال: <code>image/jpeg</code>.",
+       "mimesearch-summary": "با کمک این صفحه شما می‌توانید پرونده‌هایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype یا contenttype/*&lrm;، نظیر <code>image/jpeg</code>.\n\nسیز بو صحیفه نین یاردیمی ایله ائلیه بیلرسیز MIME تیپینده اولان فایلاری تاپاسینیز.\nگیریش: contenttype/subtype،یاداcontenttype/*&lrm;،\nمیثال: \n<code>image/jpeg</code>.",
        "mimetype": "MIME تیپی:",
        "download": "اندیر",
        "unwatchedpages": "ایزلنمه‌میش صحیفه‌لر",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
        "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
-       "randompage": "راست‌گله صحیفه",
+       "randompage": "راست‌گله صفحه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
        "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "wantedpages-badtitle": "مراجعت زامانتی يانلیش باشلیق: $1",
        "wantedfiles": "ایسته نن فایللار",
        "wantedfiletext-cat": "آشاغیداکی فایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان فایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله یانلیش باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان فایل‌لاری ایشلدن صحیفه‌لر ده [[:$1]]-ده لیست اولونوبلار.",
+       "wantedfiletext-cat-noforeign": "آشاغی دا کی اولان فایل لار ایستفاده اولونور سانکی یوخدولار. بوندان اونجه فایل لاری اولموش صفحه لر [[:$1]] ده لیست اولوب لار.",
        "wantedfiletext-nocat": "اشاغی داکی فایل لار ایستفاده اولور سانکی یوخدولار.حتی مومکین دیر خارجی حویض مخزن لریندن اولماق  ایله بو ردا فهرست اولا . وهر مثب رتبه سی یانلیش <del> خط یئمیش اولاجاق.</del>",
+       "wantedfiletext-nocat-noforeign": "آشاغی داکی فایل لار ایشلنیلیر سانکی یوخدورلار.",
        "wantedtemplates": "ایسته نن شابلونلار",
        "mostlinked": "ان چوخ کئچیدلنن صحیفه‌‌لر",
        "mostlinkedcategories": "ان چوخ مقاله‌سی اولان بولمه لر",
-       "mostlinkedtemplates": "اÙ\86 Ú\86Ù\88Ø® Ø§Û\8cستÛ\8cÙ\81ادÙ\87 Ø§Ù\88Ù\84Ù\88Ù\86اÙ\86 Ø´Ø§Ø¨Ù\84Ù\88Ù\86â\80\8cÙ\84ار",
+       "mostlinkedtemplates": "اÙ\86 Ú\86Ù\88Ø® Ø§Û\8cستÛ\8cÙ\81ادÙ\87 Ø§Ù\88Ù\84Ù\88Ù\86اÙ\86 ØµÙ\81Ø­Ù\87 Ù\84ر",
        "mostcategories": "بؤلمه‌سی ان چوخ اولان صحیفه‌لر",
        "mostimages": "ان چوخ ایستیفاده ائدیلمیش شکیللر",
        "mostinterwikis": "اینتر ویکی‌سی ان چوخ اولان صحیفه‌لر",
        "listusers-desc": "آزالان سیرادا سیرالا",
        "usereditcount": "$1 {{PLURAL:$1|دَییشدیرمه}}",
        "usercreated": "$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}",
-       "newpages": "يئنی صحیفه‌‌‌لر",
+       "newpages": "يئنی صفحه‌‌‌لر",
        "newpages-username": "ایستیفاده‌چی آدی:",
        "ancientpages": "ان اسکی صحیفه‌لر",
        "move": "آدینی دَییشدیر",
        "pager-older-n": "{{PLURAL:$1|بیر داها کؤهنه|$1 داها کؤهنه}}",
        "suppress": "باخان",
        "querypage-disabled": "پِرفورمانس اوچون بو اؤزل صحیفه باغلانیب‌دیر.",
+       "apihelp": "API یاردیمی",
+       "apihelp-no-such-module": "«$1» ماژول تاپیلمادی.",
        "booksources": "کیتاب قایناقلاری",
        "booksources-search-legend": "کیتاب قایناقلارین آختار",
        "booksources-search": "آختار",
        "trackingcategories-msg": "ایزله‌مک بؤلومو",
        "trackingcategories-name": "مئساژ آدی",
        "trackingcategories-desc": "بؤلمه ایچری آلماق معیارلاری",
+       "noindex-category-desc": "بو صفحه، ایچینده <code><nowiki>__NOINDEX__</nowiki></code> سؤزجوک اولدوغونا گؤره و بونو ایجازه وئرن آدفضاسیندا اولدوغونا گؤره، بوتلارلا ایندِکس اولونماییب‌دیر.",
+       "index-category-desc": "بو صفحه، ایچینده <code><nowiki>__INDEX__</nowiki></code> سؤزجوک اولدوغونا گؤره و بونو ایجازه وئرن آدفضاسیندا اولدوغونا گؤره، بوتلارلا ایندِکس اولونوب‌دور، اوحال‌داکی عموماً اولونمازدیر.",
+       "post-expand-template-inclusion-category-desc": "شابلونلاری گئنیشلندیرن‌دن سونرا، صفحه‌نین اؤلچو <code>$wgMaxArticleSize</code>-دن چوخ اولور، بونا گؤره شابلونلار گئنیشلندیریلمه‌ییبلر.",
+       "post-expand-template-argument-category-desc": "بیر شابلون آرگومانینی (اوچ آکولاد آرالی بیر شِی، میثال <code>{{{Foo}}}</code>) گئنیشلندیرن‌دن سونرا، صفحه‌نین اؤلچو <code>$wgMaxArticleSize</code>-دن چوخ اولور.",
+       "trackingcategories-nodesc": "آچیقلاما یوخدور.",
+       "trackingcategories-disabled": "بؤلمه باغلانیب‌دیر.",
        "mailnologin": "گؤندرمه آدرسی یوخدور",
        "mailnologintext": "باشقا ایستیفاده‌چیلره ایمیل گؤندرک اوچون، [[Special:UserLogin|گیریش]] ائدیب و [[Special:Preferences|ترجیحلر]]ینیزده گئچرلی ایمیل آدرسی وئرمه‌لیسینیز.",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "emailccsubject": "سیزین $1-ه مئساژینیزین کوپی‌سی: $2",
        "emailsent": "ایمیل گؤنده‌ریلدی",
        "emailsenttext": "ایمیل مئساژینیز گئنده‌ریلدی.",
-       "emailuserfooter": "بو ایمیل، {{SITENAME}}-ده «ایستیفاده‌چی‌یه ایمیل گؤندر» ایمکانی ایله، $1-دن $2-ه گؤنده‌ریلیب‌دیر.",
+       "emailuserfooter": "بو ایمیل، {{SITENAME}}-ده «{{int:emailpage}}» ایمکانی ایله، $1-دن $2-ه گؤندریلیب‌دیر.",
        "usermessage-summary": "مئساژ گئنده‌ریلدی.",
        "usermessage-editor": "سیستِم مئساژ گؤندَرَنی",
        "watchlist": "ایزله‌دیکلر",
        "mywatchlist": "ایزله‌دیکلر",
        "watchlistfor2": "$1 اوچون $2",
        "nowatchlist": "ایزلمه سیاهینیز بؤش‌دور.",
-       "watchlistanontext": "Ù\84Ø·Ù\81اÙ\8bØ\8c Ø§Û\8cزÙ\84دÛ\8cÚ¯Û\8cÙ\86Û\8cز ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84رÛ\8c Ú¯Ø¤Ø±Ù\85Ú© Ù\88 Û\8cا Ø±Ø¦Ø¯Ø§Ú©ØªÙ\87 Ø§Ø¦ØªÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 $1.",
+       "watchlistanontext": "Ù\84Ø·Ù\81اÙ\8bØ\8c Ø§Û\8cزÙ\84دÛ\8cÚ¯Û\8cÙ\86Û\8cز ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84رÛ\8c Ú¯Ø¤Ø±Ù\85Ú© Ù\88 Û\8cا Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 Ú¯Û\8cرÛ\8cØ´ Ø§Ø¦Ø¯Û\8cÙ\86.",
        "watchnologin": "داخیل اولمامیسینیز",
        "addwatch": "ایزلمه سیاهی‌سینا علاوه ائت",
        "addedwatchtext": "\"[[:$1]]\" صحیفه‌سی [[Special:Watchlist|ایزله‌دیکلرینیزه]] آرتیریلدی. بو صحیفه‌ده و ایلگیلی دانیشیق صحیفه‌سین‌ده‌کی بوتون دییشیکلیکلر اوردا گؤستریله‌جکلر.",
+       "addedwatchtext-short": "«$1» صفحه‌سی سیزین ایزله‌دیلرینیزه آرتیریلدی.",
        "removewatch": "بو صحیفنی ایزلدیگیم صحیفه‌لر سیاهی‌سین‌دان چیخار",
        "removedwatchtext": "\"[[:$1]]\" صحیفه‌سی [[Special:Watchlist|ایزلمه سیاهینیزدان]] چیخاریلدی.",
+       "removedwatchtext-short": "«$1» صفحه‌سی سیزین ایزلدیگینیز صفحه‌لریندن سیلیندی.",
        "watch": "ایزله",
        "watchthispage": "بو صفحه‌نی ایزله",
        "unwatch": "ایزله‌مه",
        "unwatchthispage": "صحیفه ایزلمیی دایان‌دیر",
        "notanarticle": "مضمون صحیفه‌سی دئییل",
        "notvisiblerev": "باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب",
-       "watchlist-details": "دانیشیق صفحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.",
+       "watchlist-details": "داÙ\86Û\8cØ´Û\8cÙ\82 ØµÙ\81Ø­Ù\87â\80\8cÙ\84رÛ\8cÙ\86Û\8c Ø¢Û\8cرÛ\8c Ø³Ø§Û\8cÙ\85اÛ\8cاراÙ\82Ø\8c {{PLURAL:$1|$1 ØµÙ\81Ø­Ù\87â\80\8cÙ\86Û\8c}} Ø§Û\8cزÙ\84Ù\87â\80\8cÛ\8cÛ\8cرسÛ\8cÙ\86Û\8cز.",
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
        "wlheader-showupdated": "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
-       "wlnote": "آشاغیداکی {{PLURAL:$1|'''$1''' ديَیشیک‌لیک|'''$1'''ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|'''$2''' ساعتدا}} ائدیلمیشدیر.$3، $4",
+       "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "enotif_lastvisited": "سونونجو زیارتینیزدن ایندیدک اولان بوتون دییشیک‌لیک‌لری گؤرمک اوچون باخین: $1.",
        "enotif_lastdiff": "بو دییشیک‌لیگی گؤرمک اوچون $1 صحیفه‌سینه باخین.",
        "enotif_anon_editor": "قئیدیات‌سیز ایستیفاده‌چی $1",
-       "enotif_body": "حؤرمتلی $WATCHINGUSERNAME,\n\n{{SITENAME}} وئب-سايتینداکی $PAGETITLE آدلی صحیفه‌‌ $PAGETITLE تاریخینده $PAGEEDITOR طرفیندن $CHANGEDORCREATED. صحیفه‌‌نین سونونجو وئرسیياسینا باخماق اوچون $PAGETITLE_URL کئچیدیندن ایستیفاده ائدین. \n\n$نئwپاگئ \n\nديَیشیکلیگی ائدن ایستیفاده‌چی‌نین ایضاهی: $PAGESUMMARY $PAGEMINOREDIT\n\nصحیفه‌‌نی ديَیشدیرن ایستیفاده‌چی‌نین علاقه‌‌ معلوماتلاری: \nائ-پوچت:$PAGEEDITOR_EMAIL\nویکی:$PAGEEDITOR_WIKI\n\nسیز حاقیندا صؤحبت گئدن صحیفه‌‌يه باخانادک صحیفه‌‌دکی دیگر ديَیشیکلیکلرله باغلی باشقا بیلدیریش مکتوبو آلماياجاقسینیز. سیز همچی‌نین، ایزله‌مه سیياهینیزداکی بوتون صحیفه‌‌لرله باغلی بیلدیریش معلوماتلارینی سیله بیلرسینیز. \n\n               {{SITENAME}} سايتی‌نین خبردارلیق سیستمی. \n\n-- \nایزله‌مه سیياهیسی‌نین تنزیمله‌مه‌لرینی ديَیشمک اوچون: \n{{canonicalurl:Special:Watchlist/edit}}\n\nياردیم و تکلیفلرینیز اوچون: \n$HELPPAGE",
+       "enotif_body": "حؤرمتلی $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nدَییشدیرنین قیساسی: $PAGESUMMARY $PAGEMINOREDIT\n\nدَییشدیرن‌له تماس تاپماق:\nایمیل: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\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",
        "created": "یارادیلیب",
        "changed": "ديَیشدی",
        "deletepage": "صحیفه‌‌نی سیل",
        "exbeforeblank": "سیلینمه‌دن اوولکی مزمون: '$1",
        "delete-confirm": "سیل $1",
        "delete-legend": "سیل",
-       "historywarning": "'خبردارلیق:' سیلینه‌جک صحیفه‌نین تاریخچه‌سینده قئید اولونموش $1 {{PLURAL::$1|دییشدیر|دییشدیرمه}} وار:",
+       "historywarning": "<strong>خبردارلیق:</strong> سیلینه‌جک صحیفه‌نین تاریخچه‌سینده قئید اولونموش $1 {{PLURAL:$1|دییشدیرمه}} وار:",
        "confirmdeletetext": "بو صحیفه و یا فایل بوتون تاریخچه‌سی ایله بیرلیکده بیردفه‌لیک سیلینه‌جک. بونو [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون ائتدیگینیزی و عملیاتین نتیجه‌لرینی باشا دوشدوگونوزو تسدیق ائدین.",
        "actioncomplete": "چالیشما سوناچاتدی",
        "actionfailed": "چالیشما اوغورسوز اولدو",
        "deletecomment": "ندن:",
        "deleteotherreason": "باشقا/آرتیق دلیل:",
        "deletereasonotherlist": "باشقا سبب",
-       "deletereason-dropdown": "*ساس سیلمه سببی\n** یازان ایستیی\n** یازانلار حقوق پوزونتوسو\n** واندالیزم",
+       "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": "گئری‌دؤندر",
+       "rollbacklink": "قایتار",
        "rollbacklinkcount": "گیتیرلمه $1  {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه",
        "rollbacklinkcount-morethan": "گیتیرلمه آرتیق $1 {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه",
        "rollbackfailed": "گئری قایتارما اوغورسوزدور",
        "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": "[[User:$1|$1]] ایله ائدیلمیش سون نوسخه‌یه، بیر گیزلی ایستیفاده‌چی طرفین‌دن قایتاریلان دییشیکلیک‌لر",
+       "revertpage-nouser": "{{GENDER:$1|[[User:$1|$1]]}} ایله ائدیلمیش سون نوسخه‌یه، بیر گیزلی ایشلدن طرفین‌دن قایتاریلان دییشیکلیک‌لر",
        "rollback-success": "$1 طرفین‌دن ائدیلمیش دییشدیر‌لر گئری قایتاریلدی؛ $2 طرفین‌دن یارادیلمیش سون وئرسیا برپا اولوندو.",
        "sessionfailure-title": "گیریش خطاسی",
        "sessionfailure": "گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛\nبو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.\nلوتفن \"گئری\" گیدین و گئلدیغینیز سایفایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.",
        "protect-locked-blocked": "صحیفه‌نین بلوک‌لو اولدوغو مدتده سیز محافظه سویه‌سینی دییشه بیلمزسینیز.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
        "protect-locked-dblock": "وئریلن‌لر بازاسی کیلیدلی اولدوغو اوچون محافظه سویه‌سی دییشیله بیلمز.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
        "protect-locked-access": "سیزین حسابینیزین محافظه سویه‌سینی دییشمه‌یه ایختیاری یوخ‌دور.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
-       "protect-cascadeon": "بو صحیفه محافظه‌لی‌دیر، چونکی بو صحیفه {{PLURAL:$1|باشقا بیر}} صحیفه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صحیفه‌نین محافظه سویه‌سینی دییش‌دیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.",
+       "protect-cascadeon": "بو صحیفه محافظه‌لی‌دیر، چونکی بو صفحه {{PLURAL:$1|باشقا بیر}} صفحه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صفحه‌نین محافظه سویه‌سینی دییشدیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.",
        "protect-default": "بوتون ایستیفاده‌چی‌لره ایجازه وئر",
        "protect-fallback": "یالنیز «$1» ایجازه‌سی اولان ایستیفاده‌چیلره ایجازه وئر",
        "protect-level-autoconfirmed": "یالنیز اوتوماتیک دوغرولانان ایستیفاده‌چیلره ایجازه وئر",
        "namespace": "آد فضاسی:",
        "invert": "سئچیلنی دؤندر",
        "tooltip-invert": "بو قوتونی علامتله یین تا انتخاب اولان آد فضا سینین ایچری صحیفه لری دییشیک لیک لری(و اوبیری علامتلنمیش فضالار) گیزله نه آدی",
+       "tooltip-whatlinkshere-invert": "سئچیلمیش آدفضاسیندان اولان باغلانتیلاری گیزلتمک اوچون بو قوتویا نیشان قویون.",
        "namespace_association": "علاقه‌لی آد ساحه‌سی",
        "tooltip-namespace_association": "بو قوتونو علامت له ین یالنیز آد بحث فضاسی یا مرتبط اولان آد فضاسی ایله انتخاب اولا",
        "blanknamespace": "(آنا)",
        "contributions": "{{GENDER:$1|ایستیفاده‌چی}} چالیشمالاری",
        "contributions-title": "$1 ایستیفاده‌چی چالیشمالاری",
        "mycontris": "چالیشمالار",
-       "contribsub2": "$1 اوچون ($2)",
+       "contribsub2": "{{GENDER:$3|$1}} اوچون ($2)",
+       "contributions-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
        "nocontribs": "بو موشخصاتا اویغون دییشدیر تاپیلمادی",
        "uctop": "(ایندیکی)",
        "month": "بو آی‌دان (و اؤنجه‌سی):",
        "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-search": "چالیشمالاری آختار",
        "sp-contributions-username": "آی‌پی آدرسی ویا ایستیفاده‌چی آدی:",
        "sp-contributions-toponly": "تکجه سون نوسخه اولان دییشیکلری گؤستر",
+       "sp-contributions-newonly": "یالنیز صفحه یاراتماق دَییشیکلیکلرینی گؤستر",
        "sp-contributions-submit": "آختار",
-       "whatlinkshere": "بو صØ­Û\8cÙ\81Ù\87â\80\8cÛ\8cÙ\87 Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ار",
+       "whatlinkshere": "بو صÙ\81Ø­Ù\87â\80\8cÛ\8cÙ\87 Ø¨Ø§ØºÙ\84اÙ\86تÛ\8câ\80\8cÙ\84ار",
        "whatlinkshere-title": "«$1»-ه باغلانان صحیفه‌لر",
-       "whatlinkshere-page": "صحیفه:",
+       "whatlinkshere-page": "صفحه:",
        "linkshere": "آشاغیداکی صحیفه‌لر '''[[:$1]]'''-ه باغلانیب:",
        "nolinkshere": "'''[[:$1]]'''-ه هئچ بیر صحیفه باغلانماییب‌دیر.",
        "nolinkshere-ns": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''[[:$1]]'''-ه باغلانتی‌سی یوخدور.",
-       "isredirect": "یوللاندیرما صحیفه‌سی",
+       "isredirect": "یوللاندیرما صفحه‌سی",
        "istemplate": "داخیل اولموش",
        "isimage": "فایلا باغلانتی",
        "whatlinkshere-prev": "{{PLURAL:$1|اؤنجه‌کی|اؤنجه‌کی $1}}",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] باغلاندی.<br />\nباخ [[Special:BlockList|آی پی باغلانماق سیاهی‌سی]] باغلانمیش آی پ-لر.",
        "ipb-blockingself": "اؤزونوزو باغلاماق حالیندا سیز.! بونو ائتمک ایستدیگینیزدن اطمینانییز وار می؟",
        "ipb-confirmhideuser": "ایستیفادچینی باغلاماق و دییشدیر سیاهی‌سین‌دان اونون آدینی سیلمک اوزرسینیز. بونو ائتمک ایستدیگینیزدن اطمینانیز وار می؟",
+       "ipb-confirmaction": "بونو ائتمک‌دن آرخایین اولساز، دیب‌ده‌کی «{{int:ipb-confirm}}» قوتوسونا نیشان قویون.",
        "ipb-edit-dropdown": "باغلاما سبب‌لرینی دییشدیر",
        "ipb-unblock-addr": "$1 آچیلدی",
        "ipb-unblock": "ایستیفاده چی نین یا دا آی پی نین آچیلماسی",
        "ipb-blocklist": "مؤوجود بلوکلاری گؤستر",
-       "ipb-blocklist-contribs": "$1 ایستیفاده‌چی فعالیتلری",
+       "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": "بلوکلانمیش ایستیفاده‌چینی آختار",
        "change-blocklink": "بلوکلامانی ديَیشدیر",
        "contribslink": "چالیشمالار",
        "emaillink": "ایمیل گؤندر",
-       "autoblocker": "آوتوماتیک اولا‌راق باغلانمیسینیز. چونکی، قیسا مدت اول سیزین ای پی-عنوانینیز \"آوتوماتیک اولا‌راق بلوکلانمیسینیز. چونکی، قیسا مدت اول سیزین ایپ-اونوانینیز \"[[User:$1|$1]]\" طرفین‌دن ایستیفاده ائدیلمیش‌دیر.\n$1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: \"$2\"",
+       "autoblocker": "یاخینلیقدا سیزین آی‌پی آدرسیز «[[User:$1|$1]]» ایله ایشلدیلمک اوچون، اوتوماتیک اولاراق باغلانیلمیسیز.\n$1-ین وئریلمیش باغلانماق سببی: «$2»",
        "blocklogpage": "باغلاما قئیدلری",
        "blocklog-showlog": "بو ایستیفاده‌چی داها اول بلوکلانمیش‌دیر. بلوکلاما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
        "blocklog-showsuppresslog": "بو ایستیفاده‌چی داها اول باغلانمیش‌دیر. باغلانما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
        "range_block_disabled": "ایداره‌چیلره دیاپازونو بلوکلاماق قاداغاندیر.",
        "ipb_expiry_invalid": "بیتمه واختی سهودیر",
        "ipb_expiry_temp": "گیزلی ایستیفاده‌چی آدی بلوکلاما‌لاری مدت‌سیز اولما‌لی‌دیر.",
-       "ipb_hide_invalid": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ù\87ئسابÛ\8cÙ\86Ù\84Ù\86 Ú¯Û\8cزÙ\84دÛ\8cÙ\84Ù\85Ù\87â\80\8cسÛ\8c Ù\82ئÛ\8cرÛ\8c\85Ù\88Ù\85Ú©Ù\88Ù\86â\80\8cدÙ\88رØ\9b Ø­Ø¯Ø¯Ù\86 Ú\86Ù\88Ø® Ø±Ø¦Ø¯Ø§Ú©Øªه‌سی وار.",
+       "ipb_hide_invalid": "بÙ\88 Ø­Ø³Ø§Ø¨ Ø¨Ø§Ø³Ø¯Û\8cرÛ\8cÙ\84اÙ\86Ù\85ادÛ\8cØ\9b Ø§Ù\88Ù\86Ù\88 {{PLURAL:$1|بÛ\8cردÙ\86|$1-دÙ\86}} Ú\86Ù\88Ø® Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85ه‌سی وار.",
        "ipb_already_blocked": "\"$1\" آرتیق بلوکلانیب",
        "ipb-needreblock": "$1 آرتیق باغلانیب.\nباغلاما شرط‌لرینی دییشمک ایستییرسینیز؟",
        "ipb-otherblocks-header": "آیری {{PLURAL:$1|باغلانماا|باغلاما‌لار}}",
        "thumbnail_gd-library": "' 'قئید:' صحیفه‌لرین بوتون کئچمیشینی بو فورملا خاریجه اؤتورولمه‌سی، پئرفورمانس سبب‌لرین‌دن اؤتری دؤوره خاریجی بوراخیلمیش‌دیر.$1",
        "thumbnail_image-missing": "بئله گؤرونور کی، $1 فایلی یوخ‌دور",
        "import": "صحیفه‌لری ایدخال ائت",
-       "importinterwiki": "ویکیلر اراسی چیخارما",
-       "import-interwiki-text": "ایچه کؤچورمک اوچون بیر wiki و صحیفه باش‌لیغی سئچین.\nرئویزیون تاریخ‌لری و یازارلارین آدلاری قورونا‌جاق.\nبوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.",
+       "importinterwiki": "آیری ویکی‌دن ایچری گتیرمک",
+       "import-interwiki-text": "ایچری گتیرمک اوچون بیر ویکی و صفحه باشلیغی سئچین.\nنوسخه تاریخلری و یازارلارین آدلاری قورونا‌جاق.\nآیری ویکیلردن بوتون ایچری گتیرمه‌لر، [[Special:Log/import|ایچری گتیرمک ثبت‌لرین‌ده]] یازیلیر.\nبوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.",
+       "import-interwiki-sourcewiki": "قایناق ویکی:",
        "import-interwiki-sourcepage": "قایناق صفحه:",
        "import-interwiki-history": "صحیفه‌نین دییشمه تاریخچه‌لری‌نین هامی‌سینی کؤچور",
        "import-interwiki-templates": "بوتون شابلون‌لارلا بیرلیکده",
        "importuploaderrortemp": "ایچه کؤچورولن فایلین یوکلنمه‌سی اوغورسوز اولدو.\nمووققتی فایل ایتکین.",
        "import-parse-failure": "اکس ام ال ایچری کؤچورمه ییغماسی موفقیت‌سیز",
        "import-noarticle": "یوکلمگه صحیفه یوخدور!",
-       "import-nonewrevisions": "بوتون نوسخه لر اول‌دن ایچه کؤچورولموش.",
+       "import-nonewrevisions": "هئچ نوسخه ایچری گتیریلمه‌دی (هامیسی اؤنجه‌دن واریدیلار، یوخسا خطا قاباغا گلماغا گؤره آتلانیلدیلار).",
        "xml-error-string": "$1 $2 سترینده، $3 سوتونوندا ($4 بایت): $5",
        "import-upload": "XML-وئریلنی یوکله",
        "import-token-mismatch": "سئانس معلومات‌لارینین ایتیریلمه‌سی. لطفاً، یئنی‌دن جهد ائدین.",
        "import-invalid-interwiki": "گؤستریلن ویکی‌دن کؤچورمک مومکون دئییل",
-       "import-error-edit": "\"$1\" صحیفه‌سی ایدخال ائدیله بیلینمیر، چونکی اونو دییشمک سلاهیتینیز یوخ‌دور.",
-       "import-error-create": "\"$1\" صحیفه‌سی آچیلمیر، چونکی اونو یاراتماق سلاهیتینیز یوخ‌دور.",
-       "import-error-interwiki": "صحیفه \"$1\" داخیل ائدیلممیش‌دیر. چونکی اونون خاریجی باغلانتی سی (interwiki) یئری توتولوب و رئزرو اولوب.",
-       "import-error-special": "صحیفه «$1» ایچری توکمه اولنمادی، نیه کی بیر اجازه سیز آد ین فضاسینا تعلوقو وار.",
-       "import-error-invalid": "صحÛ\8cÙ\81Ù\87 \"$1\" Ø§Ø¹ØªØ¨Ø§Ø± Ø³Û\8cز Ø§Ù\88Ù\84Ù\85اÙ\82 Ø¯Ù\84Û\8cÙ\84 Ø§Ù\88Ú\86Ù\88Ù\86 Ø¢Ø¯Û\8c Ø¯Ø§Ø®Û\8cÙ\84 Ø§Ù\88Ù\84Ù\86Ù\85Ù\88ر.",
+       "import-error-edit": "سیزین «$1» صفحه‌سینی دَییشدیرمک ایجازه‌نیز اولمادیغینا گؤره، بو صفحه ایچری گتیریلمه‌دی.",
+       "import-error-create": "سیزین «$1» صفحه‌سینی یاراتماق ایجازه‌نیز اولمادیغینا گؤره، بو صفحه ایچری گتیریلمه‌دی.",
+       "import-error-interwiki": "«$1» صفحه‌نین آدی، خاریجی باغلانتی (interwiki) قورماغا رِزِرو اولدوغو اوچون، ایچری گتیریلمه‌دی.",
+       "import-error-special": "«$1» صفحه، صفحه‌لره ایجازه وئرمه‌ین اؤزل بیر آدفضاسیندا یئر آلدیغینا گؤره، ایچری گتیریلمه‌دی.",
+       "import-error-invalid": "بÙ\88 Ù\88Û\8cÚ©Û\8câ\80\8cدÙ\87 Ø¢Ø¯Û\8c Ú¯Ø¦Ú\86رسÛ\8cز Ø§Ù\88Ù\84دÙ\88غÙ\88Ù\86ا Ú¯Ø¤Ø±Ù\87Ø\8c Â«$1» ØµÙ\81Ø­Ù\87â\80\8cسÛ\8c Ø§Û\8cÚ\86رÛ\8c Ú¯ØªÛ\8cرÛ\8cÙ\84Ù\85Ù\87â\80\8cدÛ\8c.",
        "import-error-unserialize": "«$1» صحیفه‌سینین $2 نوسخه‌سی سِریالیزه‌لیقدان چیخاردیلانمادی. بو نوسخه، $4 کیمی سِریالیزه اولان $3 مودِلینی ایشلدمگه بیلدیریلدی.",
        "import-options-wrong": "{{PLURAL:$2|جزئیات| جزئیات}} یانلیش: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "وئریلن کؤک صحیفه‌‌سی اعتبارسیز آددیر.",
        "import-rootpage-nosubpage": "آد فضا سی  \"$1\" آنا باسئ ٔآلت صحیفه اوچون اجازه وئرمیر.",
        "importlogpage": "چیخاریلما گونده‌لیگی",
        "importlogpagetext": "باشقا ویکیلردن، دَییشیکلیک گئچمیشلریله بیرلیک‌ده گتیریلمیش صحیفه‌لر.",
-       "import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه",
-       "import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه",
+       "import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
+       "import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "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-userpage": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c صفحه‌نیز",
+       "tooltip-pt-userpage": "اÛ\8cØ´Ù\84دÙ\86 صفحه‌نیز",
        "tooltip-pt-anonuserpage": "سیز او آی‌پی آدرسیله دَییشیکلیک ائتدیگینیز ایستیفاده‌چی صحیفه‌سی",
-       "tooltip-pt-mytalk": "دانیشیق صحیفه‌نیز",
+       "tooltip-pt-mytalk": "دانیشیق صفحه‌نیز",
        "tooltip-pt-anontalk": "بو آی‌پی آدرسینین دَییشیکلیکلرینه گؤره دانیشیق",
        "tooltip-pt-preferences": "ترجیحلرینیز",
        "tooltip-pt-watchlist": "دییشمکلرینی ایزله‌دیگینیز صفحه‌لرین سیاهی‌سی",
        "tooltip-pt-logout": "چیخیش",
        "tooltip-pt-createaccount": "سیزدن دعوت اولونور ایشلدن حسابی آچیب و گیریش ائده سیز،آنجاق حساب یارتماق اختیاری دیر.",
        "tooltip-ca-talk": "ایچینده‌کیلره گؤره دانیشیق",
-       "tooltip-ca-edit": "سیز بو صحیفه‌نی دَییشدیره بیلرسینیز. لوطفاً قئید ائتمه‌دن اونجه اؤن‌گؤستریش دویگه‌سینی ایشلدین",
+       "tooltip-ca-edit": "سیز بو صفحه‌نی دَییشدیره بیلرسینیز. لطفاً قئید ائتمه‌دن قاباق اؤن‌گؤستریش دوگمه‌سینی ایشلدین",
        "tooltip-ca-addsection": "یئنی بؤلوم یارات",
        "tooltip-ca-viewsource": "بو صحیفه‌‌ قورونوب‌دور.\nاونون قایناغینا باخا بیلرسیز",
-       "tooltip-ca-history": "بو صحیفه‌نین گئچمیش نوسخه‌لری",
+       "tooltip-ca-history": "بو صفحه‌نین گئچمیش سۆروم‌لری",
        "tooltip-ca-protect": "بو صحیفه‌نی قورو",
        "tooltip-ca-unprotect": "بو صحیفه‌نین قوروماسینی دَییشدیر",
        "tooltip-ca-delete": "بو صحیفه‌‌نی سیل",
        "tooltip-ca-undelete": "بو صحیفه‌‌نین محافظه‌‌سینی کنارلاشدیر",
        "tooltip-ca-move": "بو صحیفه‌‌نین آدینی ديَیشدیر",
-       "tooltip-ca-watch": "بو صحیفه‌‌نی ایزله",
+       "tooltip-ca-watch": "بو صفحه‌‌نی ایزله",
        "tooltip-ca-unwatch": "بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیرین",
        "tooltip-search": "{{SITENAME}}-دا آختار",
-       "tooltip-search-go": "اولورسا بو آددا بیر صحیفه‌یه گئت",
-       "tooltip-search-fulltext": "بو یازی اولان صحیفه‌لری آختار",
+       "tooltip-search-go": "اولورسا بو آددا بیر صفحه‌یه گئت",
+       "tooltip-search-fulltext": "بو یازی اولان صفحه‌لری آختار",
        "tooltip-p-logo": "آنا صفحه‌یه باخ",
-       "tooltip-n-mainpage": "آنا صحیفه‌‌یه باخین",
+       "tooltip-n-mainpage": "آنا صفحه‌‌یه باخین",
        "tooltip-n-mainpage-description": "آنا صفحه‌یه باخ",
        "tooltip-n-portal": "پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز",
-       "tooltip-n-currentevents": "ایندیکی اولایÙ\84ارا Ø§Û\8cÙ\84Ú¯Û\8cÙ\84Û\8c Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84ر ØªØ§Ù¾",
+       "tooltip-n-currentevents": "ایندیکی اولایâ\80\8cÙ\84ارا Ø§Û\8cÙ\84Ú¯Û\8cÙ\84Û\8c Ø¨Û\8cÙ\84Ú¯Û\8câ\80\8cÙ\84ر ØªØ§Ù¾",
        "tooltip-n-recentchanges": "بو ویکی‌ده سون دَییشیکلرین لیستی",
-       "tooltip-n-randompage": "بیر راست‌گله صحیفه گتیر",
+       "tooltip-n-randompage": "بیر راست‌گله صفحه گتیر",
        "tooltip-n-help": "آنلاماق یئری",
-       "tooltip-t-whatlinkshere": "بورایا باغلانان بوتون ویکی صحیفه‌لرین لیستی",
-       "tooltip-t-recentchangeslinked": "بو صحیفه‌دن باغلانان صحیفه‌لرین سون دَییشیکلیکلری",
+       "tooltip-t-whatlinkshere": "بورایا باغلانان بوتون ویکی صفحه‌لرین لیستی",
+       "tooltip-t-recentchangeslinked": "بو صفحه‌دن باغلانان صفحه‌لرین سون دَییشیکلیک‌لری",
        "tooltip-feed-rss": "بو صحیفه‌‌ اوچون آراس‌اس يايیمی",
        "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-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-special": "بو بیر اؤزل صفحه‌دیر، سیز اونو دَییشدیره بیلمزسیز",
        "tooltip-ca-nstab-project": "پروژه صحیفه‌سینه باخ",
-       "tooltip-ca-nstab-image": "فايل صحیفه‌‌سینه باخین",
+       "tooltip-ca-nstab-image": "فايل صفحه‌‌سینه باخین",
        "tooltip-ca-nstab-mediawiki": "سیستم مئساژلرینه باخ",
        "tooltip-ca-nstab-template": "شابلونا باخ",
        "tooltip-ca-nstab-help": "یاردیم صحیفه‌‌سی",
        "tooltip-watchlistedit-raw-submit": "ایزلدیگیم صحیفه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی",
        "tooltip-recreate": "اول سیلینمه‌سینه باخمایا‌راق صحیفنی برپا ائت",
        "tooltip-upload": "یوکلمنی باشلات",
-       "tooltip-rollback": "سÙ\88Ù\92Ù\86Ù\88Ù\86جÙ\88 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø·Ø±Ù\81Û\8cÙ\86دÙ\86 Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Û\8cØ´ Ø¨Û\86تÙ\88Ù\86 Ø¯Ù\8aÙ\8eÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©لری بیر دفعه‌‌يه گئری قايتار",
+       "tooltip-rollback": "سÙ\88Ù\92Ù\86Ù\88Ù\86جÙ\88 Ø§Û\8cØ´Ù\84دÙ\86 Ø·Ø±Ù\81Û\8cÙ\86دÙ\86 Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Û\8cØ´ Ø¨Û\86تÙ\88Ù\86 Ø¯Ù\8aÙ\8eÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©â\80\8cلری بیر دفعه‌‌يه گئری قايتار",
        "tooltip-undo": "ائدیلمیش ديَیشیکلیگی گئری قايتار و گئری قايتارما سببینی قئيد ائتمک اۆچون سێناق گؤستریشینی آچ",
        "tooltip-preferences-save": "ترجیحلری ساخلا",
        "tooltip-summary": "قیسا بیر خولاصه‌‌ یازین",
        "pageinfo-length": "صحیفه‌‌ اوزونلوغو (بايت)",
        "pageinfo-article-id": "صحیفه آی‌دی-سی",
        "pageinfo-language": "صحیفه مضمونونون دیلی",
-       "pageinfo-robot-policy": "آختارÛ\8cØ´ Ø³Û\8cستÙ\85Û\8cÙ\86 Ø¯Ù\88رÙ\88Ù\85Ù\88",
-       "pageinfo-robot-index": "سÛ\8cÛ\8cاÙ\87Ù\87 Ø¢Ù\84Û\8cÙ\86Û\8cØ´ی",
-       "pageinfo-robot-noindex": "ایندِکسله‌نه بیلمز",
+       "pageinfo-robot-policy": "بÙ\88تÙ\84ارÙ\84ا Ø§Û\8cÙ\86دÙ\90کسÙ\84Ù\86Û\8cر",
+       "pageinfo-robot-index": "اÛ\8cجازÙ\87â\80\8cÙ\84ی",
+       "pageinfo-robot-noindex": "ایجازه‌سیز",
        "pageinfo-watchers": "صحیفه‌نین تاماشا‌چی سایی",
        "pageinfo-few-watchers": "$1-دن آز {{PLURAL:$1|ایزله‌ین}}",
-       "pageinfo-redirects-name": "بو صحیفه‌یه یول‌لاندیرمالار",
+       "pageinfo-redirects-name": "بو صحیفه‌یه یول‌لاندیرما سایی‌سی",
        "pageinfo-subpages-name": "بو صحیفه‌نین آلت‌صحیفه‌لری",
        "pageinfo-subpages-value": "$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} قِیری-یول‌لاندیرما)",
        "pageinfo-firstuser": "صحیفنی یارا‌دان",
        "pageinfo-hidden-categories": "گیزلی {{PLURAL:$1|بؤلمه|بؤلمه‌لر}} ($1)",
        "pageinfo-templates": "ایشله‌دیلمیش {{PLURAL:$1|بیر|$1}} شابلون ($1)",
        "pageinfo-transclusions": "ایچینده گلن {{PLURAL:$1|صحیفه|صحیفه‌لر}} ($1)",
-       "pageinfo-toolboxlink": "صحیفه بیلگی‌سی",
+       "pageinfo-toolboxlink": "صفحه بیلگی‌سی",
        "pageinfo-redirectsto": "ایستیقامتلن‌دیریلن",
        "pageinfo-redirectsto-info": "بیلگی",
        "pageinfo-contentpage": "بیر مزمون صحیفه‌سی ساییلیر",
        "newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
        "newimages-legend": "سۆزگَج",
        "newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
+       "newimages-showbots": "بوت یوکله‌مه‌لرینی گؤستر",
        "noimages": "هئچ نیی گؤرممک.",
        "ilsubmit": "آختار",
        "bydate": "تاریخین اوستوندن",
        "sunday-at": "یکشنبه، $1",
        "yesterday-at": "دونن $1",
        "bad_image_list": "فورمت بئله اولمالیدیر:\n\nيالنیز لیست آیتِملری (* ایله باشلايان سطرلر) نظره آلینیر.\nسطرده‌کی ایلک باغلانتی، بیر پیس فایلا باغلانان اولمالیدیر.\nائله بو سطرده سونراکی باغلانتیلار استثنا حساب اولونور. مثلاً، فايل صحیفه‌ده سطرین ایچینده گؤرونه بیلر.",
-       "metadata": "مِتابیلگیلر",
+       "metadata": "مِتابیلگیلر",
        "metadata-help": "بۇ فايلدا فوْتوْاپارات و يا سکانئرله علاوه‌‌ اوْلونموش معلوماتلار وار. اگر فايل سوْنرادان دَییشدیریلیبسه، بعضی پارامئترلر بۇ شکیلده گؤستریلنلردن فرقلی اوْلا بیلر.",
        "metadata-expand": "جزئیات معلومات‌لاری گؤستر",
        "metadata-collapse": "جزئیات معلومات‌لاری گیزلت",
        "exif-software": "پروقرام تمیناتی",
        "exif-artist": "یازار",
        "exif-copyright": "یازانلار حقوقو صاحبی",
-       "exif-exifversion": "exif نوسخه سی",
+       "exif-exifversion": "exif سۆرومو",
        "exif-flashpixversion": "دستک‌لنن Flashpix نوسخه سی",
        "exif-colorspace": "رنگ ساحه‌سی",
        "exif-componentsconfiguration": "هر بیلشنین معناسی",
        "exif-compression-3": "رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳",
        "exif-compression-4": "رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ 4",
        "exif-copyrighted-true": "مؤلف‌لیک حقوقو ایله قورونور",
-       "exif-copyrighted-false": "عمومی دامنه",
+       "exif-copyrighted-false": "کوپی‌رایت وضعیتی بلیرتیلمه‌میش",
        "exif-unknowndate": "تانینمامیش تاریخ",
        "exif-orientation-1": "نورمال",
        "exif-orientation-2": "یاتای چئویریلیب",
        "confirm-watch-top": "بو صفحه‌نی ایزله‌دیکلرینیزه آرتیریلدی",
        "confirm-unwatch-button": "اولدو",
        "confirm-unwatch-top": "بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیریلدی",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "&larr; اولکی صحیفه‌‌",
        "imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
        "imgmultigo": "گئت!",
        "imgmultigoto": "$1 صحیفه‌‌يه گئت",
        "img-lang-default": "(وارساییلان دیل)",
+       "img-lang-info": "بو عکسی $1-ده گؤستر. $2",
        "img-lang-go": "گئت",
        "ascending_abbrev": "آرتما سیراسینا گؤره",
        "descending_abbrev": "آزالما سیراسینا گؤره",
        "autosumm-replace": "صحیفه‌‌نین مظمونو ' $1' يازیسی ایله ديَیشدیریلدی",
        "autoredircomment": "[[$1]] صحیفه‌‌سینه ایستیقامتلندیریلیر",
        "autosumm-new": "صحیفه‌‌نی ' $1' ایله يارات",
+       "autosumm-newblank": "بوش صحفه یاراندی",
        "lag-warn-normal": "$1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌ده}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرولمه‌يه.",
        "lag-warn-high": "وئریلنلر بازاسی سونوجوسونداکی هددیندن آرتیق گئجیکمه‌دن گؤره، $1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌دن}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرونمئيئبیلیر.",
        "watchlistedit-normal-title": "ایزله‌دیگیم صحیفه‌‌لری دَییشدیر",
        "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": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
+       "version-poweredby-translators": "مترجیم لری translatewiki.net",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "version-license-info": "مئدیاویکی بیر اؤزگور یازیلیم‌دیر؛ سیز اونو، اؤزگور یازیلیم قورولوشو یایان GNU گنل عمومی لیسانسی اساسی‌له یئنی‌دن داغیدیب یوخسا دَییشه بیلرسینیز؛ یا لیسانسین ۲-نجی نوسخه‌سی، یا دا (اؤز سئچدیگینیزله) هر هانکی سونراکی نوسخه‌سی.\n\nمئدیاویکی، فایدالی اولماق اومودویله داغینیب‌دیر، اما هئچ قارانتی‌سی یوخدور؛ حتی تیجارت یا بیر ایشه اویغون اولماق قارانتی‌سی ده یوخدور.باشقا بیلگیلر اوچون GNU گنل عمومی لیسانسینا باخین.\n\nسیز گرک بو یازیلیم‌لا، [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU گنل عمومی لیسانسی]نین بیر نوسخه‌نی‌ده آلمیش اولاسینیز؛ ائله اولماسا، [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اونو آنلاین اوخویون]، یوخسا اؤزگور یازیلیم قورولوشونا بو آدرس‌ده یازین: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301",
        "version-software": "يوکلو پروقرام",
        "version-entrypoints": "گیریش نقطه‌‌سی‌نین آدرسی",
        "version-entrypoints-header-entrypoint": "گیریش نقطه‌‌سی",
        "version-entrypoints-header-url": "اینترنت آدرسی",
-       "redirect": "فایل، ایستیفاده‌چی یا نوسخه ID-سی ایله یول‌لاندیرما",
+       "version-libraries": "نصب اولونموش کیتابخانا",
+       "version-libraries-library": "کیتاب‌ائوی",
+       "version-libraries-version": "نوسخه‌",
+       "redirect": "فایل، ایستیفاده‌چی، صفحه یا نوسخه آی‌دی-سی ایله یول‌لاندیرما",
        "redirect-legend": "بیر فایل یا صحیفه‌یه یول‌لاندیرما",
-       "redirect-summary": "بو اؤزل صحیفه، بیر فایلا (فایل آدی ایله)، صحیفه‌یه (نوسخه ID-سی ایله) یا ایستیفاده‌چی صحیفه‌سینه (ایستیفاده‌چی نومره ID-سی ایله) یول‌لاندیریر.",
+       "redirect-summary": "بو اؤزل صحیفه، بیر فایلا (فایل آدی ایله)، صفحه‌یه (نوسخه یا صفحه آی‌دی-سی ایله) یا ایستیفاده‌چی صفحه‌سینه (ایستیفاده‌چی نومره آی‌دی-سی ایله) یول‌لاندیریر. ایشلتمک: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]]، یا [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "گئت",
        "redirect-lookup": "آختار:",
        "redirect-value": "دَگَر:",
        "redirect-user": "ایستیفاده‌چی ID",
+       "redirect-page": "صفحه کیملیگی",
        "redirect-revision": "صحیفه نوسخه‌سی",
        "redirect-file": "فایل آدی",
        "redirect-not-exists": "دَگَر تاپیلمادی",
        "fileduplicatesearch-result-1": "«$1» فایلینین هئچ بیر عینی کوپیسی یوخدور.",
        "fileduplicatesearch-result-n": "«$1» فایلینین، {{PLURAL:$2|بیر|$2}} عینی کوپیسی واردیر.",
        "fileduplicatesearch-noresults": "\"$1\" آدیندا فایل تاپیلمادی.",
-       "specialpages": "اؤزل صحیفه‌لر",
-       "specialpages-note": "* نورمال اؤزل صحیفه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صحیفه‌لر.</span>",
+       "specialpages": "اؤزل صفحه‌لر",
+       "specialpages-note": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
        "specialpages-group-maintenance": "جاری مروزه‌لر",
        "specialpages-group-other": "دیگر خصوصی صحیفه‌لر",
        "specialpages-group-login": "گیریش / حساب یاراد",
        "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-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
+       "tags-create-submit": "یارات",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
        "compare-page1": "صحیفه 1",
        "compare-page2": "صحیفه 2",
        "compare-revision-not-exists": "بَلیرتدیگینیز نوسخه یوخدور.",
        "dberr-problems": "عوذر ایسته‌ییریک! بو سایت‌دا تِکنیکی ایشکال‌لار واردیر.",
        "dberr-again": "بیر نئچه دقیقه دؤزوب سونرا یئنی‌دن یوکله‌یین.",
-       "dberr-info": "(دیتابیس خیدمت‌چیسی‌یه باغلانماق اولونمادی: $1)",
+       "dberr-info": "(دیتابیسه باغلانماق اولونمادی: $1)",
        "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": "بÛ\8cر Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c حسابی $1 {{GENDER:$2|یاراتدی}}",
+       "logentry-newusers-create": "بÛ\8cر Ø§Û\8cØ´Ù\84دÙ\86 حسابی $1 {{GENDER:$2|یاراتدی}}",
        "logentry-newusers-create2": "$1 ایستیفاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}",
        "logentry-newusers-byemail": "$3 ایستیفاده‌چی حسابی، $1 ایله {{GENDER:$2|یارادیلیب}} و رمز، ایمیل ایله گؤندریلیب‌دیر",
        "logentry-newusers-autocreate": "$1 ایستیفاده‌چی حسابی اوتوماتیک {{GENDER:$2|یارادیلدی}}",
index c1b6145..a2797a4 100644 (file)
        "history-feed-description": "Гісторыя зьменаў гэтай старонкі",
        "history-feed-item-nocomment": "$1 у $2",
        "history-feed-empty": "Запатрабаванай старонкі не існуе.\nМагчыма, яна была выдаленая альбо яе перанесьлі.\nПаспрабуйце [[Special:Search|пашукаць]] падобныя старонкі.",
+       "history-edit-tags": "Рэдагаваць меткі абраных вэрсіяў",
        "rev-deleted-comment": "(апісаньне зьменаў выдаленае)",
        "rev-deleted-user": "(імя ўдзельніка выдаленае)",
        "rev-deleted-event": "(падрабязнасьці выдаленыя з журнала падзеяў)",
        "rev-showdeleted": "паказаць",
        "revisiondelete": "Выдаліць/аднавіць вэрсіі",
        "revdelete-nooldid-title": "Ня выбрана мэтавая вэрсія",
-       "revdelete-nooldid-text": "Вы ня выбралі мэтавую вэрсію (ці вэрсіі) для выкананьня гэтай функцыі, выбранай вэрсіі не існуе альбо Вы спрабуеце схаваць цяперашнюю вэрсію.",
+       "revdelete-nooldid-text": "Вы ня выбралі мэтавую вэрсію для выкананьня гэтай функцыі, выбранай вэрсіі не існуе альбо Вы спрабуеце схаваць цяперашнюю вэрсію.",
        "revdelete-no-file": "Пазначаны файл не існуе.",
        "revdelete-show-file-confirm": "Вы ўпэўненыя, што жадаеце паглядзець выдаленую вэрсію файла «<nowiki>$1</nowiki>» ад $2 $3?",
        "revdelete-show-file-submit": "Так",
        "prevn": "{{PLURAL:$1|папярэдняя|папярэднія|папярэднія}} $1",
        "nextn": "{{PLURAL:$1|наступная|наступныя|наступныя}} $1",
        "prev-page": "папярэдняя старонка",
+       "next-page": "наступная старонка",
        "prevn-title": "{{PLURAL:$1|Папярэдні $1 вынік|Папярэднія $1 вынікі|Папярэднія $1 вынікаў}}",
        "nextn-title": "{{PLURAL:$1|Наступны $1 вынік|Наступныя $1 вынікі|Наступныя $1 вынікаў}}",
        "shown-title": "Паказваць $1 {{PLURAL:$1|вынік|вынікі|вынікаў}} на старонцы",
        "emailccsubject": "Копія Вашага ліста да $1: $2",
        "emailsent": "Ліст адасланы",
        "emailsenttext": "Ваш ліст быў адасланы.",
-       "emailuserfooter": "Гэты ліст быў дасланы ўдзельнікам $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «Даслаць ліст» {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "emailuserfooter": "Гэты ліст быў дасланы {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $1 да {{GENDER:$2|ўдзельніка|ўдзельніцы}} $2 з дапамогай функцыі «{{int:emailpage}}» {{GRAMMAR:родны|{{SITENAME}}}}.",
        "usermessage-summary": "Паведамленьне пра выхад з сыстэмы.",
        "usermessage-editor": "Дастаўка сыстэмных паведамленьняў",
        "watchlist": "Сьпіс назіраньня",
        "import-interwiki-history": "Капіяваць гісторыю старонкі цалкам",
        "import-interwiki-templates": "Уключыць усе шаблёны",
        "import-interwiki-submit": "Імпартаваць",
-       "import-interwiki-namespace": "Мэтавая прастора назваў:",
-       "import-interwiki-rootpage": "Мэтавая карнявая старонка (неабавязкова):",
        "import-upload-filename": "Назва файла:",
        "import-comment": "Камэнтар:",
        "importtext": "Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].\nЗахавайце яго на свой кампутар, а потым загрузіце сюды.",
        "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|выяўленае наступнае папярэджаньне|выяўленыя наступныя папярэджаньні}}:",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
index 836a20c..1583472 100644 (file)
        "revdelete-unsuppress": "Зняць абмежаванні на адноўленыя версіі",
        "revdelete-log": "Прычына:",
        "revdelete-submit": "Прымяніць да азначан{{PLURAL:$1|ай ерсіі|ых версій}}",
-       "revdelete-success": "<strong>Паспяхова абноўлена бачнасць версіі.</strong>",
+       "revdelete-success": "Паспяхова абноўлена бачнасць версіі.",
        "revdelete-failure": "'''Не ўдалося абнавіць бачнасць версіі:'''\n$1",
        "logdelete-success": "'''Бачнасць падзеі настаўленая паспяхова.'''",
        "logdelete-failure": "'''Бачнасць журнала не ўсталявана:'''\n$1",
        "import-interwiki-history": "Капіраваць усе гістарычныя версіі гэтай старонкі",
        "import-interwiki-templates": "Разам з усімі шаблонамі",
        "import-interwiki-submit": "Імпартаваць",
-       "import-interwiki-namespace": "У прастору назваў:",
-       "import-interwiki-rootpage": "Мэтавая каранёвая старонка (неабавязкова):",
        "import-upload-filename": "Назва файла:",
        "import-comment": "Каментарый:",
        "importtext": "Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].\nЗахавайце яго на свой камп'ютар, а потым загрузіце сюды.",
index f86214f..2ab85d2 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Baloch Afghanistan",
-                       "Ibrahim khashrowdi"
+                       "Ibrahim khashrowdi",
+                       "Rachitrali"
                ]
        },
        "tog-underline": "لینکانی جهلگا خط کشیتین",
@@ -77,7 +78,7 @@
        "september": "سیپٹمبر",
        "october": "اکتوبر",
        "november": "نوامبر",
-       "december": "ڈ\tسمبر",
+       "december": "ڈسمبر",
        "january-gen": "جنوری",
        "february-gen": "فیبروری",
        "march-gen": "مارچ",
        "wrongpassword": "ای پاسورد یا چیهر گالا که داخل کورته ایت صحیح نه اینت.\nمهربانی بکنیت، پدا امتحان بکینت.",
        "wrongpasswordempty": "ای پاسورد یا چیهر گالا که داخل کورته ایت ، خالی اینت.\nمهربانی پدا کوشش بکنیت.",
        "passwordtooshort": "پاسورد باید کم شه کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته بیئت.",
+       "passwordtoolong": "پاسورد نه باید گیشتیر شه {{PLURAL:$1|۱ حرف|$1 حرفا}}  داشته بیئت.",
        "password-name-match": "شمی چیهرگال یا پاسورد باید شه شمی کار زورکی ئین ناما فرق داشته بیئت.",
        "password-login-forbidden": "استفاده شه ای کار زوروکی ناما و شه ای چیهرگالا اجازه نه اینت.",
        "mailmypassword": "پاک کورتین پاسوردئ",
        "loginreqpagetext": "په دیگه تاکدیمانئ دیستینا باید  $1.",
        "accmailtitle": "پاسورد دیم داته بوت.",
        "newarticle": "(نوکین)",
+       "newarticletext": "شما یک لینک ئی پدا گیپته ئیت و بي ورّق ئی رسیته ئيت که تا انون موجود نه اینت .\nپه ای ورّق ئی جۆڑ کورتینی خاتیرا، به جهلگین چارگوش ئی تا په نیوشیتین ئا شرو بکنیت (په گیشتیرین مالوماتان [$1 کومک ئی ورّق  ] ئا بگیندیت).\nاگه نالوٹگ ایدا آته ئیت، وتی بروزیر تا «بێرگشت» ئی کیلی ئا پرینچیت.",
        "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}}}} پاک بوته ئین سیاه چال ئی] تا بگیندیت.",
        "revdelete-submit": "اعمال بئ {{PLURAL:$1|نخسه|نخسه هان}} ئی سرا انتخاب بوته",
        "revdelete-success": "'''نخسه ئی ودی بوتین گو کامیابیا اپڈیٹ بوت.'''",
        "revdelete-failure": "'''نخسه ئی ودی بوتینئ اپڈیٹ بوتن امکان وجود نداریت :'''\n$1",
-       "logdelete-success": "<strong>لوگین ئی قابلیت دیست گو کامیابیا انجام بوت.</strong>",
+       "logdelete-success": "لوگین ئی قابلیت دیست گو کامیابیا انجام بوت.",
        "logdelete-failure": "'''لوگین ئی قابلیت دیست تنظیم ئه نه بیئنت:'''\n$1",
        "revdel-restore": "نمایش/نهفتن",
        "pagehist": "تاکدیمی تاریخچه",
        "notextmatches": "هیچ یک شه مقاله ئانی متن مطابقت ندارنت",
        "prevn": "{{PLURAL:$1|$1}}دیمتیری",
        "nextn": "{{PLURAL:$1|$1}}پدتیری",
+       "prev-page": "دیمتیرین تاکدیم",
+       "next-page": "دیگرین تاکدیم",
        "prevn-title": "$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} دیمی",
        "nextn-title": "$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} پدئ",
        "shown-title": "نشان داتین $1 ئی {{PLURAL:$1|نتیجه|نتیجه}} بی هر تاکدیمی تا",
        "recentchangeslinked-feed": "مربوتین تغیراتان",
        "recentchangeslinked-toolbox": "مربوتین تغیراتان",
        "recentchangeslinked-title": "مربوتین تغیراتان گو $1",
+       "recentchangeslinked-summary": "بئ جهلگا یک لڑلیست ئی شه آخیرئین ٹگلان گیندیت که بئ تاکدیما لینک بوته انت (یا چَمّی چیهری شریکین تهر) ئانه گیندیت .\nآ تاکدیمان که [[Special:Watchlist|شمی پدگیری لیست]] ئی تا به ینت '''پررنگ''' نشان داته ئه به ینت.",
        "recentchangeslinked-page": "تاکدیم نام:",
        "recentchangeslinked-to": "نشان داتین تاکدیماني تغیرات که گۆ ای تاکدیما لینک دارنت",
        "upload": "فایلی بُرز کورتین",
        "listfiles-delete": "پاک کورتین",
        "listfiles-summary": "ای خاصین تاکدیم موچین بُرز بوته ئین فایلانه نشان ئه دنت.",
        "listfiles_search_for": "گشتین په میڈیا نام ئا:",
+       "listfiles-userdoesnotexist": "\"$1\" ئی کارمرزوکین هیساب راجیستر نه بوته.",
        "imgfile": "فایل",
        "listfiles": "فایل لیست",
        "listfiles_thumb": "ناحُننک",
        "morelinkstoimage": "ای فایلئ [[Special:WhatLinksHere/$1|دیگرین لینکانا]] بگیندیت.",
        "linkstoimage-redirect": "$1 (فایلی تغیرمسیر) $2",
        "duplicatesoffile": "جهلگی{{PLURAL:$1|فایل|فایلان}} تکرارین نخسه شه ای فایلا  {{PLURAL:$1|است|هستنت}} ([[Special:FileDuplicateSearch/$2|گیشتیرین مئلومات]]):",
+       "sharedupload": "ای ورَق بئ $1 تا اینت و مومکن اینت که دیگه پروژه ئانی تا هم ایستیپاده بیت.",
        "sharedupload-desc-here": "ای فایل بئ $1 ئی تا قرار داریت و ممکن اینت که بئ دیگه پروژه‌هانئ تا هم استفاده بیئت.\nموجودین شرح بئ [$2 فایلی دیمی شرح بئ آ جای تا]، جهلگا نشان داته بوته.",
        "filepage-nofile": "فایلی گۆ ای ناما موجود نه اینت.",
        "filepage-nofile-link": "فایلی گۆ ای ناما موجود نه اینت، اما شما ئه توانیت آیرا [$1 بُرز کنیت].",
        "undelete-show-file-submit": "هان",
        "namespace": "نامی فضا:",
        "invert": "انتخاب سرچپی بیئت",
+       "tooltip-invert": "ای جئبه ئا ئلامت بجنیت تا که پزای نام تا ئین انتخاب بوته ئین تاکدیمانی تغیرات (و دیگرین ئلامت جته بوته ئین پزای نام ئان) چیهر به ینت",
        "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "ای جئبه ئا ئلامت بجنیت تا که مربوتین موزو ئی پزای نامی گپ گۆ\nانتخاب بوته ئین پزای ناما شامل بیت",
        "blanknamespace": "(بُنیادی)",
        "contributions": "{{GENDER:$1|کار زوروک}} ئی شراکت ئان",
        "contributions-title": "$1 ئی کار زوروکئ شراکت ئان",
        "import-interwiki-history": "ای تاکدیمی موچین تاریخچه ئی نخسه انتقال داته بوتنت",
        "import-interwiki-templates": "موچین تراشوانانا شامل بیئت",
        "import-interwiki-submit": "بێ تێ کورتین",
-       "import-interwiki-namespace": "نامی فضای مخصد:",
-       "import-interwiki-rootpage": "مخصدی دیمی ریشگ (اختیاری):",
        "import-upload-filename": "فایلئ نام:",
        "import-comment": "کومنیت:",
        "importstart": "تاکدیمانی بي  تئ ریتینی حالا...",
        "importnopages": "هیچ تاکدیمی په ایمپورت ئا نه اینت.",
        "importfailed": "ایمپورت شکست وارت: <nowiki>$1</nowiki>",
        "importunknownsource": "بُنریچی ئی رقم مئلوم نه اینت",
+       "importcantopen": "تاکدیمانی درون ریچی ئی ورَق پاچ نه بوت",
        "importbadinterwiki": "بدئین انتیرویکی ئی لینک",
        "importsuccess": "بي تی ریتین یا ایمپورت بوت!",
+       "import-parse-failure": "ختا بئ بُرز بوته ئین اکس ام ال ئی تجزیه یی تا",
+       "import-noarticle": "هیچ تاکدیمی په ایمپورت ئا نه اینت.",
        "import-upload": "اکس ام ال ئی دیتای بُرز کورتین",
        "importlogpage": "ایمپورت لوگ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه}} وارد بوته",
        "tooltip-recreate": "پداجۆڑ کورتین تاکدیمی نه دیستین ایشیرا که ای تاکدیم دیما پاک بوته",
        "tooltip-upload": "بُرز کورتینی شرو",
        "tooltip-rollback": "«بیئرگردینتین» ای دیمی آخیرئین ایڈیٹ کنۆک ئی ایڈیٹ(هان) گۆ یک کلیک ئا.",
+       "tooltip-undo": "«خنثی‌کورتین» این دستکاری ئا  خنثی ئه کنیت و دستکاری جئبه ئا بي پیش نمایش ئی رقما پاچ ئه کنیت تا که دلیل ئی ایزاپه کورتین بئ دستکاری خولاسه ئی تا مومکن بیت.",
        "tooltip-preferences-save": "تنظیماتانی ذخیره کورتین",
        "tooltip-summary": "خلاصه ئا داخل بکنیت",
        "anonymous": "زیان نامین {{PLURAL:$1|کار زوروک|کار زوروکان}} شه {{SITENAME}}",
        "sunday-at": "یک‌شنبی $1",
        "yesterday-at": "زئ  بی $1",
        "metadata": "فرادیتا",
+       "metadata-help": "ای ورّک شه وت ایزاپه ئین مالومات داریت که احتمالان گۆ دیجیتالین کامره ئی گیپته بوته یا په ایشی سکن وجۆڑ کورتین ئا شه دیجیتال ئا کار گیپته بوته. اگه ورّک شه وتی اولی ئین حالا تغیرداته داته بوته بیت، مومکن اینت که بي ایشی باره ئا موچین مالومات ئانه نشان مه دنت.",
        "metadata-expand": "تپسیلی ئین مالوماتی نشان داتین",
        "metadata-collapse": "تپسیلی ئین مالوماتی چیهرداتین",
        "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-ycbcrpositioning-1": "مانجین بوتگ",
        "exif-ycbcrpositioning-2": "اشتراکی",
        "exif-dc-contributor": "شراکت کنۆک ئان",
+       "exif-dc-coverage": "رسانگ ئی زمانین یا مکانین محدوده",
        "exif-dc-date": "تاریخ(ئان)",
        "exif-dc-publisher": "ناشر",
        "exif-dc-relation": "مربوتین میڈیاهان",
index 3e003ed..e4ac6ea 100644 (file)
@@ -22,6 +22,7 @@
        "tog-watchdefault": "हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी",
        "tog-watchmoves": "हमरा द्वारा स्थानांतरित पृष्ठ आ लादल फाईल के हमरा ध्यानसूची में जोड़ी",
        "tog-watchdeletion": "हमरा द्वारा मिटावल पृष्ठ फ़ाइलन के हमार ध्यानसूची में जोड़ी",
+       "tog-watchrollback": "हमरा द्वारा प्रत्यापन्न (रोलबैक) करल गइल पन्नन के हमार ध्यानसूची में जोड़ीं।",
        "tog-minordefault": "सारा सम्पादन के छोट सम्पादन के रुप में चिन्हित करीं",
        "tog-previewontop": "सम्पादन बक्सा से पहिले पुर्वदर्शन दिखाईं।",
        "tog-previewonfirst": "पहिलका सम्पादन पर पूर्वावलोकन देखीं",
        "tog-enotifminoredits": "पन्ना आ फाईल पर छोटो परिवर्तन होखे त हमके ई मेल करल जाव",
        "tog-enotifrevealaddr": "अधिसूचना ई-मेल में हमार ई मेल पता दिखावल जाव",
        "tog-shownumberswatching": "ध्यान रखे वालन सदस्यन के देखावल जाव",
-       "tog-oldsig": "वरà¥\8dतमान à¤¹à¤¸à¥\8dताà¤\95à¥\8dषर:",
-       "tog-fancysig": "हसà¥\8dताà¤\95à¥\8dषर के विकी पाठ के रुप में उपयोग करीं (बिना स्वचालित कड़ी के)",
+       "tog-oldsig": "वरà¥\8dतमान à¤¦à¤¸à¤\96त",
+       "tog-fancysig": "दसà¤\96त के विकी पाठ के रुप में उपयोग करीं (बिना स्वचालित कड़ी के)",
        "tog-uselivepreview": "लाइव पुर्वालोकन के प्रयोग करीं",
-       "tog-forceeditsummary": "यदि à¤¸à¤®à¥\8dपादन सारांश ना दिहल होखे त हमके सूचित करब",
-       "tog-watchlisthideown": "हमार à¤§à¥\8dयान à¤¦à¤¿à¤¹à¤² à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤°à¤¾ à¤\96ातिर à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन छिपाईं",
-       "tog-watchlisthidebots": "हमार à¤§à¥\8dयान à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\8bà¤\9f à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\88ल परिवर्तन के छिपाईं",
+       "tog-forceeditsummary": "यदि à¤¸à¤\82पादन सारांश ना दिहल होखे त हमके सूचित करब",
+       "tog-watchlisthideown": "हमरà¥\80 à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¹à¤®à¤¾à¤° à¤\96à¥\81द à¤\95à¥\87 à¤¸à¤\82पादन छिपाईं",
+       "tog-watchlisthidebots": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\8bà¤\9f à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल परिवर्तन के छिपाईं",
        "tog-watchlisthideminor": "हमार ध्यान सूची से छोट परिवर्तन के छुपाईं",
-       "tog-watchlisthideliu": "हमार à¤§à¥\8dयान à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤¨à¤¾ à¤¦à¤¿खाईं",
-       "tog-watchlisthideanons": "आइ॰पी सदस्यन द्वारा करल गइल सम्पादन के हमार ध्यानसूची में न दिखाईं",
-       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\88ल सम्पादन के हमार ध्यानसूची में न दिखाईं",
-       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\88ल à¤\88-मेल के कॉपी हमरो के भेजीं",
-       "tog-diffonly": "अवतरणं में अन्तर दर्शाते समय पुरान अवतरण न दिखाईं",
-       "tog-showhiddencats": "à¤\9bà¥\81पल à¤¶à¥\8dरà¥\87णà¥\80यन à¤\95à¥\87 दिखाईं",
-       "tog-norollbackdiff": "समà¥\8dपादन वापस लेला के बाद अन्तर न दिखाईं",
-       "tog-useeditwarning": "यदि à¤\95à¤\89नà¥\8b à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤®à¥\8dपादन à¤\95रतà¥\87 à¤¸à¤®à¤¯ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¤\87लà¥\87 à¤\9bà¥\8bड़ à¤¦à¤¿à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95रब।",
-       "tog-prefershttps": "à¤\9cब à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\80à¤\82 à¤¤ à¤¹à¤®à¥\87शा à¤¸à¥\81रà¤\95à¥\8dषित à¤\95नà¥\87à¤\95à¥\8dशन à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82",
+       "tog-watchlisthideliu": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन à¤®à¤¤ à¤¦à¥\87खाईं",
+       "tog-watchlisthideanons": "आइ॰पी॰ सदस्यन द्वारा करल गइल सम्पादन के हमार धियानसूची में न दिखाईं",
+       "tog-watchlisthidepatrolled": "à¤\9cाà¤\81à¤\9aल à¤\97à¤\87ल सम्पादन के हमार ध्यानसूची में न दिखाईं",
+       "tog-ccmeonemails": "हमरा à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤­à¥\87à¤\9cल à¤\97à¤\87ल à¤\88मेल के कॉपी हमरो के भेजीं",
+       "tog-diffonly": "अवतरण कुल में अन्तर देखावत समय पुरान अवतरण न दिखाईं",
+       "tog-showhiddencats": "à¤\9bà¥\81पल à¤¶à¥\8dरà¥\87णियन à¤\95à¥\87 à¤­à¥\80 दिखाईं",
+       "tog-norollbackdiff": "सà¤\82पादन वापस लेला के बाद अन्तर न दिखाईं",
+       "tog-useeditwarning": "यदि à¤\95à¤\89नà¥\8b à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¤\87लà¥\87 à¤\9bà¥\8bड़ à¤¦à¤¿à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95à¤\87ल à¤\9cाय",
+       "tog-prefershttps": "à¤\9cब à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤\95रà¥\80à¤\82 à¤¤ à¤¹à¤®à¥\87शा à¤¸à¥\81रà¤\95à¥\8dषित à¤\95नà¥\87à¤\95à¥\8dशन à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95à¤\87ल à¤\9cाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
-       "underline-default": "तà¥\8dवà¤\9aा या ब्राउजर डिफॉल्ट",
-       "editfont-style": "समà¥\8dपादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\95à¥\87 à¤«à¥\89नà¥\8dà¤\9f à¤¸à¥\8dà¤\9fाà¤\88ल:",
-       "editfont-default": "बà¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89ल्ट",
+       "underline-default": "à¤\9cिलà¥\8dद या ब्राउजर डिफॉल्ट",
+       "editfont-style": "समà¥\8dपादन à¤\95à¥\8dषà¥\87तà¥\8dर à¤\95à¥\87 à¤«à¥\89नà¥\8dà¤\9f à¤¸à¥\8dà¤\9fाà¤\87ल:",
+       "editfont-default": "बà¥\8dराà¤\89à¤\9cर à¤¡à¤¿à¤«à¤¾ल्ट",
        "editfont-monospace": "मोनोस्पेस्ड फोंट",
        "editfont-sansserif": "सन्स-सेरिफ फॉन्ट",
        "editfont-serif": "सेरिफ फॉन्ट",
        "january": "जनवरी",
        "february": "फरवरी",
        "march": "मार्च",
-       "april": "à¤\85पà¥\8dरिल",
+       "april": "à¤\85पà¥\8dरà¥\88ल",
        "may_long": "मई",
        "june": "जून",
        "july": "जुलाई",
        "august": "अगस्त",
-       "september": "सितमà¥\8dबर",
+       "september": "सितà¤\82बर",
        "october": "अक्टूबर",
-       "november": "नवमà¥\8dबर",
-       "december": "दिसमà¥\8dबर",
+       "november": "नवà¤\82बर",
+       "december": "दिसà¤\82बर",
        "january-gen": "जनवरी",
        "february-gen": "फरवरी",
        "march-gen": "मार्च",
-       "april-gen": "à¤\85पà¥\8dरिल",
+       "april-gen": "à¤\85पà¥\8dरà¥\88ल",
        "may-gen": "मई",
        "june-gen": "जून",
        "july-gen": "जुलाई",
        "august-gen": "अगस्त",
-       "september-gen": "सितमà¥\8dबर",
+       "september-gen": "सितà¤\82बर",
        "october-gen": "अक्टूबर",
-       "november-gen": "नवमà¥\8dबर",
-       "december-gen": "दिसमà¥\8dबर",
+       "november-gen": "नवà¤\82बर",
+       "december-gen": "दिसà¤\82बर",
        "jan": "जन",
        "feb": "फर",
        "mar": "मार्च",
-       "apr": "à¤\85पà¥\8dरिल",
+       "apr": "à¤\85पà¥\8dरà¥\88",
        "may": "मई",
        "jun": "जून",
        "jul": "जुल",
        "nov": "नव",
        "dec": "दिस",
        "january-date": "जनवरी $1",
-       "february-date": "फ़रवरà¥\80 $1",
+       "february-date": "फरवरी $1",
        "march-date": "मार्च $1",
        "april-date": "अप्रैल $1",
        "may-date": "मई $1",
        "june-date": "जून $1",
        "july-date": "जुलाई $1",
        "august-date": "अगस्त $1",
-       "september-date": "सितमà¥\8dबर $1",
+       "september-date": "सितà¤\82बर $1",
        "october-date": "अक्टूबर $1",
-       "november-date": "नवमà¥\8dबर $1",
-       "december-date": "दिसमà¥\8dबर $1",
+       "november-date": "नवà¤\82बर $1",
+       "december-date": "दिसà¤\82बर $1",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणी}}",
        "category_header": "\"$1\" श्रेणी में पन्ना",
        "subcategories": "उपश्रेणी",
        "category-media-header": "\"$1\" श्रेणी में मीडिया",
        "category-empty": "''इ श्रेणी में इ समय कउनो पन्ना या मीडिया नइखे।''",
        "hidden-categories": "{{PLURAL:$1|छुपावल गईल श्रेणी|छुपावल गईल श्रेणीं}}",
-       "hidden-category-category": "छुपावल गइल श्रेणी",
-       "category-subcat-count": "{{PLURAL:$2|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¤¾à¤¤à¥\8dर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णियाà¤\82}} à¤¬à¤¾à¤¡à¤¼à¥\87, à¤\95à¥\81ल à¤\89पशà¥\8dरà¥\87णियाà¤\81$2}}",
-       "category-subcat-count-limited": "à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80à¤\82 à¤¬à¤¾à¤¡à¤¼à¥\87}}।",
-       "category-article-count": "{{PLURAL:$2|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¤¾à¤¤à¥\8dर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤ªà¤¨à¥\8dन à¤¬à¤¾à¥¤|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87}, कुल पन्ना $2}}",
+       "hidden-category-category": "छुपावल गइल श्रेणी",
+       "category-subcat-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\96ालà¥\80 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾à¥¤|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\81ल $2 à¤\89पशà¥\8dरà¥\87णिन à¤®à¥\87à¤\82 à¤¸à¥\87 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80|$1 à¤\89पशà¥\8dरà¥\87णà¥\80}} à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82 à¤\95à¥\81ल।}}",
+       "category-subcat-count-limited": "à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾|$1 à¤\89पशà¥\8dरà¥\87णà¥\80 à¤¬à¤¾à¤¡à¤¼à¥\80à¤\82।}}",
+       "category-article-count": "{{PLURAL:$2|à¤\8f à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤®à¤¾à¤¤à¥\8dर à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤ªà¤¨à¥\8dन à¤¬à¤¾à¥¤|à¤\87 à¤¶à¥\8dरà¥\87णà¥\80 à¤®à¥\87à¤\82 à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पनà¥\8dना à¤¬à¤¾|$1 à¤ªà¤¨à¥\8dना à¤¬à¤¾à¤¡à¤¼à¥\87}}, कुल पन्ना $2}}",
        "category-article-count-limited": "निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्ना}} इ श्रेणीं में बा।",
        "category-file-count": "{{PLURAL:$2|इ श्रेणी में मात्र निम्नलिखित फ़ाइल बा।|इ श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल|$1 फ़ाइलं}} बाड़े, कुल फ़ाइलं $2}}",
        "category-file-count-limited": "वर्तमान में निम्नलिखित {{PLURAL:$1|पन्ना|$1 पन्नां}} इ श्रेणीं में बाड़े।",
-       "listingcontinuesabbrev": "निरà¤\82.",
+       "listingcontinuesabbrev": "à¤\9cारà¥\80",
        "index-category": "सूचीबद्ध पृष्ठ",
        "noindex-category": "असूचीबद्ध पृष्ठ",
        "broken-file-category": "टूटल फ़ाइल कड़ियन वाला पन्ना",
        "and": "&#32;अउर",
        "qbfind": "खोज",
        "qbbrowse": "ब्राउज",
-       "qbedit": "समà¥\8dपादन",
+       "qbedit": "सà¤\82पादन",
        "qbpageoptions": "ई पन्ना",
        "qbmyoptions": "हमार पन्ना",
        "faq": "साधारण सवाल",
        "print": "छापीं",
        "view": "देखीं",
        "view-foreign": "$1 पर देखीं",
-       "edit": "समà¥\8dपादन",
-       "edit-local": "à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80य विवरण देखीं",
+       "edit": "सà¤\82पादन",
+       "edit-local": "लà¥\8bà¤\95ल विवरण देखीं",
        "create": "बनाईं",
-       "create-local": "à¤\95à¥\8dषà¥\87तà¥\8dरà¥\80य विवरण जोड़ीं",
-       "editthispage": "à¤\88 पन्ना के सम्पादन करीं",
-       "create-this-page": "à¤\88 पन्ना के निर्माण करीं",
+       "create-local": "लà¥\8bà¤\95ल विवरण जोड़ीं",
+       "editthispage": "à¤\8f पन्ना के सम्पादन करीं",
+       "create-this-page": "à¤\8f पन्ना के निर्माण करीं",
        "delete": "मिटाईं",
        "deletethispage": "ई पन्ना के मिटाईं",
        "undeletethispage": "ई पन्ना के फिर से स्थापित करीं",
        "newpage": "नया पन्ना",
        "talkpage": "इ पन्ना पर चर्चा करीं",
        "talkpagelinktext": "बात-चीत",
-       "specialpage": "à¤\96़ाश पन्ना",
+       "specialpage": "à¤\96ास पन्ना",
        "personaltools": "ब्यक्तिगत औजार",
        "articlepage": "सामग्री पन्ना देखीं",
        "talk": "बात-चीत",
        "toolbox": "उपकरण",
        "userpage": "प्रयोगकर्ता पन्ना देखीं",
        "projectpage": "परियोजना पन्ना देखीं",
-       "imagepage": "फाà¤\88ल à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\80à¤\81",
+       "imagepage": "फाà¤\87ल à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96à¥\80à¤\82",
        "mediawikipage": "सन्देश पन्ना देखीं",
-       "templatepage": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f पन्ना देखीं",
+       "templatepage": "à¤\96ाà¤\81à¤\9aा पन्ना देखीं",
        "viewhelppage": "मदद पन्ना देखीं",
        "categorypage": "श्रेणी पन्ना देखीं",
        "viewtalkpage": "बात-चीत देखीं",
        "pool-queuefull": "पूल पंक्ति भर गइल",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाही बा ($1)।",
+       "poolcounter-usage-error": "उपयोग त्रुटि: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
        "aboutpage": "Project:बारे में",
        "copyright": "उपलब्ध सामग्री $1 के अधीन उपलब्ध बा जब तक की अलग से उल्लेख ना करल गईल होखे ।",
        "hidetoc": "छुपाईं",
        "collapsible-collapse": "सेकुड़ीं",
        "collapsible-expand": "फैलाईं",
+       "confirmable-confirm": "का {{GENDER:$1|आप}} निश्चित बानी?",
        "confirmable-yes": "जी",
        "confirmable-no": "ना",
        "thisisdeleted": "देखीं या भंडार करीं $1?",
        "nstab-media": "मिडीया पन्ना",
        "nstab-special": "विशेष पन्ना",
        "nstab-project": "परियोजना पन्ना",
-       "nstab-image": "फाà¤\88ल",
+       "nstab-image": "फाà¤\87ल",
        "nstab-mediawiki": "सन्देश",
-       "nstab-template": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f",
+       "nstab-template": "à¤\96ाà¤\81à¤\9aा",
        "nstab-help": "मदद पन्ना",
        "nstab-category": "श्रेणी",
        "nosuchaction": "अईसन कौनो कार्रवाई नाहि",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस के बराबर परावर्तित होत समय मुख्य डाटाबेस सर्वर अपने आप लॉक हो गइल।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
+       "internalerror-fatal-exception": "प्रकार के गंभीर अपवाद \"$1\"",
        "filecopyerror": "\"$1\" फ़ाइल के \"$2\" पर प्रतिलिपि ना बन पाईल।",
        "filerenameerror": "\"$1\" फ़ाइल के नाम बदल के \"$2\" नइखे रखल जा सकत।",
        "filedeleteerror": "\"$1\" फ़ाइल के ना हटावल जा सकल।",
        "directorycreateerror": "\"$1\" डाइरेक्टरी ना बनावल जा सकल।",
+       "directoryreadonlyerror": "निर्देशिका \"$1\" सिर्फ पठनीय बा।",
+       "directorynotreadableerror": "निर्देशिका \"$1\" पठनीय नइखे।",
        "filenotfound": "\"$1\" फ़ाइल ना मिलल।",
        "unexpected": "अनपेक्षित मूल्य: \"$1\"=\"$2\".",
        "formerror": "त्रुटि: फ़ॉर्म सबमिट ना करल जा सकल।",
        "viewyourtext": "रउआ इ पन्ना में ''आपन सम्पादन'' के स्रोत देख सकत बानी आ ओकर नकल उतार सकत बानी:",
        "protectedinterface": "इ पन्ना इ विकी के सॉफ़्टवेयर के इंटरफ़ेस पाठ्य के देवेला, आ इ के गलत प्रयोग से बचावे खातिर सुरक्षित कर दिहल गइल बा।\nसभन विकियन खातिर अनुवाद जोड़े या बदले खातिर कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एगो अइसन पन्ना के बदल बदल रहल बानी जवन सॉफ़्टवेयर के इंटरफ़ेस पाठ प्रदान करेला। इ पृष्ठ के बदले से अन्य सदस्यवन के प्रदर्शित इंटरफ़ेस के शक्लोसूरत में बदलाव आई।",
+       "translateinterface": "सभन विकियन खातिर अनुवाद जोड़े या बदले खातिर मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ translatewiki.net] के प्रयोग करीं।",
        "cascadeprotected": "इ पन्ना पर सम्पादन करे के अधिकार खत्म कर दिहल गइल बा काहे कि इ निम्न में शामिल बा {{PLURAL:$1|पन्ना, जउन|पन्नां, जउन}} \"व्यापक\" विकल्प के चालू कइला के साथ सुरक्षित कर दिहल गइल बा:\n$2",
        "namespaceprotected": "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
        "customcssprotected": "रउआ के इ CSS पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।",
        "filereadonlyerror": "फाइल \"$1\" के बदलल सक्षम नइखे काहे कि संग्रह \"$2\" 'खाली पाठन हेतु' (रिड ऑन्ली) मोड में बा।\n\nजउन प्रबंधक इ प्रबंध लगउले बानी उहाँ के निम्न विवरण प्रदान कइले बानी: \"$3\"।",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आ \"$3\" पाठ्य वाला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आ नाम \"$2\" वाला गलत शीर्षक",
-       "exception-nologin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\88à¤\96à¥\80à¤\82 à¤­à¤\88ल",
-       "exception-nologin-text": "à¤\87 à¤ªà¤¨à¥\8dना à¤\85थवा à¤\95ारà¥\8dय à¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\83पया प्रवेश करीं।",
+       "exception-nologin": "à¤\96ाता à¤®à¥\87à¤\82 à¤ªà¥\8dरवà¥\87श à¤¨à¤\87à¤\96à¥\87",
+       "exception-nologin-text": "à¤\88 à¤ªà¤¨à¥\8dना à¤\9aाहà¥\87 à¤\95ारà¥\8dय à¤\95à¥\87 à¤¸à¤\95à¥\8dषम à¤\95रà¥\87 à¤\96ातिर à¤\95à¥\83पया à¤\96ाताप्रवेश करीं।",
        "exception-nologin-text-manual": "इ पन्ना अथवा कार्य के सक्षम करे खातिर कृपया $1 करीं।",
        "virus-badscanner": "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
        "virus-scanfailed": "जाँच विफल (कोड $1)",
        "userlogin-resetpassword-link": "आपन गुप्तशब्द भूला गईनी का?",
        "userlogin-helplink2": "खाता प्रवेश साथ मदद",
        "userlogin-loggedin": "रउआ {{GENDER:$1|$1}} के रूप में पहिले से लॉग्ड इन बानीं।\nकौनो अन्य सदस्य के रूप में लॉग इन करे खातिर निम्नलिखित फ़ॉर्म के प्रयोग करीं।",
-       "userlogin-createanother": "à¤\8fà¤\97à¥\8b à¤¦à¥\8bसर खाता बनाईं",
+       "userlogin-createanother": "à¤\8fà¤\97à¥\8b à¤¦à¥\82सर खाता बनाईं",
        "createacct-emailrequired": "ई-मेल पता",
        "createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
        "createacct-email-ph": "आपन ई-मेल पता लिखीं",
        "wrongpassword": "गलत गुप्त-शब्द डलले बानी।\nकृपया फिर से कोशिश करीं।",
        "wrongpasswordempty": "गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।",
        "passwordtooshort": "गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।",
+       "passwordtoolong": "गुप्त-शब्द {{PLURAL:$1|$1 अक्षर}} से अधिक लमहर नइखे हो सकत।",
        "password-name-match": "राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।",
        "password-login-forbidden": "इस सदस्यनाम आ गुप्तशब्द के प्रयोग वर्जित बा।",
        "mailmypassword": "गुप्तशब्द रिसेट करीं",
        "createaccount-text": "राउर ई-मेल पता खातिर {{SITENAME}} ($4) पर \"$2\" सदस्य नाम से \"$3\" गुप्तशब्द (पासवर्ड) सहित खाता खोलले बानी। रउआ खाता में प्रवेश कर के आपन गुप्तशब्द (पासवर्ड) तुरंत बदल लेवे के चाहीं।\n\nयदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।",
        "login-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
        "login-abort-generic": "राउर खाता में प्रवेश असफल रहल - निष्फलित",
+       "login-migrated-generic": "आप के खाता माइग्रेट हो चुकल बा अउर आप के सदस्यनाम इ विकी पर अब मौजूद नइखे।",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि  अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।",
        "createacct-another-realname-tip": "असली नाम वैकल्पिक बा।\nयदि रउआ इ के उपलब्ध करावे के चुनत बानी त, एकर प्रयोग सदस्य के ओकरा काम के अधिकार देवे खातिर होखी।",
        "changeemail-throttled": "रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।\nकृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।",
        "resettokens": "टोकन रीसेट करीं",
        "resettokens-text": "जौन टोकन राउर खाता से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करेला, आप उ के अहिजा रीसेट कर सकत बानी।\n\nयदि रउआ ई के गलती से केहू के दिखा देले बानी या फिर राउर खाता हैक हो गईल बा त रउआ ई के रीसेट कर देवे के चाहीं।",
+       "resettokens-no-tokens": "रीसेट करे खातिर कउनो टोकन नइखे।",
+       "resettokens-legend": "टोकन रीसेट करीं",
+       "resettokens-tokens": "टोकन:",
+       "resettokens-token-label": "$1 (वर्तमान मूल्य: $2)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|आपके ध्यानसूची के पन्नन में बदलावसभ]] के वेब फ़ीड (Atom/RSS) हेतु टोकन",
+       "resettokens-done": "टोकन रीसेट हो चुकल बा।",
+       "resettokens-resetbutton": "चुनल गइल टोकन रीसेट करीं",
        "bold_sample": "मोट पाठ्य",
        "bold_tip": "मोट पाठ्य",
        "italic_sample": "इटालिक पाठ्य",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वावलोकन देखाईं",
        "showdiff": "परिवर्तन देखाईं",
+       "blankarticle": "<strong>चेतावनी:</strong> आप एगो खाली पन्ना के बनावे जा रहल बानी।\nयदि आप \"{{int:savearticle}}\" के फेर से दबायेब त पन्ना बिना कउनो सामग्री के बन जाई।",
        "anoneditwarning": "<strong>चेतावनी:</strong> रउआ आपन खाता में प्रवेश नईखीं कईले। यदि रउआ कवनो बदलाव करत बानी त राउर आईपी पता खुलेआम दिखाई दी। यदि रउआ <strong>[$1 लॉग इन]</strong> या <strong>[$2 नया खाता बनायेब]</strong> त, अन्य सुविधावन के साथ राउर सम्पादन के श्रेय राउर सदस्यनाम पर चल जाई।",
        "anonpreviewwarning": "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
        "missingsummary": "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
+       "selfredirect": "<strong>चेतावनी:</strong> आप खुद के इ पन्ना पर पुनः निर्देशित कर रहल बानी।\nआप अनुप्रेषित खातिर गलत लक्ष्य निर्दिष्ट हो सकत बानी, या आप के द्वारा गलत पन्ना के संपादन हो सकत बा।\nआप यदि फेर से \"{{int:savearticle}}\" क्लिक करत बानी त, पुन: निर्देषण ओइसहु बनावल जाई।",
        "missingcommenttext": "कृपया निचे एगो टिप्पणी करीं।",
        "missingcommentheader": "'''स्मरणपत्र:''' रउआ ई टिप्पणी खातिर कौनो विषय/शिर्षक प्रदान नईखीं कईले। \"{{int:savearticle}}\" यदि रउआ फिर से सुरक्षित करब त राउर सम्पादन बिना कौनो शिर्षक के सुरक्षित हो जाई।",
        "summary-preview": "सारांश पूर्वावलोकन:",
        "subject-preview": "विषय/शिर्षक पूर्वावलोकन:",
+       "previewerrortext": "जब आप आपन बदलाव के पुर्वावलोकन देखे खातिर प्रयास कइनी ह तवने घड़ी एगो त्रुटी उत्पन्न हो गइल बा।",
        "blockedtitle": "निष्क्रिय प्रयोगकर्ता",
        "blockedtext": "'''राउर सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिहल गईल बा ।'''\n\nअवरोध $1 द्वारा करल गईल रहल।\nअवरोध के कारण बा ''$2''\n\n* अवरोध के आरंभ: $8\n* अवरोध के समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइ अवरोध के बारे में चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकत बानी।\nअगर रउआ [[Special:Preferences|आपन वरीयता]] में वैद्य ई-मेल पता प्रविष्ट कइले होखब तबे 'इ प्रयोक्ता के ई-मेल भेजीं' वाला सुविधा के प्रयोग कर सकत बानी अउर रउआ एकर प्रयोग करे से ना रोकल गईल होखे।\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी भी शामिल करब।",
        "autoblockedtext": "राउर आइ॰पी पता अपने आप अवरुद्ध हो गईल बा काहे कि एकर प्रयोग केहु अन्य सदस्य द्वारा होत रहल,\nजे $1 द्वारा अवरोधित करल गईल रहलन। \nअवरोध करे के कारण बा:\n\n:''$2''\n\n* अवरोध प्रारंभ: $8\n* अवरोध समाप्ति: $6\n* अवरोधित सदस्य: $7\n\nअवरोध के चर्चा करे खातिर रउआ $1 या केहु अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबंधक]] से संपर्क कर सकत बानी।\n\nकृपया ध्यान रहे कि यदि रउआ \"इ सदस्य के ई-मेल भेजीं\" वाला सुविधा के प्रयोग करे के चाहत बानी त राउर [[Special:Preferences|वरीयता]] में वैद्य ई-मेल पता होखे के चाहीं अउर एकर प्रयोग रउआ खातिर अवरोधित ना भईल होखे।\n\nराउर हाल के आइ॰पी पता $3 ह अउर अवरोध क्रमांक #$5 ह।\nआपन कउनो भी प्रश्न में कृपया इ सब जानकारी शामिल करब।",
        "blockednoreason": "कउनो कारण उल्लेखित नईखे",
        "whitelistedittext": "रउआ पन्ना सम्पादन करे खातिर $1 करे के पड़ी।",
+       "confirmedittext": "संपादन करे से पहिले आपके अापना ई-मेल पता प्रमाणित करावल जरुरी बा।\nकृपया आपन [[Special:Preferences|राउर पसन्द]] में जाके अापन ई-मेल पता दिहीं अउर उके प्रमाणित करीं।",
        "nosuchsectiontitle": "खण्ड ना मिल सकल।",
+       "nosuchsectiontext": "आप एगो अइसन अनुभाग के सम्पादन करे के प्रयत्न कर रहल बानी जवन अस्तित्व में नइखे।\nसंभव बा कि जब आप पन्ना पढत या देखत रहनी तवने घड़ी उ के अपनी जगह से हिलावल गइल होखे या हटा दिहल गईल होई।",
        "loginreqtitle": "खाता में प्रवेश जरुरी बा",
        "loginreqlink": "खाता में प्रवेश",
        "loginreqpagetext": "रउआ अन्य पन्ना देखे खातिर $1 करे के पड़ी।",
        "accmailtitle": "गुप्त-शब्द भेजा गईल",
+       "accmailtext": "[[User talk:$1|$1]] खातिर एगो यंत्र जनित गुप्तशब्द $2 के भेज दिहल गइल बा। खाता में प्रवेश कइला के बाद इ '''[[Special:ChangePassword|गुप्तशब्द बदल लीं]]'' वाला पन्ना पर बदलल जा सकत बा।",
        "newarticle": "(नया)",
        "newarticletext": "रउआ एगो अइसन लिंक के पन्ना के अनुसरण कइले बानी जउन अभी तक उपलब्ध नइखे।\nपन्ना बनावे खातिर, नीचे के बाकस में टाईप करे के शुरु करीं (ज्यादा जानकारी खातिर देखीं [$1 मदद पन्ना])।\nयदि रउआ अहिजा गलती से आ गईल बानी त, आपन ब्राउजर के '''back''' (बैक) बटन दबाईं",
+       "anontalkpagetext": "----''इ वार्ता पन्ना उन अनाम सदस्यन खातिर बा जिन्हन के या त खाता नइखे खोलल गइल या खाता के प्रयोग नइखन करत।\nएहि खातिर उन्हन के पहिचान खातिर हमनी के उनकर आइ॰पी पता के प्रयोग करे के पड़ेला।\nआइ॰पी पता कई सदस्यन खातिर साझा हो सकत बा।\nयदि आप एगो अनाम सदस्य बानी अउर आपके लागत बा कि आपके बारे में अप्रासंगिक टीका टिप्पणी करल गइल बा त कृपया [[Special:UserLogin/signup|सदस्यता लिहीं]] या [[Special:UserLogin|सत्रारंभ करीं]] ताकि अन्य अनाम सदस्यन में से आपके अलग से पहिचानल जा सके।''",
        "noarticletext": "ई पन्ना मे अभी कउनो सामग्री नईखे बा ।\nरउआ अन्य पन्ना में [[Special:Search/{{PAGENAME}}|ई शीर्षक के खोज]] कर सकत बानीं",
        "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'' (उपकरण → पसन्द) में कैश साफ़ करीं",
        "updated": "(अपडेट करल गईल)",
        "note": "'''सूचना:'''",
        "previewnote": "'''याद रखीं, इ एगो झलक मात्र हो।'''\nराउर बदलाव अभी तक सुरक्षित नईखे करल गईल!",
        "yourtext": "राउर पाठ्य",
        "storedversion": "सुरक्षित करल गईल संशोधन",
        "yourdiff": "अंतर",
+       "templatesused": "इ पन्ना पर प्रयुक्त {{PLURAL:$1|खाँचा|खाँचा कुल}}:",
+       "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|खाँचा|खाँचा कुल}}:",
        "template-protected": "(संरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
+       "hiddencategories": "इ पन्ना {{PLURAL:$1|1 छुपल श्रेणी|$1 छुपल श्रेणीसभ}} के सदस्य बा:",
        "nocreate-loggedin": "नया पन्ना बनावे रउआ अधिकार नइखे।",
+       "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नइखे",
+       "sectioneditnotsupported-text": "इ पन्ना पर अनुभाग सम्पादन समर्थित नइखे",
        "permissionserrors": "अनुमति त्रुटी",
+       "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणन}} के चलते आपके अइसन करे के अनुमति नइखे:",
        "log-fulllog": "पूरा लॉग देखीं",
        "edit-conflict": "संपादन अंतर्विरोध",
        "postedit-confirmation-created": "पन्ना बना दिहल गईल।",
        "postedit-confirmation-saved": "राउर सम्पादन सुरक्षित कर दिहल गईल।",
+       "defaultmessagetext": "संदेश के डिफ़ॉल्ट पाठ्य",
        "invalid-content-data": "अवैध डाटा सामग्री",
        "content-model-wikitext": "विकीपाठ्य",
        "content-model-text": "सामान्य पाठ",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-model-css": "सी॰एस॰एस",
+       "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क के उपयोग करते हुए पन्नासभ",
+       "post-expand-template-inclusion-warning": "'''चेतावनी:''' खाँचा जोड़े के सीमा पार हो चुकल बा।\nकुछ खाँचा ना जोड़ल जाई।",
        "post-expand-template-inclusion-category": "अइसन पृष्ठ जे पर साँचा जोडे के सीमा पार हो गइल बा",
        "cantcreateaccounttitle": "खाता खुल नईखे सकत",
+       "nohistory": "ए पन्ना के कौनों संपादन इतिहास नइखे",
+       "currentrev": "सबसे नया बदलाव",
+       "currentrev-asof": "$1 ले भइल नया बदलाव",
        "revisionasof": "$1 के रुप में संशोधन",
        "revision-info": "{{GENDER:$6|$2}}$7 के द्वारा $1 के संशोधन",
        "previousrevision": "← पुरान संशोधन",
        "rev-deleted-event": "(लॉग विवरण हटा दिहल गईल बा)",
        "rev-deleted-user-contribs": "[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]",
        "rev-deleted-text-permission": "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।\nमेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
+       "rev-suppressed-text-permission": "ए पन्ना के बदलाव<strong>दबा दिहल गइल बा</strong>।\nबिस्तृत जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दबावल चीज के लॉग] पर मिल जाई।",
        "rev-delundel": "दिखाईं/छुपाईं",
        "rev-showdeleted": "देखाईं",
        "revdelete-show-file-submit": "जी",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})",
        "search-redirect": "(पुन: निर्देशण $1)",
        "search-section": "(खंड $1)",
+       "search-category": "(श्रेणी $1)",
        "search-suggest": "का राउर मतलब बा: $1",
        "search-interwiki-caption": "भ्रातृ परियोजना",
        "search-interwiki-default": "$1 से परिणाम:",
        "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": "अधिकतम संख्या:1000",
+       "prefs-watchlist-token": "धियानसूची टोकन:",
+       "prefs-misc": "अउरी कुल",
+       "prefs-resetpass": "पासवर्ड बदलीं",
+       "prefs-changeemail": "ईमेल पता बदलीं",
+       "prefs-setemail": "ईमेल पता सेट करीं",
+       "prefs-email": "ईमेल बिकल्प",
+       "prefs-rendering": "रंगरूप",
        "saveprefs": "सुरक्षित करीं",
+       "restoreprefs": "सगरी डिफाल्ट सेटिंग पहिले जइसन करीं (सगरी खंड में)",
        "prefs-editing": "संपादन",
+       "rows": "रो कुल:",
+       "columns": "कालम कुल:",
        "searchresultshead": "खोज",
+       "stub-threshold-disabled": "निरस्त",
+       "recentchangesdays": "हाल में भइल परिवर्तन में देखावे खातिर दिन:",
+       "recentchangesdays-max": "अधिकतम $1{{PLURAL:$1|दिन}}",
+       "recentchangescount": "डिफाल्ट में देखावे खातिर संपादन संख्या:",
+       "prefs-help-recentchangescount": "एम्में हाल में भइल परिवर्तन, पन्ना इतिहास, आ लॉग सब बाटे।",
        "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-files": "फाइल सब",
+       "prefs-custom-css": "व्यक्तिगत CSS",
+       "prefs-custom-js": "व्यक्तिगत जावास्क्रिप्ट",
+       "prefs-common-css-js": "सगरी जिल्द खातिर साझा CSS/जावास्क्रिप्ट:",
+       "prefs-reset-intro": "रउआँ आपन पसंद बदल के डिफाल्ट करे खातिर ए पन्ना के इस्तेमाल नइखीं कर सकत।\n\nई फिर से वापस ना हो पाई।",
+       "prefs-emailconfirm-label": "ईमेल जाँच:",
+       "youremail": "ईमेल:",
+       "prefs-registration": "रजिस्ट्रेशन के समय:",
        "yourrealname": "असली नाम",
        "yourlanguage": "भाषा:",
+       "yourvariant": "सामग्री भाषा के अपरूप:",
+       "prefs-help-variant": "ए विकि कि सामग्री पन्नवन के देखावे खातिर राउर पसंद वाला भाषारूप।",
+       "yournick": "नया दसखत:",
+       "yourgender": "रउआँ के का बोलावल जाय?",
+       "gender-unknown": "हम न बताइब",
+       "email": "ईमेल",
+       "prefs-info": "बेसिक जानकारी",
+       "prefs-i18n": "वैश्वीकरण",
+       "prefs-signature": "दसखत",
+       "prefs-dateformat": "तारीख रूप",
+       "prefs-timeoffset": "समय अंतर",
+       "prefs-advancedediting": "सामान्य बिकल्प",
+       "prefs-editor": "संपादक",
        "prefs-preview": "पूर्वावलोकन",
+       "prefs-advancedrc": "एडवांस बिकल्प",
+       "group": "मंडली (ग्रुप):",
+       "group-user": "सदस्य",
+       "group-autoconfirmed": "खुद परीक्षित सदस्य",
+       "group-bot": "बॉट",
+       "group-sysop": "प्रबंधक",
+       "group-bureaucrat": "ब्यूरोक्रेट",
+       "group-suppress": "ओवरसाइटर",
+       "group-all": "(सब)",
+       "right-read": "पन्ना पढ़ीं",
+       "right-createpage": "पन्ना बनाईं (बातचीत पन्ना की अलावा)",
+       "right-createtalk": "बातचीत पन्ना बनाईं",
+       "right-createaccount": "नया सदस्य खाता बनाईं",
+       "right-minoredit": "छोट संपादन चिह्नित करीं",
+       "right-move": "पन्ना स्थानांतरण करीं",
+       "right-move-subpages": "पन्नवन के उनहन की उपपन्नवन की संघे स्थानांतरित करीं",
+       "right-move-rootuserpages": "मूल (root) सदस्य पन्नवन के स्थानांतरित करीं",
+       "right-move-categorypages": "श्रेणी पन्नवन के स्थानांतरित करीं",
+       "right-movefile": "फाइल सब स्थानांतरित करीं",
+       "right-suppressredirect": "स्थानांतरण करत घरी मूल पन्ना से पुनर्निदेश मत बनाईं",
+       "right-upload": "फाइल अपलोड करीं",
+       "right-reupload": "पुरान फाइल की ऊपर नया लादीं",
+       "right-reupload-own": "खुदे लादल फाइल पर नया फाइल लादीं",
+       "right-delete": "पन्ना हटाईं",
+       "right-bigdelete": "लंबा इतिहास वाला पन्ना हटाईं",
+       "right-deletelogentry": "लॉग आइटम के हटाईं या वापस करीं",
+       "right-deleterevision": "पन्ना संशोधन के हटाईं या वापस ले आईं",
+       "right-browsearchive": "हटवाल पन्ना खोजीं",
+       "right-undelete": "हटावल पन्ना वापस ले आईं",
+       "right-protect": "सुरक्षा स्तर बदलीं आ कास्केड-सुरक्षित पन्ना के सम्पादन करीं",
+       "right-unwatchedpages": "ध्यानसूची में जवन पन्ना नइखे ओकर सूची देखीं",
+       "newuserlogpage": "खाता निर्माण के लॉग",
+       "newuserlogpagetext": "ई खाता निर्माण के लॉग बा",
+       "rightslog": "सदस्य अधिकार लॉग",
+       "rightslogtext": "ई सदस्यन के सदस्य-अधिकार के बदलाव के लॉग बा",
+       "action-read": "ई पन्ना पढ़ीं",
+       "action-edit": "ई पन्ना संपादित करीं",
+       "action-createpage": "पन्ना बनाईं",
+       "action-createtalk": "वार्ता पन्ना बनाईं",
+       "action-createaccount": "ई सदस्यखाता बनाईं",
+       "action-history": "ए पन्ना के इतिहास देखीं",
+       "action-minoredit": "ए संपादन के छोट चिह्नित करीं",
        "action-move": "ई पन्ना के स्थांतरण करीं",
+       "action-move-subpages": "ई पन्ना, आ एकर उपपन्ना स्थानांतरित करीं",
+       "action-move-rootuserpages": "मूल सदस्यपन्ना स्थानांतरित करीं",
+       "action-move-categorypages": "श्रेणी पन्ना स्थानांतरित करीं",
+       "action-movefile": "ई फाइल स्थानांतरित करीं",
+       "action-upload": "इ फाइल अपलोड करीं",
+       "action-reupload": "पहिले से मौजूद ए फाइल पर दूसर लादीं",
        "action-delete": "ई पन्ना के मिटाईं",
+       "action-unwatchedpages": "ध्यानसूची में जवन पन्ना नइखे ओकर सूची देखीं",
        "recentchanges": "तुरंत भइल परिवर्तन",
        "recentchanges-legend": "हाल के परिवर्तन संबंधी विकल्प",
+       "recentchanges-summary": "इ विकि पर हाल में भइल बदलाव इ पन्ना पर देखल जा सकत बा।",
        "recentchanges-label-newpage": "ई सम्पादन से एगो नवका पृष्ठ तैयार हो गइल बा",
        "recentchanges-label-minor": "ई एगो छोटा सम्पाद बा",
+       "recentchanges-label-bot": "इ सम्पादन एगो बॉट द्वारा करल गइल रहल",
+       "recentchanges-label-unpatrolled": "इ संपादन के अभीले जाँचल नइखे गइल",
+       "recentchanges-label-plusminus": "बाइट के इ संख्या से पन्ना के आकार बदलल गइल",
        "recentchanges-legend-heading": "'''कुंजी:'''",
+       "rclistfrom": "$2, $3 से शुरु भइल नया बदलाव दिखाईं",
        "rcshowhideminor": "$1 छोट सम्पादन",
        "rcshowhideminor-show": "दिखाईं",
        "rcshowhideminor-hide": "छुपाँई",
+       "rcshowhidebots": "बॉट $1",
+       "rcshowhidebots-show": "देखाईं",
+       "rcshowhidebots-hide": "छिपाईं",
+       "rcshowhideliu": "रजिस्टर्ड सदस्य $1",
+       "rcshowhideliu-show": "देखाईं",
+       "rcshowhideliu-hide": "छिपाईं",
+       "rcshowhideanons": "बेनाम सदस्य $1",
+       "rcshowhideanons-show": "देखाईं",
+       "rcshowhideanons-hide": "छिपाईं",
+       "rcshowhidepatr": "जाँचल बदलाव $1",
+       "rcshowhidepatr-show": "देखाईं",
+       "rcshowhidepatr-hide": "छिपाईं",
+       "rcshowhidemine": "हमार संपादन $1",
+       "rcshowhidemine-show": "देखाईं",
+       "rcshowhidemine-hide": "छिपाईं",
+       "rclinks": "पिछला $2 दिन में भइल $1 बदलाव देखाईं<br />$3",
        "diff": "अन्तर",
        "hist": "इति",
        "hide": "छुपाँई",
        "newpageletter": "न",
        "boteditletter": "बो",
        "number_of_watching_users_pageview": "[$1 देखल जा रहल बा {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता}}]",
+       "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं)",
+       "rc_categories_any": "कौनों",
        "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट सब}} बदलाव के बाद",
        "recentchangeslinked": "सम्बन्धित बदलाव",
        "recentchangeslinked-feed": "सम्बन्धित बदलाव",
        "recentchangeslinked-toolbox": "सम्बन्धित बदलाव",
        "recentchangeslinked-page": "पन्ना नाम:",
-       "upload": "फाईल लादीं",
+       "upload": "फाईल अपलोड करीं",
+       "uploadlogpage": "लदनी (अपलोड) के लॉग",
+       "uploadlogpagetext": "नीचे हाल में अपलोड करल गइल फाइलन के सूची बा।\nदृश्य अवलोकन खातिर [[Special:NewFiles|नया फाइलन के गैलरी]] देखीं।",
+       "filename": "फाइलनाँव",
        "filedesc": "सारांश",
        "fileuploadsummary": "सारांश:",
+       "filereuploadsummary": "फाइल बदलाव:",
+       "filestatus": "कापीराइट स्टेटस",
        "filesource": "स्रोत:",
+       "ignorewarning": "चेतावनी के न मान के फाइल सहेज दीं",
+       "ignorewarnings": "चेतावनी छोड़ीं",
+       "minlength1": "फाइलनाँव कमसेकम एक अच्छर के चाही",
        "unknown-error": "अज्ञात त्रुटि उत्पन्न हो गईल बा।",
+       "license": "लाइसेंस जानकारी:",
        "license-header": "लाईसेंसिंग",
+       "nolicense": "कौनों नइखे",
+       "licenses-edit": "लाइसेंस बिकल्प संपादन",
+       "license-nopreview": "(नमूना देखल उपलब्ध नइखे)",
+       "listfiles": "फाइल सूची",
+       "listfiles_thumb": "चिप्पी",
+       "listfiles_date": "तिथि",
+       "listfiles_name": "नाँव",
        "file-anchor-link": "फ़ाइल",
        "filehist": "पन्ना के इतिहास",
        "filehist-deleteall": "सब मिटाईं",
        "filehist-current": "मौजूदा",
        "filehist-datetime": "तारिख/समय",
        "filehist-thumb": "थम्बनेल",
+       "filehist-thumbtext": "$1 संस्करण के अंगूठाकार प्रारूप।",
        "filehist-nothumb": "बिन थम्बनेल",
        "filehist-user": "प्रयोगकर्ता",
        "filehist-dimensions": "आयाम",
        "sharedupload": "इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।",
        "sharedupload-desc-there": "इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा। अधिक जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखीं।",
        "filepage-nofile": "इ नाम से कौनो फाईल उपलब्ध नईखे।",
-       "filepage-nofile-link": "à¤\87 à¤¨à¤¾à¤® à¤¸à¥\87 à¤\95à¥\8cनà¥\8b à¤«à¤¾à¤\88ल à¤\89पलबà¥\8dध à¤¨à¤\88à¤\96à¥\87, à¤²à¥\87à¤\95िन à¤°à¤\89à¤\86 [$1 à¤\95à¥\87 à¤²à¤¾à¤¦] सकत बानी।",
+       "filepage-nofile-link": "à¤\87 à¤¨à¤¾à¤® à¤¸à¥\87 à¤\95à¥\8cनà¥\8b à¤«à¤¾à¤\88ल à¤\89पलबà¥\8dध à¤¨à¤\88à¤\96à¥\87, à¤²à¥\87à¤\95िन à¤°à¤\89à¤\86 [$1 à¤\95à¥\87 à¤\85पलà¥\8bड à¤\95र] सकत बानी।",
        "uploadnewversion-linktext": "इ फाईल के नया संस्करण लादीं।",
        "shared-repo-from": "$1 से",
        "shared-repo": "एगो आवटिंत भंडार गृह",
        "filedelete-submit": "मिटाईं",
        "filedelete-success": "'''$1''' के मिटा दिहल गईल बा।",
        "filedelete-nofile": "'''$1''' उपलब्ध नईखे।",
+       "mimesearch": "MIME खोज",
+       "unwatchedpages": "ध्यान न दिहल गइल पन्ना",
+       "listredirects": "पुनर्निर्देशन के सूची",
+       "unusedtemplates": "बिना प्रयोग के खाँचा",
        "randompage": "अविशिष्ट पन्ना",
+       "randomincategory": "श्रेणी में अनियमित पन्ना",
+       "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कउनो पन्ना नइखे।",
+       "randomincategory-legend": "श्रेणी में अनियमित पन्ना",
+       "statistics": "तथ्यांकसभ",
+       "statistics-header-edits": "तथ्यांक सम्पादन",
+       "statistics-header-hooks": "अन्य तथ्यांक",
+       "pageswithprop": "पन्ना-गुण वाला पन्नासभ",
+       "doubleredirects": "दोहरा पुननिर्देशित पन्ना",
+       "brokenredirects": "टूटल पुनर्निर्देशन पन्ना",
+       "withoutinterwiki": "बिना अंतरविकि जोड़ वाला पन्ना",
+       "fewestrevisions": "सबसे कम संशोधन वाला पन्ना",
        "nbytes": "$1 {{PLURAL:$1|बाईट|बाईट्स}}",
+       "ncategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
+       "lonelypages": "अनाथ पन्ना",
+       "lonelypagestext": "ई पन्ना कुल कौनों दूसर पन्ना से नइखें जुड़ल न कौनों में ट्रांसक्लूड बाड़ें",
+       "uncategorizedpages": "बिना श्रेणी के पन्ना",
+       "uncategorizedcategories": "बिना श्रेणी के श्रेणी",
+       "uncategorizedimages": "बिना श्रेणी के फाइल",
+       "uncategorizedtemplates": "बिना श्रेणी के टेम्पलेट",
+       "unusedcategories": "बिना इस्तेमाल श्रेणी",
+       "unusedimages": "बिना इस्तेमाल फाइल",
+       "wantedcategories": "श्रेणी चाहत बा",
+       "wantedpages": "पन्ना चाहत बा",
+       "wantedfiles": "जरुरत के फाईलसभ",
+       "wantedtemplates": "जरुरत के खाँचा",
+       "mostlinkedcategories": "सबसे अधिक से जुड़ल श्रेणीसभ",
+       "mostcategories": "सबसे अधिक श्रेणी वाला पन्नाकुल",
+       "prefixindex": "उपसर्ग अनुसार पन्ना",
+       "shortpages": "छोट पन्नासभ",
+       "longpages": "लमहर पन्ना",
+       "deadendpages": "मरल-खपल पन्ना",
+       "protectedpages": "सुरक्षित पन्ना",
+       "protectedtitles": "सुरक्षित शीर्षक",
+       "listusers": "सदस्यसूची",
        "newpages": "नवका पन्ना",
+       "ancientpages": "सभन से पुरान पन्नासभ",
        "move": "स्थान्तरण",
        "movethispage": "ई पन्ना के स्थांतरण करीं",
+       "apihelp-no-such-module": "मॉड्युल $1 ना मिलल।",
        "booksources": "किताबी स्रोत",
+       "booksources-search-legend": "किताबी स्रोत के खोज",
        "allarticles": "सभी पन्ना",
        "allpagessubmit": "जाईं",
        "allpagesprefix": "उपसर्ग के साथे पन्ना प्रदर्शन:",
+       "categories": "श्रेणीसभ",
+       "activeusers": "सक्रिय सदस्यन के सूची",
+       "listgrouprights": "सदस्य समूह अधिकारसभ",
+       "trackingcategories": "नजर रखे वाला श्रेणीसभ",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
        "watchlist": "ध्यानसूची",
        "mywatchlist": "ध्यानसूची",
        "watching": "ध्यानसूची में जाते हुए",
        "unwatching": "ध्यानसूची से हटते हुए",
        "created": "बनावल गईल",
+       "actioncomplete": "काम पुरा भइल",
        "rollbacklink": "वापिस लीं",
+       "protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
        "undeletelink": "देखीं/बहाल करीं",
        "namespace": "सन्दर्भ",
        "invert": "चयनित पलटीं",
+       "tooltip-invert": "चुनल गइल नामस्थान के साथ बदलाव छुपाये खातिर इ बाकस के चिन्हित करीं (आ सम्बन्धित नामस्थान यदि चिन्हित करल जाई)",
+       "namespace_association": "सम्बन्धित नामस्थान",
        "blanknamespace": "(मुख्य)",
        "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": " $1 खातिर प्रयोगकर्ता योगदान",
        "whatlinkshere-filters": "फिल्टर",
        "blockip": "{{GENDER:$1|सदस्य}} अवरोधित करीं",
        "ipboptions": "२ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite",
+       "blocklist": "अवरोधित प्रयोगकर्तासभ",
        "blocklink": "निष्क्रिय",
        "unblocklink": "ताला खोलीं",
        "change-blocklink": "ब्लॉक बदलीं",
        "export": "पन्ना निर्यात करीं",
        "thumbnail-more": "बढ़ाईं",
        "filemissing": "फाईल गायब",
+       "imported-log-entries": "लावल गइल $1 {{PLURAL:$1|लॉग प्रविष्टि|लॉग प्रविष्टिसभ}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनसभ}} लावल गइल",
        "tooltip-pt-userpage": "राउर प्रयोगकर्ता पन्ना",
        "tooltip-pt-mytalk": "राउर वार्ता पन्ना",
        "tooltip-pt-preferences": "राउर पसन्द",
        "tooltip-t-recentchangeslinked": "ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन",
        "tooltip-feed-atom": "ई पन्ना खातिर अणु फ़ीड",
        "tooltip-t-contributions": "इ सदस्य के योगदान के सूची",
-       "tooltip-t-upload": "फाà¤\88ल à¤²à¤¾à¤¦à¥\80à¤\82 (à¤\85पलà¥\8bड )",
+       "tooltip-t-upload": "फाà¤\88ल à¤\85पलà¥\8bड à¤\95रà¥\80à¤\82",
        "tooltip-t-specialpages": "ख़ाश पन्नवन के सूची",
        "tooltip-t-print": "ई पन्ना के छापे लायक संस्करण।",
        "tooltip-t-permalink": "ई पन्ना के संसोधन खातिर स्थायी लिंक।",
        "file-info-gif-looped": "लूप्ड",
        "file-info-gif-frames": "$1 {{PLURAL:$1|फ्रेम}}",
        "file-info-png-looped": "लूप्ड",
+       "newimages": "नया फाईलन के गैलरी",
        "bad_image_list": "फोर्मेट निम्न अनुसार बा:\nखाली सूची सामग्री (* से शुरु होवे वाला पंक्ति ) मानल गईल बा।\nपंक्ति पर पहिला लिंक एगो खराब फाईल के साथ जुड़ल होवे के चाहीं।\nकोई भी बाद वाला लिंक ओही पंक्ति पर अईला पर उ के अपवाद मानल जाई, अर्थात जौन पन्ना पर फाईल इनलाईन हो सकत बा।",
        "metadata": "मेटाडाटा",
        "metadata-help": "इ फाईल में अतिरिक्त जानकारी उपलब्ध बा, हो सकत बा कि इ डिजीटल कैमरा या स्कैनर से लेवल गईल होखे। यदि इ फाईल एकर मूल फाईल में से संशोधित करल गईल बा त कुछ जानकारी उजागर ना हो सकी।",
        "exif-model": "कैमेरा मॉडेल",
        "exif-software": "प्रयोग करल गईल सॉफ्टवेयर",
        "exif-datetimeoriginal": "डाटा बनावे के दिनांक अउर समय",
+       "exif-iimcategory": "श्रेणी",
        "exif-orientation-1": "सामान्य",
        "namespacesall": "सब",
        "monthsall": "सब",
        "confirmemail": "इ-मेल पता कन्फर्म करीं",
        "version-no-ext-name": "[अज्ञात नाम]",
+       "fileduplicatesearch": "नकल प्रति फाइल खोजीं",
        "specialpages": "ख़ाश पन्ना",
+       "specialpages-group-login": "प्रवेश / खाता निर्माण",
+       "specialpages-group-changes": "तुरंत भइल परिवर्तन आ लॉगसभ",
+       "specialpages-group-media": "मीडिया रिपोर्ट आ अपलोडसभ",
+       "specialpages-group-users": "सदस्य अउर अधिकार",
+       "specialpages-group-pages": "पन्नन के सूचीसभ",
+       "specialpages-group-wiki": "डेटा अउर औजार",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग|टैग कुल}}]]: $2)",
        "logentry-delete-delete": "$1 द्वारा पन्ना $3 {{GENDER:$2|हटा}} दिहल गईल",
        "revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
        "revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त",
        "revdelete-summary": "सारांश संपादन",
-       "searchsuggest-search": "खोजीं"
+       "searchsuggest-search": "खोजीं",
+       "api-error-nomodule": "भितरी त्रुटी:कउनो अपलोड मॉड्युल सेट नइखे",
+       "expandtemplates": "फैलल खाँचा",
+       "mediastatistics": "मिडिया तथ्यांक"
 }
index 5e079d3..cbd4781 100644 (file)
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
-       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8b à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87 à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8b à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হà§\87 à¦\86ড়াল à¦\95রà§\8b",
        "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
-       "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন",
+       "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন",
        "tog-usenewrc": "সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন",
        "tog-numberheadings": "শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও",
        "tog-showtoolbar": "সম্পাদনা টুলবার দেখাও",
        "edit-local": "স্থানীয় বিবরণ সম্পাদনা করুন",
        "create": "তৈরি",
        "create-local": "স্থানীয় বিবরণ যোগ করুন",
-       "editthispage": "পাতাটি সম্পাদনা করুন",
+       "editthispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
        "create-this-page": "পাতাটি তৈরি করো",
        "delete": "অপসারণ",
        "deletethispage": "এই পাতাটি মুছে ফেলুন",
        "talkpagelinktext": "আলোচনা",
        "specialpage": "বিশেষ পাতা",
        "personaltools": "নিজস্ব সরঞ্জামসমূহ",
-       "articlepage": "বিষয়বস্তু পাতাটি দেখুন",
+       "articlepage": "বিষয়বস্তু পাতাটি দেখুন",
        "talk": "আলোচনা",
        "views": "দৃষ্টিকোণ",
        "toolbox": "সরঞ্জাম",
        "revdelete-log": "কারণ:",
        "revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
        "revdelete-success": "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
-       "revdelete-failure": "<strong>সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:</strong>\n$1",
+       "revdelete-failure": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:\n$1",
        "logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
        "logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
        "revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
        "notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
        "prevn": "পূর্ববর্তী {{PLURAL:$1|$1}}টি",
        "nextn": "পরবর্তী {{PLURAL:$1|$1}}টি",
+       "prev-page": "পূর্ববর্তী পাতা",
+       "next-page": "পরবর্তী পাতা",
        "prevn-title": "পূর্ববর্তী $1 {{PLURAL:$1|ফলাফল|ফলাফলসমূহ}}",
        "nextn-title": "পরবর্তী $1টি {{PLURAL:$1|ফলাফল}}",
        "shown-title": "প্রতি পাতায় $1টি {{PLURAL:$1|ফলাফল}} দেখাও",
        "rightslog": "ব্যবহারকারীর অধিকার লগ",
        "rightslogtext": "এটি ব্যবহারকারী অধিকারে আনা পরিবর্তনগুলির একটি লগ।",
        "action-read": "এই পাতাটি পড়ুন",
-       "action-edit": "এই পাতাটি সম্পাদনা করুন",
+       "action-edit": "এই পাতাটি সম্পাদনা",
        "action-createpage": "পাতা তৈরি করো",
        "action-createtalk": "আলাপের পাতা তৈরি করো",
        "action-createaccount": "এই ব্যবহারকারী একাউন্টটি তৈরি করো",
        "listfiles-delete": "অপসারণ",
        "listfiles-summary": "এই বিশেষ পাতাটি আপলোড করা সকল ফাইল প্রদর্শন করে।",
        "listfiles_search_for": "ছবির নাম অনুসন্ধান:",
+       "listfiles-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" নিবন্ধিত নয়।",
        "imgfile": "ফাইল",
        "listfiles": "ছবির তালিকা",
        "listfiles_thumb": "সংক্ষেপচিত্র",
        "import-interwiki-history": "এই পাতার সমস্ত ইতিহাসের সংস্করণের অনুলিপি করা হোক",
        "import-interwiki-templates": "সকল টেম্পলেট অন্তর্ভুক্ত",
        "import-interwiki-submit": "আমদানি",
-       "import-interwiki-namespace": "গন্তব্য নামস্থান:",
-       "import-interwiki-rootpage": "মূল পাতা (ঐচ্ছিক):",
        "import-upload-filename": "ফাইলনাম:",
        "import-comment": "মন্তব্য:",
        "importtext": "অনুগ্রহ করে ফাইলটি উৎস উইকি থেকে [[Special:Export|এক্সপোর্ট ইউটিলিটি]] ব্যবহার করে এক্সপোর্ট করুন।\nফাইলটি আপনার কম্পিউটারে সংরক্ষণ করুন এবং এখানে আপলোড করুন।",
        "patrol-log-page": "পরীক্ষণ লগ",
        "patrol-log-header": "এটি যাচাইকৃত রিভিশনের তালিকা।",
        "log-show-hide-patrol": "পরীক্ষণ লগ $1",
+       "log-show-hide-tag": "ট্যাগ লগ $1",
        "deletedrevision": "মুছে ফেলা পুরাতন সংশোধন $1",
        "filedeleteerror-short": "ফাইল মুছতে গিয়ে ত্রুটি: $1",
        "filedeleteerror-long": "ফাইলটি মুছার সময় ত্রুটি দেখা দিয়েছে:\n\n$1",
        "tags-deactivate-title": "নিষ্ক্রিয় ট্যাগ",
        "tags-deactivate-reason": "কারণ:",
        "tags-deactivate-submit": "নিষ্ক্রিয়",
+       "tags-edit-title": "ট্যাগ সম্পাদনা করুন",
        "comparepages": "পাতার তুলনা",
        "compare-page1": "পাতা ১",
        "compare-page2": "পাতা ২",
        "logentry-upload-overwrite": "$1 $3-এর একটি নতুন সংস্করণ {{GENDER:$2|আপলোড করেছেন}}",
        "logentry-upload-revert": "$1 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
+       "log-name-tag": "ট্যাগ লগ",
        "rightsnone": "(কিছু নাই)",
        "revdelete-summary": "সম্পাদনা সারাংশ",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
index 0d5f6fb..7f1be40 100644 (file)
@@ -47,7 +47,8 @@
                        "Loupeter",
                        "Macofe",
                        "Gerardduenas",
-                       "Medol"
+                       "Medol",
+                       "Xavier Dengra"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "wrongpassword": "La contrasenya que heu introduït és incorrecta. Torneu-ho a provar.",
        "wrongpasswordempty": "La contrasenya que s'ha introduït estava en blanc. Torneu-ho a provar.",
        "passwordtooshort": "La contrasenya ha de tenir un mínim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
+       "passwordtoolong": "La contrasenya ha de tenir un màxim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
        "password-name-match": "La contrasenya ha de ser diferent al vostre nom d'usuari.",
        "password-login-forbidden": "No és permès d'utilitzar aquest nom d'usuari i contrasenya.",
        "mailmypassword": "Restableix la contrasenya",
        "history-feed-description": "Historial de revisió per a aquesta pàgina del wiki",
        "history-feed-item-nocomment": "$1 a $2",
        "history-feed-empty": "La pàgina demanada no existeix.\nPotser s'ha suprimit o reanomenat.\nIntenteu [[Special:Search|cercar al mateix wiki]] per a noves pàgines rellevants.",
+       "history-edit-tags": "Modifica les etiquetes de les revisions seleccionades",
        "rev-deleted-comment": "(resum d'edició eliminat)",
        "rev-deleted-user": "(s'ha suprimit el nom d'usuari)",
        "rev-deleted-event": "(s'han suprimit els detalls del registre)",
        "rev-showdeleted": "mostra",
        "revisiondelete": "Esborrar/restaurar revisions",
        "revdelete-nooldid-title": "La revisió objectiu no és vàlida",
-       "revdelete-nooldid-text": "No heu especificat unes revisions objectius per a realitzar aquesta\nfunció, la revisió especificada no existeix, o bé esteu provant d'amagar l'actual revisió.",
+       "revdelete-nooldid-text": "No heu especificat unes revisions objectiu per a realitzar aquesta\nfunció, la revisió especificada no existeix, o bé esteu provant d'amagar la revisió actual.",
        "revdelete-no-file": "El fitxer especificat no existeix.",
        "revdelete-show-file-confirm": "Esteu segur que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
        "revdelete-show-file-submit": "Sí",
        "revertmerge": "Desfusiona",
        "mergelogpagetext": "A sota hi ha una llista de les fusions més recents d'una pàgina d'historial en una altra.",
        "history-title": "«$1»: Historial de revisions",
-       "difference-title": "$1: Diferència entre les revisions",
-       "difference-title-multipage": "$1 i $2: Diferència entre les pàgines",
+       "difference-title": "Diferència entre revisions de la pàgina «$1»",
+       "difference-title-multipage": "Diferència entre les pàgines «$1» i «$2»",
        "difference-multipage": "(Diferència entre pàgines)",
        "lineno": "Línia $1:",
        "compareselectedversions": "Compara les versions seleccionades",
        "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",
        "right-managechangetags": "Crear i suprimir [[Special:Tags|etiquetes]] des de la base de dades",
+       "right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
+       "right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
        "newuserlogpage": "Registre de creació d'usuaris",
        "newuserlogpagetext": "Aquest és un registre de creació de nous usuaris.",
        "rightslog": "Registre dels permisos d'usuari",
        "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",
+       "action-applychangetags": "aplica les etiquetes juntament amb els canvis",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
        "enhancedrc-history": "historial",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
-       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «e-mail» del projecte {{SITENAME}}.",
+       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «{{int:emailpage}}» de {{SITENAME}}.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "import-interwiki-history": "Copia totes les versions de l'historial d'aquesta pàgina",
        "import-interwiki-templates": "Inclou totes les plantilles",
        "import-interwiki-submit": "Importa",
-       "import-interwiki-namespace": "Espai de noms de destinació:",
-       "import-interwiki-rootpage": "Pàgina arrel de destí (opcional):",
        "import-upload-filename": "Nom de fitxer:",
        "import-comment": "Comentari:",
        "importtext": "Exporteu el fitxer des del wiki d'origen utilitzant l'[[Special:Export|eina d'exportació]].\nDeseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
        "pageinfo-protect-cascading-yes": "Sí",
        "pageinfo-protect-cascading-from": "Proteccions en cascada des de",
        "pageinfo-category-info": "Informació de categoria",
+       "pageinfo-category-total": "Nombre total de membres",
        "pageinfo-category-pages": "Nombre de pàgines",
        "pageinfo-category-subcats": "ombre de subcategories",
        "pageinfo-category-files": "Nombre d'arxius",
        "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-create-warnings-above": "{{PLURAL:$2|S'ha registrat la següent advertència|S'han registrat les següents advertències}} durant la creació de l'etiqueta \"$1\":",
        "tags-create-warnings-below": "Voleu continuar creant l'etiqueta?",
        "tags-delete-title": "Elimina l'etiqueta",
        "tags-delete-explanation-initial": "Esteu a punt d'eliminar l'etiqueta «$1» de la base de dades.",
+       "tags-delete-explanation-in-use": "Se suprimirà de {{PLURAL:$2|$2 revisió o entrada de registre|totes les $2 revisions i/o entrades de registre}} on s'aplica actualment.",
+       "tags-delete-explanation-warning": "Aquesta acció és <strong>irreversible</strong> i <strong>no es pot desfer</strong>, ni tan sols els administradors de la base de dades poden desfer-la. Assegureu-vos que aquesta és l'etiqueta que voleu suprimir.",
+       "tags-delete-explanation-active": "<strong>L'etiqueta \"$1\" encara està activa, i continuarà aplicant-se en el futur.</strong> Per evitar que això passi, dirigiu-vos al lloc (o llocs) d'activació de l'etiqueta i deshabiliteu-la allà.",
        "tags-delete-reason": "Motiu:",
        "tags-delete-submit": "Suprimeix irreversiblement aquesta etiqueta",
+       "tags-delete-not-allowed": "Les etiquetes definides per una extensió no es poden esborrar tret que l'extensió ho permeti específicament.",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
+       "tags-delete-warnings-after-delete": "L'etiqueta \"$1\" ha estat esborrada satisfactòriament, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-question": "Esteu a punt d'activar l'etiqueta «$1».",
        "tags-activate-reason": "Motiu:",
        "tags-deactivate-reason": "Motiu:",
        "tags-deactivate-not-allowed": "No és possible desactivar l'etiqueta «$1».",
        "tags-deactivate-submit": "Desactiva",
+       "tags-apply-not-allowed-one": "No es permet aplicar l'etiqueta «$1» manualment.",
+       "tags-apply-not-allowed-multi": "No es permet aplicar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
+       "tags-update-no-permission": "No teniu permisos per a afegir o suprimir etiquetes de canvi de revisions individuals o entrades de registre.",
+       "tags-update-add-not-allowed-one": "No es permet afegir manualment l'etiqueta «$1».",
+       "tags-edit-title": "Modifica les etiquetes",
+       "tags-edit-manage-link": "Gestiona les etiquetes",
+       "tags-edit-reason": "Motiu:",
        "comparepages": "Comparar pàgines",
        "compare-page1": "Pàgina 1",
        "compare-page2": "Pàgina 2",
        "revdelete-uname-unhid": "ha revelat un nom d'usuari que era ocult",
        "revdelete-restricted": "ha aplicat restriccions als administradors",
        "revdelete-unrestricted": "ha tret les restriccions als administradors",
+       "logentry-block-block": "$1 {{GENDER:$2|ha estat blocat|ha estat blocada}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|va desblocar}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|va importar}} $3 a través de càrrega de fitxer",
        "logentry-import-interwiki": "$1 {{GENDER:$2|va importar}} $3 d'un altre wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha fusionat}} $3 en $4 (revisions fins a $5)",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha carregat}} una nova versió de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha carregat}} $3",
        "log-name-managetags": "Registre de gestió d'etiquetes",
+       "log-description-managetags": "Aquesta pàgina té llistades les tasques de gestió referents a les [[Special:Tags|etiquetes]]. El registre conté només les accions dutes a terme manuament per un administrador; algunes etiquetes poden ser creades o eliminades pel programari wiki sense deixar inventariada una entrada en aquest registre.",
        "logentry-managetags-create": "$1 {{GENDER:$2|va crear}} l'etiqueta «$4»",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|ha activat}} l'etiqueta \"$4\" per a ser utilitzada en usuaris i bots",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|ha desactivat}} l'etiqueta \"$4\" per a ser utilitzada en usuaris i bots",
+       "log-name-tag": "Registre d'etiquetes",
        "rightsnone": "(cap)",
        "revdelete-summary": "el resum d'edició",
        "feedback-adding": "S'està afegint el comentari a la pàgina...",
        "feedback-message": "Missatge:",
        "feedback-subject": "Assumpte:",
        "feedback-submit": "Envia",
+       "feedback-terms": "Entenc que la informació del meu agent d'usuari inclou les versions exactes del meu navegador i del meu sistema operatiu i que seran publicades amb els meus comentaris.",
+       "feedback-termsofuse": "Accepto proporcionar informació d'acord amb les Condicions d'ús.",
        "feedback-thanks": "Gràcies! S'ha publicat la vostra opinió a la pàgina «[$2 $1]».",
        "feedback-thanks-title": "Gràcies!",
        "feedback-useragent": "Agent d'usuari:",
        "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de la pàgina per a $3 de $4 a $5.",
        "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en <code>LocalSettings.php</code> per permetre totes les aparences instal·lades actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Reviseu els noms de l'aparença per errors tipogràfics.",
-       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte per al wiki, definit en <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: configuració de l'aparença] per informació de com permetre aparences i triar-ne per defecte.",
+       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitat)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inhabilitat''')",
        "mediastatistics": "Estadístiques dels multimèdia",
index 25333f2..b7c7ca6 100644 (file)
@@ -30,8 +30,8 @@
        "tog-minordefault": "默認共所有其編輯都當作過幼修改",
        "tog-previewontop": "敆編輯框以前顯示預覽",
        "tog-previewonfirst": "敆頭蜀回編輯時候看預覽",
-       "tog-enotifwatchlistpages": "我其監視單有變時候,發電子郵件乞我",
-       "tog-enotifusertalkpages": "我其討論頁有變時候,發電子郵件乞我",
+       "tog-enotifwatchlistpages": "我其監視單有變其辰候,寄電批乞我",
+       "tog-enotifusertalkpages": "我其討論頁有變其辰候,寄電批乞我",
        "tog-enotifminoredits": "就㑚講是過幼編輯,也着發電子郵件乞我",
        "tog-enotifrevealaddr": "敆通知郵件臺中顯示我其電子郵件地址",
        "tog-shownumberswatching": "顯示監視用戶其數量",
@@ -50,7 +50,7 @@
        "tog-showhiddencats": "㪗藏類別",
        "tog-norollbackdiff": "敆回滾其時候,無叕𣍐蜀様其地方",
        "tog-useeditwarning": "我編輯頁面其時候離開,起動警告我蜀下",
-       "tog-prefershttps": "登錄以後全程使用安全連接",
+       "tog-prefershttps": "躒入以後始終使安全連接",
        "underline-always": "直頭",
        "underline-never": "頭𡅏無",
        "underline-default": "皮膚或者瀏覽器默認其",
        "generic-pool-error": "對不住,現刻時服務器過載了。\n實在過価用戶敆𡅏訪問茲蜀萆資源。\n起動汝等蜀刻再訪問茲蜀萆資源。",
        "pool-timeout": "等待鎖定其時間遘了",
        "pool-queuefull": "隊列池已經滿了",
-       "pool-errorunknown": "𣍐八什乇鄭咯",
+       "pool-errorunknown": "𣍐曉什乇綻咯",
        "aboutsite": "關於{{SITENAME}}",
        "aboutpage": "Project:關於",
        "copyright": "內容會使敆$1下底會使獲得遘,若無會給出其它提示。",
        "privacypage": "Project:隱私政策",
        "badaccess": "權限錯誤",
        "badaccess-group0": "汝𣍐使做汝要求其茲蜀萆動作。",
-       "badaccess-groups": "汝要求其動作着$2裏勢用戶乍會做其:$1{{PLURAL:$1}}",
+       "badaccess-groups": "汝卜做其動作着{{PLURAL:$2|茲蜀群組|茲蜀組裡勢}}其用戶乍有能耐使:$1",
        "versionrequired": "需要版本$1其MediaWiki",
        "versionrequiredtext": "需要MediaWiki其版本$1來使茲蜀頁。\n覷[[Special:Version|版本頁面]]。",
        "ok": "好",
        "nospecialpagetext": "<strong>汝請求蜀萆𣍐合法其特殊頁面。</strong>\n\n合法其特殊頁面清單會使敆[[Special:SpecialPages|{{int:特殊頁面}}]]頁面討著",
        "error": "鄭咯",
        "databaseerror": "數據庫有綻",
-       "databaseerror-text": "數據庫查詢發生錯誤。\n嚽可能是軟件底裡其程序缺陷。",
+       "databaseerror-text": "數據庫查詢發生錯誤。\n嚽可能是軟件裡勢其程序缺陷。",
        "databaseerror-textcl": "數據庫查詢發生錯誤。",
        "databaseerror-query": "查詢語句:$1",
        "databaseerror-function": "函數名:$1",
        "databaseerror-error": "錯誤信息:$1",
        "laggedslavemode": "'''警告:'''頁面可能無最近其更新。",
        "readonly": "數據庫乞鎖起咯",
-       "enterlockreason": "æ\8b\8dåº\95汝鎖定數據庫其原因,包括汝估計其釋放鎖其時間",
+       "enterlockreason": "æ\8b\8då\85¥汝鎖定數據庫其原因,包括汝估計其釋放鎖其時間",
        "readonlytext": "數據庫茲滿乞儂鎖定了,𣍐使寫新條目或者做修改。有可能是日常維護,之後就會正常。\n\n\n鎖起數據庫其管理員總款解釋:$1",
        "missing-article": "數據庫未討遘本身應當著討遘其名叫\"$1\"其頁面$2其文本。\n\n嚽可能是下底其過時其diff或者已經删除其歴史鏈接造成其。\n\n如果伓是茲兩種情況,汝可能發現著蜀萆服務器其缺陷。\n起動汝共茲蜀萆缺陷匯報乞[[Special:ListUsers/sysop|管理員]],附上網址。",
        "missingarticle-rev": "(版本#:$1)",
        "directorynotreadableerror": "目錄$1是禁讀目錄。",
        "filenotfound": "討𣍐著文件「$1」。",
        "unexpected": "伓是卜挃其值:「$1」=「$2」。",
-       "formerror": ":𣍐使提交表單。",
+       "formerror": "綻去:𣍐使提交表單。",
        "badarticleerror": "不允許敆茲蜀萆做茲蜀種行為。",
        "cannotdelete": "無能耐刪掉頁面或者文件「$1」。\n可能茲已經共別儂刪掉咯了。",
        "cannotdelete-title": "無辦法刪掉頁面「$1」",
        "perfcachedts": "下底其數據已經緩存過了,最後更新遘$1。{{PLURAL:$4|$4條結果}}會敆緩存臺中討著。",
        "querypage-no-updates": "茲蜀頁其更新乞禁止了。\n數據嚽塊現刻時𣍐更新了。",
        "viewsource": "看源代碼",
-       "viewsource-title": "覷蜀覷$1其源代碼",
+       "viewsource-title": "覷\"$1\"其源代碼",
        "actionthrottled": "行動乞取消咯",
        "protectedpagetext": "茲頁已經乞保護起咯,𣍐使修改或者其它行動。",
        "viewsourcetext": "汝會使看共複製茲蜀頁其源代碼:",
        "viewyourtext": "汝會使覷蜀覷或者複製茲頁'''汝其修改'''其源代碼:",
        "editinginterface": "<strong>警告:</strong>汝敆𡅏修改其頁面廮𡅏提供茲蜀萆軟件其界面文本。\n茲蜀頁其改變會影響遘其它用戶其用戶界面其顯示。",
-       "cascadeprotected": "茲蜀頁受保護,𣍐使編辑,因為茲蜀頁包含敆下底{{PLURAL:$1|頁|頁}}開起“級聯”選項其受保護頁面底裡。\n$2",
+       "cascadeprotected": "茲頁乞保護起去,汝無能耐修改,因為茲頁乞下底有開“級聯”選項其{{PLURAL:$1|頁|頁}}保護頁面引用:\n$2",
        "namespaceprotected": "汝𣍐使修改敆'''$1'''命名空間其頁面。",
        "customcssprotected": "汝𣍐使修改茲蜀萆CSS頁面,因為伊有別蜀隻用戶其設定。",
        "customjsprotected": "汝𣍐使修改茲蜀萆JavaScript頁面,因為伊有別蜀隻用戶其設定。",
        "virus-badscanner": "獃其配置:𣍐八其病毒掃描器:''$1''",
        "virus-scanfailed": "掃描失敗(代碼$1)",
        "virus-unknownscanner": "𣍐八其反病毒:",
-       "logouttext": "<strong>汝現在退出了。</strong>\n\n注意有其頁面可能繼續顯示真像汝已經登錄了,除開汝清理瀏覽器緩存。",
+       "logouttext": "<strong>汝現在已經躒出了。</strong>\n\n注意有其頁面可能會繼續顯示汝未躒出辰候其樣式,除開汝清理瀏覽器緩存。",
        "welcomeuser": "歡迎,$1!",
        "welcomecreation-msg": "汝其賬戶已經開好了。\n伓嗵𣍐記改蜀改汝其[[Special:Preferences|{{SITENAME}}設定]]。",
        "yourname": "用戶名:",
        "userlogin-yourname": "用戶名",
-       "userlogin-yourname-ph": "輸底汝其用戶名",
-       "createacct-another-username-ph": "輸底汝其用戶名",
+       "userlogin-yourname-ph": "敆嚽塊拍入汝其用戶名",
+       "createacct-another-username-ph": "敆嚽塊拍入汝其用戶名",
        "yourpassword": "密碼:",
        "userlogin-yourpassword": "密碼",
-       "userlogin-yourpassword-ph": "輸底汝其密碼",
-       "createacct-yourpassword-ph": "輸底蜀萆密碼",
+       "userlogin-yourpassword-ph": "敆嚽塊拍入汝其密碼",
+       "createacct-yourpassword-ph": "拍入蜀萆密碼",
        "yourpasswordagain": "重新拍囇密碼:",
        "createacct-yourpasswordagain": "確定密碼",
-       "createacct-yourpasswordagain-ph": "再入蜀回密碼",
+       "createacct-yourpasswordagain-ph": "再入蜀回密碼",
        "remembermypassword": "共我敆茲蜀萆瀏覽器其登錄記錄記定幾日(最価$1日){{PLURAL:$1}}",
-       "userlogin-remembermypassword": "保持我登錄其",
+       "userlogin-remembermypassword": "記𡅏我躒入其狀態",
        "userlogin-signwithsecure": "使安全其連接",
        "yourdomainname": "汝其域名:",
        "password-change-forbidden": "汝𣍐使敆茲蜀萆維基百科𡅏修改密碼。",
        "externaldberror": "可能是驗證數據庫綻咯,或者是汝𣍐使升級汝其外部賬戶。",
-       "login": "登錄",
+       "login": "躒入",
        "nav-login-createaccount": "登錄/開賬戶",
-       "userlogin": "登錄/開賬戶",
-       "userloginnocreate": "登錄",
-       "logout": "退出",
-       "userlogout": "退出",
-       "notloggedin": "未登錄",
+       "userlogin": "躒入/開新賬號",
+       "userloginnocreate": "躒入",
+       "logout": "出",
+       "userlogout": "出",
+       "notloggedin": "固未躒入",
        "userlogin-noaccount": "汝無賬戶?",
-       "userlogin-joinproject": "å\85±{{SITENAME}}å\8a åº\95å\85",
-       "nologin": "汝無賬戶?$1",
+       "userlogin-joinproject": "å\8a å\85¥{{SITENAME}}",
+       "nologin": "汝固無賬號?$1",
        "nologinlink": "開蜀隻賬戶",
        "createaccount": "開賬戶",
        "gotaccount": "已經有賬戶了?'''$1'''。",
-       "gotaccountlink": "登錄",
-       "userlogin-resetlink": "ç\99»é\8c\84å\85¶è³\87æ\96\99ð£\8d\90è¨\98å\92¯ï¼\9f",
+       "gotaccountlink": "躒入",
+       "userlogin-resetlink": "èº\92å\85¥å\85¶è³\87æ\96\99ð£\8d\90è¨\98å\8e»æ\98¯ä¼\93æ\98¯ï¼\9f",
        "userlogin-resetpassword-link": "密码𣍐記?",
-       "userlogin-helplink2": "對手汝登錄",
-       "userlogin-loggedin": "汝已經使$1登錄過了。\n卜想使其他用戶登錄,請使下底其表格來登錄。",
+       "userlogin-helplink2": "對手汝躒入",
+       "userlogin-loggedin": "汝已經使$1躒入過了。\n儷是卜想挈其他用戶來躒入,起動汝使下底其表格來躒入。",
        "userlogin-createanother": "新建另外蜀萆賬號",
        "createacct-emailrequired": "電子郵件地址",
-       "createacct-emailoptional": "電子郵件地址(愛寫就寫)",
-       "createacct-email-ph": "輸底汝其電子郵件地址",
-       "createacct-another-email-ph": "輸底電子郵件地址",
+       "createacct-emailoptional": "電地址(愛寫就寫)",
+       "createacct-email-ph": "拍入汝其電批地址",
+       "createacct-another-email-ph": "拍入電批地址",
        "createaccountmail": "使臨時其隨機密碼,共伊送遘指定其電子郵件地址",
        "createacct-realname": "實際其名字(愛寫就寫)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
-       "createacct-reason-ph": "汝奚勢復開蜀隻賬戶",
+       "createacct-reason-ph": "汝奚勢復想開另外蜀隻賬戶?",
        "createacct-captcha": "安全檢查",
-       "createacct-imgcaptcha-ph": "輸底汝敆懸頂看見其文字",
+       "createacct-imgcaptcha-ph": "將汝敆懸頂看見其文字拍出來",
        "createacct-submit": "開賬戶",
        "createacct-another-submit": "新建另外蜀萆賬號",
        "createacct-benefit-heading": "{{SITENAME}}是共汝蜀様其儂做其。",
        "createacct-benefit-body1": "{{PLURAL:$1|修改}}",
        "createacct-benefit-body2": "{{PLURAL:$1|頁面}}",
        "createacct-benefit-body3": "最近其{{PLURAL:$1|貢獻者}}",
-       "badretype": "汝輸底其密碼𣍐蜀様。",
+       "badretype": "汝拍入其密碼𣍐蜀様。",
        "userexists": "用戶名已經乞別人使去了。\n起動另外再起蜀萆名字。",
        "loginerror": "登錄有鄭",
-       "createacct-error": "賬戶開出毛病咯",
+       "createacct-error": "開賬號無成功",
        "createaccounterror": "無能獃開賬戶:$1",
-       "nocookiesnew": "用戶賬號已經創建好了,但是汝未登錄。\n{{SITENAME}}使cookie來記錄已經登錄其用戶。\n但是汝禁用了cookie。\n起動汝開啟cookie,然後再使汝其新用戶共密碼來登錄。",
+       "nocookiesnew": "用戶賬號已經開好了,不過汝固未躒入。\n{{SITENAME}}使cookie來記錄已經躒入其用戶。\n汝其cookie固未開起來。\n起動汝開啟cookie,仱再使汝新其賬號共密碼來躒入。",
        "nocookieslogin": "{{SITENAME}}使cookies來記錄已經登錄其用戶。\n但是汝禁用了cookie。\n起動汝開起cookie,然後再試蜀試。",
        "noname": "汝未指定蜀萆合法其用戶名。",
-       "loginsuccesstitle": "登錄成功",
-       "loginsuccess": "'''汝現在已經「$1」其成功登錄{{SITENAME}}了。'''",
+       "loginsuccesstitle": "躒入成功",
+       "loginsuccess": "'''汝現在已經「$1」其成功躒入{{SITENAME}}了。'''",
        "nosuchuser": "無總款其用戶名「$1」。\n用户名是大小写敏感其。\n检查汝其拼写,或者覷蜀覷[[Special:UserLogin/signup|開新賬戶]]。",
        "nosuchusershort": "無總款其用戶名「$1」。\n檢查汝其拼寫。",
        "nouserspecified": "汝著指定蜀萆用戶名。",
        "login-userblocked": "茲隻用戶已經乞封鎖去了。登錄是𣍐允許其。",
        "wrongpassword": "密碼鄭咯。\n起動再查蜀下。",
-       "wrongpasswordempty": "未輸入密碼。\n請再查蜀下。",
+       "wrongpasswordempty": "未拍入密碼。\n起動汝再試蜀下。",
        "passwordtooshort": "密碼著設最少{{PLURAL:$1|$1萆字符}}。",
-       "password-name-match": "æ±\9då\85¶å¯\86碼硬è\91\97å\85±æ±\9då\85¶ç\94¨æ\88¶å\90\8dð£\8d\90è\9c\80æ§\98æ\89\8dæ\9c\83使å\85。",
+       "password-name-match": "æ±\9då\85¶å¯\86碼ç\84¡è\83½è\80\90å\85±æ±\9då\85¶ç\94¨æ\88¶å\90\8dè\9c\80模è\9c\80樣。",
        "password-login-forbidden": "茲蜀萆用戶名共密碼應經乞禁止去了。",
        "mailmypassword": "重新設置密碼",
        "passwordremindertitle": "{{SITENAME}}其新其臨時密碼",
        "passwordsent": "新密碼已經寄遘「$1」註冊其電子郵件地址了。\n收遘後,請再登錄蜀頭部。",
-       "mailerror": "發電子郵件有賺:$1",
+       "mailerror": "寄電批有綻:$1",
        "acct_creation_throttle_hit": "使汝其IP訪問茲蜀萆維基百科訪問者其已經敆最後蜀日創建{{PLURAL:$1|$1萆賬戶}}去了。茲蜀段時間最価若允許創建茲滿価萆賬戶。故此講使茲蜀萆IP訪問其儂敆現刻時𣍐使再開賬戶了。",
        "emailauthenticated": "汝其電子郵件地址已經敆$2$3確定過了。",
-       "emailnotauthenticated": "汝其電子郵件固未確定過。\n下底其所有特性都𣍐發電子郵件乞汝。",
-       "emailconfirmlink": "確認汝其電子郵件地址",
+       "emailnotauthenticated": "汝其電批固未確定過。\n下底其所有特性都𣍐發電批乞汝。",
+       "emailconfirmlink": "確定汝其電批地址",
        "emaildisabled": "茲萆站點𣍐使發電子郵件。",
        "accountcreated": "賬戶創建了",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|talk]])用戶已經創建。",
        "createaccount-title": "{{SITENAME}}其開賬戶",
        "login-abort-generic": "汝其登錄𣍐成功——放棄去了",
        "loginlanguagelabel": "語言:$1",
-       "pt-login": "登錄",
-       "pt-login-button": "登錄",
+       "pt-login": "躒入",
+       "pt-login-button": "躒入",
        "pt-createaccount": "開新賬號",
-       "pt-userlogout": "退出",
-       "php-mail-error-unknown": "PHP其mail()函數,𣍐八什乇賺去。",
+       "pt-userlogout": "出",
+       "php-mail-error-unknown": "PHP其mail()函數,𣍐曉什乇綻去。",
        "changepassword": "改變密碼",
        "resetpass_header": "改變賬戶其密碼",
        "oldpassword": "舊密碼:",
        "resetpass-submit-cancel": "取消",
        "resetpass-temp-password": "臨時密碼:",
        "passwordreset": "重置密碼",
-       "passwordreset-text-one": "å®\8cæ\88\90è\80\85é\9a»è¡¨å\96®ï¼\8cé\80\9aé\81\8eé\9b»å­\90é\83µä»¶ç\99¼é\80\81è\87¨æ\99\82å¯\86碼來重新設定汝其密碼。",
+       "passwordreset-text-one": "å®\8cæ\88\90è\8c²é\9a»è¡¨å\96®ï¼\8cé\80\9aé\81\8eé\9b»æ\89¹å¯\84è\87¨æ\99\82å¯\86碼å\85¶æ\96¹æ³\95來重新設定汝其密碼。",
        "passwordreset-legend": "重置密碼",
        "passwordreset-username": "用戶名:",
        "passwordreset-domain": "域名:",
-       "passwordreset-email": "電子郵件地址:",
-       "passwordreset-emailsent": "蜀萆密碼重置其電子郵件已經發出去了。",
-       "passwordreset-emailsent-capture": "蜀萆密碼重置其電子郵件已經發出去了,顯示敆下底。",
-       "changeemail": "修改電å­\90é\83µä»¶å\9c°å\9d\80",
-       "changeemail-oldemail": "現刻時其電子郵件地址:",
-       "changeemail-newemail": "新其電子郵件地址:",
+       "passwordreset-email": "電地址:",
+       "passwordreset-emailsent": "蜀萆密碼重新設置其電批已經寄出去了。",
+       "passwordreset-emailsent-capture": "蜀萆密碼重新設置其電批已經寄出去了,內容就是生下底總款。",
+       "changeemail": "修改電æ\89¹å\85¶å\9c°å\9d\80",
+       "changeemail-oldemail": "現刻時其電地址:",
+       "changeemail-newemail": "新其電地址:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝其{{SITENAME}}密碼:",
-       "changeemail-submit": "修改電子郵件地址",
+       "changeemail-submit": "修改電地址",
        "bold_sample": "粗體文字",
        "bold_tip": "粗體文字",
        "italic_sample": "敧其文字",
        "headline_tip": "第二等標題",
        "nowiki_sample": "敆嚽塊插入無格式其文本",
        "nowiki_tip": "無察維基格式",
-       "image_tip": "åµ\8cåº\95其文件",
+       "image_tip": "åµ\8cå\85¥其文件",
        "media_sample": "Liê.ogg",
        "media_tip": "文件鏈接",
        "sig_tip": "汝其帶時間戳其簽名",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "看改變其部分",
-       "anoneditwarning": "<strong>警告:</strong>汝未登錄。\n如果汝做修改,汝其IP地址會敆編輯歷史底裡公開。如果你<strong>[$1登錄]</strong>或者<strong>[$2註册新賬號]</strong>,汝其修改記錄會顯示汝其用戶名,固有其它其好處。",
-       "anonpreviewwarning": "<em>汝未登錄。如果汝保存茲蜀頁其修改,汝其IP地址會記錄敆茲蜀頁其編輯歴史臺中。</em>",
-       "missingcommenttext": "起動敆下底輸底蜀條評論。",
+       "anoneditwarning": "<strong>警告:</strong>汝固未登錄。\n儷是汝做出修改其話,汝其IP地址會敆編輯歷史裡勢公開。儷是汝<strong>[$1躒入]</strong>或者<strong>[$2註册新賬號]</strong>,汝其修改記錄會顯示汝其用戶名,固有其它其好處。",
+       "anonpreviewwarning": "<em>汝固未躒入。儷是汝卜想保存茲蜀頁其修改,汝其IP地址會乞記著茲蜀頁其編輯歷史臺中。</em>",
+       "missingcommenttext": "起動敆下底蜀條評論。",
        "summary-preview": "總結預覽:",
        "blockedtitle": "用戶乞封鎖了",
        "blockednoreason": "無掏出原因",
        "whitelistedittext": "汝必須$1乍會使修改頁面。",
        "loginreqtitle": "需要登錄",
-       "loginreqlink": "登錄",
+       "loginreqlink": "躒入",
        "loginreqpagetext": "起動汝$1以後再看其它頁面。",
        "accmailtitle": "密碼寄出了",
        "accmailtext": "共[[User talk:$1|$1]]用戶隨機生成其密碼已經發遘$2了。汝登錄以後會使敆[[Special:ChangePassword|修改密碼]]頁面修改茲蜀萆密碼。",
        "templatesusedsection": "茲蜀段使其{{PLURAL:$1|模板}}:",
        "template-protected": "(保護)",
        "template-semiprotected": "(半保護)",
+       "permissionserrorstext-withaction": "因為下底其{{PLURAL:$1|原因}},汝無能耐 $2 :",
        "recreate-moveddeleted-warn": "'''注意:汝敆𡅏重新創建舊底已經乞刪唻其頁面。'''\n\n汝應該考慮蜀下繼續去編輯茲蜀頁到底是伓是合適其。茲蜀頁其刪除記錄共移動記錄都敆嚽塊:",
        "edit-conflict": "編輯衝突",
        "content-model-wikitext": "維基文本",
        "timezoneregion-europe": "歐洲",
        "timezoneregion-indian": "印度洋",
        "timezoneregion-pacific": "太平洋",
-       "allowemail": "會肯別儂發電子郵件乞汝",
+       "allowemail": "會肯別儂寄電批乞汝",
        "prefs-searchoptions": "尋討",
        "prefs-namespaces": "命名空間",
        "prefs-files": "文件",
-       "youremail": "電子郵件:",
+       "youremail": "電:",
        "username": "{{GENDER:$1|用戶名}}:",
        "prefs-registration": "開賬戶時間",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "yournick": "新其簽名:",
-       "email": "電子郵件",
+       "email": "電",
        "prefs-help-email": "電子郵件地址是愛寫就寫其,但是如果汝𣍐記密碼咯,密碼重置其時候需要茲。",
        "prefs-help-email-others": "汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。",
        "editusergroup": "修改用戶組",
        "linksearch-line": "$1是趁$2𡅏鏈接過其",
        "emailuser": "寄電子郵件乞茲隻用戶",
        "emailpage": "寄電子郵件乞用戶",
-       "defemailsubject": "{{SITENAME}}趁用戶「$1」𡅏底批",
-       "noemailtitle": "無電子郵件地址",
+       "defemailsubject": "{{SITENAME}}其用戶「$1」寄來其批",
+       "noemailtitle": "無電地址",
        "emailfrom": "趁:",
        "emailto": "遘:",
        "emailsubject": "主題:",
        "emailmessage": "消息:",
        "emailsend": "寄",
        "emailccme": "共我其消息其副本寄我一份電子郵件。",
-       "emailsent": "電子郵件發出了",
-       "emailsenttext": "汝其電子郵件消息已經寄出了。",
+       "emailsent": "電批寄出了",
+       "emailsenttext": "汝其電消息已經寄出了。",
        "watchlist": "我其監視單",
        "mywatchlist": "我其監視單",
        "nowatchlist": "汝其監視單𡅏無項目。",
-       "watchnologin": "未登錄",
+       "watchnologin": "未躒入",
        "addedwatchtext": "頁面「[[:$1]]」已經加遘汝其[[Special:Watchlist|監視單]]。以後敆茲蜀頁其改變共伊關聯其討論頁都會列敆嚽塊。",
        "removewatch": "趁汝其監視單臺中移去",
        "removedwatchtext": "頁面「[[:$1]]」已經趁[[Special:Watchlist|汝其監視單]]移去了。",
        "excontentauthor": "乇是:「$1」(並且作者囇有「[[Special:Contributions/$2|$2]]」)",
        "exbeforeblank": "空白以前其乇是:「$1」",
        "historywarning": "<strong>警告:</strong>汝卜想刪掉其頁面有$1隻{{PLURAL:$1|版本|版本}}其蜀段歷史:",
-       "confirmdeletetext": "æ±\9dæº\96å\82\99å\85¨é\9a»é \81é\9d¢å\85±æ\96\87ç« é\80£ä¼\8aæ\95\86è\9c\80å¡\8aå\85¶æ­·å\8f²å\85¨é\83¨å\88ªæ\8e\89ã\80\82\nè«\8bæ±\9d確èª\8dï¼\9aæ±\9dç\95¶ç\9c\9få\8d\9cæ\83³ç¸½æ¬¾å\81\9aï¼\8cæ±\9dç\9e­è§£ç¸½æ¬¾å\81\9aå\85¶å¾\8cæ\9e\9cï¼\8c並ä¸\94æ±\9d總款å\81\9aäº\8b符合[[{{MediaWiki:Policy-url}}]]其。",
+       "confirmdeletetext": "æ±\9dæº\96å\82\99å°\87å\9b«å\9c\87é\9a»é \81é\9d¢æ\88\96è\80\85å\9c\96ç\89\87ï¼\88å\8c\85æ\8b¬ä¼\8aå\85¶æ­·å\8f²ï¼\89å\85¨é\83¨å\88ªå\94»ã\80\82\nè«\8bæ±\9d確å®\9aï¼\9aæ±\9dç\95¶ç\9c\9få\8d\9cæ\83³ç¸½æ¬¾å\81\9aï¼\8cæ±\9dç\9e­è§£ç¸½æ¬¾å\81\9aå\85¶å¾\8cæ\9e\9cï¼\8c並ä¸\94æ±\9d總款å\81\9aæ\98¯符合[[{{MediaWiki:Policy-url}}]]其。",
        "actioncomplete": "行動成功",
        "actionfailed": "操作失敗",
        "deletedtext": "「$1」已經乞刪掉去了。\n最近其刪除記錄看$2。",
        "whatlinkshere-hideimages": "$1 文件鏈接",
        "whatlinkshere-filters": "過濾器",
        "blockip": "封鎖{{GENDER:$1|用戶}}",
-       "blockiptext": "使ä¸\8båº\95å\85¶è¡¨å\96®ä¾\86å°\81é\8e\96è¶\81æ\8c\87å®\9aIPå\9c°å\9d\80æ\88\96è\80\85ç\94¨æ\88¶å\90\8då\85¶å¯«å\85¥è¨ªå\95\8fã\80\82è\8c²å\9b\87使廮ð¡\85\8fé\98²æ­¢ç ´å£\9eï¼\8cå\9bºå\8a è\91\97符å\90\88[[{{MediaWiki:Policy-url}}|æ\94¿ç­\96]]ã\80\82æ\95\86ä¸\8båº\95å¡«åº\95指定其原因(比如講:引用乞破壞其頁面)。",
+       "blockiptext": "使ä¸\8båº\95å\85¶è¡¨å\96®ä¾\86å°\81é\8e\96è¶\81æ\8c\87å®\9aIPå\9c°å\9d\80æ\88\96è\80\85ç\94¨æ\88¶å\90\8då\85¶å¯«å\85¥è¨ªå\95\8fã\80\82è\8c²å\9b\87使廮ð¡\85\8fé\98²æ­¢ç ´å£\9eï¼\8cå\9bºå\8a è\91\97符å\90\88[[{{MediaWiki:Policy-url}}|æ\94¿ç­\96]]ã\80\82æ\95\86ä¸\8båº\95å¡«å\85¥指定其原因(比如講:引用乞破壞其頁面)。",
        "ipaddressorusername": "IP地址或者用戶名:",
        "ipbexpiry": "過期:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名",
        "ipbcreateaccount": "封鎖開賬戶",
-       "ipbemailban": "防止用戶寄電子郵件",
+       "ipbemailban": "防止用戶寄電",
        "ipbenableautoblock": "自動封鎖茲用戶其IP地址",
        "ipbsubmit": "封鎖茲用戶",
        "ipbother": "其它時間",
        "lockdbsuccesssub": "數據庫鎖定好了",
        "databasenotlocked": "茲數據庫無鎖。",
        "move-page-legend": "移動頁面",
-       "movepagetext": "使下底其表單來重新共茲蜀頁起蜀萆名字,移動伊所有其歷史遘伊其新名字。\n舊其標題會變成新其標題其重定向頁。\n汝會使自動更新重定向許蜀點遘原底其標題。\n如果伊結果伓是總款咯,許汝著檢查[[Special:DoubleRedirects|雙重重定向]]或者[[Special:BrokenRedirects|獃其重定向]]。\n汝著為鏈接會使繼續鏈遘伊應該跳轉其地方負責任。\n\n注意如果許塊已經有蜀頁去了,噲頁面就'''𣍐'''移過了,除開許囇是蜀萆重定向固加無舊底其修改歷史。\n茲其意思就是講如果汝名字起賺了,汝會使共茲蜀萆頁面重新起伊原底其名字,但是𣍐使覆蓋已經存在其頁面。\n\n'''警告!'''\n茲可能會對一般頁面造成過大其固加無辦法預見遘其改變;\n起動汝著敆做之前會意總款做其後果。",
+       "movepagetext": "使下底其表單重新乞茲蜀頁起蜀萆名字,移動伊共伊所有其歷史遘伊其新名字。\n舊其標題會變成新其標題其重定向頁。\n汝會使自動更新重定向許蜀點遘原底其標題。\n如果伊結果伓是總款其話,汝著檢查蜀下[[Special:DoubleRedirects|雙重重定向]]或者[[Special:BrokenRedirects|獃其重定向]]。\n汝有責任讓頁面鏈接遘正確其地方。\n\n注意儷是許塊已經有蜀隻頁面,噲就'''無能耐'''移動過了,除開噲儷是蜀萆重定向並且無舊底其修改歷史。\n嚽其意思就是講儷是汝名字起綻了,汝會使將茲蜀萆頁面重新起伊原底其名字,但是𣍐使覆蓋已經有其頁面。\n\n'''警告!'''\n嚽可能會對一般頁面造成盡大其並且無能耐想遘其改變;\n起動汝著敆做之前會意總款做其後果。",
        "movepagetalktext": "相關其討論頁會自動共伊移遘'''無挃''':\n* 汝其新其用戶名已經有蜀頁有內容其討論頁,或者\n* 汝取消下底其框框。\n\n若總款,汝會使自家移動或者是合併頁面。",
        "movearticle": "移動頁面",
-       "movenologintext": "著[[Special:UserLogin|登錄]]才會使移動頁面。",
+       "movenologintext": "著[[Special:UserLogin|躒入]]才有能耐移動頁面。",
        "newtitle": "遘新題目:",
        "move-watch": "監視茲頁",
        "movepagebtn": "移動頁面",
        "tooltip-pt-preferences": "汝其設定",
        "tooltip-pt-watchlist": "汝監視其頁面有改過其單單",
        "tooltip-pt-mycontris": "汝其貢獻其單單",
-       "tooltip-pt-login": "希望汝登錄其;當然,無逼汝總款做。",
-       "tooltip-pt-logout": "退出",
+       "tooltip-pt-login": "希望汝先躒入;不過儂家無逼汝總款做。",
+       "tooltip-pt-logout": "出",
        "tooltip-ca-talk": "茲蜀頁其討論",
        "tooltip-ca-edit": "汝會使修改茲蜀頁。起動敆保存以前使預覽按鈕",
        "tooltip-ca-addsection": "開始蜀萆新其部分",
        "tooltip-ca-protect": "保護茲蜀頁",
        "tooltip-ca-delete": "刪掉茲蜀頁",
        "tooltip-ca-move": "移動茲蜀頁",
-       "tooltip-ca-watch": "å\85±茲蜀頁加遘汝其監視單",
+       "tooltip-ca-watch": "å°\87茲蜀頁加遘汝其監視單",
        "tooltip-ca-unwatch": "共茲頁趁監視單𡅏移開去",
        "tooltip-search": "尋討 {{SITENAME}} [alt-f]",
        "tooltip-search-fulltext": "敆茲幾頁𡅏尋討茲文字",
        "tooltip-t-whatlinkshere": "鏈遘嚽塊其所有維基頁面其單單",
        "tooltip-t-recentchangeslinked": "鏈遘茲頁其頁面其最近修改",
        "tooltip-t-contributions": "茲蜀用戶其貢獻單單",
-       "tooltip-t-emailuser": "å\85±è\8c²è\9c\80é\9a»ç\94¨æ\88¶ç\99¼é\9b»å­\90é\83µä»¶",
+       "tooltip-t-emailuser": "å\90\91è\8c²è\9c\80é\9a»ç\94¨æ\88¶å¯\84é\9b»æ\89¹",
        "tooltip-t-upload": "上傳文件",
        "tooltip-t-specialpages": "特殊頁其單單",
        "tooltip-t-print": "茲蜀頁其會拍印其版本",
        "tooltip-ca-nstab-template": "覷蜀覷模板",
        "tooltip-minoredit": "共茲標記成過幼修改",
        "tooltip-save": "保存汝其改變 [alt-s]",
-       "tooltip-preview": "預覽汝其改變,起動敆汝保存以前使茲。",
+       "tooltip-preview": "先覷蜀下汝其改變,起動汝敆保存之前先使蜀使嚽。",
        "tooltip-watch": "共茲蜀頁加遘汝其監視單[alt-w]",
        "anonymous": "{{SITENAME}}其無名{{PLURAL:$1|用戶}}",
        "lastmodifiedatby": "茲頁最後是$3著$1$2改變其。",
        "exif-subjectdistancerange-0": "𣍐八",
        "namespacesall": "所有",
        "monthsall": "囫圇年",
-       "confirmemail": "確定電子郵件地址",
+       "confirmemail": "確定電地址",
        "confirmemail_invalid": "確認碼無效。\n可能已經過期了。",
        "confirmemail_needlogin": "汝著$1來確定汝其電子郵件地址。",
-       "confirmemail_loggedin": "汝其電子郵件地址現在已經確定去了。",
+       "confirmemail_loggedin": "汝其電地址現在已經確定去了。",
        "confirmemail_body": "有人(可能是汝)敆IP地址$1𡅏已經使茲蜀萆電子郵件地址來註冊蜀萆賬戶「$2」去了。\n\n卜想確認茲蜀萆賬戶當真是汝其,固加敆{{SITENAME}}激活電子郵件特點,許敆汝其瀏覽器𡅏拍開茲蜀萆鏈接:\n\n$3\n\n如果汝*無*註冊茲賬戶,單擊茲蜀萆鏈接來取消電子郵件確認:\n\n$5\n\n茲蜀萆確認代碼會敆$4時候過期。",
        "deletedwhileediting": "<strong>警告:</strong>茲蜀頁敆汝編輯以前已經乞刪唻了!",
        "recreate": "重新開",
index db1256a..af91202 100644 (file)
        "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.",
        "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш",
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
-       "tog-norollbackdiff": "Юха яккхиначул тӀаьхьа ма гайта версийн башхо",
+       "tog-norollbackdiff": "Юха яьккхиначул тӀаьхьа ма гайта версийн башхо",
        "tog-useeditwarning": "Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь",
        "tog-prefershttps": "Даима лела йе лардина системин чудалар",
        "underline-always": "Даимна",
        "underline-never": "Цкъа а",
-       "underline-default": "Ð\9bелайа Ð±Ñ\80аÑ\83зеÑ\80ан Ð½Ð¸Ñ\81йарца",
+       "underline-default": "Ð\9bелае Ð±Ñ\80аÑ\83зеÑ\80ан Ð½Ð¸Ñ\81Ñ\8fрца",
        "editfont-style": "Тадар чохь долу шрифт:",
        "editfont-default": "Браузеран гӀирса чура шрифт",
        "editfont-monospace": "Цхьатерра доцу шрифт",
        "newpage": "Керла агӀо",
        "talkpage": "Дийцаре йила хӀара агӀо",
        "talkpagelinktext": "Дийцаре",
-       "specialpage": "Белха агӀо",
+       "specialpage": "Белхан агӀо",
        "personaltools": "Долахь болу гӀирсаш",
        "articlepage": "Хьажа яззаме",
        "talk": "Дийцаре",
        "nstab-main": "Яззам",
        "nstab-user": "Декъашхо",
        "nstab-media": "Медиа агӀо",
-       "nstab-special": "Белха агӀо",
+       "nstab-special": "Белхан агӀо",
        "nstab-project": "Проектах лаьцна",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Хаам",
        "no-null-revision": "«$1» агӀона нисдар дан цаделира",
        "badtitle": "Цамегаш йолу цӀе",
        "badtitletext": "Дехарца йолу агӀонан цӀе нийса яц, йаьсса ю, хила мега нийса ца хӀоттийна меттаюкъар йа юкъарвики цӀе. Хила мега, цӀарца цамагош йолу символаш.",
-       "perfcached": "Лахара хаам схьаэца кэша чура цундела тӀаьххьарлера хийцамаш гойтуш бац. Кэша чохь латтайо оцул $1  кӀезиг {{PLURAL:$1|дӀаяздар}}.",
-       "perfcachedts": "Ð\9bаÑ\85аÑ\80а Ñ\85аам Ñ\81Ñ\85Ñ\8cаÑ\8dÑ\86а ÐºÑ\8dÑ\88а Ñ\87Ñ\83Ñ\80а Ð¸Ð·Ð° Ñ\82Ó\80аÑ\8cÑ\85Ñ\8cаÑ\80а ÐºÐ°Ñ\80ла Ñ\8fлла $1. Ð\9aÑ\8dÑ\88а Ñ\87оÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82а Ð´Ð¾ Ð¾Ñ\86Ñ\83л $4 ÐºÓ\80езиг {{PLURAL:$4|1=дÓ\80аÑ\8fздаÑ\80|дÓ\80аÑ\8fздаÑ\80Ñ\88}}.",
+       "perfcached": "Ð\9bаÑ\85аÑ\80а Ñ\85аам Ñ\81Ñ\85Ñ\8cаÑ\8dÑ\86на ÐºÑ\8dÑ\88а Ñ\87Ñ\83Ñ\80а Ñ\86Ñ\83ндела Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80а Ñ\85ийÑ\86амаÑ\88 Ð³Ð¾Ð¹Ñ\82Ñ\83Ñ\88 Ð±Ð°Ñ\86. Ð\9aÑ\8dÑ\88а Ñ\87оÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82айо Ð¾Ñ\86Ñ\83л $1  ÐºÓ\80езиг {{PLURAL:$1|дÓ\80аÑ\8fздаÑ\80}}.",
+       "perfcachedts": "Ð\9bаÑ\85аÑ\80а Ñ\85аам Ñ\81Ñ\85Ñ\8cаÑ\8dÑ\86на ÐºÑ\8dÑ\88а Ñ\87Ñ\83Ñ\80а Ð¸Ð·Ð° Ñ\82Ó\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80а ÐºÐ°Ñ\80лаÑ\8fÑ\8cлла $1. Ð\9aÑ\8dÑ\88а Ñ\87оÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82а Ð´Ð¾ Ð¾Ñ\86Ñ\83л $4 ÐºÓ\80езиг {{PLURAL:$4|дÓ\80аÑ\8fздаÑ\80}}.",
        "querypage-no-updates": "ХӀинца хӀара агӀо карлаякхар дӀадайина ду.\nКхузахь гайтина болу хаамаш карла боккхур бац.",
        "viewsource": "Хьажар",
        "viewsource-title": "Агӏона $1 дуьххьарлера йозане хьажар",
        "storedversion": "Ӏалашйина верси",
        "editingold": "'''ДӀахьедар. Ахьа таеш ю хӀокху агӀона шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀехьа хьалхо бина хийцамаш дӀабяра бу.",
        "yourdiff": "Башхаллаш",
-       "copyrightwarning": "ТеÑ\80гаме Ñ\85Ñ\8cажа, Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззаман Ñ\87Ñ\83Ñ\82Ñ\83Ñ\85Ñ\83Ñ\88 Ð´Ð¾Ð»Ñ\83 Ð¹Ð¾Ð·Ð°Ð½ Ñ\85ийÑ\86ам Ñ\85Ñ\8cажаÑ\80еÑ\85Ñ\8c Ð±Ñ\83, Ð°Ñ\80аÑ\85оÑ\8cÑ\86Ñ\83Ñ\88Ñ\81анна Ð¾Ñ\86Ñ\83 Ð±Ð°ÐºÑ\8aойалаÑ\80 Ñ\85Ñ\8cолÑ\8fÑ\85Ñ\8c $2 (Ñ\85Ñ\8cаж. $1).\nÐ\9dагаÑ\85Ñ\8c Ñ\85Ñ\8cо Ð»Ñ\83Ñ\83Ñ\88 Ð²Ð°Ñ\86аÑ\85Ñ\8c Ñ\85Ñ\8cай Ð¹Ð¾Ð·Ð°Ð½Ð°Ñ\88 Ð¼Ð°Ñ\8cÑ\80Ñ\88а Ð´Ð°Ñ\80жа Ð° ÐºÑ\85еÑ\87аÑ\8cÑ\80га Ñ\85ийÑ\86ам Ð±Ð°Ð¹Ñ\82а, Ð¼Ð°Ð´Ð°Ñ\85а Ñ\83Ñ\8cÑ\88 ÐºÑ\85Ñ\83 Ñ\87Ñ\83.<br />\nÐ\98Ñ\88Ñ\82а Ñ\87lагlо Ð¹Ð¾Ð¹ Ð°Ñ\85Ñ\8cа, Ð°Ð¹Ñ\85Ñ\8cа Ð´Ð°Ð»Ð¾Ñ\88 Ð´Ð¾Ð»Ñ\83Ñ\87Ñ\83Ñ\8cн Ñ\85Ñ\8cо ÐºÑ\83Ñ\8cг Ð´Ð° Ð²Ñ\83 Ð°Ñ\8cлла, Ð¹Ð° Ñ\85Ñ\8cаÑ\8dÑ\86на Ñ\86Ñ\85Ñ\8cан\nÑ\85Ñ\8cоÑ\81Ñ\82еÑ\80а, Ñ\85ийÑ\86ам Ð±Ð° Ð° Ð´lаÑ\81а Ð´Ð°Ñ\80жада Ð° Ñ\87Ñ\83лаÑ\86ам Ð±Ð¾Ð»Ñ\83Ñ\88.<br />\n'''Ð\9cÐ\90ТÐ\9eÐ¥Ð\98Ð\99Ш Ð\91Ð\90Ð\9aЪÐ\9e Ð\99Ð\9eЦУ Ð\93lИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
+       "copyrightwarning": "ТеÑ\80гаме Ñ\85Ñ\8cажа, Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззаман Ñ\87Ñ\83Ñ\82Ñ\83Ñ\85Ñ\83Ñ\88 Ð´Ð¾Ð»Ñ\83 Ð¹Ð¾Ð·Ð°Ð½ Ñ\85ийÑ\86ам Ñ\85Ñ\8cажаÑ\80еÑ\85Ñ\8c Ð±Ñ\83, Ð°Ñ\80аÑ\85оÑ\8cÑ\86Ñ\83Ñ\88Ñ\81анна Ð¾Ñ\86Ñ\83 Ð»Ð¸Ñ\86ензи Ñ\85Ñ\8cолÑ\8fÑ\85Ñ\8c $2 (Ñ\85Ñ\8cаж. $1).\nÐ\9dагаÑ\85Ñ\8c Ñ\85Ñ\8cо Ð»Ñ\83Ñ\83Ñ\88 Ð²Ð°Ñ\86аÑ\85Ñ\8c Ñ\85Ñ\8cай Ð¹Ð¾Ð·Ð°Ð½Ð°Ñ\88 Ð¼Ð°Ñ\8cÑ\80Ñ\88а Ð´Ð°Ñ\80жа Ð° ÐºÑ\85еÑ\87аÑ\8cÑ\80га Ñ\85ийÑ\86ам Ð±Ð°Ð¹Ñ\82а, Ð¼Ð°Ð´Ð°Ñ\85а Ñ\83Ñ\8cÑ\88 ÐºÑ\85Ñ\83 Ñ\87Ñ\83.<br />\nÐ\98Ñ\88Ñ\82а Ñ\87Ó\80агÓ\80о Ð¹Ð¾Ð¹ Ð°Ñ\85Ñ\8cа, Ð°Ð¹Ñ\85Ñ\8cа Ð´Ð°Ð»Ð¾Ñ\88 Ð´Ð¾Ð»Ñ\83Ñ\87Ñ\83Ñ\8cн Ñ\85Ñ\8cо ÐºÑ\83Ñ\8cг Ð´Ð° Ð²Ñ\83 Ð°Ñ\8cлла, Ñ\8f Ñ\85Ñ\8cаÑ\8dÑ\86на Ñ\86Ñ\85Ñ\8cан\nÑ\85Ñ\8cоÑ\81Ñ\82еÑ\80а, Ñ\85ийÑ\86ам Ð±Ð° Ð° Ð´Ó\80аÑ\81а Ð´Ð°Ñ\80жада Ð° Ñ\87Ñ\83лаÑ\86ам Ð±Ð¾Ð»Ñ\83Ñ\88.<br />\n'''Ð\9cÐ\90ТÐ\9eÐ¥Ð\98Ð\99Ш Ð\91Ð\90Ð\9aЪÐ\9e Ð\99Ð\9eЦУ Ð\93Ó\80ИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
-       "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо гӀаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьхьара бина болу хийцамна тептар чура:",
+       "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо гӀаролла дина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо гӀаролла йина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "revisionasof": "Верси $1",
        "revision-info": "Верси $1; {{GENDER:$6|$2}}$7",
        "previousrevision": "← Хьалха йоьдург",
-       "nextrevision": "Тlаьхьайогlург →",
+       "nextrevision": "ТӀаьхьа йогӀург →",
        "currentrevisionlink": "Карара верси",
        "cur": "карара.",
        "next": "кхин",
        "notextmatches": "АгӀонаш чура йозанашца цхьатерра йогӀуш яц",
        "prevn": "хьалхарнаш {{PLURAL:$1|$1}}",
        "nextn": "тӀаьхьйогӀурш {{PLURAL:$1|$1}}",
+       "prev-page": "Хьалха йоьду агӀо",
+       "next-page": "тӀаьхьа йогӀу агӀо",
        "prevn-title": "{{PLURAL:$1|1=Хьалхара $1 дӀаяздар|Хьалхара $1 дӀаяздарш}}",
        "nextn-title": "{{PLURAL:$1|1=ТӀаьхьара $1 дӀаяздар|ТӀаьхьара $1 дӀаяздарш}}",
        "shown-title": "АгӀона чохь $1 {{PLURAL:$1|1=дӀаяздар|дӀаяздарш}} гайта",
        "localtime": "Меттигера хан:",
        "timezoneuseserverdefault": "Серверан ($1) гӀирс лелабе",
        "timezoneuseoffset": "Кхин (билгалде дӀахилар)",
-       "servertime": "Сервера хан:",
+       "servertime": "Серверан хан:",
        "guesstimezone": "Юза браузеран чура",
        "timezoneregion-africa": "Африка",
        "timezoneregion-america": "Америка",
        "userrights-groupsmember": "Декъашхо:",
        "userrights-groupsmember-auto": "Бакъонашан тоба:",
        "userrights-groups-help": "Хьона хийца ло декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Знако * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
-       "userrights-reason": "Ð\91аÑ\85Ñ\8cан:",
+       "userrights-reason": "Ð\91аÑ\85Ñ\8cна:",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
        "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
        "userrights-notallowed": "Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.",
        "http-curl-error": "URLан гӀалат: $1",
        "upload-curl-error6": "Билгал дина адресе хьажа цало.",
        "upload-curl-error28": "Чуйоккху хан чеккхелла",
-       "license": "Ð\91акÑ\8aойалаÑ\80:",
-       "license-header": "Ð\91акÑ\8aойалаÑ\80",
+       "license": "Ð\9bиÑ\86ензи:",
+       "license-header": "Ð\9bиÑ\86ензи",
        "nolicense": "Яц",
        "licenses-edit": "Лицензин параметраш хийца",
        "license-nopreview": "(Хьалха хьажа цало)",
        "filehist-filesize": "Файлан барам",
        "filehist-comment": "Билгалдаккхар",
        "imagelinks": "Файл лелор",
-       "linkstoimage": "{{PLURAL:$1|ТӀаьхьайогӀу $1 агӀо тӀетевжина|ТӀаьхьайогӀу $1 агӀонаш тӀетевжина}} хӀокху файлан:",
+       "linkstoimage": "ХӀара файл лахарчу {{PLURAL:$1|$1 агӀонгахь}} лелош ю:",
        "linkstoimage-more": "$1 дукха {{PLURAL:$1|агӀонаш}} чохь лелош ю хӀара файл.\nХӀокху могӀам чохь {{PLURAL:$1|гойтуш ю $1 хьажорг|гойтуш ю $1 хьажоргаш}} хӀокху файланца.\nКхин хьажа йиш ю [[Special:WhatLinksHere/$2|буьззина могӀаме]].",
        "nolinkstoimage": "АгӀонашчохь файл лелош яц.",
        "linkstoimage-redirect": "$1 (файлан дӀасахьажораг) $2",
        "wantedtemplates": "Оьшуш йолу кепаш",
        "mostlinked": "Дуккха хьажоргаш тӀе тоьхна йолу агӀонаш",
        "mostlinkedcategories": "Дуккха тӀе хьажораш йолу категореш",
-       "mostlinkedtemplates": "Ð\9cаÑ\81Ñ\81аÑ\80ел Ð´Ñ\83ккÑ\85а Ð° Ð»ÐµÐ»Ð°Ð´Ð¾ ÐºÐµÐ¿аш",
+       "mostlinkedtemplates": "Ð\9cаÑ\81Ñ\81аÑ\80ел Ð´Ñ\83ккÑ\85а Ð° Ð»ÐµÐ»Ð°Ð¹Ð¾ Ð°Ð³Ó\80онаш",
        "mostcategories": "Дуккха категореш тӀе тоьхна йолу агӀонаш",
        "mostimages": "Массарел дуккха лелайо файлаш",
        "mostinterwikis": "Дуккха юкъарвики хьажоргаш тӀе тоьхна йолу агӀонаш",
        "ancientpages": "ТӀаьххьарлерачу хенаца нисбина яззамаш",
        "move": "ЦӀе хийца",
        "movethispage": "ХӀокху агӀон цӀе хийца",
-       "unusedimagestext": "Ð\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\82идаме Ñ\8dÑ\86а, ÐºÑ\85ин Ð¹Ð¾Ð»Ñ\83 Ð´Ñ\83Ñ\8cнана Ð¼Ð°Ñ\88ан-меÑ\82Ñ\82игаÑ\88 Ð° Ð»ÐµÐ»Ð¾Ñ\88 Ñ\85ила Ð¼ÐµÐ³Ð° Ð½Ð¸Ð¹Ñ\81Ñ\81а Ð¹Ð¾Ð³Ó\80Ñ\83 Ñ\85Ñ\8cажоÑ\80г (URL) Ñ\85Ó\80окÑ\85Ñ\83 Ñ\85Ó\80Ñ\83ман, Ñ\85Ó\80окÑ\85Ñ\83 Ð¼Ð¾Ð³Ó\80аме Ð¹Ð¾Ð³Ó\80Ñ\83Ñ\88 Ñ\8fлаÑ\85Ñ\8c Ñ\8fÑ\86ахь а иза хила мега жигара лелош.",
+       "unusedimagestext": "Ð\9bаÑ\85аÑ\80а Ñ\84айлаÑ\88 Ñ\86Ñ\85Ñ\8cана Ð°Ð³Ó\80онгаÑ\85Ñ\8c Ð»ÐµÐ»Ð¾Ñ\88 Ñ\8fÑ\86.\nÐ\94еÑ\85аÑ\80 Ð´Ð¾, Ñ\82идаме Ð±Ðµ, ÐºÑ\85ин Ð¹Ð¾Ð»Ñ\83 Ð²ÐµÐ±-Ñ\81айÑ\82аÑ\88 Ð° Ð»ÐµÐ»Ð¾Ñ\88 Ñ\85ила Ð¼ÐµÐ³Ð° Ð½Ð¸Ð¹Ñ\81Ñ\81а Ð¹Ð¾Ð³Ó\80Ñ\83 Ñ\85Ñ\8cажоÑ\80г (URL), Ñ\85Ó\80окÑ\85Ñ\83 Ð¼Ð¾Ð³Ó\80аме Ð¹Ð¾Ð³Ó\80Ñ\83Ñ\88 Ñ\8fлахь а иза хила мега жигара лелош.",
        "unusedcategoriestext": "ХӀокху категорешан чохь агӀонаш я кхин категореш яц.",
        "notargettitle": "Ӏалашо билгал йина яц",
        "notargettext": "И кхочушдан ахьа билгал йина яц Ӏалашонан агӀо я декъашхо.",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "allpages": "Массо агӀонаш",
-       "nextpage": "Тlаьхьа йогlу агlо ($1)",
-       "prevpage": "Хьалхалера агlо ($1)",
+       "nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
+       "prevpage": "Хьалха йоьду агӀо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "allpagesto": "Араяхар сацадé тӀе:",
        "allarticles": "Массо агӀонаш",
        "import-interwiki-history": "ХӀокху агӀона ерриг хийцаман истори копи ян",
        "import-interwiki-templates": "Юкъайихка массо кепаш",
        "import-interwiki-submit": "Импорт ян",
-       "import-interwiki-namespace": "Коьрта цӀерийн ана:",
-       "import-interwiki-rootpage": "Коьрта агӀо (тӀехь дац):",
        "import-upload-filename": "Файлан цӀе:",
        "import-comment": "Билгалдаккхар:",
        "importstart": "АгӀонаш импорт яр…",
        "tooltip-t-contributions": "ХӀокху декъашхочо хийцина йолу агӀонийн могӀам",
        "tooltip-t-emailuser": "ДӀабахьийта хаам оцу декъашхона",
        "tooltip-t-upload": "Чуйаха файлаш",
-       "tooltip-t-specialpages": "Белха агӀонанийн могӀам",
+       "tooltip-t-specialpages": "Белхан агӀонанийн могӀам",
        "tooltip-t-print": "Хlокху агlонна зорба туху башхо",
        "tooltip-t-permalink": "Даима йолу хьажорг хӀокху башха агӀонна",
        "tooltip-ca-nstab-main": "Яззамна чулацам",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
-       "tooltip-ca-nstab-special": "ХӀара белха агӀо ю, хӀара тая луш яц",
+       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара тая луш яц",
        "tooltip-ca-nstab-project": "Кхолламан дакъа",
        "tooltip-ca-nstab-image": "Хlуман агlо",
        "tooltip-ca-nstab-mediawiki": "Хааман агlо MediaWiki",
        "filedeleteerror-long": "Файл дӀайоккхуш гӀалат даьлла:\n\n$1",
        "filedelete-missing": "Файл «$1» дӀаяккха цало, и цахилар бахьнехь.",
        "filedelete-old-unregistered": "Файлан «$1» билгалйина верси хаамийн базан чохь яц.",
-       "previousdiff": "← Хьалхдоьда нисдинарг",
-       "nextdiff": "Тlяхьа догlа нисдинарг →",
+       "previousdiff": "â\86\90 Ð¥Ñ\8cалÑ\85а Ð´Ð¾Ñ\8cда Ð½Ð¸Ñ\81динаÑ\80г",
+       "nextdiff": "ТӀаьхьа догӀа нисдинарг →",
        "imagemaxsize": "Суьртан бараман доза тохар:<br />''(Файла агӀона куц дийцар)''",
        "thumbsize": "Жима дина суьртан барам:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|агӀо}}",
        "exif-whitepoint": "Къайн тӀадаман бос",
        "exif-primarychromaticities": "Коьрта беснийн бос",
        "exif-referenceblackwhite": "Ӏаьржа а къай а тӀадамийн меттиг",
-       "exif-datetime": "Файл хийцина терахь а хан",
+       "exif-datetime": "Файлан хийцам бина терахь а, хан а",
        "exif-imagedescription": "Суьртан цӏе",
        "exif-make": "Камера арахоьцург",
        "exif-model": "Камеран модель",
        "exif-exposuretime-format": "$1 ($2) чура",
        "exif-fnumber": "Диафрагмин дукхалла",
        "exif-exposureprogram": "Экспозицин программа",
+       "exif-isospeedratings": "ISO серло хааялар",
        "exif-shutterspeedvalue": "APEX чура дешнаш",
        "exif-aperturevalue": "APEX чура оьз",
        "exif-exposurebiasvalue": "Сурт доккхуш яла оьшу серло меттаяло",
        "confirm-unwatch-top": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?",
        "comma-separator": ",&#32;",
        "quotation-marks": "«$1»",
-       "imgmultipageprev": "← хьалхара агlо",
-       "imgmultipagenext": "тlаьхьара агlо →",
+       "imgmultipageprev": "← хьалха йоьду агӀо",
+       "imgmultipagenext": "тӀаьхьа йоьгӀу агӀо →",
        "imgmultigo": "ДехьагӀо!",
        "imgmultigoto": "АгӀончу $1 гӀо",
        "img-lang-default": "(Ӏад битарца болу мотт)",
        "img-lang-go": "Кхочушдé",
        "ascending_abbrev": "гар",
        "descending_abbrev": "йина",
-       "table_pager_next": "Тlаьхьа йогlу агlо",
-       "table_pager_prev": "Хьалха йоьду агlо",
+       "table_pager_next": "ТӀаьхьа йогӀу агӀо",
+       "table_pager_prev": "Хьалха йоьду агӀо",
        "table_pager_first": "Дуьххьаралера агlо",
        "table_pager_last": "Тlаьххьаралера агlо",
        "table_pager_limit": "Гайта $1 хlумнаш агlон тlаьхь",
        "tags-deactivate-title": "ДӀаяйа билгало",
        "tags-deactivate-reason": "Бахьна:",
        "tags-deactivate-submit": "ДӀаяйа",
+       "tags-edit-title": "Тегаш таян",
+       "tags-edit-existing-tags": "Йолуш йолу билгалонаш:",
+       "tags-edit-existing-tags-none": "''ХӀахӀа''",
+       "tags-edit-new-tags": "Керла билгалонаш:",
+       "tags-edit-reason": "Бахьна:",
        "comparepages": "АгӀонаш юстар",
        "compare-page1": "Дуьххьаралера агӀо",
        "compare-page2": "ШолгӀа агӀо",
index 2eecb5c..b8ed851 100644 (file)
        "suppress": "چاودێری",
        "booksources": "سەرچاوەکانی کتێب",
        "booksources-search-legend": "بۆ سەرچاوەی کتێب بگەڕێ",
+       "booksources-search": "بگەڕێ",
        "booksources-text": "لە خوارەوە لیستێک لە بەستەر بۆ ماڵپەڕهایەک کە کتێبی نوێ و بەکارهێنراو دەفرۆشێت و لەوانەیە لەوێ زانیاریی زیاترت دەست‌کەوێت سەبارەت بەو کتێبانەی لە دووی دەگەڕیت:",
        "booksources-invalid-isbn": "ISBN دراو لەوە ناچی بەکار بێت، سەرنج بدە لە کاتی کۆپی کردن لە سەرچاوە تووشی هەڵە نوبوبێت.",
        "specialloguserlabel": "بەجێھێنەر:",
        "import-interwiki-history": "هەموو مێژووی پێداچوونەوەکانی ئەم پەڕەیە کۆپی بکە",
        "import-interwiki-templates": "ھەموو داڕێژەکان لەخۆبگرێتەوە",
        "import-interwiki-submit": "هاوردە بکە",
-       "import-interwiki-namespace": "بۆشاییی ناوی مەبەست:",
-       "import-interwiki-rootpage": "پەڕەی بنەڕەتیی مەبەست (دڵخوازانە):",
        "import-upload-filename": "ناوی پەڕگە‌:",
        "import-comment": "بۆچوون:",
        "importtext": "تکایە پەڕگەکە لە ویکی سەرچاوەوە بە کەڵک وەرگرتن لە [[Special:Export|ئامێری ھەناردن]] ھەناردە بکە.\nلەسەر کۆمپیۆتەرەکەت پاشەکەوتی بکە و لێرە باری بكە.",
        "exif-ycbcrpositioning": "شوێنی Y و C",
        "exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
        "exif-imagedescription": "ناونیشانی وێنە",
+       "exif-make": "بەرھەمھێنەری کامێرا",
        "exif-model": "جۆری کامێرا",
        "exif-software": "نەرمەواڵەی بەکارهاتوو",
        "exif-artist": "نووسەر",
index edc1553..60aa4c9 100644 (file)
        "history-feed-description": "Historie editací této stránky",
        "history-feed-item-nocomment": "$1 v $2",
        "history-feed-empty": "Požadovaná stránka neexistuje.\nMohla být smazána či přejmenována.\nZkuste [[Special:Search|hledání]].",
+       "history-edit-tags": "Editovat značky vybraných revizí",
        "rev-deleted-comment": "(shrnutí editace odstraněno)",
        "rev-deleted-user": "(uživatelské jméno odstraněno)",
        "rev-deleted-event": "(podrobnosti odstraněny)",
        "rev-showdeleted": "zobrazit",
        "revisiondelete": "Smazat/obnovit revize",
        "revdelete-nooldid-title": "Nezadána revize",
-       "revdelete-nooldid-text": "Nezvolili jste revize, na které chcete tuto funkci použít.",
+       "revdelete-nooldid-text": "Buď jste nezvolili žádnou revizi, na kterou chcete tuto funkci použít, nebo zadaná revize neexistuje, případně se snažíte skrýt aktuální revizi.",
        "revdelete-no-file": "Uvedený soubor neexistuje.",
        "revdelete-show-file-confirm": "Určitě si chcete prohlédnout smazanou revizi souboru „<nowiki>$1</nowiki>“ z $2, $3?",
        "revdelete-show-file-submit": "Ano",
        "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",
+       "right-applychangetags": "Přidávání [[Special:Tags|značek]] k vlastním změnám",
+       "right-changetags": "Přidávání libovolných [[Special:Tags|značek]] na jednotlivé revize a protokolovací záznamy a jejich odebírání",
        "newuserlogpage": "Kniha nových uživatelů",
        "newuserlogpagetext": "Toto je záznam nově zaregistrovaných uživatelů.",
        "rightslog": "Kniha práv uživatelů",
        "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",
+       "action-applychangetags": "přidávat značky k vlastním změnám",
+       "action-changetags": "přidávat libovolné značky na jednotlivé revize a protokolovací záznamy a odebírat je",
        "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",
        "listfiles-delete": "smazat",
        "listfiles-summary": "Tato speciální stránka zobrazuje všechny načtené soubory.",
        "listfiles_search_for": "Hledat soubor podle názvu:",
+       "listfiles-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
        "imgfile": "soubor",
        "listfiles": "Seznam souborů",
        "listfiles_thumb": "Náhled",
        "logempty": "Protokol neobsahuje žádný odpovídající záznam.",
        "log-title-wildcard": "Hledat názvy začínající na tento text",
        "showhideselectedlogentries": "Ukázat/skrýt vybrané záznamy",
+       "log-edit-tags": "Editovat značky vybraných protokolovacích záznamů",
        "allpages": "Všechny stránky",
        "nextpage": "Další stránka ($1)",
        "prevpage": "Předchozí stránka ($1)",
        "emailccsubject": "Kopie Vaší zprávy pro uživatele $1: $2",
        "emailsent": "E-mail odeslán",
        "emailsenttext": "Váš e-mail byl odeslán.",
-       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „Poslat e-mail“; odeslal ho uživatel $1 uživateli $2",
+       "emailuserfooter": "Tento e-mail byl odeslán z {{grammar:2sg|{{SITENAME}}}} pomocí funkce „{{int:emailpage}}“; {{GENDER:$1|odeslal ho uživatel|odeslala ho uživatelka}} $1 {{GENDER:$2|uživateli|uživatelce}} $2.",
        "usermessage-summary": "Doručena zpráva od systému.",
        "usermessage-editor": "Systémový poslíček",
        "watchlist": "Sledované stránky",
        "import-interwiki-history": "Zkopírovat všechny historické verze této stránky",
        "import-interwiki-templates": "Zahrnout všechny šablony",
        "import-interwiki-submit": "Importovat",
-       "import-interwiki-namespace": "Cílový jmenný prostor:",
-       "import-interwiki-rootpage": "Cílová kořenová stránka (nepovinné):",
+       "import-mapping-default": "Importovat do implicitních umístění",
+       "import-mapping-namespace": "Importovat do jmenného prostoru:",
+       "import-mapping-subpage": "Importovat jako podstránky následující stránky:",
        "import-upload-filename": "Jméno souboru:",
        "import-comment": "Zdůvodnění:",
        "importtext": "Prosím exportujte soubor ze zdrojové wiki pomocí [[Special:Export|exportního nástroje]].\nUložte jej na svůj disk a nahrajte ho sem.",
        "pageinfo-protect-cascading-yes": "Ano",
        "pageinfo-protect-cascading-from": "Zámky pocházejí z kaskádových zámků na",
        "pageinfo-category-info": "Informace o kategorii",
+       "pageinfo-category-total": "Celkový počet prvků",
        "pageinfo-category-pages": "Počet stránek",
        "pageinfo-category-subcats": "Počet podkategorií",
        "pageinfo-category-files": "Počet souborů",
        "patrol-log-page": "Kniha prověřených editací",
        "patrol-log-header": "Toto je kniha prověřených verzí.",
        "log-show-hide-patrol": "$1 knihu záznamů patroly",
+       "log-show-hide-tag": "$1 knihu značek",
        "deletedrevision": "Smazána stará revize $1",
        "filedeleteerror-short": "Chyba při mazání souboru: $1",
        "filedeleteerror-long": "Vyskytla se chyba při mazání souboru:\n\n$1",
        "tags-deactivate-reason": "Důvod:",
        "tags-deactivate-not-allowed": "Značku „$1“ nelze deaktivovat.",
        "tags-deactivate-submit": "Deaktivovat",
+       "tags-apply-no-permission": "Nemáte oprávnění přidávat značky k vlastním změnám",
+       "tags-apply-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
+       "tags-apply-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
+       "tags-update-no-permission": "Nemáte oprávnění přidávat libovolné značky na jednotlivé revize a protokolovací záznamy a odebírat je",
+       "tags-update-add-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
+       "tags-update-add-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
+       "tags-update-remove-not-allowed-one": "Značku „$1“ není dovoleno odebírat.",
+       "tags-update-remove-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně odebírat: $1",
+       "tags-edit-title": "Editace značek",
+       "tags-edit-manage-link": "Spravovat značky",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Vybraná|Vybrané}} revize stránky [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Vybraný protokolovací záznam|Vybrané protokolovací záznamy}}:",
+       "tags-edit-revision-legend": "Změna značek u {{PLURAL:$1|této revize|těchto $1 revizí}}",
+       "tags-edit-logentry-legend": "Změna značek u {{PLURAL:$1|tohoto protokolovacího záznamu|těchto $1 protokolovacích záznamů}}",
+       "tags-edit-existing-tags": "Stávající značky:",
+       "tags-edit-existing-tags-none": "''Žádná''",
+       "tags-edit-new-tags": "Nové značky:",
+       "tags-edit-add": "Přidat tyto značky:",
+       "tags-edit-remove": "Odebrat tyto značky:",
+       "tags-edit-remove-all-tags": "(odebrat všechny značky)",
+       "tags-edit-chosen-placeholder": "Vyberte nějaké značky",
+       "tags-edit-chosen-no-results": "Nenalezeny žádné značky odpovídající",
+       "tags-edit-reason": "Důvod:",
+       "tags-edit-revision-submit": "Aplikovat změny na {{PLURAL:$1|tuto revizi|tyto $1 revize|těchto $1 revizí}}",
+       "tags-edit-logentry-submit": "Aplikovat změny na {{PLURAL:$1|tento protokolovací záznam|tyto $1 protokolovací záznamy|těchto $1 protokolovacích záznamů}}",
+       "tags-edit-success": "Změny byly úspěšně aplikovány.",
+       "tags-edit-failure": "Změny se nepodařilo provést:\n$1",
+       "tags-edit-nooldid-title": "Neplatná cílová revize",
+       "tags-edit-nooldid-text": "Buď jste nezadali žádnou cílovou revizi, na kterou by se tato funkce měla použít, nebo uvedená revize neexistuje.",
+       "tags-edit-none-selected": "Vyberte prosím nejméně jednu značku, kterou chcete přidat či odebrat.",
        "comparepages": "Porovnání stránek",
        "compare-page1": "Stránka 1",
        "compare-page2": "Stránka 2",
        "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",
+       "log-name-tag": "Kniha značek",
+       "log-description-tag": "Tato stránka zobrazuje přidání či odebrání [[Special:Tags|značek]] na stránkách či protokolovacích záznamech uživateli. Tato kniha nezaznamenává označování probíhající jako součást editace, smazání či podobné akce.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|přidal|přidala}} {{PLURAL:$7|značku|značky}} $6 na revizi $4 stránky $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|přidal|přidala}} {{PLURAL:$7|značku|značky}} $6 na protokolovací záznam $5 k stránce $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|odebral|odebrala}} {{PLURAL:$9|značku|značky}} $8 z revize $4 stránky $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|odebral|odebrala}} {{PLURAL:$9|značku|značky}} $8 z protokolovacího záznamu $5 k stránce $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|změnil|změnila}} značky na revizi $4 stránky $3 ({{PLURAL:$7|přidáno}} $6; {{PLURAL:$9|odebráno}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|změnil|změnila}} značky na protokolovacím záznamu $5 k stránce $3 ({{PLURAL:$7|přidáno}} $6; {{PLURAL:$9|odebráno}} $8)",
        "rightsnone": "(žádné)",
        "revdelete-summary": "shrnutí editace",
        "feedback-adding": "Komentář se přidává na stránku…",
        "feedback-error1": "Chyba: Nerozpoznaný výsledek z API",
        "feedback-error2": "Chyba: Editace se nezdařila",
        "feedback-error3": "Chyba: API nevrátilo žádnou odpověď",
+       "feedback-error4": "Chyba: Nelze napsat na uvedenou stránku pro zpětnou vazbu",
        "feedback-message": "Zpráva:",
        "feedback-subject": "Předmět:",
        "feedback-submit": "Odeslat",
        "feedback-terms": "Jsem srozuměn s tím, že informace o mém uživatelském agentu zahrnují informace o přesné verzi mého prohlížeče a operačního systému a budou zveřejněny u mého komentáře.",
+       "feedback-termsofuse": "Souhlasím s tím, že budu poskytovat zpětnou vazbu v souladu s Podmínkami užití.",
        "feedback-thanks": "Děkujeme! Váš komentář byl přidán na stránku „[$2 $1]“.",
        "feedback-thanks-title": "Děkujeme!",
        "feedback-useragent": "Uživatelský agent:",
        "log-name-pagelang": "Kniha změn jazyků",
        "log-description-pagelang": "Toto je protokol změn jazyků stránek.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|změnil|změnila}} jazyk stránky $3 z $4 na $5.",
-       "default-skin-not-found": "Jejda! Výchozí vzhled vaší wiki, definovaný ve <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, není dostupný.\n\nVaše instalace zřejmě obsahuje následující vzhledy. Informace o tom, jak je povolit a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].\n\n$2\n\n; Pokud jste právě nainstalovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalaci v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code dir=\"ltr\">skins/</code>.\n:* Nebo si můžete stáhnout tarbally jednotlivých vzhledů z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code>skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář.\n\n; Pokud jste právě aktualizovali MediaWiki:\n: MediaWiki 1.24 a novější již automaticky nepovolují nainstalované vzhledy (vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_autodiscovery/cs Manual:Skin autodiscovery]). Pro povolení všech právě nainstalovaných vzhledů vlepte následující řádky do <code>LocalSettings.php</code>:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Pokud jste právě upravili <code>LocalSettings.php</code>:\n: Překontrolujte případné překlepy v názvech vzhledů.",
+       "default-skin-not-found": "Jejda! Výchozí vzhled vaší wiki, definovaný ve <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, není dostupný.\n\nVaše instalace zřejmě obsahuje následující {{PLURAL:$4|vzhled|vzhledy}}. Informace o tom, jak {{PLURAL:$4|jej|je}} povolit a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].\n\n$2\n\n; Pokud jste právě nainstalovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalaci v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code dir=\"ltr\">skins/</code>.\n:* Nebo si můžete stáhnout tarbally jednotlivých vzhledů z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code>skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář.\n\n; Pokud jste právě aktualizovali MediaWiki:\n: MediaWiki 1.24 a novější již automaticky nepovolují nainstalované vzhledy (vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_autodiscovery/cs Manual:Skin autodiscovery]). Pro povolení {{PLURAL:$5|právě nainstalovaného vzhledu|všech právě nainstalovaných vzhledů}} vlepte následující {{PLURAL:$5|řádku|řádky}} do <code>LocalSettings.php</code>:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Pokud jste právě upravili <code>LocalSettings.php</code>:\n: Překontrolujte případné překlepy v názvech vzhledů.",
        "default-skin-not-found-no-skins": "Jejda! Výchozí vzhled vaší wiki, definovaný ve <code dir=\"ltr\">$wgDefaultSkin</code> jako <code>$1</code>, není dostupný.\n\nNemáte nainstalovány žádné vzhledy.\n\n; Pokud jste právě nainstalovali nebo aktualizovali MediaWiki:\n: Zřejmě jste instalovali z gitu nebo nějakým jiným způsobem přímo ze zdrojového kódu. Tak to má fungovat. MediaWiki 1.24 a novější již v hlavním repozitáři neobsahují žádné vzhledy. Zkuste nainstalovat některé vzhledy ze [https://www.mediawiki.org/wiki/Category:All_skins seznamu vzhledů na mediawiki.org] buď:\n:* Můžete si stáhnout [https://www.mediawiki.org/wiki/Download/cs instalaci v tarballu], která zahrnuje několik vzhledů a rozšíření, a vykopírovat si z ní adresář <code>skins/</code>.\n:* Nebo si můžete stáhnout tarbally jednotlivých vzhledů z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Nebo si můžete gitem naklonovat jeden z repozitářů <code>mediawiki/skins/*</code> do adresáře <code dir=\"ltr\">skins/</code> ve vaší instalaci MediaWiki.\n: Pokud jste vývojářem MediaWiki, nemělo by to nijak narušit váš gitový repozitář. Informace o tom, jak povolit vzhledy a vybrat výchozí, najdete na stránce [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration/cs Manual:Skin configuration].",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (povolený)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''zakázaný''')",
index f59c963..144fcbe 100644 (file)
@@ -98,6 +98,7 @@
        "faqpage": "Project:Чѧстꙑ въпроси",
        "actions": "дѣиства",
        "namespaces": "имєнъ просторꙑ",
+       "navigation-heading": "плаваниѥ",
        "errorpagetitle": "блаꙁна",
        "tagline": "{{grammar:genitive|{{SITENAME}}}} страница",
        "help": "помощь",
        "userloginnocreate": "въниди",
        "logout": "ис̾ходъ",
        "userlogout": "ис̾ходъ",
+       "userlogin-noaccount": "мѣсто ти нѣстъ ли ?",
        "nologin": "мѣсто ти нѣстъ ли ? $1",
        "nologinlink": "съꙁижди си мѣсто",
        "createaccount": "съꙁижди си мѣсто",
        "accountcreated": "мѣсто сътворєно ѥстъ",
        "accountcreatedtext": "польꙃєватєльско мѣсто [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|бєсѣда]]) сътворєно бѣ",
        "loginlanguagelabel": "ѩꙁꙑкъ : $1",
+       "pt-login": "въниди",
+       "pt-login-button": "въниди",
+       "pt-createaccount": "съꙁижди си мѣсто",
        "pt-userlogout": "ис̾ходъ",
        "changepassword": "таина словєсє иꙁмѣнѥниѥ",
        "resetpass_header": "таина слова иꙁмѣнѥниѥ",
        "template-protected": "(ꙁабранєно ѥстъ)",
        "template-semiprotected": "(чѧстьно ꙁабранѥно)",
        "hiddencategories": "сꙗ страница въ {{PLURAL:$1|1 съкрꙑтѣи катигорїи|$1 съкрꙑтѣхъ катигорїѩ}} сѧ авлꙗѥтъ :",
+       "moveddeleted-notice": "сꙗ страница поничьжєна ѥстъ ⁙\nпоничьжєниꙗ и прѣимєнованиꙗ їстории си страницѧ нижѣ видѣти можєши",
        "postedit-confirmation-saved": "твоꙗ мѣна съхранѥна ѥстъ",
        "viewpagelogs": "си страницѧ їсторїѩ",
        "cur": "нꙑ҃н",
        "rightslog": "чинодатєльства їсторїꙗ",
        "action-edit": "си страницѧ исправлєниѥ",
        "nchanges": "$1 {{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}",
+       "enhancedrc-history": "їсторїꙗ",
        "recentchanges": "послѣдьнѩ мѣнꙑ",
        "recentchanges-legend": "послѣдьн҄ь мѣнъ строи",
        "recentchanges-summary": "с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши",
        "recentchanges-label-minor": "малаꙗ мѣна",
        "recentchanges-label-bot": "сѭ мѣноу аѵтоматъ сътворилъ",
        "rcshowhideminor": "$1 малꙑ мѣнꙑ",
+       "rcshowhideminor-show": "каꙁаниѥ",
+       "rcshowhideminor-hide": "съкрꙑтиѥ",
        "rcshowhidebots": "$1 аѵтоматъ",
+       "rcshowhidebots-show": "каꙁаниѥ",
+       "rcshowhidebots-hide": "съкрꙑтиѥ",
        "rcshowhideliu": "$1 польꙃєватєлъ · ѩжє съꙁижьдє сѥ мѣсто · мѣнꙑ",
+       "rcshowhideliu-hide": "съкрꙑтиѥ",
        "rcshowhideanons": "$1 анѡнѷмьнъ польꙃєватєлъ мѣнꙑ",
+       "rcshowhideanons-show": "каꙁаниѥ",
+       "rcshowhideanons-hide": "съкрꙑтиѥ",
        "rcshowhidemine": "$1 моꙗ мѣнꙑ",
+       "rcshowhidemine-show": "каꙁаниѥ",
+       "rcshowhidemine-hide": "съкрꙑтиѥ",
        "rclinks": "$1 послѣдьн҄ь  мѣнъ · ѩжє $2 послѣдьни дьни створѥнꙑ сѫтъ · каꙁаниѥ<br />$3",
        "diff": "ра҃ꙁн",
        "hist": "їс҃т",
        "minoreditletter": "м҃л",
        "newpageletter": "н҃в",
        "boteditletter": "а҃ѵ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|баитъ|баита|баитъ}} послѣди мѣнꙑ",
        "rc-old-title": "напрьва страница створѥна ꙗко ⁖ $1 ⁖",
        "recentchangeslinked": "съвѧꙁанꙑ страницѧ",
        "recentchangeslinked-feed": "съвѧꙁанꙑ страницѧ",
        "movethispage": "си страницѧ прѣимєнованиѥ",
        "pager-newer-n": "{{PLURAL:$1|нова 1|новꙑ $1|новъ $1}}",
        "pager-older-n": "{{PLURAL:$1|давьнꙗ 1|давьни $1|давьн҄ь $1}}",
+       "booksources-search": "исканиѥ",
        "specialloguserlabel": "испльнитєл҄ь :",
        "speciallogtitlelabel": "страницѧ или польꙃєватєлꙗ имѧ :",
        "log": "їсторїѩ",
        "whatlinkshere-hidelinks": "$1 съвѧꙁи",
        "whatlinkshere-filters": "ситꙑ",
        "block": "ꙁагради польꙃєватєл҄ь",
-       "blockip": "ꙁагради польꙃєватєл҄ь",
+       "blockip": "ꙁагради {{GENDER:$1|польꙃєватєл҄ь}}",
        "blockip-legend": "ꙁагради польꙃєватєл҄ь",
        "ipaddressorusername": "IP число или польꙃєватєлꙗ имѧ :",
        "ipbreason": "какъ съмꙑслъ :",
        "logentry-move-move": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ",
        "logentry-newusers-create": "польꙃєватєльско мѣсто ⁖ $1 ⁖ {{GENDER:$2|сътворѥно}} ѥстъ",
+       "logentry-upload-upload": "$1 {{GENDER:$2|положишє}} $3",
        "revdelete-summary": "мѣнꙑ опьсаниѥ",
        "searchsuggest-search": "исканиѥ",
        "searchsuggest-containing": "сѥ дрьжащи···",
-       "api-error-unknownerror": "нєвѣдома блаꙁна : ⁖ $1 ⁖"
+       "api-error-unknownerror": "нєвѣдома блаꙁна : ⁖ $1 ⁖",
+       "special-characters-group-latin": "латиньска аꙁъбоукꙑ",
+       "special-characters-group-latinextended": "латиньскꙑ аꙁъбоукьвє доложєниѥ",
+       "special-characters-group-ipa": "М҃ФА",
+       "special-characters-group-symbols": "сѷмволи",
+       "special-characters-group-greek": "грьчьска аꙁъбоукꙑ",
+       "special-characters-group-cyrillic": "климєнтовица / гражданьска аꙁъбоукꙑ",
+       "special-characters-group-arabic": "аравьска аꙁъбоукꙑ",
+       "special-characters-group-hebrew": "єврєиска аꙁъбоукꙑ",
+       "special-characters-group-bangla": "бангальска аꙁъбоукꙑ",
+       "special-characters-group-telugu": "тєлоужьска аꙁъбоукꙑ",
+       "special-characters-group-sinhala": "синхальска аꙁъбоукꙑ"
 }
index 94aa115..b018a73 100644 (file)
@@ -96,9 +96,9 @@
        "nov": "Чӳк",
        "dec": "Раш",
        "pagecategories": "{{PLURAL:$1|Категори|Категорисем}}",
-       "category_header": "«$1» категорири статьясем",
+       "category_header": "\"$1\" категоринчи статьясем",
        "subcategories": "Подкатегорисем",
-       "category-media-header": "«$1» категорири файлсем",
+       "category-media-header": "\"$1\" категоринчи файлсем",
        "category-empty": "''Хальхи вăхăтра ку категори пушă.''",
        "hidden-categories": "{{PLURAL:$1|Пытарнă категори|Пытарнă категорисем}}",
        "hidden-category-category": "Пытарнă категорисем",
        "tagline": "{{GRAMMAR:genitive|{{SITENAME}}}}ри материал",
        "help": "Пулăшу",
        "search": "Шырамалли",
-       "searchbutton": "Шырамалли",
+       "searchbutton": "Шыра",
        "go": "Куç",
        "searcharticle": "Куç",
        "history": "Страницин историйĕ",
        "create": "Çĕннине ту",
        "editthispage": "Страницăна тӳрлетесси",
        "create-this-page": "Ку страницăна хатĕрле",
-       "delete": "Кăларса пăрахасси",
+       "delete": "Кăларса пăрах",
        "deletethispage": "Хурат ăна",
        "undelete_short": "$1 тӳрлетӳсене каялла тавăр",
        "protect": "хӳтĕле",
        "unprotect": "Хӳтĕлеве пăрахăçла",
        "unprotectthispage": "Хӳтĕлеве пăрахăçла",
        "newpage": "Çĕнĕ статья",
-       "talkpage": "СӳÑ\82Ñ\81е Ñ\8fваÑ\81Ñ\81и",
+       "talkpage": "СӳÑ\82Ñ\81е Ñ\8fвни",
        "talkpagelinktext": "Сӳтсе явни",
        "specialpage": "Ятарлă страницă",
        "personaltools": "Ман хатĕрсем",
        "jumptonavigation": "навигаци",
        "jumptosearch": "шырамалли",
        "aboutsite": "{{SITENAME}} çинчен",
-       "aboutpage": "Project:çинчен",
+       "aboutpage": "Project:Википеди çинчен",
        "copyright": "Ку ăшлăх $1 килĕшӳллĕн сарăлать.",
        "copyrightpage": "{{ns:project}}:Автор прависем",
        "currentevents": "Хыпарсем",
        "page-rss-feed": "«$1» - RSS хăю",
        "page-atom-feed": "«$1» - Atom хăю",
        "red-link-title": "$1 (хальлĕхе çырман)",
-       "nstab-main": "Страницă",
+       "nstab-main": "Страница",
        "nstab-user": "Хутшăнакан страници",
        "nstab-media": "Мультимеди",
        "nstab-special": "Ятарлă страницă",
        "namespaceprotected": "Сирĕн «$1» ят уçлăхĕнчи статьясене тӳрлетмелли май çук..",
        "ns-specialprotected": "«{{ns:special}}» ят уçлăхĕнчи страницăсене эсир тӳрлетейместĕр.",
        "titleprotected": "Ку ятлă страницăна хатĕрлессине [[Хутшăнакан:$1|$1]] хутшăнакан чарса хунă.\nÇак сăлтава кăтартнă: ''$2''.",
+       "exception-nologin": "Кĕмен",
        "virus-badscanner": "Ĕнерлев йăнăшĕ. Вирус сканерĕ паллă мар: ''$1''",
        "virus-scanfailed": "скенерланă чухнехи йăнăш (код $1)",
        "virus-unknownscanner": "паллă мар антивирус:",
        "logouttext": "Эсир палласа илмен хутшăнакан евĕр ĕçлетĕр.\nСайт сире ятпа мар, IP-адрес урлă пĕлет.\nЭсир анонимла, е малтанхи евĕрлĕ çĕнĕ сеанс уçса, е  урăх ятпа ĕçлеме пултаратăр.\nХăш-пĕр страницăсем эсир сайта кĕнĕ пек курăнма пултараççĕ, ăна тӳрлетмешкĕн браузер кэшне çĕнетĕр.",
-       "yourname": "Усăкуракан ят:",
+       "yourname": "Усă куракан ят:",
        "userlogin-yourname": "Усă куракан ят",
        "yourpassword": "Вăрттăн сăмах:",
        "yourpasswordagain": "Вăрттăн сăмах тепре çырăр:",
        "logout": "Сеансне пĕтерни",
        "userlogout": "Тухрăр",
        "notloggedin": "Эсир сайта кĕмен",
-       "nologin": "ЭÑ\81иÑ\80 Ñ\85алÄ\95 Ñ\82е Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иленмен-и? '''$1'''.",
+       "nologin": "Ð\90ккаÑ\83нÑ\82 Ã§Ñ\83к-и? $1.",
        "nologinlink": "Çĕнĕ хутшăнакана регистрацилесси",
-       "createaccount": "Çĕнĕ хутшăнакана регистрацилесси",
-       "gotaccount": "ЭÑ\81иÑ\80 Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иленÑ\81е-и? '''$1'''.",
+       "createaccount": "Аккаунт ту",
+       "gotaccount": "Ð\90ккаÑ\83нÑ\82 Ð¿Ñ\83Ñ\80-и? $1.",
        "gotaccountlink": "Кĕрĕр",
        "createaccountmail": "эл. почта тăрăх",
+       "createacct-realname": "Чăн-чăн ят (пулсан)",
        "createacct-submit": "Аккаунт ту",
+       "createacct-benefit-body1": "{{PLURAL:$1|тӳрлетни|тӳрлетнисем}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|страницă|страницăсем}}",
        "badretype": "Эсир кăтартнă парольсем пĕр пек мар.",
        "userexists": "Эсир усă курас теекен ята йышăннă. Тархасшăн, урăх ят суйласа илĕр.",
        "loginerror": "Хутшăнакана палласа илеймерĕмĕр",
        "passwordreset-username": "Усă куракан ят:",
        "passwordreset-domain": "Домен:",
        "changeemail-none": "(çук)",
+       "resettokens": "Токенĕсене пăрах",
+       "resettokens-legend": "Токенĕсене пăрах",
        "bold_sample": "Çурмахулăм текст",
        "bold_tip": "Çурмахулăм текст",
        "italic_sample": "Тайлăк текст",
        "media_tip": "Медиа-файл çине каçă",
        "sig_tip": "Сирĕн алă пусни тата вăхăт",
        "hr_tip": "Горизонтальлĕ йĕр (сахалтарах усă курăр)",
-       "summary": "Улшăнусен ăнлантарăвĕ:",
+       "summary": "Улăштарнисене ăнлантарни:",
        "subject": "Тема:",
        "minoredit": "Пĕчĕк улшăну",
        "watchthis": "Ку страницăна сăна",
        "editing": "$1 тӳрлетни",
        "creating": "$1 туни",
        "editingsection": "$1 тӳрлетни (статья пайĕ)",
-       "editingcomment": "$1 тӳрлетни (кӗске анлантарӑвӗ)",
+       "editingcomment": "$1 тӳрлетни (çĕнĕ пай)",
        "editconflict": "Тӳрлетнĕ вăхăтра тавлашу тухрĕ: $1",
        "yourtext": "Сирĕн текст",
        "storedversion": "Астуса хăварнă верси",
        "copyrightwarning": "Эсир кĕртнĕ, е улăштарнă пур статьясен тексчĕсем $2 ($1 пăхăр) лизензине пăхăнаççĕ. Енчен те эсир кĕртнĕ текста пурте усă курма, тӳрлетсе улăштарма пултарнипе килĕшместĕр пулсан кунта ăна ан кĕртĕр. <br /> Çавăн пекех эсир кĕртнĕ текстăн е авторĕ, е ăна ирĕклĕ усă курма юракан çăлкуçсенчен илнине çирĕплететĕр. <br /> '''АВТОР ПРАВИСЕМПЕ ХӲТĔЛЕНĔ МАТЕРИАЛСЕНЕ АН КĔРТĔР!'''",
        "protectedpagewarning": "'''АСĂРХАТТАРНИ: ку страницăна улшăнусем кĕртессинчен хӳтĕленĕ, ăна тӳрлетме администраторсем кăна пултараççĕ.'''",
        "titleprotectedwarning": "'''Асăрхаттару. Ку страницăпа ĕçлеме чарнă, ăна хăш-пĕр хутшăнакан кăна хатерлеме пултарать.'''",
-       "templatesused": "Ку страницă çинче усă курнă {{PLURAL:$1|Шаблон|Шаблонсем}}:",
-       "templatesusedpreview": "Ð\9fÄ\83Ñ\85акан Ñ\81Ñ\82Ñ\80аниÑ\86а Ã§Ð¸Ð½Ñ\87е Ñ\83Ñ\81Ä\83 ÐºÑ\83Ñ\80нÄ\83 Ñ\88аблонÑ\81ем:",
-       "templatesusedsection": "Ку пайра усă курнă шаблонсем:",
+       "templatesused": "Ку страницă çинче усă курнă {{PLURAL:$1|шаблон|шаблонсем}}:",
+       "templatesusedpreview": "Ð\9cалаÑ\80аÑ\85 Ð¿Ä\83Ñ\85нинÑ\87е Ñ\83Ñ\81Ä\83 ÐºÑ\83Ñ\80акан {{PLURAL:$1|Ñ\88аблон|Ñ\88аблонÑ\81ем}}:",
+       "templatesusedsection": "Ку пайĕнче усă куракан {{PLURAL:$1|шаблон|шаблонсем}}:",
        "template-protected": "(сыхланă)",
        "template-semiprotected": "(пĕр пайне сыхланă)",
        "expensive-parserfunction-category": "Кунта эсир чылай ресурс ыйтакан функцисемпе нумай ĕçлекен страницăсене куратăр",
        "nohistory": "Ку страницăн улшăнусен журналĕ çук.",
        "currentrev": "Хальхи верси",
        "revisionasof": "$1 сăнташ",
-       "revision-info": "$1 версийĕ; $2",
+       "revision-info": "Версийĕ $1 {{GENDER:$6|$2}}$7",
        "previousrevision": "← Малтанхи сăнташ",
        "nextrevision": "Тепĕр сăнташ →",
        "currentrevisionlink": "хальхи верси çине куç",
        "textmatches": "Статьясенчи текст пĕрпеклĕхĕ",
        "prevn": "унчченхи {{PLURAL:$1|$1}}",
        "nextn": "урăххисем {{PLURAL:$1|$1}}",
+       "prev-page": "унчченхи страницă",
+       "next-page": "урăх страницă",
        "viewprevnext": "Пăх ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles-tooltip": "$1 -ре шырани",
        "searchprofile-images-tooltip": "Файăлсене шырани",
        "mypreferences": "Ĕнерлев",
        "prefs-edits": "Тӳрлетӳсен шучĕ:",
        "prefs-skin": "Тир",
-       "skin-preview": "Малтанхи курăну",
+       "skin-preview": "Маларах пăхни",
        "datedefault": "Палăртман чухнехи",
        "prefs-rc": "Юлашки улшăнусен страници",
        "prefs-watchlist": "Сăнав списокĕ",
        "prefs-searchoptions": "Шырамалли",
        "prefs-files": "Файлсем",
        "youremail": "Электронлă почта:",
-       "username": "{{GENDER:$1|Ð¥Ñ\83Ñ\82Ñ\88Ä\83наканÄ\83н Ñ\8fÑ\87Ä\95}}:",
+       "username": "{{GENDER:$1|УÑ\81Ä\83 ÐºÑ\83Ñ\80акан Ñ\8fÑ\82}}:",
        "prefs-registration": "Регистрацин вăхăтчĕ:",
        "yourrealname": "Чăн-чăн ят:",
        "yourlanguage": "Интерфейс чĕлхи:",
        "group-bureaucrat": "Бюрократсем",
        "group-suppress": "Тĕрĕслекенсем",
        "group-all": "(пурте)",
+       "group-user-member": "{{GENDER:$1|хутшăнакан}}",
        "group-autoconfirmed-member": "автоподтверждённый участник",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор}}",
        "recentchanges": "Улшăнусем",
        "recentchanges-legend": "Çĕнĕ улшăнусен ĕнерлевĕ",
        "recentchanges-label-bot": "Ку улшăнăва бот тунă",
-       "recentchanges-legend-newpage": "$1 — çĕнĕ страница",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (пăхăр [[Special:NewPages|çĕнĕ страницăсен списокĕ]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rclistfrom": "Юлашки улшăнусене $3 $2 вăхăтран пуçласа кăтартнă",
        "rcshowhideminor": "пĕчĕк тӳрлетнисене $1",
+       "rcshowhideminor-show": "кăтартмалла",
+       "rcshowhideminor-hide": "кăтартмалла мар",
        "rcshowhidebots": "ботсене $1",
-       "rcshowhidebots-show": "Кăтарт",
+       "rcshowhidebots-show": "кăтартмалла",
+       "rcshowhidebots-hide": "кăтартмалла мар",
        "rcshowhideliu": "сайта кĕнисене $1",
+       "rcshowhideliu-show": "кăтартмалла",
+       "rcshowhideliu-hide": "кăтартмалла мар",
        "rcshowhideanons": "ячĕсене палăртманскерсене $1",
+       "rcshowhideanons-show": "кăтартмалла",
+       "rcshowhideanons-hide": "кăтартмалла мар",
        "rcshowhidepatr": "тĕрĕсленĕ тӳрлетӳсене $1",
+       "rcshowhidepatr-show": "кăтартмалла",
+       "rcshowhidepatr-hide": "кăтартмалла мар",
        "rcshowhidemine": "хăвăн тӳрлетнисене $1",
+       "rcshowhidemine-show": "кăтартмалла",
+       "rcshowhidemine-hide": "кăтармалла мар",
        "rclinks": "Юлашки $2 кун хушшинче тунă $1 улшăнусене кăтартмалла<br />$3",
        "diff": "танл.",
        "hist": "ист",
        "uploadlogpagetext": "Аяларах эсир юлашкинчен кĕртнĕ файлсене куратăр.\nПур çĕрте те сервер вăхăтне (Гринвич тăрăх, UTC) кăтартнă.",
        "filename": "Файл ячĕ",
        "filedesc": "Кĕскен ăнлантарни",
-       "fileuploadsummary": "Кĕске ăнлантару:",
+       "fileuploadsummary": "Кĕскен ăнлантарни:",
        "filestatus": "Усă курмалли майсем",
        "filesource": "Çăлкуç",
        "ignorewarning": "Асăрхаттарусене пăхмасăр файла çав-çавах çырса хумалла.",
        "unusedtemplates": "Усă курман шаблонсем",
        "unusedtemplatestext": "Ку страница çинче страницăсенче усă курман «Шаблон» ятлă ятсен уçлăхне шутне кĕрекен страницăсене куратăр.",
        "unusedtemplateswlh": "ытти каçăсем",
-       "randompage": "Ä\82нÑ\81Ä\83Ñ\80Ñ\82Ñ\80ан Ð¸Ð»Ð½Ä\9b Ñ\81Ñ\82Ñ\80аниÑ\86Ä\83",
+       "randompage": "Ä\82нÑ\81Ä\83Ñ\80Ñ\82Ñ\80ан Ð»ÐµÐºÐ½Ä\95 Ñ\81Ñ\82Ñ\80аниÑ\86а",
        "randomincategory-category": "Категори:",
        "randomredirect": "Ăнсăртран илнĕ куçару",
        "statistics": "Статистика",
        "brokenredirects-edit": "тӳрлет",
        "brokenredirects-delete": "кăларса пăрах",
        "fewestrevisions": "Сахал тӳрлетнĕ статьясем",
-       "nbytes": "$1 {{PLURAL:$1|1=байт|байт}}",
+       "nbytes": "$1 {{PLURAL:$1|байт|байтсем}}",
        "ncategories": "$1 {{PLURAL:$1|категори|категорисем}}",
        "nlinks": "$1 {{PLURAL:$1|1=каçă|каçă}}",
+       "nmembers": "$1 {{PLURAL:$1|тĕл|тĕлте}}",
        "nviews": "$1 {{PLURAL:$1|пăхни|пăхнисем}}",
        "specialpage-empty": "Ку страница пушă",
        "lonelypages": "Тăлăх страницăсем",
        "shortpages": "Кĕске статьясем",
        "longpages": "Вăрăм страницăсем",
        "deadendpages": "Ниăçта та урăх ертмен страницăсем",
-       "protectedpages": "хӳтĕленĕ страницăсем",
+       "protectedpages": "Хӳтĕленĕ страницăсем",
        "protectedtitles": "Юраман ятсем",
        "listusers": "Хутшăнакансен списокĕ",
        "newpages": "Çĕнĕ страницăсем",
        "nextpage": "Тепĕр страницă ($1)",
        "prevpage": "Унчченхи страницă ($1)",
        "allarticles": "Пĕтĕм статьясем",
-       "allinnamespace": "Пĕтĕм статьясем («$1» ят уçлăхĕ)",
+       "allinnamespace": "Пĕтĕм статьясем ($1 ят хушшинче)",
        "allpagessubmit": "Ту",
        "allpagesprefix": "Çак йĕрекесенчен пуçланакансен страницăсене шыра:",
        "allpagesbadtitle": "Страницăн ячĕ тĕрĕс мар. Ятĕнче е интервики, е чĕлхе префиксĕ е усă курма юраман символсем пур.",
        "watching": "Сăнамаллисем шутне хушасси…",
        "unwatching": "Сăнав ят-йышĕнчен кăларса пăрахасси…",
        "enotif_reset": "Пур страницăсене те пăхнă пек палăрт",
+       "enotif_impersonal_salutation": "{{SITENAME}} хутшăнакан",
        "enotif_anon_editor": "$1 анонимлă хутшăнакан",
        "created": "хатĕрленĕ",
        "changed": "улăштарнă",
        "undelete-search-submit": "Шыра",
        "blanknamespace": "(Тĕп)",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
+       "contributions-title": "Усă куракан $1 хушни",
        "mycontris": "Ӳсĕм",
-       "contribsub2": "{{GENDER:$3|$1}} ӳсĕмĕ ($2)",
-       "uctop": " (пуçламăш)",
+       "contribsub2": "{{GENDER:$3|$1}} валли ($2)",
+       "uctop": "(хальхи)",
        "month": "Уйăхран (тата маларах):",
        "year": "Çултан (тата маларах):",
        "sp-contributions-blocklog": "Чарса лартнисен журналĕ",
        "sp-contributions-logs": "логсем",
        "sp-contributions-talk": "сӳтсе яв",
        "sp-contributions-userrights": "Хутшăнакансен прависемпе ĕçлесси",
-       "sp-contributions-search": "Тӳпе шыравĕ",
+       "sp-contributions-search": "Хушнине шырамалли",
+       "sp-contributions-username": "IP адрес е усă куракан ят:",
        "sp-contributions-submit": "Шыра",
        "whatlinkshere": "Кунта килекен каçăсем",
        "linkshere": "Çак страницăсем '''[[:$1]]''' çине илсе килеççĕ:",
        "whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
        "whatlinkshere-links": "← каçăсем",
+       "whatlinkshere-hideredirs": "куçарнисене $1",
        "whatlinkshere-filters": "Аласем",
        "blockip": "Хăтшăнакана ĕçлеме чар",
+       "ipaddressorusername": "IP адрес е усă куракан ят:",
        "ipbreason": "Сăлтавĕ",
        "ipbother": "Урăх вăхăт:",
        "ipboptions": "2 сехет:2 hours,1 кун:1 day,3 кун:3 days,1 эрне:1 week,2 эрне:2 weeks,1 уйăх:1 month,3 уйăх:3 months,6 уйăх:6 months,1 çул:1 year,яванлăха:infinite",
        "import": "Страницăсене импортласси",
        "importinterwiki": "Вики хушшинчи импорт",
        "import-interwiki-submit": "Импортирла",
-       "import-interwiki-namespace": "Страницăсене çак ят уçлăхне вырнаçтар:",
        "import-upload-filename": "Файл ячĕ:",
        "importnopages": "Импортламалли страницăсем çук.",
        "importnofile": "Импортламалли файла тиемен",
        "tooltip-feed-atom": "Ку страницăн Atom куçару",
        "tooltip-ca-nstab-image": "Файлăн страници",
        "tooltip-ca-nstab-template": "Шаблонăн страници",
-       "tooltip-ca-nstab-category": "Категори страницине уç",
+       "tooltip-ca-nstab-category": "Категорин страницине пăхни",
        "tooltip-save": "Тӳрлетӳсене астуса хăвармалла",
        "tooltip-watch": "Çак страницăна пăхса тăмаллисем шутне хуш",
        "tooltip-summary": "Кĕскĕн ăнлантарса парăр",
        "creditspage": "Пархатарлăх",
        "spambot_username": "MediaWiki спамран тасатни",
        "pageinfo-title": "\"$1\" çинчен",
+       "pageinfo-language": "Страницин чĕлхи",
+       "pageinfo-templates": "{{PLURAL:$1|шаблон|шаблонсем}} ($1)",
        "pageinfo-toolboxlink": "Страници çинчен",
+       "pageinfo-category-info": "Категори çинчен",
        "markaspatrolleddiff": "Тĕрĕсленĕ тесе палăрт",
        "markaspatrolledtext": "Ку статьяна тĕрĕсленĕ тесе палăртмалла",
        "markedaspatrolled": "Тĕрĕсленĕ пек палăртнă",
        "markedaspatrolledtext": "Суйланă версине тĕрĕсленĕ пек палăртнă.",
        "deletedrevision": "$1 кивĕ версине кăларса парахнă.",
        "filedeleteerror-short": "Файла кăларса пăрахнă чухне йăнăш тухрĕ: $1",
-       "nextdiff": "Малаллахи тӳрлетӳ →",
+       "previousdiff": "← Кивĕрех тӳрлетни",
+       "nextdiff": "Çĕнĕрех тӳрлетни →",
        "file-info": "файл пысăкăшĕ: $1, MIME-тĕсĕ: $2",
        "file-info-size": "$1 × $2 пиксел, файл пысăкăше: $3, MIME-тĕсĕ: $4",
        "file-nohires": "Пысăкрах калăпăшли çук.",
        "confirm_purge_button": "OK",
        "confirm-watch-button": "OK",
        "confirm-unwatch-button": "OK",
+       "pipe-separator": "&#32;|&#32;",
        "quotation-marks": "\"$1\"",
-       "imgmultipageprev": "← малтанхи страница",
+       "imgmultipageprev": "← унчченхи страницă",
        "imgmultipagenext": "тепĕр страница →",
        "imgmultigo": "Куç!",
        "table_pager_next": "Тепĕр страница",
        "autoredircomment": "[[$1]] çине куçарни",
        "autosumm-new": "Çĕнĕ страница \"$1\"",
        "watchlisttools-view": "Ку тӳрлетӳпе çыхăннăскерсем",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|сӳтсе явни]])",
        "version": "Верси",
        "fileduplicatesearch": "Пĕр пек файлсен шыравĕ",
        "fileduplicatesearch-legend": "Дубликатсен шыравĕ",
        "specialpages-group-highuse": "Нумай усă куракан страницăсем",
        "htmlform-selectorother-other": "Урăххи",
        "htmlform-no": "Çук",
+       "logentry-move-move": "$1 страницă {{GENDER:$2|ятне улăштарчĕ}} $3 - $4",
        "rightsnone": "(çук)",
        "feedback-back": "Каялла",
        "searchsuggest-search": "Шырамалли",
index 1f54788..6f3ab07 100644 (file)
        "revdelete-show-file-confirm": "Er du sikker på, at du vil vise en slettet version af filen \"<nowiki>$1</nowiki>\" fra den $2, klokken $3?",
        "revdelete-show-file-submit": "Ja",
        "logdelete-selected": "{{PLURAL:$1|Valgt logindførsel|Valgte logindførsler}}:",
-       "revdelete-text-text": "Slettede version vil stadigt fremgå af sidehistorikken, men dele af indholdet vil ikke være offentlig tilgængeligt.",
+       "revdelete-text-text": "Slettede versioner vil stadig fremgå af sidehistorikken, men dele af indholdet vil ikke være offentlig tilgængeligt.",
        "revdelete-text-others": "Andre administratorer vil fortsat have adgang til det skjulte indhold og have mulighed for at genskabe det, med mindre andre begrænsninger er sat.",
        "revdelete-confirm": "Vær venlig at bekræfte at du vil gøre dette, at du forstår konsekvenserne, og at du gør det i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjerne]].",
        "revdelete-suppress-text": "Der bør '''kun''' skjules i de følgende tilfælde:\n* Potentielt injurierende oplysninger\n* Upassende personlige oplysninger\n*: ''hjemmeadresser og -telefonnumre, CPR-numre og lign.''",
index f765cab..19a2325 100644 (file)
        "history-feed-description": "Versionsgeschichte dieser Seite in {{SITENAME}}",
        "history-feed-item-nocomment": "$1 am $3 um $4 Uhr",
        "history-feed-empty": "Die angeforderte Seite existiert nicht. Vielleicht wurde sie gelöscht oder verschoben. [[Special:Search|Durchsuche]] {{SITENAME}} nach passenden neuen Seiten.",
+       "history-edit-tags": "Markierungen ausgewählter Versionen bearbeiten",
        "rev-deleted-comment": "(Zusammenfassung entfernt)",
        "rev-deleted-user": "(Benutzername entfernt)",
        "rev-deleted-event": "(Logbucheinzelheiten entfernt)",
        "rev-showdeleted": "zeige",
        "revisiondelete": "Versionen löschen/wiederherstellen",
        "revdelete-nooldid-title": "Keine Version angegeben",
-       "revdelete-nooldid-text": "Du hast entweder keine Version angegeben, auf die diese Aktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder du versuchst, die aktuelle Version zu entfernen.",
+       "revdelete-nooldid-text": "Du hast entweder keine Zielversion angegeben, auf die diese Funktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder du versuchst, die aktuelle Version zu verstecken.",
        "revdelete-no-file": "Die angegebene Datei ist nicht vorhanden.",
        "revdelete-show-file-confirm": "Bist du sicher, dass du die gelöschte Version der Datei „<nowiki>$1</nowiki>“ vom $2 um $3 Uhr ansehen willst?",
        "revdelete-show-file-submit": "Ja",
        "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-editwatchlist-label": "Einträge auf der Beobachtungsliste bearbeiten:",
+       "prefs-editwatchlist-edit": "ansehen und selektiv entfernen",
+       "prefs-editwatchlist-raw": "unformatiert bearbeiten",
+       "prefs-editwatchlist-clear": "vollständig entfernen",
        "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-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",
+       "right-applychangetags": "[[Special:Tags|Markierungen]] zusammen mit den Änderungen anwenden",
+       "right-changetags": "Beliebige [[Special:Tags|Markierungen]] zu einzelnen Versionen und Logbucheinträgen hinzufügen und entfernen",
        "newuserlogpage": "Neuanmeldungs-Logbuch",
        "newuserlogpagetext": "Dies ist ein Logbuch der neu erstellten Benutzerkonten.",
        "rightslog": "Rechte-Logbuch",
        "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",
+       "action-applychangetags": "Markierungen zusammen mit deinen Änderungen anzuwenden",
+       "action-changetags": "beliebige Markierungen zu einzelnen Versionen und Logbucheinträgen hinzuzufügen und zu entfernen",
        "nchanges": "$1 {{PLURAL:$1|Änderung|Änderungen}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|seit dem letzten Besuch}}",
        "enhancedrc-history": "Versionsgeschichte",
        "listfiles-delete": "löschen",
        "listfiles-summary": "Diese Spezialseite listet alle hochgeladenen Dateien auf.",
        "listfiles_search_for": "Suche nach Datei:",
+       "listfiles-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
        "imgfile": "Datei",
        "listfiles": "Dateiliste",
        "listfiles_thumb": "Vorschaubild",
        "logempty": "Keine passenden Einträge.",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträge anzeigen/verstecken",
+       "log-edit-tags": "Markierungen ausgewählter Logbucheinträge bearbeiten",
        "allpages": "Alle Seiten",
        "nextpage": "Nächste Seite ($1)",
        "prevpage": "Vorherige Seite ($1)",
        "emailccsubject": "Kopie deiner Nachricht an $1: $2",
        "emailsent": "E-Mail verschickt",
        "emailsenttext": "Deine E-Mail wurde verschickt.",
-       "emailuserfooter": "Diese E-Mail wurde von {{SITENAME}}-Benutzer „$1“ an „$2“ gesendet.",
+       "emailuserfooter": "Diese E-Mail wurde von „$1“ an „$2“ durch die Funktion „{{int:emailpage}}“ bei {{SITENAME}} gesendet.",
        "usermessage-summary": "Systemnachricht gespeichert.",
        "usermessage-editor": "System-Messenger",
        "usermessage-template": "MediaWiki:Benutzernachricht",
        "watchlist": "Beobachtungsliste",
        "mywatchlist": "Beobachtungsliste",
        "watchlistfor2": "Von $1 $2",
-       "nowatchlist": "Es befinden sich keine Einträge auf deiner Beobachtungsliste.",
+       "nowatchlist": "Es befinden sich keine Einträge auf der Beobachtungsliste.",
        "watchlistanontext": "Du musst dich anmelden, um deine Beobachtungsliste sehen oder Einträge auf ihr bearbeiten zu können.",
        "watchnologin": "Du bist nicht angemeldet",
        "addwatch": "Zur Beobachtungsliste hinzufügen",
        "import-interwiki-history": "Alle Versionen dieser Seite importieren",
        "import-interwiki-templates": "Alle Vorlagen einschließen",
        "import-interwiki-submit": "Importieren",
-       "import-interwiki-namespace": "Zielnamensraum:",
-       "import-interwiki-rootpage": "Zielstammseite (optional):",
+       "import-mapping-default": "Zu den Standard-Speicherorten importieren",
+       "import-mapping-namespace": "In einen Namensraum importieren:",
+       "import-mapping-subpage": "Als Unterseiten der folgenden Seite importieren:",
        "import-upload-filename": "Dateiname:",
        "import-comment": "Grund:",
        "importtext": "Bitte die Datei über die Spezialseite [[Special:Export|Exportfunktion]] aus dem Quellwiki exportieren.\nDiese auf dem lokalen Rechner speichern und danach hier hochladen.",
        "pageinfo-protect-cascading-yes": "Ja",
        "pageinfo-protect-cascading-from": "Seiten mit Kaskadenschutz von",
        "pageinfo-category-info": "Kategorieinformationen",
+       "pageinfo-category-total": "Anzahl der Mitglieder insgesamt",
        "pageinfo-category-pages": "Anzahl der Seiten",
        "pageinfo-category-subcats": "Anzahl der Unterkategorien",
        "pageinfo-category-files": "Anzahl der Dateien",
        "patrol-log-page": "Kontroll-Logbuch",
        "patrol-log-header": "Dies ist das Kontroll-Logbuch.",
        "log-show-hide-patrol": "Kontroll-Logbuch $1",
+       "log-show-hide-tag": "Markierungs-Logbuch $1",
        "deletedrevision": "alte Version $1 gelöscht",
        "filedeleteerror-short": "Fehler bei Datei-Löschung: $1",
        "filedeleteerror-long": "Bei der Datei-Löschung wurden Fehler festgestellt:\n\n$1",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt:",
        "watchlistedit-clear-title": "Beobachtungsliste leeren",
        "watchlistedit-clear-legend": "Beobachtungsliste leeren",
-       "watchlistedit-clear-explain": "Alle Seitennamen werden von deiner Beobachtungsliste entfernt.",
+       "watchlistedit-clear-explain": "Alle Seiten werden ausnahmslos von deiner Beobachtungsliste entfernt.",
        "watchlistedit-clear-titles": "Seitennamen:",
-       "watchlistedit-clear-submit": "Beobachtungsliste leeren (Dies ist dauerhaft!)",
+       "watchlistedit-clear-submit": "Beobachtungsliste unwiderruflich leeren",
        "watchlistedit-clear-done": "Deine Beobachtungsliste wurde geleert.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Ein Seitenname wurde|$1 Seitennamen wurden}} entfernt:",
        "watchlistedit-too-many": "Es gibt hier zu viele Seiten zum Anzeigen.",
        "tags-deactivate-reason": "Grund:",
        "tags-deactivate-not-allowed": "Es ist nicht möglich, die Markierung „$1“ zu deaktivieren.",
        "tags-deactivate-submit": "Deaktivieren",
+       "tags-apply-no-permission": "Du hast keine Berechtigung, um Änderungsmarkierungen zusammen mit deinen Änderungen anzuwenden.",
+       "tags-apply-not-allowed-one": "Die Markierung „$1“ darf nicht manuell angewendet werden.",
+       "tags-apply-not-allowed-multi": "Die {{PLURAL:$2|folgende Markierung darf|folgenden Markierungen dürfen}} nicht manuell angewendet werden: $1",
+       "tags-update-no-permission": "Du hast keine Berechtigung, um Änderungsmarkierungen von einzelnen Versionen oder Logbucheinträgen hinzuzufügen oder zu entfernen.",
+       "tags-update-add-not-allowed-one": "Die Markierung „$1“ darf nicht manuell hinzugefügt werden.",
+       "tags-update-add-not-allowed-multi": "Die {{PLURAL:$2|folgende Markierung darf|folgenden Markierungen dürfen}} nicht manuell hinzugefügt werden: $1",
+       "tags-update-remove-not-allowed-one": "Die Markierung „$1“ darf nicht entfernt werden.",
+       "tags-update-remove-not-allowed-multi": "Die {{PLURAL:$2|folgende Markierung darf|folgenden Markierungen dürfen}} nicht manuell entfernt werden: $1",
+       "tags-edit-title": "Markierungen bearbeiten",
+       "tags-edit-manage-link": "Markierungen verwalten",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Ausgewählte Version|Ausgewählte Versionen}} von [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Ausgewähltes Logbuchereignis|Ausgewählte Logbuchereignisse}}:",
+       "tags-edit-revision-legend": "Markierungen von {{PLURAL:$1|dieser Version|allen $1 Versionen}} hinzufügen oder entfernen",
+       "tags-edit-logentry-legend": "Markierungen von {{PLURAL:$1|diesem Logbucheintrag|allen $1 Logbucheinträgen}} hinzufügen oder entfernen",
+       "tags-edit-existing-tags": "Vorhandene Markierungen:",
+       "tags-edit-existing-tags-none": "''Keine''",
+       "tags-edit-new-tags": "Neue Markierungen:",
+       "tags-edit-add": "Diese Markierungen hinzufügen:",
+       "tags-edit-remove": "Diese Markierungen entfernen:",
+       "tags-edit-remove-all-tags": "(alle Markierungen entfernen)",
+       "tags-edit-chosen-placeholder": "Einige Markierungen auswählen",
+       "tags-edit-chosen-no-results": "Keine übereinstimmenden Markierungen gefunden",
+       "tags-edit-reason": "Grund:",
+       "tags-edit-revision-submit": "Änderungen an {{PLURAL:$1|diese Version|$1 Versionen}} anwenden",
+       "tags-edit-logentry-submit": "Änderungen an {{PLURAL:$1|diesen Logbucheintrag|$1 Logbucheinträgen}} anwenden",
+       "tags-edit-success": "Die Änderungen wurden erfolgreich angewandt.",
+       "tags-edit-failure": "Die Änderungen konnten nicht angewandt werden:\n$1",
+       "tags-edit-nooldid-title": "Ungültige Zielversion",
+       "tags-edit-nooldid-text": "Du hast entweder keine Zielversion angegeben, für die diese Funktion ausgeführt werden soll oder die angegebene Version ist nicht vorhanden.",
+       "tags-edit-none-selected": "Bitte wähle mindestens eine hinzuzufügende oder zu entfernende Markierung aus.",
        "comparepages": "Seiten vergleichen",
        "compare-page1": "Seite 1",
        "compare-page2": "Seite 2",
        "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",
+       "log-name-tag": "Markierungs-Logbuch",
+       "log-description-tag": "Diese Seite wird angezeigt, wenn Benutzer [[Special:Tags|Markierungen]] von einzelnen Versionen oder Logbucheinträgen hinzugefügt oder entfernt haben. Das Logbuch listet keine Markierungsaktionen auf, die als Teil einer Bearbeitung, Löschung oder einer ähnlichen Aktion auftreten.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|fügte}} die {{PLURAL:$7|Markierung|Markierungen}} $6 zur Version $4 der Seite $3 hinzu",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|fügte}} die {{PLURAL:$7|Markierung|Markierungen}} $6 zum Logbucheintrag $5 der Seite $3 hinzu",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|entfernte}} die {{PLURAL:$9|Markierung|Markierungen}} $8 von der Version $4 der Seite $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|entfernte}} die {{PLURAL:$9|Markierung|Markierungen}} $8 vom Logbucheintrag $5 der Seite $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|aktualisierte}} Markierungen der Version $4 der Seite $3 ($6 {{PLURAL:$7|hinzugefügt}}; $8 {{PLURAL:$9|entfernt}})",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|aktualisierte}} Markierungen des Logbucheintrags $5 der Seite $3 ($6 {{PLURAL:$7|hinzugefügt}}; $8 {{PLURAL:$9|entfernt}})",
        "rightsnone": "(–)",
        "revdelete-summary": "Zusammenfassungskommentar",
        "feedback-adding": "Rückmeldung wird zur Seite hinzugefügt …",
        "feedback-error1": "Fehler: Unbekanntes Ergebnis der API",
        "feedback-error2": "Fehler: Bearbeitung gescheitert",
        "feedback-error3": "Fehler: Keine Antwort von der API",
+       "feedback-error4": "Fehler: Der Beitrag konnte nicht unter dem angegebenen Rückmeldungstitel gespeichert werden",
        "feedback-message": "Nachricht:",
        "feedback-subject": "Betreff:",
        "feedback-submit": "Senden",
        "log-name-pagelang": "Sprachenänderungs-Logbuch",
        "log-description-pagelang": "Dies ist ein Logbuch mit Änderungen an Seitensprachen.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|änderte}} die Seitensprache für $3 von $4 nach $5.",
-       "default-skin-not-found": "Hoppla! Die mit <code>$wgDefaultSkin</code> als <code>$1</code>&nbsp;für dein Wiki definierte Standardbenutzeroberfläche ist nicht verfügbar.\n\nDie folgende(n) Benutzeroberfläche(n) scheinen vorhanden zu sein:\n\n$2\n\nSiehe hierzu das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch zur Konfiguration von Benutzeroberflächen].\n\n; Sofern du MediaWiki gerade installiert hast\n: Du hast MediaWiki vermutlich mit Hilfe von Git oder den Quellcode direkt anhand einer anderen Methode installiert. Das aktuelle Problem war deshalb zu erwarten. Installiere zumindest eine im [https://www.mediawiki.org/wiki/Category:All_skins Verzeichnis der Benutzeroberflächen] enthaltene Benutzeroberfläche indem du:\n:* eines der Repositorien aus <code>mediawiki/skins/*</code> mit Hilfe von Git in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation klonst,\n:* die Dateiveröffentlichungen einzelner Benutzeroberflächen aus [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopierst,\n:* die [https://www.mediawiki.org/wiki/Download/de Dateiveröffentlichung von MediaWiki] herunterlädst, die verschiedene Benutzeroberflächen sowie Erweiterungen enthält. Du kannst das dort enthaltene Verzeichnis <code>skins/</code> Verzeichnis nutzen und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopieren.\n\n; Sofern du MediaWiki gerade aktualisiert hast\n: Bei MediaWiki 1.24 und neueren Versionen werden die installierten Benutzeroberflächen nicht mehr automatisch aktiviert (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade die Datei <code>LocalSettings.php</code> geändert hast\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
+       "default-skin-not-found": "Hoppla! Die mit <code>$wgDefaultSkin</code> als <code>$1</code>&nbsp;für dein Wiki definierte Standardbenutzeroberfläche ist nicht verfügbar.\n\n{{PLURAL:$4|Die folgende Benutzeroberfläche scheint|Die folgenden Benutzeroberflächen scheinen}} vorhanden zu sein:\n\n$2\n\nSiehe hierzu das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch zur Konfiguration von Benutzeroberflächen].\n\n; Sofern du MediaWiki gerade installiert hast\n: Du hast MediaWiki vermutlich mit Hilfe von Git oder den Quellcode direkt anhand einer anderen Methode installiert. Das aktuelle Problem war deshalb zu erwarten. Installiere zumindest eine im [https://www.mediawiki.org/wiki/Category:All_skins Verzeichnis der Benutzeroberflächen] enthaltene Benutzeroberfläche indem du:\n:* eines der Repositorien aus <code>mediawiki/skins/*</code> mit Hilfe von Git in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation klonst,\n:* die Dateiveröffentlichungen einzelner Benutzeroberflächen aus [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopierst,\n:* die [https://www.mediawiki.org/wiki/Download/de Dateiveröffentlichung von MediaWiki] herunterlädst, die verschiedene Benutzeroberflächen sowie Erweiterungen enthält. Du kannst das dort enthaltene Verzeichnis <code>skins/</code> Verzeichnis nutzen und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopieren.\n\n; Sofern du MediaWiki gerade aktualisiert hast\n: Bei MediaWiki 1.24 und neueren Versionen werden die installierten Benutzeroberflächen nicht mehr automatisch aktiviert (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die {{PLURAL:$5|folgende Zeile|folgenden Zeilen}} in die Datei <code>LocalSettings.php</code> einfügen, um {{PLURAL:$5|die derzeit installierte Benutzeroberfläche|alle derzeit installierten Benutzeroberflächen}} zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade die Datei <code>LocalSettings.php</code> geändert hast\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
        "default-skin-not-found-no-skins": "Hoppla! Die mit <code>$wgDefaultSkin</code> als <code>$1</code>&nbsp;für dein Wiki definierte Standardbenutzeroberfläche ist nicht verfügbar.\n\nDu hast keine Benutzeroberfläche installiert.\n\n; Sofern du MediaWiki gerade installiert oder aktualisiert hast\n: Du hast MediaWiki vermutlich mit Hilfe von Git oder den Quellcode direkt anhand einer anderen Methode installiert. Das aktuelle Problem war deshalb zu erwarten, da MediaWiki 1.24 und neuere Versionen keine Benutzeroberflächen im Hauptrepositorium enthalten. Installiere zumindest eine im [https://www.mediawiki.org/wiki/Category:All_skins Verzeichnis der Benutzeroberflächen] enthaltene Benutzeroberfläche indem du:\n:* eines der Repositorien aus <code>mediawiki/skins/*</code> mit Hilfe von Git in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation klonst,\n:* die Dateiveröffentlichungen einzelner Benutzeroberflächen aus [https://www.mediawiki.org/wiki/Special:SkinDistributor MediaWiki.org] herunterlädst und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopierst,\n:* die [https://www.mediawiki.org/wiki/Download/de Dateiveröffentlichung von MediaWiki] herunterlädst, die verschiedene Benutzeroberflächen sowie Erweiterungen enthält. Du kannst das dort enthaltene Verzeichnis <code>skins/</code> Verzeichnis nutzen und in das Verzeichnis <code dir=\"ltr\">skins/</code> deiner MediaWiki-Installation kopieren.\n: Siehe hierzu das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch zur Konfiguration von Benutzeroberflächen].",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''deaktiviert''')",
index a497dec..e4f40e8 100644 (file)
        "readonly": "database kılit biyo",
        "enterlockreason": "Database kılit biyo",
        "readonlytext": "Qey pawıtış ri yew sebeb vace. Texmini yew tarix vace şıma key pawıtış wedarneni:  $1",
-       "missing-article": "Banqa, pela be namê \"$1\" $2 ke gunê bıbo, nêdiye.\n\nEna belki seba yew vurnayışo kıhan ya zi tarixê gırê yew pele esteriya.\n\nEke wına niyo, belki ''software''i de yew xeta esta.\nKerem kerê, naye be namey ''URL''i yew [[Special:ListUsers/sysop|karber]]i ra vacê.",
+       "missing-article": "Banqa, pela be nameyê \"$1\" $2 ke gani bıbo, nêdiye.\n\nEna belki seba yew vurnayışo kıhan ya zi tarixê gıreyê yew pele esteriya.\n\nEke wına niyo, belki ''software'' de yew xeta esta.\nKerem kerên, naye be nameyê ''URL''yi yew [[Special:ListUsers/sysop|karber]]i ra vacên.",
        "missingarticle-rev": "(rewizyon#: $1)",
        "missingarticle-diff": "(Ferq: $1, $2)",
        "readonly_lag": "Daegeh (database) otomatikmen kılit bi, sureo ke  daegehê bınêni resay daegehê serêni.",
        "wrongpasswordempty": "Parola tola, venga. tekrar bınuse.",
        "passwordtooshort": "Paroley gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bê.",
        "password-name-match": "Parola u nameyê şıma gani zeypê (seypê) nêbo.",
-       "password-login-forbidden": "No namey karberi u parola karkerdışê cı  kerdo xırab.",
+       "password-login-forbidden": "Nameyê nê karberi û gurenayışê parola biyo qedeğen.",
        "mailmypassword": "Parola reset ke",
        "passwordremindertitle": "Qandê {{SITENAME}}'i idareten parolaya newiye",
        "passwordremindertext": "Yew ten (muhtemelen, şıma na aderesê IP ra $1 ) {{SITENAME}} ($4) newe yew parola waşt. \"$2\" no name ri emanet yew parola vıraziya \"$3\". Eke na şıma waşta, hesabê xo akere u newe yew parola bıvıraze. Muddetê parolayê şıma yo emanet {{PLURAL:$5|1 roc|$5 roci}}.\n\nEke vurnayişê parolayi, şıma nêwaşt ya zi parolayê şıma ameyo şıma vir u şıma hini qayil nşye parolayê xo bıvurni; no mesaj peygoş kere u bıewne gureyê xo.",
        "summary-preview": "Verqaytê xulasa:",
        "subject-preview": "Verqaytê mewzu/sernuştey:",
        "blockedtitle": "Karber blokekerdeo",
-       "blockedtext": "'''No namey karberi ya ki no adresê IP blokekerdeo.'''\n\nVıraştoğê blokey: $1\nSebebê blokey: ''$2''.\n\n* Sıftekerdena blokey: $8\n* Qediyayışê blokey: $6\n* Blokebiyae: $7\n\nŞıma şenê  $1 de ya ki  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de jû e-postawa ke vêrena, beli biye u şıam gureynayışê cı ra mehrum nêbiyê.\nIP adresê şımao nıkaên $3o u numrey bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
+       "blockedtext": "<strong>No nameyê karberi ya zi na adresa IP blokekerdeya.</strong>\n\nVıraştoğê blokeyi: $1\nSebebê blokeyi: <em>$2</em>.\n\n* Sıftekerdena blokeyi: $8\n* Qediyayışê blokeyi: $6\n* Blokebiyaye: $7\n\nŞıma şenê  $1 de ya zi  yewna [[{{MediaWiki:Grouppage-sysop}}|administrator]]i de irtıbat kewê ke na mesela sero werênê, cemaet vırazê. \nŞıma nêşenê xısusiyetê \"karberi rê e-posta bırışe\" bıgureynê/bıxebetnê heta ke [[Special:Preferences|Tercihanê hesabi]] de yew e-posteyo ke vêreno, beli bi û şıma gureynayışê cı ra mehrum nêbiyê.\nIP adresa şımaya nıkayêne $3o û numreyê bloki #$5.\nŞıma rê zehmet, eke kewnê ra dıme, teferruatanê corênan not kerên.",
        "autoblockedtext": "IP adresê şıma otomotikmen kerda kılit, çıkı $1 verniya nê hesabi grota.\nSebebê cı zi:\n\n:''$2''\n\n* Dest pê kerdışê verni grotışi: $8\n* Qedyayişê verni grotışi: $6\n* Qayile ke bloqe bıbo: $7\n\nŞıma qayile qey weri kewtışê na mesela,  $1 ya na [[{{MediaWiki:Grouppage-sysop}}|serkaran ra]] yewi ra şenê irtibat kewê.\n\nNot, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nênuşt se şıma nêşenê na xususiyet ra \"karber rê e-posta bırışê\" istifade bıkeri.\n\nIP adresiya şıma yo nıkayên $3 u ID şıma yo ke musade nêdaye #$5. Eke şıma yew tehqiqat vırazeni malumatê corênan xo vira mekerê.",
        "blockednoreason": "sebeb nidaniyo",
        "whitelistedittext": "Qandê vurnayış kerdışi rê $1.",
        "rev-deleted-comment": "(Timarkerdışe enay hewadeyayo)",
        "rev-deleted-user": "(nameyê karberi esteriyo)",
        "rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
-       "rev-deleted-user-contribs": "[namey karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
+       "rev-deleted-user-contribs": "[nameyê karberi ya zi adresa IPy esteriya - vurnayış iştırakan ra nımniyo]",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-deleted-text-unhide": "Çımra viyarnayışê ena pele '''besterêno'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımra viyarnayışi bıvinê], eke wazenê dewam kerê.",
        "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
        "redirect": "Serşıkıtena dosya, karberi, pele ya ki revizyonê kamiya dosya",
        "redirect-legend": "Hetenayışa dosya yana pela",
-       "redirect-summary": "Na pela xase to hetê jû dosya (namey dosya daeyo), jû pele (kamiya revizyoni ya ki pele daiya) ya ki jû pela karberi (kamiya karberia reqemkiye daiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya ki  [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Na pela xase to hetê yew dosya (nameyê dosya dayeyo), yew pele (kamiya revizyoni ya zi pele dayiya) ya zi yew pela karberi (kamiya karberiya reqemkiye dayiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya zi  [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Şo",
        "redirect-lookup": "Bewni",
        "redirect-value": "Erc:",
index 0187afb..41587f4 100644 (file)
        "revdelete-unsuppress": "Tó via i lémit al revisiòun armési",
        "revdelete-log": "Mutîv:",
        "revdelete-submit": "Drōva {{PLURAL:$1|int la revisiòun sernîda|int al revisiòun sernîdi}}",
-       "revdelete-success": "<strong>Vésta ed la revisòun arnuvêda int al môd gióst.</strong>",
-       "revdelete-failure": "<strong>La vésta 'd la versiòun l'an pōl mìa èser arnuvêda:</strong>\n$1",
-       "logdelete-success": "<strong>Vésta dal fât impustêda int al môd gióst.</strong>",
-       "logdelete-failure": "<strong>La vésta dal fât l'an pōl mìa èser impustêda:</strong>\n$1",
+       "revdelete-success": "Vésta ed la revisòun arnuvêda int al môd gióst.",
+       "revdelete-failure": "La vésta 'd la versiòun l'an pōl mìa èser arnuvêda:\n$1",
+       "logdelete-success": "Vésta dal fât impustêda int al môd gióst.",
+       "logdelete-failure": "La vésta dal fât l'an pōl mìa èser impustêda:\n$1",
        "revdel-restore": "Câmbia la vidûda.",
        "pagehist": "Stòria 'd la pàgina",
        "deletedhist": "Stòria scanşlêda",
        "right-sendemail": "Spidés pôsta eletrônica a êter utèint",
        "right-passwordreset": "A vèd i mesâg 'd arnōv ed la cêva 'ed ingrès",
        "right-managechangetags": "Fà e tó via i [[Special:Tags|tag]] dal databêş",
+       "right-applychangetags": "Tâca dal [[Special:Tags|tichèti]] al tō mudéfichi",
+       "right-changetags": "Zûta e tó via [[Special:Tags|tichèti]] precîşi só versiòun ónichi o vōş ed regéster",
        "newuserlogpage": "Utèint nōv",
        "newuserlogpagetext": "Ché sòt a gh' é la lésta di nōv utèint.",
        "rightslog": "Diré ed j utèint",
        "action-editmyprivateinfo": "mudéfica al tō infurmasiòun personêli",
        "action-editcontentmodel": "câmbia al mudèl dèinter a 'na pàgina",
        "action-managechangetags": "fà e tó via i tag dal databêş",
+       "action-applychangetags": "tachêr dal tichèti al tō mudéfichi",
+       "action-changetags": "zuntêr o tōr via tichèti precîşi só versiòun ónichi o vōş ed regéster",
        "nchanges": "$1\n{{PLURAL:$1|mudéfica|mudéfichi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|da l'ûltma vîşita}}",
        "enhancedrc-history": "stòria",
        "upload-file-error": "Erōr intêren",
        "upload-file-error-text": "É sucès un erōr intêren mèinter a s' ēra drê fêr un file pruvişôri inséma 'l servèint. Cuntatêr un [[Special:ListUsers/sysop|aministradōr]].",
        "upload-misc-error": "Erōr in cârga mia cgnusû",
+       "upload-misc-error-text": "S'é verifichê un erōr mìa cgnusû mèinter a 's carghêva al file. Verifichêr che la URL la sia giósta e ch'es pôsa druvêr. Se al problēma al gh'é incòra, cuntatêr un [[Special:ListUsers/sysop|aministradōr]].",
+       "upload-too-many-redirects": "L'URL al gh'îva dèinter trôp redirect",
+       "upload-http-error": "A s'é verifichê un erōr HTTP: $1",
+       "upload-copy-upload-invalid-domain": "An n'é mìa permés carghêr dal côpi da cl'indirés ché.",
+       "backend-fail-stream": "An n'é mìa pusébil traşmèter al file \"$1\".",
+       "backend-fail-backup": "An n'é mìa pusébil fêr 'na côpia 'd sicurèsa dal file $1.",
+       "backend-fail-notexists": "Al file $1 al gh'é mìa.",
+       "backend-fail-hashes": "An n'é mìa pusébil utgnîr la divisiòun di file per cunfrûnt.",
+       "backend-fail-notsame": "A gh'é bèle un file mìa cumpâgn a \"$1\"",
+       "backend-fail-invalidpath": "\"$1\" an n'é mìa un percōrs vâlid per archiviêr.",
+       "backend-fail-delete": "An n'é mìa pusébil scanşlêr al file \"$1\".",
+       "backend-fail-describe": "Imposébil mudifichêr al j infurmasiòun dal file \"$1\".",
+       "backend-fail-alreadyexists": "Al file \"$1\" al gh'é bèle.",
+       "backend-fail-store": "Impusébil mèter in memôria al file \"$1\" in \"$2\".",
+       "backend-fail-copy": "An n'é mìa pusébil cupiêr al file \"$1\" in \"$2\".",
+       "backend-fail-move": "An n'é mìa pusébil spustêr al file \"$1\" in \"$2\".",
+       "backend-fail-opentemp": "L'é impusébil arvîr un file pruvişôri.",
+       "backend-fail-writetemp": "L'é impusébil fêr al file pruvişôri.",
+       "backend-fail-closetemp": "L'é impusébil sarêr un file pruvişôri.",
+       "backend-fail-read": "An n'é mìa pusébil lēzer al file \"$1\".",
+       "backend-fail-create": "An n'é mìa pusébil fêr al file \"$1\".",
+       "backend-fail-maxsize": "L'é impusébil fêr al file \"$1\" perché l'é pió grôs ed {{PLURAL:$2|un|$2}} byte.",
+       "backend-fail-readonly": "Al prugrâma 'd memôria \"$1\" adèsa a 's pōl sōl lēzer. La ragiòun dêda l'é: \"$2\".",
        "license": "Licèinsa:",
        "license-header": "Licèinsa",
        "nolicense": "Nisóna licèinsa sgnêda",
index 78c64a3..62ca344 100644 (file)
        "disclaimers": "Αποποίηση ευθυνών",
        "disclaimerpage": "Project:Γενική αποποίηση",
        "edithelp": "Βοήθεια σχετικά με την επεξεργασία",
+       "helppage-top-gethelp": "Βοήθεια",
        "mainpage": "Αρχική σελίδα",
        "mainpage-description": "Αρχική σελίδα",
        "policy-url": "Project:Πολιτική",
        "portal": "Πύλη κοινότητας",
        "portal-url": "Project:Πύλη κοινότητας",
-       "privacy": "Πολιτική ιδιωτικού απορρήτου",
-       "privacypage": "Project:Πολιτική ιδιωτικού απορρήτου",
+       "privacy": "Πολιτική ιδιωτικότητας",
+       "privacypage": "Project:Πολιτική ιδιωτικότητας",
        "badaccess": "Σφάλμα άδειας",
        "badaccess-group0": "Δεν επιτρέπεται να εκτελέσετε την ενέργεια που ζητήσατε.",
        "badaccess-groups": "Η ενέργεια που ζητήσατε είναι περιορισμένη σε χρήστες που ανήκουν {{PLURAL:$2|στην ομάδα|σε μία από τις ομάδες}}: $1.",
        "wrongpassword": "Ο κωδικός που πληκτρολογήσατε είναι λανθασμένος. Παρακαλούμε προσπαθήστε ξανά.",
        "wrongpasswordempty": "Ο κωδικός πρόσβασης που εισάχθηκε ήταν κενός. Παρακαλούμε προσπαθήστε ξανά.",
        "passwordtooshort": "Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.",
+       "passwordtoolong": "Οι κωδικοί πρόσβασης δεν μπορούν να υπερβαίνουν {{PLURAL:$1|τον 1 χαρακτήρα|τους $1 χαρακτήρες}}.",
        "password-name-match": "Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.",
        "password-login-forbidden": "Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.",
        "mailmypassword": "Επαναφορά κωδικού",
        "missingcommentheader": "'''Υπενθύμιση:''' Δεν έχετε γράψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.\nΑν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεργασία σας θα αποθηκευτεί χωρίς θέμα ή επικεφαλίδα.",
        "summary-preview": "Προεπισκόπηση σύνοψης:",
        "subject-preview": "Προεπισκόπηση θέματος/επικεφαλίδας:",
+       "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
        "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτία που δόθηκε είναι ο εξής:\n\n:''$2''\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με έναν από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΣημειώστε ότι δεν μπορείτε να χρησιμοποιήσετε το χαρακτηριστικό \"στείλτε e-mail σε αυτό τον χρήστη\" εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρημένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής σας είναι #$5. Παρακαλώ συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
        "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 κλήσεις}}.",
        "revdelete-selected-text": "{{PLURAL:$1|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Επιλεγμένη έκδοση αρχείου|Επιλεγμένες εκδόσεις αρχείου}} του [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:",
+       "revdelete-text-text": "Οι διαγραμμένες αναθεωρήσεις θα εξακολουθούν να εμφανίζονται στο ιστορικό της σελίδας, αλλά τα μέρη του περιεχομένου τους θα είναι απροσπέλαστα για το κοινό.",
+       "logdelete-text": "Οι διαγραμμένες καταγραφές ενεργειών θα εξακολουθούν να εμφανίζονται στις σελίδες καταγραφών, αλλά μέρη του περιεχομένου τους, θα είναι απροσπέλαστα για το κοινό.",
+       "revdelete-text-others": "Άλλοι διαχειριστές θα εξακολουθεί να είναι σε θέση να αποκτήσουν πρόσβαση στο κρυφό περιεχόμενο και για να αναιρέσουν τη διαγραφή, εκτός αν τίθενται πρόσθετοι περιορισμοί.",
        "revdelete-confirm": "Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "revdelete-suppress-text": "Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:\n* Ενδεχόμενη συκοφαντική δυσφήμιση\n* Ακατάλληλες προσωπικές πληροφορίες\n*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>",
        "revdelete-legend": "Θέστε περιορισμούς ορατότητας",
index 16a1e6a..8afed1a 100644 (file)
        "history-feed-description": "Revision history for this page on the wiki",
        "history-feed-item-nocomment": "$1 at $2",
        "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
+       "history-edit-tags": "Edit tags of selected revisions",
        "rev-deleted-comment": "(edit summary removed)",
        "rev-deleted-user": "(username removed)",
        "rev-deleted-event": "(log details removed)",
        "rev-showdeleted": "show",
        "revisiondelete": "Delete/undelete revisions",
        "revdelete-nooldid-title": "Invalid target revision",
-       "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
+       "revdelete-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist, or you are attempting to hide the current revision.",
        "revdelete-no-file": "The file specified does not exist.",
        "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
        "revdelete-show-file-submit": "Yes",
        "revdelete-unsuppress": "Remove restrictions on restored revisions",
        "revdelete-log": "Reason:",
        "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
-       "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
-       "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
-       "logdelete-success": "<strong>Log visibility successfully set.</strong>",
-       "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
+       "revdelete-success": "Revision visibility successfully updated.",
+       "revdelete-failure": "Revision visibility could not be updated:\n$1",
+       "logdelete-success": "Log visibility successfully set.",
+       "logdelete-failure": "Log visibility could not be set:\n$1",
        "revdel-restore": "change visibility",
        "pagehist": "Page history",
        "deletedhist": "Deleted history",
        "right-sendemail": "Send email to other users",
        "right-passwordreset": "View password reset emails",
        "right-managechangetags": "Create and delete [[Special:Tags|tags]] from the database",
+       "right-applychangetags": "Apply [[Special:Tags|tags]] along with one's changes",
+       "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "newuserlogpage": "User creation log",
        "newuserlogpagetext": "This is a log of user creations.",
        "rightslog": "User rights log",
        "action-editmyprivateinfo": "edit your private information",
        "action-editcontentmodel": "edit the content model of a page",
        "action-managechangetags": "create and delete tags from the database",
+       "action-applychangetags": "apply tags along with your changes",
+       "action-changetags": "add and remove arbitrary tags on individual revisions and log entries",
        "nchanges": "$1 {{PLURAL:$1|change|changes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
        "enhancedrc-history": "history",
        "listfiles-delete": "delete",
        "listfiles-summary": "This special page shows all uploaded files.",
        "listfiles_search_for": "Search for media name:",
+       "listfiles-userdoesnotexist": "User account \"$1\" is not registered.",
        "imgfile": "file",
        "listfiles": "File list",
        "listfiles_thumb": "Thumbnail",
        "logempty": "No matching items in log.",
        "log-title-wildcard": "Search titles starting with this text",
        "showhideselectedlogentries": "Change visibility of selected log entries",
+       "log-edit-tags": "Edit tags of selected log entries",
        "allpages": "All pages",
        "allpages-summary": "",
        "nextpage": "Next page ($1)",
        "emailccsubject": "Copy of your message to $1: $2",
        "emailsent": "Email sent",
        "emailsenttext": "Your email message has been sent.",
-       "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
+       "emailuserfooter": "This email was sent by $1 to $2 by the \"{{int:emailpage}}\" function at {{SITENAME}}.",
        "usermessage-summary": "Leaving system message.",
        "usermessage-editor": "System messenger",
        "usermessage-template": "MediaWiki:UserMessage",
        "import-interwiki-history": "Copy all history revisions for this page",
        "import-interwiki-templates": "Include all templates",
        "import-interwiki-submit": "Import",
-       "import-interwiki-namespace": "Destination namespace:",
-       "import-interwiki-rootpage": "Destination root page (optional):",
+       "import-mapping-default": "Import to default locations",
+       "import-mapping-namespace": "Import to a namespace:",
+       "import-mapping-subpage": "Import as subpages of the following page:",
        "import-upload-filename": "Filename:",
        "import-comment": "Comment:",
        "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
        "pageinfo-protect-cascading-yes": "Yes",
        "pageinfo-protect-cascading-from": "Protections are cascading from",
        "pageinfo-category-info": "Category information",
+       "pageinfo-category-total": "Total number of members",
        "pageinfo-category-pages": "Number of pages",
        "pageinfo-category-subcats": "Number of subcategories",
        "pageinfo-category-files": "Number of files",
        "patrol-log-page": "Patrol log",
        "patrol-log-header": "This is a log of patrolled revisions.",
        "log-show-hide-patrol": "$1 patrol log",
+       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Deleted old revision $1",
        "filedeleteerror-short": "Error deleting file: $1",
        "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
        "tags-deactivate-reason": "Reason:",
        "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".",
        "tags-deactivate-submit": "Deactivate",
+       "tags-apply-no-permission": "You do not have permission to apply change tags along with your changes.",
+       "tags-apply-not-allowed-one": "The tag \"$1\" is not allowed to be manually applied.",
+       "tags-apply-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually applied: $1",
+       "tags-update-no-permission": "You do not have permission to add or remove change tags from individual revisions or log entries.",
+       "tags-update-add-not-allowed-one": "The tag \"$1\" is not allowed to be manually added.",
+       "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually added: $1",
+       "tags-update-remove-not-allowed-one": "The tag \"$1\" is not allowed to be removed.",
+       "tags-update-remove-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually removed: $1",
+       "tags-edit-title": "Edit tags",
+       "tags-edit-manage-link": "Manage tags",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
+       "tags-edit-revision-explanation": "",
+       "tags-edit-logentry-explanation": "",
+       "tags-edit-revision-legend": "Add or remove tags from {{PLURAL:$1|this revision|all $1 revisions}}",
+       "tags-edit-logentry-legend": "Add or remove tags from {{PLURAL:$1|this log entry|all $1 log entries}}",
+       "tags-edit-existing-tags": "Existing tags:",
+       "tags-edit-existing-tags-none": "''None''",
+       "tags-edit-new-tags": "New tags:",
+       "tags-edit-add": "Add these tags:",
+       "tags-edit-remove": "Remove these tags:",
+       "tags-edit-remove-all-tags": "(remove all tags)",
+       "tags-edit-chosen-placeholder": "Select some tags",
+       "tags-edit-chosen-no-results": "No tags found that match",
+       "tags-edit-reason": "Reason:",
+       "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|this revision|$1 revisions}}",
+       "tags-edit-logentry-submit": "Apply changes to {{PLURAL:$1|this log entry|$1 log entries}}",
+       "tags-edit-success": "The changes were successfully applied.",
+       "tags-edit-failure": "The changes could not be applied:\n$1",
+       "tags-edit-nooldid-title": "Invalid target revision",
+       "tags-edit-nooldid-text": "You have either not specified any target revision on which to perform this function, or the specified revision does not exist.",
+       "tags-edit-none-selected": "Please select at least one tag to add or remove.",
        "comparepages": "Compare pages",
        "comparepages-summary": "",
        "compare-page1": "Page 1",
        "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",
+       "log-name-tag": "Tag log",
+       "log-description-tag": "This page shows when users have added or removed [[Special:Tags|tags]] from individual revisions or log entries. The log does not list tagging actions when they occur as part of an edit, deletion, or similar action.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to revision $4 of page $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|added}} the {{PLURAL:$7|tag|tags}} $6 to log entry $5 of page $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from revision $4 of page $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|removed}} the {{PLURAL:$9|tag|tags}} $8 from log entry $5 of page $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|updated}} tags on revision $4 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|updated}} tags on log entry $5 of page $3 ({{PLURAL:$7|added}} $6; {{PLURAL:$9|removed}} $8)",
        "rightsnone": "(none)",
        "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
        "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
        "feedback-error1": "Error: Unrecognized result from API",
        "feedback-error2": "Error: Edit failed",
        "feedback-error3": "Error: No response from API",
+       "feedback-error4": "Error: Unable to post to given feedback title",
        "feedback-message": "Message:",
        "feedback-subject": "Subject:",
        "feedback-submit": "Submit",
        "log-name-pagelang": "Change language log",
        "log-description-pagelang": "This is a log of changes in page languages.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|changed}} page language for $3 from $4 to $5.",
-       "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} currently installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
        "default-skin-not-found-no-skins": "Whoops! The default skin for your wiki, defined in <code>$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYou have no installed skins.\n\n; If you have just installed or upgraded MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.\n",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabled''')",
index 4703218..a09c0f6 100644 (file)
        "ipboptions": "2 horoj:2 hours,1 tago:1 day,3 tagoj:3 days,1 semajno:1 week,2 semajnoj:2 weeks,1 monato:1 month,3 monatoj:3 months,6 monatoj:6 months,1 jaro:1 year,porĉiam:infinite",
        "ipbhidename": "Kaŝi salutnomon de redaktoj kaj listoj",
        "ipbwatchuser": "Atenti la paĝojn por uzanto kaj diskuto de ĉi tiu uzanto.",
-       "ipb-disableusertalk": "Preventi ĉi tiun uzanton de redaktante ties propran diskuto-paĝon kiam forbarita",
+       "ipb-disableusertalk": "Preventi ĉi tiun uzanton redakti sian diskuto-paĝon, dum li estas forbarita",
        "ipb-change-block": "Reforbari la uzanton kun ĉi tiuj preferoj",
        "ipb-confirm": "Konfirmi forbaron",
        "badipaddress": "Neniu uzanto, aŭ la IP-adreso estas misformita.",
        "blockipsuccesssub": "Forbaro sukcesis.",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] estas forbarita. <br />\nVidu la [[Special:BlockList|liston de forbaroj]] por kontroli.",
        "ipb-blockingself": "Vi preskaŭ forbaros vin mem! Ĉu vi certas ke vi volas fari ĉi tiel?",
-       "ipb-confirmhideuser": "Vi preskaŭ forbaras uzanto kun \"kaŝi uzanton\" ŝalta. Ĉi tiu kaŝi la nomon de uzanto en ĉiuj listoj ka protokoloj. Ĉu vi certas ke vi volas fari ĉi tiel?",
+       "ipb-confirmhideuser": "Vi preskaŭ forbaras uzanton kun ŝaltita modo \"kaŝi uzanton\". Ĉi tio kaŝos la nomon de uzanto en ĉiuj listoj kaj protokoloj. Ĉu vi certas, ke vi volas fari ĉi tion?",
        "ipb-edit-dropdown": "Redakti kialojn por forbaro.",
        "ipb-unblock-addr": "Restarigi $1",
        "ipb-unblock": "Malforbari salutnomon aŭ IP-adreson",
        "ipb_already_blocked": "\"$1\" estas jam forbarita",
        "ipb-needreblock": "$1 estas jam forbarita. Ĉu vi volas ŝanĝi la opciojn?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Alia forbaro|Aliaj forbaroj}}",
-       "unblock-hideuser": "Vi ne povas malforbari ĉi tiun uzanton, pro ties salutnomo estis kaŝita.",
+       "unblock-hideuser": "Vi ne povas malforbari ĉi tiun uzanton, ĉar ties salutnomo estis kaŝita.",
        "ipb_cant_unblock": "Eraro: Forbar-identigo $1 ne estas trovita. Ĝi eble estis jam malforbarita.",
        "ipb_blocked_as_range": "Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.",
        "ip_range_invalid": "Malvalida IP-adresa intervalo.",
        "import-interwiki-history": "Kopiu ĉiujn historiajn versiojn por ĉi tiu pago.",
        "import-interwiki-templates": "Inkluzivi ĉiujn ŝablonojn",
        "import-interwiki-submit": "Importi",
-       "import-interwiki-namespace": "Cela nomspaco:",
-       "import-interwiki-rootpage": "Ircela radikopaĝo (laŭvola):",
        "import-upload-filename": "Dosiernomo:",
        "import-comment": "Komento:",
        "importtext": "Bonvolu eksporti la dosieron el la fonta vikio per la [[Special:Export|eksportilo]]. Konservu ĝin sur via persona komputilo kaj poste alŝutu ĝin tien ĉi.",
        "import-rootpage-nosubpage": "La nomspaco \"$1\" de la radikopaĝo ne permesas subpaĝoj.",
        "importlogpage": "Protokolo de importaĵoj",
        "importlogpagetext": "Administrantecaj importoj de paĝoj kun redakto-historio de aliaj vikioj.",
-       "import-logentry-upload": "importita [[$1]] de dosiera alŝuto",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revizio importita|revizioj importitaj}}",
-       "import-logentry-interwiki": "transvikiigita $1",
        "import-logentry-interwiki-detail": "Importis $1 {{PLURAL:$1|revizion|reviziojn}} de $2",
        "javascripttest": "Ĝavoskripta testado",
        "javascripttest-pagetext-noframework": "Ĉi tiu paĝo estas konservita por funkciigi testojn de JavaScript.",
        "tooltip-pt-mycontris": "Listo de viaj kontribuoj",
        "tooltip-pt-login": "Vi estas invitita ensaluti, tamen ne estas devige.",
        "tooltip-pt-logout": "Elsaluti",
+       "tooltip-pt-createaccount": "Ni rekomendas al vi kreon de uzantokonto kaj ensaluto; tamen, tio ne estas deviga",
        "tooltip-ca-talk": "Diskuto pri la artikolo",
        "tooltip-ca-edit": "Vi povas redakti tiun ĉi paĝon. Bv uzi la antaŭvidbutonon antaŭ ol konservi.",
        "tooltip-ca-addsection": "Starti novan sekcion",
        "logentry-upload-revert": "$1 {{GENDER:$2|alŝutis}} $3",
        "rightsnone": "(nenia)",
        "revdelete-summary": "redaktoresumon",
+       "feedback-adding": "Aldonanta respondon al la paĝo...",
+       "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
+       "feedback-bugnew": "Mi konfirmis. Raportu novan cimon.",
        "feedback-bugornote": "Se vi pretas priskribi teknikan problemon detale, bonvolu [$1 raporti cimon].\nAŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la paĝo \"[$3 $2]\", kune kun via salutnomo kaj uzita retumilo.",
-       "feedback-subject": "Temo:",
-       "feedback-message": "Mesaĝo:",
        "feedback-cancel": "Nuligi",
-       "feedback-submit": "Sendi Mesaĝon",
-       "feedback-adding": "Aldonanta respondon al la paĝo...",
+       "feedback-close": "Farita",
        "feedback-error1": "Eraro: Nerekonita rezulto de API",
        "feedback-error2": "Eraro: La redakto malsukcesis",
        "feedback-error3": "Eraro: Neniu respondo de API",
+       "feedback-message": "Mesaĝo:",
+       "feedback-subject": "Temo:",
+       "feedback-submit": "Sendi Mesaĝon",
        "feedback-thanks": "Dankon! Via opinio-esprimo estis afiŝita al la paĝo \"[$2 $1]\".",
-       "feedback-close": "Farita",
-       "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
-       "feedback-bugnew": "Mi konfirmis. Raportu novan cimon.",
        "searchsuggest-search": "Serĉi",
        "searchsuggest-containing": "enhavas...",
        "api-error-badaccess-groups": "Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.",
        "mediastatistics-header-text": "Tekstaj",
        "mediastatistics-header-executable": "Plenumeblaj dosieroj",
        "json-error-state-mismatch": "JSON estas malvalida aŭ malformigita",
-       "json-error-syntax": "Sintaksa eraro"
+       "json-error-syntax": "Sintaksa eraro",
+       "special-characters-group-latin": "Latina",
+       "special-characters-group-latinextended": "Latina etendita",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simboloj",
+       "special-characters-group-greek": "Greka",
+       "special-characters-group-cyrillic": "Cirila",
+       "special-characters-group-arabic": "Araba",
+       "special-characters-group-arabicextended": "araba etendite",
+       "special-characters-group-persian": "persa",
+       "special-characters-group-hebrew": "Hebrea",
+       "special-characters-group-bangla": "Bengala",
+       "special-characters-group-tamil": "Tamila",
+       "special-characters-group-telugu": "Telegua",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Guĝarata",
+       "special-characters-group-devanagari": "Nagario",
+       "special-characters-group-thai": "Taja",
+       "special-characters-group-lao": "laŭa",
+       "special-characters-group-khmer": "kmera",
+       "special-characters-title-endash": "mallonga streketo",
+       "special-characters-title-emdash": "longa streketo",
+       "special-characters-title-minus": "minus-signo"
 }
index 4f38639..6c909be 100644 (file)
                        "Paynekiller92",
                        "Kroji",
                        "JasterTDC",
-                       "Laurenslimb"
+                       "Laurenslimb",
+                       "Tusca"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "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 que haya sido renombrada o borrada del wiki.\nPrueba a [[Special:Search|buscar en el wiki]] otras páginas relacionadas.",
+       "history-edit-tags": "Editar etiquetas de revisiones seleccionadas",
        "rev-deleted-comment": "(resumen de edición eliminado)",
        "rev-deleted-user": "(nombre de usuario eliminado)",
        "rev-deleted-event": "(detalles del registro eliminados)",
        "rev-showdeleted": "mostrar",
        "revisiondelete": "Borrar/restaurar revisiones",
        "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-nooldid-text": "O bien no se ha especificado una revisión destino sobre la que realizar esta función, o bien la revisión especificada no existe, o bien estás intentando ocultar la revisión actual.",
        "revdelete-no-file": "El archivo especificado no existe.",
        "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-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": "<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",
+       "revdelete-success": "Se ha cambiado con éxito la visibilidad de las revisiones.",
+       "revdelete-failure": "No se ha podido cambiar la visibilidad de las revisiones:\n$1",
+       "logdelete-success": "Se ha cambiado con éxito la visibilidad de los eventos.",
+       "logdelete-failure": "No se pudo cambiar la visibilidad de los eventos:\n$1",
        "revdel-restore": "mostrar/ocultar",
        "pagehist": "Historial de la página",
        "deletedhist": "Historial borrado",
        "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",
+       "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios",
+       "right-changetags": "Agregar y quitar [[Special:Tags|etiquetas]] arbitrarias a revisiones individuales y entradas del registro",
        "newuserlogpage": "Registro de creación de usuarios",
        "newuserlogpagetext": "Este es un registro de creación de usuarios.",
        "rightslog": "Registro de permisos de usuario",
        "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",
+       "action-applychangetags": "aplicar etiquetas junto con los cambios",
+       "action-changetags": "agregar y quitar etiquetas arbitrarias a revisiones individuales y entradas del registro",
        "nchanges": "$1 {{PLURAL:$1|cambio|cambios}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde la última visita}}",
        "enhancedrc-history": "historial",
        "listfiles-delete": "borrar",
        "listfiles-summary": "Esta página especial muestra todos los archivos subidos.\nCuando el usuario la filtra, solo se muestran los archivos cargados por el usuario en su versión más reciente.",
        "listfiles_search_for": "Buscar por nombre de imagen:",
+       "listfiles-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
        "imgfile": "archivo",
        "listfiles": "Lista de archivos",
        "listfiles_thumb": "Miniatura",
        "logempty": "No hay elementos en el registro con esas condiciones.",
        "log-title-wildcard": "Buscar títulos que empiecen con este texto",
        "showhideselectedlogentries": "Mostrar u ocultar las entradas seleccionadas del registro",
+       "log-edit-tags": "Editar las etiquetas de las entradas del registro seleccionadas",
        "allpages": "Todas las páginas",
        "nextpage": "Siguiente página ($1)",
        "prevpage": "Página anterior ($1)",
        "allmessagesname": "Nombre",
        "allmessagesdefault": "Texto predeterminado",
        "allmessagescurrent": "Texto actual",
-       "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki.\nPor favor, visita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localización MediaWiki] y [//translatewiki.net translatewiki.net] si deseas contribuir a la localización genérica de MediaWiki.",
+       "allmessagestext": "Esta es una lista de mensajes del sistema disponibles en el espacio de nombres MediaWiki.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Localización MediaWiki] y [//translatewiki.net translatewiki.net] si deseas contribuir a la localización genérica de MediaWiki.",
        "allmessagesnotsupportedDB": "Esta página no está disponible porque '''$wgUseDatabaseMessages''' está deshabilitado.",
        "allmessages-filter-legend": "Filtro",
        "allmessages-filter": "Filtrar por estado de personalización:",
        "import-interwiki-history": "Copiar todas las versiones históricas para esta página",
        "import-interwiki-templates": "Incluir todas las plantillas",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Espacio de nombres de destino:",
-       "import-interwiki-rootpage": "Página raíz del destino (opcional):",
        "import-upload-filename": "Nombre de archivo:",
        "import-comment": "Comentario:",
        "importtext": "Por favor, exporta el archivo desde el wiki de origen usando la [[Special:Export|herramienta de exportación]], guárdalo en tu disco y súbelo aquí.",
        "pageinfo-protect-cascading-yes": "Sí",
        "pageinfo-protect-cascading-from": "Protecciones en serie activadas",
        "pageinfo-category-info": "Información de la categoría",
+       "pageinfo-category-total": "Número total de miembros",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de archivos",
        "patrol-log-page": "Registro de revisiones",
        "patrol-log-header": "Este es un registro de revisiones patrulladas.",
        "log-show-hide-patrol": "$1 registro de patrullaje",
+       "log-show-hide-tag": "$1 registro de etiquetas",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "filedeleteerror-long": "Se han producido errores mientras se borraba el archivo:\n\n$1",
        "fileduplicatesearch-noresults": "Ningún archivo con el nombre «$1» encontrado.",
        "specialpages": "Páginas especiales",
        "specialpages-note-top": "Leyenda",
-       "specialpages-note": "* Páginas especiales normales\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>\n* <span class=\"mw-specialpagecached\">Páginas especiales en caché (podrían ser obsoletas).</span>",
+       "specialpages-note": "* Páginas especiales normales.\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>",
        "specialpages-group-maintenance": "Informes de mantenimiento",
        "specialpages-group-other": "Otras páginas especiales",
        "specialpages-group-login": "Acceder/crear cuenta",
        "tags-deactivate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "No es posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
+       "tags-apply-no-permission": "No tienes permiso para aplicar etiquetas de cambios, junto con tus cambios.",
+       "tags-apply-not-allowed-one": "No se permite aplicar manualmente la etiqueta «$1».",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} aplicar manualmente: $1",
+       "tags-update-no-permission": "No tienes permiso para agregar o quitar etiquetas de cambio de las revisiones individuales o las entradas del registro.",
+       "tags-update-add-not-allowed-one": "No se permite la adición manual de la etiqueta «$1».",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} agregar manualmente: $1",
+       "tags-update-remove-not-allowed-one": "No se permite eliminar la etiqueta «$1».",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} eliminar manualmente: $1",
+       "tags-edit-title": "Editar etiquetas",
+       "tags-edit-manage-link": "Administrar etiquetas",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisión seleccionada|Revisiones seleccionadas}} de [[:$2]]:",
+       "tags-edit-revision-legend": "Agregar o quitar etiquetas de {{PLURAL:$1|esta revisión|todas las $1 revisiones}}",
+       "tags-edit-logentry-legend": "Agregar o quitar etiquetas de {{PLURAL:$1|esta entrada del registro|todas las $1 entradas del registro}}",
+       "tags-edit-existing-tags": "Etiquetas existentes:",
+       "tags-edit-existing-tags-none": "''Ninguna''",
+       "tags-edit-new-tags": "Etiquetas nuevas:",
+       "tags-edit-add": "Agregar estas etiquetas:",
+       "tags-edit-remove": "Eliminar estas etiquetas:",
+       "tags-edit-remove-all-tags": "(eliminar todas las etiquetas)",
+       "tags-edit-chosen-placeholder": "Selecciona algunas etiquetas",
+       "tags-edit-chosen-no-results": "No se encontraron etiquetas que coincidan con",
+       "tags-edit-reason": "Motivo:",
+       "tags-edit-revision-submit": "Aplicar los cambios a {{PLURAL:$1|esta revisión|$1 revisiones}}",
+       "tags-edit-logentry-submit": "Aplicar los cambios a {{PLURAL:$1|esta entrada del registro|$1 entradas del registro}}",
+       "tags-edit-success": "Los cambios se aplicaron con éxito.",
+       "tags-edit-failure": "No se pudieron aplicar los cambios:\n$1",
+       "tags-edit-none-selected": "Selecciona al menos una etiqueta que añadir o quitar.",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "compare-page2": "Página 2",
        "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",
+       "log-name-tag": "Registro de etiquetas",
+       "log-description-tag": "Esta página muestra cuando los usuarios han añadido o eliminado [[Special:Tags|etiquetas]] de revisiones individuales o entradas del registro. El registro no muestra las acciones de etiquetado cuando se producen como parte de una edición, eliminación o acciones similares.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|agregó}} {{PLURAL:$7|la etiqueta|las etiquetas}} $6 a la revisión $4 de la página $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|agregó}} {{PLURAL:$7|la etiqueta|las etiquetas}} $6 a la entrada del registro $5 de la página $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|eliminó}} {{PLURAL:$9|la etiqueta|las etiquetas}} $8 de la revisión $4 de la página $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|eliminó}} {{PLURAL:$9|la etiqueta|las etiquetas}} $8 de la entrada del registro $5 de la página $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|actualizó}} etiquetas de la revisión $4 de la página $3 ({{PLURAL:$7|agregó}} $6; {{PLURAL:$9|eliminó}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualizó}} etiquetas de la entrada del registro $5 de la página $3 ({{PLURAL:$7|agregó}} $6; {{PLURAL:$9|eliminó}} $8)",
        "rightsnone": "(ninguno)",
        "revdelete-summary": "resumen de edición",
        "feedback-adding": "Añadiendo comentarios a la página...",
        "feedback-error1": "Error: No se reconoce resultado de API",
        "feedback-error2": "Error: Falló la edición",
        "feedback-error3": "Error: No hay respuesta de la API",
+       "feedback-error4": "Error: no se pudo publicar con el argumento de título proporcionado",
        "feedback-message": "Mensaje:",
        "feedback-subject": "Asunto:",
        "feedback-submit": "Enviar",
        "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": "¡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": "¡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 {{PLURAL:$4|la siguiente apariencia|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 {{PLURAL:$4|activarla|activarlas y seleccionar la 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> de 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 {{PLURAL:$5|la siguiente línea|las siguientes líneas}} en <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|la apariencia instalada|todas las apariencias instaladas}} actualmente:\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''')",
index b0afd78..b82291e 100644 (file)
        "cantcreateaccounttitle": "Ei saa kontot luua",
        "cantcreateaccount-text": "[[User:$3|$3]] on blokeerinud konto loomise sellelt IP-aadressilt (<strong>$1</strong>).\n\n$3 märkis järgmise põhjuse: <em>$2</em>",
        "cantcreateaccount-range-text": "Kontode loomine IP-aadressidelt vahemikus '''$1''', millesse jääb sinu IP-aadress ('''$4'''), on blokeeritud. Blokeeris kasutaja [[User:$3|$3]].\n\n$3 tõi järgmise põhjuse: ''$2''",
-       "viewpagelogs": "Vaata selle lehe logisid",
+       "viewpagelogs": "Vaata selle lehekülje logisissekandeid",
        "nohistory": "Sellel leheküljel ei ole eelmisi redaktsioone.",
        "currentrev": "Viimane redaktsioon",
        "currentrev-asof": "Viimane redaktsioon: $1",
        "history-feed-description": "Selle lehekülje redigeerimiste ajalugu",
        "history-feed-item-nocomment": "$1 – $2",
        "history-feed-empty": "Soovitud lehekülge ei ole olemas.\nSee võib olla vikist kustutatud või ümber nimetatud.\nÜrita [[Special:Search|vikist otsida]] teemakohaseid lehekülgi.",
+       "history-edit-tags": "Muuda valitud redaktsioonide märgiseid",
        "rev-deleted-comment": "(muudatuse resümee eemaldatud)",
        "rev-deleted-user": "(kasutajanimi eemaldatud)",
        "rev-deleted-event": "(logi üksikasjad eemaldatud)",
        "rev-showdeleted": "näita",
        "revisiondelete": "Redaktsioonide kustutamine või taastamine",
        "revdelete-nooldid-title": "Sellist redaktsiooni pole.",
-       "revdelete-nooldid-text": "Sa pole valinud redaktsiooni, valitud redaktsioon puudub või sa püüad peita viimast redaktsiooni.",
+       "revdelete-nooldid-text": "Sa pole valinud selle toimingu jaoks ühtegi sihtredaktsiooni, valitud redaktsioon puudub või püüad peita viimast redaktsiooni.",
        "revdelete-no-file": "Faili ei ole.",
        "revdelete-show-file-confirm": "Kas oled kindel, et soovid häha faili \"<nowiki>$1</nowiki>\" kustutatud redaktsiooni, mis tehti $2 kell $3?",
        "revdelete-show-file-submit": "Jah",
        "logdelete-success": "'''Logi nähtavus edukalt muudetud.'''",
        "logdelete-failure": "'''Logi nähtavust ei saanud paika:'''\n$1",
        "revdel-restore": "muuda nähtavust",
-       "pagehist": "Lehekülje ajalugu",
-       "deletedhist": "Kustutatud ajalugu",
+       "pagehist": "lehekülje ajalugu",
+       "deletedhist": "kustutatud ajalugu",
        "revdelete-hide-current": "Tõrge üksuse kuupäevaga $2, kell $1 peitmisel: see on praegune redaktsioon.\nSeda ei saa peita.",
        "revdelete-show-no-access": "Tõrge ajatempliga $1 kell $2 üksuse näitamisel: selle on märge \"piiranguga\".\nSul ei ole sellele ligipääsu.",
        "revdelete-modify-no-access": "Tõrge üksuse kuupäeva $2, kell $1 muutmisel: see on märgitud kui \"piiranguga\".\nSul ei ole sellele ligipääsu.",
        "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",
+       "right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
+       "right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
        "newuserlogpage": "Konto loomise logi",
        "newuserlogpagetext": "Siin on logitud kasutajate registreerimine.",
        "rightslog": "Kasutajaõiguste logi",
        "action-editmyprivateinfo": "oma eraandmeid redigeerida",
        "action-editcontentmodel": "lehekülje sisumudelit muuta",
        "action-managechangetags": "märgiseid koostada ege neid andmebaasist kustutada",
+       "action-applychangetags": "rakendada märgiseid oma muudatuste suhtes",
+       "action-changetags": "käsitsi rakendatavaid märgiseid üksikute redaktsioonide ega logisissekannete juures lisada ega eemaldada",
        "nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimase vaatamise järel}}",
        "enhancedrc-history": "ajalugu",
        "listfiles-delete": "kustuta",
        "listfiles-summary": "Sellel erileheküljel näidatakse kõiki üles laaditud faile.",
        "listfiles_search_for": "Nimeotsing:",
+       "listfiles-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "imgfile": "fail",
        "listfiles": "Piltide loend",
        "listfiles_thumb": "Pisipilt",
        "logempty": "Logis puuduvad vastavad kirjed.",
        "log-title-wildcard": "Selle tekstiga algavad pealkirjad",
        "showhideselectedlogentries": "Muuda valitud logisissekannete nähtavust",
+       "log-edit-tags": "Muuda valitud logisissekannete märgiseid",
        "allpages": "Kõik leheküljed",
        "nextpage": "Järgmine lehekülg ($1)",
        "prevpage": "Eelmine lehekülg ($1)",
        "emailccsubject": "Koopia sinu sõnumist kasutajale $1: $2",
        "emailsent": "E-kiri saadetud",
        "emailsenttext": "Sinu teade on e-kirjaga saadetud.",
-       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"Saada sellele kasutajale e-kiri\" abil.",
+       "emailuserfooter": "Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu \"{{int:emailpage}}\" abil.",
        "usermessage-summary": "Jätan süsteemiteate.",
        "usermessage-editor": "Süsteemiteadete edastaja",
        "watchlist": "Jälgimisloend",
        "protect-locked-dblock": "Kaitstuse taset ei saa muuta, sest andmebaas on lukustatud.\nAllpool on toodud lehekülje '''$1''' hetkel kehtivad seaded:",
        "protect-locked-access": "Sinu kontol pole õigust muuta lehekülje kaitsetaset.\nAllpool on toodud lehekülje '''$1''' hetkel kehtivad seaded:",
        "protect-cascadeon": "See lehekülg on kaitstud, kuna ta on kasutusel {{PLURAL:$1|järgmisel leheküljel|järgmistel lehekülgedel}}, mis on omakorda kaskaadkaitse all.\nSelle lehekülje kaitsetaseme muutmine ei mõjuta kaskaadkaitset.",
-       "protect-default": "Luba kõigile kasutajatele",
+       "protect-default": "Lubatud kõigile kasutajatele",
        "protect-fallback": "Lubatud vaid kasutajatele õigusega \"$1\"",
        "protect-level-autoconfirmed": "Lubatud vaid automaatselt kinnitatud kasutajatele",
        "protect-level-sysop": "Lubatud vaid administraatoritele",
        "import-interwiki-history": "Kopeeri selle lehekülje kogu ajalugu",
        "import-interwiki-templates": "Liida kõik mallid",
        "import-interwiki-submit": "Impordi",
-       "import-interwiki-namespace": "Sihtkoha nimeruum:",
-       "import-interwiki-rootpage": "Sihtkoha juurlehekülg (valikuline):",
        "import-upload-filename": "Failinimi:",
        "import-comment": "Kommentaar:",
        "importtext": "Palun kasuta faili allikvikist eksportimiseks [[Special:Export|ekspordivahendit]].\nSalvesta see oma arvutisse ja laadi siia üles.",
        "pageinfo-robot-noindex": "Keelatud",
        "pageinfo-watchers": "Lehekülje jälgijate arv",
        "pageinfo-few-watchers": "Alla {{PLURAL:$1|ühe jälgija|$1 jälgija}}",
-       "pageinfo-redirects-name": "Sellele leheküljele suunavate lehekülgede arv",
+       "pageinfo-redirects-name": "Sellele leheküljele suunatud lehekülgi",
        "pageinfo-subpages-name": "Selle lehekülje alamlehekülgi",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})",
        "pageinfo-firstuser": "Lehekülje alustaja",
        "pageinfo-firsttime": "Lehekülje alustusaeg",
        "pageinfo-lastuser": "Viimane toimetaja",
        "pageinfo-lasttime": "Viimase redigeerimise aeg",
-       "pageinfo-edits": "Redaktsioonide koguarv",
-       "pageinfo-authors": "Erinevate autorite koguarv",
+       "pageinfo-edits": "Redaktsioone kokku",
+       "pageinfo-authors": "Erinevaid autoreid kokku",
        "pageinfo-recent-edits": "Viimaste redigeerimiste arv (viimase $1 jooksul)",
-       "pageinfo-recent-authors": "Erinevate viimaste toimetajate arv",
+       "pageinfo-recent-authors": "Erinevaid viimaseid toimetajaid",
        "pageinfo-magic-words": "{{PLURAL:$1|Võlusõna|Võlusõnad}} ($1)",
        "pageinfo-hidden-categories": "Peidetud {{PLURAL:$1|kategooria|kategooriad}} ($1)",
        "pageinfo-templates": "Kasutatud {{PLURAL:$1|mall|mallid}} ($1)",
        "pageinfo-protect-cascading-yes": "Jah",
        "pageinfo-protect-cascading-from": "Kaskaadkaitse lähtub lehekülgedelt",
        "pageinfo-category-info": "Kategooria teave",
-       "pageinfo-category-pages": "Lehekülgede arv",
-       "pageinfo-category-subcats": "Alamkategooriate arv",
-       "pageinfo-category-files": "Failide arv",
+       "pageinfo-category-total": "Liikmeid kokku",
+       "pageinfo-category-pages": "Lehekülgi",
+       "pageinfo-category-subcats": "Alamkategooriaid",
+       "pageinfo-category-files": "Faile",
        "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markedaspatrolled": "Kontrollituks märgitud",
        "patrol-log-page": "Kontrollimislogi",
        "patrol-log-header": "See on kontrollitud redaktsioonide logi.",
        "log-show-hide-patrol": "$1 kontrollimislogi",
+       "log-show-hide-tag": "$1 märgiste logi",
        "deletedrevision": "Kustutatud vanem versioon $1",
        "filedeleteerror-short": "Tõrge faili kustutamisel: $1",
        "filedeleteerror-long": "Faili kustutamisel esines tõrkeid:\n\n$1",
        "tags-deactivate-reason": "Põhjus:",
        "tags-deactivate-not-allowed": "Märgist \"$1\" pole võimalik keelata.",
        "tags-deactivate-submit": "Keela",
+       "tags-apply-no-permission": "Sul pole lubatud rakendada muudatusmärgiseid enda muudatuste suhtes.",
+       "tags-apply-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi rakendada.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi rakendada: $1",
+       "tags-update-no-permission": "Sul pole lubatud üksikute redaktsioonide ega logisissekannete juures muudatusmärgiseid lisada ega eemaldada.",
+       "tags-update-add-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi lisada.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi lisada: $1",
+       "tags-update-remove-not-allowed-one": "Märgist \"$1\" pole lubatud eemaldada.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi eemaldada: $1",
+       "tags-edit-title": "Märgiste muutmine",
+       "tags-edit-manage-link": "halda märgiseid",
+       "tags-edit-revision-selected": "Lehekülje \"[[:$2]]\" valitud {{PLURAL:$1|redaktsioon|redaktsioonid}}:",
+       "tags-edit-logentry-selected": "Valitud {{PLURAL:$1|logisündmus|logisündmused}}:",
+       "tags-edit-revision-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} redaktsiooni juures",
+       "tags-edit-logentry-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} logisissekande juures",
+       "tags-edit-existing-tags": "Senised märgised:",
+       "tags-edit-existing-tags-none": "''puuduvad''",
+       "tags-edit-new-tags": "Uued märgised:",
+       "tags-edit-add": "Lisa need märgised:",
+       "tags-edit-remove": "Eemalda need märgised:",
+       "tags-edit-remove-all-tags": "(kõik märgised)",
+       "tags-edit-chosen-placeholder": "Vali mõni märgis",
+       "tags-edit-chosen-no-results": "Vastavaid märgiseid ei leidu",
+       "tags-edit-reason": "Põhjus:",
+       "tags-edit-revision-submit": "Rakenda {{PLURAL:$1|selle|$1}} redaktsiooni suhtes",
+       "tags-edit-logentry-submit": "Rakenda {{PLURAL:$1|selle|$1}} logisissekande suhtes",
+       "tags-edit-success": "Muudatused on edukalt rakendatud.",
+       "tags-edit-failure": "Muudatusi ei õnnestunud rakendada:\n$1",
+       "tags-edit-nooldid-title": "Vigane sihtredaktsioon",
+       "tags-edit-nooldid-text": "Selle toimingu jaoks pole määratud ühtegi sihtredaktsiooni või määratud redaktsiooni pole olemas.",
+       "tags-edit-none-selected": "Palun vali vähemalt üks märgis, mida lisada või eemaldada.",
        "comparepages": "Lehekülgede kõrvutamine",
        "compare-page1": "Lehekülg 1",
        "compare-page2": "Lehekülg 2",
        "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",
+       "log-name-tag": "Märgiste logi",
+       "log-description-tag": "Sellel leheküljel on toodud [[Special:Tags|märgiste]] lisamine ja nende eemaldamine üksikute redaktsioonide ja logisissekannete juurest. Logis ei kajastu redigeerimise, kustutamise või sarnase toiminguga kaasnenud märgistused.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|lisas}} leheküljel \"$3\" redaktsioonile $4 {{PLURAL:$7|märgise|märgised}} $6",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|lisas}} leheküljel \"$3\" logisissekandele $5 {{PLURAL:$7|märgise|märgised}} $6",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|eemaldas}} leheküljel \"$3\" redaktsioonilt $4 {{PLURAL:$9|märgise|märgised}} $8",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|eemaldas}} leheküljel \"$3\" logisissekandelt $5 {{PLURAL:$9|märgise|märgised}} $8",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" redaktsiooni $4 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|uuendas}} leheküljel \"$3\" logisissekande $5 märgiseid ({{PLURAL:$7|lisatud}} $6; {{PLURAL:$9|eemaldatud}} $8)",
        "rightsnone": "(puudub)",
        "revdelete-summary": "resümee",
        "feedback-adding": "Tagasiside lisamine leheküljele...",
        "feedback-error1": "Tõrge: Tundmatu API tulemus",
        "feedback-error2": "Tõrge: Redigeerimine ebaõnnestus",
        "feedback-error3": "Tõrge: API ei vasta",
+       "feedback-error4": "Tõrge: Antud pealkirja alla ei õnnestunud tagasisidet postitada.",
        "feedback-message": "Sõnum:",
        "feedback-subject": "Teema:",
        "feedback-submit": "Saada",
        "log-name-pagelang": "Keele muutmise logi",
        "log-description-pagelang": "Siia on logitud lehekülgede keele muutmised.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutis}} lehekülje \"$3\" keelt: $4 → $5.",
-       "default-skin-not-found": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nPaistab, et sinu install sisaldab järgmisi kujundusi. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas neid lubada ja kuidas valida vaikekujundus.\n\n$2\n\n; Kui oled MediaWiki just paigaldanud:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org-ist] kindla kujunduse lintarhiivi alla laadida;\n:* kopeerida Giti kaudu ühe hoidla (<code>mediawiki/skins/*</code>) oma MediaWiki installi kausta <code>skins/</code>.\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja.\n\n; Kui oled MediaWikit just täiendanud:\n: MediaWiki 1.24-s ja uuemates versioonides pole paigaldatud kujundused enam automaatselt lubatud (vaata juhendist [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery kujunduste automaatse leidmise] kohta). Saad kleepida järgmised read leheküljele <code>LocalSettings.php</code>, et lubada kõik praegu paigaldatud kujundused:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Kui oled lehekülge <code>LocalSettings.php</code> just muutnud:\n: Kontrolli üle, ega kujunduste nimedes pole trükivigu.",
+       "default-skin-not-found": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nPaistab, et sinu install sisaldab {{PLURAL:$4|järgmist kujundust|järgmisi kujundusi}}. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas {{PLURAL:$4|seda|neid}} lubada ja kuidas valida vaikekujundus.\n\n$2\n\n; Kui oled MediaWiki just paigaldanud:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org-ist] kindla kujunduse lintarhiivi alla laadida;\n:* kopeerida Giti kaudu ühe hoidla (<code>mediawiki/skins/*</code>) oma MediaWiki installi kausta <code>skins/</code>.\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja.\n\n; Kui oled MediaWikit just täiendanud:\n: MediaWiki 1.24-s ja uuemates versioonides pole paigaldatud kujundused enam automaatselt lubatud (vaata juhendist [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery kujunduste automaatse leidmise] kohta). Saad kleepida {{PLURAL:$5|järgmise rea|järgmised read}} leheküljele <code>LocalSettings.php</code>, et lubada {{PLURAL:$5|ainus praegu paigaldatud kujundus|kõik praegu paigaldatud kujundused}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Kui oled lehekülge <code>LocalSettings.php</code> just muutnud:\n: Kontrolli üle, ega kujunduste nimedes pole trükivigu.",
        "default-skin-not-found-no-skins": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nÜhtegi kujundust pole paigaldatud.\n\n; Kui oled MediaWiki just paigaldanud või täiendasid seda:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. MediaWiki 1.24 ja uuemad versioonid ei sisalda peahoidlas ühtegi kujundust. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org-ist] kindla kujunduse lintarhiivi alla laadida;\n:* kopeerida Giti kaudu ühe hoidla (<code>mediawiki/skins/*</code>) oma MediaWiki installi kausta <code>skins/</code>.\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas kujundusi lubada ja kuidas valida vaikekujundus.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (lubatud)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''keelatud''')",
index 3bd4085..f00525b 100644 (file)
        "blocklogpage": "Blokeo erregistroa",
        "blocklog-showlog": "Lankide hau blokeatua izan da lehenago ere.\nHona hemen blokeoen erregistroa, erreferentzia gisa:",
        "blocklog-showsuppresslog": "Lankide hau blokeatua eta ezkutatua izan da lehenago ere. Hona hemen erregistroa, erreferentzia gisa:",
-       "blocklogentry": "wikilariak [[$1]] erabiltzailea blokeatu du. Blokeoaldia: $2 $3",
+       "blocklogentry": "administratzaileak [[$1]] blokeatu du. Iraupena: $2 $3",
        "reblock-logentry": "[[$1]] wikilariari blokeoaldia aldatu diogu. Blokeoaldi berria: $2 $3",
        "blocklogtext": "Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau. \nAutomatikoki blokeatutako IP helbideak ez dira zerrendatzen. \nIkus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak aztertzeko.",
        "unblocklogentry": "$1 desblokeatu da",
        "import-interwiki-history": "Orrialde honen historiako bertsio guztiak kopiatu",
        "import-interwiki-templates": "Txantiloi guztiak sartu",
        "import-interwiki-submit": "Inportatu",
-       "import-interwiki-namespace": "Helburuko izen-tartea:",
-       "import-interwiki-rootpage": "Helburuko oinarri orrialdea (aukerazkoa):",
        "import-upload-filename": "Fitxategiaren izena:",
        "import-comment": "Iruzkina:",
        "importtext": "Mesedez, jatorrizko wikitik orrialdea esportatzeko [[Special:Export|esportazio tresna]] erabil ezazu, zure diskoan gorde eta jarraian hona igo.",
        "revdelete-uname-unhid": "lankide ezkutua erakutsi",
        "revdelete-restricted": "administratzaileentzako mugak ezarri dira",
        "revdelete-unrestricted": "administratzaileentzako mugak kendu dira",
+       "logentry-block-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6",
+       "logentry-block-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|administratzaileak}} {{GENDER:$4|$3}} blokeatu du. Iraupena: $5 $6",
+       "logentry-suppress-reblock": "$1 administratzaileak {{GENDER:$4|$3}} wikilariaren blokeoa {{GENDER:$2|aldatu du}}. Blokeoaldia: $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe",
        "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
index 16ecd3e..a98af47 100644 (file)
@@ -89,7 +89,7 @@
        "underline-always": "Aina",
        "underline-never": "Ei koskaan",
        "underline-default": "Ulkoasun tai selaimen oletustapa",
-       "editfont-style": "Muokkauskentän kirjasintyyppi",
+       "editfont-style": "Muokkauskentän kirjasintyyppi:",
        "editfont-default": "Selaimen vakioasetus",
        "editfont-monospace": "Tasalevyinen kirjasin",
        "editfont-sansserif": "Sans-serif-kirjasin",
        "categorypage": "Näytä luokkasivu",
        "viewtalkpage": "Näytä keskustelusivu",
        "otherlanguages": "Muilla kielillä",
-       "redirectedfrom": "Ohjattu sivulta $1",
+       "redirectedfrom": "(Ohjattu sivulta $1)",
        "redirectpagesub": "Ohjaussivu",
        "redirectto": "Ohjaus sivulle:",
        "lastmodifiedat": "Sivua on viimeksi muutettu $1 kello $2.",
        "sort-ascending": "Lajittele nousevassa järjestyksessä",
        "nstab-main": "Sivu",
        "nstab-user": "Käyttäjäsivu",
-       "nstab-media": "Media",
+       "nstab-media": "Mediasivu",
        "nstab-special": "Toimintosivu",
        "nstab-project": "Projektisivu",
        "nstab-image": "Tiedosto",
        "nstab-mediawiki": "Järjestelmäviesti",
        "nstab-template": "Malline",
-       "nstab-help": "Ohje",
+       "nstab-help": "Ohjesivu",
        "nstab-category": "Luokka",
-       "nosuchaction": "Määrittelemätön pyyntö",
-       "nosuchactiontext": "Ohjelmisto ei tunnista URL:ssä määriteltyä pyyntöä.\nOlet saattanut kirjoittaa väärin, tai seurannut virheellistä linkkiä.\nTämä voi myös mahdollisesti olla ohjelmistovirhe.",
+       "nosuchaction": "Toimintoa ei ole olemassa",
+       "nosuchactiontext": "URL:ssä määritelty toiminto ei ole kelvollinen.\nOlet saattanut kirjoittaa URL:in väärin tai olet seurannut virheellistä linkkiä.\nKyseessä voi myös mahdollisesti olla virhe sivuston {{SITENAME}} käyttämässä ohjelmistossa.",
        "nosuchspecialpage": "Kyseistä toimintosivua ei ole",
        "nospecialpagetext": "<strong>Ohjelmisto ei tunnista pyytämääsi toimintosivua.</strong>\n\nLuettelo toimintosivuista löytyy sivulta [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Virhe",
        "enterlockreason": "Anna lukituksen syy sekä sen arvioitu poistamisaika",
        "readonlytext": "Tietokanta on tällä hetkellä lukittu. Uusia sivuja ei voi luoda eikä muitakaan muutoksia tehdä. Syynä ovat todennäköisimmin rutiininomaiset tietokannan ylläpitotoimet.\n\nTietokannan lukinneen ylläpitäjän selitys: $1",
        "missing-article": "Sivun sisältöä ei löytynyt tietokannasta nimellä \"$1\" $2.\n\nYleensä tämä johtuu vanhentuneesta vertailu- tai historialinkistä sivulle, joka on poistettu.\n\nJos kyseessä ei ole poistettu sivu, olet ehkä löytänyt virheen ohjelmistossa.\nIlmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissäsi sivun URL.",
-       "missingarticle-rev": "(versio: $1)",
+       "missingarticle-rev": "(versio nro: $1)",
        "missingarticle-diff": "(vertailu: $1, $2)",
        "readonly_lag": "Tietokanta on automaattisesti lukittu, jotta kaikki tietokantapalvelimet saisivat kaikki tuoreet muutokset",
        "internalerror": "Sisäinen virhe",
        "querypage-no-updates": "Tämän sivun tietoja ei toistaiseksi päivitetä.",
        "viewsource": "Näytä wikiteksti",
        "viewsource-title": "Lähdekoodi sivulle $1",
-       "actionthrottled": "Toiminto nopeusrajoitettu",
-       "actionthrottledtext": "Ylläpitosyistä tämän toiminnon suorittamista on rajoitettu. Olet suorittanut tämän toiminnon liian monta kertaa lyhyen ajan sisällä. Yritä myöhemmin uudelleen.",
-       "protectedpagetext": "Tämä sivu on suojattu muutoksilta.",
+       "actionthrottled": "Toiminnon useaa suorittamista on rajoitettu",
+       "actionthrottledtext": "Häiriköinnin estämiseksi tämän toiminnon suorittamista on rajoitettu niin, että sitä ei voi tehdä useita kertoja lyhyen ajan sisällä. Olet suorittanut toiminnon nyt liian monta kertaa. \nYritä uudelleen muutaman minuutin kuluttua.",
+       "protectedpagetext": "Tämä sivu on suojattu muutoksilta ja muilta toiminnoilta.",
        "viewsourcetext": "Voit katsoa ja kopioida tämän sivun lähdetekstiä:",
-       "viewyourtext": "Voit tarkastella ja kopioida lähdekoodin '''tekemistäsi muutoksista''' tähän sivuun:",
+       "viewyourtext": "Voit nähdä ja kopioida tähän sivuun <strong>tekemistäsi muutoksista</strong> syntyneen lähdekoodin:",
        "protectedinterface": "Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.\nViestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
        "editinginterface": "<strong>Varoitus:</strong> Olet muokkaamassa sivua, joka sisältää ohjelmiston käyttöliittymän tekstiä.\nMuutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymään tässä wikissä.",
        "translateinterface": "Jos haluat lisätä tai muuttaa käännöksiä kaikissa wikeissä, käytä siihen MediaWikin kääntämistä varten rakennettua sivustoa [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:\n$2",
-       "namespaceprotected": "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
+       "namespaceprotected": "Sinulla ei ole oikeutta muokata sivuja, jotka ovat nimiavaruudessa <strong>$1</strong>.",
        "customcssprotected": "Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "customjsprotected": "Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.",
        "mycustomcssprotected": "Sinulla ei ole oikeutta muokata tätä CSS-sivua.",
        "mycustomjsprotected": "Sinulla ei ole oikeutta muokata tätä JavaScript-sivua.",
-       "myprivateinfoprotected": "Sinulla ei ole oikeutta muokata omia tietojasi.",
-       "mypreferencesprotected": "Sinulla ei ole oikeutta muokata omia asetuksiasi.",
+       "myprivateinfoprotected": "Sinulla ei ole oikeutta muuttaa omia yksityisiä tietojasi.",
+       "mypreferencesprotected": "Sinulla ei ole oikeutta muuttaa omia asetuksiasi.",
        "ns-specialprotected": "Toimintosivuja ei voi muokata.",
-       "titleprotected": "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.\nSyynä on: ''$2''.",
-       "filereadonlyerror": "Tiedostoa $1 ei voi muuttaa, koska jaettu mediavarasto $2 on vain luku -tilassa.\n\nLukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: $3.",
+       "titleprotected": "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.\nSuojauksen syy on: ''$2''.",
+       "filereadonlyerror": "Tiedostoa \"$1\" ei voida muuttaa, koska jaettu mediavarasto \"$2\" on asetettu tilaan ''vain lukeminen sallittu''.\n\nLukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: $3.",
        "invalidtitle-knownnamespace": "Virheellinen sivunimi, nimiavaruus \"$2\" ja teksti \"$3\"",
        "invalidtitle-unknownnamespace": "Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti \"$2\"",
        "exception-nologin": "Et ole kirjautunut sisään",
        "exception-nologin-text": "Ole hyvä ja kirjaudu sisään, niin pääset tälle sivulle tai tähän toimintoon.",
-       "exception-nologin-text-manual": "Sinun pitää $1 jotta pääset tälle sivulle tai toimintoon.",
-       "virus-badscanner": "Virheellinen asetus: Tuntematon virustutka: ''$1''",
-       "virus-scanfailed": "virustarkistus epäonnistui virhekoodilla $1",
+       "exception-nologin-text-manual": "Sinun pitää $1, jotta pääset tälle sivulle tai toimintoon.",
+       "virus-badscanner": "Virheellinen asetus: Tuntematon virustorjuntaohjelma: ''$1''",
+       "virus-scanfailed": "virustarkistus epäonnistui (virhekoodi $1)",
        "virus-unknownscanner": "tuntematon virustutka:",
-       "logouttext": "'''Olet nyt kirjautunut ulos.'''\n\nHuomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut sisään, kunnes tyhjennät selaimen välimuistin.",
+       "logouttext": "<strong>Olet nyt kirjautunut ulos.</strong>\n\nOta huomioon, että jotkut sivut saattavat näkyä edelleen ikään kuin olisit vielä kirjautuneena sisään siihen saakka kunnes tyhjennät selaimesi välimuistin.",
        "welcomeuser": "Tervetuloa $1!",
-       "welcomecreation-msg": "Käyttäjätunnuksesi on luotu.\nÄlä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].",
-       "yourname": "Käyttäjätunnus:",
-       "userlogin-yourname": "Käyttäjätunnus",
+       "welcomecreation-msg": "Käyttäjätunnuksesi on luotu.\nVoit nyt muuttaa {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksia]] itsellesi.",
+       "yourname": "Käyttäjänimi:",
+       "userlogin-yourname": "Käyttäjänimi",
        "userlogin-yourname-ph": "Kirjoita käyttäjätunnus",
        "createacct-another-username-ph": "Lisää käyttäjätunnus",
        "yourpassword": "Salasana:",
        "yourpasswordagain": "Salasana uudelleen:",
        "createacct-yourpasswordagain": "Vahvista salasana",
        "createacct-yourpasswordagain-ph": "Kirjoita salasana uudelleen",
-       "remembermypassword": "Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})",
+       "remembermypassword": "Muista kirjautumiseni tässä selaimessa (enintään $1 {{PLURAL:$1|päivä|päivää}})",
        "userlogin-remembermypassword": "Pidä minut kirjautuneena",
        "userlogin-signwithsecure": "Käytä salattua yhteyttä",
        "yourdomainname": "Verkkonimi:",
        "createacct-email-ph": "Anna sähköpostiosoitteesi",
        "createacct-another-email-ph": "Lisää sähköpostiosoite",
        "createaccountmail": "Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen",
-       "createacct-realname": "Oikea nimi (vapaaehtoinen)",
+       "createacct-realname": "Oikea nimi (vapaaehtoinen tieto)",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
        "createacct-benefit-body1": "{{PLURAL:$1|muokkaus|muokkausta}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sivu|sivua}}",
        "createacct-benefit-body3": "{{PLURAL:$1|viimeikainen muokkaaja|viimeaikaista muokkaajaa}}",
-       "badretype": "Syöttämäsi salasanat ovat erilaiset.",
+       "badretype": "Syöttämäsi salasanat ovat keskenään erilaiset.",
        "userexists": "Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.",
        "loginerror": "Sisäänkirjautumisvirhe",
        "createacct-error": "Virhe tunnuksen luomisessa",
        "history-feed-description": "Tämän sivun muutoshistoria",
        "history-feed-item-nocomment": "$1 ($2)",
        "history-feed-empty": "Pyydettyä sivua ei ole olemassa.\nSe on saatettu poistaa wikistä tai nimetä uudelleen.\nKokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.",
+       "history-edit-tags": "Muokkaa valittujen sivuversioiden merkkauksia",
        "rev-deleted-comment": "(muokkausyhteenveto poistettu)",
        "rev-deleted-user": "(käyttäjänimi poistettu)",
        "rev-deleted-event": "(lokitiedot poistettu)",
        "rev-showdeleted": "näytä",
        "revisiondelete": "Poista tai palauta versioita",
        "revdelete-nooldid-title": "Ei kohdeversiota",
-       "revdelete-nooldid-text": "Et ole valinnut kohdeversiota tai -versioita.",
+       "revdelete-nooldid-text": "Et ole määrittänyt sitä kohdeversiota, johon tämä toimenpide kohdistuu, tai määrättyä versiota ei ole olemassa, tai olet parhaillaan yrittämässä piilottaa sivun viimeisintä versiota.",
        "revdelete-no-file": "Määritettyä tiedostoa ei ole olemassa.",
        "revdelete-show-file-confirm": "Haluatko varmasti nähdä poistetun version tiedostosta <nowiki>$1</nowiki>, joka on tallennettu $2 kello $3?",
        "revdelete-show-file-submit": "Kyllä",
        "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",
+       "right-applychangetags": "Asettaa [[Special:Tags|merkkauksia]] omien muutosten yhteyteen",
+       "right-changetags": "Lisätä ja poistaa satunnaisia [[Special:Tags|merkkauksia]] yksittäisissä sivuversioissa tai lokimerkinnöissä",
        "newuserlogpage": "Uudet käyttäjät",
        "newuserlogpagetext": "Tämä on loki luoduista käyttäjätunnuksista.",
        "rightslog": "Käyttöoikeusloki",
        "action-editmyprivateinfo": "muokata omia yksityisiä tietojasi",
        "action-editcontentmodel": "muokata sivun sisältömallia",
        "action-managechangetags": "luoda ja poistaa merkkauksia tietokannasta",
+       "action-applychangetags": "käyttää merkkauksia muutostesi yhteydessä",
+       "action-changetags": "lisätä ja poistaa satunnaisia merkkauksia yksittäisissä sivuversioissa ja lokimerkinnöissä",
        "nchanges": "$1 {{PLURAL:$1|muutos|muutosta}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}",
        "enhancedrc-history": "historia",
        "listfiles-delete": "poista",
        "listfiles-summary": "Tämä toimintosivu näyttää kaikki tallennetut tiedostot.",
        "listfiles_search_for": "Etsi tiedoston nimellä:",
+       "listfiles-userdoesnotexist": "Käyttäntunnusta \"$1\" ei ole rekisteröity.",
        "imgfile": "tiedosto",
        "listfiles": "Tiedostoluettelo",
        "listfiles_thumb": "Pienoiskuva",
        "logempty": "Ei tapahtumia lokissa.",
        "log-title-wildcard": "Haun kohteet alkavat tällä tekstillä",
        "showhideselectedlogentries": "Muuta valittujen lokitapahtumien näkyvyyttä",
+       "log-edit-tags": "Muuta merkkauksia valituissa lokimerkinnöissä",
        "allpages": "Kaikki sivut",
        "nextpage": "Seuraava sivu ($1)",
        "prevpage": "Edellinen sivu ($1)",
        "emailccsubject": "Kopio lähettämästäsi viestistä osoitteeseen $1: $2",
        "emailsent": "Sähköposti lähetetty",
        "emailsenttext": "Sähköpostiviestisi on lähetetty.",
-       "emailuserfooter": "Tämän sähköpostin lähetti $1 käyttäjälle $2 käyttämällä ”Lähetä sähköpostia” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
+       "emailuserfooter": "Tämän sähköpostin lähetti $1 vastaanottajalle $2 käyttämällä ”{{int:emailpage}}” -toimintoa {{GRAMMAR:inessive|{{SITENAME}}}}.",
        "usermessage-summary": "Jätetään järjestelmäviesti.",
        "usermessage-editor": "Järjestelmäviestittäjä",
        "watchlist": "Tarkkailulista",
        "import-interwiki-history": "Kopioi sivun koko historia ja kaikki versiot",
        "import-interwiki-templates": "Ota mukaan kaikki mallineet",
        "import-interwiki-submit": "Tuo",
-       "import-interwiki-namespace": "Kohdenimiavaruus:",
-       "import-interwiki-rootpage": "Kohteessa oleva perussivu (valinnainen):",
        "import-upload-filename": "Tiedostonimi:",
        "import-comment": "Kommentti:",
        "importtext": "Vie sivuja lähdewikistä käyttäen [[Special:Export|vientityökalua]].\nTallenna tiedot koneellesi ja tuo ne tällä sivulla.",
        "pageinfo-protect-cascading-yes": "Kyllä",
        "pageinfo-protect-cascading-from": "Tarttuva suojaus tulee sivulta",
        "pageinfo-category-info": "Luokkatiedot",
+       "pageinfo-category-total": "Jäsenten kokonaismäärä",
        "pageinfo-category-pages": "Sivujen määrä",
        "pageinfo-category-subcats": "Alaluokkien määrä",
        "pageinfo-category-files": "Tiedostojen määrä",
        "patrol-log-page": "Muutostentarkastusloki",
        "patrol-log-header": "Tämä on loki tarkastetuista muutoksista.",
        "log-show-hide-patrol": "$1 muutostentarkastusloki",
+       "log-show-hide-tag": "$1 merkkausten loki",
        "deletedrevision": "Poistettiin vanha versio $1",
        "filedeleteerror-short": "Tiedoston $1 poistaminen epäonnistui",
        "filedeleteerror-long": "Tiedoston poistaminen epäonnistui:\n\n$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ä",
+       "tags-apply-no-permission": "Sinulla ei ole oikeutta käyttää merkkauksia muutostesi yhteydessä.",
+       "tags-apply-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
+       "tags-apply-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
+       "tags-update-no-permission": "Sinulla ei ole oikeutta lisätä tai poistaa merkkauksia yksittäisissä sivuversioissa tai lokimerkinnöissä.",
+       "tags-update-add-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
+       "tags-update-add-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
+       "tags-update-remove-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua poistaa.",
+       "tags-update-remove-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua poistaa käsin: $1",
+       "tags-edit-title": "Muokkaa merkkauksia",
+       "tags-edit-manage-link": "Hallinnoi merkkauksia",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Valittu versio|Valitut versiot}} kohteesta [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Valittu lokitapahtuma|Valitut lokitapahtumat}}:",
+       "tags-edit-revision-legend": "Lisää tai poista merkkauksia {{PLURAL:$1|tässä versiossa|kaikissa $1 versiossa}}",
+       "tags-edit-logentry-legend": "Lisää tai poista merkkauksia {{PLURAL:$1|tässä lokimerkinnässä|kaikissa $1 lokimerkinnässä}}",
+       "tags-edit-existing-tags": "Tämänhetkiset merkkaukset:",
+       "tags-edit-existing-tags-none": "''Ei mitään''",
+       "tags-edit-new-tags": "Uudet merkkaukset:",
+       "tags-edit-add": "Lisää nämä merkkaukset:",
+       "tags-edit-remove": "Poista nämä merkkaukset:",
+       "tags-edit-remove-all-tags": "(poista kaikki merkkaukset)",
+       "tags-edit-chosen-placeholder": "Valitse joitakin merkkauksia",
+       "tags-edit-chosen-no-results": "Ei löytynyt vastaavia merkkauksia",
+       "tags-edit-reason": "Syy:",
+       "tags-edit-revision-submit": "Lähetä tekemäsi muutokset {{PLURAL:$1|tähän versioon|$1 versioon}}",
+       "tags-edit-logentry-submit": "Lähetä muutoksesi {{PLURAL:$1|tähän lokimerkintään|$1 lokimerkintään}}",
+       "tags-edit-success": "Muutokset on onnistuneesti toteutettu.",
+       "tags-edit-failure": "Muutoksia ei voitu toteuttaa: $1",
+       "tags-edit-nooldid-title": "Kohdeversio ei ole kelvollinen",
+       "tags-edit-nooldid-text": "Et ole joko määrittänyt sitä kohdeversiota, johon tämä toimenpide kohdistuu, tai sitten määrättyä versiota ei ole olemassa.",
+       "tags-edit-none-selected": "Valitse ainakin yksi merkkaus, jonka lisäät tai poistat.",
        "comparepages": "Vertaile sivuja",
        "compare-page1": "Sivu 1",
        "compare-page2": "Sivu 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|tuhosi}} merkkauksen \"$4\" (poistettu $5 {{PLURAL:$5|sivuversiosta 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",
+       "log-name-tag": "Merkkausten loki",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|lisäsi}} {{PLURAL:$7|merkkauksen|merkkaukset}} $6 kohdeversioon $4 sivulla $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|lisäsi}} {{PLURAL:$7|merkkauksen|merkkaukset}} $6 lokimerkintään $5 sivulla $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|poisti}} {{PLURAL:$9|merkkauksen|merkkaukset}} $8 kohdeversiosta $4 sivulla $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|poisti}} {{PLURAL:$9|merkkauksen|merkkaukset}} $8 lokimerkinnästä $5 sivulla $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|päivitti}} merkkauksia kohdeversiossa $4 sivulla $3 ({{PLURAL:$7|lisätty}} $6; {{PLURAL:$9|poistettu}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|päivitti}} merkkauksia lokimerkinnässä $5 sivulla $3 ({{PLURAL:$7|lisätty}} $6; {{PLURAL:$9|poistettu}} $8)",
        "rightsnone": "(ei oikeuksia)",
        "revdelete-summary": "yhteenvedon",
        "feedback-adding": "Lisätään palautetta sivulle...",
        "feedback-error1": "Virhe: Ohjelmointirajapinnan vastausta ei tunnistettu",
        "feedback-error2": "Virhe: Muokkaus epäonnistui",
        "feedback-error3": "Virhe: Ohjelmointirajapinta ei vastaa",
+       "feedback-error4": "Virhe: Annetun palautteen otsikkoa ei voida lähettää",
        "feedback-message": "Viesti",
        "feedback-subject": "Otsikko",
        "feedback-submit": "Lähetä",
        "log-name-pagelang": "Kielenvaihtoloki",
        "log-description-pagelang": "Tämä on loki, johon merkitään muutokset sivujen kieliasetuksissa.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|muutti}} sivun kieltä sivulla $3 kielestä $4 kieleksi $5.",
-       "default-skin-not-found": "Hupsista! Oletuksena tuleva ulkoasu sinun wikillesi, joka on määritelty koodissa <code dir=\"ltr\">$wgDefaultSkin</code> muotoon <code>$1</code>, ei ole saatavilla.\n\n\n<strong>Alla on ohjeita englanniksi:</strong>\n\n\nYour installation seems to include the following skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable them and choose the default.\n\n$2\n\n; If you have just installed MediaWiki: \n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by: :* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it. \n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code>skins/</code> directory of your MediaWiki installation. \n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n\n; If you have just upgraded MediaWiki: \n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following lines into <code>LocalSettings.php</code> to enable all currently installed skins:\n\n<pre>$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>: \n: Double-check the skin names for typos.",
+       "default-skin-not-found": "Hupsista! Oletuksena tuleva ulkoasu sinun wikillesi, joka on määritelty koodissa <code dir=\"ltr\">$wgDefaultSkin</code> muotoon <code>$1</code>, ei ole saatavilla.\n\n\n<strong>Alla on ohjeita englanniksi:</strong>\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation.\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} currently installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>",
        "default-skin-not-found-no-skins": "Hupsista! Oletusulkoasua sinun wikillesi ei ole saatavilla. Se on määritelty ulkoasuksi <code>$1</code> kohteessa <code>$wgDefaultSkin</code>.\n\nSinulla ei ole lainkaan asennettuja ulkoasuja. (You have no installed skins.)\n\nAlla on lisäohjeita englanniksi:\n\n\n; If you have just installed or upgraded MediaWiki: \n\n: You probably installed from git, or directly from the source code using some other method. This is expected. MediaWiki 1.24 and newer doesn't include any skins in the main repository. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by: \n\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it. \n\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n\n:* Cloning one of the <code>mediawiki/skins/*</code> repositories via git into the <code dir=\"ltr\">skins/</code> directory of your MediaWiki installation. \n\n: Doing this should not interfere with your git repository if you're a MediaWiki developer. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable skins and choose the default.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (käytössä)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ei käytössä''')",
index 0bf854a..ce80478 100644 (file)
        "disclaimers": "Fyrivarni",
        "disclaimerpage": "Project:Generelt fyrivarni",
        "edithelp": "Rættingarhjálp",
+       "helppage-top-gethelp": "Hjálp",
        "mainpage": "Forsíða",
        "mainpage-description": "Forsíða",
        "policy-url": "Project:Handfaring av persónligum upplýsingum",
        "hidetoc": "fjal",
        "collapsible-collapse": "Samanbrot",
        "collapsible-expand": "Víðka",
+       "confirmable-confirm": "Ert {{GENDER:$1|tú}} sikkur?",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nei",
        "thisisdeleted": "Sí ella endurstovna $1?",
        "notextmatches": "Ongin síðutekstur samsvarar",
        "prevn": "undanfarnu {{PLURAL:$1|$1}}",
        "nextn": "næstu {{PLURAL:$1|$1}}",
+       "next-page": "næsta síða",
        "prevn-title": "Gomul $1 {{PLURAL:$1|úrslit|úrslit}}",
        "nextn-title": "Næstu $1 {{PLURAL:$1|úrslit|úrslit}}",
        "shown-title": "Vís $1 {{PLURAL:$1|úrslit|úrslit}} á hvørjari síðu",
        "search-result-category-size": "{{PLURAL:$1|1 limur|$1 limir}} ({{PLURAL:$2|1 undirbólkur|$2 undirbólkar}}, {{PLURAL:$3|1 fíla|$3 fílur}})",
        "search-redirect": "(umstilling $1)",
        "search-section": "(sektión $1)",
+       "search-category": "(bólkur $1)",
        "search-suggest": "Meinti tú: $1",
        "search-interwiki-caption": "Líknandi verkætlanir",
        "search-interwiki-default": "Úrslit frá $1:",
        "suppress": "Yvirlit",
        "booksources": "Bókakeldur",
        "booksources-search-legend": "Leita eftir bókum",
+       "booksources-search": "Leita",
        "specialloguserlabel": "Gjørt hevur:",
        "speciallogtitlelabel": "Mál (heiti ella brúkari):",
        "log": "Gerðabøkur",
        "import-options-wrong": "{{PLURAL:$2|Ikki loyvd innstilling|Ikki loyvdar innstillingar}}: <nowiki>$1</nowiki>",
        "importlogpage": "Innflutningsloggur.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versjón|versjónir}}",
-       "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-pagetext-noframework": "Henda síðan er løgd av til at koyra JavaScript royndir.",
        "spambot_username": "MediaWiki spamm-reinsan",
        "spam_blanking": "Allar versjónir innihildu leinkjur til $1, tømir síðuna",
        "spam_deleting": "Allar versjónir innihalda leinkjur til $1, slettar",
+       "simpleantispam-label": "Anti-spam eftirlit.\nTú mást <strong>IKKI</strong> útfylla her!",
        "pageinfo-title": "Kunning um \"$1\"",
        "pageinfo-not-current": "Tað er tíverri ómøguligt at veita hesa kunning viðvíkjandi gomlum útgávum.",
        "pageinfo-header-basic": "Grundleggjandi kunning",
        "show-big-image": "Upprunafíla",
        "show-big-image-preview": "Stødd av hesi forskoðan: $1.",
        "show-big-image-other": "{{PLURAL:$2|Onnur upploysn|Aðrar upploysnir}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-frames": "$1 {{PLURAL:$1|ramma|rammur}}",
        "file-info-png-repeat": "spælt $1 {{PLURAL:$1|ferð|ferðir}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|ramma|rammur}}",
        "watchlisttools-view": "Vís viðkomandi broytingar",
        "watchlisttools-edit": "Vís og rætta eftirlit",
        "watchlisttools-raw": "Rætta rátt eftirlit",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kjak]])",
        "duplicate-defaultsort": "'''Ávaring:''' Standard sorteringslykilin \"$2\" yvirtekur fyrrverandi standard sorteringslykilin \"$1\".",
        "version": "Útgáva",
        "version-skins": "Útsjóndir",
        "compare-rev1": "Versjón 1",
        "compare-rev2": "Versjón 2",
        "compare-submit": "Samanber",
+       "logentry-newusers-create": "Brúkarakonta $1 varð {{GENDER:$2|upprættað}}",
        "rightsnone": "(ongin)",
        "revdelete-summary": "yvirlit yvir broytingar",
        "searchsuggest-search": "Leita",
index 36c91e6..ab28352 100644 (file)
        "wrongpassword": "Le mot de passe est incorrect. Veuillez essayer à nouveau.",
        "wrongpasswordempty": "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
        "passwordtooshort": "Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.",
+       "passwordtoolong": "Les mots de passe ne peuvent pas dépasser {{PLURAL:$1|1 caractère|$1 caractères}}.",
        "password-name-match": "Votre mot de passe doit être différent de votre nom d'utilisateur.",
        "password-login-forbidden": "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "history-feed-description": "Historique pour cette page sur le wiki",
        "history-feed-item-nocomment": "$1 le $2",
        "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
+       "history-edit-tags": "Modifier les balises des révisions sélectionnées",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
        "rev-deleted-event": "(détails de l’entrée retirée)",
        "rev-showdeleted": "afficher",
        "revisiondelete": "Supprimer ou restaurer des événements",
        "revdelete-nooldid-title": "Version cible non valide",
-       "revdelete-nooldid-text": "Vous n'avez pas précisé la version cible de cette fonction, elle n'existe pas, ou il s'agit de la version actuelle.",
+       "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou bien la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
        "revdelete-no-file": "Le fichier spécifié n'existe pas.",
        "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "revdelete-show-file-submit": "Oui",
        "notextmatches": "Aucun texte de page ne correspond à la recherche.",
        "prevn": "{{PLURAL:$1|précédente|$1 précédentes}}",
        "nextn": "{{PLURAL:$1|suivante|$1 suivantes}}",
+       "prev-page": "page précédente",
+       "next-page": "page suivante",
        "prevn-title": "$1 {{PLURAL:$1|résultat précédent|résultats précédents}}",
        "nextn-title": "$1 {{PLURAL:$1|résultat suivant|résultats suivants}}",
        "shown-title": "Afficher $1 résultat{{PLURAL:$1||s}} par page",
        "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",
+       "right-applychangetags": "Appliquer [[Special:Tags|les balises]] avec ses propres modifications",
+       "right-changetags": "Ajouter et supprimer de façon arbitraire [[Special:Tags|des balises]] sur des révisions individuelles et des entrées de journal",
        "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-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",
+       "action-applychangetags": "appliquer les balises avec vos modifications",
+       "action-changetags": "ajouter et supprimer de façon arbitraire des balises sur des révisions individuelles et des entrées de journal",
        "nchanges": "$1 modification{{PLURAL:$1||s}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|depuis la dernière visite}}",
        "enhancedrc-history": "historique",
        "listfiles-delete": "supprimer",
        "listfiles-summary": "Cette page spéciale permet de lister tous les fichiers importés.",
        "listfiles_search_for": "Rechercher un nom de média :",
+       "listfiles-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas enregistré.",
        "imgfile": "fichier",
        "listfiles": "Liste de fichiers",
        "listfiles_thumb": "Miniature",
        "logempty": "Aucune opération correspondante dans les journaux.",
        "log-title-wildcard": "Chercher parmi les titres commençant par ce texte",
        "showhideselectedlogentries": "Afficher/masquer les entrées de journal sélectionnées",
+       "log-edit-tags": "Modifier les balises des entrées de journal sélectionnées",
        "allpages": "Toutes les pages",
        "nextpage": "Page suivante ($1)",
        "prevpage": "Page précédente ($1)",
        "emailccsubject": "Copie de votre message à $1 : $2",
        "emailsent": "Courriel envoyé",
        "emailsenttext": "Votre message a été envoyé par courriel.",
-       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l'utilisateur » de {{SITENAME}}.",
+       "emailuserfooter": "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « {{int:emailpage}} » de {{SITENAME}}.",
        "usermessage-summary": "A laissé un message système.",
        "usermessage-editor": "Messager du système",
        "watchlist": "Liste de suivi",
        "import-interwiki-history": "Copier toutes les versions de l’historique de cette page",
        "import-interwiki-templates": "Inclure tous les modèles",
        "import-interwiki-submit": "Importer",
-       "import-interwiki-namespace": "Espace de noms de destination :",
-       "import-interwiki-rootpage": "Page racine de destination (optionnelle) :",
+       "import-mapping-default": "Importer aux emplacements par défaut",
+       "import-mapping-namespace": "Importer vers un espace de noms :",
+       "import-mapping-subpage": "Importer comme sous-pages de la page suivante :",
        "import-upload-filename": "Nom du fichier :",
        "import-comment": "Commentaire :",
        "importtext": "Veuillez exporter le fichier depuis le wiki d'origine en utilisant son [[Special:Export|outil d'exportation]].\nSauvegardez-le sur votre disque dur puis importez-le ici.",
        "pageinfo-protect-cascading-yes": "Oui",
        "pageinfo-protect-cascading-from": "Les protections sont déduites depuis",
        "pageinfo-category-info": "Informations sur la catégorie",
+       "pageinfo-category-total": "Nombre total de membres",
        "pageinfo-category-pages": "Nombre de pages",
        "pageinfo-category-subcats": "Nombre de sous-catégories",
        "pageinfo-category-files": "Nombre de fichiers",
        "patrol-log-page": "Journal des relectures",
        "patrol-log-header": "Voici l’historique des versions relues.",
        "log-show-hide-patrol": "$1 l’historique des relectures",
+       "log-show-hide-tag": "balise de journal $1",
        "deletedrevision": "Ancienne version $1 supprimée",
        "filedeleteerror-short": "Erreur lors de la suppression du fichier : $1",
        "filedeleteerror-long": "Des erreurs ont été rencontrées lors de la suppression du fichier :\n\n$1",
        "tags-deactivate-reason": "Motif :",
        "tags-deactivate-not-allowed": "Il n'est pas possible de désactiver la balise « $1 ».",
        "tags-deactivate-submit": "Désactiver",
+       "tags-apply-no-permission": "Vous n’avez pas le droit d’appliquer des balises de changement avec vos modifications.",
+       "tags-apply-not-allowed-one": "La balise « $1 » n’est pas autorisée à être appliquée manuellement.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|La balise suivante n’est pas autorisée à être appliquée|Les balises suivantes ne sont pas autorisées à être appliquées}} manuellement : $1",
+       "tags-update-no-permission": "Vous n’avez pas le droit d’ajouter ou de supprimer des balises de modification des révisions individuelles ou des entrées de journal.",
+       "tags-edit-existing-tags-none": "\"Aucun\"",
+       "tags-edit-reason": "Motif :",
+       "tags-edit-success": "Les modifications ont été appliquées avec succès.",
        "comparepages": "Comparer des pages",
        "compare-page1": "Page 1",
        "compare-page2": "Page 2",
        "feedback-error1": "Erreur : Résultat de l'IPA non reconnu",
        "feedback-error2": "Erreur : la modification a échoué",
        "feedback-error3": "Erreur : aucune réponse de l'API",
+       "feedback-error4": "Erreur : Impossible de publier sous le titre d’avis donné",
        "feedback-message": "Message :",
        "feedback-subject": "Objet :",
        "feedback-submit": "Envoyer",
        "log-name-pagelang": "Tracer les changements de langue",
        "log-description-pagelang": "Ceci est un journal des changements dans les langues des pages.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a changé}} la langue de la page $3 de $4 à $5.",
-       "default-skin-not-found": "Oups ! L’habillage par défaut pour votre wiki, défini par <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, n’est pas disponible.\n\nVotre installation semble inclure les habillages suivants. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de configuration des habillages] pour savoir comment les activer et choisir celui par défaut.\n\n$2\n\n; Si vous venez juste d’installer MediaWiki :\n: Vous l’avez probablement installé depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en:\n:* Téléchargeant le [https://www.mediawiki.org/wiki/Download fichier tar de l’installeur], qui comprend plusieurs habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:* Téléchargeant les fichiers tar d’habillage individuel depuis [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code dir=\"ltr\">skins/</code> de votre installation de MediaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git, si vous êtes un développeur de MediaWiki.\n\n; Si vous venez juste de mettre à jour MediaWiki :\n: MediaWiki 1.24 et au-delà n’active plus automatiquement les habillages installés (voyez [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery le manuel sur la découverte automatique des habillages]). Vous pouvez coller les lignes suivantes dans <code>LocalSettings.php</code> pour activer tous les habillages actuellement installés :\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si vous venez de modifier <code>LocalSettings.php</code> :\n: Vérifiez deux fois le nom des habillages pour éviter les erreurs de frappe.",
+       "default-skin-not-found": "Oups ! L’habillage par défaut pour votre wiki, défini par <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, n’est pas disponible.\n\nVotre installation semble inclure {{PLURAL:$4|l’habillage suivant|les habillages suivants}}. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de configuration des habillages] pour savoir comment {{PLURAL:$4|l’|les }}activer et choisir celui par défaut.\n\n$2\n\n; Si vous venez juste d’installer MediaWiki :\n: Vous l’avez probablement installé depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en:\n:* Téléchargeant le [https://www.mediawiki.org/wiki/Download fichier tar de l’installeur], qui comprend plusieurs habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:* Téléchargeant les fichiers tar d’habillage individuel depuis [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code dir=\"ltr\">skins/</code> de votre installation de MediaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git, si vous êtes un développeur de MediaWiki.\n\n; Si vous venez juste de mettre à jour MediaWiki :\n: MediaWiki 1.24 et au-delà n’active plus automatiquement les habillages installés (voyez [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery le manuel sur la découverte automatique des habillages]). Vous pouvez coller {{PLURAL:$5|la ligne suivante|les lignes suivantes}} dans <code>LocalSettings.php</code> pour activer {{PLURAL:$5|l’habillage actuellement installé|tous les habillages actuellement installés}} :\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si vous venez de modifier <code>LocalSettings.php</code> :\n: Vérifiez deux fois le nom des habillages pour éviter les erreurs de frappe.",
        "default-skin-not-found-no-skins": "Oups ! L’habillage par défaut pour votre wiki , défini par <code>$wgDefaultSkin</code> comme <code>$1</code>, n’est pas disponible.\n\nVous n’avez aucun habillage d’installé.\n\n; Si vous venez juste d’installer ou de mettre à jour MediaWiki :\n: Vous l’avez sans doute fait depuis git, ou directement depuis le code source avec une autre méthode. C’est normal. MediaWiki 1.24 et au-delà n’inclut aucun habillage dans le dépôt principal. Essayez d’installer des habillages depuis [https://www.mediawiki.org/wiki/Category:All_skins le répertoire des habillages de mediawiki.org], en :\n:* Téléchargeant [https://www.mediawiki.org/wiki/Download le fichier tar de l’installeur], qui comprend différents habillages et extensions. Vous pouvez copier et coller le répertoire <code>skins/</code> depuis là.\n:* Téléchargeant les fichiers tar d’habillage individuel depuis [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:*Clonant un des dépôts <code>mediawiki/skins/*</code> via git dans le répertoire <code dir=\"ltr\">skins/</code> de votre installation de MediaWiki.\n: Faire ainsi ne devrait pas interférer avec votre dépôt git si vous êtes un développeur de MediaWiki. Voyez [https://www.mediawiki.org/wiki/Manual:Skin_configuration le manuel de la configuration des habillages] pour des instructions sur la manière d’activer les habillages et choisir celui par défaut.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (activé)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''désactivé''')",
index 8c6c777..366ace0 100644 (file)
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
        "emailsenttext": "Din e-mail as wechsjüürd wurden.",
-       "emailuserfooter": "Detdiar e-mail as faan di {{SITENAME}}-brüker „$1“ tu „$2“ schüürd wurden.",
+       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailpage}}“ bi {{SITENAME}} schüürd wurden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "watchlist": "Uun't uug behual",
        "import-interwiki-history": "Aal a werjuunen faan det sidj importiare",
        "import-interwiki-templates": "Mä aal a föörlaagen",
        "import-interwiki-submit": "Import",
-       "import-interwiki-namespace": "Tu hün nöömrüm:",
-       "import-interwiki-rootpage": "Tu hün sidj (optional):",
        "import-upload-filename": "Dateinööm:",
        "import-comment": "Komentaar:",
        "importtext": "Wees so gud an eksportiare det datei mä det spezial-sidj [[Special:Export|Eksport]] ütj det ööder Wiki. Det seekerst dü üüb dan reegner an schüürst det do heer huuch.",
        "log-name-pagelang": "Logbuk för spriak-feranrangen",
        "log-description-pagelang": "Det as en logbuk för sidjenspriak-feranrangen",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert.",
-       "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar skaker. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst jodiar räen uun det datei <code>LocalSettings.php</code> iinsaat, am aal a instaliaret skaker tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
+       "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar {{PLURAL:$4|skak|skaker}}. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am {{PLURAL:$4|di skak|a skaker}} tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst jodiar räen uun det datei <code>LocalSettings.php</code> iinsaat, am aal a instaliaret skaker tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
        "default-skin-not-found-no-skins": "Uuha! Uun <code>$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDü heest goor nian skak instaliaret.\n\n; Wan dü MediaWiki jüst instaliaret of aktualisiaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. MediaWiki 1.24 an neier werjuunen haa nian skak uun't hood-fertiaknis. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Enkelt skak-tarballs faan [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] deelloose.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiwiaret)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ufsteld''')",
        "json-error-recursion": "Ian of muar rekursiif referensen uun a wäärs tu kodiarin.",
        "json-error-inf-or-nan": "Ään of muar NAN of INF wäärser uun a wäärs tu kodiarin.",
        "json-error-unsupported-type": "Diar stäänt en wäärs faan en typ, diar ei kodiaret wurd koon.",
-       "headline-anchor-title": "Ferwisang tu detdiar kirew"
+       "headline-anchor-title": "Ferwisang tu detdiar kirew",
+       "special-characters-group-latin": "Latiinsk",
+       "special-characters-group-latinextended": "Latiinsk, ütjwidjet",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Sümboolen",
+       "special-characters-group-greek": "Griichisk",
+       "special-characters-group-cyrillic": "Kyrilisk",
+       "special-characters-group-arabic": "Araabisk",
+       "special-characters-group-arabicextended": "Araabisk, ütjwidjet",
+       "special-characters-group-persian": "Persisk",
+       "special-characters-group-hebrew": "Hebreewsk",
+       "special-characters-group-bangla": "Bengaalisk",
+       "special-characters-group-tamil": "Tamiilisk",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Laotisk",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "seenkstreg",
+       "special-characters-title-emdash": "speegelstreg",
+       "special-characters-title-minus": "minus tiaken"
 }
index 570fd00..da9d973 100644 (file)
        "subject": "Ûnderwerp/kop:",
        "minoredit": "Dit is in tekstwiziging",
        "watchthis": "Folgje dizze side",
-       "savearticle": "Fêstlizze",
+       "savearticle": "Side bewarje",
        "preview": "Oerlêze",
        "showpreview": "Earst oerlêze",
        "showdiff": "Wizigings",
        "post-expand-template-argument-category": "Siden dy't missende sjabloaneleminten befetsje",
        "parser-template-loop-warning": "Der is in lus yn sjabloanen fûn: [[$1]]",
        "parser-template-recursion-depth-warning": "De werhellingsdjipte foar sjabloanen is oer de grins ($1)",
-       "undo-success": "De feroaring kin werom set wurde. Kontrolearje de ferliking hjirûnder om wis te wêzen dat jo dit feroarje wolle en druk dan op fêstlizze om it werom setten troch te fieren.",
+       "undo-success": "De feroaring kin werom set wurde.\nKontrolearje de ferliking hjirûnder om wis te wêzen dat jo dit feroarje wolle en druk dan op bewarje om it werom setten troch te fieren.",
        "undo-failure": "De feroarings kinne net werom set wurde troch in konflikt mei oare feroarings tuskentroch.",
        "undo-norev": "De feroaring kin werom set wurde, omdat it net bestiet of is wiske.",
        "undo-summary": "Werom sette fan ferzje $1 fan [[Special:Contributions/$2|$2]] ([[User talk:$2|Oerlis]])",
        "revdelete-unsuppress": "Beheinings op tebeksette feroarings fuorthelje",
        "revdelete-log": "Reden:",
        "revdelete-submit": "Tapasse op selektearre bewurking",
-       "revdelete-success": "<strong>Sichtberens fan 'e feroaring mei sukses ynsteld.</strong>",
-       "logdelete-success": "<strong>Sichtberens fan it barren mei sukses ynsteld.</strong>",
+       "revdelete-success": "Sichtberens fan 'e feroaring mei sukses ynsteld.",
+       "logdelete-success": "Sichtberens fan it barren mei sukses ynsteld.",
        "revdel-restore": "Sichtberens feroarje",
        "pagehist": "Sideskiednis",
        "deletedhist": "Wiske skiednis",
        "prefs-watchlist-edits-max": "Maksimum oantal: 1000",
        "prefs-misc": "Ferskaat",
        "prefs-resetpass": "Wachtwurd feroarje",
-       "saveprefs": "Fêstlizze",
+       "prefs-email": "E-mail",
+       "prefs-rendering": "Uterlik",
+       "saveprefs": "Bewarje",
        "restoreprefs": "Tebek nei de standertynstellings",
        "prefs-editing": "Siden bewurkje",
        "rows": "Rigen",
        "prefs-help-realname": "Echte namme is net ferplicht; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.",
        "prefs-help-email": "E-mail is opsjoneel, mar makket it mûglik jo wachtwurd te stjoeren as jo it fergetten hawwe.\nJo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwizing op jo brûkers- en oerlisside, sûnder dat jo jo identiteit oer hoege te jaan.",
        "prefs-help-email-required": "Hjir is in e-mailadres foar nedich.",
+       "prefs-info": "Basisynformaasje",
+       "prefs-i18n": "Taalynstellingen",
        "prefs-signature": "Sinjatuer",
        "prefs-dateformat": "Datumopmaak",
        "prefs-timeoffset": "Tiidsferskil",
        "editusergroup": "Wizigje meidoggerrjochten",
        "editinguser": "Bewurkje meidoggerrjochten fan <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Wizigje meidoggerrjochten",
-       "saveusergroups": "Meidoggerrjochten fêstlizze",
+       "saveusergroups": "Meidoggerrjochten bewarje",
        "userrights-groupsmember": "Sit yn group:",
        "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Jo kinne de groepen feroarje dêr't dizze brûker lid fan is.\n* In oankrúst fekje betsjut dat de brûker lid is fan 'e groep.\n* In net oankrúst fekje betsjut dat de brûker gjin lid is fan 'e groep.\n* In \"*\" betsjut dat jo in brûker net út in groep weihelje kinne nei't jo dy tafoege hawwe, of oarsom.",
        "fileexists-forbidden": "Der bestiet al in triem mei dizze namme.\nBied jo triem ûnder in oare namme oan.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Der bestiet al in triem mei dizze namme by de dielde triemmen.\nAs jo de triem dochs noch oanbiede wolle, gean dan werom en kies in oare namme.\n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Dizze triem is idintyk oan {{PLURAL:$1|de folgjende triem|de folgjende triemmen}}:",
-       "file-deleted-duplicate": "In bestân idintyk oan dit bestân ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
+       "file-deleted-duplicate": "In triem idintyk oan dizze triem ([[:$1]]) is foarhinne fuorthelle.\nRieplachtsje it fuorthel-logboek foar't jo fierder geane.",
        "uploadwarning": "Oanbied-warskôging",
        "savefile": "Lis triem fêst",
        "uploaddisabled": "Sorry, op dizze tsjinner kin net oanbean wurde.",
        "listfiles-summary": "Op dizze spesjale side binne alle tafoege triemmen te besjen.\nStandert wurde de lêst tafoege triemmen boppe oan de list werjûn.\nKlikken op in kolomkop feroaret de sortearring.",
        "listfiles_search_for": "Sykje nei triem:",
        "imgfile": "triem",
-       "listfiles": "Ofbyld list",
+       "listfiles": "Triemlist",
        "listfiles_thumb": "Miniatuerôfbylding",
        "listfiles_date": "Datum",
        "listfiles_name": "Namme",
        "export-addcattext": "Siden tafoegje fan kategory:",
        "export-addcat": "Tafoegje",
        "export-addns": "Tafoegje",
-       "export-download": "Fêstlizze as triem",
+       "export-download": "Bewarje as triem",
        "export-templates": "Tafoegje berjochten",
        "allmessages": "Alle wikiberjochten",
        "allmessagesname": "Namme",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|meidogger|meidoggers}} $1",
        "spamprotectiontext": "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
        "spamprotectionmatch": "De neikommende tekst hat it spam filter aktivearre: $1",
+       "pageinfo-header-basic": "Basisynformaasje",
+       "pageinfo-header-properties": "Side-eigenskippen",
        "pageinfo-redirects-value": "$1",
        "pageinfo-toolboxlink": "Sidegegevens",
        "pageinfo-contentpage-yes": "Ja",
index 3969199..d51da63 100644 (file)
        "revdelete-unsuppress": "Thoir air falbh na bacaidhean air mùthaidhean a chaidh aiseag",
        "revdelete-log": "Adhbhar:",
        "revdelete-submit": "Cuir an sàs e air {{PLURAL:$1|am mùthadh|na mùthaidhean}} a thagh thu",
-       "revdelete-success": "<strong>Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.</strong>",
-       "revdelete-failure": "<strong>Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:</strong>\n$1",
-       "logdelete-success": "<strong>Chaidh faicsinneachd an loga a shuidheachadh.</strong>",
-       "logdelete-failure": "<strong>Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:</strong>\n$1",
+       "revdelete-success": "Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.",
+       "revdelete-failure": "Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:\n$1",
+       "logdelete-success": "Chaidh faicsinneachd an loga a shuidheachadh.",
+       "logdelete-failure": "Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:\n$1",
        "revdel-restore": "mùth follaiseachd",
        "pagehist": "Eachdraidh na duilleige",
        "deletedhist": "Eachdraidh a chaidh a sguabadh às",
        "import-interwiki-history": "Dèan lethbhreac de dh'eachdraidh nam mùthaidhean slàna airson na duilleige seo",
        "import-interwiki-templates": "Gabh a-steach na teamplaidean uile",
        "import-interwiki-submit": "Ion-phortaich",
-       "import-interwiki-namespace": "Ainm-spàs-uidhe:",
-       "import-interwiki-rootpage": "Duilleag freumha a' chinn-uidhe (roghainneil):",
        "import-upload-filename": "Ainm an fhaidhle:",
        "import-comment": "Beachd:",
        "importtext": "Às-phortaich am faidhle on uicidh tùsail le [[Special:Export|goireas an às-phortachaidh]].\nSàbhail e air a' choimpiutair agad is luchdaich suas e an-seo.",
index e6adeee..b857f48 100644 (file)
        "policy-url": "Project:Políticas e normas",
        "portal": "Portal da comunidade",
        "portal-url": "Project:Portal da comunidade",
-       "privacy": "Política de privacidade",
+       "privacy": "Política de protección de datos",
        "privacypage": "Project:Política de protección de datos",
        "badaccess": "Erro de permisos",
        "badaccess-group0": "Non ten os permisos necesarios para executar a acción que solicitou.",
        "wrongpassword": "O contrasinal escrito é incorrecto.\nPor favor, insira outro.",
        "wrongpasswordempty": "O campo do contrasinal estaba en branco.\nPor favor, inténteo de novo.",
        "passwordtooshort": "Os contrasinais deben conter, como mínimo, {{PLURAL:$1|1 carácter|$1 caracteres}}.",
+       "passwordtoolong": "Os contrasinais non deben ser máis longo de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "O seu contrasinal debe ser diferente do seu nome de usuario.",
        "password-login-forbidden": "O uso deste nome de usuario e contrasinal foi prohibido.",
        "mailmypassword": "Restablecer o contrasinal",
        "history-feed-description": "Historial de revisións desta páxina no wiki",
        "history-feed-item-nocomment": "$1 o $2",
        "history-feed-empty": "A páxina solicitada non existe.\nPuido borrarse ou moverse a outro nome.\nProbe a [[Special:Search|buscar no wiki]] para atopar as páxinas relacionadas.",
+       "history-edit-tags": "Editar as etiquetas das revisións seleccionadas",
        "rev-deleted-comment": "(resumo de edición eliminado)",
        "rev-deleted-user": "(nome de usuario eliminado)",
        "rev-deleted-event": "(detalles do rexistro eliminados)",
        "rev-showdeleted": "mostrar",
        "revisiondelete": "Borrar/restaurar revisións",
        "revdelete-nooldid-title": "Revisión inválida",
-       "revdelete-nooldid-text": "Non indicou a revisión ou revisións sobre as que realizar esta\nfunción, a revisión especificada non existe ou está intentando agochar a revisión actual.",
+       "revdelete-nooldid-text": "Non indicou a revisión sobre a que realizar esta función, ou a revisión especificada non existe ou está intentando agochar a revisión actual.",
        "revdelete-no-file": "O ficheiro especificado non existe.",
        "revdelete-show-file-confirm": "Está seguro de querer ver unha revisión borrada do ficheiro \"<nowiki>$1</nowiki>\" do día $2 ás $3?",
        "revdelete-show-file-submit": "Si",
        "notextmatches": "Non se atopou o texto en ningunha páxina",
        "prevn": "{{PLURAL:$1|$1}} previas",
        "nextn": "{{PLURAL:$1|$1}} seguintes",
+       "prev-page": "páxina anterior",
+       "next-page": "páxina seguinte",
        "prevn-title": "{{PLURAL:$1|O resultado anterior|Os anteriores $1 resultados}}",
        "nextn-title": "{{PLURAL:$1|O seguinte resultado|Os seguintes $1 resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por páxina",
        "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",
+       "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] xunto cos cambios propios",
+       "right-changetags": "Engadir e quitar [[Special:Tags|etiquetas]] arbitrarias a revisións individuais e entradas do rexistro",
        "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-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",
+       "action-applychangetags": "aplicar etiquetas xunto cos cambios",
+       "action-changetags": "engadir e quitar etiquetas arbitrarias a revisións individuais e entradas do rexistro",
        "nchanges": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "historial",
        "listfiles-delete": "borrar",
        "listfiles-summary": "Esta páxina especial mostra todos os ficheiros cargados.",
        "listfiles_search_for": "Buscar polo nome do ficheiro multimedia:",
+       "listfiles-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.",
        "imgfile": "ficheiro",
        "listfiles": "Lista de ficheiros",
        "listfiles_thumb": "Miniatura",
        "logempty": "Non se atopou ningún elemento relacionado no rexistro.",
        "log-title-wildcard": "Procurar os títulos que comecen con este texto",
        "showhideselectedlogentries": "Mostrar/agochar as entradas do rexistro seleccionadas",
+       "log-edit-tags": "Editar as etiquetas das entradas do registro seleccionadas",
        "allpages": "Todas as páxinas",
        "nextpage": "Páxina seguinte ($1)",
        "prevpage": "Páxina anterior ($1)",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "Este correo electrónico foi enviado por $1 a $2 mediante a función \"Enviar un correo electrónico a este usuario\" de {{SITENAME}}.",
+       "emailuserfooter": "Este correo electrónico foi enviado por $1 a $2 mediante a función \"{{int:emailpage}}\" en {{SITENAME}}.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "import-interwiki-history": "Copiar todas as versións que hai no historial desta páxina",
        "import-interwiki-templates": "Incluír todos os modelos",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Espazo de nomes de destino:",
-       "import-interwiki-rootpage": "Páxina raíz de destino (opcional):",
        "import-upload-filename": "Nome do ficheiro:",
        "import-comment": "Comentario:",
        "importtext": "Por favor, exporte o ficheiro do wiki de orixe usando a [[Special:Export|ferramenta de exportación]].\nGárdeo no seu disco duro e cárgueo aquí.",
        "pageinfo-protect-cascading-yes": "Si",
        "pageinfo-protect-cascading-from": "Protección en serie activada",
        "pageinfo-category-info": "Información da categoría",
+       "pageinfo-category-total": "Número total de membros",
        "pageinfo-category-pages": "Número de páxinas",
        "pageinfo-category-subcats": "Número de subcategorías",
        "pageinfo-category-files": "Número de ficheiros",
        "patrol-log-page": "Rexistro de revisións patrulladas",
        "patrol-log-header": "Este é un rexistro das revisións patrulladas.",
        "log-show-hide-patrol": "$1 o rexistro de patrullas",
+       "log-show-hide-tag": "$1 rexistro de etiquetas",
        "deletedrevision": "A revisión vella $1 foi borrada.",
        "filedeleteerror-short": "Erro ao eliminar o ficheiro: $1",
        "filedeleteerror-long": "Atopáronse erros ao eliminar o ficheiro:\n\n$1",
        "tags-deactivate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "Non é posible reactivar a páxina \"$1\".",
        "tags-deactivate-submit": "Reactivar",
+       "tags-apply-no-permission": "Non ten permisos para aplicar etiquetas de cambios xunto cos seus tus cambios.",
+       "tags-apply-not-allowed-one": "A etiqueta \"$1\" non se puede aplicar manualmente.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} aplicar manualmente: $1",
+       "tags-update-no-permission": "Non ten permisos para engadir ou quitar etiquetas de cambio das revisións individuais ou das entradas do rexistro.",
+       "tags-update-add-not-allowed-one": "A etiqueta \"$1\" non se pode engadir manualmente.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} engadir manualmente: $1",
+       "tags-update-remove-not-allowed-one": "A etiqueta \"$1\" non se pode eliminar.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} eliminar manualmente: $1",
+       "tags-edit-title": "Editar etiquetas",
+       "tags-edit-manage-link": "Xestionar as etiquetas",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisión seleccionada|Revisións seleccionadas}} de [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Rexistro de eventos seleccionado|Rexistros de eventos seleccionados}}:",
+       "tags-edit-revision-legend": "Engadir ou quitar etiquetas de {{PLURAL:$1|esta revisión|todas as $1 revisións}}",
+       "tags-edit-logentry-legend": "Engadir ou quitar etiquetas de {{PLURAL:$1|esta entrada do rexistro|todas as $1 entradas do rexistro}}",
+       "tags-edit-existing-tags": "Etiquetas existentes:",
+       "tags-edit-existing-tags-none": "''Ningunha''",
+       "tags-edit-new-tags": "Novas etiquetas:",
+       "tags-edit-add": "Engadir estas etiquetas:",
+       "tags-edit-remove": "Eliminar estas etiquetas:",
+       "tags-edit-remove-all-tags": "(eliminar todas as etiquetas)",
+       "tags-edit-chosen-placeholder": "Seleccione algunhas etiquetas",
+       "tags-edit-chosen-no-results": "No se atoparon etiquetas que coincidan",
+       "tags-edit-reason": "Motivo:",
+       "tags-edit-revision-submit": "Aplicar os cambios a {{PLURAL:$1|esta revisión|$1 revisións}}",
+       "tags-edit-logentry-submit": "Aplicar os cambios a {{PLURAL:$1|esta entrada do rexistro|$1 entradas do rexistro}}",
+       "tags-edit-success": "Os cambios aplicáronse con éxito.",
+       "tags-edit-failure": "Non se puideron aplicar os cambios:\n$1",
+       "tags-edit-nooldid-title": "Revisión inválida",
+       "tags-edit-nooldid-text": "Non indicou a revisión sobre a que realizar esta función, ou a revisión especificada non existe.",
+       "tags-edit-none-selected": "Por favor, seleccione polo menos unha etiqueta que engadir ou quitar.",
        "comparepages": "Comparar páxinas",
        "compare-page1": "Páxina 1",
        "compare-page2": "Páxina 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|borrou}} a etiqueta \"$4\" (eliminouse de $5 {{PLURAL:$5|revisión ou entrada de rexistro|revisións e/ou entradas de rexistro}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|activou}} a etiqueta \"$4\" para o seu uso por usuarios e bots",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|desactivou}} a etiqueta \"$4\" para impedir o seu uso por usuarios e bots",
+       "log-name-tag": "Rexistro de etiquetas",
+       "log-description-tag": "Esta páxina mostra cando os usuarios engadiron ou eliminaron [[Special:Tags|etiquetas]] de revisións individuais ou entradas do rexistro. O rexistro non mostra as accións de etiquetado cando se producen como parte dunha edición, eliminación ou accións semellantes.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|engadiu}} {{PLURAL:$7|a etiqueta|as etiquetas}} $6 á revisión $4 da páxina $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|engadiu}} {{PLURAL:$7|a etiqueta|as etiquetas}} $6 á entrada do rexistro $5 da páxina $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|eliminou}} {{PLURAL:$9|a etiqueta|as etiquetas}} $8 da revisión $4 da páxina $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|eliminou}} {{PLURAL:$9|a etiqueta|as etiquetas}} $8 da entrada do rexistro $5 da páxina $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|actualizou}} etiquetas da revisión $4 da páxina $3 ({{PLURAL:$7|engadiu}} $6; {{PLURAL:$9|eliminou}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualizou}} etiquetas da entrada do rexistro $5 da páxina $3 ({{PLURAL:$7|engadiu}} $6; {{PLURAL:$9|eliminou}} $8)",
        "rightsnone": "(ningún)",
        "revdelete-summary": "o resumo de edición",
        "feedback-adding": "Enviando os comentarios...",
        "feedback-error1": "Erro: Resultado da API non recoñecido",
        "feedback-error2": "Erro: Fallo de edición",
        "feedback-error3": "Erro: Non hai resposta da API",
+       "feedback-error4": "Erro: Non foi posible enviar o seu comentario sobre o título selecionado",
        "feedback-message": "Mensaxe:",
        "feedback-subject": "Asunto:",
        "feedback-submit": "Enviar",
        "log-name-pagelang": "Rexistro de cambios de lingua",
        "log-description-pagelang": "Este é un rexistro dos cambios na lingua das páxinas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|cambiou}} a lingua da páxina \"$3\" do $4 ao $5.",
-       "default-skin-not-found": "Ups! O aspecto predeterminado do wiki, definido en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non está dispoñíbel.\n\nA súa instalación parece incluír os aspectos da seguinte lista. Lea o [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual de configuración dos aspectos] para obter información sobre como activalos e escoller o predeterminado.\n\n$2\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.\n\n; Se acaba de anovar MediaWiki:\n: MediaWiki 1.24 e versións posteriores xa non activan aspectos de maneira automática (lea o [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual de descubrimento automático de aspectos]). Pode pegar as seguintes liñas no seu ficheiro <code>LocalSettings.php</code> para activar todos os aspectos instalados actualmente:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se acaba de modificar <code>LocalSettings.php</code>:\n: Asegúrese de que os nomes dos aspectos están escritos correctamente.",
+       "default-skin-not-found": "Ups! O aspecto predeterminado do wiki, definido en <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, non está dispoñíbel.\n\nA súa instalación parece incluír {{PLURAL:$4|o seguinte aspecto|os seguintes aspectos}}. Lea o [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual de configuración dos aspectos] para obter información sobre como {{PLURAL:$4|activalo|activalos}} e escoller o predeterminado.\n\n$2\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.\n\n; Se acaba de anovar MediaWiki:\n: MediaWiki 1.24 e versións posteriores xa non activan aspectos de maneira automática (lea o [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual de descubrimento automático de aspectos]). Pode pegar {{PLURAL:$5|a seguinte liña|as seguintes liñas}} no seu ficheiro <code>LocalSettings.php</code> para activar {{PLURAL:$5|o|todos os}} {{PLURAL:$5|aspecto instalado|aspectos instalados}} actualmente:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se acaba de modificar <code>LocalSettings.php</code>:\n: Asegúrese de que os nomes dos aspectos están escritos correctamente.",
        "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''')",
index dd47af1..3ac5b34 100644 (file)
@@ -47,7 +47,7 @@
        "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)",
        "tog-oldsig": "Vorschau vu dr Unterschrift:",
        "tog-fancysig": "Signatur as Wikitext behandle (ohni automatischi Vergleichig)",
-       "tog-uselivepreview": "Live-Vorschau bruche (experimentell)",
+       "tog-uselivepreview": "Vorschau sofort aazeige",
        "tog-forceeditsummary": "Sag mer s, wänn i s Zämmefassigsfeld läär loss",
        "tog-watchlisthideown": "Eigeni Änderige uf d Beobachtigslischt usblände",
        "tog-watchlisthidebots": "Bot-Änderige in d Beobachtigslischt usblende",
        "pool-queuefull": "D Warteschlang isch voll",
        "pool-errorunknown": "Nit bekannte Fähler",
        "pool-servererror": "Dr Poolzellerdienscht isch nit verfiegbar ($1).",
+       "poolcounter-usage-error": "Verwändigsfähler: $1",
        "aboutsite": "Über {{GRAMMAR:akkusativ|{{SITENAME}}}}",
        "aboutpage": "Project:Über {{UCFIRST:{{GRAMMAR:akkusativ|{{SITENAME}}}}}}",
        "copyright": "Dr Inhalt vu dere Syte stoht unter dr Lizänz $1, wänn s nit andersch aagee isch.",
        "disclaimers": "Impressum",
        "disclaimerpage": "Project:Impressum",
        "edithelp": "Rotschläg fir s Bearbeite",
+       "helppage-top-gethelp": "Hilf",
        "mainpage": "Houptsyte",
        "mainpage-description": "Houptsyte",
        "policy-url": "Project:Leitlinie",
        "readonly_lag": "D Datebank isch automatisch gperrt wore, wil di verteilte Datebankserver (Sklave) mien mit em Hauptdatebankserver (Meischter) abgliche wäre.",
        "internalerror": "Interner Fähler",
        "internalerror_info": "Interne Fähler: $1",
+       "internalerror-fatal-exception": "Fatale Uusnahmefähler vum Typ „$1“",
        "filecopyerror": "D Datei $1 het nit no $2 chenne kopiert wäre.",
        "filerenameerror": "D Datei \"$1\" het nit in \"$2\" umgnennt werre kinne.",
        "filedeleteerror": "Datei \"$1\" het nit glöscht werre kinne.",
        "directorycreateerror": "S Verzeichnis „$1“ het nit chenne aaglait wäre.",
+       "directoryreadonlyerror": "S Werterbuech „$1“ isch schrybgschitzt.",
+       "directorynotreadableerror": "S Werterbuech „$1“ cha nit gläse wäre.",
        "filenotfound": "Datei \"$1\" isch nit gfunde worre.",
        "unexpected": "Wärt, wu nit erwartet woren isch: „$1“=„$2“.",
        "formerror": "Fähler: Ds Formular het nid chönne verarbeitet wärde",
        "wrongpassword": "Des Passwort isch falsch (oder fählt). Bitte versuech s nomol.",
        "wrongpasswordempty": "Du hesch vergässe dyy Passwort yyzgee. Bitte versuech s nomol.",
        "passwordtooshort": "Passwerter mien zmindescht {{PLURAL:$1|1 Zeiche|$1 Zeiche}} haa.",
+       "passwordtoolong": "Passwerter derfe nit lenger syy wie {{PLURAL:$1|ei|$1}} Zeiche.",
        "password-name-match": "Dyy Passwort muess sich vu Dyynem Benutzername unterscheide.",
        "password-login-forbidden": "D Verwändig vu däm Benutzernamen un Passwort isch verbotte.",
        "mailmypassword": "E nei Passwort schicke",
        "showhideselectedversions": "Uusgwehlti Versione zeige/verstecke",
        "editundo": "rückgängig",
        "diff-empty": "(kei Unterschid)",
+       "diff-multi-sameuser": "({{PLURAL:$1|E Version vum nämlige Benutzer, wu derzwische lyt, wird|$1 Versione vum nämlige Benutzer, wu derzwische lige, wäre}} nit aazeigt)",
        "diff-multi-manyusers": "({{PLURAL:$1|Ei Version|$1 Versione}} vu meh {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt un nit aazeigt wird|wu derzwische lige un nit aazeigt wäre}})",
        "difference-missing-revision": "{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.\n\nDää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.\nEinzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.",
        "searchresults": "Suech-Ergäbnis",
        "shown-title": "Zeig $1 {{PLURAL:$1|Ergebnis|Ergebnis}} pro Syte",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) aazeige; ($3) uf ds Mal",
        "searchmenu-exists": "* Syte '''[[$1]]'''",
-       "searchmenu-new": "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
+       "searchmenu-new": "<strong>Leg d Syte „[[:$1]]“ in däm Wiki aa.</strong> {{PLURAL:$2|0=|Lueg au d Syte, wu iber Dy Suech gfunde wore sin.|Lueg au di gfundene Suechergebnis.}}",
        "searchprofile-articles": "Inhaltssyte",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
+       "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> vu <strong>$3</strong>|Ergebnis <strong>$1 bis $2</strong> vu <strong>$3</strong>}}",
        "search-nonefound": "Fir Dyyni Suechaafrog sin keini Ergebniss gfunde wore.",
        "powersearch-legend": "Erwytereti Suech",
        "powersearch-ns": "Suech in Namensryym:",
        "action-siteadmin": "d Datebank z sperre oder frejzgee",
        "action-sendemail": "E-Mail z schicke",
        "nchanges": "$1 {{PLURAL:$1|Änderig|Änderige}}",
+       "enhancedrc-history": "Versionsgschicht",
        "recentchanges": "Letschti Änderige",
        "recentchanges-legend": "Optione vu dr Aazeig",
        "recentchanges-summary": "Uf däre Syte chasch di letschte Änderige in däm Wiki aaluege.",
        "recentchanges-label-bot": "Die Bearbeitig isch dur e Bott uusgfiert wore",
        "recentchanges-label-unpatrolled": "Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore",
        "recentchanges-label-plusminus": "Di gänderet Sytegreßi (Aazahl in Byte)",
+       "recentchanges-legend-heading": "'''Legänd:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
        "rcnotefrom": "Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).",
        "rclistfrom": "Nume Änderige syt $3, $2 Uhr zeige.",
        "querypage-disabled": "Die Spezialsyte isch deaktiviert wore us Leischtigserhaltigs-Grind.",
        "booksources": "ISBN-Suech",
        "booksources-search-legend": "Suech no Bezugsquälle fir Biecher",
+       "booksources-search": "Sueche",
        "booksources-text": "Des isch e Lischt mit Link zue Netzsyte, wu neiji un bruchti Biecher verchaufe. S cha syy, ass es dert au meh Informatione zue dr Biecher git. {{SITENAME}} isch mit keinem vu däne Aabieter gschäftli verbunde.",
        "booksources-invalid-isbn": "D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.",
        "specialloguserlabel": "Benutzer, wu des gmacht het:",
        "import-rootpage-nosubpage": "Im Namensruum „$1“ vu dr Stammsyte sin kei Untersyte erlaubt.",
        "importlogpage": "Import-Logbuech",
        "importlogpagetext": "Adminischtrativer Import vo Sytene mit Versionsgschichte us anderi Wikis.",
-       "import-logentry-upload": "„[[$1]]“ isch vunere Datei importiert worde",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|Vérsion|Vérsiona}}",
-       "import-logentry-interwiki": "„$1“ isch importiert worde (Transwiki)",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|Version|Versione}} vo $2",
        "javascripttest": "JavaScript-Tescht",
        "javascripttest-pagetext-noframework": "Die Syte isch reserviert fir JavaSkript-Tescht.",
        "tooltip-pt-mycontris": "Lischt vu Dyyne Byyträg",
        "tooltip-pt-login": "Aamälde",
        "tooltip-pt-logout": "Abmälde",
+       "tooltip-pt-createaccount": "Du chasch gärn e Bentuzerkonto aalege un Di aamälde. Du muesch s aber nit",
        "tooltip-ca-talk": "Diskussion zum Artikelinhalt",
        "tooltip-ca-edit": "Syte bearbeite. Bitte vor em Spychere d Vorschou aaluege.",
        "tooltip-ca-addsection": "Neje Abschnitt aafange",
        "spam_reverting": "Letschti Version ohni Links zue $1 widerhärgstellt.",
        "spam_blanking": "In allene Versione het s Links zue $1 gha, sufer gmacht.",
        "spam_deleting": "Alli Versione mit eme Link zue $1 sin glescht woret.",
-       "simpleantispam-label": "Spamschutz-Priefig. Do '''nyt''' yytrage!",
+       "simpleantispam-label": "Spamschutz-Priefig. \nDo <strong>NYT</strong> yytrage!",
        "pageinfo-title": "Informatione zue „$1“",
        "pageinfo-not-current": "Die Informatione chenne leider nit fir alti Versionen aazeigt wäre.",
        "pageinfo-header-basic": "Basisinformatione",
        "htmlform-chosen-placeholder": "Wehl en Option",
        "sqlite-has-fts": "$1 mit Unterstitzig vu dr Volltextsuechi",
        "sqlite-no-fts": "$1 ohni Unterstitzig vu dr Volltextsuechi",
-       "logentry-delete-delete": "$1 het d Syte $3 glöscht",
+       "logentry-delete-delete": "{{GENDER:$2|Dr|D|Dr}} $1 het d Syte $3 glöscht",
        "logentry-delete-restore": "$1 het d Syte $3 wiiderhergstellt",
        "logentry-delete-event": "$1 het die Sichtbarkeit {{PLURAL:$5|vumene Logbuechyytrag|vo $5 Logbuechyyträg}} uff $3: $4 gänderet",
        "logentry-delete-revision": "$1 het die Sichtbarkeit {{PLURAL:$5|vunere Version|vo $5 Versione}} uff $3: $4 gänderet",
        "revdelete-uname-unhid": "Benutzername freigee",
        "revdelete-restricted": "Yyschränkige gälte au fir Ammanne",
        "revdelete-unrestricted": "Yyschränkige fir Ammanne ufghobe",
-       "logentry-move-move": "$1 het d Syte $3 nooch $4 verschobe",
+       "logentry-move-move": "{{GENDER:$2|Dr|D}} $1 het d Seite $3 uf $4 verschobe",
        "logentry-move-move-noredirect": "$1 het d Syte $3 nooch $4 verschobe ohni e Wyterleitig aazlege",
        "logentry-move-move_redir": "$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe",
        "logentry-move-move_redir-noredirect": "$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege",
        "logentry-patrol-patrol": "$1 het Version $4 vo Syte $3 als kontrolliert markiert",
        "logentry-patrol-patrol-auto": "$1 het Version $4 vo Syte $3 automatisch als kontrolliert markiert",
        "logentry-newusers-newusers": "Benutzerkonto $1 isch aagleit wore.",
-       "logentry-newusers-create": "Benutzerkonto $1 isch aagleit wore.",
+       "logentry-newusers-create": "Benutzerkonto $1 {{GENDER:$2|isch aagleit wore}}",
        "logentry-newusers-create2": "Benutzerkonto $3 isch aalgeit wore vu $1",
        "logentry-newusers-autocreate": "S Benutzerchonto $1 isch automatisch erstellt worde",
        "logentry-rights-rights": "$1 het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
        "logentry-rights-rights-legacy": "$1 het d Gruppezuegherigkeit fir $3 gänderet",
        "logentry-rights-autopromote": "$1 isch automatisch vu $4 zue $5 zuegordnet wore",
+       "logentry-upload-upload": "{{GENDER:$2|Dr|D}} $1 het $3 uffeglade",
        "rightsnone": "(keini)",
        "revdelete-summary": "Zämmefassig",
        "feedback-adding": "Ruggmäldig wird zur Syte dezuegfiegt …",
        "expand_templates_remove_comments": "Kommentar useneh",
        "expand_templates_remove_nowiki": "<nowiki>-Befähl im Ergebnis unterdrucke",
        "expand_templates_generate_xml": "Zeig XML-Parser-Baum",
-       "expand_templates_preview": "Vorschou"
+       "expand_templates_preview": "Vorschou",
+       "special-characters-group-latin": "Latynisch",
+       "special-characters-group-latinextended": "Latin Extended",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Symbol",
+       "special-characters-group-greek": "Griechisch",
+       "special-characters-group-cyrillic": "Kyrillisch",
+       "special-characters-group-arabic": "Arabisch",
+       "special-characters-group-arabicextended": "Erwyyterts Arabisch",
+       "special-characters-group-persian": "Persisch",
+       "special-characters-group-hebrew": "Hebräisch",
+       "special-characters-group-bangla": "Bengalisch",
+       "special-characters-group-tamil": "Tamilisch",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Singhalesisch",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer"
 }
index 681e60d..046f7e5 100644 (file)
        "revdelete-submit": "પસંદ કરેલા {{PLURAL:$1|ફેરફાર|ફેરફારો}} પર લગાડો",
        "revdelete-success": "પુનરાવર્તન દ્રશ્યતા સફળતા પૂર્વક અદ્યતન બનાવાઈ",
        "revdelete-failure": "'''પુનરાવર્તનની દ્રશ્યતા બદલીન શકાઈ:'''\n$1",
-       "logdelete-success": "<strong>લોગની દ્રશ્યતા સફળતાપૂર્વક ગોઠવાઈ</strong>",
+       "logdelete-success": "લોગની દ્રશ્યતા સફળતાપૂર્વક ગોઠવાઈ",
        "logdelete-failure": "'''લોગની દ્રશ્યતા ગોઠવી ન શકાઈ :'''\n$1",
        "revdel-restore": "દૃષ્ટિક્ષમતા બદલો",
        "pagehist": "પાનાનો ઇતિહાસ",
        "import-interwiki-history": "આ પાનું બધા ફેરફારોના ઇતિહાસ સાથે આયાત કરો",
        "import-interwiki-templates": "બધા ઢાંચા શામિલ કરો",
        "import-interwiki-submit": "આયાત કરો",
-       "import-interwiki-namespace": "લક્ષ્ય નામ સ્થળ",
        "import-upload-filename": "ફાઇલ નામ",
        "import-comment": "ટિપ્પણી:",
        "importtext": "કૃપયા [[Special:Export|export utility]] વાપરી વિકિ સ્રોત પરથી ફાઇલ નિકાસ કરો.\nતેને તમારા કૉમ્પ્યુટર પર સાચવો અને અહીં ચડાવો.",
index 1c36479..e7d2d68 100644 (file)
@@ -28,7 +28,8 @@
                        "תומר ט",
                        "Matanya",
                        "GilCahana",
-                       "Ldorfman"
+                       "Ldorfman",
+                       "LaG roiL"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "go": "הצגה",
        "searcharticle": "לדף",
        "history": "היסטוריית הדף",
-       "history_short": "×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£",
+       "history_short": "×\94×\99ס×\98×\95ר×\99×\94",
        "updatedmarker": "עודכן מאז ביקורך האחרון",
        "printableversion": "גרסת הדפסה",
        "permalink": "קישור קבוע",
        "history-feed-description": "היסטוריית הגרסאות של הדף הזה בוויקי",
        "history-feed-item-nocomment": "$1 ב־$2",
        "history-feed-empty": "הדף המבוקש לא נמצא.\nייתכן שהוא נמחק, או ששמו שונה.\nבאפשרותך לנסות [[Special:Search|לחפש]] דפים רלוונטיים חדשים.",
+       "history-edit-tags": "עריכת התגיות של הגרסאות שנבחרו",
        "rev-deleted-comment": "(תקציר העריכה הוסר)",
        "rev-deleted-user": "(שם המשתמש הוסר)",
        "rev-deleted-event": "(פרטים מהיומן הוסרו)",
        "rev-showdeleted": "הצגה",
        "revisiondelete": "מחיקה ושחזור של גרסאות",
        "revdelete-nooldid-title": "גרסת מטרה בלתי תקינה",
-       "revdelete-nooldid-text": "×\94×\92רס×\94 ×\90×\95 ×\94×\92רס×\90×\95ת ×¢×\9c×\99×\94×\9f ×ª×\91×\95צע ×¤×¢×\95×\9c×\94 ×\96×\95 ×\90×\99× ×\9f ×ª×§×\99× ×\95ת. ×\99×\99ת×\9b×\9f ×©×\9c×\90 ×¦×\99×\99נת ×\90×\95ת×\9f, ×\99×\99ת×\9b×\9f ×©×\94×\92רס×\94 ×\90×\99× ×\94 ×§×\99×\99×\9eת, ×\95×\99×\99ת×\9b×\9f ×©×\94× ×\9a ×\9eנס×\94 להסתיר את הגרסה הנוכחית.",
+       "revdelete-nooldid-text": "×\90×\95 ×©×\9c×\90 ×¦×\99×\99נת ×©×\95×\9d ×\92רס×\94 ×©×\94פע×\95×\9c×\94 ×ª×\91×\95צע ×¢×\9c×\99×\94, ×\90×\95 ×©×\94×\92רס×\94 ×©×¦×\99×\99נת ×\90×\99× ×\94 ×§×\99×\99×\9eת, ×\90×\95 ×©× ×\99ס×\99ת להסתיר את הגרסה הנוכחית.",
        "revdelete-no-file": "הקובץ שציינת אינו קיים.",
        "revdelete-show-file-confirm": "האם אתם בטוחים שברצונכם לצפות בגרסה המחוקה של הקובץ \"<nowiki>$1</nowiki>\" מתאריך $3, $2?",
        "revdelete-show-file-submit": "כן",
        "right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
        "right-passwordreset": "צפייה בדואר אלקטרוני של איפוס סיסמה",
        "right-managechangetags": "יצירת ומחיקת [[Special:Tags|תגיות]] מבסיס הנתונים",
+       "right-applychangetags": "החלת [[Special:Tags|תגיות]] יחד עם שינויים",
+       "right-changetags": "הוספת והסרה של [[Special:Tags|תגיות]] כלשהן לגרסאות מסוימות ולרשומות יומן",
        "newuserlogpage": "יומן רישום משתמשים",
        "newuserlogpagetext": "זהו יומן המכיל הרשמות של משתמשים.",
        "rightslog": "יומן תפקידים",
        "action-editmyprivateinfo": "לערוך את המידע הפרטי שלך",
        "action-editcontentmodel": "לערוך את מודל התוכן של דף",
        "action-managechangetags": "ליצור ולמחוק תגיות מבסיס הנתונים",
+       "action-applychangetags": "להחיל תגיות יחד עם השינויים שלכם",
+       "action-changetags": "להוסיף ולהסיר תגיות כלשהן לגרסאות מסוימות ולרשומות יומן",
        "nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
        "enhancedrc-history": "היסטוריה",
        "listfiles-delete": "מחיקה",
        "listfiles-summary": "דף מיוחד זה מציג את כל הקבצים שהועלו.",
        "listfiles_search_for": "חיפוש קובץ מדיה בשם:",
+       "listfiles-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
        "imgfile": "קובץ",
        "listfiles": "רשימת קבצים",
        "listfiles_thumb": "תמונה ממוזערת",
        "logempty": "אין פריטים תואמים ביומן.",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "הצגת/הסתרת פעולות היומן שנבחרו",
+       "log-edit-tags": "עריכת התגיות של רשומות היומן שנבחרו",
        "allpages": "כל הדפים",
        "nextpage": "הדף הבא ($1)",
        "prevpage": "הדף הקודם ($1)",
        "emailccsubject": "העתק של הודעתך למשתמש $1: $2",
        "emailsent": "הדואר נשלח",
        "emailsenttext": "הודעת הדואר האלקטרוני שלך נשלחה.",
-       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"שליחת דואר אלקטרוני למשתמש זה\" באתר {{SITENAME}}.",
+       "emailuserfooter": "דואר זה נשלח על־ידי $1 ל{{GRAMMAR:תחילית|$2}} באמצעות פעולת \"{{int:emailpage}}\" ב{{GRAMMAR:תחילית|{{SITENAME}}}}.",
        "usermessage-summary": "השארת הודעת מערכת.",
        "usermessage-editor": "שולח הודעות המערכת",
        "watchlist": "רשימת המעקב",
        "import-interwiki-history": "העתקת כל היסטוריית העריכות של דף זה",
        "import-interwiki-templates": "ייבוא גם של כל התבניות המוכללות בדף",
        "import-interwiki-submit": "ייבוא",
-       "import-interwiki-namespace": "העתקה למרחב השם:",
-       "import-interwiki-rootpage": "דף הבסיס של היעד (לא חובה):",
+       "import-mapping-default": "ייבוא למקומות ברירת המחדל",
+       "import-mapping-namespace": "ייבוא למרחב השם:",
+       "import-mapping-subpage": "ייבוא כדפי משנה של הדף הבא:",
        "import-upload-filename": "שם הקובץ:",
        "import-comment": "הערה:",
        "importtext": "נא לייצא את הקובץ מאתר המקור באמצעות ב[[Special:Export|כלי הייצוא]].\nשמרו אותו למחשב שלכם והעלו אותו לכאן.",
        "tooltip-n-portal": "אודות המיזם, כיצד תוכלו לעזור, היכן למצוא דברים",
        "tooltip-n-currentevents": "מציאת מידע רקע על האירועים האחרונים",
        "tooltip-n-recentchanges": "רשימת השינויים האחרונים באתר",
-       "tooltip-n-randompage": "צפ×\99×\99×\94 ×\91×\93×£ ×ª×\95×\9b×\9f אקראי",
+       "tooltip-n-randompage": "×\98×¢×\99נת ×\93×£ אקראי",
        "tooltip-n-help": "עזרה בשימוש באתר",
        "tooltip-t-whatlinkshere": "רשימת כל הדפים המקושרים לכאן",
        "tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
        "pageinfo-protect-cascading-yes": "כן",
        "pageinfo-protect-cascading-from": "דף זה מוגן בשל הגנה מדורגת על",
        "pageinfo-category-info": "מידע על הקטגוריה",
+       "pageinfo-category-total": "מספר החברים הכולל",
        "pageinfo-category-pages": "מספר הדפים",
        "pageinfo-category-subcats": "מספר קטגוריות המשנה",
        "pageinfo-category-files": "מספר הקבצים",
        "patrol-log-page": "יומן שינויים בדוקים",
        "patrol-log-header": "יומן זה מציג גרסאות שנבדקו.",
        "log-show-hide-patrol": "$1 יומן שינויים בדוקים",
+       "log-show-hide-tag": "$1 יומן התגיות",
        "deletedrevision": "מחק גרסה ישנה $1",
        "filedeleteerror-short": "שגיאה במחיקת הקובץ: $1",
        "filedeleteerror-long": "שגיאות שאירעו בעת מחיקת הקובץ:\n\n$1",
        "tags-deactivate-reason": "הסבר:",
        "tags-deactivate-not-allowed": "לא ניתן לבטל את הפעלת התגית \"$1\".",
        "tags-deactivate-submit": "ביטול הפעלה",
+       "tags-apply-no-permission": "אין לך הרשאה להחיל תגיות שינויים יחד עם השינויים שלך.",
+       "tags-apply-not-allowed-one": "לא ניתן להחיל את התגית \"$1\" ידנית.",
+       "tags-apply-not-allowed-multi": "לא ניתן להחיל את {{PLURAL:$2|התגית הבאה|התגיות הבאות}} ידנית: $1",
+       "tags-update-no-permission": "אין לך הרשאה להוסיף או להסיר תגיות שינויים לגרסאות מסוימות או לרשומות יומן.",
+       "tags-update-add-not-allowed-one": "לא ניתן להוסיף את התגית \"$1\" ידנית.",
+       "tags-update-add-not-allowed-multi": "לא ניתן להוסיף את {{PLURAL:$2|התגית הבאה|התגיות הבאות}} ידנית: $1",
+       "tags-update-remove-not-allowed-one": "לא ניתן להסיר את התגית \"$1\".",
+       "tags-update-remove-not-allowed-multi": "לא ניתן להסיר את {{PLURAL:$2|התגית הבאה|התגיות הבאות}} ידנית: $1",
+       "tags-edit-title": "עריכת תגיות",
+       "tags-edit-manage-link": "ניהול תגיות",
+       "tags-edit-revision-selected": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|פעולת היומן שנבחרה|פעולות היומן שנבחרו}}:",
+       "tags-edit-revision-legend": "הוספה של תגיות {{PLURAL:$1|לגרסה הזאת|לכל $1 הגרסאות}} או הסרתן",
+       "tags-edit-logentry-legend": "הוספה של תגיות {{PLURAL:$1|לרשומת היומן הזאת|לכל $1 רשומות היומן}} או הסרתן",
+       "tags-edit-existing-tags": "תגיות קיימות:",
+       "tags-edit-existing-tags-none": "''אין''",
+       "tags-edit-new-tags": "תגיות חדשות:",
+       "tags-edit-add": "הוספת התגיות הבאות:",
+       "tags-edit-remove": "הסרת התגיות הבאות:",
+       "tags-edit-remove-all-tags": "(הסרת כל התגיות)",
+       "tags-edit-chosen-placeholder": "בחירת תגיות מסוימות",
+       "tags-edit-chosen-no-results": "לא נמצאו תגיות מתאימות",
+       "tags-edit-reason": "סיבה:",
+       "tags-edit-revision-submit": "החלת שינויים {{PLURAL:$1|לגרסה הזאת|ל־$1 גרסאות}}",
+       "tags-edit-logentry-submit": "החלת שינויים {{PLURAL:$1|לרשומת היומן הזאת|ל־$1 רשומת היומן}}",
+       "tags-edit-success": "השינויים הוחלו בהצלחה.",
+       "tags-edit-failure": "החלת השינויים נכשלה:\n$1",
+       "tags-edit-nooldid-title": "גרסת היעד אינה תקינה",
+       "tags-edit-nooldid-text": "או שלא ציינת שום גרסה שהפעולה תבוצע עליה, או שהגרסה שציינת אינה קיימת.",
+       "tags-edit-none-selected": "יש לבחור לפחות תגית אחת להוספה או להסרה.",
        "comparepages": "השוואת דפים",
        "compare-page1": "דף 1",
        "compare-page2": "דף 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|מחק|מחקה}} את התגית \"4$\" (שהוסרה {{PLURAL:$5|מגרסה אחת/פריט יומן אחד|מ־$5 גרסאות ו/או פריטי יומן}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|הפעיל|הפעילה}} את התגית \"$4\" לשימוש על־ידי משתמשים ובוטים",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|ביטל|ביטלה}} את הפעלת התגית \"$4\" לשימוש על־ידי משתמשים ובוטים",
+       "log-name-tag": "יומן תגיות",
+       "log-description-tag": "הדף הזה מראה מתי משתמשים הוסיפו [[Special:Tags|תגיות]] לגרסאות או רשומות יומן מסוימות או הסירו אותן. היומן אינו מציג פעולות תיוג שבוצעו כחלק מעריכה, מחיקה או פעולה דומה.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|הוסיף|הוסיפה}} את {{PLURAL:$7|התגית|התגיות}} $6 לגרסה $4 של הדף $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|הוסיף|הוסיפה}} את {{PLURAL:$7|התגית|התגיות}} $6 לרשומת היומן $5 של הדף $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|הסיר|הסירה}} את {{PLURAL:$9|התגית|התגיות}} $8 מהגרסה $4 של הדף $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|הסיר|הסירה}} את {{PLURAL:$9|התגית|התגיות}} $8 מרשומת היומן $5 של הדף $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות בגרסה $4 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|עדכן|עדכנה}} את התגיות ברשומת היומן $5 של הדף $3 ({{PLURAL:$7|הוסיף|הוסיפה}} את $6; {{PLURAL:$9|הסיר|הסירה}} את $8)",
        "rightsnone": "(כלום)",
        "revdelete-summary": "תקציר העריכה",
        "feedback-adding": "הוספת משוב לדף...",
        "feedback-error1": "שגיאה: תוצאה לא מזוהה מה־API",
        "feedback-error2": "שגיאה: העריכה נכשלה",
        "feedback-error3": "שגיאה: אין תשובה מה־API",
+       "feedback-error4": "שגיאה: לא ניתן לשלוח הודעה לכותרת המשוב המבוקשת",
        "feedback-message": "הודעה:",
        "feedback-subject": "נושא:",
        "feedback-submit": "שליחה",
        "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: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* הורדת קבצי tar של עיצובים ספציפיים מ־[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* שכפול (clone) אחד מהמאגרים ב־<code dir=\"ltr\">mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code dir=\"ltr\">skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏מאגר ה־git שלכם אם אתם מפתחים של מדיה־ויקי.\n\n; אם כרגע שדרגתם את מדיה־ויקי:\n: מדיה־ויקי 1.24 וגרסאות חדשות יותר כבר לא מפעילות עיצובים מותקנים באופן אוטומטי (ראו [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": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם, שמוגדר ב־<code dir=\"ltr\">$wgDefaultSkin</code> כ־<code>$1</code>, אינו זמין.\n\nנראה שההתקנה שלכם כוללת את {{PLURAL:$4|העיצוב|העיצובים}} הבאים. ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל {{PLURAL:$4|אותו|אותם ולבחור את עיצוב ברירת המחדל}}.\n\n$2\n\n; אם כרגע התקנתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* הורדת קבצי tar של עיצובים ספציפיים מ־[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* שכפול (clone) אחד מהמאגרים ב־<code dir=\"ltr\">mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code dir=\"ltr\">skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏מאגר ה־git שלכם אם אתם מפתחים של מדיה־ויקי.\n\n; אם כרגע שדרגתם את מדיה־ויקי:\n: מדיה־ויקי 1.24 וגרסאות חדשות יותר כבר לא מפעילות עיצובים מותקנים באופן אוטומטי (ראו [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery \"גילוי אוטומטי של עיצובים\" במדריך]). תוכלו להעתיק את {{PLURAL:$5|השורה הבאה|השורות הבאות}} לתוך הקובץ <code>LocalSettings.php</code> כדי להפעיל את {{PLURAL:$5|העיצוב שמותקן|כל העיצובים שמותקנים}} כעת.\n\n<pre dir=\"ltr\">$3</pre>\n\n; אם כרגע שיניתם את <code>LocalSettings.php</code>:\n: בדקו שנית האם עשיתם שגיאות הקלדה בשמות העיצובים.",
        "default-skin-not-found-no-skins": "אופס! עיצוב ברירת המחדל עבור אתר הוויקי שלכם, שמוגדר ב־<code dir=\"ltr\">$wgDefaultSkin</code> כ־<code>$1</code>, אינו זמין.\n\nאין לכם עיצובים מותקנים.\n\n; אם כרגע התקנתם או שדרגתם את מדיה־ויקי:\n: נראה שזו התקנה מ־git, או ישירות מקוד המקור בשיטה אחרת כלשהי. במקרה הזה, בעיה זו צפויה. מדיה־ויקי 1.24 וגרסאות חדשות יותר אינן כוללות עיצובים ב־git repository הראשי. נסו להתקין כמה עיצובים מ[https://www.mediawiki.org/wiki/Category:All_skins ספריית העיצובים של mediawiki.org], על־ידי:\n:* הורדת [https://www.mediawiki.org/wiki/Download קובץ ה‏‏־tar להתקנה], שכולל מספר עיצובים והרחבות. באפשרותכם להעתיק ולהדביק מתוכו את תיקיית ה‏‏־<code>skins/</code>.\n:* הורדת קבצי tar של עיצובים ספציפיים מ־[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* שכפול (clone) אחד ממאגרים ב־<code>mediawiki/skins/*</code> בעזרת git לתוך תיקיית ה־<code dir=\"ltr\">skins/</code> בהתקנת מדיה־ויקי שלכם.\n: אם תעשו זאת, זה לא אמור להפריע ל‏‏מאגר ה־git שלכם (אם אתם מפתחים של מדיה־ויקי). ראו מידע בדף [https://www.mediawiki.org/wiki/Manual:Skin_configuration \"הגדרת עיצובים\" במדריך] על האפשרות להפעיל עיצובים ולבחור את עיצוב ברירת המחדל.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (מופעל)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''מבוטל''')",
index a5f5815..48f709b 100644 (file)
                        "Phoenix303",
                        "Steinsplitter",
                        "Macofe",
-                       "Ankita-ks"
+                       "Ankita-ks",
+                       "Sahilrathod"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
-       "tog-hideminor": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 में छोटे बदलाव छिपाएँ",
-       "tog-hidepatrolled": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤¬à¤¦à¤²à¤¾à¤µà¥\8bà¤\82 में परीक्षित बदलाव छिपाएँ",
-       "tog-newpageshidepatrolled": "नà¤\8f पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ",
+       "tog-hideminor": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन में छोटे बदलाव छिपाएँ",
+       "tog-hidepatrolled": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन में परीक्षित बदलाव छिपाएँ",
+       "tog-newpageshidepatrolled": "नयà¥\87 पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ",
        "tog-extendwatchlist": "केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें",
-       "tog-usenewrc": "हाल à¤®à¥\87à¤\82 à¤¹à¥\81à¤\8f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\94र à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¥\8bà¤\82 à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤\85नà¥\81सार à¤¸à¤®à¥\82हà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤¬à¤¾à¤\81à¤\9fà¥\87à¤\82",
+       "tog-usenewrc": "हाल में हुए परिवर्तनों और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करें",
-       "tog-showtoolbar": "समà¥\8dपादन à¤\94à¤\9c़ारपट्टी दिखाएँ",
-       "tog-editondblclick": "दà¥\81à¤\97à¥\81नà¥\87 क्लिक पर पृष्ठ संपादित करें",
+       "tog-showtoolbar": "समà¥\8dपादन à¤\89पà¤\95रण पट्टी दिखाएँ",
+       "tog-editondblclick": "दà¥\8bà¤\97à¥\81ना क्लिक पर पृष्ठ संपादित करें",
        "tog-editsectiononrightclick": "अनुभाग शीर्षक पर दायाँ क्लिक करने पर अनुभाग सम्पादित करें",
        "tog-watchcreations": "मेरे द्वारा निर्मित पृष्ठों और मेरी अपलोड की फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdefault": "मेरे द्वारा सम्पादित पृष्ठों और फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchmoves": "मेरे द्वारा स्थानांतरित पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchdeletion": "मेरे द्वारा हटाए गए पृष्ठों एवं फ़ाइलों को मेरी ध्यानसूची में जोड़ें",
        "tog-watchrollback": "मेरे द्वारा प्रत्यापन्न (रोलबैक) किये हुये पृष्ठों को मेरी ध्यानसूची में जोड़ें।",
-       "tog-minordefault": "मेरे सभी सम्पादन छोटे बदलाव हैं",
-       "tog-previewontop": "समà¥\8dपादन à¤¬à¤\95à¥\8dसà¥\87 à¤\95à¥\87 à¤\8aपर à¤\9dलà¤\95 à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
-       "tog-previewonfirst": "पà¥\8dरथम à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\9dलà¤\95 à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
-       "tog-enotifwatchlistpages": "मेरी ध्यानसूची में दर्ज किसी भी पृष्ठ अथवा फ़ाइल में परिवर्तन होने पर मुझे ई-मेल करें",
-       "tog-enotifusertalkpages": "मेरा वार्ता पृष्ठ परिवर्तित होने पर मुझे ई-मेल करें",
-       "tog-enotifminoredits": "छोटे परिवर्तनों के लिए भी मुझे ई-मेल भेजें",
-       "tog-enotifrevealaddr": "अधिसूचना ई-मेल में मेरा ई-मेल पता दर्शाएँ",
-       "tog-shownumberswatching": "धà¥\8dयान à¤°à¤\96नà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¤\82à¤\96à¥\8dया à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
+       "tog-minordefault": "मेरे सभी सम्पादनों को छोटे बदलाव के रूप में चिह्नित करें",
+       "tog-previewontop": "समà¥\8dपादन à¤¸à¤¨à¥\8dदà¥\82à¤\95 à¤¸à¥\87 à¤ªà¤¹à¤²à¥\87 à¤\9dलà¤\95 à¤¦à¤¿à¤\96ायà¥\87à¤\82",
+       "tog-previewonfirst": "पà¥\8dरथम à¤¸à¤®à¥\8dपादन à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\9dलà¤\95 à¤¦à¤¿à¤\96ायà¥\87à¤\82",
+       "tog-enotifwatchlistpages": "मेरी ध्यानसूची में दर्ज किसी भी पृष्ठ अथवा फ़ाइल में परिवर्तन होने पर मुझे ईमेल करें",
+       "tog-enotifusertalkpages": "मेरा वार्ता पृष्ठ परिवर्तित होने पर मुझे ईमेल करें",
+       "tog-enotifminoredits": "छोटे परिवर्तनों के लिए भी मुझे ईमेल भेजें",
+       "tog-enotifrevealaddr": "अधिसूचना ईमेल में मेरा ईमेल पता दर्शायें",
+       "tog-shownumberswatching": "धà¥\8dयान à¤°à¤\96नà¥\87 à¤µà¤¾à¤²à¥\87 à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¤\82à¤\96à¥\8dया à¤¦à¤¿à¤\96ायà¥\87à¤\82",
        "tog-oldsig": "वर्तमान हस्ताक्षर:",
        "tog-fancysig": "हस्ताक्षर का विकिपाठ के समान मानें (बिना स्वचालित कड़ी के)",
        "tog-uselivepreview": "सजीवन झलक का उपयोग करें",
        "tog-forceeditsummary": "यदि सम्पादन सारांश ना दिया गया हो तो मुझे सूचित करें",
        "tog-watchlisthideown": "मेरी ध्यानसूची से मेरे किए परिवर्तन छिपाएँ",
-       "tog-watchlisthidebots": "मेरी ध्यानसूची से बॉटों द्वारा किए परिवर्तन छिपाएँ",
+       "tog-watchlisthidebots": "मेरी ध्यानसूची से बॉट द्वारा किए परिवर्तन छिपाएँ",
        "tog-watchlisthideminor": "मेरी ध्यानसूची से छोटे परिवर्तन छिपाएँ",
        "tog-watchlisthideliu": "मेरी ध्यानसूची में सत्रारम्भित सदस्यों के सम्पादन न दिखाएँ",
-       "tog-watchlisthideanons": "à¤\86à¤\87॰पà¥\80 à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤¦à¥\8dवारा à¤\95िà¤\8f à¤¸à¤®à¥\8dपादनà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
+       "tog-watchlisthideanons": "à¤\86à¤\88॰पà¥\80॰ à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤¦à¥\8dवारा à¤\95िà¤\8f à¤¸à¤®à¥\8dपादनà¥\8bà¤\82 à¤\95à¥\8b à¤®à¥\87रà¥\80 à¤§à¥\8dयानसà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¨ à¤¦à¤¿à¤\96ायà¥\87à¤\82",
        "tog-watchlisthidepatrolled": "परीक्षित सम्पादन मेरी ध्यानसूची में छुपाएँ",
-       "tog-ccmeonemails": "मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤­à¥\87à¤\9cà¥\87 à¤\88-मà¥\87लà¥\8bà¤\82 की प्रतियाँ मुझे भी भेजें",
-       "tog-diffonly": "à¤\85वतरणà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\85नà¥\8dतर à¤¦à¤°à¥\8dशातà¥\87 à¤¸à¤®à¤¯ à¤ªà¥\81रानà¥\87 à¤\85वतरण à¤¨ à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
-       "tog-showhiddencats": "à¤\9bिपाà¤\88 à¤¹à¥\81à¤\88 à¤¶à¥\8dरà¥\87णियाà¤\81 à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
-       "tog-norollbackdiff": "समà¥\8dपादन à¤µà¤¾à¤ªà¤¸ à¤²à¥\87नà¥\87 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨ à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
+       "tog-ccmeonemails": "मà¥\87रà¥\87 à¤¦à¥\8dवारा à¤\85नà¥\8dय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\8b à¤­à¥\87à¤\9cà¥\80 à¤\9cानà¥\87 à¤µà¤¾à¤²à¥\80 à¤\88मà¥\87ल की प्रतियाँ मुझे भी भेजें",
+       "tog-diffonly": "à¤\85वतरणà¥\8bà¤\82 à¤®à¥\87à¤\82 à¤\85नà¥\8dतर à¤¦à¤°à¥\8dशातà¥\87 à¤¸à¤®à¤¯ à¤ªà¥\81रानà¥\87 à¤\85वतरण à¤¨ à¤¦à¤¿à¤\96ायà¥\87à¤\82",
+       "tog-showhiddencats": "à¤\9bिपाà¤\88 à¤¹à¥\81à¤\88 à¤¶à¥\8dरà¥\87णियाà¤\81 à¤¦à¤¿à¤\96ायà¥\87à¤\82",
+       "tog-norollbackdiff": "समà¥\8dपादन à¤µà¤¾à¤ªà¤¸ à¤²à¥\87नà¥\87 à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85नà¥\8dतर à¤¨ à¤¦à¤¿à¤\96ायà¥\87à¤\82",
        "tog-useeditwarning": "जब मैं किसी सम्पादन पृष्ठ को बिना सहेजे बदलावों के साथ छोड़ूँ तो मुझे सूचित करें।",
        "tog-prefershttps": "लॉगिन करने के पश्चात् सदैव सुरक्षित कनेक्शन का प्रयोग करें",
        "underline-always": "सदैव",
        "underline-never": "कभी नहीं",
-       "underline-default": "तà¥\8dवà¤\9aा à¤¯à¤¾ à¤¬à¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dà¤\9f",
+       "underline-default": "पà¥\8dराथमिà¤\95 à¤¤à¥\8dवà¤\9aा à¤¯à¤¾ à¤¬à¥\8dराà¤\89à¤\9c़र",
        "editfont-style": "सम्पादन क्षेत्र की मुद्रलिपि शैली:",
-       "editfont-default": "बà¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dà¤\9f",
+       "editfont-default": "पà¥\8dराथमिà¤\95 à¤¬à¥\8dराà¤\89à¤\9c़र",
        "editfont-monospace": "एकल स्थल मुद्रलिपि",
        "editfont-sansserif": "बिना नोकों वाली मुद्रलिपि",
        "editfont-serif": "नोकों वाली मुद्रलिपि",
        "oct": "अक्टू॰",
        "nov": "नव॰",
        "dec": "दिस॰",
-       "january-date": "जनवरी $1",
-       "february-date": "फ़रवरी $1",
-       "march-date": "मार्च $1",
-       "april-date": "अप्रैल $1",
-       "may-date": "मई $1",
-       "june-date": "जून $1",
-       "july-date": "जुलाई $1",
-       "august-date": "अगस्त $1",
-       "september-date": "सितम्बर $1",
-       "october-date": "अक्टूबर $1",
-       "november-date": "नवम्बर $1",
-       "december-date": "दिसम्बर $1",
+       "january-date": "$1 जनवरी",
+       "february-date": "$1 फ़रवरी",
+       "march-date": "$1 मार्च",
+       "april-date": "$1 अप्रैल",
+       "may-date": "$1 मई",
+       "june-date": "$1 जून",
+       "july-date": "$1 जुलाई",
+       "august-date": "$1 अगस्त",
+       "september-date": "$1 सितम्बर",
+       "october-date": "$1 अक्टूबर",
+       "november-date": "$1 नवम्बर",
+       "december-date": "$1 दिसम्बर",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणियाँ}}",
        "category_header": "\"$1\" श्रेणी में पृष्ठ",
        "subcategories": "उपश्रेणियाँ",
        "category-media-header": "\"$1\" श्रेणी में मीडिया",
-       "category-empty": "''इस श्रेणी में इस समय कोई पृष्ठ या मीडिया नहीं हैं।''",
+       "category-empty": "<em>इस श्रेणी में इस समय कोई पृष्ठ या मीडिया नहीं हैं।</em>",
        "hidden-categories": "{{PLURAL:$1|छुपाई हुई श्रेणी|छुपाई हुई श्रेणियाँ}}",
        "hidden-category-category": "छुपाई हुई श्रेणियाँ",
-       "category-subcat-count": "{{PLURAL:$2|इस श्रेणी में केवल निम्नलिखित उपश्रेणी है|इस श्रेणी में निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणियाँ}} हैं, कुल उपश्रेणियाँ $2}}",
+       "category-subcat-count": "{{PLURAL:$2|इस श्रेणी में केवल निम्नलिखित उपश्रेणी है।|इस श्रेणी की कुल $2 में से {{PLURAL:$1|उपश्रेणी निम्नलिखित है।|$1 उपश्रेणियाँ निम्नलिखित हैं।}}}}",
        "category-subcat-count-limited": "इस श्रेणी में निम्नलिखित {{PLURAL:$1|उपश्रेणी है|$1 उपश्रेणियाँ हैं}}।",
        "category-article-count": "{{PLURAL:$2|इस श्रेणी में केवल निम्नलिखित पृष्ठ है।|इस श्रेणी में निम्नलिखित {{PLURAL:$1|पृष्ठ है|$1 पृष्ठ हैं}}, कुल पृष्ठ $2}}",
        "category-article-count-limited": "निम्नलिखित {{PLURAL:$1|पृष्ठ|$1 पृष्ठ}} इस श्रेणी में हैं।",
        "category-file-count": "{{PLURAL:$2|इस श्रेणी में केवल निम्नलिखित फ़ाइल है।|इस श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल|$1 फ़ाइलें}} हैं, कुल फ़ाइलें $2}}",
        "category-file-count-limited": "इस श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल है।|फ़ाइलें हैं।}}",
-       "listingcontinuesabbrev": "à¤\86à¤\97à¥\87.",
+       "listingcontinuesabbrev": "à¤\9cारà¥\80",
        "index-category": "सूचीबद्ध पृष्ठ",
        "noindex-category": "असूचीबद्ध पृष्ठ",
        "broken-file-category": "टूटी हुई फ़ाइल कड़ियों वाले पृष्ठ",
        "about": "के बारे में",
-       "article": "लेख",
+       "article": "सामà¤\97à¥\8dरà¥\80 à¤²à¥\87à¤\96",
        "newwindow": "(नई विंडो में खुलता है)",
        "cancel": "रद्द करें",
        "moredotdotdot": "और...",
-       "morenotlisted": "यह à¤ªà¥\82रà¥\80 à¤¸à¥\82à¤\9aà¥\80 नहीं है।",
+       "morenotlisted": "यह à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण नहीं है।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
-       "anontalk": "à¤\87स à¤\86à¤\87॰पी के लिये वार्ता",
+       "anontalk": "à¤\87स à¤\86à¤\88॰पी के लिये वार्ता",
        "navigation": "भ्रमण",
        "and": "&#32;और",
-       "qbfind": "खोज",
+       "qbfind": "खोजें",
        "qbbrowse": "ब्राउज़",
        "qbedit": "सम्पादन",
        "qbpageoptions": "यह पृष्ठ",
        "qbmyoptions": "मेरे पृष्ठ",
-       "faq": "बहà¥\81धा à¤ªà¥\82à¤\9bे प्रश्न",
+       "faq": "à¤\85à¤\95à¥\8dसर à¤ªà¥\82à¤\9bà¥\87 à¤\9cानà¥\87 à¤µà¤¾à¤²े प्रश्न",
        "faqpage": "Project:अक्सर पूछे जाने वाले सवाल",
        "actions": "क्रियाएँ",
        "namespaces": "नामस्थान",
        "updatedmarker": "मेरे अन्तिम बार पधारने के बाद के अद्यतन",
        "printableversion": "छापने योग्य संस्करण",
        "permalink": "स्थायी कड़ी",
-       "print": "पà¥\8dरिà¤\82à¤\9f करें",
-       "view": "दरà¥\8dशाव",
+       "print": "मà¥\81दà¥\8dरित करें",
+       "view": "à¤\85वलà¥\8bà¤\95न",
        "view-foreign": "$1 पर देखें",
        "edit": "सम्पादन",
-       "edit-local": "स्थानीय विवरण सम्पादन",
+       "edit-local": "स्थानीय विवरण सम्पादन करें",
        "create": "बनाएँ",
-       "create-local": "सà¥\8dथानà¥\80य à¤µà¤¿à¤µà¤°à¤£ à¤¨à¤¿à¤°à¥\8dमाण",
-       "editthispage": "à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¬à¤¦à¤²ें",
+       "create-local": "सà¥\8dथानà¥\80य à¤µà¤¿à¤µà¤°à¤£ à¤\9cà¥\8bडà¥\87à¤\82",
+       "editthispage": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¤\82पादन à¤\95रें",
        "create-this-page": "यह पृष्ठ बनाएँ",
        "delete": "हटाएँ",
-       "deletethispage": "à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¹à¤\9fायà¥\87à¤\82",
+       "deletethispage": "à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤¹à¤\9fाà¤\8fà¤\81",
        "undeletethispage": "इस पृष्ठ को पुनर्स्थापित करें।",
        "undelete_short": "{{PLURAL:$1|एक हटाया गया|$1 हटाए गए}} बदलाव वापस लायें",
        "viewdeleted_short": "देखें {{PLURAL:$1|एक हटाया गया सम्पादन|$1 हटाए गए सम्पादन}}",
        "talkpage": "इस पृष्ठ के बारे में चर्चा करें",
        "talkpagelinktext": "चर्चा",
        "specialpage": "विशेष पृष्ठ",
-       "personaltools": "वà¥\88यà¤\95à¥\8dतिà¤\95 à¤\94à¤\9c़ार",
+       "personaltools": "वà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\89पà¤\95रण",
        "articlepage": "सामग्री पृष्ठ देखें",
        "talk": "चर्चा",
        "views": "दर्शाव",
-       "toolbox": "साधन à¤ªà¥\87à¤\9fà¥\80",
+       "toolbox": "à¤\89पà¤\95रण",
        "userpage": "सदस्य पृष्ठ देखें",
        "projectpage": "परियोजना पृष्ठ देखें",
        "imagepage": "फ़ाइल पृष्ठ देखें",
        "viewhelppage": "सहायता पृष्ठ देखें",
        "categorypage": "श्रेणी पृष्ठ देखें",
        "viewtalkpage": "चर्चा देखें",
-       "otherlanguages": "à¤\85नà¥\8dय à¤­à¤¾à¤·à¤¾à¤\8fà¤\81",
+       "otherlanguages": "à¤\85नà¥\8dय à¤­à¤¾à¤·à¤¾à¤\93à¤\82 à¤®à¥\87à¤\82",
        "redirectedfrom": "($1 से पुनर्निर्देशित)",
-       "redirectpagesub": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श à¤ªà¥\83षà¥\8dठ",
+       "redirectpagesub": "पà¥\83षà¥\8dठ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शित à¤\95रà¥\87à¤\82",
        "redirectto": "को अनुप्रेषित:",
        "lastmodifiedat": "इस पृष्ठ का पिछला बदलाव $1 को $2 बजे हुआ था।",
        "viewcount": "यह पृष्ठ {{PLURAL:$1|एक|$1}} बार देखा गया है।",
        "notextmatches": "किसी भी पृष्ठ में यह सामग्री नहीं मिली",
        "prevn": "पिछले {{PLURAL:$1|$1}}",
        "nextn": "अगले {{PLURAL:$1|$1}}",
+       "prev-page": "पिछला पृष्ठ",
+       "next-page": "अगला पृष्ठ",
        "prevn-title": "{{PLURAL:$1|पिछला|पिछले}} $1 परिणाम",
        "nextn-title": "{{PLURAL:$1|अगला|अगले}} $1 परिणाम",
        "shown-title": "हर पृष्ठ पर $1 {{PLURAL:$1|परिणाम}} दिखाएँ",
        "import-interwiki-history": "इस पृष्ठ के सभी इतिहास अवतरण कॉपी करें",
        "import-interwiki-templates": "सभी साँचे शामिल करें",
        "import-interwiki-submit": "आयात",
-       "import-interwiki-namespace": "गंतव्य नामस्थान:",
-       "import-interwiki-rootpage": "गंतव्य पृष्ठ उपसर्ग (वैकल्पिक):",
        "import-upload-filename": "संचिका नाम:",
        "import-comment": "टिप्पणी:",
        "importtext": "कृपया स्रोत विकि से संचिका निर्यातित करने के लिए [[Special:Export|निर्यात सुविधा]] का इस्तेमाल करें।\nइसे अपने संगणक पर सँजो के यहाँ चढ़ा दें।",
index ea835c9..012a86f 100644 (file)
@@ -30,6 +30,7 @@
        "tog-watchdefault": "Strony a dataje, kotrež wobdźěłuju, swojim wobkedźbowankam přidać",
        "tog-watchmoves": "Sam přesunjene strony a dataje wobkedźbowankam přidać",
        "tog-watchdeletion": "Sam wušmórnjene strony a dataje wobkedźbowankam přidać",
+       "tog-watchrollback": "Strony přidać, hdźež sym zawěsćenje swojich wobkedźbowankow přewjedł",
        "tog-minordefault": "Wšě změny standardnje jako snadne woznamjenić",
        "tog-previewontop": "Přehlad před wobdźěłanskim polom pokazać",
        "tog-previewonfirst": "Při prěnim wobdźěłanju přehlad pokazać",
        "viewyourtext": "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
        "protectedinterface": "Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.\nZo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
        "editinginterface": "<strong>Warnowanje:</strong> Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje  wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju.",
+       "translateinterface": "Zo by přełožki za wšě wikije přidał abo změnił, wužiwajće prošu [//translatewiki.net/ translatewiki.net], lokalizaciski projekt MediaWiki.",
        "cascadeprotected": "Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:\n$2",
        "namespaceprotected": "Nimaš dowolnosć, zo by stronu w mjenowym rumje '''$1''' wobdźěłał.",
        "customcssprotected": "Nimaš prawo, zo by tutu CSS-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.",
        "wrongpassword": "Hesło, kotrež sy zapodał, je wopačne. Prošu spytaj hišće raz.",
        "wrongpasswordempty": "Hesło, kotrež sy zapodał, běše prózdne. Prošu spytaj hišće raz.",
        "passwordtooshort": "Hesła dyrbja znajmjeńša {{PLURAL:$1|1 znamješko|$1 znamješce|$1 znamješka|$1 znamješkow}} měć.",
+       "passwordtoolong": "Hesła njesmědźa dlěše jako {{PLURAL:$1|1 znamješko|$1 znamješce|$1 znamješka|$1 znamješkow}} być.",
        "password-name-match": "Twoje hesło dyrbi so wot twojeho wužiwarskeho mjena rozeznać.",
        "password-login-forbidden": "Wužiwanje tutoho wužiwarskeho mjena a heska je zakazane.",
        "mailmypassword": "Hesło wróćo stajić",
        "createaccount-text": "Něchtó je wužiwarske konto za twoju e-mejlowu adresu na {{SITENAME}} ($4) z mjenom \"$2\" z hesłom \"$3\" wutworił. Ty měł so nětko přizjewić a swoje hesło změnić.\n\nMóžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiło.",
        "login-throttled": "Sy přehusto spytał so přizjewić. Počakaj prošu $1, prjedy hač hišće raz spytaš.",
        "login-abort-generic": "Twoje přizjewjenje njebě wuspěšne - přetorhnjene",
+       "login-migrated-generic": "Waše konto je so přesunyło, a waše wužiwarske mjeno na tutym wikiju hižo njeeksistuje.",
        "loginlanguagelabel": "Rěč: $1",
        "suspicious-userlogout": "Twoje naprašowanje za wotzjewjenje bu wotpokazane, dokelž zda so, jako by so přez wobškodźeny wobhladowak abo pufrowacy proksy pósłało",
        "createacct-another-realname-tip": "* Woprawdźite mjeno je opcionalne.\nJeli jo podaš, budźe so to wužiwać, zo by přinoški přirjadowało.",
        "preview": "Přehlad",
        "showpreview": "Přehlad pokazać",
        "showdiff": "Změny pokazać",
+       "blankarticle": "<strong>Warnowanje:</strong> Strona, kotruž wutworješ, je prózdna.\nJeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so strona bjez wobsaha wutworić.",
        "anoneditwarning": "<strong>Warnowanje:</strong> Njejsy přizjewjeny. Twoja IP-adresa budźe zjawnje widźomna, hdyž něšto změniš. Jeli <strong>[$1 so přizjewiš]</strong> abo <strong>[$2 konto załožiš]</strong>, so twoje změny twojemu wužiwarskemu mjenu připokazaja, nimo druhich lěpšinow.",
        "anonpreviewwarning": "''Njejsy přizjewjeny. Składowanje přenošuje twoju IP-adresu do wobdźěłowanskeje historije tuteje strony.''",
        "missingsummary": "'''Kedźbu:''' Njejsy žane zjeće zapodał. Jeli hišće raz na \"{{int:savearticle}}\" kliknješ, budźe so twoja změna bjez njeho składować.",
        "content-model-text": "luty tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Pródzny objekt",
+       "content-json-empty-array": "Prózdna pólna wariabla",
        "expensive-parserfunction-warning": "Warnowanje: Tuta strona wobsahuje přewjele parserowych wołanjow.\n\nDyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} měć, {{PLURAL:$1|je nětko $1 wołanje|stej nětko $1 wołanjej|su nětko $1 wołanja|je nětko $1 wołanjow}}.",
        "expensive-parserfunction-category": "Strony, kotrež tajke parserowe funkcije přehusto wołaja, kotrež serwer poćežuja.",
        "post-expand-template-inclusion-warning": "Warnowanje: Wulkosć zapřijatych předłohow je přewulka. Někotre předłohi so njezapřijmu.",
        "history-feed-description": "Stawizny wersijow za tutu stronu w {{GRAMMAR:lokatiw|{{SITENAME}}}}",
        "history-feed-item-nocomment": "$1 w $2 hodź.",
        "history-feed-empty": "Strona, kotruž sy požadał, njeeksistuje. Bu snano z wikija wotstronjena abo přesunjena. Móžeš tu [[Special:Search|w {{SITENAME}}]] za stronami z podobnym titulom pytać.",
+       "history-edit-tags": "Markěrowanja wubranych wersijow wobdźěłać",
        "rev-deleted-comment": "(Zjeće wotstronjene)",
        "rev-deleted-user": "(wužiwarske mjeno wotstronjene)",
        "rev-deleted-event": "(Protokolowe podrobnosće su so wotstronili)",
        "notextmatches": "Žane strony z wotpowědowacym tekstom",
        "prevn": "{{PLURAL:$1|předchadny $1|předchadnej $1|předchadne $1|předchadnych $1}}",
        "nextn": "{{PLURAL:$1|přichodny $1|přichodnej $1|přichodne $1|přichodnych $1}}",
+       "prev-page": "předchadna strona",
+       "next-page": "přichodna strona",
        "prevn-title": "{{PLURAL:$1|Předchadny wuslědk|Předchadnej $1 wuslědkaj|Předchadne $1 wuslědki|Předchadnych $1 wuslědkow}}",
        "nextn-title": "{{PLURAL:$1|Přichodny wuslědk|Přichodnej $1 wuslědkaj|Přichodne $1 wuslědki|Přichodnych $1 wuslědkow}}",
        "shown-title": "$1 {{PLURAL:$1|wuslědk|wuslědkaj|wuslědki|wuslědkow}} na stronu pokazać",
        "search-result-category-size": "{{PLURAL:$1|1 čłon|$1 čłonaj|$1 čłonojo|$1 čłonow}} ({{PLURAL:$2|1 podkategorija|$2 podkategoriji|$2 podkategorije|$2 podkategorijow}}, {{PLURAL:$3|1 dataja|$3 dataji|$3 dataje|$3 datajow}})",
        "search-redirect": "(Daleposrědkowanje $1)",
        "search-section": "(wotrězk $1)",
+       "search-category": "(kategorija $1)",
        "search-file-match": "(wotpowěduje datajowemu wobsahej)",
        "search-suggest": "Měnješe ty $1?",
        "search-interwiki-caption": "Sotrowske projekty",
        "searchall": "wšě",
        "showingresults": "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "showingresultsinrange": "Deleka so do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> hač do <strong>$3</strong> pokazuje.",
+       "search-showingresults": "{{PLURAL:$4|Wuslědk <strong>$1</strong> z <strong>$3</strong>|Wuslědki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.",
        "powersearch-legend": "Rozšěrjene pytanje",
        "powersearch-ns": "W mjenowych rumach pytać:",
        "prefs-personal": "Wužiwarski profil",
        "prefs-rc": "Aktualne změny",
        "prefs-watchlist": "Wobkedźbowanki",
+       "prefs-editwatchlist": "Wobkedźbowanki wobdźěłać",
+       "prefs-editwatchlist-label": "Zapiski we wobkedźbowankach wobdźěłać",
+       "prefs-editwatchlist-edit": "Titule w twojich wobkedźbowankach sej wobhladać a wotstronić",
+       "prefs-editwatchlist-raw": "Hrube wobkedźbowanki wobdźěłać",
+       "prefs-editwatchlist-clear": "Wobkedźbowanki wotstronić",
        "prefs-watchlist-days": "Ličba dnjow, kotrež maja so we wobkedźbowankach pokazać:",
        "prefs-watchlist-days-max": "Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}}",
        "prefs-watchlist-edits": "Ličba změnow, kotrež maja so we wobkedźbowankach pokazać:",
        "right-protect": "Škitowe schodźenki změnić a z kaskadami škitane strony wobdźěłać",
        "right-editprotected": "Strony wobdźěłać, kotrež su přez \"{{int:protect-level-sysop}}\" škitane",
        "right-editsemiprotected": "Strony wobdźěłać, kotrež su přez \"{{int:protect-level-autoconfirmed}}\" škitane",
+       "right-editcontentmodel": "Wobsahowy model strony wobdźěłać",
        "right-editinterface": "Wužiwarski powjerch wobdźěłać",
        "right-editusercssjs": "Dataje CSS a JS druhich wužiwarjow wobdźěłać",
        "right-editusercss": "Dataje CSS druhich wužiwarjow wobdźěłać",
        "right-override-export-depth": "Strony inkluziwnje wotkazanych stronow hač do hłubokosće 5 eksportować",
        "right-sendemail": "Druhim wužiwarjam e-mejl pósłać",
        "right-passwordreset": "E-mejlki za wróćostajenje hesłow sej wobhladać",
+       "right-managechangetags": "[[Special:Tags|markěrowanja]] wutworić a z datoweje banki zhašeć",
+       "right-applychangetags": "[[Special:Tags|Markěrowanja]] hromadźe ze změnami nałožować",
        "newuserlogpage": "Protokol nowych wužiwarjow",
        "newuserlogpagetext": "To je protokol wutworjenja nowych wužiwarskich kontow.",
        "rightslog": "Protokol zrjadowanja wužiwarskich prawow",
        "action-viewmywatchlist": "Sej swójske wobkedźbowanki wobhladać",
        "action-viewmyprivateinfo": "twoje priwatne informacije sej wobhladać",
        "action-editmyprivateinfo": "twoje priwatne informacije wobdźěłać",
+       "action-editcontentmodel": "wobsahowy model strony wobdźěłać",
+       "action-managechangetags": "markěrowanja wutworić a z datoweje banki zhašeć",
+       "action-applychangetags": "markěrowanja hromadźe z wašimi změnami nałožować",
        "nchanges": "$1 {{PLURAL:$1|změna|změnje|změny|změnow}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|wot poslednjeho wopyta}}",
        "enhancedrc-history": "historija",
        "listfiles-delete": "zhašeć",
        "listfiles-summary": "Tuta specialna strona pokazuje wšě nahrate dataje.",
        "listfiles_search_for": "Za mjenom wobraza pytać:",
+       "listfiles-userdoesnotexist": "Wužiwarske konto \"$1\" zregistrowane njeje.",
        "imgfile": "dataja",
        "listfiles": "Lisćina datajow",
        "listfiles_thumb": "Wobrazk",
        "unusedimages": "Njewužiwane dataje",
        "wantedcategories": "Požadane kategorije",
        "wantedpages": "Požadane strony",
-       "wantedpages-summary": "Tuta specialna strona naliči wšě hišće njeeksistowace strony, na kotrež eksistowace strony hižo wotkazuja.",
+       "wantedpages-summary": "Lisćina njeeksistowacych stronow z najwjace wotkazami k nim, nimo stronow, kotrež maja jenož dalesposrědkowanja. Za lisćinu njeeksistowacych stronw, kotrež maja dalesposrědkowanja, hlej [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Njepłaćiwy titul we wuslědku: $1",
        "wantedfiles": "Požadane dataje",
        "wantedfiletext-cat": "Slědowace dataje so wužiwaja, ale njeeksistuju. Dataje z cuzych repozitorijow hodźa so nalistować, byrnjež eksistowali. Tajke wopačne pozitiwy su <del>přešmórnjene</del>. Nimo toho so strony w [[:$1]] nalistuja, kotrež dataje zasadźuja, kotrež njeeksistuja.",
        "pager-older-n": "{{PLURAL:$1|starši 1|staršej $1|starše $1|staršich $1}}",
        "suppress": "Dohladowanje",
        "querypage-disabled": "Tuta specialna strona je z wukonowych přičinow znjemóžnjena.",
+       "apihelp": "API-pomoc",
+       "apihelp-no-such-module": "Modul \"$1\" njeje so namakał.",
        "booksources": "Pytanje po ISBN",
        "booksources-search-legend": "Žórła za knihi pytać",
+       "booksources-search": "Pytać",
        "booksources-text": "To je lisćina wotkazow k druhim sydłam, kotrež nowe a trjebane knihi předawaja. Tam móžeš tež dalše informacije wo knihach dóstać, kotrež pytaš:",
        "booksources-invalid-isbn": "Podate ISBN-čisło njezda so płaćiwe być; přepruwuj za zmylkami, z tym zo z orginialneho žórła kopěruješ.",
        "specialloguserlabel": "Wukonjer:",
        "index-category-desc": "Strona je <code><nowiki>__INDEX__</nowiki></code> na sebi (a je w mjenowym rumje, hdźež ta chorhojčak je dowolena), a tohodla so přez boćiki indeksuje, hdźež so to normalnje njestawa.",
        "post-expand-template-inclusion-category-desc": "Po ekspansiji wšěch předłohow je strona wjetša hač <code>$wgMaxArticleSize</code>, tohodla njejsu so někotre předłohi ekspandowali.",
        "post-expand-template-argument-category-desc": "Po ekspandowanju předłohoweho argumenta (něšto w trójnych zhibowanych spinkach kaž <code>{{{přikład}}}</code>), strona je wjetša hač <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Přewjele naročnych parserowych funkcijow (kaž <code>#ifexist</code>) je so do strony zasadźiło. Hlej [http://www.mediawiki.org/wiki/Special:MyLanguageManual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Kategorija je so přidała, jeli strona wobsahuje njepłaćiwy datajowy wotkaz (wotkaz za zasadźenje dataje, jeli dataja njeeksistuje).",
-       "hidden-category-category-desc": "To je kategorija z <code><nowiki>__HIDDENCAT__</nowiki></code>, kotrež standardnje jeje zwobraznjenju w kašćiku kategorijowych wotkazow na stronje zadźěwa.",
+       "expensive-parserfunction-category-desc": "Strona wužiwa přewjele naročnych parserowych funkcijow (kaž <code>#ifexist</code>). Hlej [http://www.mediawiki.org/wiki/Special:MyLanguageManual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Strona wobsahuje njepłaćiwy datajowy wotkaz (wotkaz za zasadźenje dataje, jeli dataja njeeksistuje).",
+       "hidden-category-category-desc": "Kategorija wobsahuje <code><nowiki>__HIDDENCAT__</nowiki></code> w swojim wobsahu strony, kotrež standardnje jeje zwobraznjenju w kašćiku kategorijowych wotkazow na stronje zadźěwa.",
        "trackingcategories-nodesc": "Žane wopisanje k dispoziciji",
        "trackingcategories-disabled": "Kategorija je znjemóžnjena",
        "mailnologin": "Njejsy přizjewjeny.",
        "emailccsubject": "Kopija twojeje powěsće wužiwarjej $1: $2",
        "emailsent": "Mejlka wotesłana",
        "emailsenttext": "Twoja mejlka bu wotesłana.",
-       "emailuserfooter": "Tuta e-mejlka bu z pomocu funkcije \"Wužiwarjej mejlku pósłać\" na {{SITENAME}} wot $1 do $2 pósłana.",
+       "emailuserfooter": "Tuta e-mejlka je so z pomocu funkcije \"{{int:emailpage}}\" na {{GRAMMAR:lokatiw|{{SITENAME}}}} wot $1 do $2 pósłała.",
        "usermessage-summary": "Systemowu  zdźělenku zawostajić.",
        "usermessage-editor": "Systemowy powěstnik",
        "watchlist": "Wobkedźbowanki",
        "mywatchlist": "Wobkedźbowanki",
        "watchlistfor2": "Za wužiwarja $1 $2",
        "nowatchlist": "Nimaš žane strony w swojich wobkedźbowankach.",
-       "watchlistanontext": "Dyrbiš so $1, zo by swoje wobkedźbowanki wobhladać abo wobdźěłać móhł.",
+       "watchlistanontext": "Dyrbiš so přizjewić, zo by swoje wobkedźbowanki wobhladać abo wobdźěłać móhł.",
        "watchnologin": "Njejsy přizjewjeny.",
        "addwatch": "K wobkedźbowankam přidać",
        "addedwatchtext": "Strona [[:$1]] bu k twojim [[Special:Watchlist|wobkedźbowankam]] přidata.\nPřichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam nalistować.",
        "watchlist-details": "{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, bjeztoho zo so diskusijne strony dźělene liča.",
        "wlheader-enotif": "E-mejlowa zdźělenska słužba je zmóžnjena.",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
-       "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej '''$1''' změnje|su poslednje '''$1''' změny|je poslednich '''$1''' změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje '''$2''' hodźinje|poslednje '''$2''' hodźiny|poslednje '''$2''' hodźin}}, staw : $3, $4.",
-       "wlshowlast": "Poslednje $1 hodź. - $2 dnjow -  pokazać",
+       "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej <strong>$1</strong> změnje|su poslednje <strong>$1</strong> změny|je poslednich <strong>$1</strong> změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje <strong>$2</strong> hodźinje|poslednje <strong>$2</strong> hodźiny|poslednich <strong>$2</strong> hodźin}}, staw : $3, $4.",
+       "wlshowlast": "Změny zańdźenych $1 hodźin, $2 dnjow, pokazać",
        "watchlist-options": "Opcije wobkedźbowankow",
        "watching": "Wobkedźbuju…",
        "unwatching": "Njewobkedźbuju…",
        "exbeforeblank": "wobsah do wuprózdnjenja běše: '$1'",
        "delete-confirm": "„$1“ wušmórnyć",
        "delete-legend": "Wušmórnyć",
-       "historywarning": "'''KEDŹBU:''' Strona, kotruž chceš wušmórnyć, ma stawizny z přibližnje $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}}:",
+       "historywarning": "<strong>Kedźbu:</strong> Strona, kotruž chceš zhašeć, ma stawizny z přibližnje $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi}}:",
        "confirmdeletetext": "Sy so rozsudźił stronu ze jeje stawiznami wušmórnić.\nProšu potwjerdź, zo maš wotpohlad to činić, zo rozumiš sćěwki a zo to wotpowědujo [[{{MediaWiki:Policy-url}}|zasadam tutoho wikija]] činiš.",
        "actioncomplete": "Dokónčene",
        "actionfailed": "Akcija je so njeporadźiła",
        "delete-edit-reasonlist": "Přičiny za wušmórnjenje wobdźěłać",
        "delete-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje tajkich stronow bu wobmjezowane, zo by připadne přetorhnjenje {{SITENAME}} wobešło.",
        "delete-warning-toobig": "Tuta strona ma z wjace hač $1 {{PLURAL:$1|wersiju|wersijomaj|wersijemi|wersijemi}} wulke wobdźěłanske stawizny. Wušmórnjenje móže operacije datoweje banki {{SITENAME}} přetorhnyć; pokročuj z kedźbliwosću.",
+       "deleteprotected": "Njemóžeš tutu stronu zhašeć, dokelž je so škitała.",
        "deleting-backlinks-warning": "'''Warnowanje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druhe strony]] wotkazuja k stronje abo strona je druhdźe zapřijata, kotruž chceš zhašeć.",
        "rollback": "Změny cofnyć",
        "rollbacklink": "Cofnyć",
        "thumbnail-temp-create": "Temporerna dataja za miniaturny wobrazk njeda so wutworić",
        "thumbnail-dest-create": "Miniaturny wobrazk njeda so na cilowym městnje składować",
        "thumbnail_invalid_params": "Njepłaćiwe parametry miniaturki",
+       "thumbnail_toobigimagearea": "Dataja z wotměrami, kotrež su wjetše hač $1",
        "thumbnail_dest_directory": "Njemóžno cilowy zapis wutworić.",
        "thumbnail_image-type": "Wobrazowy typ so njepodpěruje",
        "thumbnail_gd-library": "Njedospołna konfiguracija GD-biblioteki: falowaca funkcija $1",
        "thumbnail_image-missing": "Zda so, zo dataja faluje: $1",
        "thumbnail_image-failure-limit": "Njedawno je přewjele pospytow było, kotrež je so nimokuliło ($1 abo wjace), zo by tutu miniaturu rysowało. Prošu spytajće pozdźišo hišće raz.",
        "import": "Strony importować",
-       "importinterwiki": "Import z druheho wikija",
-       "import-interwiki-text": "Wuběr wiki a stronu za importowanje. Daty wersijow a mjena awtorow so zachowaja. Wšě akcije za transwiki-importy so w [[Special:Log/import|protokolu importow]] protokoluja.",
+       "importinterwiki": "Z druheho wikija importować",
+       "import-interwiki-text": "Wuběr wiki a stronu za importowanje. Daty wersijow a mjena awtorow so zachowaja. Wšě importowanja z druhich wikijow so w [[Special:Log/import|protokolu importow]] protokoluja.",
+       "import-interwiki-sourcewiki": "Žórłowy wiki:",
+       "import-interwiki-sourcepage": "Žórłowa strona:",
        "import-interwiki-history": "Wšě wersije ze stawiznow tuteje strony kopěrować",
        "import-interwiki-templates": "Wšě předłohi zapřijeć",
        "import-interwiki-submit": "Importować",
-       "import-interwiki-namespace": "Cilowy mjenowy rum:",
-       "import-interwiki-rootpage": "Cilowa korjenjowa strona (opcionalna):",
        "import-upload-filename": "Datajowe mjeno:",
        "import-comment": "Přičina:",
        "importtext": "Prošu eksportuj dataju ze žórłoweho wikija z pomocu funkcije [[Special:Export|Strony eksportować]]. Składuj ju na swojim ličaku a nahraj ju tu.",
        "importcantopen": "Importowa dataja njeda so wočinjeć.",
        "importbadinterwiki": "Wopačny interwiki-wotkaz",
        "importsuccess": "Import wuspěšny!",
-       "importnosources": "Žane importowanske žórła za transwiki wubrane. Direktne nahraće stawiznow je znjemóžnjene.",
+       "importnosources": "Njejsu žane wiki podali, z kotrychž maja so importować a  direktne nahraća stawiznow su znjemóžnjene.",
        "importnofile": "Žana importowanska dataja wubrana.",
        "importuploaderrorsize": "Nahraće importoweje dataje je so njeporadźiło. Dataja je wjetša hač dowolena datajowa wulkosć.",
        "importuploaderrorpartial": "Nahraće importoweje dataje je so njeporadźiło. Dataja je so jenož zdźěla nahrała.",
        "import-upload": "XML-daty nahrać",
        "import-token-mismatch": "Strata posedźenskich datow. Prošu spytaj hišće raz.",
        "import-invalid-interwiki": "Njeje móžno z podateho wikija importować.",
-       "import-error-edit": "Strona \"$1\" so njeimportuje, dokelž nimaš prawo ju wobdźěłać.",
-       "import-error-create": "Strona \"$1\" so njeimportuje, dokelž nimaš prawo ju wutworić.",
-       "import-error-interwiki": "Strona \"$1\" so njeimportuje, dokelž jeje mjeno je za eksterne wotkazowanje (interwiki) wuměnjene.",
-       "import-error-special": "Strona \"$1\" so njeimportuje, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.",
-       "import-error-invalid": "Strona \"$1\" so njeimportuje, dokelž jeje mjeno je njepłaćiwe.",
+       "import-error-edit": "Strona \"$1\" njeje so importowała, dokelž nimaš prawo ju wobdźěłać.",
+       "import-error-create": "Strona \"$1\" njeje so importowała, dokelž nimaš prawo ju wutworić.",
+       "import-error-interwiki": "Strona \"$1\" njeje so importowała, dokelž jeje mjeno je za eksterne wotkazowanje (interwiki) wuměnjene.",
+       "import-error-special": "Strona \"$1\" njeje so importowała, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.",
+       "import-error-invalid": "Strona \"$1\" njeje so importowała, dokelž mjeno, do kotrehož by so importowała, je njepłaćiwe w tutym wikiju.",
        "import-error-unserialize": "Wersija $2 strony \"$1\" njeda so wotserializować. Wersija je so zdźěliła za wužiwanje wobsahoweho modela $3, kotryž je jako $4 serializowany.",
        "import-error-bad-location": "Wersija $2, kotraž wobsahowy model $3 wužiwa, njeda so pod \"$1\" w tutym wikiju składować, dokelž so model na tutej stronje njepodpěruje.",
        "import-options-wrong": "{{PLURAL:$2|Wopačna opcija|Wopačnej opciji|Wopačne opcije|Wopačne opcije}}: <nowiki>$1</nowiki>",
        "import-rootpage-nosubpage": "Mjenowy rum \"$1\" korjenjoweje strony njedowola podstrony.",
        "importlogpage": "Protokol importow",
        "importlogpagetext": "To je lisćina importowanych stronow ze stawiznami z druhich wikijow.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} z $2 {{PLURAL:$1|importowana|importowanej|importowane|importowane}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersija importowana|wersiji importowanej|wersije importowane|wersijow importowane}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} z $2 {{PLURAL:$1|importowana|importowanej|importowane|importowanych}}",
        "javascripttest": "JavaScriptowy test",
        "javascripttest-pagetext-noframework": "Tuta strona je za přewjedźenje javascriptowych testow přewostajena.",
        "javascripttest-pagetext-unknownframework": "Njeznaty wobłuk \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Njeznata akcija \"$1\"",
        "javascripttest-pagetext-frameworks": "Prošu wubjer jedyn ze slědowacych testowanskich wobłukow: $1",
        "javascripttest-pagetext-skins": "Wubjer drastu za přewjedźenje testow:",
        "javascripttest-qunit-intro": "Hlej [$1 testowansku dokumentaciju] na mediawiki.org.",
        "tooltip-pt-mycontris": "Lisćina twojich přinoškow",
        "tooltip-pt-login": "Móžeš so woměrje přizjewić, to pak zawjazowace njeje.",
        "tooltip-pt-logout": "so wotzjewić",
+       "tooltip-pt-createaccount": "Pozbudźujemy će, konto załožić a so přizjewić; njeje wšak nuznje trěbne",
        "tooltip-ca-talk": "diskusija wo stronje",
        "tooltip-ca-edit": "Móžeš stronu wobdźěłać. Prošu wužij tłóčku „Přehlad” do składowanja.",
        "tooltip-ca-addsection": "Nowy wotrězk započeć",
        "tooltip-feed-atom": "Atom-feed za tutu stronu",
        "tooltip-t-contributions": "přinoški tutoho wužiwarja wobhladać",
        "tooltip-t-emailuser": "wužiwarjej mejlku pósłać",
+       "tooltip-t-info": "Dalše informacije wo tutej stronje",
        "tooltip-t-upload": "Dataje nahrać",
        "tooltip-t-specialpages": "lisćina wšěch specialnych stronow",
        "tooltip-t-print": "ćišćowy napohlad tuteje strony",
        "pageinfo-protect-cascading-yes": "Haj",
        "pageinfo-protect-cascading-from": "Kaskadowy škit wot",
        "pageinfo-category-info": "Kategorijowe informacije",
+       "pageinfo-category-total": "Cyłkowna ličba čłonow",
        "pageinfo-category-pages": "Ličba rěkow",
        "pageinfo-category-subcats": "Ličba podkategorijow",
        "pageinfo-category-files": "Ličba datajow",
        "patrol-log-page": "Protokol přepruwowanjow",
        "patrol-log-header": "To je protokol dohladowanych wersijow.",
        "log-show-hide-patrol": "Protokol dohladowanja $1",
+       "log-show-hide-tag": "Protokol markěrowanjow $1",
        "deletedrevision": "Stara wersija $1 wušmórnjena",
        "filedeleteerror-short": "Zmylk při zničenju dataje: $1",
        "filedeleteerror-long": "Buchu zmylki při zničenju dataje zwěsćene:\n\n$1",
        "version-entrypoints": "URL zastupneho dypka",
        "version-entrypoints-header-entrypoint": "Zastupny dypk",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Instalowane biblioteki",
+       "version-libraries-library": "Biblioteka",
+       "version-libraries-version": "Wersija",
        "redirect": "Po datajowym mjenje, wužiwarju, stronje abo wersijowym ID dale sposrědkować",
        "redirect-legend": "Do dataje abo strony dale sposrědkować",
        "redirect-summary": "Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID abo ID strony je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje. Wužiće:\n[[{{#Special:Redirect}}/file/Přikład.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] abo [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Mjeno taflički",
        "tags-display-header": "Napohlad na lisćinach změnow",
        "tags-description-header": "Dospołne wopisanje woznama",
+       "tags-source-header": "Žórło",
        "tags-active-header": "Aktiwny?",
        "tags-hitcount-header": "Změny z tafličkami",
+       "tags-actions-header": "Akcije",
        "tags-active-yes": "Haj",
        "tags-active-no": "Ně",
+       "tags-source-extension": "Definowany přez rozšěrjenje",
+       "tags-source-manual": "Manuelnje wot wužiwarjow a boćikow nałoženy",
+       "tags-source-none": "Hižo so njewužiwa",
        "tags-edit": "změnić",
+       "tags-delete": "zhašeć",
+       "tags-activate": "aktiwizować",
+       "tags-deactivate": "znjemóžnić",
        "tags-hitcount": "$1 {{PLURAL:$1|změna|změnje|změny|změnow}}",
+       "tags-create-heading": "Nowe markěrowanje wutworić",
+       "tags-create-tag-name": "Mjeno markěrowanja:",
+       "tags-create-reason": "Přičina:",
+       "tags-create-submit": "Wutworić",
+       "tags-create-no-name": "Dyrbiš mjeno markěrowanja podać.",
+       "tags-create-invalid-chars": "Mjeno markěrowanjow njesmědźa komy (<code>,</code>) abo nakósne smužki (<code>/</code) wobsahować.",
+       "tags-create-already-exists": "Markěrowanje \"$1\" hižo eksistuje,",
+       "tags-delete-title": "Markěrowanje zhašeć",
+       "tags-delete-reason": "Přičina:",
+       "tags-activate-reason": "Přičina:",
+       "tags-activate-submit": "Aktiwizować",
+       "tags-deactivate-reason": "Přičina:",
+       "tags-deactivate-submit": "Znjemóžnić",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Wubrana wersija|Wubranej wersiji|Wubrane wersije}} wot [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Wubrany protokolowy podawk|Wubranej protokolowej podawkaj|Wubrane protokolowe podawki}}",
+       "tags-edit-existing-tags-none": "\"Žadyn\"",
+       "tags-edit-reason": "Přičina:",
+       "tags-edit-revision-submit": "Změny na {{PLURAL:$1|tutu wersiju|$1 wersiji|$1 wersije|$1 wersijow}} nałožić",
+       "tags-edit-logentry-submit": "Změny na {{PLURAL:$1|tutón protokolowy zapisk|$1 protokolowej zapiskaj|$1 protokolowe zapiski|$1 protokolowych zapiskow}}",
+       "tags-edit-success": "Změny su so wuspěšnje nałožili.",
+       "tags-edit-failure": "Změny njehodźa so nałožować:\n$1",
+       "tags-edit-nooldid-title": "Njepłaćiwa cilowa wersija",
        "comparepages": "Strony přirunać",
        "compare-page1": "Strona 1",
        "compare-page2": "Strona 2",
        "compare-revision-not-exists": "Wersija, kotruž sy podał, njeeksistuje.",
        "dberr-problems": "Wodaj! Tute sydło ma techniske ćežkosće.",
        "dberr-again": "Počakń někotre mjeńšiny a zaktualizuj stronu.",
-       "dberr-info": "(Njeje móžno ze serwerom datoweje banki zwjazać: $1)",
-       "dberr-info-hidden": "(Kontakt z datobankowym serwerom móžno njeje)",
+       "dberr-info": "(Njeje móžno na datowu banku přistup měć: $1)",
+       "dberr-info-hidden": "(Přistup na datowu banku móžno njeje)",
        "dberr-usegoogle": "Mjeztym móžeš z pomocu Google pytać.",
        "dberr-outofdate": "Wobkedźbuj, zo jich indeksy našeho wobsaha móhli zestarjene być.",
        "dberr-cachederror": "Slědowaca je pufrowana kopija požadaneje strony a móhła zestarjena być.",
        "revdelete-uname-unhid": "wužiwarske mjeno widźomne",
        "revdelete-restricted": "na administratorow nałožene wobmjezowanja",
        "revdelete-unrestricted": "Wobmjezowanja za administratorow wotstronjene",
+       "logentry-import-upload": "$1 je $3 přez datajowe nahraće {{GENDER:$2|importował|importowała}}",
+       "logentry-import-interwiki": "$1je $3 z druheho wikija {{GENDER:$2|importował|importowała}}",
+       "logentry-merge-merge": "$1 je $3 do $4 {{GENDER:$2|zjednoćił|zjednoćiła}} (wersije hač do $5)",
        "logentry-move-move": "$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}}",
        "logentry-move-move-noredirect": "$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}}, bjeztoho zo by dalesposrědkowanje {{GENDER:$2|wutworił|wutworiła}}",
        "logentry-move-move_redir": "$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}} přepisujo dalesposrědkowanje",
        "rightsnone": "(ničo)",
        "revdelete-summary": "zjeće wobdźěłać",
        "feedback-adding": "Komentar so stronje přidawa...",
+       "feedback-back": "Wróćo",
        "feedback-bugcheck": "Wulkotnje! Skontroluj jenož, hač to jedyn z [$1 znatych zmylkow] njeje.",
        "feedback-bugnew": "Sym to skontrolował. Nowy zmylk zdźělić",
        "feedback-bugornote": "Jeli sy zwólniwy, techniski problem nadrobnje wopisać, [$1 zdźěl prošu zmylk].\nHewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so stronje \"[$3 $2]\", z twojim wužiwarskim mjenom a z wobhladowakom, kotryž wužiwaš.",
        "feedback-cancel": "Přetorhnyć",
        "feedback-close": "Dokónčeny",
+       "feedback-external-bug-report-button": "Techniski nadawk zapodać",
+       "feedback-dialog-title": "Komentar pósłać",
+       "feedback-error-title": "Zmylk",
        "feedback-error1": "Zmylk: Njepřipóznaty wuslědk wot API",
        "feedback-error2": "Zmylk: Wobdźěłanje je so njeporadźiło",
        "feedback-error3": "Zmylk: Žana wotmołwa wot API",
        "feedback-subject": "Tema:",
        "feedback-submit": "Wotpósłać",
        "feedback-thanks": "Dźakujemy so! Twój komentar je so k stronje \"[$2 $1]\" pósłał.",
+       "feedback-thanks-title": "Wulki dźak!",
+       "feedback-useragent": "Identifikator wobhladowaka:",
        "searchsuggest-search": "Pytać",
        "searchsuggest-containing": "wobsahuje...",
        "api-error-badaccess-groups": "Nimaš prawo dataje do tutoho wikija nahrać.",
        "logentry-pagelang-pagelang": "$1 je rěč strony za $3 wot $4 do $5 {{GENDER:$2|změnił|změniła}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (zmóžnjeny)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''znjemóžnjeny''')",
+       "mediastatistics": "Medijowe statistiki",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bajt|$1 bajtaj|$1 bajty|$1 bajtow}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME-typ",
+       "mediastatistics-table-extensions": "Móžne rozšěrjenja",
+       "mediastatistics-table-count": "Ličba datajow",
+       "mediastatistics-table-totalbytes": "Wulkosć dohromady",
+       "mediastatistics-header-unknown": "Njeznaty",
+       "mediastatistics-header-bitmap": "Bitmapowe wobrazy",
+       "mediastatistics-header-drawing": "Rysowanki (wektorowe wobrazy)",
+       "mediastatistics-header-audio": "Awdio",
+       "mediastatistics-header-video": "Wideja",
+       "mediastatistics-header-multimedia": "Rich media",
+       "mediastatistics-header-office": "Office",
+       "mediastatistics-header-text": "Tekst",
+       "mediastatistics-header-executable": "Wuwjedźomne formaty",
+       "mediastatistics-header-archive": "Komprimowane formaty",
+       "json-error-unknown": "Je problem z JSON był. Zmylk: $1",
+       "json-error-state-mismatch": "Njepłaćiwy JSON abo JSON ze zmylkami",
+       "json-error-ctrl-char": "Zmylk z wodźenskim znamješkom, snano wopak zakodowane",
+       "json-error-syntax": "Syntaksowy zmylk",
+       "json-error-utf8": "UTF-8-znamješka ze zmylkami, snano wopak zakodowane",
+       "json-error-recursion": "Jedna rekursiwna referenca abo wjacore rekursiwne referency w hódnoće, kotrež maja so kodować",
+       "json-error-unsupported-type": "Hódnota typa, kotryž njeda so kodować, je so podała",
+       "headline-anchor-title": "Wotkaz k tutomu wotrězkej",
        "special-characters-group-latin": "Łaćonske",
        "special-characters-group-latinextended": "Łaćonske rozšěrjene",
        "special-characters-group-ipa": "IPA",
index 665a98c..a2f6cc7 100644 (file)
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "showingresults": "Lent '''{{PLURAL:$1|egy|$1}}''' találat látható, az eleje '''$2'''.",
-       "showingresultsinrange": "Lent <strong>$1</strong> találat látható ($2. – $3.)",
+       "showingresultsinrange": "Lent <strong>$1</strong> találat látható ($2$3.)",
        "search-showingresults": "{{PLURAL:$4|<strong>$1.</strong> a(z) <strong>$3</strong> találatból|<strong>$1–$2.</strong> a(z) <strong>$3</strong> találatból}}",
        "search-nonefound": "Nincs egyezés a megadott szöveggel.",
        "powersearch-legend": "Részletes keresés",
        "right-purge": "oldal gyorsítótárának ürítése megerősítés nélkül",
        "right-autoconfirmed": "Nem érinti az IP-alapú szerkesztéskorlátozás",
        "right-bot": "automatikus folyamatként való kezelés",
-       "right-nominornewtalk": "felhasználói lapok nem apró szerkesztésével megjelenik az új üzenet szöveg",
+       "right-nominornewtalk": "felhasználói lapok apró szerkesztésével nem jelenik meg az új üzenet értesítés",
        "right-apihighlimits": "nagyobb mennyiségű lekérdezés az API-n keresztül",
        "right-writeapi": "a szerkesztő-API használata",
        "right-delete": "lapok törlése",
        "statistics-users": "Regisztrált [[Speciális:Szerkesztők listája|szerkesztők]]",
        "statistics-users-active": "Aktív szerkesztők",
        "statistics-users-active-desc": "Szerkesztők, akik csináltak valamit az elmúlt {{PLURAL:$1|egy|$1}} napban",
+       "pageswithprop": "Laptulajdonsággal rendelkező lapok",
        "pageswithprop-prop": "Tulajdonságnév:",
        "pageswithprop-submit": "Ugrás",
        "doubleredirects": "Dupla átirányítások",
        "revertpage-nouser": "Visszaállítottam a lap korábbi változatát (szerkesztőnév eltávolítva) szerkesztéséről [[User:$1|$1]] szerkesztésére",
        "rollback-success": "$1 szerkesztéseit visszaállítottam $2 utolsó változatára.",
        "sessionfailure-title": "Munkamenethiba",
-       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a \"vissza\" gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
+       "sessionfailure": "Úgy látszik, hogy probléma van a bejelentkezési munkameneteddel;\nez a művelet a munkamenet eltérítése miatti óvatosságból megszakadt.\nKérjük, hogy nyomd meg a „vissza” gombot, és töltsd le újra az oldalt, ahonnan jöttél, majd próbáld újra.",
        "protectlogpage": "Lapvédelmi napló",
        "protectlogtext": "Alább látható a lapvédelemmel kapcsolatos változtatások listája.\nA [[Special:ProtectedPages|védett lapok listáján]] megtekintheted a jelenleg is érvényben lévő védelmeket.",
        "protectedarticle": "levédte a(z) [[$1]] lapot",
        "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",
-       "import-interwiki-namespace": "Célnévtér:",
-       "import-interwiki-rootpage": "Cél gyökér lap (opcionális):",
        "import-upload-filename": "Fájlnév:",
        "import-comment": "Megjegyzés:",
        "importtext": "Exportáld a fájlt a forráswikiből az [[Special:Export|exportáló eszköz]] segítségével.\nMentsd el a számítógépedre, majd töltsd fel ide.",
index d5d575f..7f532c9 100644 (file)
        "revdelete-log": "Պատճառ.",
        "revdelete-submit": "Կիրառել ընտրված {{PLURAL:$1|տարբերակի|տարբերակների}} վրա",
        "revdelete-success": "'''Տարբերակի տեսանելիությունը բարեհաջող թարմացված է։'''",
-       "revdelete-failure": "<strong>Խմբագրման տեսանելիություն հնարավոր չէր փոփոխել՝</strong>\n$1",
+       "revdelete-failure": "Խմբագրման տեսանելիություն հնարավոր չէր փոփոխել՝\n$1",
        "logdelete-success": "'''Իրադարձության տեսանելիությունը փոփոխված է։'''",
        "revdel-restore": "Փոխել տեսանելիությունը",
        "pagehist": "Էջի պատմություն",
        "import-interwiki-text": "Նշեք վիքի և ներմուծվող էջի անվանումը։\nՓոփոխումների ժամանակները և խմբագրողների անունները կպահպանվեն։\nԲոլոր միջվիքի ներմուծման գործողությունները գրանցվում են [[Special:Log/import|ներմուծման տեղեկամատյանում]]։",
        "import-interwiki-history": "Պատճենել այս էջի փոփոխումների լրիվ պատմությունը",
        "import-interwiki-submit": "Ներմուծել",
-       "import-interwiki-namespace": "Տեղադրել էջերը անվանատարածքում.",
        "import-upload-filename": "Նիշքի անուն․",
        "import-comment": "Մեկնաբանություն.",
        "importtext": "Խնդրում ենք արտածեք էջը ելակետային վիքիից օգտագործելով [[Special:Export|արտածման գործիք]], հիշեք այն նիշքի տեսքով ձեր համակարգչի վրա և այնուհետև, բեռնեք այն այստեղ։",
        "duration-decades": "$1 {{PLURAL:$1|տասնամյակ}}",
        "duration-centuries": "$1 {{PLURAL:$1|դար}}",
        "duration-millennia": "$1 {{PLURAL:$1|հազարամյակ}}",
-       "expandtemplates": "Կաղապարների ընդարձակում"
+       "expandtemplates": "Կաղապարների ընդարձակում",
+       "special-characters-group-latin": "Լատիներեն",
+       "special-characters-group-latinextended": "Լատիներեն ընդլայնված",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Սիմվոլներ",
+       "special-characters-group-greek": "Հունարեն",
+       "special-characters-group-cyrillic": "Կիրիլիցա",
+       "special-characters-group-arabic": "Արաբերեն",
+       "special-characters-group-arabicextended": "Արաբերեն ընդլայնված",
+       "special-characters-group-persian": "Պարսկերեն",
+       "special-characters-group-hebrew": "Եբրայերեն",
+       "special-characters-group-bangla": "Բենգալերեն",
+       "special-characters-group-tamil": "Թամիլերեն",
+       "special-characters-group-telugu": "Տելուգու",
+       "special-characters-group-sinhala": "Սինհալերեն",
+       "special-characters-group-gujarati": "Գուջարատի",
+       "special-characters-group-devanagari": "Դեվանգարի",
+       "special-characters-group-thai": "Թայերեն",
+       "special-characters-group-lao": "Լաոերեն",
+       "special-characters-group-khmer": "Կխմեր",
+       "special-characters-title-endash": "ո գծիկ (en dash)",
+       "special-characters-title-emdash": "ա գծիկ (em dash)",
+       "special-characters-title-minus": "հանածի նշան"
 }
index 3f6eb71..8754712 100644 (file)
@@ -13,7 +13,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Carlosedepaula",
-                       "Macofe"
+                       "Macofe",
+                       "Karmwiki"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
        "wrongpassword": "Le contrasigno que tu entrava es incorrecte. Per favor reprova.",
        "wrongpasswordempty": "Tu non entrava un contrasigno. Per favor reprova.",
        "passwordtooshort": "Le contrasignos debe continer al minus {{PLURAL:$1|1 character|$1 characteres}}.",
+       "passwordtoolong": "Le contrasignos non pote esser plus longe de {{PLURAL:$1|1 character|$1 characteres}}.",
        "password-name-match": "Tu contrasigno debe esser differente de tu nomine de usator.",
        "password-login-forbidden": "Le uso de iste nomine de usator e contrasigno ha essite prohibite.",
        "mailmypassword": "Reinitialisar contrasigno",
        "missingcommentheader": "'''Rememoration:''' Tu non ha specificate un subjecto/titulo pro iste commento.\nSi tu clicca super \"{{int:savearticle}}\" de novo, le modification essera publicate sin titulo.",
        "summary-preview": "Previsualisation del summario:",
        "subject-preview": "Previsualisation del subjecto/titulo:",
+       "previewerrortext": "Un error ha occurrite durante le tentativa de previsualisar le cambiamentos.",
        "blockedtitle": "Le usator es blocate",
        "blockedtext": "'''Tu nomine de usator o adresse IP ha essite blocate.'''\n\nLe blocada esseva facite per $1.\nLe motivo presentate es ''$2''.\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Le blocato intendite: $7\n\nTu pote contactar $1 o un altere [[{{MediaWiki:Grouppage-sysop}}|administrator]] pro discuter le blocada.\nTu non pote usar le function 'inviar e-mail a iste usator' salvo que un adresse de e-mail valide es specificate in le\n[[Special:Preferences|preferentias de tu conto]] e que tu non ha essite blocate de usar lo.\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "autoblockedtext": "Tu adresse de IP ha essite automaticamente blocate proque un altere usator lo usava qui esseva blocate per $1.\nLe motivo presentate es:\n\n:''$2''\n\n* Initio del blocada: $8\n* Expiration del blocada: $6\n* Blocato intendite: $7\n\nTu pote contactar $1 o un del altere [[{{MediaWiki:Grouppage-sysop}}|administratores]] pro discuter le blocada.\n\nNota que tu non pote utilisar le function \"inviar e-mail a iste usator\" salvo que tu ha registrate un adresse de e-mail valide in tu [[Special:Preferences|preferentias de usator]] e que tu non ha essite blocate de usar lo.\n\nTu adresse IP actual es $3, e le ID del blocada es #$5.\nPer favor include tote le detalios supra specificate in omne correspondentia.",
        "notextmatches": "Nulle resultato in le texto de paginas",
        "prevn": "$1 {{PLURAL:$1|precedente|precedentes}}",
        "nextn": "$1 {{PLURAL:$1|sequente|sequentes}}",
+       "prev-page": "pagina precedente",
+       "next-page": "pagina sequente",
        "prevn-title": "$1 {{PLURAL:$1|resultato|resultatos}} precedente",
        "nextn-title": "$1 {{PLURAL:$1|resultato|resultatos}} sequente",
        "shown-title": "Monstrar $1 {{PLURAL:$1|resultato|resultatos}} per pagina",
        "mimetype": "Typo MIME:",
        "download": "discargar",
        "unwatchedpages": "Paginas non observate",
-       "listredirects": "Listar redirectiones",
+       "listredirects": "Lista de redirectiones",
        "listduplicatedfiles": "Lista de files con duplicatos",
        "listduplicatedfiles-summary": "Isto es un lista de files del quales le version le plus recente es un duplicato del version le plus recente de un altere file. Solmente le files local es examinate.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ha [[$3|{{PLURAL:$2|un duplicato|$2 duplicatos}}]].",
        "unusedimages": "Imagines non usate",
        "wantedcategories": "Categorias plus demandate",
        "wantedpages": "Paginas plus demandate",
+       "wantedpages-summary": "Lista del paginas non existente con le major numero de ligamines verso illos, excludente le paginas que ha solmente redirectiones que liga verso illos. Pro un lista del paginas non existente que ha redirectiones que liga verso illos, vide [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Titulo invalide in le gruppo de resultatos: $1",
        "wantedfiles": "Files desirate",
        "wantedfiletext-cat": "Le sequente files es usate ma non existe. Le files ab repositorios externe pote esser listate malgrado que illos existe. Omne tal false positivos essera <del>cancellate</del>. In addition, paginas que incorpora files que non existe es listate in [[:$1]].",
        "emailccsubject": "Copia de tu message a $1: $2",
        "emailsent": "E-mail inviate",
        "emailsenttext": "Tu message de e-mail ha essite inviate.",
-       "emailuserfooter": "Iste e-mail esseva inviate per $1 a $2 con le function \"Inviar e-mail al usator\" a {{SITENAME}}.",
+       "emailuserfooter": "Iste e-mail ha essite inviate per $1 a $2 con le function \"{{int:emailpage}}\" in {{SITENAME}}.",
        "usermessage-summary": "Lassante un message de systema.",
        "usermessage-editor": "Messagero del systema",
        "watchlist": "Observatorio",
        "import-interwiki-history": "Copiar tote le versiones del historia de iste pagina",
        "import-interwiki-templates": "Includer tote le patronos",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Spatio de nomines de destination:",
-       "import-interwiki-rootpage": "Pagina radice de destination (optional):",
        "import-upload-filename": "Nomine del file:",
        "import-comment": "Commento:",
        "importtext": "Per favor exporta le file del wiki de origine con le [[Special:Export|facilitate de exportation]].\nSalveguarda lo in tu computator e incarga lo hic.",
index 0e46d5e..7ac698b 100644 (file)
@@ -37,7 +37,8 @@
                        "Raynasution",
                        "Arifin.wijaya",
                        "Ahdan",
-                       "Macofe"
+                       "Macofe",
+                       "Totosunarto"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -54,6 +55,7 @@
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "tog-watchdeletion": "Tambahkan halaman yang saya hapus ke daftar pantauan",
+       "tog-watchrollback": "Tambahkan laman di mana saya telah melakukan rollback watchlist saya",
        "tog-minordefault": "Tandai semua suntingan sebagai suntingan kecil secara baku",
        "tog-previewontop": "Perlihatkan pratayang sebelum kotak sunting dan tidak sesudahnya",
        "tog-previewonfirst": "Perlihatkan pratayang pada suntingan pertama",
        "disclaimers": "Penyangkalan",
        "disclaimerpage": "Project:Penyangkalan umum",
        "edithelp": "Bantuan penyuntingan",
+       "helppage-top-gethelp": "Tolong",
        "mainpage": "Halaman Utama",
        "mainpage-description": "Halaman Utama",
        "policy-url": "Project:Kebijakan",
        "readonly_lag": "Basis data telah dikunci otomatis selagi basis data sekunder melakukan sinkronisasi dengan basis data utama",
        "internalerror": "Kesalahan internal",
        "internalerror_info": "Kesalahan internal: $1",
+       "internalerror-fatal-exception": "Kekecualian fatal mengetik \"$1\"",
        "filecopyerror": "Tidak dapat menyalin berkas \"$1\" ke \"$2\".",
        "filerenameerror": "Tidak dapat mengubah nama berkas \"$1\" menjadi \"$2\".",
        "filedeleteerror": "Tidak dapat menghapus berkas \"$1\".",
        "wrongpassword": "Kata sandi yang Anda masukkan salah. Silakan coba lagi.",
        "wrongpasswordempty": "Anda tidak memasukkan kata sandi. Silakan coba lagi.",
        "passwordtooshort": "Kata sandi paling tidak harus terdiri dari {{PLURAL:$1|1 karakter|$1 karakter}}.",
+       "passwordtoolong": "Passwords tidak boleh lebih dari {{PLURAL:$1|1 character|$1 characters}}.",
        "password-name-match": "Kata sandi Anda harus berbeda dari nama pengguna Anda.",
        "password-login-forbidden": "Penggunaan nama pengguna dan sandi ini telah dilarang.",
        "mailmypassword": "Setel ulang kata sandi",
        "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:",
        "subject-preview": "Pratayang subyek/tajuk:",
+       "previewerrortext": "Kesalahan terjadi saat mencoba meninjau perubahan anda",
        "blockedtitle": "Pengguna diblokir",
        "blockedtext": "'''Nama pengguna atau alamat IP Anda telah diblokir.'''\n\nBlokir dilakukan oleh $1.\nAlasan yang diberikan adalah ''$2''.\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur 'Kirim surel ke pengguna ini' kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda adalah $3, dan ID pemblokiran adalah $5.\nTolong sertakan salah satu atau kedua informasi ini pada setiap pertanyaan yang Anda buat.",
        "autoblockedtext": "Alamat IP Anda telah terblokir secara otomatis karena digunakan oleh pengguna lain, yang diblokir oleh $1. Pemblokiran dilakukan atas alasan:\n\n:''$2''\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur \"kirim surel ke pengguna ini\" kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] Anda dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda saat ini adalah $3, dan ID pemblokiran adalah #$5.\nTolong sertakan informasi-informasi ini dalam setiap pertanyaan Anda.",
        "rev-deleted-event": "(rincian log dihapus)",
        "rev-deleted-user-contribs": "[nama pengguna atau alamat IP dihapus - suntingan disembunyikan pada daftar kontribusi]",
        "rev-deleted-text-permission": "Revisi halaman ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan]",
+       "rev-suppressed-text-permission": "Revisi laman ini adalah <strong>suppressed</strong>. Detail dapat ditemukan di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "rev-deleted-text-unhide": "Revisi ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].\nSebagai seorang pengurus Anda masih dapat [$1 melihat revisi ini] jika Anda mau.",
        "rev-suppressed-text-unhide": "Revisi halaman ini telah '''disupresi'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log supresi].\nSebagai seorang pengurus, Anda masih dapat [$1 melihat revisi ini] jika Anda mau.",
        "rev-deleted-text-view": "Revisi ini telah '''dihapus'''.\nSebagai seorang pengurus, Anda dapat melihatnya; rinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "notextmatches": "Tidak ada teks halaman yang cocok",
        "prevn": "{{PLURAL:$1|$1}} sebelumnya",
        "nextn": "{{PLURAL:$1|$1}} selanjutnya",
+       "prev-page": "Halaman sebelumnya",
+       "next-page": "Halaman selanjutnya",
        "prevn-title": "$1 {{PLURAL:$1|hasil|hasil}} sebelumnya",
        "nextn-title": "$1 {{PLURAL:$1|hasil|hasil}} selanjutnya",
        "shown-title": "Tampilkan $1 {{PLURAL:$1|hasil}} per halaman",
        "right-protect": "Ubah tingkat pelindungan dan sunting halaman yang dilindungi beruntun",
        "right-editprotected": "Sunting halaman yang dilindungi sebagai \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Sunting halaman yang dilindungi sebagai \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Edit model konten halaman",
        "right-editinterface": "Menyunting antarmuka pengguna",
        "right-editusercssjs": "Menyunting arsip CSS dan JS pengguna lain",
        "right-editusercss": "Menyunting berkas CSS pengguna lain",
        "right-override-export-depth": "Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5",
        "right-sendemail": "Mengirim surel ke pengguna lain",
        "right-passwordreset": "Lihat surel pengaturulangan kata sandi",
+       "right-managechangetags": "Membuat dan menghapus  [[Special:Tags|tags]] dari database",
        "newuserlogpage": "Log pengguna baru",
        "newuserlogpagetext": "Di bawah ini adalah log pendaftaran pengguna baru",
        "rightslog": "Log perubahan hak akses",
        "action-viewmywatchlist": "lihat daftar pantau Anda",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-editmyprivateinfo": "sunting informasi pribadi Anda",
+       "action-editcontentmodel": "mengedit model konten sebuah halaman",
+       "action-managechangetags": "Membuat dan menghapus label dari database",
        "nchanges": "$1 {{PLURAL:$1|perubahan|perubahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak kunjungan terakhir}}",
        "enhancedrc-history": "riwayat",
        "unusedimages": "Berkas yang tak digunakan",
        "wantedcategories": "Kategori yang diinginkan",
        "wantedpages": "Halaman yang diinginkan",
+       "wantedpages-summary": "Daftar laman tak tersedia dengan tautan pada mereka, tidak termasuk laman yang hanya memiliki penautan pengalihan pada mereka.Untuk daftar laman tak tersedia yang memiliki penautan pengalihan pada mereka, lihat [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Judul tak valid dalam himpunan hasil: $1",
        "wantedfiles": "Berkas yang diinginkan",
        "wantedfiletext-cat": "Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap \"false positive\" akan <del>dicoret</del>. Selain itu, halaman yang menggunakan berkas yang tidak ada akan dicantumkan dalam [[:$1]].",
        "trackingcategories-desc": "Kriteria inklusi kategori",
        "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
        "index-category-desc": "Halaman ini memiliki <code><nowiki>__INDEX__</nowiki></code> di atasnya (dan dalam ruang nama yang mana bendera yang diperbolehkan), dan karenanya diindeks oleh robot di mana itu biasanya tidak akan.",
-       "post-expand-template-inclusion-category-desc": "Setelah memperluas semua templat, ukuran halaman menjadi lebih besar dari <code>$wgMaxArticleSize</code>, sehingga beberapa templat tidak diperluas.",
-       "post-expand-template-argument-category-desc": "Setelah memperluas argumen templat (sesuatu dalam tiga tanda kurung, seperti <code>{{{Foo}}}</code>), halaman tersebut lebih besar dari <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Terlalu banyak fungsi parser (seperti <code>#ifexist</code>) termasuk pada halaman. Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Kategori ditambahkan jika halaman tersebut berisi pranala rusak (pranala untuk menanamkan sebuah berkas ketika berkas tersebut tidak ada).",
-       "hidden-category-category-desc": "Ini adalah kategori dengan <code><nowiki>__HIDDENCAT__</nowiki></code> di atasnya, yang mencegah dari muncul di kotak tautan kategori pada halaman, secara default.",
+       "post-expand-template-inclusion-category-desc": "Ukuran laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas semua template, sehingga beberapa template tidak diperluas",
+       "post-expand-template-argument-category-desc": "Laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas argumen template (something in triple braces, like <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Laman menggunakan terlalu banyak fungsi parser (seperti <code>#ifexist</code>). Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Laman berisi sebuah tautan file rusak (sebuah tautan untuk menanam file saat file tidak ada)",
+       "hidden-category-category-desc": "Kategori ini berisikan <code><nowiki>__HIDDENCAT__</nowiki></code> di dalam konten laman, yang mencegahnya muncul di kotak tautan kategori pada laman, secara standar.",
        "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "trackingcategories-disabled": "Kategori dinonaktifkan",
        "mailnologin": "Tidak ada alamat surel",
        "emailccsubject": "Salinan pesan Anda untuk $1: $2",
        "emailsent": "Surel terkirim",
        "emailsenttext": "Surel Anda telah dikirimkan.",
-       "emailuserfooter": "Surel ini dikirimkan oleh $1 kepada $2 menggunakan fungsi \"Surel Pengguna\" di {{SITENAME}}.",
+       "emailuserfooter": "Email ini dikirimkan dengan $1 pada $2 dengan fungsi \"{{int:emailpage}}\" pada {{SITENAME}}.",
        "usermessage-summary": "Tinggalkan pesan sistem.",
        "usermessage-editor": "Penyampai pesan sistem",
        "usermessage-template": "MediaWiki:UserMessage",
        "mywatchlist": "Daftar pantauan",
        "watchlistfor2": "Untuk $1 $2",
        "nowatchlist": "Daftar pantauan Anda kosong.",
-       "watchlistanontext": "Silakan $1 untuk melihat atau menyunting daftar pantauan Anda.",
+       "watchlistanontext": "Silahkan login untuk melihat atau mengedit item pada daftarjaga anda",
        "watchnologin": "Belum masuk log",
        "addwatch": "Tambahkan ke daftar pantauan",
        "addedwatchtext": "Halaman \"[[:$1]]\" telah ditambahkan ke [[Special:Watchlist|daftar pantauan]] Anda.\nPerubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan terkaitnya akan tercantum di sini.",
        "watchlist-details": "Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.",
        "wlheader-enotif": "Notifikasi surel diaktifkan.",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
-       "wlnote": "Di bawah ini adalah {{PLURAL:$1|perubahan|'''$1''' perubahan}} terakhir dalam '''$2''' jam terakhir, per $3, $4.",
-       "wlshowlast": "Tampilkan $1 jam $2 hari terakhir",
+       "wlnote": "Dibawah {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, sebagai $3, $4.",
+       "wlshowlast": "Tampilkan terakhir $1 jam $2 hari",
        "watchlist-options": "Opsi daftar pantauan",
        "watching": "Memantau...",
        "unwatching": "Menghilangkan pemantauan...",
        "exbeforeblank": "isi sebelum dikosongkan: '$1'",
        "delete-confirm": "Hapus \"$1\"",
        "delete-legend": "Hapus",
-       "historywarning": "'''Peringatan:''' Halaman yang akan Anda hapus mempunyai sejarah dengan $1 {{PLURAL:$1|revisi|revisi}}:",
+       "historywarning": "<strong>Warning:</strong> Laman yang akan anda hapus punya riwayat dengan $1 {{PLURAL:$1|revision|revisions}}:",
        "confirmdeletetext": "Anda akan menghapus halaman atau berkas ini secara permanen berikut semua sejarahnya dari basis data. Pastikan bahwa Anda memang ingin melakukannya, mengetahui segala akibatnya, dan apa yang Anda lakukan ini adalah sejalan dengan [[{{MediaWiki:Policy-url}}|kebijakan {{SITENAME}}]].",
        "actioncomplete": "Proses selesai",
        "actionfailed": "Eksekusi gagal",
        "delete-edit-reasonlist": "Alasan penghapusan suntingan",
        "delete-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nPenghapusan halaman dengan sejarah penyuntingan yang panjang tidak diperbolehkan untuk mencegah kerusakan di {{SITENAME}}.",
        "delete-warning-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nMenghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{SITENAME}}.",
+       "deleteprotected": "Anda tidak dapat menghapus laman ini karena telah diproteksi",
        "deleting-backlinks-warning": "'''Peringatan:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
        "rollback": "Kembalikan suntingan",
        "rollbacklink": "kembalikan",
        "import-rootpage-nosubpage": "Ruang nama \"$1\" di halaman turunan tidak mengizinkan subhalaman.",
        "importlogpage": "Log impor",
        "importlogpagetext": "Di bawah ini adalah log impor administratif dari halaman-halaman, berikut riwayat suntingannya dari wiki lain.",
-       "import-logentry-upload": "mengimpor [[$1]] melalui pemuatan berkas",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|revisi|revisi}}",
-       "import-logentry-interwiki": "men-transwiki $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revisi}} dari $2",
        "javascripttest": "Pengujian JavaScript",
        "javascripttest-pagetext-noframework": "Halaman ini disediakan untuk pengujian JavaScript yang sedang berjalan.",
        "mediastatistics-header-executable": "Program",
        "mediastatistics-header-archive": "Format terkompresi",
        "json-error-depth": "Kedalaman tumpukan maksimal telah terlewati",
-       "json-error-syntax": "Kesalahan sintaks"
+       "json-error-syntax": "Kesalahan sintaks",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-latinextended": "Ekstensi Latin",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simbol",
+       "special-characters-group-greek": "Yunani",
+       "special-characters-group-cyrillic": "Sirilik",
+       "special-characters-group-arabic": "Arab",
+       "special-characters-group-arabicextended": "Arab tambahan",
+       "special-characters-group-persian": "Persia",
+       "special-characters-group-hebrew": "Ibrani",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Dewanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
+       "special-characters-title-minus": "tanda kurang"
 }
index 5fc0be2..b95a058 100644 (file)
        "revdelete-unsuppress": "Ikkaten dagiti panangigawid kadagiti naipulang a rebision",
        "revdelete-log": "Rason:",
        "revdelete-submit": "Ipakat {{PLURAL:$1|ti napili a rebision|dagiti napili a rebision}}",
-       "revdelete-success": "<strong>Balligi ti panagpabaro ti panagkita ti rebision.</strong>",
-       "revdelete-failure": "<strong>Saan a napabaro ti panagkita ti rebision.</strong>\n$1",
-       "logdelete-success": "<strong>Balligi ti pannakaisaad ti listaan ti panagkita.</strong>",
-       "logdelete-failure": "<strong>Napaay ti pannakaisaad ti listaan ti panagkita:</strong>\n$1",
+       "revdelete-success": "Balligi ti panagpabaro ti panagkita ti rebision.",
+       "revdelete-failure": "Saan a napabaro ti panagkita ti rebision.\n$1",
+       "logdelete-success": "Balligi ti pannakaisaad ti listaan ti panagkita.",
+       "logdelete-failure": "Napaay ti pannakaisaad ti listaan ti panagkita:\n$1",
        "revdel-restore": "sukatan ti panagkita",
        "pagehist": "Pakasaritaan ti panid",
        "deletedhist": "Naikkat a pakasaritaan",
        "import-interwiki-history": "Kopiaen amin dagiti rebision ti pakasaritaan daytoy a panid",
        "import-interwiki-templates": "Iraman amin dagiti plantilia",
        "import-interwiki-submit": "Agala",
-       "import-interwiki-namespace": "Pangipanan a nagan ti espasio:",
-       "import-interwiki-rootpage": "Papanan a ramut ti panid (pagpilian):",
        "import-upload-filename": "Nagan ti papeles:",
        "import-comment": "Komentario:",
        "importtext": "Pangngaasi nga ipanmo ti papeles manipud ti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
        "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangpalubos kadagiti subpanid.",
        "importlogpage": "Listaan ti panagala",
        "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panag-urnos manipud kadagiti sabali a wiki.",
-       "import-logentry-upload": "innala ti [[$1]] babaen ti panagikarga ti papeles",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naala",
-       "import-logentry-interwiki": "nai-transwiki iti $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud ti $2",
        "javascripttest": "Panagsubok ti JavaScript",
        "javascripttest-pagetext-noframework": "Daytoy a panid ket naireserba para iti panagpataray kadagiti panagsubok ti JavaScript.",
        "mediastatistics-table-totalbytes": "Naitiptipon a kadakkel",
        "mediastatistics-header-unknown": "Di ammo",
        "mediastatistics-header-bitmap": "Ladladawan ti bitmap",
-       "mediastatistics-header-office": "Opisina"
+       "mediastatistics-header-office": "Opisina",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-latinextended": "Latin napaatiddog",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Dagiti simbolo",
+       "special-characters-group-greek": "Griego",
+       "special-characters-group-cyrillic": "Siriliko",
+       "special-characters-group-arabic": "Arabiko",
+       "special-characters-group-arabicextended": "Arabiko a napaatiddog",
+       "special-characters-group-persian": "Persiano",
+       "special-characters-group-hebrew": "Hebreo",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
+       "special-characters-title-minus": "senial a panagkissay"
 }
index df33503..a6b8a8f 100644 (file)
@@ -18,7 +18,8 @@
                        "Ævar Arnfjörð Bjarmason",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Sveinn í Felli"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "tog-extendwatchlist": "Sýna allar breytingar á vaktlistanum, ekki einungis þær nýjustu",
        "tog-usenewrc": "Flokka breytingar eftir síðu í nýlegum breytingum og vaktlista",
        "tog-numberheadings": "Númera fyrirsagnir sjálfkrafa",
-       "tog-showtoolbar": "Sýna breytingarverkfærastiku",
+       "tog-showtoolbar": "Sýna breytingaverkfærastiku",
        "tog-editondblclick": "Breyta síðum þegar tvísmellt er",
        "tog-editsectiononrightclick": "Virkja hlutabreytingu með því að hægrismella á hlutafyrirsagnir",
-       "tog-watchcreations": "Bæta síðum sem ég bý til og skrám sem ég hleð inn á vaktlistann minn",
+       "tog-watchcreations": "Bæta á vaktlistann minn síðum sem ég bý til og skrám sem ég hleð inn",
        "tog-watchdefault": "Bæta síðum og skrám sem ég breyti á vaktlistann minn",
-       "tog-watchmoves": "Bæta síðum og skrám sem ég færi á vaktlistann minn",
+       "tog-watchmoves": "Bæta á vaktlistann minn síðum og skrám sem ég færi",
        "tog-watchdeletion": "Bæta síðum og skrám sem ég eyði á vaktlistann minn",
        "tog-watchrollback": "Bæta síðum þar sem ég hef tekið aftur breytingu á vaktlistann minn",
        "tog-minordefault": "Merkja allar breytingar sem minniháttar sjálfgefið",
-       "tog-previewontop": "Sýna forskoðun á undan breytingarkassanum",
+       "tog-previewontop": "Sýna forskoðun á undan breytingareitnum",
        "tog-previewonfirst": "Sýna forskoðun með fyrstu breytingu",
-       "tog-enotifwatchlistpages": "Senda mér tölvupóst þegar síðu eða skrá á vaktlistanum mínu er breytt",
+       "tog-enotifwatchlistpages": "Senda mér tölvupóst þegar síðu eða skrá á vaktlistanum mínum er breytt",
        "tog-enotifusertalkpages": "Senda mér tölvupóst þegar notandaspjallinu mínu er breytt",
        "tog-enotifminoredits": "Senda mér einnig tölvupóst vegna minniháttar breytinga á síðum og skrám",
        "tog-enotifrevealaddr": "Gefa upp netfang mitt í tilkynningarpóstum",
        "tog-shownumberswatching": "Sýna fjölda vaktandi notenda",
        "tog-oldsig": "Núverandi undirskrift:",
-       "tog-fancysig": "Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)",
+       "tog-fancysig": "Meðhöndla undirskrift sem wikitexta (án sjálfvirks tengils)",
        "tog-uselivepreview": "Nota beina forskoðun",
        "tog-forceeditsummary": "Birta áminningu þegar breytingarágripið er tómt",
        "tog-watchlisthideown": "Ekki sýna mínar breytingar á vaktlistanum",
        "underline-always": "Alltaf",
        "underline-never": "Aldrei",
        "underline-default": "Fletta eða vafra sjálfkrafa",
-       "editfont-style": "Breyta leturgerð í textareitum",
+       "editfont-style": "Leturgerð í breytingareitum:",
        "editfont-default": "skv. vafrastillingu",
-       "editfont-monospace": "Monospaced letur",
-       "editfont-sansserif": "Sans-serif font",
+       "editfont-monospace": "Jafnbreitt letur",
+       "editfont-sansserif": "Sans-serif letur",
        "editfont-serif": "Serif letur",
        "sunday": "sunnudagur",
        "monday": "mánudagur",
        "category_header": "Síður í flokknum „$1“",
        "subcategories": "Undirflokkar",
        "category-media-header": "Margmiðlunarefni í flokknum „$1“",
-       "category-empty": "''Þessi flokkur inniheldur engar síður eða margmiðlunarefni.''",
+       "category-empty": "<em>Þessi flokkur inniheldur engar síður eða margmiðlunarefni.</em>",
        "hidden-categories": "{{PLURAL:$1|Falinn flokkur|Faldir flokkar}}",
        "hidden-category-category": "Faldir flokkar",
        "category-subcat-count": "Þessi flokkur hefur eftirfarandi $1 {{PLURAL:$1|undirflokk|undirflokka}}, af alls $2.",
        "categorypage": "Skoða flokkatré",
        "viewtalkpage": "Skoða umræðu",
        "otherlanguages": "Á öðrum tungumálum",
-       "redirectedfrom": "(Tilvísað frá $1)",
+       "redirectedfrom": "(Endurbeint frá $1)",
        "redirectpagesub": "Tilvísunarsíða",
        "redirectto": "Tilvísun á",
        "lastmodifiedat": "Þessari síðu var síðast breytt $1 klukkan $2.",
        "viewsourcetext": "Þú getur skoðað og afritað kóða þessarar síðu:",
        "viewyourtext": "Þú getur skoðað og afritað kóða '''breytinganna þinna''' yfir á þessa síðu:",
        "protectedinterface": "Þessi síða útvegar textann sem birtist í viðmóti hugbúnaðarins sem keyrir þessa síðu, og er læst til að koma í veg fyrir misnotkun.\nTil þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/ translatewiki.net], staðfæringaverkefni MediaWiki",
-       "editinginterface": "'''Aðvörun:''' Þú ert að breyta síðu sem hefur að geyma texta fyrir notendaumhverfi hugbúnaðarins.\nBreytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda á þessu vefsvæði.\nTil þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/wiki/Main_Page?setlang=is translatewiki.net], staðfæringaverkefni MediaWiki.",
+       "editinginterface": "<strong>Aðvörun:</strong> Þú ert að breyta síðu sem hefur að geyma texta fyrir notendaumhverfi hugbúnaðarins.\nBreytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda á þessu vefsvæði.",
        "cascadeprotected": "Þessi síða hefur verið vernduð fyrir breytingum, vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er vernduð|síðum, sem eru verndaðar}} með „keðjuverndun“:\n$2",
        "namespaceprotected": "Þú hefur ekki leyfi til að breyta síðum í '''$1''' nafnrýminu.",
        "customcssprotected": "Þú hefur ekki leyfi að breyta þessari CSS-umbrotsíðu, því hún hefur notendastillingar annars notanda.",
        "password-login-forbidden": "Notkun þessa notendanafns og lykilorðs er ekki leyfileg.",
        "mailmypassword": "Endurstilla lykilorð",
        "passwordremindertitle": "Nýtt tímabundið aðgangsorð fyrir {{SITENAME}}",
-       "passwordremindertext": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.",
+       "passwordremindertext": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um að fá nýtt\nlykilorð fyrir {{SITENAME}} ($4). Tímabundið lykilorð fyrir notandann „$2“\nhefur verið búið til og er núna „$3“. Ef þetta er það sem þú vildir, þarfu að skrá\nþig inn og velja nýtt lykilorð.  Þetta tímabundna lykilorð rennur út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það var ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt,\nog vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og\nhalda áfram að nota gamla lykilorðið.",
        "noemail": "Það er ekkert netfang skráð fyrir notandan \"$1\".",
        "noemailcreate": "Þú verður að skrá gilt netfang",
        "passwordsent": "Nýtt lykilorð var sent á netfangið sem er skráð á „$1“.\nVinsamlegast skráðu þig inn á ný þegar þú hefur móttekið það.",
        "passwordreset-capture-help": "Ef þú hakar við þennan reit verður tölvupósturinn (með tímabundna lykilorðinu) sýndur þér og einnig sendur notandanum.",
        "passwordreset-email": "Netfang:",
        "passwordreset-emailtitle": "Notendaupplýsingar á {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
-       "passwordreset-emailtext-user": "Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
+       "passwordreset-emailtext-ip": "Einhver (líklegast þú, á vistfanginu $1) hefur beðið um \nendursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
+       "passwordreset-emailtext-user": "Notandinn $1 á {{SITENAME}} hefur beðið um endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:\n\n$2\n\nEf þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorðið rennur|Tímabundnu lykilorðin renna}} út eftir $5 {{PLURAL:$5|dag|daga}}.\n\nEf það varst ekki þú sem fórst fram á þetta, eða ef þú manst aftur lykilorðið þitt, og vilt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.",
        "passwordreset-emailelement": "Notendanafn: $1\nTímabundið lykilorð: $2",
        "passwordreset-emailsent": "Töluvpóstur til að endursetja lykilorðið hefur verið sendur.",
        "passwordreset-emailsent-capture": "Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.",
        "template-semiprotected": "(hálfvernduð)",
        "hiddencategories": "Þessi síða er meðlimur í $1 {{PLURAL:$1|földum flokki|földum flokkum}}:",
        "nocreatetext": "{{SITENAME}} hefur takmarkað eiginleikann að gera nýjar síður.\nÞú getur farið til baka og breytt núverandi síðum, eða [[Special:UserLogin|skráð þið inn eða búið til aðgang]].",
-       "nocreate-loggedin": "Þú hefur ekki leyfi til að skapa nýjar síður.",
+       "nocreate-loggedin": "Þú hefur ekki leyfi til að búa til nýjar síður.",
        "sectioneditnotsupported-title": "Hlutabreyting er ekki virk",
        "sectioneditnotsupported-text": "Hlutabreyting er ekki virk á þessari síðu.",
        "permissionserrors": "Leyfisvilla",
        "gender-female": "Hún breytir wikisíðum",
        "prefs-help-gender": "Þessi stilling er valfrjáls. Notað til að aðgreina kynin í meldingum hugbúnaðarins. Þessar upplýsingar verða aðgengilegar öllum.",
        "email": "Tölvupóstur",
-       "prefs-help-realname": "Alvöru nafn er valfrjálst.\nEf þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.",
+       "prefs-help-realname": "Raunverulegt nafn er valfrjálst.\nEf þú kýst að gefa það upp, verður það notað til að gefa þér heiður af verkum þínum.",
        "prefs-help-email": "Tölvupóstfang er valfrjálst, en gerir þér kleift að fá nýtt lykilorð ef þú gleymir lykilorðinu þínu.",
        "prefs-help-email-others": "Þú getur einnig valið að láta aðra hafa samband við þig með tölvupósti í gegnum tengil á notendasíðu eða notendaspjallsíðu þinni.\nTölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband við þig.",
        "prefs-help-email-required": "Þörf er á netfangi.",
        "userrights-no-interwiki": "Þú hefur ekki leyfi til að breyta notandaréttindum á öðrum wiki-síðum.",
        "userrights-nodatabase": "Gagnagrunnurinn $1 er ekki til eða ekki staðbundinn.",
        "userrights-nologin": "Þú verður að [[Special:UserLogin|innskrá]] þig á möppudýraaðgang til að geta útdeilt notandaréttindum.",
-       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttini.",
+       "userrights-notallowed": "Þú hefur ekki réttindi til að útdeila eða draga til baka notandaréttindi.",
        "userrights-changeable-col": "Hópar sem þú getur breytt",
        "userrights-unchangeable-col": "Hópar sem þú getur ekki breytt",
        "userrights-conflict": "Árekstur í að breyta notandaréttindum! Vinsamlegast skoðaðu aftur og staðfestu breytingar þínar.",
        "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
        "recentchanges-label-plusminus": "Stærð síðunnar breyttist um svona mörg bæti",
+       "recentchanges-legend-heading": "'''Fyrirsögn:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
        "rcnotefrom": "Að neðan {{PLURAL:$5|er breyting síðan|eru breytingar síðan}} <strong>$3, $4</strong> (allt að <strong>$1</strong> sýndar).",
        "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "uploaderror": "Villa í innhlaðningu",
        "upload-recreate-warning": "'''Viðvörun: Skrá með þessu nafni hefur verið eytt eða færð.'''\n\nSíðasta færsla skráarinnar úr bönnunarskrá og flutningskrá er sýnd hér fyrir neðan til skýringar:",
        "uploadtext": "Notaðu eyðublaðið hér fyrir neðan til að hlaða inn skrám.\nTil að skoða eða leita í áður innhlöðnum skrám ferðu á [[Special:FileList|skráarlistann]], (endur)innhlaðnar skrár eru skráðar í [[Special:Log/upload|innhlaðningarskránni]], eyðingar í [[Special:Log/delete|eyðingaskránni]].\n\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.jpg]]</nowiki></code>''' til að sýna skránna í fullri upplausn.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skrá.png|200px|thumb|left|alt-texti]]</nowiki></code>''' til að nota 200 díla upplausn í kassa, sett til vinstri með 'alt text' sem myndlýsingu.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skrá.ogg]]</nowiki></code>''' til að tengja í myndina án þess að sýna hana.",
-       "upload-permitted": "Heimilaðar skráargerðir: $1.",
-       "upload-preferred": "Ákjósanlegustu skrárgerðirnar: $1.",
-       "upload-prohibited": "Óheimiluð skrárgerð: $1.",
+       "upload-permitted": "{{PLURAL:$2|Heimiluð skráargerð|Heimilaðar skráargerðir}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Ákjósanleg skrárgerð|Ákjósanlegar skrárgerðir}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Óheimiluð skrárgerð|Óheimilaðar skrárgerðir}}: $1.",
        "uploadlogpage": "Innhlaðningarskrá",
        "uploadlogpagetext": "Fyrir neðan er listi yfir nýlegustu innhlöðnu skrárnar.\nSjá [[Special:NewFiles|myndasafn nýrra mynda]] fyrir myndrænna yfirlit.",
        "filename": "Skráarnafn",
        "illegalfilename": "Skráarnafnið „$1“ inniheldur stafi sem eru ekki leyfðir í síðutitlum.\nGjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.",
        "filename-toolong": "Skráarnöfn mega ekki vera lengri en 240 bæt.",
        "badfilename": "Skáarnafninu hefur verið breytt í „$1“.",
-       "filetype-mime-mismatch": "Skráarendingin \".$1\" samræmist ekki MIME gerð skráarinnar ($2).",
+       "filetype-mime-mismatch": "Skráarendingin \".$1\" samræmist ekki MIME-gerð skrárinnar ($2).",
        "filetype-badmime": "Skrárir af MIME-gerðinni „$1“ er ekki leyfilegt að hlaða inn.",
        "filetype-bad-ie-mime": "Mistókst að hlaða inn skrá því Internet Explorer myndi uppgvötva hana sem \"$1\" sem er óheimil og mögulega hættulegt skráarsnið.",
        "filetype-unwanted-type": "'''„.$1“''' er óæskileg skráargerð.\n{{PLURAL:$3|Ákjósanleg skráargerð er|Ákjósanlegar skráargerðir eru}} $2.",
        "illegal-filename": "Þetta skráarnafn er ekki leyft.",
        "overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
        "unknown-error": "Óþekkt villa kom upp.",
-       "tmp-create-error": "Gat ekki búið til tímabundna skrá.",
+       "tmp-create-error": "Gat ekki búið til bráðabirgðaskrá.",
        "tmp-write-error": "Villa við skrifun tímabundinnar skrár.",
        "large-file": "Það er mælt með að skrár séu ekki stærri en $1; þessi skrá er $2.",
        "largefileserver": "Þessi skrá er of stór. Vefþjónninn getur ekki tekið við skránni.",
        "windows-nonascii-filename": "Þessi wiki styður ekki skráarnöfn með sérstökum stöfum",
        "fileexists": "Skrá með þessu nafni er þegar til, skoðaðu <strong>[[:$1]]</strong> ef þú ert óviss um hvort þú viljir breyta henni.\n[[$1|thumb]]",
        "filepageexists": "Myndasíðan fyrir þessa síðu hefur þegar verið búin til <strong>[[:$1]]</strong>, en engin skrá er til með þessu nafni.\nLýsingin sem þú skrifaðir verður ekki birt á myndasíðunni.\nTil þess að lýsingin geti birst á síðunni, þá þarft þú að breyta síðunni sérstaklega.\n[[$1|thumb]]",
-       "fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skráarinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skráarinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kanski nota annað nafn sem er meira lýsandi fyrir skránna ?",
+       "fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skrárinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skrárinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kannski nota annað nafn sem er meira lýsandi fyrir skrána ?",
        "fileexists-thumbnail-yes": "Skráin virðist vera smámynd [[$1|thumb]]\nVinsamlegast athugaðu skránna <strong>[[:$1]]</strong>.\nEf skráin er sama myndin í upprunalegri stærð er ekki þörf á annari smámynd.",
        "file-thumbnail-no": "Skráin er líklega smámynd, því skráarnafnið byrjar á <strong>$1</strong>.\nEf skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.",
        "fileexists-forbidden": "Skrá með þessu nafni er þegar til og ekki er hægt að skrifa yfir skránna.\nEf þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.\n[[File:$1|thumb|center|$1]]",
        "filename-bad-prefix": "Sráarnafnið lýsir ekki skránni, heldur var það búið til af myndavélinni, því það byrjar á '''\"$1\"'''.\nVeldu lýsandi nafn fyrir skránna og reyndu aftur.",
        "upload-success-subj": "Innhlaðning tókst",
        "upload-success-msg": "Upphlöðun frá [$2] tókst. Það er aðgengilegt hér: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Vandamál við upphleðslu skráarinnar",
+       "upload-failure-subj": "Vandamál við upphleðslu",
        "upload-failure-msg": "Upphlaðið frá [$2] mistókst:\n\n$1",
        "upload-warning-subj": "Aðvörun",
        "upload-warning-msg": "Upphal þitt [$2] mistókst. Þú getur farið aftur á [[Special:Upload/stash/$1|upphlaðsviðmótið]] og leiðrétt villuna.",
        "upload-proto-error": "Vitlaus samskiptaregla",
        "upload-proto-error-text": "Upphlöðun frá öðrum vefþjón þarfnast vefslóðar sem byrjar á <code>http://</code> eða <code>ftp://</code>.",
        "upload-file-error": "Innri villa",
-       "upload-file-error-text": "Innri villa: Gat ekki búið til tímabundna skrá á vefþjóni.\nVinsamlegast hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
+       "upload-file-error-text": "Innri villa: Gat ekki búið til bráðabirgðaskrá á vefþjóni.\nVinsamlegast hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-misc-error": "Óþekkt innhleðsluvilla",
        "upload-misc-error-text": "Upphal þitt mistókst vegna óþekktrar villu.\nAthugaðu hvort vefslóðin sé rétt og aðgengileg og að því loknu reyndu aftur.\nEf vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjórnanda]].",
        "upload-too-many-redirects": "Vefslóðin inniheldur of margar tilvísanir.",
-       "upload-http-error": "HTTP villa kom upp við upphal skráarinnar: $1",
+       "upload-http-error": "HTTP villa kom upp: $1",
        "upload-copy-upload-invalid-domain": "Lokað er fyrir afritun skráa frá öðrum vefþjón á þessu vefsvæði.",
        "backend-fail-stream": "Gat ekki streymt skránni „$1“.",
-       "backend-fail-backup": "Öryggisafritun skráarinnar $1 mistókst.",
+       "backend-fail-backup": "Öryggisafritun skrárinnar $1 mistókst.",
        "backend-fail-notexists": "Skráin $1 er ekki til.",
        "backend-fail-hashes": "Gat ekki nálgast tætigildi skráanna til samanburðar.",
        "backend-fail-notsame": "Ólík skrá er þegar til á $1.",
        "backend-fail-invalidpath": "$1 er ekki gildur geymslustaður.",
        "backend-fail-delete": "Mistókst að eyða skránni $1.",
-       "backend-fail-describe": "Mistókst að breyta lýsisgögnum skráarinnar „$1“.",
+       "backend-fail-describe": "Mistókst að breyta lýsisgögnum skrárinnar „$1“.",
        "backend-fail-alreadyexists": "Skráin $1 er þegar til.",
        "backend-fail-store": "Mistókst að vista skrá $1 á $2.",
        "backend-fail-copy": "Mistókst að afrita skjal $1 á $2.",
        "backend-fail-move": "Mistókst að færa skrá $1 á $2.",
-       "backend-fail-opentemp": "Mistókst að opna tímabundna skrá.",
-       "backend-fail-writetemp": "Gat ekki skrifað í tímabundna skrá.",
+       "backend-fail-opentemp": "Mistókst að opna bráðabirgðaskrá.",
+       "backend-fail-writetemp": "Gat ekki skrifað í bráðabirgðaskrá.",
        "backend-fail-closetemp": "Mistókst að loka tímabundinni skrá.",
        "backend-fail-read": "Mistókst að lesa skrá $1.",
        "backend-fail-create": "Mistókst að skrifa skrá $1.",
        "backend-fail-synced": "Skráin $1 er í ósamkvæmu ástandi innan innri geymslubakenda",
        "backend-fail-connect": "Mistókst að tengjast gagnabankanum \"$1\".",
        "backend-fail-internal": "Óþekkt villa átti sér stað í gagnabankanum \"$1\".",
-       "backend-fail-contenttype": "Gat ekki ákvarðað innihaldgerð skráarinnar til geymslu á „$1“.",
+       "backend-fail-contenttype": "Gat ekki ákvarðað innihaldgerð skrárinnar til geymslu á „$1“.",
        "backend-fail-batchsize": "Geymslubakendinn fékk bunka af $1 {{PLURAL:$1|skráaraðgerð|skráaraðgerðum}}; mest eru leyfðar $2 {{PLURAL:$2|aðgerð|aðgerðir}}.",
        "backend-fail-usable": "Gat ekki lesið skrána „$1“ vegna ófullnægjandi aðgangsheimilda eða týndra mappa/íláta.",
        "filejournal-fail-dbconnect": "Gat ekki tengst dagbókargrunni fyrir geymslubakendann „$1“.",
        "lockmanager-fail-db-release": "Gat ekki opnað lása á gagnagrunninum $1.",
        "lockmanager-fail-svr-acquire": "Gat ekki nálgast lása á þjóninum $1.",
        "lockmanager-fail-svr-release": "Gat ekki opnað lása á þjóninum $1.",
-       "zip-file-open-error": "Mistök við opnun skráarinnar fyrir ZIP athuganir.",
+       "zip-file-open-error": "Mistök við opnun skrárinnar fyrir ZIP prófanir.",
        "zip-wrong-format": "Skráin var ekki ZIP skrá.",
-       "zip-bad": "Þessi ZIP skrá er skemmd eða ólesanleg.\nEkki var hægt að athuga öryggi skráarinnar almennilega.",
-       "zip-unsupported": "Þessi skrá er ZIP skrá sem notar möguleika sem eru ekki studdir af MediaWiki.\nEkki er hægt að athuga öryggi skráarinnar almennilega.",
+       "zip-bad": "Þessi ZIP skrá er skemmd eða ólesanleg.\nEkki var hægt að athuga öryggi skrárinnar almennilega.",
+       "zip-unsupported": "Þessi skrá er ZIP skrá sem notar möguleika sem eru ekki studdir af MediaWiki.\nEkki er hægt að athuga öryggi skrárinnar almennilega.",
        "uploadstash": "Óútgefnar skrár",
        "uploadstash-summary": "Þessi síða gefur aðgang að þeim skrám sem hafa verið hlaðið inn (eða eru í biðröð eftir því að vera hlaðið inn) en hafa ekki verið útgefnar. Þessar skrár eru eingöngu sýnilegar þeim notanda sem hlóð þeim inn.",
        "uploadstash-clear": "Tæma listann",
        "license-nopreview": "(Forskoðun ekki fáanleg)",
        "upload_source_url": "(þín valda skrá frá gildri, aðgengilegri vefslóð)",
        "upload_source_file": "(þín valda skrá frá tölvunni þinni)",
+       "listfiles-delete": "eyða",
        "listfiles-summary": "Þessi kerfissíða sýnir allar upphlaðnar skrár.",
        "listfiles_search_for": "Leita að miðilsnafni:",
+       "listfiles-userdoesnotexist": "Notandinn \"$1\" er ekki skráður.",
        "imgfile": "skrá",
        "listfiles": "Skráalisti",
        "listfiles_thumb": "Smámynd",
        "sharedupload": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.",
        "sharedupload-desc-there": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.\nGjörðu svo vel og sjáðu [$2 skráarsíðuna þar] fyrir fleiri upplýsingar.",
        "sharedupload-desc-here": "Skrá þessi er af $1, og deilt meðal annarra verkefna og nýtist því þar.\nHér fyrir neðan er afrit af [$2 skráarsíðunni þar].",
-       "sharedupload-desc-edit": "Þessi skrá er af $1 og gæti verið í notkun á öðrum vefkefnum.\nHentugra væri ef þú gætir breytt lýsingu skráarinnar á [$2 myndasíðu] hennar þar.",
-       "sharedupload-desc-create": "Ã\9eessi skrá er af $1 og gæti verið Ã­ notkun Ã¡ Ã¶Ã°rum vefkefnum.\nHentugra væri ef Ã¾Ãº gætir breytt lýsingu skráarinnar á [$2 myndasíðu] hennar þar.",
+       "sharedupload-desc-edit": "Þessi skrá er af $1 og gæti verið í notkun á öðrum vefkefnum.\nHentugra væri ef þú gætir breytt lýsingu skrárinnar á [$2 myndasíðu] hennar þar.",
+       "sharedupload-desc-create": "Ã\9eessi skrá er af $1 og gæti verið Ã­ notkun Ã­ Ã¶Ã°rum verkefnum.\nHentugra væri ef Ã¾Ãº gætir breytt lýsingu skrárinnar á [$2 myndasíðu] hennar þar.",
        "filepage-nofile": "Engin skrá er til með þessu nafni.",
        "filepage-nofile-link": "Engin skrá er til með þessu nafni, en þú getur [$1 hlaðið henni inn].",
        "uploadnewversion-linktext": "Hlaða inn nýrri útgáfu af þessari skrá",
        "randomincategory": "Handhófsvalin síða í flokki",
        "randomincategory-invalidcategory": "„$1“ er ekki gilt flokkarheiti",
        "randomincategory-nopages": "Það eru engar síður í flokkinum [[:Category:$1|$1]].",
+       "randomincategory-category": "Flokkur:",
+       "randomincategory-legend": "Handhófsvalin síða í flokki",
        "randomredirect": "Handahófsvalin tilvísun",
        "randomredirect-nopages": "Það eru engar tilvísanir í nafnrýminu „$1“.",
        "statistics": "Tölfræði",
        "undelete-missing-filearchive": "Mistókst að endurvekja skjalasafn með auðkenninu $1 því það er ekki til í gagnabankanum.\nMögulega er þegar búið að endurvekja það.",
        "undelete-error": "Mistókst að endurvekja síðu.",
        "undelete-error-short": "Villa við endurvakningu skráar: $1",
-       "undelete-error-long": "Það kom upp villa við endurvakningu skráarinnar:\n\n$1",
+       "undelete-error-long": "Það kom upp villa við endurvakningu skrárinnar:\n\n$1",
        "undelete-show-file-confirm": "Ertu viss um að þú viljir sjá eydda breytingu af skránni \"<nowiki>$1</nowiki>\" frá $2 $3?",
        "undelete-show-file-submit": "Já",
        "namespace": "Nafnrými:",
        "thumbnail_error_remote": "Villumelding frá $1:\n$2",
        "djvu_page_error": "DjVu-blaðsíða er utan marka",
        "djvu_no_xml": "Mistókst að sækja XML-gögn fyrir DjVu skrá",
-       "thumbnail-temp-create": "Mistókst að búa til tímabundna smámynd.",
+       "thumbnail-temp-create": "Mistókst að búa til bráðabirgða-smámyndaskrá",
        "thumbnail-dest-create": "Gat ekki vistað smámynd á markstað",
        "thumbnail_invalid_params": "Breytur smámyndarinnar eru rangar",
        "thumbnail_dest_directory": "Mistókst að búa til niðurhals möppu",
        "thumbnail_gd-library": "Ófullkomin stilling GD-safns: Skortir aðgerðina $1",
        "thumbnail_image-missing": "Skránna vantar: $1",
        "import": "Flytja inn síður",
-       "importinterwiki": "Milli-Wiki innflutningur",
+       "importinterwiki": "Flytja inn frá öðru wiki",
        "import-interwiki-text": "Veldu Wiki-kerfi og síðutitil til að flytja inn.\nBreytingaupplýsingar s.s. dagsetningar og höfundanöfn eru geymd.\nAllir innflutningar eru skráð í [[Special:Log/import|innflutningsskránna]].",
        "import-interwiki-history": "Afrita allar breytingar þessarar síðu",
        "import-interwiki-templates": "Innifala öll snið með",
        "import-interwiki-submit": "Flytja inn",
-       "import-interwiki-namespace": "Ákvörðunarnafnrými:",
-       "import-interwiki-rootpage": "Markmóðursíða (valfrjáls):",
        "import-upload-filename": "Skráarnafn:",
        "import-comment": "Athugasemdir:",
        "importtext": "Vinsamlegast fluttu út skránna frá upprunalegum wiki með því að nota [[Special:Export|Flytja út síður]].\nVistaðu skránna á tölvunni þinni og hladdu henni inn hér.",
        "importsuccess": "Innflutningi lokið!",
        "importnosources": "Engin uppspretta hefur verið valin og bein upphlöð breytingarskráa eru óvirk.",
        "importnofile": "Engri skrá var hlaðið inn.",
-       "importuploaderrorsize": "Upphlöðun skráarinnar mistókst.\nSkráin er stærri en hámarsstærð síðna segir til um.",
-       "importuploaderrorpartial": "Upphlöðun skráarinnar mistókst.\nSkráinni var eingöngu að hluta til hlaðið inn.",
-       "importuploaderrortemp": "Upphlöðun skráarinnar mistókst.\nTímabundin mappa fannst ekki.",
+       "importuploaderrorsize": "Upphleðsla skrárinnar mistókst.\nSkráin er stærri en leyfð hámarksstærð.",
+       "importuploaderrorpartial": "Upphleðsla skráarinnar mistókst.\nSkráinni var eingöngu hlaðið inn að hluta.",
+       "importuploaderrortemp": "Upphleðsla skrárinnar mistókst.\nBráðabirgðamappa fannst ekki.",
        "import-parse-failure": "Þáttunarvilla við innflutning XML skjals",
        "import-noarticle": "Engin síða til innflutnings!",
        "import-nonewrevisions": "Engar breytingar voru fluttar inn (þær voru allar annaðhvort þegar til eða sleppt vegna villna).",
        "log-show-hide-patrol": "$1 Listi yfir vaktaðar síður",
        "deletedrevision": "Eyddi gamla útgáfu $1",
        "filedeleteerror-short": "Villa við eyðingu: $1",
-       "filedeleteerror-long": "Það kom upp villa við eyðingu skráarinnar: $1",
+       "filedeleteerror-long": "Það kom upp villa við eyðingu skrárinnar: $1",
        "filedelete-missing": "Skránni „$1“ er ekki hægt að eyða vegna þess að hún er ekki til.",
        "filedelete-old-unregistered": "Tilgreind útgáfa \"$1\" er ekki til í gagnabankanum.",
        "filedelete-current-unregistered": "Tilgreind skrá \"$1\" er ekki til í gagnabankanum.",
        "revdelete-uname-unhid": "notandanafn birt",
        "revdelete-restricted": "hömlur settar á stjórnendur",
        "revdelete-unrestricted": "fjarlægja hömlur á stjórnendur",
+       "logentry-block-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bannaði}} {{GENDER:$4|$3}}, rennur út eftir $5 $6",
        "logentry-move-move": "$1 {{GENDER:$2|færði}} $3 á $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|færði}} $3 á $4 án þess að skilja eftir tilvísun",
        "api-error-nomodule": "Innri villa: Engin upphlaðs eining valin.",
        "api-error-ok-but-empty": "Innri villa: ekkert svar frá vefþjón.",
        "api-error-overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
-       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt tímabundna skrá.",
+       "api-error-stashfailed": "Innri villa: Vefþjónninn gat ekki geymt bráðabirgðaskrá.",
        "api-error-publishfailed": "Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.",
        "api-error-timeout": "Vefþjónninn svaraði ekki á tilætluðum tíma.",
        "api-error-unclassified": "Óþekkt villa kom upp.",
index 6f7ad23..a5e6ae5 100644 (file)
        "noarticletext-nopermission": "In questo momento la pagina richiesta è vuota. È possibile [[Special:Search/{{PAGENAME}}|cercare questo titolo]] nelle altre pagine del sito o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercare nei registri correlati]</span>, ma non hai i permessi per creare questa pagina.",
        "missing-revision": "La versione #$1 della pagina \"{{FULLPAGENAME}}\" non esiste.\n\nQuesto si verifica solitamente seguendo un collegamento a una pagina cancellata, in una cronologia non aggiornata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
        "userpage-userdoesnotexist": "L'account \"$1\" non corrisponde a un utente registrato.\nVerificare che si intenda davvero creare o modificare questa pagina.",
-       "userpage-userdoesnotexist-view": "L'account utente \"$1\" non è registrato.",
+       "userpage-userdoesnotexist-view": "L'utenza \"$1\" non è registrata.",
        "blocked-notice-logextract": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "clearyourcache": "<strong>Nota:</strong> dopo aver salvato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti. \n*<strong>Firefox / Safari:</strong> tenere premuto il tasto delle maiuscole <em>Shift</em> e fare clic su <em>Ricarica</em>, oppure premere <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> su Mac)\n*<strong>Google Chrome:</strong> premere <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> su un Mac)\n*<strong>Internet Explorer:</strong> tenere premuto il tasto <em>Ctrl</em> e fare clic su <em>Aggiorna</em>, oppure premere <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuotare completamente la cache dal menu <em>Strumenti → Preferenze</em>",
        "usercssyoucanpreview": "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo CSS prima di salvarlo.",
        "note": "'''Nota:'''",
        "previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
        "continue-editing": "Vai all'area di modifica",
-       "previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere \"Salva la pagina\" in questo momento.",
+       "previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di salvarla in questo momento.",
        "session_fail_preview": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\nRiprovare.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
        "session_fail_preview_html": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.'''\n\n''Poiché in {{SITENAME}} è abilitato l'uso di HTML senza limitazioni, l'anteprima non viene visualizzata; si tratta di una misura di sicurezza contro gli attacchi JavaScript.''\n\n'''Se questo è un legittimo tentativo di modifica, riprovare. Se il problema persiste, si può provare a [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
        "token_suffix_mismatch": "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
        "history-feed-description": "Cronologia della pagina su questo sito",
        "history-feed-item-nocomment": "$1 il $2",
        "history-feed-empty": "La pagina richiesta non esiste; potrebbe essere stata cancellata dal sito o rinominata. Verificare con la [[Special:Search|pagina di ricerca]] se vi sono nuove pagine.",
+       "history-edit-tags": "Modifica le etichette delle versioni selezioniate",
        "rev-deleted-comment": "(Oggetto della modifica rimosso)",
        "rev-deleted-user": "(nome utente rimosso)",
        "rev-deleted-event": "(dettagli del registro rimossi)",
        "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]]",
+       "right-applychangetags": "Applica delle [[Special:Tags|etichette]] alle proprie modifiche",
+       "right-changetags": "Aggiunge e rimuove specifiche [[Special:Tags|etichette]] su singole versioni o voci di registro",
        "newuserlogpage": "Nuovi utenti",
        "newuserlogpagetext": "Di seguito sono elencate le utenze di nuova creazione.",
        "rightslog": "Diritti degli utenti",
        "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",
+       "action-applychangetags": "applicare delle etichette alle tue modifiche",
+       "action-changetags": "aggiungere o rimuovere specifiche etichette su singole versioni o voci di registro",
        "nchanges": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dall'ultima visita}}",
        "enhancedrc-history": "cronologia",
        "listfiles-delete": "cancella",
        "listfiles-summary": "Questa pagina speciale mostra tutti i file caricati.",
        "listfiles_search_for": "Ricerca immagini per nome:",
+       "listfiles-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "imgfile": "file",
        "listfiles": "Elenco dei file",
        "listfiles_thumb": "Miniatura",
        "logempty": "Il registro non contiene elementi corrispondenti alla ricerca.",
        "log-title-wildcard": "Ricerca dei titoli che iniziano con",
        "showhideselectedlogentries": "Mostra/nascondi le voci di registro selezionate",
+       "log-edit-tags": "Modifica le etichette delle voci di registro selezionate",
        "allpages": "Tutte le pagine",
        "nextpage": "Pagina successiva ($1)",
        "prevpage": "Pagina precedente ($1)",
        "emailccsubject": "Copia del messaggio inviato a $1: $2",
        "emailsent": "Messaggio inviato",
        "emailsenttext": "Il messaggio e-mail è stato inviato.",
-       "emailuserfooter": "Questa email è stata inviata da $1 a $2 attraverso la funzione \"Invia un messaggio email all'utente\" su {{SITENAME}}.",
+       "emailuserfooter": "Questa email è stata inviata da $1 a $2 attraverso la funzione \"{{int:emailpage}}\" su {{SITENAME}}.",
        "usermessage-summary": "Messaggio di sistema",
        "usermessage-editor": "Messaggero di sistema",
        "usermessage-template": "MediaWiki:MessaggioUtente",
        "contributions-title": "Contributi di $1",
        "mycontris": "contributi",
        "contribsub2": "Per {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "L'account utente \"$1\" non è registrato.",
+       "contributions-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "nocontribs": "Non sono state trovate modifiche che soddisfino i criteri di ricerca.",
        "uctop": "(attuale)",
        "month": "Dal mese (e precedenti):",
        "import-interwiki-history": "Copia l'intera cronologia di questa pagina",
        "import-interwiki-templates": "Includi tutti i template",
        "import-interwiki-submit": "Importa",
-       "import-interwiki-namespace": "Namespace di destinazione:",
-       "import-interwiki-rootpage": "Pagina principale di destinazione (opzionale):",
        "import-upload-filename": "Nome file:",
        "import-comment": "Oggetto:",
        "importtext": "Si prega di esportare il file dal sito wiki di origine con la [[Special:Export|funzione di esportazione]], salvarlo sul proprio disco e poi caricarlo qui.",
        "pageinfo-protect-cascading-yes": "Sì",
        "pageinfo-protect-cascading-from": "Protezione ricorsiva ereditata da",
        "pageinfo-category-info": "Informazioni sulla categoria",
+       "pageinfo-category-total": "Numero totale di membri",
        "pageinfo-category-pages": "Numero di pagine",
        "pageinfo-category-subcats": "Numero di sottocategorie",
        "pageinfo-category-files": "Numero di file",
        "patrol-log-page": "Modifiche verificate",
        "patrol-log-header": "Di seguito sono elencate le verifiche delle modifiche.",
        "log-show-hide-patrol": "$1 registro delle modifiche verificate",
+       "log-show-hide-tag": "$1 registro delle etichiette",
        "deletedrevision": "Cancellata la vecchia versione di $1.",
        "filedeleteerror-short": "Errore nella cancellazione del file: $1",
        "filedeleteerror-long": "Si sono verificati degli errori nel tentativo di cancellare il file:\n\n$1",
        "tags-deactivate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "Non è possibile disattivare il tag \"$1\".",
        "tags-deactivate-submit": "Disattiva",
+       "tags-apply-not-allowed-one": "L'etichetta \"$1\" non può essere applicata manualmente.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|La seguente etichetta non può essere applicata|Le seguenti etichette non possono essere applicate}}  manualmente: $1",
+       "tags-edit-title": "Modifica etichette",
+       "tags-edit-manage-link": "Gestisci etichette",
+       "tags-edit-existing-tags": "Etichette esistenti:",
+       "tags-edit-existing-tags-none": "''Nessuna''",
+       "tags-edit-new-tags": "Nuove etichette:",
+       "tags-edit-add": "Aggiungi queste etichette:",
+       "tags-edit-remove": "Rimuovi queste etichette:",
+       "tags-edit-chosen-placeholder": "Seleziona alcune etichette",
+       "tags-edit-reason": "Motivo:",
        "comparepages": "Confronta le pagine",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|ha rimosso}} l'etichetta \"$4\" (da $5 {{PLURAL:$5|versione o voce di registro|versioni o voci di registro}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|ha inserito}} l'etichetta \"$4\" per l'uso da parte d'utenti e bot",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|ha disattivato}} l'etichetta \"$4\" per l'uso da parte d'utenti e bot",
+       "log-name-tag": "Etichette",
        "rightsnone": "(nessuno)",
        "revdelete-summary": "oggetto della modifica",
        "feedback-adding": "Inserimento del feedback nella pagina...",
        "feedback-error1": "Errore: Dalla API è arrivato un risultato non riconosciuto",
        "feedback-error2": "Errore: Non è stato possibile eseguire la modifica",
        "feedback-error3": "Errore: Nessuna risposta dalla API",
+       "feedback-error4": "Errore: impossibile inviare il feedback al titolo indicato",
        "feedback-message": "Messaggio:",
        "feedback-subject": "Oggetto:",
        "feedback-submit": "Invia",
        "log-name-pagelang": "Modifiche lingua",
        "log-description-pagelang": "Questo è un registro delle modifiche alla lingua delle pagine.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha modificato}} la lingua della pagina $3 da $4 a $5.",
-       "default-skin-not-found": "Oops! La skin predefinita per il tuo wiki, definita in <code dir=\"ltr\">$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nLa tua installazione sembra includere le seguenti skin. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitarle e scegliere quella predefinita.\n\n$2\n\n; Se hai appena installato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaricando tarball di singole skin da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando uno dei repository <code>mediawiki/skins/*</code> tramite git nella directory <code>skins/</code> della tua installazione MediaWiki.\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki.\n\n; Se hai appena aggiornato MediaWiki:\n: MediaWiki 1.24 e versioni successive non abilità più automaticamente le skin installate (vedi [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automatico skin]). Puoi copiare le seguenti linee nel <code>LocalSettings.php</code> per abilitare tutte le skin attualmente installate:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se hai appena modificato <code>LocalSettings.php</code>:\n: Ricontrolla i nomi delle skin per errori di battitura.",
+       "default-skin-not-found": "Oops! La skin predefinita per il tuo wiki, definita in <code dir=\"ltr\">$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nLa tua installazione sembra includere {{PLURAL:$4|la seguente|le seguenti}} skin. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitar{{PLURAL:$4|la|le e scegliere quella predefinita}}.\n\n$2\n\n; Se hai appena installato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaricando tarball di singole skin da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando uno dei repository <code>mediawiki/skins/*</code> tramite git nella directory <code>skins/</code> della tua installazione MediaWiki.\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki.\n\n; Se hai appena aggiornato MediaWiki:\n: MediaWiki 1.24 e versioni successive non abilitano più automaticamente le skin installate (vedi [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automatico skin]). Puoi copiare {{PLURAL:$5|la seguente linea|le seguenti linee}} nel <code>LocalSettings.php</code> per abilitare {{PLURAL:$5|la|tutte le}} skin attualmente {{PLURAL:$5|installata|installate}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se hai appena modificato <code>LocalSettings.php</code>:\n: Ricontrolla i nomi delle skin per errori di battitura.",
        "default-skin-not-found-no-skins": "Oops! La skin predefinita per il tuo wiki, definita in <code>$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nNon hai skin installate.\n\n; Se hai appena installato o aggiornato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. MediaWiki 1.24 e versioni successive non include alcuna skin nel repository principale. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code>skins/</code> da lì.\n:* Scaricando tarball di singole skin da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando uno dei repository <code>mediawiki/skins/*</code> tramite git nella directory <code dir=\"ltr\">skins/</code> della tua installazione MediaWiki.\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitarle e scegliere quella predefinita.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilitata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabilitata''')",
index 68e621e..d97d122 100644 (file)
@@ -64,7 +64,8 @@
                        "SkyDaisy9",
                        "Los688",
                        "朝彦",
-                       "Otokoume"
+                       "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": "{{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 ページ}}が含まれています。",
        "wrongpassword": "パスワードが間違っています。 \nもう一度やり直してください。",
        "wrongpasswordempty": "パスワードを空欄にはできません。\nもう一度やり直してください。",
        "passwordtooshort": "パスワードは {{PLURAL:$1|$1 文字}}以上にしてください。",
+       "passwordtoolong": "パスワードは {{PLURAL:$1|$1 文字}}以下にしてください。",
        "password-name-match": "パスワードは利用者名とは異なる必要があります。",
        "password-login-forbidden": "この利用者名とパスワードの使用は禁止されています。",
        "mailmypassword": "パスワードを再設定",
        "missingcommentheader": "<strong>注意:</strong> このコメントに対する題名/見出しが空欄です。\n「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
        "summary-preview": "要約のプレビュー:",
        "subject-preview": "題名/見出しのプレビュー:",
+       "previewerrortext": "変更のプレビューを処理中にエラーが発生しました。",
        "blockedtitle": "利用者はブロックされています",
        "blockedtext": "<strong>この利用者名またはIPアドレスはブロックされています。</strong>\n\nブロックは$1によって実施されました。\nブロックの理由は <em>$2</em> です。\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\nこのブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。\nただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。\n現在ご使用中のIPアドレスは$3、このブロックIDは#$5です。\nお問い合わせの際には、上記の情報を必ず書いてください。",
        "autoblockedtext": "このIPアドレスは、$1によりブロックされた利用者によって使用されたため、自動的にブロックされています。\n理由は次の通りです。\n\n:<em>$2</em>\n\n* ブロック開始日時: $8\n* ブロック解除予定: $6\n* ブロック対象: $7\n\n$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。\n\nただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、「この利用者にメールを送信」機能を使用できないことに注意してください。\n\n現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。\nお問い合わせの際は、上記の情報を必ず書いてください。",
        "history-feed-description": "このウィキのこのページに関する変更履歴",
        "history-feed-item-nocomment": "$2に$1による",
        "history-feed-empty": "要求されたページは存在しません。\nこのウィキから既に削除されたか、名前が変更された可能性があります。\n[[Special:Search|このウィキの検索]]で関連する新しいページを探してみてください。",
+       "history-edit-tags": "選択した版のタグを編集",
        "rev-deleted-comment": "(要約は除去されています)",
        "rev-deleted-user": "(利用者名は除去されています)",
        "rev-deleted-event": "(記録の詳細は除去されています)",
        "revdelete-unsuppress": "復元版に対する制限を除去",
        "revdelete-log": "理由:",
        "revdelete-submit": "選択された{{PLURAL:$1|版}}に適用",
-       "revdelete-success": "<strong>版の閲覧レベルを更新しました。</strong>",
-       "revdelete-failure": "<strong>版の閲覧レベルを更新できませんでした:</strong>\n$1",
-       "logdelete-success": "<strong>記録の閲覧レベルを変更しました。</strong>",
-       "logdelete-failure": "<strong>記録の閲覧レベルを設定できませんでした。</strong>\n$1",
+       "revdelete-success": "版の閲覧レベルを更新しました。",
+       "revdelete-failure": "版の閲覧レベルを更新できませんでした:\n$1",
+       "logdelete-success": "記録の閲覧レベルを変更しました。",
+       "logdelete-failure": "記録の閲覧レベルを設定できませんでした。\n$1",
        "revdel-restore": "閲覧レベルを変更",
        "pagehist": "ページの履歴",
        "deletedhist": "削除された履歴",
        "difference-title": "「$1」の版間の差分",
        "difference-title-multipage": "ページ「$1」と「$2」の間の差分",
        "difference-multipage": "(ページ間の差分)",
-       "lineno": "行$1:",
+       "lineno": "$1行目:",
        "compareselectedversions": "選択した版同士を比較",
        "showhideselectedversions": "選択した版を表示/非表示",
        "editundo": "取り消し",
        "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)",
        "listfiles-delete": "削除",
        "listfiles-summary": "この特別ページでは、アップロードされたファイルをすべて表示します。",
        "listfiles_search_for": "検索するメディア名:",
+       "listfiles-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
        "imgfile": "ファイル",
        "listfiles": "ファイル一覧",
        "listfiles_thumb": "サムネイル",
        "emailccsubject": "$1 に送信したメールの控え: $2",
        "emailsent": "メールを送信しました",
        "emailsenttext": "メールを送信しました。",
-       "emailuserfooter": "このメールは$1から$2へ、{{SITENAME}}の「利用者にメールを送信」機能で送信されました。",
+       "emailuserfooter": "このメールは$1から$2へ、{{SITENAME}}の「{{int:emailpage}}」機能で送信されました。",
        "usermessage-summary": "システムメッセージを残す。",
        "usermessage-editor": "システムメッセンジャー",
        "watchlist": "ウォッチリスト",
        "import-interwiki-history": "このページのすべての版を複製する",
        "import-interwiki-templates": "すべてのテンプレートを含める",
        "import-interwiki-submit": "取り込み",
-       "import-interwiki-namespace": "取り込み先の名前空間:",
-       "import-interwiki-rootpage": "取り込み先のルートページ (省略可能):",
        "import-upload-filename": "ファイル名:",
        "import-comment": "コメント:",
        "importtext": "元のウィキで[[Special:Export|書き出し機能]]を使用してファイルに書き出してください。\nそれをコンピューターに保存した後、こちらへアップロードしてください。",
        "pageinfo-protect-cascading-yes": "はい",
        "pageinfo-protect-cascading-from": "カスケード保護の起点",
        "pageinfo-category-info": "カテゴリ情報",
+       "pageinfo-category-total": "総メンバー数",
        "pageinfo-category-pages": "ページ数",
        "pageinfo-category-subcats": "下位カテゴリ数",
        "pageinfo-category-files": "ファイル数",
        "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-deactivate-reason": "理由:",
        "tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
        "tags-deactivate-submit": "無効化",
+       "tags-edit-title": "タグの編集",
+       "tags-edit-reason": "理由:",
        "comparepages": "ページの比較",
        "compare-page1": "ページ 1",
        "compare-page2": "ページ 2",
        "revdelete-uname-unhid": "利用者名の可視化",
        "revdelete-restricted": "管理者に対する制限の適用",
        "revdelete-unrestricted": "管理者に対する制限の除去",
-       "logentry-block-block": "$1 が $3 を$5ブロックしました $6",
-       "logentry-block-reblock": "$1 が $3 のブロック設定を $5 に変更しました $6",
+       "logentry-block-block": "$1 が {{GENDER:$4|$3}} を$5で{{GENDER:$2|ブロックしました}} $6",
+       "logentry-block-unblock": "$1 が {{GENDER:$4|$3}} の{{GENDER:$2|ブロックを解除しました}}",
+       "logentry-block-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
+       "logentry-suppress-block": "$1 が {{GENDER:$4|$3}} を$5で{{GENDER:$2|ブロックしました}} $6",
+       "logentry-suppress-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
+       "logentry-import-upload": "$1 がファイルをアップロードして $3 を{{GENDER:$2|インポートしました}}",
+       "logentry-import-interwiki": "$1 が他のウィキから $3 を{{GENDER:$2|インポートしました}}",
        "logentry-merge-merge": "$1{{GENDER:$2|統合元}} と$3を$4に統合(改訂版を$5に掲載)",
        "logentry-move-move": "$1 がページ「$3」を「$4」に{{GENDER:$2|移動しました}}",
        "logentry-move-move-noredirect": "$1 がページ「$3」を「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}",
        "logentry-upload-revert": "$1 が $3 を {{GENDER:$2|アップロードしました}}",
        "log-name-managetags": "タグ管理記録",
        "log-description-managetags": "このページは[[Special:Tags|タグ]]に関係する管理タスクをリストアップしています。ログには管理者によって手動で実行された操作の記録しか記載されていません。ウィキ・ソフトウェアによって、ログを残さずにタグが作成・削除されている場合があります。",
+       "logentry-managetags-create": "$1 がタグ「$4」を{{GENDER:$2|作成しました}}",
        "rightsnone": "(なし)",
        "revdelete-summary": "編集内容の要約",
        "feedback-adding": "ページへのフィードバックの追加...",
index 06e5863..6445043 100644 (file)
        "notextmatches": "არ შეესაბამება არცერთი გვერდის ტექსტი",
        "prevn": "წინა {{PLURAL:$1|$1}}",
        "nextn": "შემდეგი {{PLURAL:$1|$1}}",
+       "prev-page": "წინა გვერდი",
+       "next-page": "შემდეგი გვერდი",
        "prevn-title": "{{PLURAL:$1|წინა $1 ჩანაწერი|წინა $1 ჩანაწერები|წინა $1 ჩანაწერების}}",
        "nextn-title": "შემდეგი $1 {{PLURAL:$1|რეზულტატი|რეზულტატები}}",
        "shown-title": "აჩვენეთ $1 {{PLURAL:$1|რეზულტატი|რეზულტატი}} გვერდზე",
        "import-interwiki-history": "ამ გვერდის ცვლილებათა ისტორიის კოპირება.",
        "import-interwiki-templates": "ყველა თარგის ჩართვა",
        "import-interwiki-submit": "იმპორტირება",
-       "import-interwiki-namespace": "სამიზნე სახელთა სივრცე",
-       "import-interwiki-rootpage": "ძირეული გვერდი (არასავალდებულო):",
        "import-upload-filename": "ფაილის სახელი:",
        "import-comment": "კომენტარი:",
        "importtext": "გთხოვთ, მოახდინოთ გვერდის ექსპორტი თავდაპირველი ვიკიდან, [[Special:Export|შესაბამისი ხელსაწყოს]] გამოყენებით. ფაილი შეინახეთ დისკზე, ხოლო შემდეგ ატვირთეთ აქ.",
index 00959b6..4c4a69c 100644 (file)
@@ -19,6 +19,7 @@
        "tog-watchdefault": "مہ ترمیم کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
        "tog-watchmoves": "آوا کیہ صفحاتن کہ منتقل کومان ھتیتان مہ زیرِنظرفہرستہ شامل کورے",
        "tog-watchdeletion": "آوا کیہ صفحاتن کہ حذف آریتام، ھتیتان مہ زیرِنظرفہرستہ شامل کورے",
+       "tog-watchrollback": "آوا کیہ صفحاتن کہ Undoآریتام ھتیتان مہ زیر نظر فہرستہ شامل کورے",
        "tog-minordefault": "تھمامو ترمیماتن ہمیشہ بطورِ معمولی ترمیم نشانزد کورے",
        "tog-previewontop": "تدوینی خاناری پروشٹی نمائش پشاؤے",
        "tog-previewonfirst": "آویلو ترمیما نمائش پشاؤے",
@@ -29,7 +30,7 @@
        "tog-shownumberswatching": "لوڑاک ممبرانن تعدادان پشاؤے",
        "tog-oldsig": "موجودہ دستخطو نمائش:",
        "tog-fancysig": "(سادہ دسخط بلا خودکار ربط)",
-       "tog-uselivepreview": "براہِ راست نمائش استعمال کورے (JavaScript ضرورت بوی)",
+       "tog-uselivepreview": "براہ راست نمائش (آزمائشی) استعمال کورے",
        "tog-forceeditsummary": "کیاوتکی آوا ترمیمی خلاصو خالی پیڅھیتام تھے متے لو دیت",
        "tog-watchlisthideown": "زیرِنظرفہرستہ مہ ترمیماتن کھوشاوے",
        "tog-watchlisthidebots": "زیرِنظرفہرستہ مہ روبالی ترمیماتن کھوشتاوے",
@@ -83,7 +84,7 @@
        "july-gen": "جولائی",
        "august-gen": "اگست",
        "september-gen": "ستمبار",
-       "october-gen": "اکتÙ\88بار",
+       "october-gen": "اکتوبر",
        "november-gen": "نومبار",
        "december-gen": "دسمبار",
        "jan": "جنوری",
        "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": "ستمبر",
+       "october-date": "$1 اکتوبر",
+       "november-date": "$1 نومبر",
+       "december-date": "$1 دسمبر",
        "pagecategories": "{{PLURAL:$1|زمرہ|زمرہ جات}}",
        "category_header": "زمرہ \"$1\" مضمون'",
        "subcategories": "ذیلی ذمرہ جات",
        "newwindow": "نوغ کھیڑکیا",
        "cancel": "کھینسل",
        "moredotdotdot": "وا...",
+       "morenotlisted": "ھیہ فہرست مکمل نو۔",
        "mypage": "مہ صفحہ",
        "mytalk": "مہ مشقولگی",
        "anontalk": "بچے لو IP ھیہ",
        "actions": "ایکشنز",
        "namespaces": "نامان ژاغہ",
        "variants": "الگ",
+       "navigation-heading": "قائمہ رہنمائی",
        "errorpagetitle": "خطاء",
        "returnto": "آچی $1۔",
        "tagline": "{{SITENAME}}ری",
        "permalink": "مستقل لنک",
        "print": "طباعت",
        "view": "لوڑے",
+       "view-foreign": "$1 لوڑے",
        "edit": "ترمیم",
+       "edit-local": "ترمیم مقامی وضاحت",
        "create": "ساوزاوے",
+       "create-local": "مقامی وضاحتو داخل کورے",
        "editthispage": "ھی صفحہا ترمیم کورے",
        "create-this-page": "ھیہ صفحو ساوزاوے",
        "delete": "بوغاوے",
        "deletethispage": "ھیہ صفحہو بوغاوے",
+       "undeletethispage": "ھیہ صفحو بحال کورے",
        "undelete_short": "بحال {{PLURAL:$1|ای ترمیم|$1 ترامیم}}",
+       "viewdeleted_short": "{{PLURAL:$1|ای ترمیم حذف ہوئے|$1 ترامیم حذف ہونی}}",
        "protect": "محفوظ",
        "protect_change": "تبدیل کورے",
        "protectthispage": "ھیہ صفحو محفوظ کورے",
        "categorypage": "زمرہ‌جاتی صفحہو لوڑے",
        "viewtalkpage": "تبادلۂ خیالو صفحہو لوڑے",
        "otherlanguages": "خور زبانا",
-       "redirectedfrom": "'($1 خور ژاغار گنونو ھوی)',",
+       "redirectedfrom": "'($1 خور ژاغار گنونو ھوئے)',",
        "redirectpagesub": "ھیہ صفحو خور ژاغا آلونو بیتی شیر",
-       "lastmodifiedat": "آخری بار تدوین $2, $1 کورونو ھوی",
+       "redirectto": "ری ڈائرکٹ کاردو صفحہ:",
+       "lastmodifiedat": "آخری بار ایڈٹ $2, $1 کورونو ھوئے",
        "viewcount": "ھیہ صفحہ گیونو ھوی {{PLURAL:$1|ای‌بار|$1 مرتبہ}}",
        "protectedpage": "محفوظ شدہ صفحہ",
-       "jumpto": "ھیہ ووشکی څروٹھاوے",
+       "jumpto": "ھیہ ووݰکی څروٹھاوے",
        "jumptonavigation": "رہنمائی",
        "jumptosearch": "تلاش",
        "view-pool-error": "معذرت: تمام سرورا موجودہ وختہ اِضافی بوجھ شیر.\nبو زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان \nبرائے مہربانی! صفحو لوڑیکو بچے دوبارہ کوشش کوریکاری پروشٹی پھوکرو انتظار کورے.\n\n$1",
+       "generic-pool-error": "معذرت: تمام سرورا موجودہ وختہ اِضافی بوجھ شیر.\nبو زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان \nبرائے مہربانی! صفحو لوڑیکو بچے دوبارہ کوشش کوریکاری پروشٹی پھوکرو انتظار کورے.\n\n$1",
        "pool-errorunknown": "نامعلوم خطا",
        "aboutsite": "تعارف {{SITENAME}}",
        "aboutpage": "Project:کھوار ویکیپیڈیو تعارف",
        "currentevents": "ھنونو واقعات",
        "currentevents-url": "Project:ھنونو واقعات",
        "disclaimers": "اعلانات",
-       "disclaimerpage": "Project:عام کھوار اعلان",
+       "disclaimerpage": "Project:عام اعلان",
        "edithelp": "مدد براۓ ترمیم",
        "mainpage": "آویلو صفحہ",
        "mainpage-description": "سرورق",
        "policy-url": "Project:حکمتِ عملی",
-       "portal": "مھراکہ",
-       "portal-url": "Project:مھراکہ",
+       "portal": "دیوان عام",
+       "portal-url": "Project:دیوان عام",
        "privacy": "رازان فاش نو کوریکو بچے اصول",
        "privacypage": "Project:رازان فاش نو کوریکو بچے اصول",
        "badaccess": "خطائے اجازت",
        "editsection": "ترمیم",
        "editold": "ترمیم",
        "viewsourceold": "مآخذو لوڑے",
-       "editlink": "تدÙ\88Û\8cÙ\86 کورے",
+       "editlink": "اÛ\8cÚ\88Ù¹ کورے",
        "viewsourcelink": "مآخذو لوڑے",
        "editsectionhint": "تدوینِو حصّہ: $1",
        "toc": "فہرست",
        "hidetoc": "کھوشتاوے",
        "collapsible-collapse": "خاتمہ/Collapse",
        "collapsible-expand": "فراخ کورے",
+       "confirmable-yes": "Yes/دی",
+       "confirmable-no": "نو",
        "thisisdeleted": "لوڑے  یا بحال کورے $1",
        "viewdeleted": "لوڑے $1؟",
        "restorelink": "{{PLURAL:$1|ای ترمیم حذف ہوی|$1 ترامیم حذف ہونی}}",
+       "feedlinks": "فیڈ",
+       "feed-invalid": "ناقص فیڈو قسم.",
+       "feed-unavailable": "سندیکٹی فیڈ دستیاب نیکی",
        "site-rss-feed": "$1 آر.ایس.ایس فیڈ",
        "site-atom-feed": "$1 اٹوم فیڈ",
        "page-rss-feed": "$1 آر ایس ایس فیڈ",
        "feed-atom": "اٹوم",
        "feed-rss": "آر ایس ایس",
        "red-link-title": "\n$1 (صفحہ موجود نیکی)",
+       "sort-descending": "ترتیب نزولی",
        "nstab-main": "صفحہ",
        "nstab-user": "یوزرو صفحہ",
        "nstab-media": "صفحۂ میڈیا",
        "nstab-special": "خاص صفحہ",
-       "nstab-project": "صفحۂ کھوار منصوبہ",
+       "nstab-project": "صفحۂ منصوبہ",
        "nstab-image": "مسل",
        "nstab-mediawiki": "پیغام",
        "nstab-template": "سانچہ",
        "badarticleerror": "ھیہ صفحہا ھیہ عمل انجام دیونو نو ھوی۔",
        "cannotdelete": "صفحہو $1 ڈیلیٹ کورونو نو ھوی۔ (ھیہ منکھن شیر کہ ھمو پروشٹی تان کا ڈیلیٹ کوری آسور۔)",
        "badtitle": "خراب عنوان",
-       "badtitletext": "'درخاس شدہ صفحہو عنوان ناقص، خالی، یا کیہ غلط ربط شدہ بین لسانی یا بین ویکی عنوان شیر.\nشاید ھیارا ای یا زیات ھش حروف موجود شینی کہ ھیت عنوانا استعمال نو بونیان.',",
+       "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.",
        "querypage-no-updates": "ھیہ صفحہو بچے بتاریخات فی الحال ناقابل ساوزینو بیتی شینی. \nھمو ڈیٹا ھنیسے تازہ کورونو نو بوئے",
        "virus-unknownscanner": "نوژان ضد وائرس:",
        "logouttext": "'''ھنیسے تو خارج بیتی آسوس'''<br />\nتو خفی الاسم {{SITENAME}}  استعمال جاری لاکھیکو بوس، یا دوبارہ ھیہ نامو یا مختلف نامان سورا داخل دی بیکو بوس۔  ھیہ یاد آوری کورے کہ ای کما صفحات ھش <span class='plainlinks'>[$1 دوباری لاگن بوس]</span> غیچھی گونی کہ تو ھنیسے خارج نو بیتی آسوس، کلہ پت کہ تو تان تفصحہ (براؤزرو) ابطن (cache) صاف نوکوروس۔\",",
        "yourname": "اسمِ رکنیت",
+       "userlogin-yourname": "اسمِ رکنیت",
+       "userlogin-yourname-ph": "تان صارف نام درج کورے",
        "yourpassword": "کلمۂ شناخت(پاسورڈ)",
+       "userlogin-yourpassword": "کلمۂ شناخت(پاسورڈ)",
+       "userlogin-yourpassword-ph": "تان پاس ورڈو داخل کورے",
+       "createacct-yourpassword-ph": "تان پاس ورڈو داخل کورے",
        "yourpasswordagain": "کلمۂ شناخت(پاسورڈو)دوبارہ نیویشے",
+       "createacct-yourpasswordagain": "کلمۂ اجازتو تصدیق کورے",
+       "createacct-yourpasswordagain-ph": "پاس ورڈو وا داخل کورے",
        "remembermypassword": "ھیہ براوزیرا مہ داخلِ نوشتگی معلوماتن یاد لاکھے (زیاتاری زیات $1 {{PLURAL:$1|بس|بسان}} بچے)",
+       "userlogin-remembermypassword": "مہ داخل بہچاوے",
        "yourdomainname": "تہ ڈومین",
        "externaldberror": "یا تھے توثیقی ڈیٹابیسا خطا واقع بیتی شیر یا تتے بیریو کھاتو بتاریخ کوریکو اِجازت نیکی",
        "login": "داخل بوس",
        "logout": "لاگ آوٹ",
        "userlogout": "لاگ آوٹ",
        "notloggedin": "داخلہ نو ہوی",
+       "userlogin-noaccount": "تو کھاتہ نو ساوزے آسوسا؟",
+       "userlogin-joinproject": "منسلک بوس{{SITENAME}} اری",
        "nologin": "تو کھاتہ نو ساوزے آسوسا؟ $1",
        "nologinlink": "کھاتہ ساوزاوے",
        "createaccount": "کھاتہ کھولاو کورے",
        "gotaccount": "پروشٹی تان کھاتا ساوزینو بیتی شیر؟'''$1'''.",
        "gotaccountlink": "لاگن بوس",
        "userlogin-resetlink": "آوا داخل بیکو بچے تان تفصیلاتن روخڅی اسوم",
+       "userlogin-resetpassword-link": "کلمہء شناختو روخڅیتام؟",
+       "userlogin-helplink2": "لاگن کوراوا مدد کورے",
+       "createacct-emailoptional": "ای میل ایڈریس (اختیاری)",
+       "createacct-email-ph": "تان ای میلو داخل کورے",
        "createaccountmail": "بذریعۂ بشلی ڈاک",
        "createaccountreason": "وجہ:",
+       "createacct-captcha": "حفاظتی تدبیر",
+       "createacct-imgcaptcha-ph": "تو توری لوڑی نیویشے",
+       "createacct-submit": "کھاتہ ساوزاوے",
+       "createacct-benefit-heading": "{{SITENAME}} تہ غون روئے ایڈٹ کورونیان.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ترمیم|ترامیم}}",
+       "createacct-benefit-body2": "$1 {{PLURAL:$1|صفحہ|صفحات}}",
+       "createacct-benefit-body3": "حالیہ{{PLURAL:$1|contributor|contributors}}",
        "badretype": "درج شدہ کلمۂ شناخت اصلو مطابقت نو لاکھویان",
        "userexists": "تو کہ نامو کہ درج کوری آسوس ھیس پروشٹیاری استعمالہ شیر۔ مختلف نام استعمال کورے",
        "loginerror": "داخلا غلطی",
        "wrongpasswordempty": "کلمۂ شناخت ندارد۔ دوبارہ کوشش کورے",
        "passwordtooshort": "تہ منتخب کردہ پارلوظ(پاسورڈ) مختصار شیر. پارلوظ کم از کم {{PLURAL:$1|1 حرف|$1 حروف}} بیلک.",
        "password-name-match": "تہ پارلوظ(پاسورڈ) تہ اسمِ صارفو ساری مختلف بیلک.",
-       "mailmypassword": "Ù\86Ù\88غ Ù¾Ø§Ø³Ù\88رÚ\88 Ø¨Ø´Ù\84Û\8c Ú©ØºØ§Ø²Ù\88 Ø²Ø±Û\8cعا Ø§Ù\86Ú\81اÙ\88ے",
+       "mailmypassword": "پاسÙ\88رÚ\88Ù\88 Ø±Û\8c Ø³Û\8cÙ¹ Ú©Ù\88رے",
        "passwordremindertitle": "نوغ عارضی کلمۂ شناخت برائے {{SITENAME}}",
        "passwordremindertext": "(IP پتاری $1) کا (یا البت تو) {{SITENAME}} ($4) \nبچے نوغ کلمۂ شناختو بچے درخاس آریر. ای عارضی کلمۂ شناخت \"$3\" \nبرائے ممبار(صارف) \"$2\" تخلیق کورونو بیتی شیر. اگر ھیہ تہ ارادہ کہ اوشوی تھے تو داخلِ نوشتہ بیکار آچی نوغ کلمۂ شناختو انتخابو کورے.\nتہ کلمۂ شناخت {{PLURAL:$5|ای بس|$5 بسار}} آچی ناکارہ بوی.\n\nاگر خور کا ھیہ درخاسو کوری آسور، یا تتے تہ پرانو کلمۂ شناخت یادی گیتی شیر،\nوا تو ھو تبدیل کوریک نو مشکیسان ،تھے تو ھیہ پیغامو نظر انداز کوریکو بوس وا تان پرانو کلمۂ شناختو استعمالو جاری لاکھیکو بوس.',",
        "noemail": "ممبارو \"$1\" بچے کیہ بشلی کغازو  پتہ درج کورونو نو بیتی شیر",
        "noemailcreate": "صحیح برقی پتہ مہیّا کورے",
        "passwordsent": "ای نوغ کلمۂ شناخت \"$1\" نامو سورا ساوز بیرو  بشلی کغازو پتہوتے انزینو بیتی شیر۔ \nکیاوتکہ ھسے توریتای تھے مہربانی کوری ھو ذریعا دوبارہ داخل بوس۔",
        "blocked-mailpassword": "تہ  آئی.پی پتہو تدوین کوریکار  روکاو کورونو بیتی شیر، تھے، ناجائز استعمالو روکاو کوریکو بچے ، تہ آئی.پی پتہو کلمۂ شناختو بحالیو فعل استعمال کوریکو اِجازت نیکی",
-       "eauthentsent": "اÛ\8c ØªØµØ¯Û\8cÙ\82Û\8c Ø¨Ø±Ù\82Û\8c Ø®Ø· نامزد کورونو بیرو برقی پتا کوری انځینو بیتی شیر.\nتہ سوم توریرو برقی خطہ دیرو ہدایاتن سورا عمل کوری تو ھیہ لوو توثیق/تصدیقو کورے کہ مذکورہ برقی پتہ تہ زاتی پتہ شیر.",
-       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Û\81}}اÙ\86 Ø§Ù\86درÛ\8cÙ\86Û\8c Ù¾Ø±Ù\88شٹÛ\8cار Û\8cرÛ\8c ØªØ§Ù\86 Ù¾Ø§Ø±Ù\84Ù\88ظÙ\88(پاسÙ\88رÚ\88Ù\88)اÛ\8c Û\8cادآÙ\88رÛ\8c Ø§Ù\86Ú\81Û\8cÙ\86Ù\88 Ø¨Û\8cتÛ\8c Ø´Û\8cر.\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84Ù\88 Ø³Ø¯Ù\91بابÙ\88 Ø¨Ú\86Û\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Û\81}}اÙ\86 Ø¯Ù\88راÙ\86Û\8c ØµØ±Ù\81 Ø§Û\8c Ù¾Ø§Ø±Ù\84Ù\81ظÛ\8c Û\8cادآÙ\88ارÛ\8c Ø§Ù\86Ú\81Û\8cÙ\86Ù\88 Ø¨Ù\88Û\8c",
+       "eauthentsent": "اÛ\8c ØªØµØ¯Û\8cÙ\82Û\8c Ø¨Ø´Ù\84Û\8c Ú©ØºØ§Ø² نامزد کورونو بیرو برقی پتا کوری انځینو بیتی شیر.\nتہ سوم توریرو برقی خطہ دیرو ہدایاتن سورا عمل کوری تو ھیہ لوو توثیق/تصدیقو کورے کہ مذکورہ برقی پتہ تہ زاتی پتہ شیر.",
+       "throttled-mailpassword": "گزشتÛ\81 {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Û\81}}اÙ\86 Ø§Ù\86درÛ\8cÙ\86Û\8c Ù¾Ø±Ù\88شٹÛ\8cار Û\8cرÛ\8c ØªØ§Ù\86 Ù¾Ø§Ø³Ù\88رÚ\88Ù\88اÛ\8c Û\8cادآÙ\88رÛ\8c Ø§Ù\86Ú\81Û\8cÙ\86Ù\88 Ø¨Û\8cتÛ\8c Ø´Û\8cر.\nÙ\86اجائز Ø§Ø³ØªØ¹Ù\85اÙ\84Ù\88 Ø³Ø¯Ù\91بابÙ\88 Ø¨Ú\86Û\92Ø\8c {{PLURAL:$1|Ú¯Ú¾Ù\86Ù¹Û\81|$1 Ú¯Ú¾Ù\86Ù¹Û\81}}اÙ\86 Ø¯Ù\88راÙ\86Û\8c ØµØ±Ù\81 Ø§Û\8c Ù¾Ø§Ø±Ù\84Ù\81ظÛ\8c Û\8cادآÙ\88ارÛ\8c Ø§Ù\86Ú\81Û\8cÙ\86Ù\88 Ø¨Ù\88ئÛ\92",
        "mailerror": "کغاز انزیکو دورانی مسلہ:$1",
        "acct_creation_throttle_hit": "تہ آئی.پی پتو ذریعا ھیہ ویکیا گیاک صارفین شوخڅیرو ای بسہ{{PLURAL:$1|1 کھاتہ ساوزے آسور|$1 کھاتے ساوزے آسونی}}، وا ھیس مذکورہ وختہ کافی شیر.\nلہٰذا، تہ آئی.پی پتو استعمال کوراک صارفین موجودہ وختہ مزید کھاتہ ساوزیکو نو بونی.",
-       "emailauthenticated": "تہ بشلی کغازو پتو تصدیق تاریخ $2 بوقت $3 بجا کورونو ھوی۔",
-       "emailnotauthenticated": "تہ برقی پتو ھنیسے  تصدیق نو بیتی شیر.\nدرج ذیل وجھو سورا کیہ دی اشناریو بچے تہ برقی پتہ کوری برقی ڈاک ارسال کورونو نو بوی.",
+       "emailauthenticated": "تہ بشلی کغازو پتو تصدیق تاریخ $2 بوقت $3 بجا کورونو ھوئے۔",
+       "emailnotauthenticated": "تہ برقی پتو ھنیسے  تصدیق نو بیتی شیر.\nدرج ذیل وجھو سورا کیہ دی اشناریو بچے تہ برقی پتہ کوری برقی ڈاک ارسال کورونو نو بوئے.",
        "noemailprefs": "ھمی خصائص یعنی فیچران کورما انگیکو بچے تان ترجیحاتہ برقی ڈاکو پتو متعین کورے.",
        "emailconfirmlink": "تان برقی پتو تصدیقو کورے",
+       "invalidemailaddress": "تہ بشلی کغاز(ای میل) قبول کورونو نو بویان کوریکو کہ ھیہ غلط شکلا شیر.\nبراہِ کرم! ای برقی پتہ(ای میل ایڈرس) صحیح شکلا درج کورے یا ژاغو خالی پیڅھے.",
        "accountcreated": "تخلیقِ کھاتہ",
        "accountcreatedtext": "تخیلقِ کھاتۂ ممبار براۓ $1۔",
        "createaccount-title": "کھاتہ سازی برائے {{SITENAME}}",
        "login-throttled": "تو داخلِ نوشتہ بیکو بچے بو زیادہ کوششیں آرو.\nدوبارہ کوشش کوریکو بچے پھوک مدا انتظار کورے.",
        "loginlanguagelabel": "زبان: $1",
-       "resetpass_announce": "تو ای برقی ارسال کردہ عارضی کوڈ ورڈو سوم جستہ داخل بیتی آسوس.\nداخلِ نوشتہ بیکو عملو مکمل کوریکو بچے تہ ھیارا نوغ پاسورڈ متعین کوریلک بوی:",
+       "pt-login": "داخل بوس",
+       "pt-login-button": "داخل بوس",
+       "pt-createaccount": "کھاتہ ساوزاوے",
+       "pt-userlogout": "لاگ آوٹ",
+       "resetpass_announce": "تو ای برقی ارسال کردہ عارضی کوڈ ورڈو سوم جستہ داخل بیتی آسوس.\nداخلِ نوشتہ بیکو عملو مکمل کوریکو بچے تہ ھیارا نوغ پاسورڈ متعین کوریلک بوئے جما:",
        "resetpass_header": "کھاتو پاسورڈو تبدیل کورے",
        "oldpassword": "پرانو کلمۂ شناخت:",
        "newpassword": "نوغ کلمۂ شناخت",
        "resetpass-temp-password": "عارضی پاسورڈ:",
        "passwordreset": "پاسورڈو ری سیٹ کورے",
        "passwordreset-username": "ممبارو نم",
+       "passwordreset-domain": "ڈومین:",
        "changeemail-none": "(نو)",
        "bold_sample": "بوسک متن",
        "bold_tip": "بولڈ ٹیکسٹ",
        "headline_sample": "شہ سرخی",
        "headline_tip": "شہ سرخی درجہ دوم",
        "nowiki_sample": "غیرشکلبندشدہ متنو ھیارا درج کورور",
-       "nowiki_tip": "ویکی شکلبندی نظرانداز کورے",
-       "image_tip": "پیوستہ مسل",
+       "nowiki_tip": "ویکی شکلبندیو نظرانداز کورے",
+       "image_tip": "ݯوکیرو فائل",
        "media_tip": "مسلو لنک",
        "sig_tip": "تہ دستخط بمع مہرِ وخت",
        "hr_tip": "تھروسکی لکیر (زیادہ استعمال مو کورے)",
        "preview": "نمائش",
        "showpreview": "نمائش",
        "showdiff": "تبدیلیان پشاوے",
-       "anoneditwarning": "تو{{SITENAME}} داخل نو بیتی اسوس لہذا تہIP پتہ ھیہ صفحو تاریخچہ ء ترمیما محفوظ بوی",
+       "anoneditwarning": "<strong>خبردار:</strong> توویکیپیڈیا داخل نو بیتی اسوس تہ آئی پی ایڈرس تاریخچا محفوظ بوئے<strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
        "missingcommenttext": "براہِ کرم! تبصرہ موڑا درج کورے.",
        "missingcommentheader": "'''خبردار:''' تو ھیہ تبصرو بچے عنوان یا شہ سرخی مہیّا نو آرو.\nاگر تو محفوظو بٹنو کہ دوبارہ کلک آرو تھے تہ تبصرہ بغیر عنوانا محفوظ بوی.",
        "summary-preview": "نمائش خلاصہ:",
        "loginreqpagetext": "خور صفحاتن لوڑیکو بچے تہ $1 ضروری شیر.",
        "accmailtitle": "کلمہ شناخت(پاسورڈ) انځینو ھوی",
        "newarticle": "(نوغ)",
-       "newarticletext": "↓تو ای ھس صفحو ربطو پیرویو کوری اسوس کہ ھسے ھنیسے موجود نیکی.\nھیہ صفحہو تخلیق کوریکو بچے درج ذیل خانا متنو درج کورے (مزید معلوماتو بچے [$1 صفحۂ معاونت] ملاحظہ کورے).\nاگر تو ھیا غلطیو سورا کہ گیتی اسوس تھے اچھو صفحا آچی بیکو بچے تان کمپیوٹرا '''back''' بٹنو ٹک کورے.",
+       "newarticletext": "↓تو ای ھݰ صفحو ربطو پیرویو کوری اسوس کہ ھسے ھنیسے موجود نیکی.\nھیہ صفحہو تخلیق کوریکو بچے درج ذیل خانا متنو درج کورے (مزید معلوماتو بچے [$1 صفحۂ معاونت] ملاحظہ کورے).\nاگر تو ھیا غلطیو سورا کہ گیتی اسوس تھے اچھو صفحا آچی بیکو بچے تان کمپیوٹرا '''back''' بٹنو ٹک کورے.",
        "noarticletext": " ھیہ صفحہا فی الحال کیہ متن موجود نیکی.\nتو دیگر صفحاتا [[Special:Search/{{PAGENAME}}|ھیہ صفحہو عنوانو بچے تلاش کوریکو بوس]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کوریکو بوس],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} تو ھیہ صفحہا ترمیم کوریکو بوس]</span>",
        "noarticletext-nopermission": "ھیہ صفحہا فی الحال کیہ متن موجود نیکی.\nتو دیگر صفحاتا [[Special:Search/{{PAGENAME}}|ھیہ صفحہو عنوانو بچے تلاش کوریکو بوس]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کوریکو بوس],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} تو ھیہ صفحہا ترمیم کوریکو بوس]</span>",
        "updated": "(اپ ڈیٹڈ)",
        "note": "'''نوٹ:'''",
        "previewnote": "'''یاد لاکھے، ھیہ صرفی نمائش شیر، تہ کاردو ترامیم ھنیسے محفوظ کورونو نو بیتی شینی۔'''",
        "editing": "تو \"$1\" ترمیم کوروسان۔",
+       "creating": "زیر تخلیق $1",
        "editingsection": "$1 قطعو تدوین",
        "editingcomment": "زیرترمیم $1 (تبصرہ)",
        "editconflict": "تنازعہ ترمیم:$1",
        "yourtext": "تہ تحریر",
        "storedversion": "ذخیرہ شدہ نظرثانی",
        "yourdiff": "تضادات",
-       "templatesused": "ھیہ صفحا استعمال باک  {{PLURAL:$1|سانچہ|سانچے}}:",
+       "templatesused": "ھیہ صفحا استعمال باک {{PLURAL:$1|سانچہ|سانچہ}}:",
        "templatesusedpreview": " ھیہ پیش منظرا مستعمل {{PLURAL:$1|سانچہ|سانچے}}:",
        "template-protected": "(محفوظ شدہ)",
        "template-semiprotected": "(نیم محفوظ)",
        "viewpagelogs": "ھیہ صفحہو بچے نوشتہ جاتن لوڑے",
        "currentrev-asof": "حالیہ نظرثانی بمطابق $1",
        "revisionasof": "تـجدید بـمطابق $1",
-       "revision-info": "$2 $1 ھموش نیویشیتای",
+       "revision-info": "$2 $1 ھموݰ نیویشیتائے",
        "previousrevision": "←پرانو تدوین",
        "nextrevision": "→پروشٹیو اعادہ",
        "currentrevisionlink": "حالیہ نظرثانی",
        "history-show-deleted": "صرفی حذف شدہ",
        "histfirst": "قدیم ترین",
        "histlast": "تازہ ترین",
+       "historysize": "({{PLURAL:$1|1 بائٹ|$1 بائٹس}})",
        "historyempty": "(خالی)",
+       "history-feed-title": "تاریخچۂ نظرثانی",
+       "history-feed-description": "ویکیپیڈیا ھیہ صفحو تاریخچۂ نظرثانی",
        "history-feed-item-nocomment": "$1 تا $2",
        "rev-delundel": "پشاوے/کھوشتاوے",
        "rev-showdeleted": "پشاوے",
-       "revdelete-radio-set": "Yes/دی",
-       "revdelete-radio-unset": "نو",
+       "revdelete-radio-set": "کھوشت",
+       "revdelete-radio-unset": "ظاہر",
        "revdel-restore": "ظاہریتو تبدیل کورے",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "revertmerge": "غیر ضم",
        "history-title": "تاریخچہ \"$1\"",
+       "difference-title": "ایڈٹ کاردوان موژی فرق \"$1\"",
        "lineno": "لکیر $1:",
        "compareselectedversions": "منتخب متـنو موازنہ",
-       "editundo": "استرجع",
+       "editundo": "آچی(Undo)",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
        "searchresults": "تلاشو نتیجہ",
        "searchresults-title": "نتائجِ تلاش برائے \"$1\"",
        "notextmatches": "ھیہ عنوانو سورا کیہ دی صفحہ موجود نیکی",
        "shown-title": "فی صفحہ $1 {{PLURAL:$1|نتیجہ|نتائج}} پشاوے",
        "viewprevnext": "لوڑے($1 {{int:pipe-separator}} $2) ($3)۔",
        "searchmenu-exists": "'''ھیہ کھوار ویکیپیڈیا \"[[:$1]]\" نامی ای صفحہ موجود شیر'''",
-       "searchmenu-new": "↓'''ھیہ کھوار ویکیپیڈیا صفحہ \"[[:$1]]\" تخلیق کورے!'''",
+       "searchmenu-new": "<strong>ھیہ ویکیپیڈیا \"[[:$1]]\" ساؤزاوے'''!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "مشمولاتی صفحات",
        "searchprofile-images": "ملٹی میڈیا",
        "searchprofile-everything": "سف اشناری",
        "searchprofile-advanced": "ایڈوانس",
        "searchprofile-articles-tooltip": "$1 ھیہ صفحا تلاش",
-       "searchprofile-images-tooltip": "تلاش برائے فایل",
+       "searchprofile-images-tooltip": "تلاش برائے فائل",
        "searchprofile-everything-tooltip": "ہر ژاغا تلاش کورے",
        "searchprofile-advanced-tooltip": "کسٹم نیم اسپیسا تلاش کورے",
        "search-result-size": "$1 ({{PLURAL:$2|1 لوظ|$2 الفاظ}})",
        "search-result-category-size": "{{PLURAL:$1|1 رُکن|$1 اراکین}} ({{PLURAL:$2|1 ذیلی زمرہ|$2 ذیلی زمرہ جات}}, {{PLURAL:$3|1 ملف|$3 ملفات}})",
        "search-redirect": "(رجوع مکرر $1)",
        "search-section": "(حصہ $1)",
-       "search-suggest": "تہ مطلب ھیہ تھے نو اوشوی: $1",
+       "search-suggest": "تہ مطلب ھیہ تھے نو اوشوئے؟: $1",
        "search-interwiki-caption": "ملگیری منصوبہ",
        "search-interwiki-default": "$1 نتائج:",
        "search-interwiki-more": "(مزید)",
+       "search-relatedarticle": "متعلقہ",
        "searchrelated": "متعلقہ",
        "searchall": "کھل",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "استفسارو مطابقا نتائج ملاو نو ھونی.",
        "powersearch-legend": "ایڈوانس سرچ",
        "powersearch-ns": "جائے ناما تلاش:",
+       "powersearch-togglelabel": "چیک",
        "powersearch-toggleall": "سف",
+       "powersearch-togglenone": "کیاغ دی نیکی",
+       "search-external": "بیرونی تلاش",
+       "searchdisabled": "{{SITENAME}} تلاش غیرفعال.\nتو فی الحال گوگلو ذریعا تلاش کوریکو بوس.\nیاد لاکھے کہ گوگلو {{SITENAME}} اشاریہ ممکن شیر کہ پرانو دی بونی.",
        "preferences": "ترجیحات",
-       "mypreferences": "مہ ترجیہات",
+       "mypreferences": "ترجیحات",
+       "prefs-edits": "تدویناتن تعداد:",
+       "prefs-skin": "پھوست",
        "skin-preview": "نمائش",
+       "datedefault": "کیہ ترجیحات نیکی",
+       "prefs-personal": "ممبارو پروفائل",
+       "prefs-rc": "تازہ تبدیلی",
+       "prefs-watchlist": "واچ لسٹ",
+       "prefs-editwatchlist": "نوغ واچ لسٹان ایڈیٹ کورے",
+       "prefs-editwatchlist-raw": "نوغ واچ لسٹان ایڈیٹ کورے",
+       "prefs-resetpass": "پاسورڈو بدیل کورے",
+       "prefs-email": "اختیاراتِ بشلی کغاز",
+       "prefs-rendering": "ظاہریت",
+       "saveprefs": "محفوظ",
+       "restoreprefs": "تمام بےنقص ترتیباتن بحال کورے",
+       "prefs-editing": "تدوین",
+       "rows": "صف:",
+       "columns": "قطار:",
+       "searchresultshead": "Search/تلاش",
+       "stub-threshold-disabled": "غیر فعال",
+       "timezonelegend": "وختو زون",
+       "localtime": "مقامی وخت:",
+       "timezoneregion-africa": "افریقہ",
+       "timezoneregion-america": "امریکہ",
+       "timezoneregion-antarctica": "انٹارکٹیکا",
+       "timezoneregion-arctic": "قطب شمالی",
+       "timezoneregion-asia": "ایشیاء",
+       "timezoneregion-atlantic": "بحر اوقیانوس",
+       "timezoneregion-australia": "آسٹریلیا",
+       "timezoneregion-europe": "یورپ",
+       "timezoneregion-indian": "بحر ہند",
+       "timezoneregion-pacific": "بحر الکاہل",
+       "allowemail": "خور ممباراننتے بشلی کغاز نیویشیکو اختیارو دیت",
+       "prefs-searchoptions": "تلاش",
+       "prefs-namespaces": "نامان ژاغہ",
+       "default": "طے شدہ",
+       "prefs-files": "فائل",
+       "prefs-custom-css": "خودساختہ CSS",
+       "prefs-custom-js": "خودساختہ JS",
+       "prefs-emailconfirm-label": "برقی پتو تصدیق:",
        "youremail": "بشلی کغاز",
-       "username": "ممبارو نم",
+       "username": "صارف:",
        "prefs-memberingroups": "{{PLURAL:$1|گروہ|گروہاں}} رُکن:",
+       "prefs-registration": "وختِ اندراج:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "* اصلی نم",
+       "yourlanguage": "زبان",
        "yournick": "دسخط",
        "badsig": "ناقص خام دسخط.\nHTML tags لوڑے.',",
        "badsiglength": "تہ دسخط کافی درونگار شیر.\nھیہ $1 {{PLURAL:$1|حرف|حروفاری}} زیات نو بیلک.",
+       "gender-male": "موش",
+       "gender-female": "عورت",
+       "email": "بشلی کغاز",
+       "prefs-help-realname": "حقیقی نام اختیاری شیر۔\nاگر تو تان حقیقی نامو کی ظاہر کوریک مݰکیسان تھے ھے نامو تہ کورمو بچے تتے ای شناخت دیکو بچے استعمال کورونو بوئے جمہ۔",
        "prefs-help-email": "برقی ڈاکو پتہ اختیاری شیر لیکن ھیہ ھتے وختہ مفید ثابت بوی کیاوتکی تو تان پاسورڈو کی روخڅیتاو",
        "prefs-help-email-others": "تو ھمو دی منتخب کوریکو بوس  کہ خور صارفین تہ تبادلۂ خیالو صفحا ای ربطو ذریعا تتے بشلی کغاز یعنی برقی ڈاک انځینی.\nکیاوتکہ دیگر صارفین تہ سوم رابطہ  کورونیان تھے تہ برقی ڈاکو پتہ افشا کورونو نو بوی",
+       "prefs-help-email-required": "برقی ڈاک پتہ ضرورت شیر.",
+       "prefs-info": "بنیادی معلومات",
+       "prefs-i18n": "بین الاقوامیت",
+       "prefs-signature": "دستخط",
+       "prefs-dateformat": "شکلبندِ تاریخ",
+       "prefs-advancedediting": "اعلی اختیارات",
+       "prefs-editor": "ایڈیٹر",
+       "prefs-preview": "نمائش",
+       "prefs-advancedrc": "اعلی اختیارات",
+       "prefs-advancedrendering": "اعلی اختیارات",
+       "prefs-advancedsearchoptions": "اعلی اختیارات",
+       "prefs-advancedwatchlist": "اعلی اختیارات",
+       "prefs-tokenwatchlist": "ٹوکن",
+       "prefs-diffs": "فرق",
+       "group": "گروہ",
+       "group-user": "یوزر",
+       "group-autoconfirmed": "تان توثیق شدہ یوزر",
+       "group-bot": "روبوٹ",
        "group-sysop": "کھوار ویکیپیڈیو منتظمین",
+       "group-bureaucrat": "بیوروکریٹ",
+       "group-suppress": "نگران",
+       "group-all": "(تمام)",
+       "group-user-member": "صارف",
+       "group-autoconfirmed-member": "تان توثیق شدہ صارف",
+       "group-bot-member": "خودکار صارف",
+       "group-sysop-member": "منتظم",
+       "group-bureaucrat-member": "{{GENDER:$1|بیوروکریٹ}}",
+       "group-suppress-member": "{{GENDER:$1|نگران}}",
+       "grouppage-user": "{{ns:project}}:ممباران",
+       "grouppage-autoconfirmed": "{{ns:project}}:تان توثیق شدہ صارف",
+       "grouppage-bot": "{{ns:project}}:روبوٹ",
        "grouppage-sysop": "{{ns:project}}:کھوار ویکیپیڈیو منتظمین",
+       "grouppage-bureaucrat": "بیورو کریٹ",
+       "grouppage-suppress": "{{ns:project}}:نگران",
        "right-movefile": "منتقل کورے",
        "right-upload": "فائل انځاوے",
+       "right-writeapi": "اے پی آئی لکھائیو استعمال",
        "right-delete": "صفحان ضائع کورے",
        "newuserlogpage": "نوشتۂ آمد صارف",
        "rightslog": "یوزروت مختص شدہ حقوق",
        "action-edit": "ھیہ صفحا ایڈیٹنگ کورے",
        "nchanges": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}",
-       "recentchanges": "حالیہ تبدیلی",
+       "enhancedrc-history": "تاریخچہ",
+       "recentchanges": "تازہ تبدیلی",
        "recentchanges-legend": "حالیہ تبدیلیان اختیارات",
        "recentchanges-summary": "ھیہ صفحا کھوار ویکیپیڈیا باک تازہ تریں تبدیلیان مشاہدہ کورے",
        "recentchanges-feed-description": "کھوارا ترجمہ",
        "recentchanges-label-newpage": "ھیہ ترمیم نوغ صفحہ تخلیق آریر",
        "recentchanges-label-minor": "ھیہ ای معمولی ترمیم شیر",
-       "recentchanges-label-bot": "ھیہ ایڈیٹو خود کار بوٹو زریعا انجام دیونو ہوی",
+       "recentchanges-label-bot": "ھیہ ایڈیٹو خود کار بوٹو زریعا انجام دیونو ہوئے",
        "recentchanges-label-unpatrolled": "ھیہ ترمیمو ھمونیہ پت مراجعت(Patrolled) کورونو نو بیتی شیر",
+       "recentchanges-label-plusminus": "صفحو سائز تبدیل شدہ بلحاظ بائٹ مقدار",
+       "recentchanges-legend-heading": "'''لیجنڈ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھمو دی لوڑے [[Special:NewPages|list of new pages]])",
        "rcnotefrom": "ھیہ موڑا '''$2''' کورونو بیرو تبدیلیان تفصیلات شینی ('''$1''' تبدیلیان پشینو بونیان)۔",
        "rclistfrom": "$3 $2 نوغ تبدیلیاں پشیک شروع کورے",
        "rcshowhideminor": " معمولی ترامیم $1",
+       "rcshowhideminor-show": "ویریغ کورے",
+       "rcshowhideminor-hide": "کھوشتاوے",
        "rcshowhidebots": "خودکار صارف $1",
-       "rcshowhideliu": "داخل بیرو صارف $1",
+       "rcshowhidebots-show": "پشاوے",
+       "rcshowhidebots-hide": "مو پشاوے",
+       "rcshowhideliu": "داخل شدہ صارف $1",
+       "rcshowhideliu-show": "پشاوے",
+       "rcshowhideliu-hide": "کھوشتاوے",
        "rcshowhideanons": "گمنام صارف $1",
+       "rcshowhideanons-show": "پشاوے",
+       "rcshowhideanons-hide": "مو پشاوے",
        "rcshowhidepatr": "$1 لوڑونو بیرو لکھائی",
+       "rcshowhidepatr-show": "پشاوے",
+       "rcshowhidepatr-hide": "کھوشتاوے",
        "rcshowhidemine": "ذاتی ترامیم $1",
+       "rcshowhidemine-show": "پشاوے",
+       "rcshowhidemine-hide": "کھوشتاوے",
        "rclinks": "آخری $2 آنوسو بیرو $1 تبدیلیان مشاہدہ کورے<br />$3",
        "diff": "فرق",
        "hist": "تاریخچہ",
        "hide": "مو پشاوے",
-       "show": "Ù\88Û\8cرÛ\8cغ Ú©Ù\88رے",
+       "show": "پشاÙ\88ے",
        "minoreditletter": "م",
        "newpageletter": "نوغ",
        "boteditletter": "خودکار",
-       "rc-enhanced-expand": "تفصیلاتن پشاوے (JavaScript ضرورت بوی)",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} تبدیلیاری آچی",
+       "rc-enhanced-expand": "تفصیلاتن پشاوے (JavaScript ضرورت بوئے)",
        "rc-enhanced-hide": "تفصیلاتن کھوشتاوے",
        "recentchangeslinked": "متعلقہ تبدیلی",
        "recentchangeslinked-toolbox": "موقعی تبدیلی",
        "recentchangeslinked-title": "متعلقہ تبدیلی \"$1\"",
-       "recentchangeslinked-summary": "ھیہ ھتے تبدیلیان لسٹ شیر کہ ھیتان پھوک مدا پروشٹی ساوزینو بیتی شینی وا ھے صفحان سوم جستہ خور کیہ صفحہ چوکی شینی یا کیہ خاص زمرہ جاتو ممبرانن سوم چوکی شینی<br />\nساوزیرو [[Special:Watchlist|موڑا صفحہ]] '''بولڈ''' شینی",
+       "recentchangeslinked-summary": "ھیہ ھتے تبدیلیان لسٹ شیر کہ ھیتان پھوک مدا پروشٹی ساوزینو بیتی شینی وا ھے صفحان سوم جستہ خور کیہ صفحہ ݯوکی شینی یا کیہ خاص زمرہ جاتو ممبرانن سوم ݯوکی شینی<br />\nساوزیرو [[Special:Watchlist|موڑا صفحہ]] '''بولڈ''' شینی",
        "recentchangeslinked-page": "کھوار ویکیپیڈیو منصوبو صفحو لوڑے",
-       "recentchangeslinked-to": "کھولاو بیرو صفحو بجایا ھمو سوم چوکیرو صفحو نوغ تبدیلیان پشاوے",
+       "recentchangeslinked-to": "کھولاو بیرو صفحو بجایا ھمو سوم ݯوکیرو صفحو نوغ تبدیلیان پشاوے",
        "upload": "فائل انځاوے",
        "uploadlogpage": "نوشتۂ زبراثقال (اپ لوڈ لاگ)",
        "filename": "فایلو نام",
        "filedesc": "خلاصہ",
        "license": "لایسنس",
-       "license-header": "لایسنسنگ",
-       "file-anchor-link": "فایل",
+       "license-header": "لائسنسنگ",
+       "imgfile": "فائل",
+       "file-anchor-link": "فائل",
        "filehist": "مسلو تاریخ",
-       "filehist-help": "ھیہ لوڑیکو بچے  کہ کیہ خاص وختہ فایل کیہ قسمہ ظاہر باو اوشتای ھتے  تاریخ یا وختہ طق(کلک) کورے",
+       "filehist-help": "ھمو لوڑیکو بچے  کہ کیہ خاص وختہ فائل کیہ قسمہ ظاہر باو اوشتائے ھتے  تاریخ یا وختہ طق(کلک) کورے",
        "filehist-revert": "آچی",
        "filehist-current": "حالیہ",
        "filehist-datetime": "تاریخ/وخت",
        "filehist-thumb": "اظفورہ",
        "filehist-thumbtext": "$1 صارفو څیق ھوٹو",
        "filehist-user": "صارف",
-       "filehist-dimensions": "ابعاد",
+       "filehist-dimensions": "ڈائیمنشنز",
        "filehist-comment": "تبصرہ",
        "imagelinks": "مسلو روابط",
        "linkstoimage": "ھیہ مسلو سوم درج ذیل {{PLURAL:$1|صفحہ مربوط شیر|$1 صفحات مربوط شینی}}",
        "nolinkstoimage": "ھیہ کھوار ویکیپیڈیا ھش کیہ صفحات نیکی کہ ھتیت ھیہ مسل (فائلو) متعلقہ شینی",
        "sharedupload-desc-here": "ھیہ فائل $1 موژاری شیر وا ھیہ خور پرجیکٹہ استعمال بویان۔\nمزید معلومات ھمو [$2 فائل مشقولگی صفحہا]  دیونو بیتی شیر",
        "uploadnewversion-linktext": "ھیہ مسلو نوغ ورژنو اپلوڈ کورے",
+       "upload-disallowed-here": "تو ھیہ فائلہ ترمیم کوریکو نو بوس",
        "randompage": "بےترتیب صفحہ",
        "statistics": "اعداد و شمار",
+       "statistics-pages": "صفحات",
+       "statistics-pages-desc": "(ویکی اقتباساتن کل صفحات، بشمولِ تبادلۂ خیال، رجوع مکررات وغیرہ۔)",
+       "statistics-files": "فائل انځاوے",
+       "statistics-edits": "ویکی اقتباساتہ آغازاری گنی کل صفحاتی ترمیم",
+       "statistics-edits-average": "فی صفحہ اوسط ترامیم",
+       "statistics-users": "مندرج [[خاص:فہرست صارفین، صارف فہرست|صارفین]]",
+       "statistics-users-active": "متحرک صارفین",
+       "pageswithprop-submit": "Go/بوغے",
+       "brokenredirects-edit": "ترمیم",
+       "brokenredirects-delete": "بوغاوے",
        "nbytes": "$1 {{PLURAL:$1|بایٹ|بایٹس}}",
        "nmembers": "$1 {{PLURAL:$1|ممبار|ممباران}}",
        "lonelypages": "څھوعو صفحات",
        "longpages": "درونگار ترین صفحات",
        "deadendpages": "بیردو صفحات",
        "protectedpages": "محفوظ شدہ صفحہ",
+       "protectedpages-page": "صفحہ",
+       "protectedpages-expiry": "ختم بویان:",
+       "protectedpages-unknown-timestamp": "نامعلوم",
+       "protectedpages-unknown-performer": "نامعلوم صارف",
        "protectedtitles": "محفوظ شدہ صفحہ",
        "listusers": "فہرست ارکان",
        "usercreated": "\n{{GENDER:$3|تخلیق شدہ}}  بتاریخ $1 بوقت $2",
        "pager-newer-n": "{{PLURAL:$1|نوغ1|نوغ $1}}",
        "pager-older-n": "{{PLURAL:$1|قدیم1|قدیم ترین $1}}",
        "booksources": "کتابی وسائل",
-       "booksources-search-legend": "کتابی وسایلان تلاش",
-       "specialloguserlabel": "یوزر",
+       "booksources-search-legend": "کتابی وسائلان تلاش",
+       "booksources-search": "Search/تلاش",
+       "specialloguserlabel": "صارف:",
        "speciallogtitlelabel": "عنوان:",
        "log": "نوشتہ جات",
        "allpages": "سف صفحات",
        "prevpage": "آچھو صفحہ ($1)",
        "allpagesfrom": "مطلوبہ حرفاری شروع باک صفحاتن نمائش:",
        "allpagesto": "مطلوبہ حرفاری ختم باک صفحاتن نمائش:",
-       "allarticles": "تمام مقالات",
+       "allarticles": "کھل آرٹیکل",
        "allpagessubmit": "بوغے لا",
        "categories": "زمرہ جات",
        "sp-deletedcontributions-contribs": "حصہ",
        "linksearch-ns": "نامو ژاغہ:",
        "linksearch-ok": "Search/تلاش",
        "linksearch-line": "$1 مربوط شیر $2 ری",
+       "listusers-submit": "پشاوے",
+       "listusers-noresult": "ھیہ صارف ملاو نو ہوئے",
+       "activeusers": "متحرک صارفینان فہرست",
+       "activeusers-from": "مطلوبہ حرفاری شروع باک صفحاتن نمائش:",
+       "activeusers-hidebots": "کھوشت خود کار صارف",
+       "activeusers-hidesysops": "کھوشت منتظمان",
+       "activeusers-noresult": "ھیہ صارف ملاو نو ہوئے",
+       "listgrouprights-group": "گروہ",
+       "listgrouprights-rights": "اختیارات",
        "listgrouprights-members": "ممبارانن فھرست",
+       "listgrouprights-namespaceprotection-namespace": "نامو ژاغہ:",
        "emailuser": "ممباروت بشلی کغاز انڅاوے",
+       "emailuser-title-notarget": "ای میل صارف",
+       "emailpage": "ممباروت بشلی کغاز انځاوے",
+       "emailusername": "ممبارو نم",
+       "emailusernamesubmit": "داخل کورے",
+       "emailfrom": "ری",
+       "emailto": "پت",
+       "emailsubject": "موضوع:",
+       "emailmessage": "پیغام",
+       "emailsend": "انځاوے",
        "watchlist": "مہ واچ لسٹ",
-       "mywatchlist": "مہ زیرنظرفہرست",
+       "mywatchlist": "زیرنظرفہرست",
        "watchlistfor2": "براۓ $1 ($2)",
        "removedwatchtext": "ھیہ صفحہ \"[[:$1]]\" خارج کورونو ھوی[[Special:Watchlist|تہ زیر نظر فہرستاری]].",
        "watch": "زیرنظر",
        "watching": "زیر نظر",
        "unwatching": "منسوخ",
        "deletepage": "صفحہو ضائع کورے",
+       "confirm": "کنفرم",
+       "excontent": "'$1':مواد اوشوئے",
+       "excontentauthor": "حذف شدہ مواد: '$1' (وا صرفی '[[Special:Contributions/$2|$2]]' حصہ دریریتائے)",
        "confirmdeletetext": "تو ھیہ صفحو ھمو سوم ملحقہ تاریخچو سوم جستہ حذف کوریکو ارادہ کوری آسوس ۔ براۓ مہربانی تصدیق کورے کہ تو ھیہ عملو نتائجان ساری بخوبی آگاہ آسوس، وا ھیہ یقینو دی کورے کہ تو ھش [[{{MediaWiki:Policy-url}}|ویکیپیڈیو حکمت عملیو]] دائرا حال بتی کوروسان۔",
        "actioncomplete": "اقدام تکمیلوتے تورتای",
        "actionfailed": "تہ ایکشن ناکام ہوی",
        "deleteotherreason": "جوو/اِضافی وجہ",
        "deletereasonotherlist": "جوو وجہ",
        "rollbacklink": "آچی سابقہ حالتہ",
+       "rollbacklinkcount": "آچی سابقہ حالتہ $1 {{PLURAL:$1|edit|edits}}",
        "protectlogpage": "نوشتۂ محفوظ شدگی",
        "protectedarticle": "\"[[$1]]\" محفوظ کورونو ھوی",
        "modifiedarticleprotection": "تبدیل کاردو پروٹیکشن لیول \"[[$1]]\"",
        "protect-level-sysop": "صرفی منتظمینان بچے",
        "protect-expiring": "ختم بویان $1 (UTC)",
        "protect-cantedit": "تو ھیہ صفحو پروٹیکشن لیولو چینج کوریکو نوبوس، کوریکو کہ تاتے ھش کوریکو اجازت نیکی",
+       "protect-otherreason-op": "جوو وجہ",
        "restriction-type": "اجازت",
        "restriction-level": "ممنوغ لیول",
+       "minimum-size": "کم از کم سائز",
+       "maximum-size": "زیادار زیادہ سائر",
+       "pagesize": "(بائٹس)",
+       "restriction-edit": "ترمیم",
+       "restriction-move": "منتقل",
+       "restriction-create": "ساوزاوے",
        "undelete": "ضائع کاردو صفحاتن لوڑے",
+       "undeletebtn": "بحال",
        "undeletelink": "لوڑے/بحال کورے",
        "undeleteviewlink": "لوڑے",
+       "undeletecomment": "واجھہ",
        "namespace": "نامو ژاغہ:",
        "invert": "انتخاب بالعکس",
+       "tooltip-invert": "تبدیلیان کھوشتیکو بچے ھیہ بکسو چیک کورے",
+       "namespace_association": "متعلقہ فضا",
+       "tooltip-namespace_association": "مشقولگی اوچے خور کیاغ نیویشیکو بچے ھیہ بکسو چیک کورے",
        "blanknamespace": "(مرکز)",
        "contributions": " $1 صارفو حصہ",
        "contributions-title": "$1 صارفو حصہ",
        "blocklogentry": "بلاک[[$1]] وختہ پت $2 $3",
        "unblocklogentry": "بلاک نو کاردو $1",
        "block-log-flags-nocreate": "کھاتہ کھولاو کوریکو سورا پاوپندی شیر",
+       "ipb_expiry_invalid": "Expiry ٹیم غلط شیر.",
+       "move-page-legend": "مـنـتـقـل کـورے",
        "movearticle": "مـنـتـقـل کـورے",
        "newtitle": "نوغ عنوان",
        "move-watch": "صفحہ زیر نظر",
        "movereason": "واجھہ",
        "revertmove": "رجوغ",
        "export": "برآمد صفحات",
+       "export-submit": "ایکسپورٹ",
        "allmessagesname": "نم",
        "allmessagesdefault": "طے شدہ متن",
+       "allmessages-filter-legend": "فلٹر",
+       "allmessages-filter-all": "سف",
+       "allmessages-language": "زبان",
+       "allmessages-filter-submit": "بوغے",
+       "allmessages-filter-translate": "ترجمہ کورے",
        "thumbnail-more": "فراخ کورے",
+       "filemissing": "فائل نیکی",
        "thumbnail_error": "$1 څیق سایزو ھوٹو ساوزیکا مسئلہ",
        "tooltip-pt-userpage": "تہ صارفی صفحہ",
        "tooltip-pt-mytalk": "تہ صفحۂ مشقولگی",
        "tooltip-pt-mycontris": "تہ کاردو کورمان فہرست",
        "tooltip-pt-login": "تہ بچے داخلِ نوشتہ بیک جم شیر، لیکن ھیہ ضروری نو",
        "tooltip-pt-logout": "خارج بوس",
+       "tooltip-pt-createaccount": "تتے دعوت دیونو بویان کہ کھاتہ ساوزاوے۔لیکن کھاتہ ساوزیک لازمی نو-",
        "tooltip-ca-talk": "مضمونو بارا تبادلۂ خیال",
        "tooltip-ca-edit": "تو ھیہ صفحہا ترمیم کوریکو بوس\nبرائے مہربانی! تان ترمیماتن محفوظ کوریکار پروشٹی  نمائشو بٹنا کلک کورے",
        "tooltip-ca-addsection": "نوغ قطعہ شروع کورے",
        "tooltip-search-go": "اگر بالکل ھیہ نامو سورا صفحہ کہ موجود شیر تھے ھتے صفحہا بوغے",
        "tooltip-search-fulltext": "ھیہ متنو بچے صفحاتن تلاش کورے",
        "tooltip-p-logo": "سرورقا بوغے",
-       "tooltip-n-mainpage": "اصلی صفحہا بوغے",
+       "tooltip-n-mainpage": "اصلی صفحا بوغے",
        "tooltip-n-mainpage-description": "اصلی صفحہ",
        "tooltip-n-portal": "کھوار ویکیپیڈیو منصوبو متعلقہ، تو کیاغ کوریکو بوس، اشناریان کورا تلاش کوریلک",
        "tooltip-n-currentevents": "حالیہ واقعاتہ بیرو پس منظری معلوماتن لوڑے",
        "tooltip-feed-atom": "ھیہ صفحو بچے آٹوم فیڈ",
        "tooltip-t-contributions": "نوغ تدوین",
        "tooltip-t-emailuser": "ھیہ ممباروت بشلی کغاز(ای میل) انڅاوے",
-       "tooltip-t-upload": "اپلوڈ فایل",
+       "tooltip-t-upload": "فائلو اپلوڈ کورے",
        "tooltip-t-specialpages": "سف خاص صفحاتن فہرست",
        "tooltip-t-print": "ھیہ صفحو قابل طبع نسخہ",
        "tooltip-t-permalink": "صفحہعو موجودہ نظرثانیو مستقل لنک",
        "tooltip-compareselectedversions": "منتخب متـنو موازنہ",
        "tooltip-watch": "ھیہ صفحہو تان زیرِنظرفہرستہ شامل کورے",
        "tooltip-rollback": "\"رول بیک\" ای کلکا صفحو واپس سابقہ حالتہ گنی آلوی",
-       "tooltip-undo": "\"واپس\" یا لوظ آچیا کلک کوریکو سوم جستہ تہ صفحہ کچا تہ پشینو بوی ھے سوم جستہ تو واپس کوریکو وجہ نیویشیکو بوس",
+       "tooltip-undo": "\"Undo\" یا لوظ آچیا کلک کوریکو سوم جستہ تہ صفحہ کچا تہ پشینو بوئے ھے سوم جستہ تو واپس کوریکو وجہ نیویشیکو بوس",
        "tooltip-summary": "ای مختصار سمری ساوزاوے",
+       "simpleantispam-label": "اینٹی ایسپم چیک. Do <strong>NOT</strong> fill this in!",
+       "pageinfo-toolboxlink": "معلومات صفحہ",
        "previousdiff": " ← پرانو تدوین",
        "nextdiff": "صفحہو نم:",
        "file-info-size": "$1 × $2 پکسلز, فل سایز: $3, MIME ٹایپ: $4",
        "file-nohires": "ھموغاری لوٹ ریزولیوشن دستیاب نیکی.",
        "svg-long-desc": "SVG فایل, nominally $1 × $2 پکسلز, فایل سایز: $3",
-       "show-big-image": "لوٹ کوری پشاوے",
+       "show-big-image": "اصل فائل",
+       "show-big-image-preview": "ھیہ نمائشو حجم:$1",
+       "show-big-image-other": "خور{{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 پکسلز",
        "bad_image_list": "شکلبند درج ذیل شیر:\n\nصرف فہرستی عناصرار (* شروع باک لکیر) شامل کورونو بونیان\nکیہ لکیرا آویلو ربط کیہ خراب فایلو بیلیک۔\nھتے لکیرا باقی گیاک ربطو مستثنیٰ قرار دیونو بویان، مثلاً صفحات کورا کہ فایل لکیرو موژا گویان۔",
        "metadata": "میٹا ڈیٹا",
        "metadata-help": "ھیہ فائلا خور دی معلومات شینی، شاید ھتیت ڈیجیٹل کیمرو یا سکینران زریعا کمپیوٹرو درینو بیتی شینی وا ھیتان زریعا ھمیتان ڈیجیٹل ساوزینو بیتی شیر\n\nاگر فائلو ھمو اصلی حالتہ  تبدیل کہ کورونو ھوی تھے ای کما تفصیلات تبدیل بیرو فائلو باریا موجود نیکی",
        "metadata-expand": "تفصیلان پشاوے",
        "metadata-collapse": "درونگار تفصیلان کھوشتاوے",
-       "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",
+       "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-orientation": "پیشکش",
+       "exif-xresolution": "تھروسکی ریزولوشن",
+       "exif-yresolution": "ݯوکتو ریزولوشن",
+       "exif-datetime": "فائلو تبدیلیو تاریخ اوچے وخت",
+       "exif-make": "کیمرو ساوزیاک",
+       "exif-model": "کیمرو ماڈل",
+       "exif-software": "سافٹویئر استعمال",
+       "exif-exifversion": "اکزیف ورژن",
+       "exif-colorspace": "رنگ فضا",
+       "exif-datetimeoriginal": "ڈیٹا ساوزیکو تاریخ اوچے وخت",
+       "exif-datetimedigitized": "ڈیجیٹلائز کوریکو تاریخ اوچے وخت",
+       "exif-orientation-1": "عام",
        "exif-dc-date": "تاریخ",
-       "namespacesall": "تھÙ\85اÙ\85Ù\88",
+       "namespacesall": "سÙ\81",
        "monthsall": "سف",
        "confirm_purge_button": "OK/ٹھیک شیر",
        "table_pager_first": "آویلو صفحہ",
        "watchlisttools-view": "موقعی تبدیلیان لوڑے",
        "watchlisttools-edit": "لوڑے یا واچ لسٹہ ترمیم کورے",
        "watchlisttools-raw": "نوغ واچ لسٹان ایڈیٹ کورے",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
        "duplicate-defaultsort": "'''خبردار:''' ڈیفالٹ تاڑٰ(نغڑی) \"$2\" پروشٹیو ڈیفالٹ تاڑا \"$1\" لیگی شیر۔",
        "specialpages": "اسپیشل صفحہ",
        "external_image_whitelist": " #ھیہ لاینو ھموش تان شیکو لاکے کیچہ کہ ھیہ شیر<pre>\n#موڑا ریگولر لوان دیور((صرف ھتیتان کیاغ ھمیتان موژی شینی //) //) \n#بیریو ھوٹوان آر ایلان سوم ھمیتان میچ کورنو بوی\n# کیاغ کہ میچ ھونی ھیتان ھوٹوان سوم پشینو بوی بصورت دیگر ھیتان لنک کیاغ کی شینی ھتیتان پشینو بوی\n#لاین کیاغ کی شروع بویان  # کومنٹ جوشونو بوی۔\n#ھیہ کیس سینسیٹو شیر۔\n\n#لینو سورا ریجیکس فریگمنٹو لاکھے. ھیہ لاینو ھموش تان شیکو لاکے کیچہ کہ ھیہ شیر۔</pre>",
        "tag-filter": "[[Special:Tags|Tag]] filter:",
        "tag-filter-submit": "فلٹر",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
        "tags-title": "Tags/ٹیگز",
        "compare-page1": "صفحہ 1",
+       "logentry-delete-delete": "$1 {{GENDER:$2|حذف کورونو ہوئے}} صفحہ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} صفحہ $3  پت $4",
+       "logentry-newusers-create": "صارف کھاتہ $1 {{GENDER:$2|ساوزیینو ھوئے}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|uploaded}} $3",
        "rightsnone": "(نو)",
        "feedback-message": "پیغام",
        "searchsuggest-search": "Search/تلاش"
index 1753182..5585e8e 100644 (file)
@@ -11,7 +11,8 @@
                        "Balnur.s",
                        "Нұрлан Рахымжанов",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Batyrbek.kz"
                ]
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "editingold": "<strong>Ескерту: Осы беттің бұрынғы нұсқасын өңдеудесіз.</strong> Бұны сақтасаңыз осы нұсқадан кейінгі барлық өзгерістер жоғалады.",
        "yourdiff": "Айырмашылықтар",
        "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
-       "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!",
+       "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
        "longpageerror": "<strong>ҚАТЕЛІК: Сақтамақшы болған мәтініңіздің көлемі {{PLURAL:$1|бір килобайт|$1 килобайт}} ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
        "readonlywarning": "<strong>ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.</strong>\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алыпуңызға болады. \n\nАдминстратор оны құлыптау себебін келесідей түсіндіреді: $1",
        "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде соңғы журнал жазбасы көрсетілген:",
        "notextmatches": "Еш бет мәтіні сәйкес емес",
        "prevn": "алдыңғы {{PLURAL:$1|$1}}",
        "nextn": "келесі {{PLURAL:$1|$1}}",
+       "prev-page": "алдыңғы бет",
+       "next-page": "келесі бет",
        "prevn-title": "Алдыңғы $1 {{PLURAL:$1|жазба|жазбалар}}",
        "nextn-title": "Келесі $1 {{PLURAL:$1|жазба|жазбалар}}",
        "shown-title": "Осы бетте {{PLURAL:$1|жазба}} көрсету.",
        "import-interwiki-history": "Бұл беттің барлық тарихи нұсқаларын көшіру",
        "import-interwiki-templates": "Кірістірілген барлық үлгілер",
        "import-interwiki-submit": "Сырттан алу",
-       "import-interwiki-namespace": "Беттерді мына есім кеңістігіне апару:",
        "import-upload-filename": "Файл атауы:",
        "import-comment": "Пікірі:",
        "importtext": "Қайнар уикиден [[Special:Export|export utility]]  қолданып файлды сыртқа беріңіз.\nКомьпютеріңізге сақтаңыз да мында жүктеп беріңіз.",
        "just-now": "Дәл қазір",
        "hours-ago": "$1 {{PLURAL:$1|сағат|сағат}} бұрын",
        "minutes-ago": "$1 {{PLURAL:$1|минут|минут}} бұрын",
-       "seconds-ago": "$1 {{PLURAL:$1|секунт|секунт}} бұрын",
+       "seconds-ago": "$1 {{PLURAL:$1|секунд|секунд}} бұрын",
        "bad_image_list": "Пішімі төмендегідей:\n\nТек тізім даналары (* нышанымен басталытын жолдар) есептеледі.\nЖолдың бірінші сілтемесі жарамсыз суретке сілтеу жөн.\nСол жолдағы кейінгі әрбір сілтемелер ерен болып есептеледі, мысалы жол ішіндегі кездесетін суреті бар беттер.",
        "metadata": "Қосымша мәліметтер",
        "metadata-help": "Осы файлда қосымша мәліметтер қамтылған, файл жасалуына немесе цифрлық формаға айналдырылуына дижитал (сандық) аппарат не сканер қолданылған болуы ықтимал.\nЕгер осы файл негізгі күйінен өзгертілген болса кейбір егжей-тегжейлері өзгертілген файлға лайық болмас.",
index 9af2ee9..cbd155a 100644 (file)
@@ -25,7 +25,7 @@
                        "아라"
                ]
        },
-       "tog-underline": "ಲಿà²\82à²\95à³\81ಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
+       "tog-underline": "à²\95à³\8aà²\82ಡಿಗಳ ಕೆಳಗೆ ಗೆರೆ ತೋರಿಸಿ",
        "tog-hideminor": "ಚಿಕ್ಕಪುಟ್ಟ ಬದಲಾವಣೆಗಳನ್ನು ಅಡಗಿಸಿ",
        "tog-hidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಸಂಪಾದನೆಗಳನ್ನು ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳಲ್ಲಿ ಅಡಗಿಸು",
        "tog-newpageshidepatrolled": "ಪಹರೆಯಲ್ಲಿ ಆದ ಪುಟಗಳನ್ನು ಹೊಸ ಪುಟಗಳ ಪಟ್ಟಿಯಲ್ಲಿ ಅಡಗಿಸು",
        "import-noarticle": "ಆಮದು ಮಾಡಲು ಯಾವ ಪುಟವೂ ಇಲ್ಲ!",
        "import-nonewrevisions": "ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳನ್ನೂ ಮುಂಚೆಯೆ ಆಮದು ಮಾಡಲಾಗಿದೆ.",
        "importlogpage": "ಆಮದುಗಳ ದಾಖಲೆ",
-       "import-logentry-upload": "ಫೈಲು ಅಪ್ಲೋಡ್ ಮೂಲಕ [[$1]] ಅನ್ನು ಆಮದು ಮಾಡಲಾಗಿದೆ",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}",
        "tooltip-pt-userpage": "ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ",
        "tooltip-pt-anonuserpage": "ನೀವು ಸಂಪಾದನೆ ಮಾಡುತ್ತಿರುವ ipಯ ಬಳಕೆದಾರ ಪುಟ",
        "duration-decades": "$1 {{PLURAL:$1|ದಶಕ|ದಶಕಗಳು}}",
        "duration-centuries": "$1 {{PLURAL:$1|ಶತಮಾನ|ಶತಮಾನಗಳು}}",
        "duration-millennia": "$1 {{PLURAL:$1|ಸಹಸ್ರಮಾನ|ಸಹಸ್ರಮಾನಗಳು}}",
-       "expand_templates_preview": "ಮುನ್ನೋಟ"
+       "expand_templates_preview": "ಮುನ್ನೋಟ",
+       "special-characters-group-latin": "ಲ್ಯಾಟಿನ",
+       "special-characters-group-greek": "ಗ್ರೀಕ್",
+       "special-characters-group-arabic": "ಅರೇಬಿಕ್",
+       "special-characters-group-persian": "ಪರ್ಶಿಯನ್",
+       "special-characters-group-hebrew": "ಹೀಬ್ರೂ",
+       "special-characters-group-bangla": "ಬಾಂಗ್ಲಾ",
+       "special-characters-group-tamil": "ತಮಿಳು",
+       "special-characters-group-telugu": "ತೆಲುಗು",
+       "special-characters-group-sinhala": "ಸಿಂಹಳ",
+       "special-characters-group-gujarati": "ಗುಜರಾತಿ",
+       "special-characters-group-devanagari": "ದೇವನಾಗರಿ",
+       "special-characters-group-thai": "ಥಾಯ್",
+       "special-characters-group-lao": "ಲಾವೋ",
+       "special-characters-group-khmer": "ಖ್ಮೇರ್"
 }
index 9494194..203c6e2 100644 (file)
@@ -45,7 +45,8 @@
                        "양념파닭",
                        "콩가루",
                        "Twotwo2019",
-                       "SeoJeongHo"
+                       "SeoJeongHo",
+                       "Banwol"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "wrongpassword": "입력한 비밀번호가 잘못되었습니다.\n다시 시도하세요.",
        "wrongpasswordempty": "비밀번호를 입력하지 않았습니다.\n다시 시도하세요.",
        "passwordtooshort": "비밀번호는 {{PLURAL:$1|$1 글자}} 이상이어야 합니다.",
+       "passwordtoolong": "비밀번호는 {{PLURAL:$1|1자|$1자}}보다 길어서는 안 됩니다.",
        "password-name-match": "비밀번호는 사용자 계정 이름과 반드시 달라야 합니다.",
        "password-login-forbidden": "이 사용자 계정 이름과 비밀번호는 사용할 수 없습니다.",
        "mailmypassword": "비밀번호 재설정",
        "recentchanges-summary": "이 페이지에서 위키의 최근 바뀜을 추적합니다.",
        "recentchanges-noresult": "지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.",
        "recentchanges-feed-description": "이 피드에 위키의 최근 바뀜을 추적합니다.",
-       "recentchanges-label-newpage": "새로 만든 문서",
+       "recentchanges-label-newpage": "새 문서",
        "recentchanges-label-minor": "사소한 편집",
        "recentchanges-label-bot": "봇이 수행한 편집",
        "recentchanges-label-unpatrolled": "아직 점검하지 않은 편집",
        "listfiles-delete": "삭제",
        "listfiles-summary": "이 특수 문서는 모든 올려진 파일을 보여줍니다.",
        "listfiles_search_for": "다음 미디어 이름 검색:",
+       "listfiles-userdoesnotexist": "계정 \"$1\"은 등록되지 않았습니다.",
        "imgfile": "파일",
        "listfiles": "파일 목록",
        "listfiles_thumb": "섬네일",
        "emailccsubject": "$1에게 보낸 메시지의 복사본: $2",
        "emailsent": "이메일 보냄",
        "emailsenttext": "이메일을 보냈습니다.",
-       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 \"이메일 보내기\" 기능을 통해 보냈습니다.",
+       "emailuserfooter": "이 이메일은 {{SITENAME}}의 $1 사용자가 $2 사용자에게 \"{{int:emailpage}}\" 기능을 통해 보냈습니다.",
        "usermessage-summary": "시스템 메시지 남기기",
        "usermessage-editor": "시스템 메신저",
        "usermessage-template": "MediaWiki:UserMessage",
        "import-interwiki-history": "이 문서의 모든 역사를 가져오기",
        "import-interwiki-templates": "모든 틀을 포함하기",
        "import-interwiki-submit": "가져오기",
-       "import-interwiki-namespace": "새 이름공간:",
-       "import-interwiki-rootpage": "대상 루트 문서 (선택 사항):",
        "import-upload-filename": "파일 이름:",
        "import-comment": "요약:",
        "importtext": "원본 위키에서 [[Special:Export|내보내기]] 기능을 사용해 파일을 내려받으세요.\n그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.",
        "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-activate-reason": "이유:",
        "tags-activate-not-found": "\"$1\" 태그가 존재하지 않습니다.",
        "tags-deactivate-reason": "이유:",
        "comparepages": "문서 비교",
        "logentry-move-move": "$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}",
        "logentry-move-move-noredirect": "$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}",
        "logentry-move-move_redir": "$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다",
-       "logentry-move-move_redir-noredirect": "$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다",
+       "logentry-move-move_redir-noredirect": "$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다",
        "logentry-patrol-patrol": "$1 사용자가 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
        "logentry-patrol-patrol-auto": "$1 사용자가 자동적으로 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
        "logentry-newusers-newusers": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "log-name-pagelang": "언어 바꾸기 기록",
        "log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
        "logentry-pagelang-pagelang": "$1 사용자가 $3의 문서 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}.",
-       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 스킨이 포함된 것으로 보입니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 스킨을 모두 활성화하려면 <code>LocalSettings.php</code> 안에 다음 줄을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
+       "default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 {{PLURAL:$4|스킨}}이 포함된 것으로 보입니다. 스킨을 활성화{{PLURAL:$4||하고 기본값으로 선택}}하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 {{PLURAL:$5|스킨|모든 스킨}}을 활성화하려면 <code>LocalSettings.php</code> 안에 다음 {{PLURAL:$5|줄}}을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
        "default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''비활성화''')",
index 2a37b9c..a98119a 100644 (file)
        "wrongpassword": "Dat Passwood oder dä Metmaacher Name wor verkihrt. Jetz muss De et noch ens versöke.",
        "wrongpasswordempty": "Dat Passwood ka'mer nit fottlooße. Jetz muss De et noch ens versöke.",
        "passwordtooshort": "En Paßwööter {{PLURAL:$1|moß|möße|moß}} winnichstens {{PLURAL:$1|ei|$1|kei}} Zeiche, {{PLURAL:$1|Zeffer|Zeffere|Zeffere}}, udder Bochstave dren sin.",
+       "passwordtoolong": "Paßwööter künnne nit länge sin wi {{PLURAL:$1|ein|$1|Noll}} Zeische.",
        "password-name-match": "Ding Poßwoot moß anders wi Dinge Name als ene Metmaacher sin.",
        "password-login-forbidden": "Dä Zohjang met däm Metmaacher-Name un däm Paßwoot es verbodde.",
        "mailmypassword": "Lohß jonn!",
        "history-feed-description": "Ähler Versione vun dä Wikisigg",
        "history-feed-item-nocomment": "$1 aam $3 öm $4 Uhr",
        "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.",
+       "history-edit-tags": "Donn de Makehronge vun de ußjesöhk Väsjohne beärbeide",
        "rev-deleted-comment": "(„Koot Zosammejefass, Quell“ usjeblendt)",
        "rev-deleted-user": "(Metmaacher Name usjeblendt)",
        "rev-deleted-event": "(Eijnzelheijte vom Logboch-Enndraach fottjenomme)",
        "rev-showdeleted": "zeije",
        "revisiondelete": "Versione fottschmieße un widder zeröck holle",
        "revdelete-nooldid-title": "Kein Version aanjejovve, oddeer en Stuß-Nommer",
-       "revdelete-nooldid-text": "Do häs kein Version aanjejovve, womet mer dat maache sulle. Odder de Nommer wohr Stuß, verkeeht, et jitt se nit, odder De wellß de neuste Version fott maache.",
+       "revdelete-nooldid-text": "Do häs kein Version aanjejovve, womet mer dat maache sulle, udder de Nommer wohr Stuß, verkeeht, et jitt se nit, odder De wellß de neuste Väsjohon verschteische.",
        "revdelete-no-file": "De aanjejovve Dattei jidd_et nit.",
        "revdelete-show-file-confirm": "Beß De sescher, dat De de fottjeschmeße Version vun dä Dattei „<nowiki>$1</nowiki>“ vum $2 oö $3 Uhr aanloore wells?",
        "revdelete-show-file-submit": "Lohß Jonn!",
        "notextmatches": "Kein Sigg met däm Tex",
        "prevn": "de {{PLURAL:$1|ein|$1|0}} doför zeije",
        "nextn": "de {{PLURAL:$1|läzte |nächste $1|nächste 0}} zeije",
+       "prev-page": "de Sigg derföhr",
+       "next-page": "de Sigg dernoh",
        "prevn-title": "{{PLURAL:$1|Et vorijje|De $1 dovör|Es nix dovör}}",
        "nextn-title": "{{PLURAL:$1|Et näähßte|De nähßte $1|Kütt nix mieh}}",
        "shown-title": "Zeisch {{PLURAL:$1|ein|$1|nix}} pro Sigg",
        "right-editmyoptions": "De eije Enschtällonge ändere",
        "right-rollback": "All de letzte Änderunge fom letzte Metmaacher aan ene Sigg retur maache",
        "right-markbotedits": "Retur jemaate Änderonge als Bot-Änderung makeere",
-       "right-noratelimit": "Kein Beschränkunge dorch Jrenze (<i lang=\"en\">[http://www.mediawiki.org/wiki/Manual:%24wgRateLimits $wgRateLimits]</i>)",
+       "right-noratelimit": "Kein Beschränkonge dorsch Jränze (<i lang=\"en\">[http://www.mediawiki.org/wiki/Manual:%24wgRateLimits $wgRateLimits]</i>)",
        "right-import": "Sigge uß ander Wikis empochteere",
        "right-importupload": "Sigge övver et XML-Datei-Huhlade empochteere",
        "right-patrol": "Anderlücks Änderunge aan Sigge als „nohjeloort“ makeere",
        "right-sendemail": "<i lang=\"en\">e-mail</i> aan ander Metmaacher schecke",
        "right-passwordreset": "De <i lang=\"en\">e-mails</i> vum Paßwoot neu Säze aanloore",
        "right-managechangetags": "[[Special:Tags|Kännzeijsche]] en de Dahtebangk aanlähje udder fottschmiiße",
+       "right-applychangetags": "[[Special:Tags|Makehronge]] met de eije Änderonge zersamme verjävve",
+       "right-changetags": "[[Special:Tags|Makehronge]] vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
        "newuserlogpage": "Logboch för neu Metmaachere",
        "newuserlogpagetext": "He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.",
        "rightslog": "Logboch för Änderunge aan Metmaacher-Räächde",
        "action-editmyprivateinfo": "Ding päsöönlesche Aanjaabe ze ändere",
        "action-editcontentmodel": "et Modäll vum Ennhald vun Sigge ze verändere",
        "action-managechangetags": "Kännzeijsche en de Dahtebangk aanlähje udder fottschmiiße",
+       "action-applychangetags": "Makehronge met de eije Änderonge zersamme ze verjävve",
+       "action-changetags": "Makehronge vun Väsjohne un Enndrähsche em Logbohch fott nämme un zohföhje",
        "nchanges": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderong}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|Ein|$1|Kein}} zigg_em läzde Aanloore",
        "enhancedrc-history": "Väsjohne",
        "listfiles-delete": "fottschmieße",
        "listfiles-summary": "Heh sin de huhjelade Dateije opjeleß.",
        "listfiles_search_for": "Sök noh däm Name vun dä Datei:",
+       "listfiles-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ ham_mer nit.",
        "imgfile": "Dattei",
        "listfiles": "Dateie opleste",
        "listfiles_thumb": "Minni-Belldsche",
        "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",
+       "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
        "allpages": "All Sigge",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "emailccsubject": "En Kopie vun Dinger E-Mail aan $1: $2",
        "emailsent": "De <i lang=\"en\">e-mail</i> es ongerwähs",
        "emailsenttext": "Ding E-Mail es jetz lossjescheck woode.",
-       "emailuserfooter": "Hee di e-mail hät dä „$1“ an dä „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.",
+       "emailuserfooter": "Hee di e-mail hät dä „$1“ an dä „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailpage}}“ jebruch.",
        "usermessage-summary": "En Nohreesch vum Wiki afjelivvert.",
        "usermessage-editor": "Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide",
        "watchlist": "ming Oppaßleß",
        "import-interwiki-history": "All de Versione vun dä Sigg heh kopeere",
        "import-interwiki-templates": "All Schablone metnämme",
        "import-interwiki-submit": "Huhlade!",
-       "import-interwiki-namespace": "Dun de Sigge emporteere en dat Appachtemeng:",
-       "import-interwiki-rootpage": "De Aanfangssigg (kann läddesch bliive):",
        "import-upload-filename": "Dä Name fun dä Dattei:",
        "import-comment": "Jrond:",
        "importtext": "Dun de Daate met däm „[[Special:Export|Export]]“ vun doh vun enem Wiki Exporteere un - etwa bei Dir om Rechner - avspeichere, un dann heh wider huhlade.",
        "pageinfo-protect-cascading-yes": "Joh",
        "pageinfo-protect-cascading-from": "Ene Siggeschoz weed jeärf vun",
        "pageinfo-category-info": "Aanjaabe övver Saachjroppe",
+       "pageinfo-category-total": "Metjleeder ensjesammp",
        "pageinfo-category-pages": "De Aanzahl Sigge",
        "pageinfo-category-subcats": "De Aanzahl Ongerjroppe",
        "pageinfo-category-files": "De Aanzahl Dateie",
        "patrol-log-page": "Logboch vun de nohjeloorte Änderunge",
        "patrol-log-header": "<!-- -->",
        "log-show-hide-patrol": "$1 et Logbuch vum Sigge nohlooere",
+       "log-show-hide-tag": "Donn et Logbohch vun de Makehronge $1",
        "deletedrevision": "De ahl Version „$1“ es fottjeschmesse",
        "filedeleteerror-short": "Fäähler bem Datei-Fottschmieße: $1",
        "filedeleteerror-long": "Bem fosooch, de Datei fottzeschmieße, hatte mer Fäähler:\n\n$1",
        "version-parser-function-hooks": "Parserfunktione",
        "version-hook-name": "De Schnettstelle ier Name",
        "version-hook-subscribedby": "Opjeroofe vun",
-       "version-version": "($1)",
+       "version-version": "(Väsjohn $1)",
        "version-no-ext-name": "[keine Nahme]",
        "version-license": "MehdijaWikki sing Lėzänz",
        "version-ext-license": "‎Lėzänz",
        "tags-deactivate-reason": "Jrond:",
        "tags-deactivate-not-allowed": "Ed es nit müjjelesch, et Kännzeijsche „$1“ afzeschallde.",
        "tags-deactivate-submit": "Ußschallde",
+       "tags-apply-no-permission": "Do häs nit et Rääsch, zersamme met Dinge Änderonge noch Makehronge ze verjävve.",
+       "tags-apply-not-allowed-one": "De Makehrong „$1“ kam_mer nit vun Hand verjävve.",
+       "tags-apply-not-allowed-multi": "Heh {{PLURAL:$2|de Makehrong|di Makehronge|die kein Makehronge}} kam_mer nit vun Hand verjävve: $1",
+       "tags-update-no-permission": "Do häs nit et Rääsch, Makehronge vun einzel Väsjohne udder Enndrähsch en Logbohch fottzenämme udder zohzeföhje.",
+       "tags-update-add-not-allowed-one": "De Makehrong „$1“ kam_mer nit vun Hand verjävve.",
+       "tags-update-add-not-allowed-multi": "Heh {{PLURAL:$2|de Makehrong|di Makehronge|die kein Makehronge}} kam_mer nit vun Hand verjävve: $1",
+       "tags-update-remove-not-allowed-one": "De Makehronge „$1“ kam_mer nit fott nämme.",
+       "tags-update-remove-not-allowed-multi": "Heh {{PLURAL:$2|de Makehrong|di Makehronge|die kein Makehronge}} kam_mer nit vun Hand fott nämme: $1",
+       "tags-edit-title": "Makehronge ändere",
+       "tags-edit-manage-link": "makehronge verwallde",
+       "tags-edit-revision-selected": "Ußjesöhk {{PLURAL:$1|Väsjohn|Väsjohne|Nix}} vun [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Der ußjewählte Vörfall|De ußjewählte Vörfäll|kein ußjewählte Vörfäll}} uss em Logbohch:",
+       "tags-edit-revision-legend": "Donn Makkehronge för heh di {{PLURAL:$1|Väsjohn|Väsjohne|kein Väsjohne}} verjävve udder wälsche fott nämme",
+       "tags-edit-logentry-legend": "Donn Makkehronge för {{PLURAL:$1|heh dä Enndraach|heh di Enndrähsch|keine Enndraach}} em Logbohch verjävve udder fott nämme",
+       "tags-edit-existing-tags": "Makehronge, di mer han:",
+       "tags-edit-existing-tags-none": "<tt>-&nbsp;nix&nbsp;-</tt>",
+       "tags-edit-new-tags": "Neuje Makehronge:",
+       "tags-edit-add": "Donn heh di Makehronge derbei:",
+       "tags-edit-remove": "Donn heh di Makehronge fottnämme:",
+       "tags-edit-remove-all-tags": "Alle Makehronge fottnämme",
+       "tags-edit-chosen-placeholder": "Donn heh Makehronge aanjävve",
+       "tags-edit-chosen-no-results": "Mer han kein zerpaß Makehronge jefonge",
+       "tags-edit-reason": "Jrond:",
+       "tags-edit-revision-submit": "Maach Änderongea an heh dä {{PLURAL:$1|Väsjohn|Väsjohne|kein Väsjohne}}",
+       "tags-edit-logentry-submit": "Maach Änderongea an {{PLURAL:$1|heh däm Enndraach|heh dä Enndrähsch|keine Enndrähch}} em Logbohch",
+       "tags-edit-success": "De Änderuoge sin jemaat.",
+       "tags-edit-failure": "De jewollte Änderonge lehße sesch nit maache:\n$1",
+       "tags-edit-nooldid-title": "Onjöltijje Väsjohn för et Zihl",
+       "tags-edit-nooldid-text": "De Väsjohn derför wohd nit aanjejovve udder et jit se nit.",
+       "tags-edit-none-selected": "Söhk winneschßdens ein Makehrong uß för derbei ze donn udder fott ze nämme.",
        "comparepages": "Sigge verjliesche",
        "compare-page1": "De ein Sigg",
        "compare-page2": "De ander Sigg",
        "logentry-managetags-delete": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dat Kännzeijsche „$4“ fottjeschmeße un derbei uß {{PLURAL:$5|eine Väsjohn udder einem Enndraach|$5 Väsjohne udder $5 Enndrähsch|keine Väsjohn udder keinem Enndraach}} vum Logbohch eruß jenumme.",
        "logentry-managetags-activate": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dat Kännzeijsche „$4“ aanjeschalldt för de Metmaacher un de Bots.",
        "logentry-managetags-deactivate": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dat Kännzeijsche „$4“ för de Metmaacher un de Bots afjeschalldt.",
+       "log-name-tag": "Et Logbohch vun de Makehronge",
+       "log-description-tag": "Heh di Sigg zeijsch aan, wann Metmaacher ußdröklesch [[Special:Tags|Makehronge]] vun einzel Väsjohne udder Enndrähsch em Logbohch fott jenumme hann udder wälsche verjovve han. Mer süht heh ävver nit, wat zersamme met ene Änderong aan ener Sigg, beim Fottschmiiße, udder esu, met Matkkehronge pasehrd es.",
+       "logentry-tag-update-add-revision": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$7|di Makehrong|di Makehronge|nix}} $6 för de Väsjohn $4 vun dä Sigg „$3“ verjovve.",
+       "logentry-tag-update-add-logentry": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$7|di Makehrong|di Makehronge|nix}} $6 för der Enndrahch $5 em Logbohch vun dä Sigg „$3“ verjovve.",
+       "logentry-tag-update-remove-revision": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$9|di Makehrong|di Makehronge|nix}} $8 fun däVäsjohn $4 vun dä Sigg „$3“ fott jenumme.",
+       "logentry-tag-update-remove-logentry": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$9|di Makehrong|di Makehronge|nix}} $8 ussem Endraaach $5 em Logbohch vun dä Sigg „$3“ fott jenumme.",
+       "logentry-tag-update-revision": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hät {{PLURAL:$7|di Makehrong|di Makehronge|nix}} $6 för de Väsjohn $4 em Logbohch vun dä Sigg „$3“ verjovve un {{PLURAL:$9|di Makehrong|de Makehronge|nix}} $8 fott jenumme.",
+       "logentry-tag-update-logentry": "{{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} „$1“ hädd em Endraaach $5 em Logbohch vun dä Sigg „$3“{{PLURAL:$7|di Makehrong|di Makehronge|nix}} $6 derbei jedonn un {{PLURAL:$9|di Makehrong|di Makehronge|nix}} $8 fott jenumme.",
        "rightsnone": "(nix)",
        "revdelete-summary": "dä Täx en „{{int:summary}}“",
        "feedback-adding": "Ben di Röckmäldong op di Sigg aam donn&nbsp;…",
        "feedback-error1": "Fähler: dat <i lang=\"en\">API</i> säät jät, wat mer nit kenne",
        "feedback-error2": "Fähler: de Sigg ze ändere es donävve jejange",
        "feedback-error3": "Fähler: dat <i lang=\"en\">API</i> joov kein Antwoot",
+       "feedback-error4": "Ene Fähler es opjetrodde.\nMer kunnte di Rökmäldong nit onger dä aanjejovve Övverschreff aflähje.",
        "feedback-message": "Nohreesch:",
        "feedback-subject": "Theema:",
        "feedback-submit": "Lohß jonn!",
        "api-error-overwrite": "En Dattei ze övverschrieve es nit zohjelohße.",
        "api-error-stashfailed": "Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.",
        "api-error-publishfailed": "Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.",
-       "api-error-stasherror": "Ene Fähler es opjetrodd, wi mer di Dattei en der <i lang=\"en\" xml:lang=\"en\">stash</i> huh aam lahde wohre.",
+       "api-error-stasherror": "Ene Fähler es opjetrodde, wi mer di Dattei en der <i lang=\"en\" xml:lang=\"en\">stash</i> huh aam lahde wohre.",
        "api-error-stashedfilenotfound": "Di Dattei wohd em <i lang=\"en\" xml:lang=\"en\">stash</i> nit jefonge, wi mer se vun doh huh lahde wullte.",
        "api-error-stashpathinvalid": "Di Dattei wohd em <i lang=\"en\" xml:lang=\"en\">stash</i> nit jefonge, weil dä Pad do hen nit jeschtemmp hät.",
        "api-error-stashfilestorage": "Ene Fähler es opjetrodd, wi mer di Dattei en der <i lang=\"en\" xml:lang=\"en\">stash</i> donn wullte.",
index a1af0f4..3551085 100644 (file)
        "underline-never": "Qet",
        "underline-default": "Tercîhên lêgerokê",
        "editfont-default": "Tercîhên lêgerokê",
-       "sunday": "Yekşem",
-       "monday": "Duşem",
+       "sunday": "yekşem",
+       "monday": "duşem",
        "tuesday": "Sêşem",
        "wednesday": "Çarşem",
        "thursday": "Pêncşem",
        "friday": "În",
-       "saturday": "Å\9eemî",
+       "saturday": "Å\9femî",
        "sun": "Ykş",
        "mon": "Duş",
        "tue": "Sêş",
        "thu": "Pşm",
        "fri": "În",
        "sat": "Şem",
-       "january": "Rêbendan",
-       "february": "Reşemî",
-       "march": "Adar",
-       "april": "Avrêl",
-       "may_long": "Gulan",
-       "june": "Pûşper",
-       "july": "Tîrmeh",
-       "august": "Gelawêj",
-       "september": "Rezber",
-       "october": "Kewçêr",
-       "november": "Sermawez",
-       "december": "Berfanbar",
+       "january": "rêbendan",
+       "february": "reşemî",
+       "march": "adar",
+       "april": "avrêl",
+       "may_long": "gulan",
+       "june": "pûşper",
+       "july": "tîrmeh",
+       "august": "gelawêj",
+       "september": "rezber",
+       "october": "kewçêr",
+       "november": "sermawez",
+       "december": "berfanbar",
        "january-gen": "Rêbendan",
        "february-gen": "Reşemî",
        "march-gen": "Adar",
        "april-gen": "Avrêl",
-       "may-gen": "Gulan",
-       "june-gen": "Pûşper",
+       "may-gen": "gulan",
+       "june-gen": "pûşper",
        "july-gen": "Tîrmeh",
        "august-gen": "Gelawêj",
-       "september-gen": "Rezber",
+       "september-gen": "rezber",
        "october-gen": "Kewçêr",
        "november-gen": "Sermawez",
-       "december-gen": "Berfanbar",
+       "december-gen": "berfanbar",
        "jan": "rêb",
        "feb": "reş",
        "mar": "adr",
        "actions": "Çalakî",
        "namespaces": "Valahiya nav",
        "variants": "Variyant",
+       "navigation-heading": "Menûya navîgasyonê",
        "errorpagetitle": "Çewtî",
        "returnto": "Vegere $1.",
        "tagline": "Ji {{SITENAME}}",
        "permalink": "Girêdana daîmî",
        "print": "Çap",
        "view": "Bibîne",
+       "view-foreign": "$1 nîşan bide",
        "edit": "Biguherîne",
        "create": "Biafirîne",
        "editthispage": "Vê rûpelê biguherîne",
        "viewhelppage": "Rûpela alîkariyê bibîne",
        "categorypage": "Li rûpela kategoriyê binêre",
        "viewtalkpage": "Li gotûbêjê binêre",
-       "otherlanguages": "Zimanên din",
+       "otherlanguages": "Bi zimanên din",
        "redirectedfrom": "(Ji $1 hate beralîkirin)",
        "redirectpagesub": "Rûpelê beralî bike",
        "lastmodifiedat": "Ev rûpel cara dawî di $2, $1 de hate guherandin.",
        "yourname": "Navê bikarhêner:",
        "userlogin-yourname": "Navê bikarhêner",
        "userlogin-yourname-ph": "Navê xwe yê bikarhêneriyê binivîse",
+       "createacct-another-username-ph": "Navê xwe yê bikarhêneriyê binivîse",
        "yourpassword": "Şîfre:",
        "userlogin-yourpassword": "Şîfre",
        "userlogin-yourpassword-ph": "Şîfreya xwe binivîse",
        "gotaccount": "Hesabê te heye? $1.",
        "gotaccountlink": "Têkeve",
        "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
-       "userlogin-resetpassword-link": "Şîfreyê ji nû ve çêke",
+       "userlogin-resetpassword-link": "Te şîfreye xwe jibîrkir?",
        "userlogin-helplink2": "Alîkariya têketinê",
+       "userlogin-createanother": "Hesabek din çeke",
        "createacct-emailrequired": "E-name",
        "createacct-emailoptional": "E-name",
        "createacct-email-ph": "E-nameya xwe binivîse",
+       "createacct-another-email-ph": "E-nameya xwe têkeve",
        "createaccountmail": "Use a temporary random password and send it to the email address specified below",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
        "createaccountreason": "Sedem:",
        "edit-no-change": "Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.",
        "postedit-confirmation-saved": "Guhertina te hate tomarkirin.",
        "edit-already-exists": "Nikarî rûpeleka nuh çêke.\nEw berê heye.",
+       "content-model-wikitext": "wîkînivîs",
+       "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "undo-success": "Ev guherandin dikare were şûndekirin. Ji kerema xwe ferqa piştî tomarkirinê bibîne, bê ka tu dixwazî vê guhertoyê tomar bikî an na. Ger te şaşîtiyek kir, ji kerema xwe derkeve.",
        "undo-failure": "Ev guhertin ji ber guherandinên piştî wê re nikare were şûndekirin.",
        "notextmatches": "Di nav sernivîsan de nehat dîtin.",
        "prevn": "{{PLURAL:$1|$1}} paş",
        "nextn": "{{PLURAL:$1|$1}} pêş",
+       "prev-page": "rûpela berî vê",
+       "next-page": "rûpela pêş",
        "prevn-title": "{{PLURAL:$1|result|Encamên}} pêştir $1",
        "nextn-title": "$1 {{PLURAL:$1|encama|encamên}} pêştir",
        "shown-title": "Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide",
        "prefs-dateformat": "Formata dîrokê",
        "prefs-timeoffset": "Cudahiya demê",
        "prefs-advancedediting": "Vebijarkên berfireh",
+       "prefs-editor": "Edîtor",
+       "prefs-preview": "Pêşdîtin",
        "prefs-advancedrc": "Vebijarkên berfireh",
        "prefs-advancedrendering": "Vebijarkên berfireh",
        "prefs-advancedsearchoptions": "Vebijarkên berfireh",
        "action-userrights-interwiki": "mafê bikarhênerên li ser wîkiyên din biguherîne",
        "action-sendemail": "e-nameyan bişîne",
        "nchanges": "$1 {{PLURAL:$1|guherandinek|guherandin}}",
+       "enhancedrc-history": "dîrok",
        "recentchanges": "Guherandinên dawî",
        "recentchanges-legend": "Vebijarkên guherandinên dawî",
        "recentchanges-summary": "Guhertinên herî dawî yên wîkiyê li ser vê rûpelê bişopîne.",
-       "recentchanges-label-minor": "Ev guhertineka biçûk e",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-label-newpage": "Rûpeleke nû hate çêkirin",
+       "recentchanges-label-minor": "Ev guherîneke biçûk e",
+       "recentchanges-label-bot": "Ev guherîn ji aliyê botekê ve hate çêkirin",
+       "recentchanges-label-unpatrolled": "Ev gotar hêj nehatiye sererastkirin",
+       "recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
+       "recentchanges-legend-heading": "'''Ravekirina kurtenavan:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (here [[Taybet:Rûpelên_nû|lîsteya rûpelên nû]])",
        "rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
        "rcshowhideminor": "Guherandinên biçûk $1",
        "rcshowhideminor-show": "nîşan bide",
        "rcshowhideanons-show": "nîşan bide",
        "rcshowhideanons-hide": "veşêre",
        "rcshowhidepatr": "Guherandinên kontrolkirî $1",
+       "rcshowhidepatr-show": "Nîşan bide",
+       "rcshowhidepatr-hide": "Veşêre",
        "rcshowhidemine": "Guherandinên min $1",
        "rcshowhidemine-show": "nîşan bide",
        "rcshowhidemine-hide": "veşêre",
        "license-header": "Lîsans",
        "nolicense": "Ya hilbijartî nîne",
        "license-nopreview": "Pêşdîtin ne gengaz e.",
+       "listfiles-delete": "jê bibe",
        "listfiles_search_for": "Li navê wêneyî bigere:",
        "imgfile": "dosye",
        "listfiles": "Lîsteya wêneyan",
        "listfiles_size": "Mezinbûn",
        "listfiles_description": "Danasîn",
        "listfiles_count": "Guherto",
+       "listfiles-latestversion-yes": "Erê",
+       "listfiles-latestversion-no": "Na",
        "file-anchor-link": "Wêne",
        "filehist": "Dîroka daneyê",
        "filehist-help": "Ji bo dîtina guhertoya wê demê bişkoka dîrokê bitikîne.",
        "unusedtemplates": "Şablonên nayên bikaranîn",
        "unusedtemplateswlh": "lînkên din",
        "randompage": "Rûpeleke ketober",
+       "randomincategory-category": "Kategorî:",
        "randomredirect": "Beralîkirina ketober",
        "statistics": "Statîstîk",
        "statistics-header-pages": "Statîstîkên rûpelê",
        "statistics-files": "Wêneyên barkirî",
        "statistics-users": "[[Special:ListUsers|Bikarhênerên tomarkirî]]",
        "statistics-users-active": "Bikarhênerên çalak",
+       "pageswithprop-submit": "Biçe",
        "doubleredirects": "Beralîkirinên ducarî",
        "double-redirect-fixed-move": "Cihê [[$1]] hatiye guhertin, ew niha beralîkirina [[$2]] ye.",
        "brokenredirects": "Beralîkirinên xerabûyî",
        "longpages": "Rûpelên dirêj",
        "deadendpages": "Rûpelên bê dergeh",
        "protectedpages": "Rûpelên parastî",
+       "protectedpages-page": "Rûpel",
        "protectedtitles": "Sernavên parastî",
        "listusers": "Lîsteya bikarhêneran",
        "listusers-editsonly": "Tenê bikarhênerên bi guherrandinan nîşan bide",
        "usercreated": "di $1 de, li $2 hate çêkirin",
        "newpages": "Rûpelên nû",
        "newpages-username": "Navê bikarhêner:",
-       "ancientpages": "Gotarên kevintirîn",
+       "ancientpages": "Gotarên herî kevin",
        "move": "Navê rûpelê biguherîne",
        "movethispage": "Vê rûpelê bigerîne",
        "notargettitle": "Hedef tune",
        "pager-older-n": "{{PLURAL:$1|kevintir 1|kevintir $1}}",
        "booksources": "Çavkaniyên pirtûkan",
        "booksources-search-legend": "Li pirtûkan bigere",
+       "booksources-search": "Lêgerîn",
        "booksources-text": "Li vir listek ji lînkên rûpelên, yê pirtûkên nû ya kevin difiroşin, heye. Hên jî li vir tu dikarî înformasyonan li ser wan pirtûkan tê derxê.",
        "specialloguserlabel": "Bikarhêner:",
        "speciallogtitlelabel": "Sernav:",
        "listgrouprights-members": "(lîsteya endaman)",
        "listgrouprights-addgroup-all": "Hemû koman tevlî bike",
        "listgrouprights-removegroup-all": "Hemû koman jê bibe",
+       "trackingcategories-name": "Navê peyamê",
        "mailnologin": "Navnîşanê neşîne",
        "mailnologintext": "Te gireke xwe [[Special:UserLogin|qeydbikê]] û adrêsa e-nameyan di [[Special:Preferences|tercihên xwe]] da nivîsandibe ji bo şandina e-nameyan ji bikarhênerên din ra.",
        "emailuser": "Ji bikarhêner re e-name bişîne",
        "emailsent": "E-name hat şandin",
        "emailsenttext": "E-nameya te hat şandin.",
        "usermessage-editor": "Peyamnêra sîstemê",
-       "watchlist": "Lîsteya min a şopandinê",
+       "watchlist": "Lîsteya şopandinê",
        "mywatchlist": "Lîsteya min a şopandinê",
        "nowatchlist": "Tiştek di lîsteya te ya şopandinê de tune ye.",
        "watchlistanontext": "Ji  kerema xwe ji bo dîtin an jî sererastkirina lîsteya te ya şopandinê xwe $1.",
        "protect_expiry_old": "Dema girtinê di zemanê berê da ye.",
        "protect-default": "Destûrê bide hemû bikarhêneran",
        "protect-level-autoconfirmed": "Bikarhênerên neqeydkirî astengbike",
-       "protect-level-sysop": "Tenê rêveber (admîn)",
+       "protect-level-sysop": "Tenê ji rêveber (admîn)ara destûr bide",
        "protect-expiring": "heta roja $1 (UTC)",
        "protect-expiring-local": "di $1 de dema wê xilas dibe",
        "protect-othertime": "Demeke din:",
        "allmessages-filter-modified": "Guhertî",
        "allmessages-language": "Ziman",
        "allmessages-filter-submit": "Gotar",
+       "allmessages-filter-translate": "Wergerîne",
        "thumbnail-more": "Mezin bike",
        "filemissing": "Rûpel tune",
        "import": "Rûpelan wîne (import)",
        "importbadinterwiki": "Interwiki-lînkekî xerab",
        "importsuccess": "Împort çêbû!",
        "importlogpage": "Têketina tevlîkirinê",
+       "javascripttest": "JavaScript tê testkirin",
        "tooltip-pt-userpage": "Rûpela min",
        "tooltip-pt-anonuserpage": "The user page for the ip you",
        "tooltip-pt-mytalk": "Gotûbêja min",
        "exif-disclaimer": "Ferexetname",
        "exif-unknowndate": "Dîroka nayê zanîn",
        "exif-orientation-1": "Normal",
+       "exif-exposureprogram-1": "Manûel",
        "exif-exposureprogram-2": "Programa normal",
        "exif-meteringmode-0": "Nenas",
        "exif-meteringmode-255": "Yên din",
        "htmlform-submit": "Tomar bike",
        "htmlform-reset": "Guherandinan vegerîne",
        "htmlform-selectorother-other": "Yên din",
+       "htmlform-no": "Na",
+       "htmlform-yes": "Erê",
        "logentry-delete-delete": "$1 rûpela $3 jê bir",
        "revdelete-content-hid": "naverok veşartî ye",
        "revdelete-uname-hid": "navê bikarhêneriyê yê veşartî",
        "logentry-newusers-create": "$1 hesabekî bikarhêneriyê çêkir",
        "rightsnone": "(tune)",
        "revdelete-summary": "kurteyê biguherîne",
+       "feedback-back": "Paşve",
        "feedback-cancel": "Betal bike",
        "feedback-close": "Çêbû",
+       "feedback-error-title": "Çewtî",
        "feedback-message": "Peyam:",
        "feedback-subject": "Mijar:",
        "feedback-thanks-title": "Spas!",
index 4319ac3..55524f6 100644 (file)
        "privacypage": "Project:Dateschutz",
        "badaccess": "Net genuch Rechter",
        "badaccess-group0": "Dir hutt net déi néideg Rechter fir dës Aktioun duerchzeféieren.",
-       "badaccess-groups": "D'Aktioun déi dir gewielt hutt, kann nëmme vu Benotzer aus {{PLURAL:$2|der Grupp|enger vun de Gruppen}} $1 duerchgefouert ginn.",
+       "badaccess-groups": "D'Aktioun déi Dir gewielt hutt, kann nëmme vu Benotzer aus {{PLURAL:$2|der Grupp|enger vun de Gruppen}} $1 duerchgefouert ginn.",
        "versionrequired": "Versioun $1 vu MediaWiki gëtt gebraucht",
        "versionrequiredtext": "D'Versioun $1 vu MediaWiki ass néideg, fir dës Säit ze benotzen.\nKuckt d'[[Special:Version|Versiounssäit]].",
        "ok": "OK",
        "missingsummary": "'''Erënnerung:''' Dir hutt kee Resumé aginn.\nWann Dir nacheemol op \"{{int:savearticle}}\" klickt, gëtt Är Ännerung ouni Resumé ofgespäichert.",
        "selfredirect": "<strong>Opgepasst:</strong> Dir maacht eng Viruleedung vun dëser Aäit op sech selwer.\n\nEt ka sinn datt Dir déi falsch Zilsäit fir d'Viruleedung aginn hutt oder datt Dir déi falsch Säit ännert.\n\nWann Dir nach eng Kéier op \"{{int:savearticle}}\" klickt, da gëtt d'Viruleedung trotzdem ugeluecht.",
        "missingcommenttext": "Gitt w.e.g. eng Bemierkung an.",
-       "missingcommentheader": "'''Denkt drun:''' Dir hutt keen Titel/Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
+       "missingcommentheader": "<strong>Denkt drun:</strong> Dir hutt keen Titel/Sujet fir dës Bemierkung aginn.\nWann Dir nach en Kéier op \"{{int:savearticle}}\" klickt da gëtt Är Ännerung ouni Titel gespäichert.",
        "summary-preview": "Resumé kucken ouni ofzespäicheren:",
        "subject-preview": "Sujet/Iwwerschrëft kucken:",
        "blockedtitle": "Benotzer ass gespaart",
        "rev-showdeleted": "Weisen",
        "revisiondelete": "Versioune läschen/restauréieren",
        "revdelete-nooldid-title": "Ongülteg Zilversioun",
-       "revdelete-nooldid-text": "Dir hutt entweder keng Versioun ugi fir dës Funktioun ze benotzen, déi Versioun déi Dir uginn hutt gëtt et net, oder Dir versicht déi aktuell Versioun ze verstoppen.",
+       "revdelete-nooldid-text": "Dir hutt entweder keng Versioun ugi fir dës Funktioun ze benotzen, oder déi Versioun déi Dir uginn hutt gëtt et net, oder Dir versicht déi aktuell Versioun ze verstoppen.",
        "revdelete-no-file": "De Fichier deen ugi war gëtt et net.",
        "revdelete-show-file-confirm": "Sidd Dir sécher datt Dir déi geläschte Versioun vum Fichier \"<nowiki>$1</nowiki>\" vum $2 ëm $3 gesi wëllt?",
        "revdelete-show-file-submit": "Jo",
        "listfiles-delete": "läschen",
        "listfiles-summary": "Op dëser Spezialsäit stinn all déi eropgeluede Fichieren.",
        "listfiles_search_for": "Sicht nom Fichier:",
+       "listfiles-userdoesnotexist": "De Benotzerkont \"$1\" ass net registréiert.",
        "imgfile": "Fichier",
        "listfiles": "Lëscht vun de Fichieren",
        "listfiles_thumb": "Miniaturbild",
        "emailccsubject": "Kopie vun denger Noriicht un $1: $2",
        "emailsent": "E-Mail geschéckt",
        "emailsenttext": "Är E-Mail gouf fortgeschéckt.",
-       "emailuserfooter": "Dës E-Mail gouf vum $1 dem $2 geschéckt derbäi gouf d'Funktioun \"Benotzer E-Mail\" op {{SITENAME}} benotzt.",
+       "emailuserfooter": "Dës E-Mail gouf vum $1 dem $2 geschéckt dobäi gouf d'Funktioun \"{{int:emailpage}}\" op {{SITENAME}} benotzt.",
        "usermessage-summary": "Benoriichtegung hannerloossen.",
        "usermessage-editor": "Benoriichtegungs-System",
        "watchlist": "Iwwerwaachungslëscht",
        "actionfailed": "Aktioun huet net funktionéiert",
        "deletedtext": "\"$1\" gouf geläscht. Kuckt $2 fir eng Lëscht vun de Säiten déi viru Kuerzem geläscht goufen.",
        "dellogpage": "Läschlëscht",
-       "dellogpagetext": "Hei fannt dir eng Lëscht mat rezent geläschte Säiten. All Auerzäite sinn déi vum Server.",
+       "dellogpagetext": "Hei fannt Dir eng Lëscht mat rezent geläschte Säiten. All Auerzäite sinn déi vum Server.",
        "deletionlog": "Läschlëscht",
        "reverted": "Op déi Versioun virdrun zréckgesat",
        "deletecomment": "Grond:",
        "ipbnounblockself": "Dir kënnt Är Spär net selwer ophiewen",
        "lockdb": "Datebank spären",
        "unlockdb": "Spär vun der Datebank ophiewen",
-       "lockdbtext": "Wann d'Datebank gespaart ass, ka kee Benotzer Säiten änneren, seng Astellungen änneren, seng Iwwerwaachungslëscht änneren, an all aner Aarbecht, déi op d'Datebank zréckgräift.\nW.e.g. confirméiert, datt dir dëst wierklech maache wëllt, an datt dir d'Spär ewechhuelt soubal d'Maintenance-Aarbechten eriwwer sinn.",
+       "lockdbtext": "Wann d'Datebank gespaart ass, ka kee Benotzer Säiten änneren, seng Astellungen änneren, seng Iwwerwaachungslëscht änneren, an all aner Aarbecht, déi op d'Datebank zréckgräift.\nW.e.g. confirméiert, datt Dir dëst wierklech maache wëllt, an datt dir d'Spär ewechhuelt soubal d'Maintenance-Aarbechten eriwwer sinn.",
        "unlockdbtext": "D'Ophiewe vun der Spär vun der Datebank léisst et erëm zou datt all Benotzer Säiten änneren, hir Astellungen an hir Iwwerwaachungslëscht veränneren an all aner Operatiounen déi Ännerungen an der Datebank erfuederen.\n\nConfirméiert w.e.g datt et dat ass wat Dir maache wëllt.",
        "lockconfirm": "Jo, ech wëll d'Datebank wierklech spären.",
        "unlockconfirm": "Jo, ech well d'Spär vun der Datebank wirklech ophiewen.",
        "lockedbyandtime": "(vum $1 de(n) $2 ëm $3 Auer)",
        "move-page": "Réckel $1",
        "move-page-legend": "Säit réckelen",
-       "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
+       "movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
        "movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
        "movepagetalktext": "D'associéiert Diskussiounssäit, am Fall wou  eng do ass, gëtt automatesch matgeréckelt, '''ausser:'''\n*D'Säit gëtt an een aneren Nummraum geréckelt.\n*Et gëtt schonn eng Diskussiounssäit mat dësem Numm, oder\n*Dir klickt d'Këschtchen ënnendrënner net un.\n\nAn deene Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
        "movearticle": "Säit réckelen:",
        "protectedpagemovewarning": "<strong>OPGEPASST:</strong> Dës Säit gouf gespaart sou datt nëmme Benotzer mat Administreursrechter se réckele kënnen.\nDéi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "semiprotectedpagemovewarning": "'''OPGEPASST:''' Dës Säit gouf gespaart sou datt nëmme confirméiert Benotzer se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
        "move-over-sharedrepo": "== De Fichier gëtt et ==\n[[:$1]] gëtt et op engem gedeelte Repertoire. Wann dir e Fichier op dësen Titel réckelt dann ass dee gedeelte Fichier net méi accessibel.",
-       "file-exists-sharedrepo": "Den Numm vum Fichier deen dir erausgesicht hutt gëtt schonn op engem gemeinsame Repertoire benotzt.\nSicht Iech w.e.g. en aneren Numm.",
+       "file-exists-sharedrepo": "Den Numm vum Fichier deen Dir erausgesicht hutt gëtt schonn op engem gemeinsame Repertoire benotzt.\nSicht Iech w.e.g. en aneren Numm.",
        "export": "Säiten exportéieren",
        "exporttext": "Dir kënnt den Text an den Historique vun enger bestëmmter Säit, oder engem Set vu Säiten, an XML agepakt, exportéieren, déi dann an eng aner Wiki mat MediaWiki Software importéiert gi mat Hëllef vun der [[Special:Import|Import-Säit]].\n\nFir eng Säit z'exportéieren, gitt den Titel an d'Textkëscht heidrënner an, een Titel pro Linn, a wielt aus op Dir nëmmen déi aktuell Versioun oder all Versioune mam ganzen Historique exportéiere wëllt.\n\nWann nëmmen déi aktuell Versioun exportéiert soll ginn, kënnt Dir och e Link benotze wéi z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d'\"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "All Säiten Exportéieren",
        "thumbnail_image-missing": "De Fichier schengt ze feelen: $1",
        "import": "Säiten importéieren",
        "importinterwiki": "Vun enger anerer Wiki importéieren",
-       "import-interwiki-text": "Sicht eng Wiki an e Säitentitel eraus fir z'importéieren.\nD'Versiounsdatumen an d'Benotzernimm bleiwen dobäi erhalen.\nAll Transwiki-Import-Aktioune ginn am [[Special:Log/import|Import-Logbuch]] protokolléiert.",
+       "import-interwiki-text": "Sicht eng Wiki an e Säitentitel eraus fir z'importéieren.\nD'Versiounsdatumen an d'Benotzernimm bleiwen dobäi erhalen.\nAll Importer aus anere Wikie ginn am [[Special:Log/import|Import-Logbuch]] protokolléiert.",
        "import-interwiki-sourcewiki": "Quellwiki:",
        "import-interwiki-sourcepage": "Originalsäit:",
        "import-interwiki-history": "Importéier all d'Versioune vun dëser Säit",
        "import-interwiki-templates": "Mat alle Schablounen",
        "import-interwiki-submit": "Import",
-       "import-interwiki-namespace": "Zil-Nummraum:",
-       "import-interwiki-rootpage": "Zil-Stamm-Säit (fakultativ):",
        "import-upload-filename": "Numm vum Fichier:",
        "import-comment": "Bemierkung:",
        "importtext": "Exportéiert de Fichier w.e.g. vun der Source-Wiki mat der [[Special:Export|Export-Funktioun]].\nSpäichert en op Ärem Computer of a luet en hei nees erop.",
        "importcantopen": "De Fichier dee sollt importéiert gi konnt net opgemaach ginn",
        "importbadinterwiki": "Falschen Interwiki-Link",
        "importsuccess": "Den Import ass fäerdeg!",
-       "importnosources": "Fir den Transwiki-Import si keng Quellen definéiert an et ass net méiglech fir Säite mat alle Versiounen aus dem Transwiki-Tëschespäicher eropzelueden.",
+       "importnosources": "Et si keng Wikien definéiert aus deenen importéiert gi soll an direkt Uploade vun de Versioune sinn ausgeschalt.",
        "importnofile": "Et gouf keen importéierte Fichier eropgelueden",
        "importuploaderrorsize": "D'Eropluede vum importéierte Fichier huet net funktionéiert. De Fichier ass méi grouss wéi maximal erlaabt.",
        "importuploaderrorpartial": "D'Eropluede vum Fichier huet net geklappt. De Fichier gouf nëmmen deelweis eropgelueden.",
        "creditspage": "Quellen",
        "nocredits": "Fir dës Säit si keng Informatiounen iwwer d'Mataarbechter vun der Säit disponibel.",
        "spamprotectiontitle": "Spamfilter",
-       "spamprotectiontext": "D'Säit déi dir späichere wollt gouf vum Spamfilter gespaart.\nDëst wahrscheinlech duerch en externe Link den op der schwaarzer Lëscht (blacklist) vun den externe Säite steet.",
+       "spamprotectiontext": "D'Säit déi Dir späichere wollt gouf vum Spamfilter gespaart.\nDëst wahrscheinlech duerch en externe Link den op der schwaarzer Lëscht (blacklist) vun den externe Säite steet.",
        "spamprotectionmatch": "'''Dësen Text gouf vum Spamfilter fonnt: ''$1'''''",
        "spambot_username": "Botz vum Spam duerch MediaWiki",
        "spam_reverting": "Déi lescht Versioun ouni Linken op $1 restauréieren.",
        "pageinfo-protect-cascading-yes": "Jo",
        "pageinfo-protect-cascading-from": "Säite mat Kaskadespär vu(n)",
        "pageinfo-category-info": "Informatiounen iwwer d'Kategorie",
+       "pageinfo-category-total": "Gesamtzuel vun de Memberen",
        "pageinfo-category-pages": "Zuel vun de Säiten",
        "pageinfo-category-subcats": "Zuel vun den Ënnerkategorien",
        "pageinfo-category-files": "Zuel vun de Fichieren",
        "confirmemail_success": "Är E-Mailadress gouf confirméiert. Där kënnt iech elo aloggen an a vollem Ëmfang vun der Wiki profitéieren.",
        "confirmemail_loggedin": "Är E-Mail-Adress gouf elo confirméiert.",
        "confirmemail_subject": "Confirmatioun vun der E-Mail-Adress fir {{SITENAME}}",
-       "confirmemail_body": "E Benotzer, waarscheinlech dir selwer, hutt mat der IP Adress $1 de Benotzerkont \"$2\" um Site {{SITENAME}} opgemaach.\n\nFir ze bestätegen, datt dee Kont iech wierklech gehéiert a fir d'E-Mail-Funktiounen um Site {{SITENAME}} z'aktivéieren, maacht w.e.g. dëse Link an ärem Browser op:\n$3\n\nWann dir dëse Benotzerkont *net* opgemaach hutt, maacht w.e.g. dëse Link an ärem Browser op fir d'E-Mailconfirmation z'annulléieren:\n\n$5\n\nSollt et sech net ëm äre Benotzerkont handelen, da maacht de Link *net* op. De Confirmatiounscode ass gëlteg bis de(n) $4.",
+       "confirmemail_body": "E Benotzer, waarscheinlech Dir selwer, hutt mat der IP Adress $1 de Benotzerkont \"$2\" um Site {{SITENAME}} opgemaach.\n\nFir ze bestätegen, datt dee Kont Iech wierklech gehéiert a fir d'E-Mail-Funktiounen um Site {{SITENAME}} z'aktivéieren, maacht w.e.g. dëse Link an ärem Browser op:\n$3\n\nWann Dir dëse Benotzerkont *net* opgemaach hutt, maacht w.e.g. dëse Link an ärem Browser op fir d'E-Mailconfirmation z'annulléieren:\n\n$5\n\nSollt et sech net ëm Äre Benotzerkont handelen, da maacht de Link *net* op. De Confirmatiounscode ass gëlteg bis de(n) $4.",
        "confirmemail_body_changed": "E Benotzer, wahrscheinlech Dir selwer, vun der IP-Adress $1,\nhuet d'E-Mail-Adress vum Benotzerkont \"$2\" op dës Adress op {{SITENAME}} geännert.\n\nFir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dëse Link an Ärem Browser op:\n\n$3\n\nWann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d'Confirmatioun vun der E-Mail-Adress auszeschalten:\n\n$5\n\nDëse Confirmatiounscode leeft den $4 of.",
        "confirmemail_body_set": "Iergendeen, wahrscheinlech Dir selwer, vun der IP-Adress $1,\nhuet d'E-Mail-Adress vum Benotzerkont \"$2\" op dës Adress op {{SITENAME}} geännert.\n\nFir ze confirméieren datt dëse Benotzerkont Iech wierklech gehéiert a fir d'E-Mailfonctiounen op {{SITENAME}} ze reaktivéieren, maacht dës Link an Ärem Browser op:\n\n$3\n\nWann de Benotzerkont Iech *net* gehéiert, da klickt op dëse Link fir d'Confirmatioun vun der E-Mail-Adress auszeschalten:\n\n$5\n\nDëse Confirmatiounscode leeft den $4 of.",
        "confirmemail_invalidated": "Confirmatioun vun der E-Mail-Adress annulléiert",
        "scarytranscludefailed": "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
        "scarytranscludefailed-httpstatus": "[D'Opruffe vun der Schabloun $1: HTTP $2 huet net funktionéiert]",
        "scarytranscludetoolong": "[D'URL ass ze laang]",
-       "deletedwhileediting": "'''Opgepasst''': Dës Säit gouf geläscht nodeem s datt dir ugefaangen hutt se z'änneren!",
+       "deletedwhileediting": "<strong>Opgepasst:</strong>Dës Säit gouf geläscht nodeem datt Dir ugefaang hutt se z'änneren!",
        "confirmrecreate": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit geläscht, nodeem s datt där ugefaangen hutt drun ze schaffen. D'Begrënnung war: ''$2'' Bestätegt w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
        "confirmrecreate-noreason": "De Benotzer [[User:$1|$1]] ([[User talk:$1|Diskussioun]]) huet dës Säit geläscht, nodeem s datt Dir ugefaangen hutt drun ze schaffen. Confirméiert w.e.g., datt Dir dës Säit wierklech erëm nei opmaache wëllt.",
        "recreate": "Erëm uleeën",
        "tags-create-tag-name": "Numm vun der Markéierung (Tag):",
        "tags-create-reason": "Grond:",
        "tags-create-submit": "Uleeën",
+       "tags-create-no-name": "Dir musst den Numm vun enger Markéierung (tag) uginn.",
        "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-deactivate-reason": "Grond:",
        "tags-deactivate-not-allowed": "Et ass net méiglech d'Markéierung \"$1\" ze desaktivéieren.",
        "tags-deactivate-submit": "Desaktivéieren",
+       "tags-update-remove-not-allowed-one": "D'Markéierung (tag) \"$1\" däerf net ewechgeholl ginn.",
+       "tags-update-remove-not-allowed-multi": "Dës {{PLURAL:$2|Markéierung däerf|Markéierungen däerfen}} net manuell ewechgeholl ginn: $1",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Erausgesicht Versioun|Erausgesicht Versioune}} vu(n) [[:$2]]:",
+       "tags-edit-existing-tags-none": "''Keng''",
+       "tags-edit-new-tags": "Nei Markéierungen (tags):",
+       "tags-edit-add": "Dës Markéierungen (tags) dobäisetzen:",
+       "tags-edit-reason": "Grond:",
+       "tags-edit-success": "D'Ännerunge goufen applizéiert.",
+       "tags-edit-failure": "D'Ännerunge konnten net applizéiert ginn: $1",
        "comparepages": "Säite vergläichen",
        "compare-page1": "Säit 1",
        "compare-page2": "Säit 2",
        "feedback-submit": "Schécken",
        "feedback-thanks": "Merci! Äre Feedback gouf op der Säit \"[$2 $1]\" gespäichert.",
        "feedback-thanks-title": "Merci!",
+       "feedback-useragent": "User Agent:",
        "searchsuggest-search": "Sichen",
        "searchsuggest-containing": "mat ...",
        "api-error-badaccess-groups": "Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.",
index b079546..7e6ddf6 100644 (file)
        "virus-scanfailed": "scanne is mislukt (code $1)",
        "virus-unknownscanner": "onbekeng antivirus:",
        "logouttext": "'''De bis noe aafgemeld.'''\n\nDe kèns {{SITENAME}} noe anoniem (mit vermeljing van IP-adres) gebroeke, of <span class='plainlinks'>[$1 opnuuj aanmelde]</span> ónger dezelfde of 'ne angere naam.\nMäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te de cache van diene browser laeg maaks.",
+       "welcomeuser": "Wilkóm, $1!",
        "yourname": "Diene gebroekersnaam",
        "userlogin-yourname": "Gebroekersnaam",
        "yourpassword": "Die wachwaord",
index e961455..66a5e66 100644 (file)
        "history-feed-description": "دوواره دیئن ویرگار سی بلگه د ویکی",
        "history-feed-item-nocomment": "$1 د\n$2",
        "history-feed-empty": "بلگه حاسته بیه وجود ناره.\nشایت وه د ویکی پاکسا بیه، یا نومش آلشت بیه.\nسی بلگیا مرتوط تازه [[ویجه:پی جوری|پی جوری د ویکی]] کوششت بکید.",
+       "history-edit-tags": "ویرایشت سردیسیا وانئریا انتخاو بیه",
        "rev-deleted-comment": "(ویرایشت چکسته جا وه جا بیه)",
        "rev-deleted-user": "(نوم کاروری جا وه جا بیه)",
        "rev-deleted-event": "(انجوم گر پهرستنومه جا وه جا بیه)",
        "revdelete-submit": "سی {{جمی:$1|وانیری|وانیریا}} انتخاو بیه وه کار بوریتو",
        "revdelete-success": "'''دیئن وانیری وه خوئی وه هنگوم بی.'''",
        "revdelete-failure": "'''دیئن وانیری وه خوئی وه هنگوم نبی:'''$1",
-       "logdelete-success": "<strong>پهرستنومه دیار بیین د خوئی میزونکاری بی.</strong>",
-       "logdelete-failure": "<strong>پهرستنومه دیار بیین نبوئه میزونکاری با.</strong> $1",
+       "logdelete-success": "پهرستنومه دیار بیین د خوئی میزونکاری بی.",
+       "logdelete-failure": "پهرستنومه دیار بیین نبوئه میزونکاری با. $1",
        "revdel-restore": "آلشت حال و بال ديئن",
        "pagehist": "ويرگار بلگه",
        "deletedhist": "ویرگار پاکسا بیه",
        "right-sendemail": "سی کاریاریا هنی انجومانامه کل بکید",
        "right-passwordreset": "رازینه گواردن انجومانامه د نو دئه بیه نه بوینیت",
        "right-managechangetags": "راس کردن[[Special:سردیسیا|سردیسیا]] پاکسا کردن د رسینه جا",
+       "right-applychangetags": "وه کار گرتن [[Special:سردیسیا|سردیسیا]] واگرد آلشتیا هر کومشو",
+       "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "newuserlogpage": "راس بیه وا کاریار",
        "newuserlogpagetext": "یه پهرستنومه راس بیئن کاریاره",
        "rightslog": "پهرستنومه حقوق کاریار",
        "action-editmyprivateinfo": "دونسمنیا شصقی خوتونه ویرایشت بکید",
        "action-editcontentmodel": "ویرایشت مدل مینونه یه گل بلگه",
        "action-managechangetags": "راس کردن و پاکسا کردن سردیسیا د رسینه جا",
+       "action-applychangetags": "سردیسیا نه واگرد آلشتیایی که خوتو دئیته وه کار بیئریت",
+       "action-changetags": "اضاف کردن یا جا وه جاکاری سردیسیا دل وه حایی د وانئریا و پهرستنومه یا شخصی",
        "nchanges": "$1 {{جمی:$1|آلشت|آلشتیا}}",
        "enhancedrc-since-last-visit": "$1 {{جمی:$1|د آخری دیئن}}",
        "enhancedrc-history": "ويرگار",
        "rc_categories": "دسه یا نه محدود کو(وا \"|\" جگا بوئن",
        "rc_categories_any": "هرکوم",
        "rc-change-size": "$1",
-       "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشت",
+       "rc-change-size-new": "$1 {{جمی:$1|بایت|بایتیا}} نها آلشتکاری",
        "newsectionsummary": "/* $1 */ بهرجا تازه",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "rc-enhanced-hide": "جزياته قام كو",
        "uploaderror": "خطا د سوار کردن",
        "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
        "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[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>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
-       "upload-permitted": "جورا جانیا مجاز:$1.",
-       "upload-preferred": "جورا جانیا مجاز:$1.",
-       "upload-prohibited": "جورا جانیا مجاز:$1.",
+       "upload-permitted": "جورا جانیا صلادار:$1 .",
+       "upload-preferred": "جورا جانیا صلادار:$1.",
+       "upload-prohibited": "جورا جانیا صلادار:$1{{PLURAL:$2|.}}",
        "uploadlogpage": "سوارکرد",
        "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
        "filename": "نوم جانیا",
        "listfiles-delete": "پاکسا کردن",
        "listfiles-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
        "listfiles_search_for": "پی جوری سی نوم رسانه:",
+       "listfiles-userdoesnotexist": "حساو کاریاری «$1» ثوت نام نبیه.",
        "imgfile": "جانیا",
        "listfiles": "نوم گه فایل",
        "listfiles_thumb": "بن کلکی",
        "logempty": "او چی ای که شما میهایت د پهرستنومه نیئش.",
        "log-title-wildcard": "بلگه یایی نه پی جوری کو که وا ای سرون شرو موئن",
        "showhideselectedlogentries": "آلشت دئن ورتیه گر پهرستنومه یا انتخاو بیه",
+       "log-edit-tags": "ویرایشت سردیسیایی که پهرستنومه شو گل گر بیه",
        "allpages": "همه بلگيا",
        "nextpage": "بلگه نهایی($1)",
        "prevpage": "بلگه دمایی($1)",
        "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ای کار نه وا ائتیاط نهاداری بکیت.",
+       "delete-toobig": "ای بلگه ویرگارچه ویرایشت فره گپی داره، که د ور گرته بیشتر د یه گل د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nسی یه که د اختلال ناحاستنی د {{SITENAME}} نهاگری با پاکسا کردن ای جوراین بلگه یا محدود بیه.c",
+       "delete-warning-toobig": "{{PLURAL:$1|}}ای بلگه ویرگارچه ویرایشتی گپی داره، که د ور گرته بیشتر د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nپاکسا کردن وه ممکنه که کنشتکاری رسینه جا {{SITENAME}} نه مختل بکه؛\nای کار نه وا آهره کاری نهاداری بکیت.",
        "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
        "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|بلگه یا هنی]] ین که وه بلگه یی که شما د حال و بار پاکسا کردن ونیت پیوند دارن یا د وه پرگنجایشت کاری بیینه.",
        "rollback": "چواشه کردن ویرایشتیا",
        "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|بلگه|بلگه یا}} هاری که گزینه پر و پیم کاری تاف نمایی {{PLURAL:$1|وه|ونو}} کنشتکاره، اومائه.\nآلشتیایی که مال ریتراز ای بلگه ن ری پر و پیم کاری تاف نمایی کارگرایی نارن.",
        "protect-default": "همه کاروریا اجازه دارن",
        "protect-fallback": "فقط کاریاریایی که وه «$1» دسرسی دارن، صلادار ای کارن",
        "protect-level-autoconfirmed": "فقط کاریاریا که خودپشت راس بینه صلادارن",
        "protect-expiring-local": "گات تموم بیین $1",
        "protect-expiry-indefinite": "بی زمون",
        "protect-cascade": "پر و پیم بیین تافنمایی- همه بلگه یایی که هان د ای بلگه پر و پیم بوئن.",
+       "protect-cantedit": "شما نمی تونیت حال و بار پر و پیم کاری ای بلگه نه آلشت بئیت، سی یه که صلا ویرایشت دئن ونه ناریت.",
        "protect-othertime": "وخت هنی:",
        "protect-othertime-op": "گات هنی",
        "protect-existing-expiry": "گات تموم بیین ایسنی: $2، $3",
        "protect-existing-expiry-infinity": "گات تموم بیین: بی گاته",
        "protect-otherreason": "دلیل اضافی/هنی:",
        "protect-otherreason-op": "دلیل هنی",
+       "protect-dropdown": "*دلیلیا جاافتائه سی پر و پیم کاری\n** خراوکاری گپ کلون\n** هرزه نیسی گپ کلون\n** جئن ویرایشتی وه درد نحور\n** بلگه فره تماشاکار دار",
        "protect-edit-reasonlist": "دلیلا پر و پیم بیین ویرایشت",
        "protect-expiry-options": "1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو",
        "restriction-type": "دسرسی:",
        "restriction-level-all": "هر ریترازی",
        "undelete": "دیئن بلگه یا پاکسا بیه",
        "undeletepage": "دیئن و  ؤرگشتن بلگه یا پاکسا بیه",
+       "undeletepagetitle": "'''اوی چی که ها د نها د ور گرته نسقه یا پاکسا بیه [[:$1|$1]] ه'''.",
        "viewdeletedpage": "دیئن بلگه یا پاکسا بیه",
+       "undeletepagetext": "{{PLURAL:$1|بلگه های پاکسا بیه|بلگه یا هاری پاکسا بینه}} ولی ایسه د اماییه جا {{PLURAL:$1|هئ|هان}} و {{PLURAL:$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": "بوين/دوواره آماده با",
        "undeletedrevisions-files": "{{PLURAL:$1|1 وانئری|$1 وانئریا}} و{{PLURAL:$2|1 جانیا|$2 جانیا}} د نو زئنه بینه.",
        "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\n$1",
+       "undelete-show-file-confirm": "آیا یه دل بئیته که میهایت یه گل نسقه پاکسا بیه د جانیا \"<nowiki>$1</nowiki>\" که ها د ویرگار $2 ساعت $3 نه سیل بکیت؟",
        "undelete-show-file-submit": "هری",
        "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم جا:",
        "invert": "انتخاو برعسك بوئه",
        "tooltip-invert": "د ری ای جعوه بپورنیت و آلشتیایی نه که د مینجا نوم ورگه انتخاو بیه انجوم بینه قام بکیت(و ار نوم ورگه شریکی وارسی بیه)",
+       "tooltip-whatlinkshere-invert": "ای جعون نه سی نهو کردن هوم پیوند بلگه یایی که نوم جاشو انتخاو بیه، انتخاو بکیت.",
        "namespace_association": "نوم جایا یکاگرته",
        "tooltip-namespace_association": "ای جعوه نه وارسی بکیت ای جعوه د ور گرته چک چنه یا داسون نوم ورگه شریکی و نوم ورگه انتخاو بیه ئه",
        "blanknamespace": "اصلی",
        "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": "فقط ویرایشتیایی که جزئه آخرین دوواره دیئن هئین نشو بیه",
        "whatlinkshere-next": "{{جمی:$1|نهایی|نهایی $1}}",
        "whatlinkshere-links": "هوم پیوندیا",
        "whatlinkshere-hideredirs": "$1 واگردونیا",
-       "whatlinkshere-hidetrans": "$ا چن نتیجه یی",
+       "whatlinkshere-hidetrans": "$1 چن نتیجه یی",
        "whatlinkshere-hidelinks": "هوم پیوندیا $1",
        "whatlinkshere-hideimages": "فایل هوم پیوندیا $1",
        "whatlinkshere-filters": "فيلتريا",
        "unblock": "کاریار نهاگری نبیه",
        "blockip": "نهاگری{{GENDER:$1|کاریار}}",
        "blockip-legend": "نهاگری کاریار",
+       "blockiptext": "نومگه بلگه هاری نه سی نهاگری د دسرسی ویرایشت یه گل تیرنشون آی پی وا نوم کاریاری مشخص وه کار بئیریت.\nای کار فقط فقط واس سی نهاگری د خراوکاری و د پایه [[{{MediaWiki:Policy-url}}|سیاست نهاگری]] انجوم با.\nدلیل دیاری نه د هار بوئیت (مثلند وا گوتن بلگه یایی که دشو خراوکاری بیه).",
        "ipaddressorusername": "نوم نشون آی پی يا نوم كاروری:",
        "ipbexpiry": "تموم بين:",
        "ipbreason": "دليل:",
+       "ipbreason-dropdown": "*دلیلیا جاافتائه سی نهاگری\n**دئن دونسمنیا غلط\n**پاکسا کردن دونسمنیا خو د بلگه یا\n**هرزه نیسی د طریق نیسنن هوم پیوند تکراری د دیارگه یا\n**نیسنن چرند و چار یا نیسسه یا بی مئنی د بلگه یا\n**سهم ونن د کاریاریا هنی\n**وه کار گرتن چن گل حساو کاریاری\n**نوم کاریاری گن",
        "ipb-hardblock": "پیشگری د ویرایشت کردن کاریاریی که د طریق ای تیرنشون آی پی وامین اومانه.",
        "ipbcreateaccount": "نهاگری دروس کردن حساو",
        "ipbemailban": "نهاگرتن کاریار د کل کردن انجومانامه",
        "blockipsuccesssub": "قلف کردن د خوئی انجوم بی",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته بیه.<br />\nسی وارسی بسته بیه یا [[Special:BlockList|نوم گه بسته بیه یا ]] نه سیل بکیت.",
        "ipb-blockingself": "شما د حال نهاگری خوتونیت! آیا دلراس هیئت که میهایت چنی کاری انجوم بیتو؟",
+       "ipb-confirmhideuser": "شما د حال و بار بستن یه گل کاریاریت که سی وه «نهوسازی کاریار» کنشتیار بیه. ای کار نوم کاریار نه د همه نومگه یا و سیائه یا نهو می که، آیا یه دلیت که میهایت ای کار نه انجوم بئیت؟",
+       "ipb-confirmaction": "ار د راستکی یه دل بئیته که میهایت ونه انجوم بئیت، لطف بکیت زمینه \"{{int:ipb-confirm}}\" ونه د هار وارسی بکیت.",
        "ipb-edit-dropdown": "ویرایشت دلیلیا نهاگرتن",
        "ipb-unblock-addr": "وا کردن قلف $1",
        "ipb-unblock": "واز کردن نوم کاریاری یا تیرنشون آی پی",
        "ipb-blocklist": "دیئن نهاگرتن یا ایسنی",
        "ipb-blocklist-contribs": "هومیاریا $1",
        "unblockip": "کارور منع نبیه",
+       "unblockiptext": "سی ؤرئشت دئن دسرسی نیسسن د یه گل تیرنشون آی پی یا نوم کاریاری نهاگری بیه نوم بلگه هاری نه وه کار بئیریت.",
        "ipusubmit": "ای قلف نه ؤردار",
        "unblocked": "دسرسی [[User:$1|$1]] دوواره برقرار بیه.",
        "unblocked-range": "$1 وا بیه.",
        "change-blocklink": "اجازه نديئن سی  آلشت",
        "contribslink": "هومیاریا",
        "emaillink": "انجومانامه نه کل کو",
+       "autoblocker": "وه خود انجومن بسه بی سی یه که آی پی شما د ایسنی وه دس کاریار «[[User:$1|$1]]» وه کار گرته بیه.\nدلیل نهاگری $1 ینه \"$2\"",
        "blocklogpage": "قلف",
+       "blocklog-showlog": "تیرنشون ای آی پی دماتر نهاگیری بیه.\nنهاگری ای پهرستنومه وا سرچشمه هاری دروس بیه:",
+       "blocklog-showsuppresslog": "تیرنشون ای آی پی دماتر نهاگیری بیه.\nنهاگری ای پهرستنومه وا سرچشمه هاری دروس بیه:",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
        "reblock-logentry": "میزوکاری سی نهاگری[[$1]] آلشت بیه سی آخر نهاگری د $2 $3",
+       "blocklogtext": "ای پهرستنومه سی نهاگری یا واز کردن دسرسی کاریاریائه.\nتیرنشونیا آی پی که خود انجومن نهاگری بینه د ایسنی نومگه کاری نبینه.\nسی نومگه نهاگریا و بسه بینیا د ایسنی روئیت د [[Special:BlockList|نومگه نهاگری بیه یا]].",
        "unblocklogentry": "وا کردن قلف $1",
        "block-log-flags-anononly": "فقط کاریاریایی که نادیارن",
        "block-log-flags-nocreate": "حساو راس کردن عاجز بیه.",
        "range_block_disabled": "درس کردن بسن یه گل پوشگر وه دس دیوونداریا ناکنشتگر بیه.",
        "ipb_expiry_invalid": "گات تموم بیین نامعتوره.",
        "ipb_expiry_temp": "نهاگری نوم کاریاریا قام بیه واس همیشه یی با.",
+       "ipb_hide_invalid": "نبوئه ای حساو نه پاکساکاری کرد؛ ای حساو بیشتر د {{PLURAL:$1|یه گل ویرایشت|$1 ویرایشتیا}} نه د خوش داره.",
        "ipb_already_blocked": "\"$1\" ایسه نهاگری بیه.",
        "ipb-needreblock": "$1 د دماتر نهاگری بیه. آیا میهایت میزوکاری ونه آلشت بیتو؟",
        "ipb-otherblocks-header": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
+       "unblock-hideuser": "‫سی یه که حساو کاریاری ای کاریار نهو بیه شما نمی تونیت ونه واز بکیت.‬",
        "ipb_cant_unblock": "خطا:نهاگری د نوم دیارکن $1 دیار نئ.شایت وه د ایسنی نهاگریش د بین رئته.",
+       "ipb_blocked_as_range": "خطا: تیرنشون آی‌ پی $1 سر راست نهاگری نبیه و نبوئه وازش بکیت.\nای تیرنشون واگرد پوشگر $ نهاگری بیه و بوئه وازش بکی.",
        "ip_range_invalid": "پوشگر نامعتور آی پی",
        "ip_range_toolarge": "نهاگری پوشینه یا گپتر $1/ مجاز نئ.",
        "proxyblocker": "قلف کننه پروکسی",
+       "proxyblockreason": "تیرنشون آی پی شما نهاگری بیه سی یه مال یه گل پروکسی آزاده.\nلطف بکیت وا انجومکار اینترنتی خوتو یا حامینکار کسمی خوتو پیوند بگریت و ونونه د مشگل امنتی گن خوتو وارسیار بکیت.",
        "sorbs": "دی ان اس بی ال",
+       "sorbsreason": "تیرنشون آی پی شما وه دس DNSBL  وه کار گرته وه دس {{SITENAME}} چی یه گل پروکسی آزاد گزارشت بیه.",
+       "sorbs_create_account_reason": "تیرنشون آی پی شما وه دس DNSBL  وه کار گرته وه دس {{SITENAME}} چی یه گل پروکسی آزاد گزارشت بیه.\nشما نتونیت یه گل حساو راس بکیت.",
+       "xffblockreason": "تیرنشون آی پی ها د X-Forwarded-For header و پروکسی شما یا رسینه گایی که شما ونه وه کار مئیریت نهاگری بیه. دلیل نهاگری وه: $1",
+       "cant-see-hidden-user": "کاریاری که شما میهایت دش نهاگری بکیت د دماتر نهاگری بیه و نهو بیه.\nسی یه که شما وه نهوکاری کاریار دسرسی ناریت نمی تونیت نهاگری کاریار نه دسکاری بکیت.",
+       "ipbblocked": "شما نمی تونیت د دسرسی کاریاریا هنی نهاگری بکیت یا ونه واز بکتی سی یه د دسرسی خوتو نهاگری بیه.",
        "ipbnounblockself": "شما صلادار وارکدن دسرسی خوتو نییت.",
        "lockdb": "قلف کردن رسینه گا",
        "unlockdb": "رسینه گا قلف نبیه",
+       "lockdbtext": "قلف کردن رسینه جا امکان ویرایشت بلگه یا، آلشت دئن میزونکاری، ویرایشت سیل برگیا و آلشتکاریا هنی نه که واس سی ونو د رسینه جا آلشتکاری بکیت د همه کاریاریا مئیره.\nلطف بکیت ای کاری که میهات انجوم بئیت پشت راسکاری بکیت و  داولی گات رسینه جا نه د حال و بار قلف بیه درمیارت.",
+       "unlockdbtext": "وا کردن قلف رسینه جا ای صلا نه وه همه کاریاریا میئه که می تونن بلگه یا ویرایشت بکن، میزونکاری نه آلشت بکن، سیل برگیا نه آلشتکاری بکن و هر آلشتی نه سی انجوم دئنش ها رسینه جا نه آلشت بئن می تونن \nلطف بکیت ای کاری که میهات انجوم بئیت پشت راسکاری بکیت.",
        "lockconfirm": "هره، مه واقعند میهام که رسینه گا نهاگری با.",
        "unlockconfirm": "هره، مه واقعند میهام که رسینه گا وا بوئه.",
        "lockbtn": "قلف کردن رسینه گا",
        "locknoconfirm": "شما کلیت پشت راسکاری نه نشودار نکردیته.",
        "lockdbsuccesssub": "رسینه گا د خوئی قلف بیه",
        "unlockdbsuccesssub": "قلف رسینه گا ؤرداشته بیه",
+       "lockdbsuccesstext": "رسینه جا قلف بیه.\n<br />د ویرتو نروئه که نها تموم بیین واداشتکاری قلف نه ورداریت.",
        "unlockdbsuccesstext": "رسینه گا وا بیه.",
+       "lockfilenotwritable": "نبوئه قلف رسینه جا نه بنیسیت. سی یه بتونیت رسینه جا قلف بکیت یا قلفش وا بکیت، واس ای جانیا نیسسه یی بوئه.",
        "databasenotlocked": "رسینه گا وازه.",
        "lockedbyandtime": "(وا{{GENDER:$1|$1}} د $2 د$3)",
        "move-page": "$1 جا وه جا کو",
        "move-page-legend": "بلگه نه جا وه جا کو",
+       "movepagetext": "وا وه کار گرتن نوم بلگه های نوم بلگه آلشت موئه، و همه ویرگارچه وه روئه وه نوم تازه ش.\nشما می تونیت آلشتکاری مسیریایی که وه داسون اصلی خوشو اشاره می کن نه وه هنگوم سازی بکیت.\nهوم پیوندیایی که چی بلگه دماترین، آلشتکاری نموئن؛ حتمن آلشت کاری مسیریا [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خروا]] نه وارسی بکیت.\n'''شما''' مسئول یه دل بیین ده یه نیت که هوم پیوندیا هنی هان د هموچه که قراره روئن.\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'''هشدار!'''\nجاوه جا کاری بلگه د نوم تازه شایت یه گل آلشتکاری پایه یی و ناحاستنی سی بلگه یا حاستنی با؛\nلطف بکیت یه دل بوئیت که دما د جا وه جا کاری بلگه، عاقوت ای کار نه دونیت.",
+       "movepagetalktext": "بلگه چک چنه مربوطه، ار با، وه حال و بار خودانجوم واگرد گوتار اصلی جا وه جا کاری بوئه<strong>مر یه که:</strong>\n* شما د حال و بار جا وه جاکاری بلگه د ای نوم جا وه یه گل نوم جا هنی بوئیت.\n* یه گل بلگه چک چنه حال نبیه نه وا ای نوم با، یا \n* جعوه هاری نه نشودار نکردیته.\n\nد ای حال و باریا، واس بلگه نه دسی جا وه جاکاری بکیت یا مینونه یا دو بلگه نه وا ویرایشت یکی بکیت.",
        "movearticle": "جا وه جا کردن بلگه:",
+       "moveuserpage-warning": "'''هشدار:''' شما د حال و بار جا وه جا کاری یه گل بلگه کاریاریت.د ویر داشتوئیت که تینا بلگه جا وه جاکاری بوئه و نوم کاریار آلشت '''نموئه'''.",
+       "movecategorypage-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": "سی سرون هنی:",
        "movepage-moved": "<strong>\"$1\" جا وه جا بیه سی \"$2\"</strong>",
        "movepage-moved-redirect": "یه گل واگردونی دروس بیه.",
        "movepage-moved-noredirect": "د دروس کردن واگردونی جلوگری بیه.",
+       "articleexists": "یه گل بلگه وا ای نوم د دماتر بیه، یا نومی که شما دئیه ته معتور نئ.\nلطف بکیت یه گل نوم هنی انتخاو بکیت.",
+       "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": "{{جمی:$1|زیر بلگه|زیر بلگه یا}}",
+       "movesubpagetext": "ای بلگه $1 زیربلگه داره که د زیر نشو {{PLURAL:|نشو دئه بیه|دئه بینه}}.",
        "movenosubpage": "ای بلگه زیر بلگه نئ.",
        "movereason": "دلیل:",
        "revertmove": "لرستن",
        "delete_and_move": "پاکسا و جا وه جا بوئه",
+       "delete_and_move_text": "== پاکساکاری میها ==\n\nگوتار ها د مقصد «[[:$1]]» . آیا میهایت ونه پاکسا بکیت  تا جا وه جاکاری دروس بوئه؟",
        "delete_and_move_confirm": "هری بلگه نه پاکسا کو",
        "delete_and_move_reason": "پاکساکاری سی ممکن بیین جا وه جایی «[[$1]]»",
+       "selfmove": "داسونا بلگه اول و بلگه مقصد یکی ین؛\nنبوئه بلگه نه د خوش جا وه جاکاری کرد.",
        "immobile-source-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
        "immobile-target-namespace": "نبوئه بلگه یا نه وه نومجا \"$1\" جا وه جا با",
        "immobile-target-namespace-iw": "هوم پیوند مینجاویکی حاستنی مجازی سی جا وه جا کردن بلگه نئ.",
        "immobile-source-page": "ای بلگه جا وه جا کردنی نئ.",
        "immobile-target-page": "نبوئه وه ای مقصد چنی سرونی جا وه جا بوئه.",
+       "bad-target-model": "مقصد حاستنی مدل مینونه دار فرخداری نه وه کار گرته. نبوئه$1 نه بکیت وه $2.",
        "imagenocrossnamespace": "نبوئه جانیانه وه یه گل نومجا غیرجانیایی جا وه جا بکیت",
        "nonfile-cannot-move-to-file": "نبوئه جانیانه وه یه گل نومجا غیرجانیایی جا وه جا بکیت",
        "imagetypemismatch": "دماون جانیا تازه وا نوع وه سازگاری ناره",
        "move-leave-redirect": "وه جا نیائن یه گل واگردونی",
        "protectedpagemovewarning": "<strong>زئنار:ای بلگه سی یه پر و پیم بیه که کاریاریایی که دسرسی دیوونداری دارن فقط بتونن دش ویرایشت بکن.</strong>\nآخرین سیائه سی سرچشمه یا د هار اماییه کاری بیه:",
        "semiprotectedpagemovewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
+       "move-over-sharedrepo": "== جانیا هئیش ==\n[[:$1]] ها د یه گل اماییه جا بهربیه. جا وه جاکاری یه گل جانیا وه ای نوم باعث موئه که یه گل جانیا بهربیه باطل با.",
+       "file-exists-sharedrepo": "نوم جانیا انتخاو بیه و ایسنی د یه گل اماییه جا بهربیه وه کار گرته بیه.\nلطف بکیت یه گل نوم هنی نه انتخاو بکیت.",
        "export": "وه صحرا ديئن بلگيا",
+       "exporttext": "شما می تونیت نیسسه و ویرگارچه ویرایشت یه بلگه جادیار بیه یا یه گل کوملوس د بلگه یا نه وه حال و بار پوشیه د ایکس ام ال برویت وه در.\nای دونسمنیا نه بوئه د یه گل ویکی هنی که نرم افزار «ویکی وارسگر» نه انجومکاری می که د طریق [[Special:Import|بلگه وامین اوردن]] وامین اورد.\n\nسی وه در دئن بلگه یا، داسون ونونه بیاریت د جعوه هاری(د هر خط فقط یه گل داسون) و مشخص بکیت که آیا نسقه ایسنی بلگه واگرد نسقه یا دمادار و ویرگارچه بلگه نه میهایت، یا تینا نسقه ایسنی بلگه و دونسمنیا آخری ویرایشت نه میهایت .\n\nد حال و بار دوئم، شما می تونیت یه گل هوم پیوند نه وه کار بئیرت چی [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] سی بلگه «[[{{MediaWiki:Mainpage}}]]».",
        "exportall": "وه صحرا ديئن همه بلگيا",
        "exportcuronly": "فقط مینونه دار وانئری ایسنی با،نه همه ویرگار نه",
+       "exportnohistory": "----\n'''د ویر داشتوئیت:''' وه در دئن ویرگارچه کامل بلگه یا د طریق ای بلگه سی دلیلیا انجومکاری کنتشیار نئ.",
        "exportlistauthors": "مینونه دار نومگه کامل هومیاریا سی هر بلگه",
        "export-submit": "وه در ديئن",
        "export-addcattext": "اضاف کردن بلگه یا د یه گل دسه:",
        "allmessagesname": "نوم",
        "allmessagesdefault": "سفارشت متنی پيش فرض",
        "allmessagescurrent": "نیسسه ایسنی پیغوم",
+       "allmessagestext": "یه یه گل نومگه د پیغومیا سامونه یی یه که هان د نوم ورگه ویکی وارسگر.\nاری میهایت د ویکی وارسگر نه ولاتمن بکیت لطف بکیت [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ولاتمن کردن ویکی وارسگر] و [//translatewiki.net translatewiki.net] نه سیل بکیت.",
+       "allmessagesnotsupportedDB": "ای بلگه وه کار گرتنی نئ سی یه که <bdi>'''$wgUseDatabaseMessages'''</bdi> ناکنشتگر بیه.",
        "allmessages-filter-legend": "فیلتر",
        "allmessages-filter": "فیلتر کردن د اساس شخصی کردن:",
        "allmessages-filter-unmodified": "آلشت نبیه",
        "thumbnail_toobigimagearea": "جانیا وا بعدیا گپتر د $1",
        "thumbnail_dest_directory": "نبوئه دایرکتوری مقصد نه درست بکیت",
        "thumbnail_image-type": "نوع عسگ حامیین داری نبوئه",
+       "thumbnail_gd-library": "میزونکاری ناقص کتاوخونه GD: انجومکار $1 نیئش",
        "thumbnail_image-missing": "وه ویر و باور میا که جانیا گم بیه:$1",
+       "thumbnail_image-failure-limit": "کوشایشتیا ناخوش سرانجوم ایسنی فره یی ($1 یا بیشتر) سی دئن ای عسگ کوچک انجوم گرته. لطف بکیت د نو تلاش بکیت.",
        "import": "وامین اوردن بلگه یا",
        "importinterwiki": "وامین اوردن ترانس ویکی",
+       "import-interwiki-text": "یه گل ویکی و یه گل نوم بلگه نه انتخاو بکیت تا دونسمنیا وه وامین کاری با.\nویرگار نسقه یا و نوم ویرایشتکاریا بی آلشت می مونه.\nدونسمنیا مربوط د وامین اوردن بلگه یا د یه گل ویکی هنی د [[Special:Log/import|پهرستنومه وامین اوردن]] پهرست کاری موئه.",
        "import-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 {{جمی:$1|وانئری|وانئریا}}",
        "importnopages": "هیچ بلگه ای وامین نیومائه.",
        "importcantopen": "نبوئه جانیا دئه بیه نه وا بکید",
        "importbadinterwiki": "هوم پیوند مینجاویکی گن",
        "importsuccess": "وامین اوردن تموم بی!",
+       "importnosources": "هیچ سرچشمه یی سی وامین اوردن دونسمنیا د ویکیا هنی تعریف نبیه.",
        "importnofile": "هیچ جانیا دئه بیه ای سوار نبیه.",
+       "importuploaderrorsize": "د سوارکرد وامین اوردن جانیا مشگلی پیش اومائه.\nانازه جانیا د بیشترونه انازه مجاز فره بیشتره.",
        "importuploaderrorpartial": "د سوارکرد وامین اوردن جانیا شکستی پیش اومائه.\nانازه جانیا د انازه بیشترونه مجاز گپتره.",
        "importuploaderrortemp": "د سوارکرد جانیا وامین اوردن مشگلی پیش اومائه.\nتابنده موقت گم بیه.",
        "import-parse-failure": "خطا د وااشکافت یه گل وامین اوردن ایکس ام ال",
        "import-error-special": "بلگه «$1» وامین نیومائه، سی یه که وه مال وه یه گل نومجا خاصه که او بلگه یا صلادار نئین.",
        "import-error-invalid": "بلگه \"$1\"  سی یه که نامعتور بیین نومش ممکن بی د ویکی وامین اورده نبیه.",
        "import-error-unserialize": "نبوئه وه دراوردن بلگه $2 د بلگه «$1» د شکل رازینه کاری بیه نه انجوم بییت.چؤ اومائه که نسقه ای د مدل مینونه $3 وه کار گرته که وه د شکل $4 رازینه کاری بیه.",
+       "import-error-bad-location": "وانئری $2 وا وه کار گرتن مدل مینونه $3 نبوئه د \"$1\" د ای ویکی اماییه کاری بیه با، سی یه که مدل د او بلگه که مدل د او بلگه پشت راسکاری نبیه.",
        "import-options-wrong": "{{PLURAL:$2|جزئیات|جزئیات}} اشتوا: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "ریشه دئه بیه د بلگه یه گل سرون نامعتوره.",
        "import-rootpage-nosubpage": "نومجا \"$1\" بلگه پایه صلا زیر بلگه نه نمی یه.",
        "creditspage": "اعتوار بلگه",
        "nocredits": "دونسمنیا راس کننه یا ای بلگه د دسرس نئ",
        "spamprotectiontitle": "فیلتر پر و پیم گری د اسپم",
+       "spamprotectiontext": "د اماییه کاری بلگه وه دس فیلتر هرزه نیسی نهاگری بی.\nمعمولند ای رخ ون د گاتی پیش میا که نیسسه تازه بلگه، مینونه داری یه گل هوم پیوند وه یه گل تیرنشون دیارگه بوئه که د نومگه سئ با.",
        "spamprotectionmatch": "نیسسه هاری چی ای یه که فیلتر اسپم ایما نه ونه د کار: $1",
        "spambot_username": "اسپم پاک کن ویکی وارسگر",
        "spam_reverting": "واگردونی وه آخری نسقه ای که هوم پیوندی وه $1 ناره.",
        "pageinfo-protect-cascading-yes": "هری",
        "pageinfo-protect-cascading-from": "پر و پیم بیین تافنمایی د",
        "pageinfo-category-info": "دونسمنیا دسه ای",
+       "pageinfo-category-total": "شماره همه اندومیا",
        "pageinfo-category-pages": "شماره بلگيا",
        "pageinfo-category-subcats": "شماره زیر دسه یا",
        "pageinfo-category-files": "شماره جانیایا",
        "markaspatrolleddiff": "نشو دار کردن چی سردیاری بیه",
        "markaspatrolledtext": "ای بلگه نه چی بلگه ای که سردیاری کرده با نشودار کو",
        "markedaspatrolled": "نشو دار کردن چی سردیاری بیه",
+       "markedaspatrolledtext": "د نسقه انتخاو بیه د [[:$1]] سردیس گشتکاری زئه بی.",
        "rcpatroldisabled": "سردیاری کردن سی آلشتیا ایسنی ناکنشتگر بیه",
        "rcpatroldisabledtext": "خصوصیت سردیاری کردن د ری آلشتیا ایسنی تازه ای یا ناکشتگر بیه.",
        "markedaspatrollederror": "نبوئه چی یه گل سردیاری کرده نشودار با",
        "patrol-log-page": "پهرستنومه گشتن",
        "patrol-log-header": "یه پهرستنومه وانئریا سردیاری کرده هئ.",
        "log-show-hide-patrol": "$1 پهرستنومه سردیاری کردن",
+       "log-show-hide-tag": "سردیس پهرستنومه $1",
        "deletedrevision": "وانئری دماتری پاکسابیه د $1",
        "filedeleteerror-short": "خطا پاک نبیئن جانیا:$1",
        "filedeleteerror-long": "د گات پاکسا کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
        "filedelete-archive-read-only": "نشونگه مال دیارکردن ($1) د لا سرور قاول نیسنن نئ.",
        "previousdiff": "← ويرايشت كۈهنه تر",
        "nextdiff": "ويرايشت تازه تر",
+       "mediawarning": "'''هشدار''': شایت ای جانیا د خوش رازینه یا گن داشتوئه.\nشایت وا اجرا وه انجومیار شما آسیو دینه.",
        "imagemaxsize": "انازه عسگ:<br /><em>(سی شرح جانیا بلگه یا)</em>",
        "thumbsize": "انازه بن کلکی:",
        "widthheight": "$1 × $2",
        "file-info-size": "$1 × $2 پیکسل, انازه فایل: $3, MIME نوع: $4",
        "file-info-size-pages": "$1 × $2 pixels, انازه جانیا: $3, MIME type: $4, $5 {{PLURAL:$5|بلگه|بلگه یا}}",
        "file-nohires": "عسك ون بالاتري دش ني",
-       "svg-long-desc": "اس وی جی جانیا.نومنا $1 $2 پيكسل",
+       "svg-long-desc": "اس وی جی جانیا.نومن $1 $2 پيكسل $1",
        "svg-long-desc-animated": "جانیا جمشدار اس وی جی .نومنا $1 × $2 پيكسل،انازه جانیا:$3",
        "svg-long-error": "جانیا اس وی جی نامعتور:$1",
        "show-big-image": "جانیا اصلی",
        "file-info-png-looped": "حلقه دار",
        "file-info-png-repeat": "$1 بازی کرده{{جمی:$1|وخت|وختیا}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|فریم|فریمیا}}",
+       "file-no-thumb-animation": "'''د ویر داشتوئیت: سی مشگلیا فنی پیش نمایشت جانیا وه حال و بار جمشت دار نشو دئه نبوئه.'''",
+       "file-no-thumb-animation-gif": "'''د ویر داشتوئیت: سی مشگلیا فنی پیش نمایشت جانیایا GIF چی یه وه حال و بار جمشت دار نشو دئه نبوئه.'''",
        "newimages": "عسگدونی جانیایا تازه",
        "imagelisttext": "د هار نومگه <strong>$1</strong> {{PLURAL:$1|جانیا|جانیایا}} اماییه جا بیه$2.",
        "newimages-summary": "ای بلگه یا ویجه همه جانیایا سوار بیه نه نشو می ئین.",
        "namespacesall": "همه شو",
        "monthsall": "همه",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
+       "confirmemail_noemail": "شما د بلگه [[Special:Preferences|ترجیحات کاریاری]] خوتو یه گل تیرنشون انجومانامه نامعتور نه دئیته.",
+       "confirmemail_text": "ای ویکی، شما نه مژبور می که وه پشت راسکاری تیرنشون انجومانامه خوتو، دما د یه که خدمات انجومانامه نه وه کار د ایچه وه کار بئیریت می که.دگمه هاری نه کنشتیار بکیت تا یه گل انجومانامه پشت راسکاری سی تیرنشون انجومانامه شما کل بوئه. ای انجومانامه د ور گرته یه گل رازینه ئه. هوم پیوند نه د دوارته نیئر خوتو واز بکیت تا تیرنشون انجومانامه تو پشت راسکاری با.",
+       "confirmemail_pending": "یه گل رازینه پشت راسکاری د دماتر وه شکل انجومانامه سی شما کلی بیه. ار د ای آخریا حساو خوتونه واز کردیته شایت بد نبا که دما یه که یه گل رازینه هنی بهایت چن دیقه آهره داری بکیت تا شایت انجومانامه دمایی وه تو برسه.",
        "confirmemail_send": "کل کردن رازینه پشت راس کاری",
        "confirmemail_sent": "انجومانامه پشت راس کردن کل بیه.",
+       "confirmemail_oncreate": "یه گل رازینه پشت راسکاری د دماتر وه شکل انجومانامه سی شما کلی بیه.\nسی اومائن وامین د سامونه نمیها ای رازینه وارد بکیت، ولی سی ره وندیاری امکانات وابسه د انجومانامه د ای ویکی ونه میهایت.",
+       "confirmemail_sendfailed": "کل کردن انجومانامه پشت راسکاری انجومگر نبی.\nتیرنشون انجومانامه نه د لحاظ بیین نیسسه یا گن وارسی بکیت.\n\nجواو سامونه کل کردن انجومانامه: $1",
+       "confirmemail_invalid": "رازینه پشت راسکاری نامعتوره. \nشایت وه تموم بیه با.",
        "confirmemail_needlogin": "لطف بکید $1 نه سی تیرنشون انجومانامه تو پشت راس بکید.",
        "confirmemail_success": "تیرنشون انجومانامه تو پشت راس بیه.\nشایت شما ایسه بهایت [[Special:چی یه گل کاریار|بیایت وامین]]و د ویکی لذت بوریت",
        "confirmemail_loggedin": "تیرنشون انجومانامه شما ایسه پشت راس بیه.",
        "confirmemail_subject": "{{SITENAME}} تیرنشون انجومانامه پشت راست کردن",
+       "confirmemail_body": "یه نفر، شایت خوتو، د تیرنشون آی‌ پی $1 حساو کاریاری وا نوم «$2» و ای تیرنشون انجومانامه نه {{SITENAME}} ره وندیاری کرده.\n\nسی پشت راسکاری یه که ای حساو د راستکی مال شمانه و هنی سی کنشتیاری انجومانامه {{SITENAME}} هوم پیوند هاری نه د دوارته نیئر خوتو واز بکیت:\n\n$3\n\nار شما ای حساو کاریاری نه ثوت *نکردیته*، لطف بکیت هوم پیوند هاری نه واز بکیت تا پشت راسکاری تیرنشون انجومانامه انجومشیو بوئه:\n\n$5\n\nای رازینه پشت راسکاری د ویرگار $4 تموم موئه.",
+       "confirmemail_body_changed": "یه نفر، شایت خوتو، د تیرنشون آی‌ پی $1 حساو کاریاری وا نوم «$2» و ای تیرنشون انجومانامه نه {{SITENAME}} ره وندیاری کرده.\n\nسی پشت راسکاری یه که ای حساو د راستکی مال شمانه و هنی سی کنشتیاری انجومانامه {{SITENAME}} هوم پیوند هاری نه د دوارته نیئر خوتو واز بکیت:\n\n$3\n\nار ای حساو کاریاری مال شما *نئ*، لطف بکیت هوم پیوند هاری نه واز بکیت تا پشت راسکاری تیرنشون انجومانامه انجومشیو بوئه:\n\n$5\n\nای رازینه پشت راسکاری د ویرگار $4 تموم موئه.",
+       "confirmemail_body_set": "\nیه نفر، شایت خوتو، د تیرنشون آی‌ پی $1 حساو کاریاری وا نوم «$2» و ای تیرنشون انجومانامه نه {{SITENAME}} ره وندیاری کرده.\n\nسی پشت راسکاری یه که ای حساو د راستکی مال شمانه و هنی سی کنشتیاری انجومانامه {{SITENAME}} هوم پیوند هاری نه د دوارته نیئر خوتو واز بکیت:\n\n$3\n\nار شما ای حساو کاریاری نه ثوت *نکردیته*، لطف بکیت هوم پیوند هاری نه واز بکیت تا پشت راسکاری تیرنشون انجومانامه انجومشیو بوئه:\n\n$5\n\nای رازینه پشت راسکاری د ویرگار $4 تموم موئه.",
        "confirmemail_invalidated": "پشت راس کنی انجومانامه انجوم شیو بیه",
        "invalidateemail": "انجومشیو کردن پشت راس کردن انجومانامه",
        "scarytranscludedisabled": "[پرگنجایشت کاری مینجا ویکی کنشتکار نئ]",
        "scarytranscludefailed-httpstatus": "[واحونی چوئه سی $1 انجومگر نبی: خطا اچ‌ تی‌ تی‌ پی $2]",
        "scarytranscludetoolong": "[یو آر ال فره گپه]",
        "deletedwhileediting": "<strong>زئنار:</strong>ای بلگه د او گاتی که شما شرو د ویرایشت کردیته پاکسا بیه!",
+       "confirmrecreate": "کاریار [[User:$1|$1]] ([[User talk:$1|چک چنه]]) ای گوتار نه نها یه که شما شرو د ویرایشتش کردیته سی دلیل هاری پاکسا کرده:\n: ''$2''\nلطف بکیت پشت راسکاری بکیت که میهایت د نو ای گوتار نه دروس بکیت.",
+       "confirmrecreate-noreason": "کاریار [[User:$1|$1]] ([[User talk:$1|چک چنه]]) ای گوتار نه نها یه که شما شرو د ویرایشتش کردیته.\nلطف بکیت پشت راسکاری بکیت که میهایت د نو ای گوتار نه دروس بکیت.",
        "recreate": "د نو راس کردن",
        "confirm_purge_button": "خوئه",
        "confirm-purge-top": "میهایت کش ای بلگه نا پاک بکیت؟",
+       "confirm-purge-bottom": "حالی کردن مینجاگر یه گل بلگه باعث موئه که آخری نسقه وه دیاری بکه.",
        "confirm-watch-button": "خوئه",
        "confirm-watch-top": "ای بلگه نه د سیل برگتو اضاف می کید؟",
        "confirm-unwatch-button": "خوئه",
        "autoredircomment": "بلگه واگردونی بیه سی[[$1]]",
        "autosumm-new": "راست کردن بلگه وه دس \"$1\"",
        "autosumm-newblank": "بلگه حالی دروس بیه",
+       "lag-warn-normal": "شایت آلشتیا تازه تر د $1 {{PLURAL:$1|ثانیه|ثانیه یا}} د ای نومگه دیاری نکن.",
+       "lag-warn-high": "شایت سی واپس رئتن فره رسینه جا، آلشتیا تازه تر د $1 {{PLURAL:$1|ثانیه|ثانیه یا}} د ای نومگه دیاری نکرده بان.",
        "watchlistedit-normal-title": "ویرایشت سیل برگ",
        "watchlistedit-normal-legend": "ؤرداشتن سرونیا د سیل برگ",
+       "watchlistedit-normal-explain": "داسونایی که هان د نومگه سیل برگه شما د هار اومائنه.\nسی پاکسا کردن داسون جعوه کناری وه نه نشودار بکیت و دگمه «{{int:Watchlistedit-normal-submit}}» نه بپورنیت.\nشما همچنی می تونیت [[Special:EditWatchlist/raw|نومگه خام نه ویرایشت بکیت]].",
        "watchlistedit-normal-submit": "ؤرداشتن سرونیا",
+       "watchlistedit-normal-done": "$1 داسون د نومگه سیل برگ شما پاکسا {{PLURAL:$1|بی|بیین}}:",
        "watchlistedit-raw-title": "سیل برگ نه ردیفی ویرایشت کو",
        "watchlistedit-raw-legend": "سیل برگ نه ردیفی ویرایشت کو",
+       "watchlistedit-raw-explain": "داسونایی که هان د نومگه سیل برگ شما هان د هار، و شما می تونیت چیایی نه پاکسا یا اضاف بکیت؛ هر چی واس د یه گل خط جگا بوئه.\nدس آخر،ری دگمه «{{int:Watchlistedit-raw-submit}}» کلیک بکیت.\nد ویر داشتوئیت که شما می تونیت د [[Special:EditWatchlist|ویرایشتگر استاندارد نومگه سیل برگ]] نم وه کار بئیریت.",
        "watchlistedit-raw-titles": "داسون:",
        "watchlistedit-raw-submit": "وه هنگوم سازی سیل برگ",
        "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|بی|بیین}}:",
        "watchlistedit-too-many": "ایچه بلگه یا فره ای سی نشو دئن هئ.",
        "watchlisttools-clear": "پاک کردن سیل برگ",
        "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "timezone-utc": "UTC",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
+       "duplicate-displaytitle": "<strong>هشدار:</strong> نشو دئن داسون\" $2 \"باعث باطل بیین نشو دئن داسون \" $1 \" موئه.",
+       "invalid-indicator-name": "<strong>خطا:</strong>خصوصیات جادیارکنیا حال و بار بلگه <code>name</code> نباید حالی بان.",
        "version": "نسقه",
        "version-extensions": "دمادیسیا پورسه",
        "version-skins": "پوسه یا پورسه بیه",
        "version-poweredby-credits": "ای ویکی د لا '''[https://www.mediawiki.org/ ویکی وارسگر]''' حامینداری بوئه، همه حقوق پر و پیم کاری بیه© 2001-$1 $2.",
        "version-poweredby-others": "دیه رون",
        "version-poweredby-translators": "والریاریاtranslatewiki.net",
+       "version-credits-summary": "کسونایی که هان د زیر سی یه که د [[Special:Version|ویکی وارسگر]] ویرایشکاری داشتنه معرفی می کیم.",
+       "version-license-info": "ویکی وارسگر یه گل نرم افزار آزاده. شما می تونیت ونه وا شرایط نیسسه کاری ۲، یا (وا ویر و باور خوتو) هر نیسسه کاری تازه یی نه د پروانه کومله یکی خلکمن گنو که وه دس بنیاد نرم افزار آزاد درتیچ کاری بیه، د نو درتیچ کاری بکیت.\n\nویکی وارسگر وا ای دال که شایت خوو با درتیچ کاری بیه، ولی هیچ پشت راسکاری، حتی پشت راسکاری تجاری یا خوو بیین سی یه گل وه کار گرتن ویجه نه سیتو دیاری نمیکه.سی دونسمنیا بیشتر سیل پروانه کومله یکی خلکمن گنو بکیت.\n\nشما واس [{{SERVER}}{{SCRIPTPATH}}/COPYING یه گل نسقه د پراونه کومله یکی خلکمن گنو] نه واگرد ای برنامه گرته بایت. د غیر ای حال و بار وا Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا ونه [//www.gnu.org/licenses/old-licenses/gpl-2.0.html نامه نیسی کردوئیت یا ونه وه حال و بار برخط بحونیت].",
        "version-software": "نرم افزار پورسه بیه",
        "version-software-product": "نتجه",
        "version-software-version": "نسقه",
        "version-libraries-version": "نسقه",
        "redirect": "واگردونی وا جانیا،بلگه یا وانیئری نوم دیارکو",
        "redirect-legend": "واگردونی د جانیا یا بلگه",
+       "redirect-summary": "ای بلگه ویجه وا جانیا (نوم جانیا هیئش)، بلگه (شماره شناسیار بلگه یا شماره نسقه دیار بیه) یا بلگه کاریاری (شناسیار عددی کاریاری دیار بیه) واگردونی بوئه. طرز وه کار گرتن: [[{{#Special:Redirect}}/file/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "رو",
        "redirect-lookup": "پی جوری:",
        "redirect-value": "ارزایشت:",
        "redirect-file": "نوم جانیا",
        "redirect-not-exists": "انازه که پیدا نبی",
        "fileduplicatesearch": "پی جوری سی جانیایا دوکونه",
+       "fileduplicatesearch-summary": "پی جوری سی جانیایا تکراری د پایه انازه د یک شیوسه ونو انجومگر بوئه.",
        "fileduplicatesearch-legend": "پی جوری سی دوکونه",
        "fileduplicatesearch-filename": "نوم جانیا:",
        "fileduplicatesearch-submit": "پی جوری",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $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": " اومائن د سيستم/راس كردن حساو",
        "intentionallyblankpage": "ای بلگه عمدن حالی هشته بیه",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tags": "سردیسیا آلشت دئن خو",
-       "tag-filter": "فيلتر [[Special:سردیسیا|سردیس]]:",
+       "tag-filter": "فيلتر [[Special:سردیس|سردیسیا]]:",
        "tag-filter-submit": "فيلتر",
        "tag-list-wrapper": "([[Special:سردیسیا|{{PLURAL:$1|سردیس|سردیسیا}}]]: $2)",
        "tags-title": "سردیسیا",
+       "tags-intro": "ای بلگه یه گل نومگه د سردیسیاییه که نرم افزار وا ونو ویرایشتیا نه نشو کاری میکه، الوت واگرد هومبراوریاشو.",
        "tags-tag": "نوم سردیس",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
+       "tags-description-header": "توضیح کامل هومبراور",
        "tags-source-header": "سرچشمه",
        "tags-active-header": "کنشتگره؟",
        "tags-hitcount-header": "آلشتیا سردیس دار",
        "tags-hitcount": "$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": "د گات ره وندیاری سردیس \"$1\" وا {{PLURAL:$2|هشدار|هشداریا}} یی که هان د هار پیش اومانه:",
        "tags-create-warnings-below": "شما واقعن میهایت راس کردن ای سردیس نه دماداری بکیت؟",
        "tags-delete-title": "پاکسا کردن سردیس",
+       "tags-delete-explanation-initial": "شما د حال و بار پاکسا کردن سردیس «$1» د رسینه جا هئیت.",
+       "tags-delete-explanation-in-use": "یه د {{PLURAL:$2|$2 ویرایشت یا داده یا پهرستنومه یا وانئری|همه $2 ویرایشت و/یا درینده پهرستنومه}} پاکسا بوئه وا یه که ایسه تصیق کاری بیه.",
+       "tags-delete-explanation-warning": "ای انجومکاری<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": "ناکنشتیاری کردن",
+       "tags-apply-no-permission": "شما صلا ینه که آلشتکاری سردیسیا نه واگرد آلشتیا خوتون وه کار بئریت ناریت.",
+       "tags-apply-not-allowed-one": "شما صلا ناریت سردیس  \"$1\" نه دسی وه کار بیئریت.",
+       "tags-apply-not-allowed-multi": "شما صلا ناریت که ای {{PLURAL:$2|سردیس|سردیسیا}} که د هار اومانه دسی وه کار بیئریت:$1",
+       "tags-update-no-permission": "شما صلا ینه که آلشتیا سردیسیا یا داده یا پهرستنومه نه د وانئریا شخصی ورداریت یا جا وه جا کاری بکیت ناریت.",
+       "tags-update-add-not-allowed-one": "شما صلا ناریت سردیس  \"$1\" نه دسی اضاف بکیت..",
+       "tags-update-add-not-allowed-multi": "شما صلا ناریت که ای {{PLURAL:$2|سردیس|سردیسیا}} که د هار اومانه دسی اضاف بکیت:$1",
+       "tags-update-remove-not-allowed-one": "شما صلا ناریت سردیس  \"$1\" نه دسی جا وه جاکاری بکیت.",
+       "tags-update-remove-not-allowed-multi": "شما صلا ناریت که ای {{PLURAL:$2|سردیس|سردیسیا}} که د هار اومانه دسی جا وه جاکاری بکیت:$1",
+       "tags-edit-title": "ویرایشت سردیسیا",
+       "tags-edit-manage-link": "دیوونداری سردیسیا",
+       "tags-edit-revision-selected": "{{PLURAL:$1|وانیری گل گر بیه|وانیری گل گر بیه}} د [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|پهرستنومه رخ ونیا انتخاو بیه|پهرستنومه رخ ونیا انتخاو بیه}}:",
+       "tags-edit-revision-legend": "اضاف کردن یا جا وه جاکاری سردیسیا د {{PLURAL:$1|د ای وانئری|همه وانئریا $1}}",
+       "tags-edit-logentry-legend": "اضاف کردن یا جا وه جاکاری سردیسیا د {{PLURAL:$1|د ای پهرستنومه|همه پهرستنومه یا $1}}",
+       "tags-edit-existing-tags": "سردیسیایی که هیئشو:",
+       "tags-edit-existing-tags-none": "\"هیشکوم\"",
+       "tags-edit-new-tags": "سردیسیا تازه:",
+       "tags-edit-add": "ای سردیسیا نه اضاف بکیت",
+       "tags-edit-remove": "ای سردیسیا نه ورداریت",
+       "tags-edit-remove-all-tags": "(همه سردیسیا نه ورداریت)",
+       "tags-edit-chosen-placeholder": "چن گل سردیس انتخاو بکیت",
+       "tags-edit-chosen-no-results": "هیچ سردیسی سی یکاگری دیاری نکرد",
+       "tags-edit-reason": "دلیل:",
+       "tags-edit-revision-submit": "وه کار گرتن سردیسیا د {{PLURAL:$1|د ای وانئری|وانئریا $1}}",
+       "tags-edit-logentry-submit": "وه کار گرتن سردیسیا د {{PLURAL:$1|د ای پهرستنومه|پهرستنومه یا $1}}",
+       "tags-edit-success": "آلشتکاریا وا خوش سرانجومی وه کار گرته بیین.",
+       "tags-edit-failure": "نبوئه آلشتکاریا وه کار گرته بان.",
+       "tags-edit-nooldid-title": "وانیری حاستنی نامعتوره",
+       "tags-edit-nooldid-text": "شما یه گل وانئری دالکاری بیه سی یه که ای پیوندگر نه انجوم بیه تیار کاری نکردیته، یا وانئری که تیار کاری نبیه.",
+       "tags-edit-none-selected": "لطف بکیت یه حداقل یه گل سردیسی سی اضاف کردن یا جا وه جاکاری انتخاو بکیت.",
        "comparepages": "کنار یک نیاین بلگه یا",
        "compare-page1": "بلگه 1",
        "compare-page2": "بلگه 2",
        "compare-invalid-title": "داسونی که شما تیار کردیته خو نئ.",
        "compare-title-not-exists": "سرون مشقص بیه وجود ناره.",
        "compare-revision-not-exists": "وانئری که شما تی دیار کردیته وجود ناره.",
+       "dberr-problems": "د بدبختی! ای دیارگه مشگلیا وه کار گرتنی فنی داره.",
+       "dberr-again": "چن دیقه آهره داری بکیت و دنو بلگه نه سوار بکیت.",
        "dberr-info": "(نبوئه وه رسینه جا:$1 دسرسی داشتوئیت)",
        "dberr-info-hidden": "(نبوئه د رسینه گا دسرسی داشت)",
+       "dberr-usegoogle": "شما د ای گات می تونیت سی پی جوری گوگل نه وه کار بئریت.",
+       "dberr-outofdate": "د ویر داشتوئیت که سیائه یا ونو د مینونه یا ایما شایت وه هنگوم نبا.",
+       "dberr-cachederror": "او چی که ها نها میا یه گل ورداشته د بلگه حاستنیه که که ها د کش و شایت  وه هنگوم نبا.",
        "htmlform-invalid-input": "یه قری مشگل ها د پاره یی د درینده یا شما.",
+       "htmlform-select-badoption": "ارزایشتی که دئیته یه گل گزینه حاستنی نئ.",
+       "htmlform-int-invalid": "ارزایشتی که دئیته یه گل عدد صحیح نئ.",
+       "htmlform-float-invalid": "ارزایشتی که دئیته یه گل عدد نئ.",
        "htmlform-int-toolow": "انازه یی که شما دئیته د کمترونه $1 فره کمتره.",
        "htmlform-int-toohigh": "انازه یی که شما دئیته د بشترونه $1 فره بیشتره.",
        "htmlform-required": "یه دئه واس بوئه.",
        "sqlite-no-fts": "$1 وا بی حامینداری پی جوری تمام نیسسه یی",
        "logentry-delete-delete": "$1 بلگه {{GENDER:$2|پاکسا بیه}} $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|}} بلگه $3 د نو زنه کرده",
+       "logentry-delete-event": "$1 دیاری {{PLURAL:$5|یه گل رخ ون د پهرستنومه|$5 رخ ونیا د پهرستنومه}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
+       "logentry-delete-revision": "$1 دیاری {{PLURAL:$5|یه گل وانئری|$5 وانئریا}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
+       "logentry-delete-event-legacy": "$1 دیاری پهرستنومه رخ ونیا نه د $3 {{GENDER:$2|آلشت ده}}",
+       "logentry-delete-revision-legacy": "$1 دیاری وانئریا نه د بلگه $3 {{GENDER:$2|آلشت ده}}",
+       "logentry-suppress-delete": "$1 $3 نه {{GENDER:$2| پاکساکاری کرد}}",
+       "logentry-suppress-event": "$1 دیاری {{PLURAL:$5|یه گل رخ ون د پهرستنومه|$5 رخ ونیا د پهرستنومه}} د $3 نه نهونی {{GENDER:$2|آلشتکاری کرد}}: $4",
+       "logentry-suppress-revision": "{{GENDER:$2|$1 دیاری {{PLURAL:$5|یه گل وانئری|$5 وانئریا}} نه د $3 نهونی {{GENDER:$2|آلشتکاری کرد}}: $4}}",
+       "logentry-suppress-event-legacy": "$1 دیاری پهرستنومه رخ ونیا نه د $3 نهونی {{GENDER:$2|آلشت ده}}",
+       "logentry-suppress-revision-legacy": "$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-block-block": "$1 {{GENDER:$4|$3}} نه $5 {{GENDER:$2|نهاگری کرد}} $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|واز کرد}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|میزونکاری}} نهاگری {{GENDER:$4|$3}} نه وه آخر نهاگری $5 $6 آلشت ده.",
+       "logentry-suppress-block": "$1 {{GENDER:$4|$3}} نه تا $5 {{GENDER:$2|نهاگری کرد}} $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|میزونکاری}} نهاگری {{GENDER:$4|$3}} نه وه آخر نهاگری $5 $6 آلشت ده.",
+       "logentry-import-upload": "$1 $3 نه وه دس جانیا سوارکن {{GENDER:$2|وامین اورد}}",
+       "logentry-import-interwiki": "$1 $3 نه د یه گل ویکی هنی {{GENDER:$2|وامین اورد}}",
+       "logentry-merge-merge": "$1  $3  نه د $4 {{GENDER:$2| سریک سازی کرد}} (نسقه تا  $5)",
        "logentry-move-move": "$1 {{GENDER:$2|جا وه جا کرده}} بلگه $3 نه سی $4",
+       "logentry-move-move-noredirect": "$1 بلگه $3 نه بی یه که یه گل واگردونی داشوئه د $4 {{GENDER:$2|جا وه جاکاری کرد}}",
+       "logentry-move-move_redir": "$1 بلگه $3 نه د $4 که واگردونی بی {{GENDER:$2|جا وه جاکاری کرد}}",
+       "logentry-move-move_redir-noredirect": "$1 بلگه $3 نه بی یه که یه گل واگردونی د $4 داشتوئه که یه خوش واگردونی بی {{GENDER:$2|جا وه جاکاری کرد}}",
+       "logentry-patrol-patrol": "$1 نسقه $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|دروس بی}}",
+       "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 {{GENDER:$2|سوار کرده}} $3",
+       "logentry-upload-overwrite": "$1 یه گل نسقه تازه د $3 نه {{GENDER:$2|سوار کرد}}",
        "logentry-upload-revert": "$1 $3 نه {{GENDER:$2|سوارکرد}}",
        "log-name-managetags": "سردیس دیوونداری کردن پهرستنومه",
+       "log-description-managetags": "ای بلگه امور دیوونداری مربوط د [[Special:Tags|سردیسیا]] نه نومگه کاری می که. پهرستونمه فقط مینونه داری کنشتکاریاییه که وه دس یه گل دیوونداری و شکل دسی انجوم گرته بان؛شایت سردیسیا وه دس نرم افزار ویکی ره وندیاری بیه بان یا پاکسا بان بی یه که هیچ ورودی د ای پهرستنومه ثبت با.",
        "logentry-managetags-create": "$1 {{GENDER:$2|سردیس \"$4\"}} نه راس کرده",
+       "logentry-managetags-delete": "$1 سردیس نه د \"$4\" {{GENDER:$2|پاکسا کرد}} (پاکسا بیه د $5 {{PLURAL:$5|نسقه یا پهرستنومه|نسقه یا/و پهرستنومه}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|سردیس}} کنشتیار بیه\"$4\" سی کاریاریا و رباتیا",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|سردیس}} ناکنشتیار بیه\"$4\" سی کاریاریا و رباتیا",
+       "log-name-tag": "پهرستنومه سردیس",
+       "log-description-tag": "ای بلگه د گاتی که کاریاریا [[Special:سردیسیا|سردیسیا]]  نه د وانئریا یا پهرستنومه یا اضاف می کن یا ؤرمی دارن دیاری میکه.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|اضاف کرد}} {{PLURAL:$7|سردیس|سردیسیا}} $6 نه د وانئری $4 د بلگه $3",
+       "logentry-tag-update-add-logentry": "$5$1 {{GENDER:$2|اضاف کرد}} {{PLURAL:$7|سردیس|سردیسیا}} $6 نه د پهرستنومه $4 د بلگه $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|جا وه جاکاری کرد}} {{PLURAL:$9|سردیس|سردیسیا}} $8 نه د وانئری $4 د بلگه $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|جا وه جاکاری کرد}} {{PLURAL:$9|سردیس|سردیسیا}} $8 نه د پهرستنومه $4 د بلگه $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|وه هنگوم سازی کرد}} سردیسیا نه د وانئری $4 د بلگه $3 ({{PLURAL:$7|اضاف کرد}} $6; {{PLURAL:$9|جا وه جاکاری کرد}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|وه هنگوم سازی کرد}} سردیسیا نه د پهرستنومه $4 د بلگه $3 ({{PLURAL:$7|اضاف کرد}} $6; {{PLURAL:$9|جا وه جاکاری کرد}} $8)",
        "rightsnone": "(هيش كوم)",
        "revdelete-summary": "چکسه ویرایشت",
        "feedback-adding": "اضاف کردن هوال حون یار د بلگه....",
        "feedback-back": "دما",
+       "feedback-bugcheck": "عالیه! فقط وارسی بکیت که د کنید که [$1 ایراتیا دیار بیه] نبا.",
        "feedback-bugnew": "مه وارسیش کردمه. یه گل سیسرک تازه گزارشت بی",
+       "feedback-bugornote": "ار حاضریت تا یه گل مشگل فنی و جزیاتش بوئیت، لطف بکیت [$1 یه گل ایراته نه بوئیت]. د غیر ای حال می تونیت نوم بلگه ساده هار  نه وه کار بئریت . ویر و باور شما واگرد نوم کاریاری و دوارته نیئر شما د بلگه «[$3 $2]» اضاف موئه.",
        "feedback-cancel": "انجوم شیوسن",
        "feedback-close": "انجوم بی",
        "feedback-external-bug-report-button": "جانیا سازی یه گل کنشتیاری کسمدار",
        "feedback-dialog-title": "دیار بیین نهاحردیاری",
+       "feedback-dialog-intro": "شما می تونیت نوم بلگه هاری نه سی دماداری هوال حونتو وه کار بئریت.نیسسه شما واگرد نوم کاریاریتو د بلگه \"$1\" اضاف موئه.",
        "feedback-error-title": "خطا",
+       "feedback-error1": "خطا: جواویا نادیار د پیوندکار برنامه نیسی نرم افزار",
        "feedback-error2": "خطا:ویرایشت خو نبی",
        "feedback-error3": "خطا: جواو ندئن د پیوندکار برنامه نیسی نرم افزار",
+       "feedback-error4": "خطا:نبوئه سی داسون دمادار حوال حو یه گل داسون فریسنار بکیت",
        "feedback-message": "پيغوم:",
        "feedback-subject": "سرون:",
        "feedback-submit": "كل كردن",
+       "feedback-terms": "مه دونم که دونسمنیا سر کاریارم دباره دوارته نیئر و نسقه انجوما سامونه یی که وه کار میئرم، وه شکل خلکمنی واگرد نوم کاریاریم هومبری با.",
+       "feedback-termsofuse": "مه وا نیائن دمادار هوال حو د پایه شرایط وه کار گرتن موافقم.",
+       "feedback-thanks": "منموندارتونیم! دمادار حوال حون شما د بلگه «[$1 $2]» ثبت بی.",
        "feedback-thanks-title": "دتو منمونیم!",
        "feedback-useragent": "راوط کاریا:",
        "searchsuggest-search": "پی جوری",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
        "api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
+       "api-error-duplicate": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|[$2 یه گل جانیا هنی]|[$2 چن گل جانیا هنی]}} د دیارگه وا مینونه هومبراور بی.ولی پاکسا {{PLURAL:$1|بیه|بینه}}.",
        "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری یی که ایسه پاکسا بیینه",
        "api-error-duplicate-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری",
        "api-error-empty-file": "جانیایی که دئی ته حالی بی.",
        "api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
+       "api-error-fetchfileerror": "خطا مین کار: د گات گرتن جانیا، یه چی یی خو پیش نرت.",
+       "api-error-fileexists-forbidden": "یه گل جانیا وا نوم \"$1\" هئ و نبوئه ونه دوارته نیسی بکی.",
+       "api-error-fileexists-shared-forbidden": "یه گل جانیا وا نوم \"$1\" ها د جانیا بهر بیه د اماییه گا و نبوئه ونه دوارته نیسی بکی.",
        "api-error-file-too-large": "جانیایی که دئیته فره گپه.",
        "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
        "api-error-filetype-banned": "چنی جانیا قدقه بیه.",
+       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یه جور جانیا ناصلاداره|چن جور جانیا ناصلادارن}}. {{PLURAL:$3|جور جانیا صلاداره|چن جور جانیا صلادارن}} چنیه: $2.",
        "api-error-filetype-missing": "نوم جانیا یه گل دمادیس گم بیه ئه.",
        "api-error-hookaborted": "آلشکاری که شما میهاستیت ره وندیاریش بکیت وا یه گل دما دیس انجوم شیو بیه.",
        "api-error-http": "خطا مینجایی:نبوئه د رسینه جا وصل بوئیت.",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
+       "api-error-internal-error": "خطا مینجاکار: وا پردازشتکاری سوارکرد شما د ویکی ، یه گل اشتوا پیش اوما.",
+       "api-error-invalid-file-key": "خطا مینجاکار: جانیا د اماییه جا موقت نئ.",
+       "api-error-missingparam": "خطا مینجاکار: پارامتریایی که د حاست نیئن.",
+       "api-error-missingresult": "خطا مینجاکار: نبوئه بفمئی که ورداشت کاری خوش سرانجوم بیه یا نه.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
+       "api-error-mustbeposted": "خطای مینجاکار: حاستن واس د طریق روشت POST HTTP کل با.",
+       "api-error-noimageinfo": "سوارکرد خوش سرانجوم بی، ولی رسینه جا هیچ جور دونسمنی یی د جانیا وه ایما نه دئه.",
+       "api-error-nomodule": "خطا مینجاکار: ماجول سوارکرد میزونکاری نبیه.",
+       "api-error-ok-but-empty": "خطا مینجاکار: رسینه جا جواوی نده.",
+       "api-error-overwrite": "نیسنن ری یه گل جانیایی که هیئش صلا ندئه بیه",
+       "api-error-stashfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
+       "api-error-publishfailed": "خطا مینجاکار: رسینه جا نمی تونه جانیا موقت نه اماییه کاری بکه.",
+       "api-error-stasherror": "د گات جا وه جاکاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
+       "api-error-stashedfilenotfound": "د گاتی که سی سوارکرد جانیا استش تلاش می کردیت، جانیا استش دیاری نکرد.",
+       "api-error-stashpathinvalid": "مسیری که جانیا استش واس د وه با اشتوا بی.",
+       "api-error-stashfilestorage": "د گات اماییه کاری جانیا سی اماییه کاری یه گل خطا پیش اوما.",
+       "api-error-stashzerolength": "رسینه جا نمی تونه جانیا استش نه اماییه بکه سی یه انازه وه صفره.",
+       "api-error-stashnotloggedin": "سی اماییه کاری جانیایا د سوارکرد استش واس روئیت مین سامونه.",
+       "api-error-stashwrongowner": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت،مال شما نئ.",
+       "api-error-stashnosuchfilekey": "جانیا کلیتی که شما میهاستیت د وه دسرسی داشتوئیت، نیئش.",
+       "api-error-timeout": "رسینه جا د گات تیه وه را بیین جواوی نده.",
        "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
        "api-error-unknown-code": "خطا نادیار:\"$1\".",
+       "api-error-unknown-error": "خطا مینونه: د گاتی که شما د حال و بار تلاش سی سوارکرد جانیاتو بییت، یه گل اشتوا پیش اوما.",
        "api-error-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-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
+       "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد در حرده",
+       "limitreport-title": "داده یا جانیاکار وااشکافت کار:",
        "limitreport-cputime": "گات وه کار گرتن سی پی یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "limitreport-walltime": "زمون راستکی وه کار گرتن",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
+       "limitreport-ppvisitednodes": "شمارش یار گره دیئه بیه دما پردازشتکار",
        "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "شمارش یار گره تولیدی دما پردازشتکار",
        "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "انازه د ور گرته نها گپ کلونکاری",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایت|بایتیا}}",
+       "limitreport-templateargumentsize": "انازه چوئه آرگومان",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت|بایتیا}}",
+       "limitreport-expansiondepth": "بیشتری پی یا گپ کلونکاری",
        "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "انازه انجومگریا وااشکافتکار پر مصرف",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "گپ کلون کردن چوئه یا",
+       "expand_templates_intro": "ای بلگه ویجه یه گل نیسسه نه گرته و همه چوئه یایی که هان د وه ونونه و حال و بار ؤرئشتن گپ کلونکاری می که همچنی. آلشیاریا وااشکافت کاری چی <code><nowiki>{{</nowiki>#language:…}}</code> و آلشتکنیا چی <code><nowiki>{{</nowiki>CURRENTDAY}}</code> نه ئم گپ کلونکاری می که— د راستکی تقریون هر چی نه که ها د میلات دو گل آکولات. ای کار وا واحونی کاری ریترازجا وااشکافت مربوط د خود ویکی وارسگر انجوم دیار موئه.",
+       "expand_templates_title": "داسون، سی {{FULLPAGENAME}} و چیا هنی:",
        "expand_templates_input": "نیسسه درینده:",
        "expand_templates_output": "نتیجه",
        "expand_templates_xml_output": "درده ایکس ام ال",
+       "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": "پيش سيل",
+       "expand_templates_preview_fail_html": "<em>سی یه که{{SITENAME}} تا یه گل HTML خام کنشتیار و یه گل د دس رئتن دونسمنیا نشسجا هئ، پیش سیل وا داسون یه انجومکاری احتیاطی ری وه ری چل کاریا جاوا نیسسه نهو بیه.</em>\n\n<strong>ار ای تلاش پیش سیل مشروعه، لطف بکیت د نو تلاش بکیت. ار هنی ئم کار نمی که، تلاش بکیت ری [[Special:UserLogout|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
+       "expand_templates_preview_fail_html_anon": "<em>سی یه که{{SITENAME}} تا یه گل HTML خام کنشتیار و یه گل د دس رئتن دونسمنیا نشسجا هئ، پیش سیل وا داسون یه  احتیاطی ری وه ری چل کاریا جاوا نیسسه نهو بیه.</em>\n\n<strong>ار ای تلاش پیش سیل مشروعه، لطف بکیت د نو تلاش بکیت. ار هنی ئم کار نمی که، کوشایشت بکیت ری [[Special:UserLogout|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
        "pagelanguage": "بلگه انتخاو زون",
        "pagelang-name": "بلگه",
        "pagelang-language": "زون",
        "action-pagelang": "آلشت دئن زون بلگه",
        "log-name-pagelang": "آلشت دئن زون پهرستنومه",
        "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2| آلشتکاری بی}} زون بلگه سی $3  د $4  وه $5 .",
+       "default-skin-not-found": "$2اوف! پوسه پیش‌ فرض سی ویکی شما تعریف نبیه د <code dir=\"ltr\"<$wgDefaultSkin</code> وا داسون <code>$1</code>، د دسرس نئ.\n\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: ویکی وارسگر نسقه ۱٫۲۴ و تازه‌تر هنی وه شکل خودانجوم پوسه یا پورسته نه کنشتیار نمی که.\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": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "mediastatistics": "آماریا وارسگر",
+       "mediastatistics-summary": "آماریایی که دباره جوریا یه گل جانیا وه هنگوم بیه . ای چی فقط د ور گرته آخری نسقه جانیائه. نسقه یا دمایی یا پاکسا بینه یا جیاوازی دارن.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایتیا}} ($2; $3%)",
        "mediastatistics-table-mimetype": "جورMIME:",
        "mediastatistics-table-extensions": "دمادیسیا ممکن",
        "mediastatistics-header-text": "نیسسه دار",
        "mediastatistics-header-executable": "اجرا کردنیا",
        "mediastatistics-header-archive": "قالویا جم بیه",
+       "json-warn-trailing-comma": "$1 ویرگار که ها د نها جی سون {{PLURAL:$1|پاکسا بی}}.",
+       "json-error-unknown": "مشگل د جی سون بی. خطا: $1",
+       "json-error-depth": "بیشترونه پی یا دماداری رد بیه",
+       "json-error-state-mismatch": "جی‌ سن نادرست یا ناقص",
+       "json-error-ctrl-char": "خطا نیسه یار کنترلی، شایت غلط رازینه کاری بیه",
        "json-error-syntax": "خطا دستوری",
+       "json-error-utf8": "نیسه یاریا غلط یو تی‌ اف-۸، شایت غلط رازینه کاری بیه",
+       "json-error-recursion": "ری کردن یه گلی یا بیشتر د انازه یی که رازینه کاری بوئه",
        "json-error-inf-or-nan": "ارزایشتیا INF یا NAN یه گل یا بیشتر د وه د انازه یی که رازینه کاری بیه",
        "json-error-unsupported-type": "یه گل ارزایشت د جوری که نبوئه رازینه کاری با وتو دئه بیه",
        "headline-anchor-title": "هوم پیوند کردن د ای بهرجا",
index a392ca1..3d7cb68 100644 (file)
@@ -57,7 +57,7 @@
        "tog-shownumberswatching": "Rodyti stebinčių naudotojų skaičių",
        "tog-oldsig": "Esamo parašo peržiūra:",
        "tog-fancysig": "Laikyti parašą vikitekstu (be automatinių nuorodų)",
-       "tog-uselivepreview": "Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)",
+       "tog-uselivepreview": "Naudoti tiesioginę peržiūrą",
        "tog-forceeditsummary": "Klausti, kai palieku tuščią keitimo komentarą",
        "tog-watchlisthideown": "Slėpti mano keitimus stebimų sąraše",
        "tog-watchlisthidebots": "Slėpti robotų keitimus stebimų sąraše",
        "july": "liepos",
        "august": "rugpjūčio",
        "september": "Rugsėjo",
-       "october": "Spalio",
+       "october": "spalio",
        "november": "lapkričio",
        "december": "gruodžio",
        "january-gen": "Sausio",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
        "changeemail-throttled": "Jūs atlikote pernelyg daug bandymų prisijungti.\nLuktelėkite $1 prieš bandant vėl.",
+       "resettokens-tokens": "Žetonai:",
        "resettokens-token-label": "$1 (dabartinė reikšmė: $2)",
        "bold_sample": "Paryškintas tekstas",
        "bold_tip": "Paryškinti tekstą",
        "import-interwiki-history": "Kopijuoti visas istorijos versijas šiam puslapiui",
        "import-interwiki-templates": "Įtraukti visus šablonus",
        "import-interwiki-submit": "Importuoti",
-       "import-interwiki-namespace": "Paskirties vardų sritis:",
-       "import-interwiki-rootpage": "Paskirties namų puslapis (pasirinktinai):",
        "import-upload-filename": "Failo pavadinimas:",
        "import-comment": "Paaiškinimas:",
        "importtext": "Prašome eksportuoti iš projekto-šaltinio failo, naudojant [[Special:Export|eksportavimo pagalbininką.]]\nIšsaugokite jį savo kompiuteryje ir įkelkite jį čia.",
        "tooltip-ca-edit": "Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuką prieš išsaugodami.",
        "tooltip-ca-addsection": "Pradėti naują aptariamą temą",
        "tooltip-ca-viewsource": "Puslapis yra užrakintas. Galite pažiūrėti turinį.",
-       "tooltip-ca-history": "Ankstesni patikslinimai šiame puslapyje",
+       "tooltip-ca-history": "Ankstesnės puslapio versijos",
        "tooltip-ca-protect": "Užrakinti šį puslapį",
        "tooltip-ca-unprotect": "Keisti šio puslapio apsaugą",
        "tooltip-ca-delete": "Ištrinti šį puslapį",
        "version-entrypoints": "Įėjimo taško URL",
        "version-entrypoints-header-entrypoint": "Įėjimo taškas",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Biblioteka",
+       "version-libraries-version": "Versija",
        "redirect": "Nukreipkite iš failo, naudotojo arba pakeiskite ID",
        "redirect-legend": "Nukreipti į failą ar puslapį",
        "redirect-submit": "Eiti",
index cafbea4..7a45ce7 100644 (file)
        "thu": "Ce",
        "fri": "Pk",
        "sat": "Se",
-       "january": "Janvāris",
-       "february": "Februāris",
-       "march": "Marts",
-       "april": "Aprīlis",
-       "may_long": "Maijs",
-       "june": "Jūnijs",
-       "july": "Jūlijs",
-       "august": "Augusts",
-       "september": "Septembris",
-       "october": "Oktobris",
-       "november": "Novembris",
-       "december": "Decembris",
+       "january": "janvārī,",
+       "february": "februārī,",
+       "march": "martā,",
+       "april": "aprīlī,",
+       "may_long": "maijā,",
+       "june": "jūnijā,",
+       "july": "jūlijā,",
+       "august": "augustā,",
+       "september": "septembrī,",
+       "october": "oktobrī,",
+       "november": "novembrī,",
+       "december": "decembrī,",
        "january-gen": "Janvāra",
        "february-gen": "Februāra",
        "march-gen": "Marta",
        "import-interwiki-history": "Nokopēt visas šīs lapas hronoloģijā atrodamās versijas",
        "import-interwiki-templates": "Iekļaut visas veidnes",
        "import-interwiki-submit": "Importēt",
-       "import-interwiki-namespace": "Mērķa vārdtelpa:",
        "import-upload-filename": "Faila nosaukums:",
        "import-comment": "Komentārs:",
        "importstart": "Importē lapas...",
index 8f39d3d..0072654 100644 (file)
        "revdelete-submit": "Hampiharina amin'ny versiona nofidiana {{PLURAL:$1}}",
        "revdelete-success": "'''Voaova soa aman-tsara ny fahitana ny versiona.'''",
        "revdelete-failure": "'''Ny fisehon'ity versiona ity dia tsy afaka natao update'''\n$1",
-       "logdelete-success": "<strong>Voaova soa aman-tsara ny fisehon'ny laogy.</strong>",
-       "logdelete-failure": "<strong>Tsy afaka novaina ny fisehon'ny laogy</strong>\n$1",
+       "logdelete-success": "Voaova soa aman-tsara ny fisehon'ny laogy.",
+       "logdelete-failure": "Tsy afaka novaina ny fisehon'ny laogy\n$1",
        "revdel-restore": "Ovay ny fahitàna",
        "pagehist": "Tantaran'ilay pejy",
        "deletedhist": "Tantara voafafa",
        "import-interwiki-history": "Handika ny santiônan'ny tantaran'ity pejy ity",
        "import-interwiki-templates": "Ataovy ao ny endrika rehetra",
        "import-interwiki-submit": "Hampiditra",
-       "import-interwiki-namespace": "Anaran-tsehatra tanjona :",
-       "import-interwiki-rootpage": "Foto-pejy tanjona (azo tsy fenoina):",
        "import-upload-filename": "Anaran-drakitra :",
        "import-comment": "Resaka :",
        "importstart": "Am-pampidirana ny pejy…",
index a188041..933cb0c 100644 (file)
        "history-feed-description": "Историја на измените на оваа страница на викито",
        "history-feed-item-nocomment": "$1 на $2",
        "history-feed-empty": "Бараната страница не постои.\nМоже била избришана од викито или преименувана.\nОбидете се да [[Special:Search|пребарате низ викито]] за релевантни нови страници.",
+       "history-edit-tags": "Измени ознаки да одредени преработки",
        "rev-deleted-comment": "(избришан опис на промени)",
        "rev-deleted-user": "(избришано корисничко име)",
        "rev-deleted-event": "(избришани податоци од дневникот)",
        "rev-showdeleted": "прикажи",
        "revisiondelete": "Избриши/врати преработки",
        "revdelete-nooldid-title": "Бараната измена не постои",
-       "revdelete-nooldid-text": "Не сте посочиле измена (измени) за да се изврши оваа функција или посочената измена не постои или се обидувате да ја скриете моменталната измена.",
+       "revdelete-nooldid-text": "Немате укажано ниедна целна преработка врз која треба да се изврши оваа функикја, сте укажале преработка која не постои, или пак се обидувате да ја скриете тековната преработка.",
        "revdelete-no-file": "Наведената податотека не постои.",
        "revdelete-show-file-confirm": "Дали сакате да ја погледнете избришаната преработка на податотеката „<nowiki>$1</nowiki>“ од $2 во $3?",
        "revdelete-show-file-submit": "Да",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
        "right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
        "right-managechangetags": "Создавање3 или бришење на [[Special:Tags|ознаки]] од базата",
+       "right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
+       "right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
        "rightslog": "Дневник на корисничките права",
        "action-editmyprivateinfo": "уредување на вашите лични податоци",
        "action-editcontentmodel": "уредување на содржинскиот модел на страница",
        "action-managechangetags": "создавање или бришење на ознаки од базата",
+       "action-applychangetags": "ставање на ознаки заедно со напревените промени",
+       "action-changetags": "додавање и отстранување на произволни ознаки во поединечни преработки и дневнички записи",
        "nchanges": "$1 {{PLURAL:$1|промена|промени}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|од последната посаета}}",
        "enhancedrc-history": "историја",
        "recentchanges-summary": "На оваа страница ги следите скорешните промени на викито.",
        "recentchanges-noresult": "Нема промени од дадениот период што одговараат на бараното.",
        "recentchanges-feed-description": "Следење на најскорешните промени на викито во овие емитувања.",
-       "recentchanges-label-newpage": "Ð\9eва Ñ\83Ñ\80едÑ\83ваÑ\9aе Ñ\81оздаде Ð½ова страница",
+       "recentchanges-label-newpage": "Ð\9dова страница",
        "recentchanges-label-minor": "Ова е ситна промена",
        "recentchanges-label-bot": "Ова уредување е направено од бот",
        "recentchanges-label-unpatrolled": "Ова уредување сè уште не е испатролирано",
        "listfiles-delete": "избриши",
        "listfiles-summary": "Оваа службена страница ги прикажува сите подигнати податотеки.",
        "listfiles_search_for": "Побарај име на податотека:",
+       "listfiles-userdoesnotexist": "Корисничката сметка „$1“ не е регистрирана.",
        "imgfile": "податотека",
        "listfiles": "Список на податотеки",
        "listfiles_thumb": "Минијатура",
        "logempty": "Дневникот нема записи што одговараат на ова.",
        "log-title-wildcard": "Пребарај наслови кои почнуваат со овој текст",
        "showhideselectedlogentries": "Прикажи/скриј одбрани записи",
+       "log-edit-tags": "Измени ознаки на одредени дневнички записи",
        "allpages": "Сите страници",
        "nextpage": "Следна страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "linksearch-error": "Џокер-знаците може да се користат само на почетокот во името на домаќинот.",
        "listusersfrom": "Прикажи корисници почнувајќи од:",
        "listusers-submit": "Прикажи",
-       "listusers-noresult": "Ð\9dе Ðµ Ð¿Ñ\80онаÑ\98ден корисник.",
+       "listusers-noresult": "Ð\9dе Ð¿Ñ\80онаÑ\98дов Ð½Ð¸Ðµден корисник.",
        "listusers-blocked": "(блокиран)",
        "activeusers": "Список на активни корисници",
        "activeusers-intro": "Ова е список на корисници кои биле на некој начин активни во последните {{PLURAL:$1|еден ден|$1 дена}}.",
        "activeusers-from": "Прикажи корисници почнувајќи од:",
        "activeusers-hidebots": "Скриј ботови",
        "activeusers-hidesysops": "Скриј администратори",
-       "activeusers-noresult": "Нема пронајдено корисници.",
+       "activeusers-noresult": "Не пронајдов ниеден корисник.",
        "listgrouprights": "Права на кориснички групи",
        "listgrouprights-summary": "Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.\nМожно е да има [[{{MediaWiki:Listgrouprights-helppage}}|дополнителни информации]] за некои права.",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Доделено право</span>\n* <span class=\"listgrouprights-revoked\">Одземено право</span>",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
        "emailsenttext": "Писмото е испратено.",
-       "emailuserfooter": "Оваа е-порака беше пратена од $1 до $2 со помош на функцијата Е-пошта на {{SITENAME}}.",
+       "emailuserfooter": "$1 го испрати писмово на $2 со помош на функцијата „{{int:emailpage}}“ на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "watchlist": "набљудувања",
        "import-interwiki-history": "Копирај ги сите постари верзии за оваа страница",
        "import-interwiki-templates": "Вклучи ги сите шаблони",
        "import-interwiki-submit": "Увези",
-       "import-interwiki-namespace": "Целен именски простор:",
-       "import-interwiki-rootpage": "Целна основна страница (незадолжително):",
+       "import-mapping-default": "Увези во стандардните места",
+       "import-mapping-namespace": "Увези во именскиот простор:",
+       "import-mapping-subpage": "Увези како потстраници на следнава страница:",
        "import-upload-filename": "Податотека:",
        "import-comment": "Коментар:",
        "importtext": "Извезете ја податотеката од изворното вики користејќи ја [[Special:Export|алатката за извоз]].\nЗачувајте ја на вашиот сметач и подигнете ја овде.",
        "pageinfo-protect-cascading-yes": "Да",
        "pageinfo-protect-cascading-from": "Страници со каскадна заштита од",
        "pageinfo-category-info": "Информации за категоријата",
+       "pageinfo-category-total": "Вкупен број на членови",
        "pageinfo-category-pages": "Број на страници",
        "pageinfo-category-subcats": "Број на поткатегории",
        "pageinfo-category-files": "Број на податотеки",
        "patrol-log-page": "Дневник на патролирања",
        "patrol-log-header": "Ова е дневник на патролирани преработки.",
        "log-show-hide-patrol": "$1 дневник на патролирање",
+       "log-show-hide-tag": "$1 дневник на ознаки",
        "deletedrevision": "Избришана стара преработка $1.",
        "filedeleteerror-short": "Грешка при бришење на податотека: $1",
        "filedeleteerror-long": "Се појавија грешки при бришењето на податотеката:\n\n$1",
        "size-exabytes": "$1 ЕБ",
        "size-zetabytes": "$1 ЗБ",
        "size-yottabytes": "$1 ЈБ",
+       "size-pixel": "$1 П",
+       "size-kilopixel": "$1 КП",
+       "size-megapixel": "$1 МП",
+       "size-gigapixel": "$1 ГП",
+       "size-terapixel": "$1 ТП",
+       "size-petapixel": "$1 ПП",
+       "size-exapixel": "$1 ЕП",
+       "size-zetapixel": "$1 ЗП",
+       "size-yottapixel": "$1 ЈП",
        "bitrate-bits": "$1 б/с",
        "bitrate-kilobits": "$1 кб/с",
        "bitrate-megabits": "$1 Мб/с",
        "tags-deactivate-reason": "Причина:",
        "tags-deactivate-not-allowed": "Не можам да ја деактивирам ознаката „$1“.",
        "tags-deactivate-submit": "Декативирај",
+       "tags-apply-no-permission": "Немате дозвола да ставате ознаки за промени заедно со измените што ги правите.",
+       "tags-apply-not-allowed-one": "Не е дозволено ознаката „$1“ да се става рачно.",
+       "tags-apply-not-allowed-multi": "Не е дозволено {{PLURAL:$2|следнава ознака да се става рачно|следниве ознаки да се ставаат рачно}}: $1",
+       "tags-update-no-permission": "Немате дозвола да додавате или отстранувате ознаки за промена од поединечни преработки или дневнички записи.",
+       "tags-update-add-not-allowed-one": "Не е дозволено ознаката „$1“ да се додава рачно.",
+       "tags-update-add-not-allowed-multi": "Не е дозволено {{PLURAL:$2|следнава ознака да се додава рачно|следниве ознаки да се додаваат рачно}}: $1",
+       "tags-update-remove-not-allowed-one": "Не е дозволено да се отстранува ознаката „$1“.",
+       "tags-update-remove-not-allowed-multi": "Не е дозволено {{PLURAL:$2|следнава ознака да се отстранува рачно|следниве ознаки да се отстрануваат рачно}}: $1",
+       "tags-edit-title": "Менување на ознаки",
+       "tags-edit-manage-link": "Раководство со ознаки",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Одбрана преработка|Одбрани преработки}} на [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Одбран настан од дневник|Одбрани настани од дневник}}:",
+       "tags-edit-revision-legend": "Додајте или отстранете ознаки од {{PLURAL:$1|преработкава|сите $1 преработки}}",
+       "tags-edit-logentry-legend": "Додајте или отстранете ознаки од {{PLURAL:$1|овој дневнички запис|сите $1 дневнички записи}}",
+       "tags-edit-existing-tags": "Постоечки ознаки",
+       "tags-edit-existing-tags-none": "''нема''",
+       "tags-edit-new-tags": "Нови ознаки:",
+       "tags-edit-add": "Додај ги следниве ознаки:",
+       "tags-edit-remove": "Отстрани ги следниве ознаки:",
+       "tags-edit-remove-all-tags": "(отстрани ги сите ознаки)",
+       "tags-edit-chosen-placeholder": "Одберете некои ознаки",
+       "tags-edit-chosen-no-results": "Не пронајдов одговарачки ознаки",
+       "tags-edit-reason": "Причина:",
+       "tags-edit-revision-submit": "Примени измени врз {{PLURAL:$1|преработкава|$1 преработки}}",
+       "tags-edit-logentry-submit": "Примени измени врз {{PLURAL:$1|овој дневнички запис|$1 дневнички записи}}",
+       "tags-edit-success": "Измените се успешно применети.",
+       "tags-edit-failure": "Не можев да ги применам измените:\n$1",
+       "tags-edit-nooldid-title": "Неважечка целна преработка",
+       "tags-edit-nooldid-text": "Немате укажано целна преработка врз која би се примениле измените, или пак укажаната преработка не постои.",
+       "tags-edit-none-selected": "Одберете барем една ознака за додавање или отстранување.",
        "comparepages": "Спореди страници",
        "compare-page1": "Страница 1",
        "compare-page2": "Страница 2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|ја избриша}} ознаката „$4“ (отстранета од {{PLURAL:$5|една преработка или дневнички запис|$5 преработки и/или дневнички записи}})",
        "logentry-managetags-activate": "$1 {{GENDER:$2|ја активираше}} ознаката „$4“ за употреба од корисници и ботови",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|ја деактивираше}} ознаката „$4“ за употреба од корисници и ботови",
+       "log-name-tag": "Дневник на ознаки",
+       "log-description-tag": "На страницава се прикажани додавањата и отстранувањата на [[Special:Tags|ознаки]] од поединечни преработки или дневнички записи. Тука не се заведуваат означувањата направени како дел од уредување, бришење и слични дејства.",
+       "logentry-tag-update-add-revision": "$1 {{PLURAL:$7|ја|ги}} {{GENDER:$2|додаде}} {{PLURAL:$7|ознаката|ознаките}} $6 во преработката $4 на страницата $3",
+       "logentry-tag-update-add-logentry": "$1 {{PLURAL:$7|ја|ги}} {{GENDER:$2|додаде}} {{PLURAL:$7|ознаката|ознаките}} $6 во дневничкиот запис $5 на страницата $3",
+       "logentry-tag-update-remove-revision": "$1 {{PLURAL:$9|ја|ги}} {{GENDER:$2|отстрани}} {{PLURAL:$9|ознаката|ознаките}} $8 од преработката $4 на страницата $3",
+       "logentry-tag-update-remove-logentry": "$1 {{PLURAL:$9|ја|ги}} {{GENDER:$2|отстрани}} {{PLURAL:$9|ознаката|ознаките}} $8 од дневничкиот запис $5 на страницата $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|поднови}} ознаки во преработката $4 на страницата $3 ({{PLURAL:$7|додадена|додадени}} $6; {{PLURAL:$9|отстранета|отстранети}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|поднови}} ознаки во дневничкиот запис $5 на страницата $3 ({{PLURAL:$7|додадена|додадени}} $6; {{PLURAL:$9|отстранета|отстранети}} $8)",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис на уредување",
        "feedback-adding": "Го додавам искажаното мислење во страницата...",
        "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
+       "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
        "feedback-message": "Порака:",
        "feedback-subject": "Наслов:",
        "feedback-submit": "Поднеси",
        "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: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code>skins/</code> од него.\n:* Преземање на tarball-и за рува од [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n* Клонирајќи едно од складиштата <code>mediawiki/skins/*</code> преку git во папката <code dir=\"ltr\">skins/</code> на вашата воспоставка на МедијаВики.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики.\n\n; Ако штотуку го имате надградено МедијаВики:\n: МедијаВики 1.24 и поновите верзии повеќе не ги вклучуваат воспоставените рува автоматски (погл. [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": "За жал, основното руво на вашето вики оопределено во <code dir=\"ltr\">$wgDefaultSkin</code> како <code>$1</code> не е достапно.\n\nВашата воспоставка {{PLURAL:$4|го опфаќа следново руво|ги опфаќа следниве рува}}. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.\n\n$2\n\n; Ако штотуку го имате воспоставено МедијаВики:\n: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code>skins/</code> од него.\n:* Преземање на tarball-и за рува од [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n* Клонирајќи едно од складиштата <code>mediawiki/skins/*</code> преку git во папката <code dir=\"ltr\">skins/</code> на вашата воспоставка на МедијаВики.\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики.\n\n; Ако штотуку го имате надградено МедијаВики:\n: МедијаВики 1.24 и поновите верзии повеќе не ги вклучуваат воспоставените рува автоматски (погл. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Прирачник: Самооткривање на рува]). Можете да {{PLURAL:$5|го прекопирате следниов ред|ги прекопирате следниве редови}} во <code>LocalSettings.php</code> за да ги вклучите {{PLURAL:$5|тековно воспоставеното руво|сите тековно воспоставени рува}}:\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: Веројатно сте го воспоставиле од git, или пак непосредно од изворниот код на некој друг начин. Ова е очекувано. МедијаВики 1.24 и поновите верзии немаат рува во главното складиште. Пробајте да воспоставите некои рува од [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's именикот на рува] вака:\n:* Со преземање на [https://www.mediawiki.org/wiki/Download tarball-воспоставувачот], кој самиот содржи неколку рува и додатоци. Можете да ја прекопирате папката <code dir=\"ltr\">skins/</code> од него.\n:* Преземање на tarball-и за поединечни рува од [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n: Ова не би требало да прави пречки на вашето git-складиште ако сте програмер на МедијаВики. Погледајте [https://www.mediawiki.org/wiki/Manual:Skin_configuration Прирачник: Поставување на рува] за да дознаете како да ги вклучите и како да го изберете основното.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (вклучено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''исклучено''')",
index 1c560f3..9c892db 100644 (file)
        "wrongpassword": "രഹസ്യവാക്ക് തെറ്റാണ്, വീണ്ടും ശ്രമിക്കുക.",
        "wrongpasswordempty": "രഹസ്യവാക്ക് നൽകിയിരുന്നില്ല. വീണ്ടും ശ്രമിക്കുക.",
        "passwordtooshort": "രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.",
+       "passwordtoolong": "രഹസ്യവാക്കിൽ പരമാവധി {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} മാത്രമേ പാടുള്ളു.",
        "password-name-match": "താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.",
        "password-login-forbidden": "ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.",
        "mailmypassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "missingcommentheader": "'''ഓർമ്മക്കുറിപ്പ്:''' ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
        "summary-preview": "ചുരുക്കരൂപം എങ്ങനെയുണ്ടെന്നു കാണുക:",
        "subject-preview": "വിഷയം/തലക്കെട്ട് എങ്ങനെയുണ്ടെന്ന് കാണുക:",
+       "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
        "blockedtext": "'''താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു'''\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, 'ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ' എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "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ദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
        "history-feed-description": "വിക്കിയിൽ ഈ താളിന്റെ നാൾവഴി",
        "history-feed-item-nocomment": "$2 സമയത്ത് $1",
        "history-feed-empty": "താങ്കൾ തിരഞ്ഞ താൾ നിലവിലില്ല.\nപ്രസ്തുത താൾ വിക്കിയിൽ നിന്നു ഒഴിവാക്കിയിരിക്കാനോ പുനർനാമകരണം ചെയ്തിരിക്കാനോ സാദ്ധ്യത ഉണ്ട്.\nബന്ധപ്പെട്ട പുതിയ താളുകൾ കണ്ടെത്താൻ [[Special:Search|വിക്കിയിലെ തിരച്ചിൽ]] എന്ന താൾ ഉപയോഗിക്കുക.",
+       "history-edit-tags": "തിരഞ്ഞെടുത്ത നാൾപ്പതിപ്പുകളിലെ ടാഗുകൾ തിരുത്തുക",
        "rev-deleted-comment": "(തിരുത്തലിന്റെ ചുരുക്കം ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-deleted-user": "(ഉപയോക്തൃനാമം ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-deleted-event": "(രേഖാ വിവരങ്ങൾ ഒഴിവാക്കിയിരിക്കുന്നു)",
        "rev-showdeleted": "പ്രദർശിപ്പിക്കുക",
        "revisiondelete": "പതിപ്പുകൾ ഒഴിവാക്കുകയോ/പുനഃസ്ഥാപിക്കുകയോ ചെയ്യുക",
        "revdelete-nooldid-title": "അസാധുവായ ലക്ഷ്യ നാൾപ്പതിപ്പ്",
-       "revdelete-nooldid-text": "à´\88 à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതി à´\9aàµ\86à´¯àµ\8dà´¯àµ\81വാനാവശàµ\8dയമായ à´\89à´¦àµ\8dദിഷàµ\8dà´\9f à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d/പതിപàµ\8dà´ªàµ\81à´\95ൾ à´¤à´¾à´\99àµ\8dà´\95ൾ à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´¤àµ\8dതിà´\9fàµ\8dà´\9fà´¿à´²àµ\8dà´² à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\89à´¦àµ\8dദിഷàµ\8dà´\9f à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dà´² à´\85à´¤àµ\81മലàµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¤à´¾à´\99àµ\8dà´\95ൾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´®à´±à´¯àµ\8dà´\95àµ\8dà´\95àµ\81വാൻ à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.",
+       "revdelete-nooldid-text": "à´\88 à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതി à´\9aàµ\86à´¯àµ\8dà´¯àµ\81വാനാവശàµ\8dയമായ à´²à´\95àµ\8dà´·àµ\8dà´¯ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´¤à´¾à´\99àµ\8dà´\95ൾ à´¤à´¿à´°à´\9eàµ\8dà´\9eàµ\86à´\9fàµ\81à´¤àµ\8dതിà´\9fàµ\8dà´\9fà´¿à´²àµ\8dà´² à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\89à´¦àµ\8dദിഷàµ\8dà´\9f à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´¨à´¿à´²à´µà´¿à´²à´¿à´²àµ\8dà´² à´\85à´¤àµ\81മലàµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¤à´¾à´\99àµ\8dà´\95ൾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´®à´±à´¯àµ\8dà´\95àµ\8dà´\95àµ\81വാൻ à´¶àµ\8dരമിà´\95àµ\8dà´\95àµ\81à´\95യാണàµ\8d.",
        "revdelete-no-file": "നിർദ്ദേശിച്ച പ്രമാണം നിലവിലില്ല.",
        "revdelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" പ്രമാണത്തിന്റെ $2 തീയതി $3 -യ്ക്കു നിലനിന്നിരുന്ന മായ്ക്കപ്പെട്ട പതിപ്പു  കാണണം എന്നു താങ്കൾക്ക് ഉറപ്പാണോ?",
        "revdelete-show-file-submit": "അതെ",
        "notextmatches": "താളുകളുടെ ഉള്ളടക്കത്തിൽ താങ്കൾ തിരഞ്ഞ വാക്കുമായി യോജിക്കുന്ന ഫലങ്ങൾ ഒന്നും തന്നെയില്ല",
        "prevn": "മുമ്പത്തെ {{PLURAL:$1|$1}}",
        "nextn": "അടുത്ത {{PLURAL:$1|$1}}",
+       "prev-page": "മുൻപത്തെ താൾ",
+       "next-page": "അടുത്ത താൾ",
        "prevn-title": "മുൻപത്തെ {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}",
        "nextn-title": "അടുത്ത {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}",
        "shown-title": "{{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} വീതം താളിൽ കാണിക്കുക",
        "right-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
        "right-passwordreset": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കാനുള്ള ഇമെയിലുകൾ കാണുക",
        "right-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള [[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
+       "right-applychangetags": "മാറ്റങ്ങളോടൊപ്പം [[Special:Tags|ടാഗുകളും]] ബാധകമാക്കുക",
+       "right-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക [[Special:Tags|ടാഗുകൾ]] ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "newuserlogpage": "ഉപയോക്തൃ സൃഷ്ടിയുടെ രേഖ",
        "newuserlogpagetext": "പുതിയതായി അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ പട്ടിക താഴെ കാണാം.",
        "rightslog": "ഉപയോക്തൃ അവകാശ രേഖ",
        "action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
        "action-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
        "action-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള ടാഗുകൾ സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
+       "action-applychangetags": "താങ്കളുടെ മാറ്റങ്ങൾക്കൊപ്പം ടാഗുകൾ ബാധകമാക്കുക",
+       "action-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക ടാഗുകൾ ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
        "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
        "enhancedrc-history": "നാൾവഴി",
        "emailccsubject": "$1 എന്ന ഉപയോക്താവിനയച്ച സന്ദേശത്തിന്റെ പകർപ്പ്: $2",
        "emailsent": "ഇമെയിൽ അയച്ചിരിക്കുന്നു",
        "emailsenttext": "താങ്കളുടെ ഇമെയിൽ അയച്ചു കഴിഞ്ഞിരിക്കുന്നു.",
-       "emailuserfooter": "ഈ ഇമെയിൽ {{SITENAME}} സംരംഭത്തിലെ \"ഉപയോക്താവിന്‌ ഇമെയിൽ അയയ്ക്കുക\" എന്ന സൌകര്യം ഉപയോഗിച്ച് $1 എന്ന ഉപയോക്താവ് $2 എന്ന ഉപയോക്താവിന് അയച്ചതാണ്.",
+       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailpage}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് $2 എന്ന ഉപയോക്താവിന് അയച്ചതാണ്.",
        "usermessage-summary": "വ്യവസ്ഥാസന്ദേശം ഉപേക്ഷിക്കുക.",
        "usermessage-editor": "വ്യവസ്ഥാസന്ദേശകൻ",
        "watchlist": "ശ്രദ്ധിക്കുന്നവ",
        "import-interwiki-history": "ഈ താളിന്റെ എല്ലാ പൂർവ്വചരിത്രവും പകർത്തുക",
        "import-interwiki-templates": "എല്ലാ ഫലകങ്ങളും ഉൾപ്പെടുത്തുക",
        "import-interwiki-submit": "ഇറക്കുമതി",
-       "import-interwiki-namespace": "ഉദ്ദിഷ്ട നാമമേഖല:",
-       "import-interwiki-rootpage": "ലക്ഷ്യമിട്ട മൂലതാൾ (ഐച്ഛികം):",
        "import-upload-filename": "പ്രമാണത്തിന്റെ പേര്‌",
        "import-comment": "കുറിപ്പ്:",
        "importtext": "ദയവായി സ്രോതസ്സ് വിക്കിയിൽ നിന്ന് [[Special:Export|കയറ്റുമതി ഉപകരണം]] ഉപയോഗിച്ച് പ്രമാണം കയറ്റുമതി ചെയ്യുക.\nഅത് താങ്കളുടെ കമ്പ്യൂട്ടറിൽ ശേഖരിച്ച് ഇവിടെ അപ്‌‌ലോഡ് ചെയ്യുക.",
        "pageinfo-protect-cascading-yes": "അതെ",
        "pageinfo-protect-cascading-from": "സംരക്ഷണങ്ങൾ നിർഝരിതപ്പെടുത്തുന്നത്",
        "pageinfo-category-info": "വർഗ്ഗത്തിന്റെ വിവരങ്ങൾ",
+       "pageinfo-category-total": "ആകെ അംഗങ്ങളുടെ എണ്ണം",
        "pageinfo-category-pages": "താളുകളുടെ എണ്ണം",
        "pageinfo-category-subcats": "ഉപവർഗ്ഗങ്ങളുടെ എണ്ണം",
        "pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
        "patrol-log-page": "റോന്തുചുറ്റൽ പ്രവർത്തനരേഖ",
        "patrol-log-header": "റോന്തുചുറ്റപ്പെട്ട നാൾപ്പതിപ്പുകളുടെ രേഖയാണിത്",
        "log-show-hide-patrol": "റോന്തുചുറ്റൽ രേഖ $1",
+       "log-show-hide-tag": "ടാഗ് രേഖ $1",
        "deletedrevision": "$1 എന്ന പഴയ പതിപ്പ് മായ്ച്ചിരിക്കുന്നു",
        "filedeleteerror-short": "പ്രമാണം നീക്കം ചെയ്യുമ്പോൾ പ്രശ്നം: $1",
        "filedeleteerror-long": "പ്രമാണം നീക്കം ചെയ്യുമ്പോൾ ചില പ്രശ്നങ്ങൾ സംഭവിച്ചു:\n\n$1",
        "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 നാൾപ്പതിപ്പ് അല്ലെങ്കിൽ രേഖയിലെ ഉൾപ്പെടുത്തലിൽ|എല്ലാ $2 നാൾപ്പതിപ്പുകളിൽ ഒപ്പം/അല്ലെങ്കിൽ രേഖകളിലെ ഉൾപ്പെടുത്തലുക്കളിൽ}} നിന്ന് ഇത് നീക്കംചെയ്യപ്പെടുന്നതാണ്.",
+       "tags-delete-explanation-warning": "ഈ പ്രവൃത്തി ഡേറ്റാബേസ് കാര്യനിർവ്വഹകർക്ക് കൂടി <strong>പിൻവലിക്കാനാവാത്തതും</strong> <strong>പിന്നീട് തിരുത്താനാവാത്തതും</strong> ആണ്. താങ്കൾക്ക് മായ്ക്കേണ്ട ടാഗ് ഇതാണെന്ന് ഉറപ്പ് വരുത്തുക.",
        "tags-delete-reason": "കാരണം:",
+       "tags-delete-submit": "പിൻവലിക്കാനാവാത്തവിധം ഈ ടാഗ് മായ്ക്കുക",
+       "tags-delete-not-found": "\"$1\" എന്ന ടാഗ് നിലവിലില്ല.",
+       "tags-activate-title": "ടാഗ് സജ്ജമാക്കുക",
        "tags-activate-reason": "കാരണം:",
+       "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": "പ്രവർത്തനരഹിതമാക്കുക",
+       "tags-edit-title": "ടാഗുകൾ തിരുത്തുക",
+       "tags-edit-manage-link": "ടാഗുകൾ കൈകാര്യം ചെയ്യുക",
+       "tags-edit-existing-tags": "നിലവിലുള്ള ടാഗുകൾ:",
+       "tags-edit-existing-tags-none": "''ഒന്നുമില്ല''",
+       "tags-edit-new-tags": "പുതിയ ടാഗുകൾ:",
+       "tags-edit-add": "ഈ ടാഗുകൾ ചേർക്കുക:",
+       "tags-edit-remove": "ഈ ടാഗുകൾ നീക്കംചെയ്യുക:",
+       "tags-edit-remove-all-tags": "(എല്ലാ ടാഗുകളും നീക്കംചെയ്യുക)",
+       "tags-edit-chosen-placeholder": "ടാഗുകൾ തിരഞ്ഞെടുക്കുക",
+       "tags-edit-reason": "കാരണം:",
        "comparepages": "താളുകൾ താരതമ്യപ്പെടുത്തുക",
        "compare-page1": "താൾ 1",
        "compare-page2": "താൾ 2",
index b59fb15..4092f94 100644 (file)
@@ -4,7 +4,8 @@
                        "Hiong3-eng5",
                        "Ianbu",
                        "Kaihsu",
-                       "아라"
+                       "아라",
+                       "唐吉訶德的侍從"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "viewsource": "Khoàⁿ goân-sú lōe-iông",
-       "viewsource-title": "看 $1的原本編碼。",
+       "viewsource-title": "Khoàⁿ \"$1\"--ê goân-sú lōe-iông",
        "actionthrottled": "Tōng-chok hông tóng leh.",
        "actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
        "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
        "dellogpagetext": "Í-hā lia̍t chhut chòe-kīn thâi tiāu ê hāng-bo̍k.",
        "deletecomment": "Lí-iû:",
        "rollback": "Kā siu-kái ká tńg khì",
-       "rollback_short": "Ká tńg khì",
        "rollbacklink": "ká tńg khì",
        "rollbackfailed": "Ká bē tńg khì",
        "cantrollback": "Bô-hoat-tō· kā siu-kái ká-tńg--khì; téng ūi kòng-hiàn-chiá sī chit ia̍h î-it ê chok-chiá.",
index e7922b4..291d243 100644 (file)
        "history-feed-description": "Cronologgia d' 'a paggena ncopp'a stu sito",
        "history-feed-item-nocomment": "$1 'o $2",
        "history-feed-empty": "'A paggena addimannata nun esiste.\nPuò darsi ca è stata scancellata d' 'a wiki, o s'è cagnato 'o nomme.\nProva a vedé [[Special:Search|dint' 'a wiki]] si ce stanno nnove paggene.",
+       "history-edit-tags": "Cagna tag 'e verziune scigliute",
        "rev-deleted-comment": "(Oggetto d' 'o cagnamiento luvato)",
        "rev-deleted-user": "(nomme utente luvato)",
        "rev-deleted-event": "(dettaglie d' 'o log luvate)",
        "rev-showdeleted": "faje vedé",
        "revisiondelete": "Scancella o ripiglia verziune",
        "revdelete-nooldid-title": "Verziona nun specificata",
-       "revdelete-nooldid-text": "Nun è stata specificata nisciuna verziona d' 'a paggena p' 'a secutà sta funzione, 'a verziona specificata nun esiste o pure staje truvann' 'annascónnere 'a verziona 'e mò.",
+       "revdelete-nooldid-text": "Nun avite specificato nu target 'e verziona addò s'avess'apprecà sta funzione, o 'a verziona specificata nun esiste o pure jate truvanno 'annascónnere 'a verziona 'e mò.",
        "revdelete-no-file": "'O file specificato nun esiste.",
        "revdelete-show-file-confirm": "Sì sicuro/a ca vulite veré 'a verziona scancellata d' 'o file \"<nowiki>$1</nowiki>\" d' 'o $2 a 'e $3?",
        "revdelete-show-file-submit": "Sì",
        "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",
+       "right-applychangetags": "Appreca [[Special:Tags|tag]] pe' tramente ca se fanno 'e cagnamiente 'e coccheruno",
+       "right-changetags": "Azzecca o lèva a caso 'e [[Special:Tags|tag]] dint'a verziune nnividuale e riggistre 'e log",
        "newuserlogpage": "Riggistro 'e nuove utente",
        "newuserlogpagetext": "Chest'è nu riggistro 'e criazione d'utenze.",
        "rightslog": "Deritte 'e ll'utente",
        "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",
+       "action-applychangetags": "appreca tag pe' tramente ca se fanno 'e cagnamiente vuoste",
+       "action-changetags": "azzecca o lèva tag a caso dint'a verziune nnividuale e riggistre 'e log",
        "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
        "enhancedrc-history": "cronologgia",
        "listfiles-delete": "scancèlla",
        "listfiles-summary": "Sta paggena speciale fà vedé tuttequante file carrecate.",
        "listfiles_search_for": "Ascìa 'e media pe' nomme:",
+       "listfiles-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
        "imgfile": "file",
        "listfiles": "Lista d' 'e file",
        "listfiles_thumb": "Miniature",
        "logempty": "Nun ce sta n'elemento dint' 'o riggistro azzeccato â ricerca.",
        "log-title-wildcard": "Ascìa titole c'accummencieno cu stu testo",
        "showhideselectedlogentries": "Cagna visibbelità d' 'e riggistre scigliute",
+       "log-edit-tags": "Cagna 'e tag d' 'e riggistre 'e log scigliute",
        "allpages": "Tutte 'e ppaggene",
        "nextpage": "Paggena appriesso ($1)",
        "prevpage": "Paggena apprima ($1)",
        "emailccsubject": "Copia d' 'a mmasciata tua 'a $1: $2",
        "emailsent": "Mmasciata e-mail mannata",
        "emailsenttext": "'A mmasciata d' 'a toja s'è mannata.",
-       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"Mmasciata e-mail a l'utente\" 'e {{SITENAME}}.",
+       "emailuserfooter": "Chista mmasciata e-mail è stata mannata 'a $1 a $2 p' 'a funziona \"{{int:emailpage}}\" 'e {{SITENAME}}.",
        "usermessage-summary": "Lassanno na mmasciata 'e sistema.",
        "usermessage-editor": "Mmasciatore d' 'o sistema",
        "watchlist": "Paggene cuntrullate",
        "import-interwiki-history": "Copia tutt' 'a storia d' 'e verziune 'e sta paggena",
        "import-interwiki-templates": "Include tutt' 'e template",
        "import-interwiki-submit": "Mpurta",
-       "import-interwiki-namespace": "Namespace 'e destinazione:",
-       "import-interwiki-rootpage": "Paggena princepale 'e destinazione (opzionale):",
+       "import-mapping-default": "Importa a pizze prescigliute",
+       "import-mapping-namespace": "Importa a nu namespace:",
+       "import-mapping-subpage": "Importa comme fossero subpaggene d' 'a paggena ccà:",
        "import-upload-filename": "Nomme d' 'o file",
        "import-comment": "Commento:",
        "importtext": "Pe' piacere spurtate 'o file d' 'a wiki surgente ausanno l'[[Special:Export|utilità 'e sportazione]].\nScarrecatevella dint' 'o computer d' 'o vuosto e carrecate n'ata vota ccà.",
        "pageinfo-protect-cascading-yes": "Sì",
        "pageinfo-protect-cascading-from": "'E pruteziune veneno 'n cascata 'a",
        "pageinfo-category-info": "Nfurmaziune ncopp' 'a categurìa",
+       "pageinfo-category-total": "Nummero sano 'e membre",
        "pageinfo-category-pages": "Nummero 'e paggene",
        "pageinfo-category-subcats": "Nummero 'e sottocategurìe",
        "pageinfo-category-files": "Nummero 'e file",
        "patrol-log-page": "Riggistro 'e cuntrolle",
        "patrol-log-header": "Chest'è nu riggistro ch' 'e verziune cuntrullate.",
        "log-show-hide-patrol": "$1 riggistro 'e cuntrolle",
+       "log-show-hide-tag": "$1 tag log",
        "deletedrevision": "Viecchia verziona scancellata $1",
        "filedeleteerror-short": "Errore pe' tramente ca se scancellava nu file: $1",
        "filedeleteerror-long": "N'errore s'è apprisentato pe' tramente ca se scancellava 'o file:\n\n$1",
        "tags-deactivate-reason": "Mutivo:",
        "tags-deactivate-not-allowed": "Nun se pò stutà 'o tag \"$1\".",
        "tags-deactivate-submit": "Stuta",
+       "tags-apply-no-permission": "Nun tenite premmesse pe' putè apprecà tag 'e cagnamiente pe' tramente ca facite cagnamiente.",
+       "tags-apply-not-allowed-one": "'O tag \"$1\" nun è premmesso a se ffà manualmente apprecà.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nun songo}} premmesse 'e s'apprecà manualmente: $1",
+       "tags-update-no-permission": "Nun tenite premmesse pe' putè azzeccà o luvà tag 'e cagnamiento 'a 'e verziune nnividuale o entrate 'o log.",
+       "tags-update-add-not-allowed-one": "'O tag \"$1\" nun è premmesso 'e s'azzeccà 'n manuale.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio nun è|'E tag ccà abbascio nu so'}} premmesse 'e s'azzeccà manualmente: $1",
+       "tags-update-remove-not-allowed-one": "'O tag \"$1\" nun è permesso d' 'o luvà.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|'O tag ccà abbascio|'E tag ccà abbascio}} nun so' premmesse 'e se luvà automatecamente: $1",
+       "tags-edit-title": "Cagna 'e tag",
+       "tags-edit-manage-link": "Gistisce 'e tag",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Verziona scigliuta|Verziune scigliute}} 'e [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Fatto scigliuto d' 'o riggistro|Fatte scigliute d' 'o riggistro}}:",
+       "tags-edit-revision-legend": "Azzecca o leva tags 'a {{PLURAL:$1|sta verziona|'e tutte sti $1 verziune}}",
+       "tags-edit-logentry-legend": "Azzecca o leva tags 'a {{PLURAL:$1|sta verziona|'e tutte sti $1 verziune}}",
+       "tags-edit-existing-tags": "Tag 'e mo:",
+       "tags-edit-existing-tags-none": "''Nisciuno''",
+       "tags-edit-new-tags": "Nnove tag:",
+       "tags-edit-add": "Azzecca sti tag:",
+       "tags-edit-remove": "Lèva sti tag:",
+       "tags-edit-remove-all-tags": "(leva tutte 'e tag)",
+       "tags-edit-chosen-placeholder": "Sceglie cocche tag",
+       "tags-edit-chosen-no-results": "Nun se trovano tag azzeccate",
+       "tags-edit-reason": "Mutivo:",
+       "tags-edit-revision-submit": "Appreca cagnamiente a {{PLURAL:$1|sta verziona|$1 verziune}}",
+       "tags-edit-logentry-submit": "Appreca cagnamiente a {{PLURAL:$1|sta entrata 'e riggistro|sti $1 entrate 'e riggistro}}",
+       "tags-edit-success": "'E cagnamiente se so' apprecate.",
+       "tags-edit-failure": "'E cagnamiente nun se putevano apprecà:\n$1",
+       "tags-edit-nooldid-title": "Verziona nun specificata",
+       "tags-edit-nooldid-text": "Nun avite specificato nu target 'e verziona addò s'avess'apprecà sta funzione, o 'a verziona specificata nun esiste.",
+       "tags-edit-none-selected": "Pe' piacere sciglite minimo nu tag pe' luvà o azzeccà.",
        "comparepages": "Miette a cunfronto 'e paggene",
        "compare-page1": "Paggena 1",
        "compare-page2": "Paggena 2",
        "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",
+       "log-name-tag": "Riggistro 'e tag",
+       "log-description-tag": "Sta paggena mmustasse quanno l'utente hanno azzeccato o luvato [[Special:Tags|'e tag]] 'a 'e verziune nnividuale o pure 'entrate 'e riggistro. 'O log o riggistro nun alencasse 'aziune 'e tag quanno succereno, fosse n'edit, scancellazione, o n'aziuna 'e chiste.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|azzeccaje}} {{PLURAL:$7|'o tag|'e tag}} $6 'a verziune $4 d' 'a paggena $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|azzeccaje}} {{PLURAL:$7|'o tag|'e tag}} $6 a l'entrata 'e riggistro $5 d' 'a paggena $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|luvaje}} {{PLURAL:$9|'o tag|'e tag}} $8 d' 'a verziona $4 d' 'a paggena $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|luvaje}} {{PLURAL:$9|'o tag|'e tag}} $8 a l'entrata 'e riggistro $5 d' 'a paggena $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|agghiurnaje}} tag dint'a verziona $4 d' 'a paggena $3 ({{PLURAL:$7|azzeccaje}} $6; {{PLURAL:$9|luvaje}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|agghiurnaje}} tag dint'a ntrata 'e riggistro $5 d' 'a paggena $3 ({{PLURAL:$7|azzeccaje}} $6; {{PLURAL:$9|luvaje}} $8)",
        "rightsnone": "(nisciuno)",
        "revdelete-summary": "cagna 'o riepilego",
        "feedback-adding": "Azzecca nu feedback/na segnalazione â paggena..",
        "feedback-error1": "Errore: Risultato nun aspettato 'a ll'API",
        "feedback-error2": "Errore: Cagnamiento scassato",
        "feedback-error3": "Errore: Ll'API nun risponne",
+       "feedback-error4": "Errore: Nun se può miette 'o commento p' 'o titulo",
        "feedback-message": "Mmasciata:",
        "feedback-subject": "Suggietto:",
        "feedback-submit": "Manna",
        "log-name-pagelang": "Càgna 'o riggistro 'e llengue",
        "log-description-pagelang": "Chest'è nu riggistro 'e cagnamiente 'e lengua d' 'e paggene.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ave cagnato}} 'a lengua d' 'a paggena $3 'a $4 a $5.",
-       "default-skin-not-found": "Oops! 'A skin predefinta ' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\n'A installazione pare ca tenesse 'e skin ccà abbascio. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] pe' n'avè cchiù nfurmaziune ncopp' 'a manera 'e ll'abbià o scegliere chilla predefinita.\n\n$2\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanno 'o [https://www.mediawiki.org/wiki/Download programma 'e installazione tarball], ca venesse fornito ch' 'e diverze skin ed estenziune. Putite fare copia-azzecca d' 'a directory <code dir=\"ltr\">skins/</code>.\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonanno uno 'e chiste repository <code>mediawiki/skins/*</code> pe' bbìa d' 'o git dint' 'a directory <code>skins/</code> d' 'a installazione MediaWiki vosta.\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki.\n\n; Si avite MediaWiki agghiurnato MediaWiki mò mò:\n: MediaWiki 1.24 e verziune appriesso nun abbìa automatecamente 'e skin installate (vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]). Putite copiare 'e linee ccà abbascio dint' 'o <code>LocalSettings.php</code> pe' putè appiccià tutt' 'e skin installate mò mò:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si avite cagnato mò mò <code>LocalSettings.php</code>:\n: Cuntrullate 'e nomme d' 'e skin n'ata vota pe' ve sparagnà cocch'errore 'e battitura.",
+       "default-skin-not-found": "Oops! 'A skin predefinta ' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\n'A installazione pare ca tenesse {{PLURAL:$4|'a skin|'e skin}} ccà abbascio. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] pe' n'avè cchiù nfurmaziune ncopp' 'a manera {{PLURAL:$4|'e ll'abbià}} o scegliere chilla predefinita.\n\n$2\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanno 'o [https://www.mediawiki.org/wiki/Download programma 'e installazione tarball], ca venesse fornito ch' 'e diverze skin ed estenziune. Putite fare copia-azzecca d' 'a directory <code dir=\"ltr\">skins/</code>.\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonanno uno 'e chiste repository <code>mediawiki/skins/*</code> pe' bbìa d' 'o git dint' 'a directory <code>skins/</code> d' 'a installazione MediaWiki vosta.\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki.\n\n; Si avite MediaWiki agghiurnato MediaWiki mò mò:\n: MediaWiki 1.24 e verziune appriesso nun abbìa automatecamente 'e skin installate (vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]). Putite copià {{PLURAL:$5|'a linea|'e linee}} ccà abbascio dint' 'o <code>LocalSettings.php</code> pe' putè appiccià {{PLURAL:$5|'o|tutt' 'e}} {{PLURAL:$5|skin}} installate mò mò:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si avite cagnato mò mò <code>LocalSettings.php</code>:\n: Cuntrullate 'e nomme d' 'e skin n'ata vota pe' ve sparagnà cocch'errore 'e battitura.",
        "default-skin-not-found-no-skins": "Oops! 'A skin predefinita p' 'o wiki vuosto, definita 'n <code dir=\"ltr\">$wgDefaultSkin</code> comme <code>$1</code>, nun se tròva.\n\nNun avite installato nisciuno skin.\n\n; Si avite installato MediaWiki mò mò:\n: Probabbilmente l'avite installato 'a git, o direttamente 'a 'o codece sorgente ausanno cocch'atu metodo. Chesto era permesso. Verite 'e installà cocche skin 'a [https://www.mediawiki.org/wiki/Category:All_skins directory ncoppa mediawiki.org], tramite:\n:* Scarrecanno 'o [https://www.mediawiki.org/wiki/Download programma 'e installazione tarball], ca venesse fornito ch' 'e diverze skin ed estenziune. Putite fare copia-azzecca d' 'a directory <code dir=\"ltr\">skins/</code>.\n:* Scarrecanne 'e tarballs individuale 'e skin 'a [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonanno uno 'e chiste repository <code>mediawiki/skins/*</code> pe' bbìa d' 'o git dint' 'a directory <code>skins/</code> d' 'a installazione MediaWiki vosta.\n: Facenno accussì nun se mmescasse 'o repository git vuosto si site sviluppatore MediaWiki. Vedite [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automateco skin]) pe n'avè nfurmaziune ncopp' 'a maniera d'appiccià e scegliere chella predefinita.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (funzione appicciata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''funzione stutata''')",
index 9d2d63f..d971226 100644 (file)
@@ -43,7 +43,8 @@
                        "아라",
                        "Chameleon222",
                        "Helland",
-                       "Macofe"
+                       "Macofe",
+                       "Kingu"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "badtitle": "Ugyldig tittel",
        "badtitletext": "Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.\nDen inneholder kanskje ett eller flere tegn som ikke kan brukes i titler.",
        "perfcached": "Følgende data er en tidligere kopi og ikke nødvendigvis den siste versjonen i databasen. Maksimalt {{PLURAL:$1|ett resultat|$1 resultater}} er {{PLURAL:$1|tilgjengelig|tilgjengelige}} som tidligere kopier.",
-       "perfcachedts": "Følgende data er en tidligere kopi, og ble sist oppdatert $1. Maksimalt {{PLURAL:$4|ett resultat|$4 resultater}} er {{PLURAL:$4|tilgjengelig|tilgjengelige}} som tidligere kopier.",
+       "perfcachedts": "Listen ble sist oppdatert $1. Maksimalt {{PLURAL:$4|ett resultat|$4 resultater}} vises.",
        "querypage-no-updates": "Oppdateringer for denne siden er slått av. Data her blir ikke gjenoppfrisket.",
        "viewsource": "Vis kilde",
        "viewsource-title": "Vis kilden til $1",
        "wrongpassword": "Du har oppgitt et ugyldig passord. Prøv igjen.",
        "wrongpasswordempty": "Du oppga ikke noe passord. Prøv igjen.",
        "passwordtooshort": "Passord må ha minst {{PLURAL:$1|ett tegn|$1 tegn}}.",
+       "passwordtoolong": "Passord kan ikke overskride {{PLURAL:$1|1 character|$1 characters}}.",
        "password-name-match": "Passord og brukernavn kan ikke være det samme.",
        "password-login-forbidden": "Bruken av dette brukernavnet og passordet er forbudt.",
        "mailmypassword": "Tilbakestill passord",
        "notextmatches": "Inden sidetekst samsvarte med søket",
        "prevn": "forrige {{PLURAL:$1|$1}}",
        "nextn": "neste {{PLURAL:$1|$1}}",
+       "prev-page": "forrige side",
+       "next-page": "neste side",
        "prevn-title": "Forrige $1 {{PLURAL:$1|resultat|resultater}}",
        "nextn-title": "Neste $1 {{PLURAL:$1|resultat|resultater}}",
        "shown-title": "Vis $1 {{PLURAL:$1|resultat|resultater}} per side",
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
-       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} i mellom nummer <strong>$2</strong> og nummer <strong>$3</strong>.",
+       "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
        "emailccsubject": "Kopi av din beskjed til $1: $2",
        "emailsent": "E-post sendt",
        "emailsenttext": "E-postbeskjeden er sendt",
-       "emailuserfooter": "E-posten ble sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-posten ble sendt av $1 til $2 via funksjonen «{{int:emailpage}}» på {{SITENAME}}.",
        "usermessage-summary": "Etterlater en systembeskjed.",
        "usermessage-editor": "Systembudbringer",
        "watchlist": "Overvåkningsliste",
        "import-interwiki-history": "Kopier all historikk for denne siden",
        "import-interwiki-templates": "Inkluder alle maler",
        "import-interwiki-submit": "Importer",
-       "import-interwiki-namespace": "Målnavnerom:",
-       "import-interwiki-rootpage": "Destinasjonens grunnside (valgfri):",
        "import-upload-filename": "Filnavn:",
        "import-comment": "Kommentar:",
        "importtext": "Importer filen fra kildewikien med [[Special:Export|eksporteringsverktøyet]].\nLagre den på din egen datamaskin og last den opp her.",
index b80a22e..640e2c2 100644 (file)
        "searchprofile-articles": "Artikels",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
-       "searchprofile-advanced": "Uutebreid",
+       "searchprofile-advanced": "Uutgebreid",
        "searchprofile-articles-tooltip": "Zeuken in $1",
        "searchprofile-images-tooltip": "Zeuken naor bestaanden",
        "searchprofile-everything-tooltip": "Alle inhoud deurzeuken (oek overlegziejen)",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
        "search-nonefound": "Der bin gien resultaoten veur de zeukopdrachte.",
-       "powersearch-legend": "Uutebreid zeuken",
+       "powersearch-legend": "Uutgebreid zeuken",
        "powersearch-ns": "Zeuken in naamruumten:",
        "powersearch-togglelabel": "Selekteren:",
        "powersearch-toggleall": "Alle",
        "file-thumbnail-no": "De bestaandsnaam begint mit <strong>$1</strong>.\nDit is warschienlik n verkleinde aofbeelding ''(overzichsaofbeelding)''.\nA'j disse aofbeelding in volle grootte hebben voeg t dan toe, wiezig aanders de bestaandsnaam.",
        "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 verdan gaon.",
+       "file-exists-duplicate": "Dit bestaand is gelieke an {{PLURAL:$1|t volgende bestaand|de volgende bestaanden}}:",
+       "file-deleted-duplicate": "n Bestaand dat gelieke is an dit bestaand ([[:$1]]) is eerder al vortedaon.\nBekiek t vortdologboek veurda'j vedan gaon.",
        "uploadwarning": "Waorschuwing",
        "uploadwarning-text": "Pas de bestaandsbeschrieving hieronder an en probeer t opniej",
        "savefile": "Bestaand opslaon",
        "nolinkstoimage": "Bestaand is niet in gebruuk.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Meer verwiezingen]] naor dit bestaand bekieken.",
        "linkstoimage-redirect": "$1 (bestaandsdeurverwiezing) $2",
-       "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} liek alleens as dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
+       "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} gelieke an dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
        "sharedupload": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten.",
        "sharedupload-desc-there": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. Bekiek de [$2 beschrieving van t bestaand] veur meer informasie.",
        "sharedupload-desc-here": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. De [$2 beschrieving van t bestaand] dergindse, steet hieronder.",
        "fileduplicatesearch-filename": "Bestaandsnaam:",
        "fileduplicatesearch-submit": "Zeuken",
        "fileduplicatesearch-info": "$1 × $2 beeldpunten<br />Bestaandsgrootte: $3<br />MIME-type: $4",
-       "fileduplicatesearch-result-1": "Der bin gien bestaanden die liek alleens bin as \"$1\".",
-       "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die liek alleens bin as \"$1\".",
+       "fileduplicatesearch-result-1": "Der bin gien bestaanden die gelieke bin an \"$1\".",
+       "fileduplicatesearch-result-n": "Der {{PLURAL:$2|is één bestaand|bin $2 bestaanden}} die gelieke bin an \"$1\".",
        "fileduplicatesearch-noresults": "Der is gien bestaand mit de naam \"$1\" evunnen.",
        "specialpages": "Spesiale ziejen",
        "specialpages-note-top": "Legenda",
        "mediastatistics-header-video": "Video's",
        "mediastatistics-header-multimedia": "Interaktieve media",
        "special-characters-group-latin": "Latien",
-       "special-characters-group-latinextended": "Latien uutebreid",
+       "special-characters-group-latinextended": "Latien uutgebreid",
        "special-characters-group-ipa": "Internasionaal Klankeschrift",
        "special-characters-group-symbols": "Symbolen",
        "special-characters-group-greek": "Grieks",
        "special-characters-group-cyrillic": "Kyrillies",
        "special-characters-group-arabic": "Arabies",
-       "special-characters-group-arabicextended": "Arabies uutebreid",
+       "special-characters-group-arabicextended": "Arabies uutgebreid",
        "special-characters-group-persian": "Perzies",
        "special-characters-group-hebrew": "Hebreeuws",
        "special-characters-group-bangla": "Bengaals",
index 1ef0cc5..b31b2aa 100644 (file)
        "tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने",
        "tog-oldsig": "वर्तमान हस्ताक्षर:",
        "tog-fancysig": "मेरो दस्तखतलाई विकि पाठको रुपमा लिने(स्वत सम्वन्ध बिना)",
-       "tog-uselivepreview": "प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस् (प्रयोगात्मक)",
+       "tog-uselivepreview": "प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस",
        "tog-forceeditsummary": "खाली सम्पादन सार प्रविष्टि गरेमा मलाई सोध्ने",
        "tog-watchlisthideown": "मेरा सम्पादनहरू निगनारी सूचीबाट लुकाउने",
        "tog-watchlisthidebots": "बोट सम्पादनहरू निगरानी सूचीबाट लुकाउने",
        "tog-watchlisthideminor": "साना-तिना सम्पादनहरू निगरानी सूचीबाट लुकाउने",
        "tog-watchlisthideliu": "प्रवेश गरेका प्रयोगकर्ताहरुको सम्पादन निगरानी सूचीबाट लुकाउने",
        "tog-watchlisthideanons": "अज्ञात प्रयोगकर्ताहरुबाट गरिएको सम्पादन निगरानी सूचीबाट लुकाउने",
-       "tog-watchlisthidepatrolled": "गस्ती(पट्रोल)सम्पादनहरु मेरो निगरानी सूचीबाट लुकाउने",
-       "tog-ccmeonemails": "मैले अरु प्रयोगकर्ताहरुलाई पठाउने इ-मेल को प्रतिलिपि मलाई पठाउने",
-       "tog-diffonly": "तलà¤\95ा à¤ªà¥\83षà¥\8dà¤\9fहरà¥\81à¤\95à¥\8b diffहरु सामग्री नदेखाउने",
-       "tog-showhiddencats": "लà¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤ªà¥\8dरà¤\95ारहरु देखाउने",
-       "tog-norollbackdiff": "पूर्वस्थितिमा फर्काएपछि  diff हटाउने",
+       "tog-watchlisthidepatrolled": "गस्ती गरिएका सम्पादनहरु मेरो निगरानी सूचीबाट लुकाउने",
+       "tog-ccmeonemails": "मैले अरु प्रयोगकर्ताहरुलाई पठाउने इ-मेलको प्रतिलिपि मलाई पठाउने",
+       "tog-diffonly": "तलà¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\81à¤\95à¥\8b à¤­à¤¿à¤¨à¥\8dनहरु सामग्री नदेखाउने",
+       "tog-showhiddencats": "लà¥\81à¤\95ाà¤\87à¤\8fà¤\95à¥\8b à¤¶à¥\8dरà¥\87णà¥\80हरु देखाउने",
+       "tog-norollbackdiff": "पूर्वस्थितिमा फर्काएपछि भिन्नता हटाउने",
        "tog-useeditwarning": "सम्पादनहरू सङ्ग्रह गरिनसकेको अवस्थामा अर्को पृष्ठमा जान खोज्दा चेतावनी देखाउने",
        "tog-prefershttps": "प्रवेश गर्दा जहिले पनि सुरक्षित जडान प्रयोग गर्ने",
        "underline-always": "सधैँ",
        "underline-never": "कहिल्यै",
-       "underline-default": "सà¥\8dà¤\95à¥\80न अथवा ब्राउजर पूर्वस्थिति",
+       "underline-default": "à¤\96à¥\8bल अथवा ब्राउजर पूर्वस्थिति",
        "editfont-style": "फन्ट प्रकार क्षेत्र सम्पादन गर्नुहोस् :",
        "editfont-default": "ब्राउजर पूर्वस्थिति",
        "editfont-monospace": "मोनोस्पेस्ड फन्ट",
        "category-file-count-limited": "निम्न  {{PLURAL:$1|फाइल|$1 फाइलहरु}} यस श्रेणीमा रहेको ।",
        "listingcontinuesabbrev": "निरन्तरता...",
        "index-category": "क्रमाङ्कित पृष्ठहरू",
-       "noindex-category": "à¤\95à¥\8dरमाà¤\82कन नगरिएका पृष्ठहरू",
-       "broken-file-category": "à¤\9fà¥\81à¤\9fà¥\87à¤\95à¥\8b à¤«à¤¾à¤\87ल à¤²à¤¿à¤\82à¤\95सितको पृष्ठ",
+       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dकन नगरिएका पृष्ठहरू",
+       "broken-file-category": "à¤\9fà¥\81à¤\9fà¥\87à¤\95à¥\8b à¤«à¤¾à¤\87ल à¤²à¤¿à¤\99à¥\8dà¤\95हरà¥\82सितको पृष्ठ",
        "about": "बारेमा",
        "article": "सामाग्री पृष्ठ",
        "newwindow": "(नयाँ विन्डोमा खुल्छ)",
        "cancel": "रद्द",
        "moredotdotdot": "थप...",
-       "morenotlisted": "यो सूची पूर्ण हैन ।",
+       "morenotlisted": "यो सूची पूर्ण हैन।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
        "anontalk": "यस IP को वारेमा वार्तालाप गर्नुहोस्",
        "qbpageoptions": "यो पेज",
        "qbmyoptions": "मेरो पेज",
        "faq": "धैरै सोधिएका प्रश्नहरु",
-       "faqpage": "Project:FAQ",
+       "faqpage": "Project:धैरै सोधिएका प्रश्नहरु",
        "actions": "कार्यहरु",
        "namespaces": "नेमस्पेस",
        "variants": "बहुरुपहरु",
        "view-pool-error": "माफ गर्नुहोस् , यस समयमा सर्भरहरुमा कार्यभार उच्च रहेको छ।\nअति धेरै प्रयोगकर्ताहरु यो पृष्ट हेर्ने प्रयास गरी रहनु भएको छ।\nकृपया यो पृष्ठ पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।\n\n$1",
        "generic-pool-error": "माफ गर्नुहोस् , यस समयमा सर्भरहरुमा कार्यभार उच्च रहेको छ।\nअति धेरै प्रयोगकर्ताहरु यो पृष्ट हेर्ने प्रयास गरी रहनु भएको छ।\nकृपया यो सामग्री  हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।",
        "pool-timeout": "समय सकियो बन्द गर्ने प्रतीक्षामा",
-       "pool-queuefull": "पà¥\8dरतà¥\80à¤\95à¥\8dषा à¤ªà¤\82क्ति भरियो",
+       "pool-queuefull": "पà¥\8dरतà¥\80à¤\95à¥\8dषा à¤ªà¤\99à¥\8dक्ति भरियो",
        "pool-errorunknown": "अज्ञात त्रुटि",
        "aboutsite": "{{SITENAME}}को बारेमा",
        "aboutpage": "Project:बारेमा",
        "changeemail-oldemail": "हालको इमेल-ठेगाना:",
        "changeemail-newemail": "नयाँ इमेल-ठेगाना:",
        "changeemail-none": "(कुनै पनि हैन)",
+       "changeemail-password": "तपाईंको {{SITENAME}} पासवर्ड:",
        "changeemail-submit": "इमेल परिवर्तन गर्ने",
+       "changeemail-throttled": "तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ।\nकृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।",
        "resettokens": "टोकन पूर्वरुपमा फर्काउने",
        "resettokens-no-tokens": "पूर्वरुपमा फर्काउन कुनै पनि टोकन छैन ।",
        "resettokens-legend": "टोकनहरू पूर्वरुपमा फर्काउने",
        "updated": "नवीन",
        "note": "'''सूचना:'''",
        "previewnote": "'''याद राख्नुहोस् यो केवल पूर्वावलोकन मात्र हो; तपाईंका परिवर्तनहरू संग्रहित भएका छैनन्!'''",
+       "continue-editing": "सम्पादन क्षेत्रमा जानुहोस",
        "previewconflict": "यस पूर्वावलोकनले संपादन क्षेत्र को माथिल्लो भागको पाठ परिवर्तन गर्ने ठाउँको पाठलाइ देखाउँछ अनि तपाइले यसलाइ सेभ गरेपछि देखापर्छ।",
        "session_fail_preview": "'''माफ गर्नुहोस्! सत्र-आँकड़ा (session data) हराउनाले हामीले तपाईंको सम्पादन प्रक्रिया अघि बढाउन सकेनौं।.'''\nकृपया पुनः प्रयास गर्नुहोस्।\nयदि फेरि पनि काम भएन भनें, [[Special:UserLogout|बाहिर गई(लग आउट गरी)]]  फेरि प्रवेश गर्नुहोस्।",
        "session_fail_preview_html": "'''माफ गर्नुहोला! सत्र को डेटा को नोकसान को कारण ले गर्दा तपाइको सम्पादन लाइ जारी राख्न सकिएन।'''\n\n''जावास्क्रिप्ट हमलाहरु रोक्नको लागि यो पूर्वावलोकन लाइ देखाइएको छैन किन कि {{SITENAME}} मा काँचो HTML को प्रयोग गर्न मिल्ने बनाइएको छ।''\n\n'''यदि यो एक वैध प्रयास हो भने, कृपया पुन: प्रयास गर्नुहोला.'''\nयदि अझै पनि काम गरेन भने [[Special:UserLogout|निर्गमन(logging out)]] र पुन:आगमन(login) गर्ने प्रयास गर्नुहोला।",
        "revertmerge": "नमिलाउने",
        "mergelogpagetext": "एउटा पृष्ठको इतिहास अर्कोमा भर्खरै मिलाइएको सूची तल दिइन्छ।",
        "history-title": "\"$1\" को पुनरावृत्ति इतिहास",
+       "difference-title": "\"$1\" को बिचमा भिन्नता",
+       "difference-title-multipage": "\"$1\" तथा \"$2\" को बिचमा भिन्नता",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "notextmatches": "अक्षरस् पेज भेटिएन",
        "prevn": "पहिलेको {{PLURAL:$1|$1}}",
        "nextn": "अर्को {{PLURAL:$1|$1}}",
+       "prev-page": "अघिल्लो पृष्ठ",
+       "next-page": "अर्को पृष्ठ",
        "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": "'''यस विकिमा  \"[[:$1]]\" शीर्षक भएको पृष्ठ बनाउनुहोस् !'''",
+       "searchmenu-new": "<strong>\"[[:$1]]\" पृष्ठ यस विकिमा बनाउनुहोस्!</strong> {{PLURAL:$2|0=|तपाईंले खोज गरी भटिएको पृष्ठ पनि मिलान गर्नुहोस्।|तपाईंको खोज परिणाम पनि हेर्नुहोस।}}",
        "searchprofile-articles": "सामग्री पृष्ठहरू",
        "searchprofile-images": "मल्टिमिडिया(श्रव्य दृश्य)",
        "searchprofile-everything": "सब थोक",
        "userrights-no-interwiki": "तपाईंलाई अन्य विकिमा प्रयोगकर्ता अधिकार सम्पादन गर्ने अनुमति छैन।",
        "userrights-nodatabase": "डेटाबेस $1 उपलब्ध छैन या स्थानीय हैन।",
        "userrights-nologin": "प्रयोगकर्ता अधिकार प्रदान गर्न तपाईंले प्रबन्धक खाताबाट [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।",
-       "userrights-notallowed": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\85धिà¤\95ार à¤ªà¥\8dरदान à¤\97रà¥\8dनà¥\87 à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 à¤\85नà¥\81मति छैन।",
+       "userrights-notallowed": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dतालाà¤\88 à¤\85धिà¤\95ार à¤ªà¥\8dरदान à¤\97रà¥\8dनà¥\87 à¤µà¤¾ à¤¹à¤\9fाà¤\89नà¥\87 à¤\85नà¥\81मति à¤¤à¤ªà¤¾à¤\88à¤\82लाà¤\88 छैन।",
        "userrights-changeable-col": "परिवर्तन गर्न सकिने समूहहरु",
        "userrights-unchangeable-col": "तपाईले परिवर्तन गर्न सक्नुनहुने समूहहरु",
        "userrights-irreversible-marker": "$1*",
        "right-move": "पृष्ठहरू सार्ने",
        "right-move-subpages": "तिनीहरुको सह-पृष्ठसहित पृष्ठहरु सार्ने",
        "right-move-rootuserpages": "मूल(root) प्रयोगकर्ताको पृष्ठहरु सार्ने",
+       "right-move-categorypages": "श्रेणी पृष्ठ सार्नुहोस",
        "right-movefile": "फाइलहरु सार्ने",
        "right-suppressredirect": "पृष्ठ सार्दा स्रोत पृष्ठबाट पठाउने लिंक नबनाउने",
        "right-upload": "फाइलहरु उर्ध्वभरण गर्ने",
        "right-reupload-shared": "साझा मिडिया भण्डारमा स्थानियरुपमा फाइलहरु अधिक्रमण गर्ने",
        "right-upload_by_url": "URL बाट फाइल उर्ध्वभरण गर्ने",
        "right-purge": "साइटको क्याश( cache) निश्चित नगरिकनै पर्ज(Purge) गर्ने",
-       "right-autoconfirmed": "à¤\85रà¥\8dध-सà¥\81रà¤\95à¥\8dषित à¤ªà¥\83षà¥\8dठहरà¥\81 à¤¸à¤®à¥\8dपादन à¤\97र्ने",
+       "right-autoconfirmed": "à¤\86à¤\87पà¥\80 à¤¦à¤° à¤¸à¥\80मालà¥\87 à¤\85सर à¤¨à¤ªà¤¾र्ने",
        "right-bot": "स्वाचालित कार्यको रुपमा व्यवहार गर्ने",
        "right-apihighlimits": "API खोजको लागि उच्च सीमा प्रयोग गर्नुहोस्",
        "right-writeapi": "लेखन API प्रयोग गर्ने",
        "uploaderror": "उर्ध्वभरण त्रुटि",
        "upload-recreate-warning": "'''चेतावनी: त्यस नाममा रहेका फाइलहरु सारिएको या हटाइएको छ।'''\n\nयस पृष्ठको सारिएको र हटाइएको लग तपाईको सहजताको लागि दिइएको छ।",
        "uploadtext": "फाइल अपलोड गर्न निम्न फारम प्रयोग गर्नुहोस्।\nहेर्नुहोस्- पहिला अपलोड गरिएका [[Special:FileList|फाइलहरूको सूची]] , पुनः अपलोड गरिएका [[Special:Log/upload|अपलोड लग]]मा, मेटिएका फाइलहरू [[Special:Log/delete|मेटिएको लग]]मा।\n\nपृष्ठमा फाइल संलग्न गर्न तल दिएका फारमहरूमध्ये एउटामा लिङ्क गराउनुहोस्:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''पूर्ण आकारको फाइल प्रयोग गर्न\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' 200 पिक्सलको देब्रेपट्टि मार्जिन गरेर फाइलको बर्णनसहित प्रयोग गर्न\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' फाइल नदेखाई सिंधै फाइलसित लिङ्क गरी प्रयोग गर्न",
-       "upload-permitted": "à¤\85नà¥\81मति à¤ªà¤¾à¤\8fà¤\95ा à¤«à¤¼à¤¾à¤\87ल à¤ªà¥\8dरà¤\95ार:$1.",
-       "upload-preferred": "à¤\9aाहिà¤\8fà¤\95ा à¤«à¤¼à¤¾à¤\87ल à¤ªà¥\8dरà¤\95ार:$1.",
-       "upload-prohibited": "निषिदà¥\8dध à¤«à¤¼à¤¾à¤\87ल à¤ªà¥\8dरà¤\95ार:$1.",
+       "upload-permitted": "à¤\85नà¥\81मति à¤ªà¤¾à¤\8fà¤\95ा à¤«à¤¾à¤\87ल {{PLURAL:$2|पà¥\8dरà¤\95ार|पà¥\8dरà¤\95ारहरà¥\82}}:$1।",
+       "upload-preferred": "à¤\9aाहिà¤\8fà¤\95ा à¤ªà¤¾à¤\8fà¤\95ा à¤«à¤¾à¤\87ल {{PLURAL:$2|पà¥\8dरà¤\95ार|पà¥\8dरà¤\95ारहरà¥\82}}:$1।",
+       "upload-prohibited": "निषà¥\87धित à¤ªà¤¾à¤\8fà¤\95ा à¤«à¤¾à¤\87ल {{PLURAL:$2|पà¥\8dरà¤\95ार|पà¥\8dरà¤\95ारहरà¥\82}}:$1।",
        "uploadlogpage": "उर्ध्वभरण लग",
        "uploadlogpagetext": "भर्खरै उर्ध्वभरण गरिएका फ़ाइलहरुको सूची तल दिइएकोछ ।\nविस्तृत अवलोकनको लागि [[Special:NewFiles|नयाँ फ़ाइलको ग्यालरी]]मा हेर्नुहोस्।",
        "filename": "फाइलनाम",
        "license-header": "अनुज्ञा प्राप्त गर्दै",
        "nolicense": "केहिपनि छानिएन",
        "license-nopreview": "(पूर्वरुप उपलब्ध छैन)",
-       "upload_source_file": " (तपाईँको कम्प्युटरमा रहेको एक फाइल)",
+       "upload_source_file": "(तपाईँले आफ्नो कम्प्युटरबाट छानेको फाइल)",
+       "listfiles-delete": "मेट्ने",
+       "listfiles-summary": "यस विशेष पृष्ठले उर्ध्वभरण गरिका सबै फाइलहरु देखाउँछ।",
        "listfiles_search_for": "मिडिया नामको लागि खोज्नुहोस:",
        "imgfile": "फाइल",
        "listfiles": "फाइल सूची",
        "filehist-current": "हालको",
        "filehist-datetime": "मिति/समय",
        "filehist-thumb": "थम्बनेल",
-       "filehist-thumbtext": "थम्बनेल $1 सस्करणको रुपमा",
+       "filehist-thumbtext": "थमà¥\8dबनà¥\87ल $1 à¤¸à¤\82सà¥\8dà¤\95रणà¤\95à¥\8b à¤°à¥\81पमा",
        "filehist-nothumb": "थम्बनेल नभएको",
        "filehist-user": "प्रयोगकर्ता",
        "filehist-dimensions": "आकारहरू",
        "unusedtemplateswlh": "अन्य कड़ीहरु",
        "randompage": "कुनै एक लेख",
        "randompage-nopages": "{{PLURAL:$2| $1 नाम भएको कुनै पृष्ट छैन|$1 नाम भएका कुनै पृष्टहरु छैनन्}}",
+       "randomincategory-category": "श्रेणी:",
        "randomredirect": "कुनै एउटा अनुप्रेषितमा जाने",
        "randomredirect-nopages": "\"$1\" नामस्थानमा अनुप्रेषित छैन।",
        "statistics": "तथ्यांक",
        "wantedtemplates": "माग भएका टेम्प्लेटहरु",
        "mostlinked": "सबैभन्दा बढि लिंक भएको पृष्ठ",
        "mostlinkedcategories": "सबैभन्दा बढी लिंक भएका श्रेणीहरू",
-       "mostlinkedtemplates": "ढाà¤\81à¤\9aाहरà¥\81सित à¤¸à¤¬à¥\88भनà¥\8dदा à¤¬à¤¢à¤¿ à¤²à¤¿à¤\82à¤\95 à¤­à¤\8fà¤\95à¥\8b",
+       "mostlinkedtemplates": "सबà¥\88भनà¥\8dदा à¤¬à¤¢à¤¿ à¤\9fà¥\8dरानà¥\8dसà¤\95à¥\8dलà¥\8dयà¥\81डà¥\87ड à¤ªà¥\83षà¥\8dठहरà¥\82",
        "mostcategories": "सबैभन्दा धेरै श्रेणीहरू भएका लेखहरू",
        "mostimages": "सबैभन्दा बढि लिंक भएको चित्र",
+       "mostinterwikis": "सबैभन्दा धेरै इन्टरविकि भएका पृष्ठहरू",
        "mostrevisions": "सबैभन्दा बढी संशोधित लेखहरू",
        "prefixindex": "प्रिफिक्स सहितका पृष्ठहरु",
        "shortpages": "छोटा पृष्ठहरू",
        "protect-locked-access": "तपाईँको खातालाई पृष्ठको सुरक्षा स्तरहरू परिवर्तन गर्ने अनुमति छैन ।\n'''$1''पृष्ठको हालको स्थिति  निम्न छ :",
        "protect-cascadeon": "हालमा यो पृष्ठ सुरक्षित गरिएकोछ किन कि यसमा निम्न {{PLURAL:$1|पृष्ठ, जसको|पृष्ठहरु, जसको}} सुरक्षामा व्यापकता  कायम गरिएकोछ। \nतपाईंले पृष्ठको सुरक्षा स्तर परिवर्तन गर्न सक्नुहुनेछ तर यसले व्यापक सुरक्षालाई केहि असर पार्नेछैन।",
        "protect-default": "सबै प्रयोगकर्ताहरुलाई अनुमति दिने",
-       "protect-fallback": "\"$1\" à¤\85नà¥\81मति à¤\9aाहिनà¥\8dà¤\9b",
-       "protect-level-autoconfirmed": "नयाà¤\81 à¤¤à¤¥à¤¾ à¤¦à¤°à¥\8dता à¤¨à¤­à¤\8fà¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81लाà¤\88 à¤¨à¤¿à¤·à¥\87ध à¤\97रà¥\8dने",
-       "protect-level-sysop": "प्रबन्धकहरु मात्र",
+       "protect-fallback": "\"$1\" à¤µà¤°à¥\8dà¤\97मा à¤­à¤\8fà¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82लाà¤\88 à¤\85नà¥\81मति à¤¦à¤¿à¤¨à¥\87",
+       "protect-level-autoconfirmed": "नयाà¤\81 à¤¤à¤¥à¤¾ à¤¦à¤°à¥\8dता à¤­à¤\8fà¤\95ा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81लाà¤\88 à¤\85नà¥\81मति à¤¦à¤¿ने",
+       "protect-level-sysop": "प्रबन्धकहरुलाई मात्र अनुमति दिने",
        "protect-summary-cascade": "लाममा राख्ने",
        "protect-expiring": "$1 (UTC) मा सकिने छ ।",
        "protect-expiring-local": "समाप्ति समय $1",
        "nolinkshere-ns": "चुनिएको नामस्थानमा '''[[:$1]]''' सित जोड़िने पृष्ठहरु छैनन्।",
        "isredirect": "अनुप्रेषित पृष्ठ",
        "istemplate": "पारदर्शिता",
-       "isimage": "फाà¤\87ल à¤²à¤¿à¤\82क",
+       "isimage": "फाà¤\87ल à¤²à¤¿à¤\99à¥\8dक",
        "whatlinkshere-prev": "{{PLURAL:$1|पहिलो|पहिलो $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|अर्को|अर्को $1}}",
        "whatlinkshere-links": "← लिंकहरु",
        "autoblockid": "अटोब्लक #$1",
        "block": "प्रयोगकर्तालाई रोकलगाउने",
        "unblock": "प्रयोगकर्ता माथिको प्रतिबन्ध हटाउने",
-       "blockip": "प्रयोगकर्तालाइ निषेध गर्ने",
+       "blockip": "{{GENDER:$1|प्रयोगकर्ता}}लाई निषेध गर्ने",
        "blockip-legend": "प्रयोगकर्ता रोक्नुहोस",
        "blockiptext": "विशेष IP ठेगाना अथवा प्रयोगकर्तालाई रोक लगाउन निम्न प्रपत्र (form) प्रयोग गर्नुहोस्।\nयसो गर्नुको कारण [[{{MediaWiki:Policy-url}}|नीति]] अनुरुप विकिमा गरिने बर्बरताका कार्य रोक्नु मात्र हो।\nविशेष कारण देखाउँदै तलको प्रपत्र भर्नुहोस्  (उदाहरण, बर्बरताको कार्य गरिएको पृष्ठ दर्शाउँदै)",
-       "ipaddressorusername": " ip ठेगाना या प्रयोगकर्ता नाम :",
-       "ipbexpiry": "समापà¥\8dति:",
+       "ipaddressorusername": "आइपी ठेगाना वा प्रयोगकर्ता नाम :",
+       "ipbexpiry": "सà¤\95िनà¥\87:",
        "ipbreason": "कारण:",
        "ipbreason-dropdown": "*रोक लगाउनुका समान्य कारणहरु\n** झूटो सूचना दिइएको\n** पृष्ठहरुबाट सामाग्रीहरु हटाइएको\n** बाहिरी जालक्षेत्र (sites)सित नचाहिंदो लिङ्क गराइएको \n** पृष्ठहरुमा बकवास/गाली-गलौच हालिएको\n** भय फैलाउने व्यवहार/उत्पीडन (सताउने कार्य)\n** धेरै गलत खाताहरु\n** प्रयोगकर्ता नाम अस्वीकार्य",
        "ipb-hardblock": "यस आई पी ठेगानाबाट प्रवेश गरेका प्रयोगकर्तालाई संपादन गर्न नदिने",
        "ipb-confirm": "रोक सुनिश्चित गर्ने",
        "badipaddress": "अमान्य IP ठेगाना",
        "blockipsuccesssub": "निषेधकार्य सफल भयो",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] निषेधगरिएको छ।<br />\nपुनरावलकोनको लागि [[Special:BlockList|आइ पी निषेध सूची]] हेर्नहोस् ।",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] निषेध गरिएको छ।<br />\nपुनरावलकोनको लागि [[Special:BlockList|आइपी निषेध सूची]] हेर्नहोस्।",
        "ipb-blockingself": "तपाईंले आफैंलाई रोक लगाउन गइरहनु भएको छ! के तपाईं पक्का यसो गर्न चाहनुहुन्छ?",
        "ipb-confirmhideuser": "तपाईंले त्यस्तो प्रयोगकर्तालाई रोक लगाउन गइरहनु भएको छ जसको  \"प्रयोगकर्ता लुकाउने\" सक्रिय बनाइएको छ। यसो गर्दा सबै लग सूचीहरुबाट प्रयोगकर्ताको नाम गायब हुनेछ। के तपाईं पक्का यसो गर्न चाहनुहुन्छ?",
        "ipb-edit-dropdown": "निषेध कारण सम्पादन गर्नुहोस्",
        "ipb-unblock-addr": "$1 निषेध खारेज गर्ने",
        "ipb-unblock": "प्रयोगकर्ता वा IP माथिको निषेध खारेज गर्ने",
        "ipb-blocklist": "हाल रहेका निषेधहरु हेर्नुहोस्",
-       "ipb-blocklist-contribs": "$1 को लागि योगदान",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}को लागि योगदान",
        "unblockip": "प्रयोगकर्ताको निषेध खारेज गर्नुहोस्",
        "unblockiptext": "IP ठेगाना अथवा प्रयोगकर्तामाथि पहिले लगाइएको रोक फुकुवा गर्न तलको प्रपत्र प्रयोग गर्नुहोस्।",
        "ipusubmit": "यो रोक हटाउने",
        "change-blocklink": "रोकमा परिवर्तन गर्ने",
        "contribslink": "योगदानहरू",
        "emaillink": "इमेल पठाउने",
-       "autoblocker": "तपाईंको आई पी ठेगाना  \"[[User:$1|$1]]\" द्वारा  भर्खरै प्रयोग गरिएकोले स्वत: बन्देज गरिएको।\n$1को बन्देजको कारण : \"$2\" हो",
+       "autoblocker": "तपाईंको आईपी ठेगाना \"[[User:$1|$1]]\" द्वारा भर्खरै प्रयोग गरिएकोले स्वत: बन्देज गरिएको हो।\n$1को बन्देजको कारण \"$2\" हो",
        "blocklogpage": "निषेध लग",
        "blocklog-showlog": "यो प्रयोगकर्तालाई पहिला रोक लगाइएको थियो।\nरोकावट लग सन्दर्भको निम्ति तल दिइन्छ:",
        "blocklog-showsuppresslog": "यो प्रयोगकर्तालाई पहिला रोक लगाइएको र लुकेको थियो ।\nलु्काइएको लग सन्दर्भको निम्ति तल दिइन्छ:",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "pagemovedsub": "सार्ने काम सफल भयो",
        "movepage-moved": "'''\"$1\" लाई \"$2\"मा सारिएको छ'''",
-       "movepage-moved-redirect": "रिडाà¤\87रà¥\87à¤\95à¥\8dà¤\9f à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cना à¤\97रियà¥\8b",
+       "movepage-moved-redirect": "à¤\85नà¥\81पà¥\8dरà¥\87षित à¤ªà¥\83षà¥\8dठ à¤¸à¥\83à¤\9cना à¤\97रियà¥\8b।",
        "movepage-moved-noredirect": "रिडाइरेक्ट पृष",
        "articleexists": "यस नामको पृष्ठ पहिले देखि नै रहेको ,या तपाईँले छान्नु भएको नाम अमान्य छ।\nकृपया अर्कै नाम छान्नुहोस् ।",
        "cantmove-titleprotected": "तपाईले यो स्थानमा पृष्ठ सार्न सक्नुहुन्न, किनकी यो नयाँ शिर्षकलाई सिर्जना हुनबाट जोगाइएको छ",
        "selfmove": "स्रोत तथा लक्ष्य गरिएको फाइलको शीर्षक एउटै छ;\nयसैमाथि पृष्ठ सार्न सकिंदैन।",
        "immobile-source-namespace": "यो $1 नामस्थानमा पृष्टहरु सार्न सकिंदैन",
        "immobile-target-namespace": "यो $1 नामस्थानभित्र पृष्टहरु सार्न सकिंदैन",
-       "immobile-target-namespace-iw": "à¤\85नà¥\8dतरविà¤\95à¥\80 à¤²à¤¿à¤¨à¤\99à¥\8dà¤\95 à¤ªà¥\83षà¥\8dठ à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤®à¤¾à¤¨à¥\8dय à¤\97नà¥\8dतवà¥\8dय à¤¹à¥\81नसà¤\95à¥\8dदà¥\88न ।",
-       "immobile-source-page": "यà¥\8b à¤ªà¥\83षà¥\8dà¤\9f सार्न योग्यको छैन।",
-       "immobile-target-page": "त्यस गन्तव्य शिर्षकमा सार्न सकिन्न ।",
-       "imagenocrossnamespace": "फाइललाई बिना-फाइल नेमस्पेसमा सार्न सकिंदैन",
-       "nonfile-cannot-move-to-file": "à¤\85-फà¤\87ललाà¤\88   à¤«à¤¾à¤\87ल à¤¨à¥\87मसà¥\8dपà¥\87समा à¤¸à¤¾à¤°à¥\8dन à¤¸à¤\95िनà¥\8dन",
-       "imagetypemismatch": "नयाँ फाइल एक्सटेन्सन फाइलको प्रकारसँग मेल खादैन",
-       "imageinvalidfilename": "गन्तव्य फाइल नाम अमान्य छ",
-       "move-leave-redirect": "à¤\85नà¥\81पà¥\8dरà¥\87षण (redirect) छोडिराख्ने",
+       "immobile-target-namespace-iw": "à¤\85नà¥\8dतरविà¤\95à¥\80 à¤²à¤¿à¤\99à¥\8dà¤\95 à¤ªà¥\83षà¥\8dठ à¤¸à¤¾à¤°à¥\8dनà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤®à¤¾à¤¨à¥\8dय à¤\97नà¥\8dतवà¥\8dय à¤¹à¥\81नसà¤\95à¥\8dदà¥\88न।",
+       "immobile-source-page": "यà¥\8b à¤ªà¥\83षà¥\8dठ सार्न योग्यको छैन।",
+       "immobile-target-page": "त्यस गन्तव्य शिर्षकमा सार्न सकिन्न।",
+       "imagenocrossnamespace": "फाइललाई बिना-फाइल नेमस्पेसमा सार्न सकिंदैन",
+       "nonfile-cannot-move-to-file": "à¤\97à¥\88हà¥\8dर à¤«à¤¾à¤\87ललाà¤\88 à¤«à¤¾à¤\87ल à¤¨à¥\87मसà¥\8dपà¥\87समा à¤¸à¤¾à¤°à¥\8dन à¤¸à¤\95िनà¥\8dन।",
+       "imagetypemismatch": "नयाँ फाइल एक्सटेन्सन फाइलको प्रकारसँग मेल खादैन",
+       "imageinvalidfilename": "गन्तव्य फाइल नाम अमान्य छ",
+       "move-leave-redirect": "पà¤\9bाडà¥\80 à¤\8fà¤\95 à¤\85नà¥\81पà¥\8dरà¥\87षण छोडिराख्ने",
        "export": "पृष्ठहरू निर्यात गर्ने",
        "exportall": "सबै पृष्ठहरू निर्यात गर्ने",
        "exportcuronly": "हालको संस्करण मात्र थप्ने ,पूरा इतिहास हैन",
        "export-addcat": "थप्ने",
        "export-addnstext": "नेमस्पेसबाट पृष्ठ थप्ने :",
        "export-addns": "थप्ने",
-       "export-download": "सà¤\82ग्रह गर्ने",
+       "export-download": "सà¤\99à¥\8dग्रह गर्ने",
        "export-templates": "ढाँचाहरु संलग्न गर्नुहोस्",
        "allmessages": "सिस्टम सन्देशहरू",
        "allmessagesname": "नाम",
        "thumbnail_image-type": "चित्रको प्रकार समर्थित छैन",
        "thumbnail_image-missing": "फाइल हराएको भान भइरहेछ: $1",
        "import": "पृष्ठहरू आयात गर्नुहोस्",
-       "importinterwiki": "Transwiki आयात",
+       "importinterwiki": "अन्य विकिबाट आयात गर्ने",
        "import-interwiki-history": "यो पृष्ठकोलागि सबै इतिहास संशोधनहरु प्रतिलिपि गर्ने",
        "import-interwiki-templates": "सबै टेम्प्लेटहरु(नमुना) समेट्ने",
        "import-interwiki-submit": "आयात",
        "import-token-mismatch": "सत्र जानकारी नष्ट भयो\nकृपया पुन: प्रयास गर्नुहोस्।",
        "import-invalid-interwiki": "खुलाइएको विकिबाट आयात गर्न सकिएन",
        "importlogpage": "आयात सूची",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरु}}",
-       "import-logentry-interwiki-detail": "$2 देखि $1 {{PLURAL:$1|पुनरावलोकन|पुनरावलोकनहरु}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|संशोधन|संशोधनहरु}} आयात भयो",
+       "import-logentry-interwiki-detail": "$2 देखि $1 {{PLURAL:$1|पुनरावलोकन|पुनरावलोकनहरु}} आयात भयो",
        "tooltip-pt-userpage": "तपाईको प्रयोगकर्ता पृष्ठ",
        "tooltip-pt-anonuserpage": "तपाईले जुन IP ठेगानाको रुपमा सम्पादन गर्दै हुनुहुन्छ , त्यसको प्रयोगकर्ता पृष्ठ निम्न छ :",
        "tooltip-pt-mytalk": "तपाईको वार्ता पृष्ठ",
        "duplicate-defaultsort": "'''चेतावनी:''' पूर्व निर्धारित छोटकरी \"$2\" ले पुरानो पूर्वनिर्धारित छोटकरी\"$1\"लाई विस्थापन गरेको छ ।",
        "version": "संस्करण",
        "version-extensions": "स्थापना गरिएका एक्सटेन्सनहरु",
-       "version-skins": "à¤\96à¥\8bलहरà¥\81",
+       "version-skins": "सà¥\8dथापित à¤\96à¥\8bलहरà¥\82",
        "version-specialpages": "विशेष पृष्ठहरू",
        "version-parserhooks": "पार्सर हुकहरु",
        "version-variables": "चल राशी(variables)",
        "version-hook-subscribedby": "ग्राह्यता गर्ने",
        "version-version": "($1)",
        "version-svn-revision": "(r$2)",
-       "version-license": "इजाजतपत्र",
+       "version-license": "मिडà¥\80याविà¤\95ि à¤\87à¤\9cाà¤\9cतपतà¥\8dर",
        "version-poweredby-credits": "यो विकी '''[https://www.mediawiki.org/ मिडियाविकि]''' द्वारा सशक्तिकरण गरिएको छ, copyright © सन् २००१-$1 $2.",
        "version-poweredby-others": "अन्य",
        "version-software": "स्थापना गरिएको सफ्टवेयर",
        "fileduplicatesearch-result-n": "फाइल\"$1\" को {{PLURAL:$2|1 दुरुस्त नक्कल|$2 दुरुस्त नक्कलहरु}} छन् ।",
        "fileduplicatesearch-noresults": "\"$1\" नामको फाइल पाइएन।",
        "specialpages": "विशेष पृष्ठ",
-       "specialpages-note": "* साधारण विशेष पृष्ठहरु।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरु।</span>\n* <span class=\"mw-specialpagecached\">क्याश गरिएका विशेष पृष्ठहरु (अध्यावधिक नहुन सक्छ)।</span>",
+       "specialpages-note": "* साधारण विशेष पृष्ठहरु।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरु।</span>",
        "specialpages-group-maintenance": "मर्मत प्रतिवेदनहरु",
        "specialpages-group-other": "अरू विशेष पृष्ठहरू",
-       "specialpages-group-login": "प्रवेशगर्नुहोस/खाता शृजना गर्नुहोस",
+       "specialpages-group-login": "प्रवेश गर्ने / नयाँ खाता बनाउने",
        "specialpages-group-changes": "भर्खरैका परिवर्तन र लगहरु",
        "specialpages-group-media": "मेडिया प्रतिवेदन र उर्ध्वभरणहरु",
        "specialpages-group-users": "प्रयोगकर्ता र अधिकारहरु",
        "specialpages-group-highuse": "उच्च प्रयोग भएका पृष्ठहरू",
        "specialpages-group-pages": "पृष्ठहरूको सूची:",
        "specialpages-group-pagetools": "पृष्ठ उपकरणहरू",
-       "specialpages-group-wiki": "विà¤\95ि à¤¡à¤¾टा र औजारहरु",
+       "specialpages-group-wiki": "डà¥\87टा र औजारहरु",
        "specialpages-group-redirects": "विशेष पृष्ठमा पठाउने",
        "specialpages-group-spam": "स्पाम उपकरणहरू",
+       "specialpages-group-developer": "विकासकर्ता उपकरणहरू",
        "blankpage": "खाली पृष्ठहरू",
        "intentionallyblankpage": "यो पृष्ठ जानी जानी खाली राखिएको हो ।",
        "external_image_whitelist": " #यस पंक्तिलाई जस्ताको तस्तै छोड़नुहोस्<pre>\n#नियमित अभिव्यक्तिका निम्न टुक्राहरु हाल्नुहोस् ( //को बीचका भागहरु मात्र)\n#बाहिरका यु आर एल (hotlinked) सित मिलाइनेछ।\n#जो मिलानको शर्तमा पर्छन् तिनलाई चित्रको रुपमा प्रदर्शित गरिनेछ, नत्र चित्रको लिंक मात्र दर्शाइनेछ \n# #बाट सुरु हुने पंक्तिहरुलाई टिप्पणीको रुपमा मानिनेछ\n#यो वर्ण सम्वेदनशील छ\n\n#यो पंक्तिमाथि रिजेक्स(regex) टुक्रा दिनुहोस्। यस पंक्तिलाई जस्ताको तस्तै छोड़नुहोस्</pre>",
        "tags": "मान्य ट्याग परिवर्तनहरु",
        "tag-filter": "[[Special:Tags|पुच्छर]] फिल्टर:",
        "tag-filter-submit": "फिल्टर",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$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-edit": "सम्पादन गर्नुहोस्",
+       "tags-delete": "मेट्ने",
+       "tags-activate": "सक्रिय गर्ने",
+       "tags-deactivate": "निष्क्रिय गर्ने",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}",
+       "tags-manage-no-permission": "ट्याग मिलान गर्नको लागि तपाईँलाई अनुमति छैन।",
+       "tags-create-heading": "नयाँ ट्याग बनाउने",
+       "tags-create-tag-name": "ट्याग नाम:",
+       "tags-create-reason": "कारण:",
+       "tags-create-submit": "सृजना गर्ने",
+       "tags-delete-reason": "कारण:",
        "comparepages": "पृष्ठहरू दाँज्ने",
        "compare-page1": "पृष्ठ 1",
        "compare-page2": "पृष्ठ 2",
        "compare-revision-not-exists": "तपाईले खुलाउनु भएको संस्करण उपलब्ध छैन ।",
        "dberr-problems": "क्षमा पाउँ! यो साइटमा तकनीकी गड़बड़ी आइपरेकोछ।",
        "dberr-again": "केही समय पर्खिएर पुन: लोड हुन दिनुहोस् ।",
-       "dberr-info": "(डà¥\87à¤\9fाबà¥\87स à¤¸à¤°à¥\8dवर $1सित à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤¸à¤¾à¤§à¥\8dन à¤¸à¤\95िà¤\82दà¥\88न)",
-       "dberr-info-hidden": "(डà¥\87à¤\9fावà¥\87स à¤¸à¤°à¥\8dभरमा सम्पर्क स्थापना गर्न सकिएन)",
+       "dberr-info": "(डà¥\87à¤\9fाबà¥\87स à¤¸à¤°à¥\8dभर: $1 à¤¸à¤\81à¤\97 à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤¸à¥\8dथापित à¤\97रà¥\8dन à¤¸à¤\95िà¤\8fन)",
+       "dberr-info-hidden": "(डà¥\87à¤\9fाबà¥\87समा सम्पर्क स्थापना गर्न सकिएन)",
        "dberr-usegoogle": "तपाईले अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।",
        "dberr-outofdate": "कृपया स्मरणमा राख्नुहोस् हाम्रा लेखहरूको सूची जुन उनीहरूले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।",
        "dberr-cachederror": "यो अनुरोध गरिएको पृष्ठको क्याशमा रहेका प्रतिलिपी हो , र अद्यावधिक नहुन सक्छ ।",
        "htmlform-no": "हैन",
        "htmlform-yes": "हो",
        "htmlform-chosen-placeholder": "एक विकल्प छान्नुहोस्",
+       "htmlform-cloner-create": "अरू जोड्ने",
+       "htmlform-cloner-delete": "हटाउने",
        "sqlite-has-fts": "$1 पूरा पाठ खोज समर्थन सहित",
        "sqlite-no-fts": "$1 पूरा पाठ खोज समर्थन बिना",
-       "logentry-delete-restore": "$3 पृष्ठ $1ले पुनर्स्थापित गरेको हो",
+       "logentry-delete-restore": "$3 पृष्ठ $1ले {{GENDER:$2|पुनर्स्थापित}} गरेको हो",
        "revdelete-content-hid": "सामग्री लुकाइएको",
        "revdelete-summary-hid": "सम्पादन सारांस लुकाइएको",
        "revdelete-uname-hid": "प्रयोगकर्ताको नाम लुकाइयो",
        "revdelete-summary": "सम्पादन सारांश",
        "feedback-cancel": "रद्द गर्ने",
        "feedback-close": "गरियो",
+       "feedback-error-title": "त्रुटि",
        "feedback-error2": "त्रुटि: सम्पादन असफल",
        "feedback-message": "सन्देश:",
        "feedback-subject": "विषय:",
        "feedback-submit": "बुझाउने",
+       "feedback-thanks-title": "धन्यवाद!",
+       "feedback-useragent": "प्रयोगकर्ता एजेन्ट:",
        "searchsuggest-search": "खोज",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
index 8cd9178..1f9af94 100644 (file)
        "revdelete-submit": "Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}",
        "revdelete-success": "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
        "revdelete-failure": "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''\n$1",
-       "logdelete-success": "<strong>Zichtbaarheid van de gebeurtenis ingesteld.</strong>",
+       "logdelete-success": "Zichtbaarheid van de gebeurtenis ingesteld.",
        "logdelete-failure": "'''De zichtbaarheid van de logboekregel kon niet ingesteld worden:'''\n$1",
        "revdel-restore": "Zichtbaarheid wijzigen",
        "pagehist": "Geschiedenis",
        "notextmatches": "Geen pagina's gevonden",
        "prevn": "vorige {{PLURAL:$1|$1}}",
        "nextn": "volgende {{PLURAL:$1|$1}}",
+       "prev-page": "vorige pagina",
+       "next-page": "volgende pagina",
        "prevn-title": "Vorige {{PLURAL:$1|resultaat|$1 resultaten}}",
        "nextn-title": "Volgende {{PLURAL:$1|resultaat|$1 resultaten}}",
        "shown-title": "$1 {{PLURAL:$1|resultaat|resultaten}} per pagina weergeven",
        "emailccsubject": "Kopie van uw bericht aan $1: $2",
        "emailsent": "E-mail verzonden",
        "emailsenttext": "Uw e-mail is verzonden.",
-       "emailuserfooter": "Deze e-mail is verstuurd door $1 aan $2 door de functie \"Deze gebruiker e-mailen\" van {{SITENAME}}.",
+       "emailuserfooter": "Deze e-mail is verstuurd door $1 aan $2 door de functie \"{{int:emailpage}}\" van {{SITENAME}}.",
        "usermessage-summary": "Systeembericht achtergelaten",
        "usermessage-editor": "Systeembericht",
        "watchlist": "Volglijst",
        "import-interwiki-history": "Volledige geschiedenis van deze pagina ook kopiëren",
        "import-interwiki-templates": "Alle sjablonen opnemen",
        "import-interwiki-submit": "Importeren",
-       "import-interwiki-namespace": "Doelnaamruimte:",
-       "import-interwiki-rootpage": "Basispagina voor doel (optioneel):",
        "import-upload-filename": "Bestandsnaam:",
        "import-comment": "Opmerking:",
        "importtext": "Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt.\nSla de uitvoer op uw eigen computer op, en voeg die daarna hier toe.",
        "pageinfo-protect-cascading-yes": "Ja",
        "pageinfo-protect-cascading-from": "Pagina is beveiligd vanuit een andere pagina",
        "pageinfo-category-info": "Categoriegegevens",
+       "pageinfo-category-total": "Totaal aantal leden",
        "pageinfo-category-pages": "Aantal pagina's",
        "pageinfo-category-subcats": "Aantal subcategorieën",
        "pageinfo-category-files": "Aantal bestanden",
        "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.",
        "feedback-cancel": "Annuleren",
        "feedback-close": "Afgerond",
+       "feedback-error-title": "Fout",
        "feedback-error1": "Fout: onbekend resultaat uit de API",
        "feedback-error2": "Fout: de bewerking is mislukt",
        "feedback-error3": "Fout: geen reactie van de API",
index 4f1471e..cad960e 100644 (file)
        "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.",
+       "directorynotreadableerror": "Lo repertòri « $1 » es pas legible.",
        "filenotfound": "Impossible de trobar lo fichièr « $1 ».",
        "unexpected": "Valor imprevista : « $1 » = « $2 ».",
        "formerror": "Error: Impossible de sometre lo formulari",
        "rev-showdeleted": "afichar",
        "revisiondelete": "Suprimir/Restablir de versions",
        "revdelete-nooldid-title": "Cibla per la revision invalida",
-       "revdelete-nooldid-text": "Avètz pas precisat la o las revision(s) cibla(s) per utilizar aquesta foncion, la revision cibla existís pas, o alara la revision cibla es la qu'es en cors.",
+       "revdelete-nooldid-text": "Avètz pas precisat la o las revision(s) cibla(s) per aquesta foncion, o alara la revision especificada existís pas, o alara ensajatz d'amagar la revision actuala.",
        "revdelete-no-file": "Lo fichièr especificat existís pas.",
        "revdelete-show-file-confirm": "Sètz segur(a) que volètz veire la revision suprimida del fichièr « <nowiki>$1</nowiki> » datant del $2 a $3?",
        "revdelete-show-file-submit": "Òc",
        "notextmatches": "Cap de tèxte d'article correspond pas a la recèrca",
        "prevn": "{{PLURAL:$1|precedenta|$1 precedentas}}",
        "nextn": "{{PLURAL:$1|seguenta|$1 seguentas}}",
+       "prev-page": "pagina precedenta",
+       "next-page": "pagina seguenta",
        "prevn-title": "$1 {{PLURAL:$1|resultat precedent|resultats precedents}}",
        "nextn-title": "$1 {{PLURAL:$1|resultat seguent|resultats seguents}}",
        "shown-title": "Afichar $1 {{PLURAL:$1|resultat|resultats}} per pagina",
        "prefs-personal": "Entresenhas personalas",
        "prefs-rc": "Darrièrs cambiaments",
        "prefs-watchlist": "Lista de seguiment",
+       "prefs-editwatchlist": "Modificar la lista de seguiment",
+       "prefs-editwatchlist-label": "Modificar de títols de vòstra lista de seguiment",
+       "prefs-editwatchlist-raw": "Modificar la lista de seguiment en mòde brut",
+       "prefs-editwatchlist-clear": "Escafar la lista de seguiment",
        "prefs-watchlist-days": "Nombre de jorns d'afichar dins la lista de seguiment :",
        "prefs-watchlist-days-max": "(maximum $1 jorn{{PLURAL:$1||s}})",
        "prefs-watchlist-edits": "Nombre de modificacions d'afichar dins la lista de seguiment espandida :",
        "right-protect": "Modificar los nivèls de proteccion e modificar las paginas protegidas en cascada",
        "right-editprotected": "Modificar las paginas protegidas amb « {{int:protect-level-sysop}} »",
        "right-editsemiprotected": "Modificar las paginas protegidas amb « {{int:protect-level-autoconfirmed}} »",
+       "right-editcontentmodel": "Modificar lo modèl de contengut d’una pagina",
        "right-editinterface": "Modificar l'interfàcia d'utilizaire",
        "right-editusercssjs": "Modificar los fichièrs CSS e JS d'autres utilizaires",
        "right-editusercss": "Modificar los fichièrs CSS d'autres utilizaires",
        "unblocked": "[[User:$1|$1]] es estat desblocat",
        "unblocked-range": "$1 es estat desblocat",
        "unblocked-id": "Lo blocatge $1 es estat levat",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] es estat desblocat.",
        "blocklist": "Utilizaires blocats",
        "ipblocklist": "Utilizaires blocats",
        "ipblocklist-legend": "Cercar un utilizaire blocat",
        "import-interwiki-history": "Copiar totas las versions de l'istoric d'aquesta pagina",
        "import-interwiki-templates": "Enclure totes los modèls",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Espaci de noms de destinacion :",
-       "import-interwiki-rootpage": "Pagina raiç de destinacion (opcionala):",
        "import-upload-filename": "Nom del fichièr :",
        "import-comment": "Comentari :",
        "importtext": "Exportatz lo fichièr dempuèi lo wiki d’origina en utilizant [[Special:Export|aisina d'exportacion]].\nSalvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
        "tooltip-feed-atom": "Flux Atom per aquesta pagina",
        "tooltip-t-contributions": "Veire la lista de las contribucions d'aqueste utilizaire",
        "tooltip-t-emailuser": "Mandar un corrièr electronic a aqueste utilizaire",
+       "tooltip-t-info": "Mai d’informacion sus aquesta pagina",
        "tooltip-t-upload": "Mandar un imatge o fichièr mèdia sul servidor",
        "tooltip-t-specialpages": "Lista de totas las paginas especialas",
        "tooltip-t-print": "Version imprimibla d'aquesta pagina",
        "pageinfo-protect-cascading-yes": "Òc",
        "pageinfo-protect-cascading-from": "Las proteccions son dedusidas dempuèi",
        "pageinfo-category-info": "Informacions sus la categoria",
+       "pageinfo-category-total": "Nombre total de membres",
        "pageinfo-category-pages": "Nombre de paginas",
        "pageinfo-category-subcats": "Nombre de soscategorias",
        "pageinfo-category-files": "Nombre de fichièrs",
        "tags-tag": "Nom de la balisa",
        "tags-display-header": "Aparéncia dins las listas de modificacions",
        "tags-description-header": "Descripcion completa de la balisa",
+       "tags-source-header": "Font",
        "tags-active-header": "Actiu ?",
        "tags-hitcount-header": "Modificacions balisadas",
+       "tags-actions-header": "Accions",
        "tags-active-yes": "Òc",
        "tags-active-no": "Non",
+       "tags-source-extension": "Definida per una extension",
+       "tags-source-manual": "Aplicada manualament pels utilizaires e los bòts",
+       "tags-source-none": "Obsolèt",
        "tags-edit": "modificar",
+       "tags-delete": "suprimir",
+       "tags-activate": "activar",
+       "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambiament|cambiaments}}",
+       "tags-manage-no-permission": "Avètz pas la permission de gerir las modificacions de balisas.",
+       "tags-create-heading": "Crear una balisa novèla",
+       "tags-create-tag-name": "Nom de la balisa :",
+       "tags-create-reason": "Rason :",
+       "tags-create-submit": "Crear",
+       "tags-delete-title": "Suprimir la balisa",
+       "tags-delete-reason": "Motiu :",
+       "tags-activate-title": "Activar la balisa",
+       "tags-activate-reason": "Motiu :",
+       "tags-activate-submit": "Activar",
+       "tags-deactivate-title": "Desactivar la balisa",
+       "tags-deactivate-reason": "Motiu :",
+       "tags-deactivate-submit": "Desactivar",
+       "tags-edit-manage-link": "Gerir las balisas",
+       "tags-edit-existing-tags-none": "\"Pas cap\"",
        "comparepages": "Comparar de paginas",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "revdelete-uname-unhid": "nom d’utilizaire afichat",
        "revdelete-restricted": "aplicar las restriccions als administrators",
        "revdelete-unrestricted": "restriccions levadas pels administrators",
+       "logentry-block-block": "$1 {{GENDER:$2|a blocat}} {{GENDER:$4|$3}} $5 $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|a desblocat}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|a modificat}} los paramètres de blocatge per {{GENDER:$4|$3}} $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|a blocat}} {{GENDER:$4|$3}} $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|a modificat}} los paramètres de blocatge per {{GENDER:$4|$3}} $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|a importat}} $3 per telecargament de fichièr",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|a importat}} $3 dempuèi un autre wiki",
        "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-upload-upload": "$1 {{GENDER:$2|a mandat}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a telecargat}} una novèla version de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|a telecargat}} $3",
+       "log-name-managetags": "Jornal de las modificacions de balisas",
+       "logentry-managetags-create": "$1 {{GENDER:$2|a creat}} la balisa « $4 ».",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|a suprimit}} la balisa « $4 » (levada {{PLURAL:$5|d'una revision o entrada de jornal|de $5 revisions o entradas de jornal}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|a activat}} la balisa \"$4\" per l’usatge dels utilizaires e dels robòts",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|a desactivat}} la balisa « $4 » per l’usatge dels utilizaires e dels robòts",
        "rightsnone": "(cap)",
        "revdelete-summary": "modificar lo somari",
        "feedback-adding": "Apondon de vòstres comentaris a la pagina...",
+       "feedback-back": "Retorn",
        "feedback-bugcheck": "Remirable ! Verificatz simplament qu'es pas un dels [$1 bugs ja coneguts].",
        "feedback-bugnew": "Ai verificat. Senhalar un bug novèl",
        "feedback-cancel": "Anullar",
        "feedback-close": "Fach",
+       "feedback-external-bug-report-button": "Senhalar un bug tecnic",
+       "feedback-dialog-title": "Sometre un comentari",
+       "feedback-error-title": "Error",
        "feedback-error1": "Error : Resultat de l'IPA pas reconegut",
        "feedback-error2": "Error : la modificacion a fracassat",
        "feedback-error3": "Error : pas cap de responsa de l'API",
        "feedback-subject": "Subjècte :",
        "feedback-submit": "Mandar",
        "feedback-thanks": "Mercé ! Vòstre comentari es estat publicat sus la pagina \"[$2 $1]\".",
+       "feedback-thanks-title": "Mercés !",
+       "feedback-useragent": "Agent utilizaire :",
        "searchsuggest-search": "Recercar",
        "searchsuggest-containing": "que conten...",
        "api-error-badaccess-groups": "Sètz pas autorizat a cargar de fichièrs sus aqueste wiki.",
        "mediastatistics-header-text": "Textual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Formats compressats",
+       "json-error-state-mismatch": "JSON invalid o mal format",
        "json-error-syntax": "Error de sintaxi",
+       "headline-anchor-title": "Ligam cap a aquesta seccion",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin espandit",
        "special-characters-group-ipa": "API",
index a89a229..853ea0c 100644 (file)
@@ -15,9 +15,9 @@
                        "Macofe"
                ]
        },
-       "tog-underline": "ତଳà­\87 à¬¥à¬¿à¬¬à¬¾ à¬²à¬¿à¬\99à­\8dà¬\95:",
+       "tog-underline": "ଲିà¬\99à­\8dà¬\95ତଳà­\87à¬\97ାର à¬\9fାଣିବା:",
        "tog-hideminor": "ନିକଟରେ ହୋଇଥିବା ଛୋଟ ବଦଳସବୁକୁ ଲୁଚାଇବେ",
-       "tog-hidepatrolled": "ନà¬\97ଦ à¬¬à¬¦à¬³à¬°à­\87 à¬¥à¬¿à¬¬à¬¾ à¬\9cà¬\97ାହà­\8bଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
+       "tog-hidepatrolled": "ନà¬\97ଦ à¬¬à¬¦à¬³à¬°à­\87 à¬¨à¬¿à¬°à¬¿à¬\95à­\8dଷଣ à¬\95ରାଯାଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
        "tog-extendwatchlist": "କେବଳ ନଗଦ ହିଁ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ପାଇଁ ଦେଖଣାତାଲିକାକୁ ପୂରା ଦେଖାଇବେ",
        "tog-usenewrc": "ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା",
        "import-interwiki-history": "ଏହି ପୃଷ୍ଠା ନିମନ୍ତେ ସବୁଯାକ ସଂସ୍କରଣ ଇତିହାସ ନକଲ କରିନିଅନ୍ତୁ",
        "import-interwiki-templates": "ସବୁଯାକ ଛାଞ୍ଚ ଏହା ଭିତରେ ରଖିବେ",
        "import-interwiki-submit": "ଆମଦାନୀ",
-       "import-interwiki-namespace": "ଲକ୍ଷ ନେମସ୍ପେସ:",
-       "import-interwiki-rootpage": "ଲକ୍ଷସ୍ଥଳୀର ମୂଳ ପୃଷ୍ଠା(ଇଛାଧୀନ):",
        "import-upload-filename": "ଫାଇଲ ନାମ:",
        "import-comment": "ମତାମତ:",
        "importtext": "[[Special:Export|ରପ୍ତାନି ସୁବିଧା]] ବ୍ୟବହାର କରି ମୂଳ ଉଇକିରୁ ଫାଇଲଟି ରପ୍ତାନି କରନ୍ତୁ ।\nତାହାକୁ ଆପଣା କମ୍ପୁଟରରେ ସାଇତି ଏଠାରେ ଅପଲୋଡ଼ କରନ୍ତୁ ।",
index 6da17fe..b3b6c91 100644 (file)
        "rev-deleted-user-contribs": "[nazwa użytkownika lub adres IP usunięte – edycja ukryta we wkładzie]",
        "rev-deleted-text-permission": "Ta wersja strony została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
        "rev-suppressed-text-permission": "Ta wersja strony została <strong>ukryta</strong>.\nSzczegóły można odnaleźć w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze ukryć].",
-       "rev-deleted-text-unhide": "Ta wersja strony została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].\nJeśli chcesz możesz [$1 obejrzeć tę wersję].",
+       "rev-deleted-text-unhide": "Ta wersja strony została <strong>usunięta</strong>.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].\nJeśli chcesz, możesz [$1 obejrzeć tę wersję].",
        "rev-suppressed-text-unhide": "Ta wersja strony została '''utajniona'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze utajniania].\nJeśli chcesz możesz [$1 obejrzeć tę wersję].",
-       "rev-deleted-text-view": "Ta wersja strony została '''usunięta'''.\nJeśli chcesz możesz ją obejrzeć. Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
+       "rev-deleted-text-view": "Ta wersja strony została <strong>usunięta</strong>.\nJeśli chcesz, możesz ją obejrzeć. Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
        "rev-suppressed-text-view": "Ta wersja strony została '''utajniona'''.\nJeśli chcesz możesz ją obejrzeć. Szczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejestrze utajniania].",
        "rev-deleted-no-diff": "Nie możesz zobaczyć porównania wersji, ponieważ jedna z nich została '''usunięta'''.\nSzczegółowe informacje mogą znajdować się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze usunięć].",
        "rev-suppressed-no-diff": "Nie można wyświetlić różnic, ponieważ jedna z wersji została '''usunięta'''.",
        "listfiles-delete": "usuń",
        "listfiles-summary": "Na tej stronie specjalnej prezentowane są wszystkie przesłane pliki.",
        "listfiles_search_for": "Szukaj pliku o nazwie",
+       "listfiles-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
        "imgfile": "plik",
        "listfiles": "Lista plików",
        "listfiles_thumb": "Miniatura",
        "import-interwiki-history": "Kopiuj całą historię edycji tej strony",
        "import-interwiki-templates": "Załącz wszystkie szablony",
        "import-interwiki-submit": "Importuj",
-       "import-interwiki-namespace": "Docelowa przestrzeń nazw:",
-       "import-interwiki-rootpage": "Docelowa strona główna (opcjonalna):",
        "import-upload-filename": "Nazwa pliku",
        "import-comment": "Komentarz:",
        "importtext": "Korzystając na źródłowej wiki z narzędzia [[Special:Export|eksportu]] wyeksportuj plik.\nZapisz go na swoim dysku, a następnie prześlij go tutaj.",
        "pageinfo-protect-cascading-yes": "Tak",
        "pageinfo-protect-cascading-from": "Zabezpieczenie dziedziczone z",
        "pageinfo-category-info": "Informacje o kategorii",
+       "pageinfo-category-total": "Całkowita liczba członków",
        "pageinfo-category-pages": "Liczba stron",
        "pageinfo-category-subcats": "Liczba podkategorii",
        "pageinfo-category-files": "Liczba plików",
        "tags-deactivate-reason": "Powód:",
        "tags-deactivate-not-allowed": "Nie można dezaktywować znacznika „$1”.",
        "tags-deactivate-submit": "Dezaktywuj",
+       "tags-update-remove-not-allowed-one": "Znacznika „$1” nie można usunąć.",
+       "tags-edit-title": "Edycja znaczników",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Wybrana wersja|Wybrane wersje}} [[:$2]]:",
+       "tags-edit-existing-tags": "Istniejące znaczniki:",
+       "tags-edit-new-tags": "Nowe znaczniki:",
+       "tags-edit-add": "Dodaj te znaczniki:",
+       "tags-edit-remove": "Usuń te znaczniki:",
+       "tags-edit-remove-all-tags": "(usuń wszystkie znaczniki)",
+       "tags-edit-chosen-no-results": "Brak znaczników pasujących do",
+       "tags-edit-reason": "Powód:",
+       "tags-edit-revision-submit": "Zastosuj zmiany do {{PLURAL:$1|tej|$1}} wersji",
+       "tags-edit-success": "Zmiany zostały zastosowane.",
+       "tags-edit-failure": "Zmiany nie mogą być zastosowane:\n$1",
        "comparepages": "Porównanie stron",
        "compare-page1": "Strona 1",
        "compare-page2": "Strona 2",
        "expand_templates_generate_xml": "Pokaż drzewo analizatora składni w formacie XML",
        "expand_templates_generate_rawhtml": "Pokaż surowy HTML",
        "expand_templates_preview": "Podgląd",
+       "expand_templates_preview_fail_html": "<em>Ponieważ {{SITENAME}} ma włączony surowy kod HTML i zaistniała strata danych z sesji, podgląd jest ukryty jako zabezpieczenie przed atakiem JavaScript.</em>\n\n<strong>Jeśli to jest próba słusznego podglądu, proszę spróbować ponownie.</strong>\nJeśli to nadal nie działa, spróbuj [[Special:UserLogout|wylogować się]] i zalogować się z powrotem.",
        "pagelanguage": "Wybór języka strony",
        "pagelang-name": "Strona",
        "pagelang-language": "Język",
        "special-characters-group-thai": "Tajskie",
        "special-characters-group-lao": "Laotańskie",
        "special-characters-group-khmer": "Khmerskie",
-       "special-characters-title-endash": "krótka kreska",
-       "special-characters-title-emdash": "długa kreska",
+       "special-characters-title-endash": "półpauza",
+       "special-characters-title-emdash": "pauza",
        "special-characters-title-minus": "minus"
 }
index 1878fe7..04b979d 100644 (file)
        "emailccsubject": "Còpia dël mëssagi mandà a $1: $2",
        "emailsent": "Mëssagi eletrònich mandà",
        "emailsenttext": "Sò mëssagi eletrònich a l'é stàit mandà",
-       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «Mandé un mëssagi eletrònich a l'utent» ëd {{SITENAME}}.",
+       "emailuserfooter": "Ës mëssagi eletrònich a l'é stàit mandà da $1 a $2 con la fonsion «{{int:emailpage}}» ëd {{SITENAME}}.",
        "usermessage-summary": "A l'ha lassà un mëssagi ëd sistema.",
        "usermessage-editor": "Mëssagerìa ëd sistema",
        "watchlist": "Ròba che as ten sot-euj",
        "feedback-error1": "Eror: Arzultà ëd l'API nen arconossù",
        "feedback-error2": "Eror: Modìfica falìa",
        "feedback-error3": "Eror: gnun-e rispòste da l'API",
+       "feedback-error4": "Eror: Impossìbil publiché al tìtol ëd sugeriment dàit",
        "feedback-message": "Mëssagi:",
        "feedback-subject": "Soget:",
        "feedback-submit": "Spediss",
index 967fbd0..7c78c03 100644 (file)
        "showhideselectedversions": "ټاکلې بڼې ښکاره کول/پټول",
        "editundo": "ناکړ",
        "diff-empty": "(بې توپيره)",
+       "diff-multi-sameuser": "(د همدغه کارن لخوا {{PLURAL:$1|يوه منځوۍ بڼه نه ده ښکاره شوې|$1 منځوۍ بڼې نه دي ښکاره شوي}})",
        "searchresults": "د پلټنې پايلې",
        "searchresults-title": "د \"$1\" د پلټنې پايلې",
        "titlematches": "د مخ سرليک ورسره ورته دی",
        "notextmatches": "د هېڅ کوم مخ متن ورسره سمون نه خوري",
        "prevn": "تېر {{PLURAL:$1|$1}}",
        "nextn": "راتلونکي {{PLURAL:$1|$1}}",
+       "prev-page": "تېر مخ",
+       "next-page": "بل مخ",
        "prevn-title": "تېر $1 {{PLURAL:$1|پايله|پايلې}}",
        "nextn-title": "راتلونکې $1 {{PLURAL:$1|پايله|پايلې}}",
        "shown-title": "په هر مخ $1 {{PLURAL:$1|پايله|پايلې}} ښکاره کول",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
        "newuserlogpage": "د کارن-نوم د جوړېدو يادښت",
        "newuserlogpagetext": "دا د کارن-نوم د جوړېدو يادښت دی",
-       "rightslog": "د Ú©Ø§Ø±Ù\86 Ø¯ Ø±Ú\9aتÙ\88 Ù\8aادÚ\9aت",
-       "rightslogtext": "دا د کارن رښتو د بدلونونو يو يادښت دی",
+       "rightslog": "د کارن رښتو يادښت",
+       "rightslogtext": "دا د کارن رښتو د بدلونونو يو يادښت دی.",
        "action-read": "همدا مخ لوستل",
        "action-edit": "دا مخ سمول",
        "action-createpage": "مخونه جوړول",
        "recentchanges-legend-heading": "'''لنډونونه:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
-       "rclistfrom": "Ù\87غÙ\87 Ù\86Ù\88Ù\8a Ø¨Ø¯Ù\84Ù\88Ù\86Ù\88Ù\86Ù\87 Ú\9aکارÙ\87 Ú©Ù\88Ù\84 Ú\86Û\90 Ù\84Ù\87 $3 $2 Ù\86Ù\87 Ù¾Ù\8aÙ\84Û\90Ú\96Ù\8a",
+       "rclistfrom": "Ù\86Ù\88Ù\8a Ø¨Ø¯Ù\84Ù\88Ù\86Ù\88Ù\86Ù\87 Ú\86Û\90 Ù\84Ù\87 $3Ø\8c $2 Ú\85Ø®Ù\87 Ù¾Ù\8aÙ\84Û\90Ú\96Ù\8a Ú\9aکارÙ\87 Ú©Ù\88Ù\84",
        "rcshowhideminor": "وړې سمونې $1",
        "rcshowhideminor-show": "ښکاره کول",
        "rcshowhideminor-hide": "پټول",
        "listfiles-delete": "ړنگول",
        "listfiles-summary": "همدا ځانگړی مخ ټولې پورته شوې دوتنې ښکاره کوي.",
        "listfiles_search_for": "د رسنۍ نوم پلټنه:",
+       "listfiles-userdoesnotexist": "د \"$1\" گڼون نه دی ثبت شوی.",
        "imgfile": "دوتنه",
        "listfiles": "د دوتنو لړليک",
        "listfiles_thumb": "بټنوک",
        "deadendpagestext": "همدا لانديني مخونه په دغه ويکي کې د نورو مخونو سره تړنې نه لري.",
        "protectedpages": "ژغورلي مخونه",
        "protectedpages-indef": "يوازې بې پايه ژغورنې",
+       "protectedpages-summary": "په دې مخ کې هغه مخونه د لړليک په توگه راغلي چې دم مهال ژغورل شوي. د جوړولو څخه ژغورل شويو سرليکونو د يو لړليک لپاره [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] وگورئ.",
        "protectedpages-cascade": "يوازې ځوړاوبيزې ژغورنې",
        "protectedpages-timestamp": "وخت ټاپه",
        "protectedpages-page": "مخ",
        "protectedpages-unknown-timestamp": "ناجوت",
        "protectedpages-unknown-performer": "ناڅرگنده کارن",
        "protectedtitles": "ژغورلي سرليکونه",
+       "protectedtitles-summary": "په دې مخ کې هغه سرليکونه د لړليک په توگه راغلي چې دم مهال د جوړېدلو څخه ژغورل شوي. د ژغورلو مخونو د يو لړليک لپاره [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] وگورئ.",
        "listusers": "کارن لړليک",
        "listusers-editsonly": "يوازې هغه کارنان چې سمونونه يې کړي ښکاره کول",
        "listusers-creationsort": "د جوړېدو د نېټې له مخې اوډل",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
        "protectlogpage": "د ژغورنې يادښت",
+       "protectlogtext": "دلته لاندې د ژغورل شويو مخونو د بدلونونو لړليک راغلی.\nد دم گړۍ فعالو مخ ژغورنو لړليک لپاره د [[Special:ProtectedPages|ژغورل شويو مخونو لړليک]] وگورئ.",
        "protectedarticle": "\"[[$1]]\" وژغورل شو",
        "modifiedarticleprotection": "د \"[[$1]]\" لپاره د ژغورنې کچه بدله شوه",
        "movedarticleprotection": "د ژغورنې امستنې له \"[[$2]]\" څخه \"[[$1]]\" ته ولېږدېدې",
        "invert": "ټاکنې سرچپه کول",
        "tooltip-invert": "په ټاکلو نومتشيالونو کې (او اړونده نومتشيال کې که په نښه شوی وي) د مخونو بدلونونو د پټولو لپاره دا بکس په نښه کړئ",
        "namespace_association": "مل نومتشيال",
+       "tooltip-namespace_association": "د ټاکلي نومتشيال سره د سکالو نومتشيال اړوندولو او يا هم د خبرو اترو مخ شاملولو لپاره دا چوکاټ په نښه کړئ",
        "blanknamespace": "(آرنی)",
        "contributions": "{{GENDER:$1|کارن}} ونډې",
        "contributions-title": "د $1 کارن ونډې",
        "unblock": "کارن له بنديزه وېستل",
        "blockip": "په {{GENDER:$1|کارن}} بنديز لگول",
        "blockip-legend": "په کارن بنديز لگول",
+       "blockiptext": "د لاندينۍ فورمې په کارولو سره تاسې يو کارن او يا هم يوې ځانگړې IP پتې باندې د ليکلو بنديزونه لگولی شی.  \nدا بايد د پوهې سره دښمنۍ او ورانکارۍ د مخنيولو په تکل او د پښتو ويکيپېډيا د [[{{MediaWiki:Policy-url}}|تگلارې]] سره سم پلي شي.\nد بنديز لپاره مو يو ځانگړی دليل لاندې روښانه کړئ (د ساري په توگه، هغه مخونو ښکاره کول چې ورانکاري په کې ترسره شوې).",
        "ipaddressorusername": "IP پته يا کارن نوم",
        "ipbexpiry": "د پای نېټه:",
        "ipbreason": "سبب:",
        "ipbreason-dropdown": "*د بنديز ټولگړي سببونه\n** د ناسمو مالوماتو خپرول\n** د مخونو د مېنځپانگې ړنگول\n** په مخونو کې د باندنيو وېبځايونو بېکاره سپام تړنې ځايول\n** په مخونو کې بې مانا/چټياټ ځايول\n** په مخونو کې ناندرۍ راپارېدنې/د تاوتريخوالي خپرېدو ته هڅول\n** د گڼ شمېر گڼونونو نه ناوړه گټه اخيستل\n** نه مننونکی کارن-نوم کارول",
+       "ipb-hardblock": "د همدغې IP پتې کارونکو کارنانو مخنيوی کول",
        "ipbcreateaccount": "د گڼون جوړولو مخنيول",
        "ipbemailban": "د کارن لخوا په برېښليک رالېږلو بنديز",
+       "ipbenableautoblock": "په اتوماتيکه توگه د کارن په وروستنۍ IP پتې چې کارن کارولې، او هر هغو IP پتو باندې چې کارن د سمون هڅه ورباندې کړې بنديز لگول",
        "ipbsubmit": "په دې کارن بنديز لگول",
        "ipbother": "بل وخت:",
        "ipboptions": "2 ساعتونه:2 hours,1 ورځ:1 day,3 ورځې:3 days,1 اوونۍ:1 week,2 اوونۍ:2 weeks,1 مياشت:1 month,3 مياشتې:3 months,6 مياشتې:6 months,1 کال:1 year,نامحدوده:infinite",
        "emaillink": "برېښليک لېږل",
        "autoblocker": "په اتوماتيک ډول ستاسو مخنيوی شوی دا ځکه چې ستاسو IP پته وروستی ځل د \"[[User:$1|$1]]\" له خوا کارېدلې. او د $1 د مخنيوي سبب دا دی: \"$2\"",
        "blocklogpage": "د بنديز يادښت",
+       "blocklog-showlog": "په همدې کارن له پخوا څخه بنديز لگېدلی.\nد بنديز يادښت همدلته لاندې د سرچينې په توگه راغلی:",
+       "blocklog-showsuppresslog": "په همدې کارن له پخوا څخه بنديز لگېدلی او پټ شوی.\nد بنديز ځپل شوی يادښت همدلته لاندې د سرچينې په توگه راغلی:",
        "blocklogentry": "په [[$1]] بنديز لگېدلی چې د بنديز د پای وخت يې $2 $3 دی",
        "unblocklogentry": "بنديز ليرې شو $1",
        "block-log-flags-anononly": "يواځې ورکنومي کارنان",
        "pagemovedsub": "لېږدول په برياليتوب سره ترسره شوه",
        "movepage-moved": "'''د \"$1\" په نامه دوتنه، \"$2\" ته ولېږدېده'''",
        "movepage-moved-redirect": "يو مخ گرځونی جوړ شو.",
+       "movepage-moved-noredirect": "د يو مخ ورگرځېدنې جوړېدنه وځپل شوه.",
        "articleexists": "په همدې نوم يوه بله پاڼه د پخوا نه شته او يا خو دا نوم چې تاسې ټاکلی سم نه دی. لطفاً يو بل نوم وټاکۍ.",
        "movetalk": "د خبرو اترو اړونده مخ ورسره لېږدول",
        "movepage-page-moved": "د $1 مخ $2 ته ولېږدل شو.",
        "import-interwiki-history": "د دې مخ د پېښليک ټولې بڼې لمېسل",
        "import-interwiki-templates": "ټولې کينډۍ نغاړل",
        "import-interwiki-submit": "رالېږدول",
-       "import-interwiki-namespace": "د موخې نوم-تشيال:",
        "import-upload-filename": "د دوتنې نوم:",
        "import-comment": "تبصره:",
        "import-revision-count": "$1 {{PLURAL:$1|بڼه|بڼې}}",
        "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-firstuser": "مخ جوړونکی",
        "pageinfo-edits": "د ټولو سمونونو شمېر",
        "pageinfo-authors": "د بېلابېلو ليکوالو ټولټال شمېر",
        "pageinfo-recent-edits": "د وروستني سمونونو شمېر (په تېرو $1 کې)",
+       "pageinfo-recent-authors": "د بېلابېلو ليکوالو وروستنی شمېر",
        "pageinfo-toolboxlink": "د مخ مالومات",
        "pageinfo-redirectsto-info": "مالومات",
        "pageinfo-contentpage": "مېنځپانگيز مخ کې شمېرل شوی",
        "exif-iimcategory-sci": "ساينس او تخنيک",
        "exif-iimcategory-soi": "ټولنيزې چارې",
        "exif-iimcategory-spo": "سپورت",
-       "exif-iimcategory-war": "جګړه، تاوتريخوالی، او نارامي",
+       "exif-iimcategory-war": "جگړه، تاوتريخوالی، او نارامي",
        "exif-iimcategory-wea": "هوا",
        "exif-urgency-normal": "نورمال ($1)",
        "exif-urgency-low": "لږ ($1)",
        "external_image_whitelist": " #دا کرښه چې څنگه ده، همداسې پرېږدۍ<pre>\n#لاندې د منظمو اصطلاحگانو ټوټې (يوازې هغه برخه چې د // په مېنځ کې ليکلې) ځای پر ځای کړی\n#دا به د باندنيو انځورونو د يو آر اېل (hotlinked) سره مطابقه شي \n#هغه څه چې مطابقت لري هغه به د انځورونو په توگه ښکاره شي، کوم چې مطابقت نلري نو يوازې د انځور تړنه به ښکاره کېږي\n#هغه کرښې چې په # پيل کېږي د تبصرو په توگه په نظر کې نيول کېږي\n#دا کرښې د غټو تورو او وړو تورو سره حساسې نه دي\n\n#ټولې regex ټوټې د دغې کرښې نه پورته ځای پر ځای کړی. دا کرښه چې څنگه ده، همداسې يې پرېږدۍ</pre>",
        "tag-filter": "[[Special:Tags|نښلن]] چاڼگر:",
        "tag-filter-submit": "چاڼگر",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|نښلن|نښلنونه}}]]: $2)",
        "tags-display-header": "د بدلون په لړليکونو کې ښکارېدنه",
        "tags-description-header": "د مانا بشپړه څرگندونه",
        "tags-source-header": "سرچينه",
        "tags-activate-submit": "فعالول",
        "tags-deactivate-reason": "سبب:",
        "tags-deactivate-submit": "نافعالول",
+       "tags-edit-existing-tags-none": "''هېڅ''",
+       "tags-edit-reason": "سبب:",
        "comparepages": "مخونه پرتلل",
        "compare-page1": "۱ مخ",
        "compare-page2": "۲ مخ",
        "logentry-newusers-newusers": "د $1 کارن گڼون {{GENDER:$2|جوړ شو}}",
        "logentry-newusers-create": "د $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-upload-upload": "$1 $3 {{GENDER:$2|ورپورته يې کړ}}",
        "rightsnone": "(هېڅ)",
        "revdelete-summary": "لنډيز سمول",
index 26634b1..401f403 100644 (file)
@@ -79,7 +79,8 @@
                        "Webysther",
                        "Fasouzafreitas",
                        "RosaMafalda17",
-                       "Macofe"
+                       "Macofe",
+                       "TheEduGobi"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "index-category": "Páginas indexadas",
        "noindex-category": "Páginas não indexadas",
        "broken-file-category": "Páginas com links inválidos para arquivos",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Sobre",
        "article": "Página de conteúdo",
        "newwindow": "(abre em uma nova janela)",
        "versionrequired": "É necessária a versão $1 do MediaWiki",
        "versionrequiredtext": "Esta página requer a versão $1 do MediaWiki para ser utilizada.\nVeja a [[Special:Version|página sobre a versão do sistema]].",
        "ok": "OK",
+       "pagetitle": "$1 - {{SITENAME}}",
        "retrievedfrom": "Disponível em \"$1\"",
        "youhavenewmessages": "Você tem $1 ($2).",
        "youhavenewmessagesfromusers": "Você tem $1 de {{PLURAL:$3|outro usuário|$3 usuários}} ($2)",
        "site-atom-feed": "Feed Atom $1",
        "page-rss-feed": "Feed RSS de \"$1\"",
        "page-atom-feed": "Feed Atom de \"$1\"",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (página inexistente)",
        "sort-descending": "Ordenar por ordem descendente",
        "sort-ascending": "Ordenar por ordem ascendente",
        "laggedslavemode": "Aviso: a página poderá não conter atualizações recentes.",
        "readonly": "Banco de dados disponível no modo \"somente leitura\"",
        "enterlockreason": "Entre com um motivo para trancá-lo, incluindo uma estimativa de quando poderá novamente ser destrancado",
-       "readonlytext": "O banco de dados da {{SITENAME}} está atualmente bloqueado para novas entradas e outras modificações, provavelmente por uma manutenção rotineira; mais tarde voltará ao normal.\n\nQuem fez o bloqueio oferece a seguinte explicação: $1",
+       "readonlytext": "O banco de dados está atualmente bloqueado para novas entradas e outras modificações, provavelmente por uma manutenção rotineira; mais tarde voltará ao normal.\n\nO administrador que fez o bloqueio ofereceu a seguinte explicação: $1",
        "missing-article": "O banco de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nIsso normalmente é causado ao acessar um link de diferença (dif) desatualizado ou para o histórico de uma página que foi apagada.\n\nSe este não for o caso, você pode ter encontrado um defeito (bug) no software.\nAnote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].",
        "missingarticle-rev": "(revisão#: $1)",
        "missingarticle-diff": "(Dif.: $1, $2)",
        "wrongpassword": "A senha que introduziu é inválida. Por favor, tente novamente.",
        "wrongpasswordempty": "Foi fornecida uma senha em branco.\nTente novamente.",
        "passwordtooshort": "As senhas devem ter no mínimo {{PLURAL:$1|1 caractere|$1 caracteres}}.",
+       "passwordtoolong": "Senhas não podem ser maiores do que {{PLURAL:$1|1 caractere|$1 caracteres}}.",
        "password-name-match": "A sua senha deve ser diferente do seu nome de usuário.",
        "password-login-forbidden": "O uso deste nome de usuário e senha foi desautorizado.",
        "mailmypassword": "Redefinir senha",
        "history-feed-description": "Histórico de revisões para esta página neste wiki",
        "history-feed-item-nocomment": "$1 em $2",
        "history-feed-empty": "A página requisitada não existe.\nPoderá ter sido eliminada do wiki ou renomeada.\nTente [[Special:Search|pesquisar no wiki]] por páginas relevantes.",
+       "history-edit-tags": "Editar etiquetas das revisões selecionadas",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de usuário removido)",
        "rev-deleted-event": "(registros de detalhes eliminados)",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "nextn": "{{PLURAL:$1|próximo|próximos $1}}",
+       "prev-page": "página anterior",
+       "next-page": "próxima página",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "listfiles-delete": "apagar",
        "listfiles-summary": "Esta página especial mostra todos os arquivos carregados.",
        "listfiles_search_for": "Pesquisar por nome de mídia:",
+       "listfiles-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "imgfile": "arquivo",
        "listfiles": "Lista de arquivo",
        "listfiles_thumb": "Miniatura",
        "mimetype": "tipo MIME:",
        "download": "download",
        "unwatchedpages": "Páginas não vigiadas",
-       "listredirects": "Listar redirecionamentos",
+       "listredirects": "Lista de redirecionamentos",
        "listduplicatedfiles": "Lista de arquivos com duplicatas",
        "listduplicatedfiles-summary": "Esta é uma lista de arquivos, onde a versão mais recente do arquivo é uma duplicata da versão mais recente de algum outro arquivo. Somente os arquivos locais são considerados.",
        "listduplicatedfiles-entry": "O arquivo [[:File:$1|$1]] tem [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
        "import-interwiki-history": "Copiar todas as edições para esta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Domínio de destino:",
-       "import-interwiki-rootpage": "Página raiz de destino (opcional):",
        "import-upload-filename": "Nome do arquivo:",
        "import-comment": "Comentário:",
        "importtext": "Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].\nSalve o arquivo no seu computador e importe-o aqui.",
        "version-hook-name": "Nome do hook",
        "version-hook-subscribedby": "Subscrito por",
        "version-version": "($1)",
+       "version-no-ext-name": "[sem nome]",
        "version-license": "Licença do MediaWiki",
        "version-ext-license": "Licença",
        "version-ext-colheader-name": "Extensão",
        "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-reason": "Motivo:",
        "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-reason": "Motivo:",
        "tags-activate-submit": "Ativar",
        "tags-deactivate-title": "Desativar etiqueta",
        "tags-deactivate-submit": "Desativar",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
        "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-info-hidden": "(Não foi possível acessar o banco de dados)",
        "dberr-usegoogle": "Você pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
        "dberr-cachederror": "A seguinte página é uma cópia em cache da página pedida e pode não ser atual.",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "sumário de edição",
        "feedback-adding": "Adicionando os comentários na página...",
+       "feedback-back": "Voltar",
        "feedback-bugcheck": "Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].",
        "feedback-bugnew": "Eu verifiquei. Relatar um bug novo",
        "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.",
        "feedback-cancel": "Cancelar",
        "feedback-close": "Feito",
+       "feedback-dialog-title": "Enviar comentários",
+       "feedback-dialog-intro": "Você pode usar o simples formulário abaixo para enviar seus comentários. Os mesmos serão adicionados à página \"$1\", junto com seu nome de usuário.",
+       "feedback-error-title": "Erro",
        "feedback-error1": "Erro: O resultado da API não foi reconhecido",
        "feedback-error2": "Erro: A edição falhou",
        "feedback-error3": "Erro: A API não responde",
        "feedback-subject": "Assunto:",
        "feedback-submit": "Enviar",
        "feedback-thanks": "Obrigado! O seu comentário foi adicionado à página \"[$2 $1]\".",
+       "feedback-thanks-title": "Obrigado!",
        "searchsuggest-search": "Pesquisa",
        "searchsuggest-containing": "contendo...",
        "api-error-badaccess-groups": "Você não tem permissão para enviar arquivos para este wiki.",
index 1c1c8d6..5d64a78 100644 (file)
        "wrongpassword": "A palavra-passe que introduziu é inválida. Tente novamente, por favor.",
        "wrongpasswordempty": "A palavra-passe não foi introduzida. \nIntroduza-a, por favor.",
        "passwordtooshort": "A palavra-passe deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
+       "passwordtoolong": "A palavra-passe deve exceder $1 {{PLURAL:$1|carácter|caracteres}}.",
        "password-name-match": "A sua palavra-passe tem de ser diferente do seu nome de utilizador.",
        "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-passe.",
        "mailmypassword": "Reiniciar a palavra-passe",
        "history-feed-description": "Histórico de edições para esta página nesta wiki",
        "history-feed-item-nocomment": "$1 em $2",
        "history-feed-empty": "A página solicitada não existe.\nPode ter sido eliminada da wiki ou o nome sido alterado.\nTente [[Special:Search|pesquisar na wiki]] novas páginas relevantes.",
+       "history-edit-tags": "Editar etiquetas das revisões selecionadas",
        "rev-deleted-comment": "(resumo da edição suprimido)",
        "rev-deleted-user": "(nome de utilizador removido)",
        "rev-deleted-event": "(registos de detalhes eliminados)",
        "rev-showdeleted": "mostrar",
        "revisiondelete": "Eliminar/restaurar edições",
        "revdelete-nooldid-title": "Edição de destino inválida",
-       "revdelete-nooldid-text": "Ocorreu uma das seguintes: não especificou a revisão (ou revisões) de destino para realizar esta função, a revisão que especificou não existe, ou está tentando ocultar a revisão atual.",
+       "revdelete-nooldid-text": "Não especificou qualquer revisão (ou revisões) de destino para realizar esta função, ou a revisão que especificou não existe, ou está a tentar ocultar a revisão atual.",
        "revdelete-no-file": "O ficheiro especificado não existe.",
        "revdelete-show-file-confirm": "Tem a certeza de que quer ver uma revisão eliminada do ficheiro \"<nowiki>$1</nowiki>\" de $2 às $3?",
        "revdelete-show-file-submit": "Sim",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "nextn": "{{PLURAL:$1|posterior|$1 posteriores}}",
+       "prev-page": "página anterior",
+       "next-page": "página seguinte",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "listfiles-delete": "eliminar",
        "listfiles-summary": "Esta página especial mostra todos os ficheiros carregados.",
        "listfiles_search_for": "Pesquisar por nome de imagem:",
+       "listfiles-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "imgfile": "ficheiro",
        "listfiles": "Ficheiros",
        "listfiles_thumb": "Miniatura",
        "logempty": "Não há dados a apresentar.",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
+       "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
        "allpages": "Todas as páginas",
        "nextpage": "Página seguinte ($1)",
        "prevpage": "Página anterior ($1)",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"Contactar este utilizador\" em {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi enviada por $1 para $2 através da opção \"{{int:emailpage}}\" em {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "import-interwiki-history": "Copiar todo o histórico de revisões desta página",
        "import-interwiki-templates": "Incluir todas as predefinições",
        "import-interwiki-submit": "Importar",
-       "import-interwiki-namespace": "Domínio de destino:",
-       "import-interwiki-rootpage": "Raiz da página de destino (opcional):",
        "import-upload-filename": "Nome do ficheiro:",
        "import-comment": "Comentário:",
        "importtext": "Exporte o ficheiro da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].\nGrave o ficheiro no seu computador e importe-o aqui.",
        "pageinfo-protect-cascading-yes": "Sim",
        "pageinfo-protect-cascading-from": "As proteções são em cascata a partir de",
        "pageinfo-category-info": "Informações da categoria",
+       "pageinfo-category-total": "Número total de membros",
        "pageinfo-category-pages": "Número de páginas",
        "pageinfo-category-subcats": "Número de subcategorias",
        "pageinfo-category-files": "Número de ficheiros",
        "patrol-log-page": "Registo de edições patrulhadas",
        "patrol-log-header": "Este é um registo de edições patrulhadas.",
        "log-show-hide-patrol": "$1 registo de edições patrulhadas",
+       "log-show-hide-tag": "$1 registo de etiquetas",
        "deletedrevision": "Apagou a versão antiga $1",
        "filedeleteerror-short": "Erro ao eliminar ficheiro: $1",
        "filedeleteerror-long": "Foram encontrados erros ao tentar eliminar o ficheiro:\n\n$1",
        "tags-deactivate-reason": "Motivo:",
        "tags-deactivate-not-allowed": "Não é possível desativar a etiqueta \"$1\".",
        "tags-deactivate-submit": "Desativar",
+       "tags-apply-not-allowed-one": "A etiqueta \"$1\" não pode ser aplicada manualmente.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser aplicada|As seguintes etiquetas não podem ser aplicadas}} manualmente: $1",
+       "tags-update-add-not-allowed-one": "A etiqueta \"$1\" não pode ser adicionada manualmente.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser adicionada|As seguintes etiquetas não podem ser adicionadas}} manualmente: $1",
+       "tags-update-remove-not-allowed-one": "A remoção da etiqueta \"$1\" não é permitida.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser removida|As seguintes etiquetas não podem ser removidas}} manualmente: $1",
+       "tags-edit-title": "Editar etiquetas",
+       "tags-edit-manage-link": "Gerir etiquetas",
+       "tags-edit-logentry-legend": "Adicionar ou remover etiquetas {{PLURAL:$1|desta entrada de registo|de todas as $1 entradas de registo}}",
+       "tags-edit-existing-tags": "Etiquetas existentes:",
+       "tags-edit-existing-tags-none": "''Nenhuma''",
+       "tags-edit-new-tags": "Novas etiquetas:",
+       "tags-edit-add": "Adicionar estas etiquetas:",
+       "tags-edit-remove": "Remover estas etiquetas:",
+       "tags-edit-remove-all-tags": "(remover todas as etiquetas)",
+       "tags-edit-chosen-placeholder": "Selecione algumas etiquetas",
+       "tags-edit-reason": "Motivo:",
+       "tags-edit-success": "As alterações foram aplicadas com sucesso.",
+       "tags-edit-failure": "As alterações não puderam ser aplicadas:\n$1",
+       "tags-edit-none-selected": "Por favor, selecione pelo menos uma etiqueta para adicionar ou remover.",
        "comparepages": "Comparar páginas",
        "compare-page1": "Página 1",
        "compare-page2": "Página 2",
        "logentry-block-reblock": "$1 {{GENDER:$2|modificou}} parâmetros de bloqueio de {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} {{GENDER:$4|$3}} com expiração a $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|modificou}} parâmetros de bloqueio de {{GENDER:$4|$3}} com expiração a $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|importou}} $3 através de carregamento de ficheiro",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|importou}} $3 de outra wiki",
        "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-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 \"$4\" para uso de utilizadores e robôs.",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|desativou}} a etiqueta \"$4\" para uso de utilizadores e robôs.",
+       "log-name-tag": "Registo de etiquetas",
        "rightsnone": "(nenhum)",
        "revdelete-summary": "editar resumo",
        "feedback-adding": "A acrescentar os comentários à página...",
        "feedback-error1": "Erro: O resultado da API não foi reconhecido",
        "feedback-error2": "Erro: A edição falhou",
        "feedback-error3": "Erro: A API não responde",
+       "feedback-error4": "Erro: Não foi possível enviar o seu comentário sobre o título selecionado",
        "feedback-message": "Mensagem:",
        "feedback-subject": "Assunto:",
        "feedback-submit": "Enviar",
index 0992b49..f4d1e40 100644 (file)
                        "Jdforrester",
                        "Mar(c)",
                        "Pikne",
-                       "Tacsipacsi"
+                       "Tacsipacsi",
+                       "Totosunarto",
+                       "Macofe"
                ]
        },
        "sidebar": "{{notranslate}}",
        "history-feed-description": "Used as subtitle (description) of the RSS/Atom feed for a page history. See [{{canonicalurl:Main_Page|feed=atom&action=history}} example].",
        "history-feed-item-nocomment": "Title for each revision when viewing the RSS/Atom feed for a page history.\n\nParameters:\n* $1 - username\n* $2 - date/time\n* $3 - (Optional) date\n* $4 - (Optional) time",
        "history-feed-empty": "Used as summary of the RSS/Atom feed for a page history when the feed is empty.\nSee [{{canonicalurl:x|feed=atom&action=history}} example].",
+       "history-edit-tags": "Text of button used to access change tagging interface. For more information on tags see [[mw:Manual:Tags]].",
        "rev-deleted-comment": "Apparently this can also be about the reason of a log action, not only an edit summary. See also:\n*{{msg-mw|revdelete-hide-comment}}",
        "rev-deleted-user": "See also:\n* {{msg-mw|Rev-deleted-event}}",
        "rev-deleted-event": "See also:\n* {{msg-mw|Rev-deleted-user}}",
        "right-sendemail": "{{doc-right|sendemail}}",
        "right-passwordreset": "{{doc-right|passwordreset}}",
        "right-managechangetags": "{{doc-right|managechangetags}}",
+       "right-applychangetags": "{{doc-right|applychangetags}}",
+       "right-changetags": "{{doc-right|changetags}}",
        "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-editmyprivateinfo": "{{doc-action|editmyprivateinfo}}",
        "action-editcontentmodel": "{{doc-action|editcontentmodel}}",
        "action-managechangetags": "{{doc-action|managechangetags}}",
+       "action-applychangetags": "{{doc-action|applychangetags}}",
+       "action-changetags": "{{doc-action|changetags}}",
        "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}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "rcshowhideminor-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-show}}\n{{Identical|Hide}}",
        "rcshowhidebots": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}\n{{Identical|$1 bots}}",
-       "rcshowhidebots-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.\n\nSee also:\n* {{msg-mw|rcshowhidebots-show}}\n{{Identical|Show}}",
+       "rcshowhidebots-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.\n\nSee also:\n* {{msg-mw|rcshowhidebots-hide}}\n{{Identical|Show}}",
        "rcshowhidebots-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.\n\nSee also:\n* {{msg-mw|rcshowhidebots-hide}}\n{{Identical|Hide}}",
        "rcshowhideliu": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - any one of the following messages:\n** {{msg-mw|rcshowhideliu-show}}\n** {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Registered user}}",
        "rcshowhideliu-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Show}}",
        "listfiles-delete": "Text of the delete links next to the entries on [[Special:ListFiles]], surrounded by parentheses.\n{{Identical|Delete}}",
        "listfiles-summary": "This message is displayed at the top of [[Special:ImageList]] to explain how to use that special page.",
        "listfiles_search_for": "Input label for the form displayed on [[Special:ListFiles]].",
+       "listfiles-userdoesnotexist": "This message is displayed on [[Special:ListFiles]] when a invalid username is entered.",
        "imgfile": "{{Identical|File}}",
        "listfiles": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|File list}}",
        "listfiles_thumb": "{{Identical|Thumbnail}}",
        "logempty": "Used as warning when there are no items to show.",
        "log-title-wildcard": "* Appears in: [[Special:Log]]\n* Description: A check box to enable prefix search option",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
+       "log-edit-tags": "Text of button used to access change tagging interface. For more information on tags see [[mw:Manual:Tags]].",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
        "import-interwiki-history": "This is an option on [[Special:Import]]. Usually, when unchecked, only the first version of a page is imported. When you check the option, all versions are imported. This is important often to check for licensing reasons.\n\nSee also:\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}",
        "import-interwiki-templates": "Used as label for the checkbox in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}",
        "import-interwiki-submit": "Used as Submit button text in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n{{Identical|Import}}",
-       "import-interwiki-namespace": "Used as label in Import form on [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}",
-       "import-interwiki-rootpage": "Used on [[Special:Import]] as label.\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-comment}}\n* {{msg-mw|Import-interwiki-submit}}",
+       "import-mapping-default": "Used as label for the first of three radio buttons in Import form on [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-mapping-namespace}}\n* {{msg-mw|Import-mapping-subpage}}",
+       "import-mapping-namespace": "Used as label for the second of three radio buttons in Import form on [[Special:Import]]. The radio button is followed by a drop-down list from which the user can select a namespace.\n\nSee also:\n* {{msg-mw|Import-mapping-default}}\n* {{msg-mw|Import-mapping-subpage}}",
+       "import-mapping-subpage": "Used as label for the third of three radio buttons in Import form on [[Special:Import]]. The radio button is followed by a text box in which the user can type a page name. The imported pages will be created as subpages of the entered page name.\n\nSee also:\n* {{msg-mw|Import-mapping-default}}\n* {{msg-mw|Import-mapping-namespace}}",
        "import-upload-filename": "Used on [[Special:Import]] as label for upload of an XML file containing the pages to import.\n{{Identical|Filename}}",
        "import-comment": "Used as label for input box in [[Special:Import]].\n\nSee also:\n* {{msg-mw|Import-interwiki-history}}\n* {{msg-mw|Import-interwiki-templates}}\n* {{msg-mw|Import-interwiki-namespace}}\n* {{msg-mw|Import-interwiki-rootpage}}\n* {{msg-mw|Import-interwiki-submit}}\n{{Identical|Comment}}",
        "importtext": "Used in the Import form on [[Special:Import]].",
        "pageinfo-protect-cascading-yes": "Yes, protections are cascading from here\n*{{msg-mw|Pageinfo-protect-cascading}}\n*{{msg-mw|Pageinfo-protect-cascading-yes}}\n{{Identical|Yes}}",
        "pageinfo-protect-cascading-from": "Key for a list of pages where protections are cascading from",
        "pageinfo-category-info": "Showed on the page displaying information about the current page (add \"?action=info\" to the URL)",
+       "pageinfo-category-total": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}\n{{Identical|Number of pages}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
        "patrol-log-page": "{{doc-logpage}}",
        "patrol-log-header": "Text that appears above the log entries on the [[Special:log|patrol log]].",
        "log-show-hide-patrol": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
+       "log-show-hide-tag": "Used in [[Special:Log]]. Parameters:\n* $1 - link text; one of {{msg-mw|Show}} or {{msg-mw|Hide}}\n{{Related|Log-show-hide}}",
        "deletedrevision": "Used as log comment. Parameters:\n* $1 - archive name of old image",
        "filedeleteerror-short": "Used as error message. Parameters:\n* $1 – There are two uses: 1) filename or 2) more specific error message like {{msg-mw|Backend-fail-internal}}.\nSee also:\n* {{msg-mw|Filedeleteerror-long}}",
        "filedeleteerror-long": "Used as error message. Parameters:\n* $1 - ...\nSee also:\n* {{msg-mw|Filedeleteerror-short}}",
        "exif-locationdestcode": "Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf",
        "exif-objectcycle": "Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.\n\nSee also:\n* {{msg-mw|Exif-objectcycle-a}}\n* {{msg-mw|Exif-objectcycle-p}}\n* {{msg-mw|Exif-objectcycle-b}}",
        "exif-contact": "Contact information of the person responsible for the image.",
-       "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf",
+       "exif-writer": "The person who wrote the caption of the image. See Description Writer on page 18 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf\n{{Identical|Writer}}",
        "exif-languagecode": "Language of image/media.\n\nThis is taken from IPTC-iim 2:135 and XMP's dc:language.\n{{Identical|Language}}",
        "exif-iimversion": "IIM version number. Version of information interchange 2:xx records. 4 is current version. 2 is often seen as well. This is the value stored 2:00 field (Note, iptc-iim also stores a model version in 1:00. This version field displays the 2:00 record only)",
        "exif-iimcategory": "Primary Category of image (or other media). Technically supposed to be limited to 3 characters, however that is not always followed. Some common 3 letter category abbreviations are expanded by mediawiki. Similar to {{msg-mw|exif-keywords}}.\n{{Identical|Category}}",
        "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}}",
+       "tags-apply-no-permission": "Error message seen via the API when a user lacks the permission to apply change tags.",
+       "tags-apply-not-allowed-one": "Error message seen via the API when a user tries to apply a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
+       "tags-apply-not-allowed-multi": "Error message seen via the API when a user tries to apply more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
+       "tags-update-no-permission": "Error message seen via the API when a user lacks the permission to add or remove change tags after the fact.",
+       "tags-update-add-not-allowed-one": "Error message seen via the API when a user tries to add a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
+       "tags-update-add-not-allowed-multi": "Error message seen via the API when a user tries to add more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
+       "tags-update-remove-not-allowed-one": "Error message seen via the API when a user tries to remove a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
+       "tags-update-remove-not-allowed-multi": "Error message seen via the API when a user tries to remove more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
+       "tags-edit-title": "The title of a page where tags can be added or removed from selected revisions or log entries.\nFor more information on tags see [[mw:Manual:Tags]].",
+       "tags-edit-manage-link": "Text of a link to [[Special:Tags]], in imperative mood. Refers to the same thing as {{msg-mw|log-name-managetags}}.",
+       "tags-edit-revision-selected": "{{Identical|revdelete-selected-text}}\n\nSee also:\n* {{msg-mw|tags-edit-logentry-selected}}",
+       "tags-edit-logentry-selected": "{{Identical|logdelete-selected}}\n\nSee also:\n* {{msg-mw|tags-edit-revision-selected}}",
+       "tags-edit-revision-explanation": "Leave blank.\n\nSee also:\n* {{msg-mw|tags-edit-logentry-explanation}}",
+       "tags-edit-logentry-explanation": "Leave blank.\n\nSee also:\n* {{msg-mw|tags-edit-revision-explanation}}",
+       "tags-edit-revision-legend": "Form legend.\n\n$1 is the number of revisions.\n\nSee also:\n* {{msg-mw|tags-edit-logentry-legend}}",
+       "tags-edit-logentry-legend": "Form legend.\n\n$1 is the number of entries.\n\nSee also:\n* {{msg-mw|tags-edit-revision-legend}}",
+       "tags-edit-existing-tags": "Heading beneath which a list of tags already applied to the revision or log entry is presented.",
+       "tags-edit-existing-tags-none": "Shown when no tags are applied. Should be formatted differently (italicised or parenthesised).",
+       "tags-edit-new-tags": "Heading beneath which the user chooses which tags should be attached to the revision or log entry. They may add or remove tags.",
+       "tags-edit-add": "Heading beneath which the user picks which tags to add to the revision or log entry.",
+       "tags-edit-remove": "Heading beneath which the user picks which tags to remove from the revision or log entry.",
+       "tags-edit-remove-all-tags": "Check box label that the user selects when they want to remove all the tags from the revision or log entry.",
+       "tags-edit-chosen-placeholder": "Placeholder text on the jQuery Chosen input box where users can select zero or more tags.",
+       "tags-edit-chosen-no-results": "Message displayed by the jQuery Chosen input box when the user enters a string which doesn't match a known tag.\n\nDue to technical limitations, the user's input is not passed as a parameter to this message. The string the user entered is wrapped in quotation marks (\") and appended to the end of this string.",
+       "tags-edit-reason": "{{Identical|Reason}}",
+       "tags-edit-revision-submit": "Text of the submission button of the edit tag form for revisions.\n\nSee also:\n* {{msg-mw|tags-edit-logentry-submit}}",
+       "tags-edit-logentry-submit": "Text of the submission button of the edit tag form for log entries.\n\nSee also:\n* {{msg-mw|tags-edit-revision-submit}}",
+       "tags-edit-success": "Success message for the edit tag form.",
+       "tags-edit-failure": "Error message wrapper for the edit tag form.\n\nParameters:\n* $1 - additional error messages",
+       "tags-edit-nooldid-title": "Title for an error message ({{msg-mw|tags-edit-nooldid-text}}) for the edit tag form.",
+       "tags-edit-nooldid-text": "Error message for the edit tag form.\n\nSee also:\n* {{msg-mw|tags-edit-nooldid-title}}",
+       "tags-edit-none-selected": "Error message for the edit tag form.",
        "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-name-managetags": "The title of a log which contains entries related to the management of change tags. This includes creation and deletion of the tags themselves. \"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",
+       "log-name-tag": "The title of a log which contains entries related to applying and removing change tags from individual revisions or log entries. \"Tag\" here refers to the same thing as {{msg-mw|tags-tag}}.",
+       "log-description-tag": "The description of the tag log. \"Tag\" here refers to the same thing as {{msg-mw|tags-tag}}.",
+       "logentry-tag-update-add-revision": "{{Logentry|[[Special:Log/tag]]}}\n*$4 - revision ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags",
+       "logentry-tag-update-add-logentry": "{{Logentry|[[Special:Log/tag]]}}\n*$5 - log entry ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags",
+       "logentry-tag-update-remove-revision": "{{Logentry|[[Special:Log/tag]]}}\n*$4 - revision ID\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
+       "logentry-tag-update-remove-logentry": "{{Logentry|[[Special:Log/tag]]}}\n*$5 - log entry ID\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
+       "logentry-tag-update-revision": "{{Logentry|[[Special:Log/tag]]}}\n*$4 - revision ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
+       "logentry-tag-update-logentry": "{{Logentry|[[Special:Log/tag]]}}\n*$5 - log entry ID\n* $6 - list of tags that were added, separated by {{msg-mw|Comma-separator}}\n* $7 - number of added tags\n* $8 - list of tags that were removed, separated by {{msg-mw|Comma-separator}}\n* $9 - number of removed tags",
        "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}}",
        "feedback-error1": "Error message, appears when an unknown error occurs submitting feedback",
        "feedback-error2": "Error message, appears when we could not add feedback",
        "feedback-error3": "Error message, appears when we lose our connection to the wiki",
+       "feedback-error4": "Error message, appears when mediawiki.feedback or one of its dependencies is misconfigured or there is a problem fetching one of the modules",
        "feedback-message": "Label for a textarea; signature refers to a Wikitext signature.\n{{Identical|Message}}",
        "feedback-subject": "Label for a text input\n{{Identical|Subject}}",
        "feedback-submit": "Button label\n{{Identical|Submit}}",
        "log-name-pagelang": "Display entry for log name for changes in page language in Special:Log.",
        "log-description-pagelang": "Display description for log name for changes in page language in Special:Log.",
        "logentry-pagelang-pagelang": "{{Logentry}}\nAdditional parameters:\n* $4 - old language code, or \"[def]\" (hard-coded)\n* $5 - new language code, or \"[def]\" (hard-coded)",
-       "default-skin-not-found": "Message shown when the default skin for this MediaWiki installation can not be found.\n\nParameters:\n* $1: skin identifier for the default skin\n* $2: list of installed skins, composed using {{msg-mw|default-skin-not-found-row-enabled}} and {{msg-mw|default-skin-not-found-row-disabled}}\n* $3: code snippet to use to enable installed skins",
+       "default-skin-not-found": "Message shown when the default skin for this MediaWiki installation can not be found.\n\nParameters:\n* $1: skin identifier for the default skin\n* $2: list of installed skins, composed using {{msg-mw|default-skin-not-found-row-enabled}} and {{msg-mw|default-skin-not-found-row-disabled}}\n* $3: code snippet to use to enable installed skins\n* $4: Number of items in list $2\n* $5: Number of lines in $3, one per skin",
        "default-skin-not-found-no-skins": "Message shown when the default skin for this MediaWiki installation can not be found and the installation has no skins at all.\n\nParameters:\n* $1: name of the default skin",
        "default-skin-not-found-row-enabled": "One row of the list of installed skins shown as a part of the following message (for an enabled skin):\n* {{msg-mw|default-skin-not-found}}\n----\nParameters:\n* $1 - skin identifier\n* $2 - human-readable skin name\nSee also:\n* {{msg-mw|Default-skin-not-found-row-disabled}}",
        "default-skin-not-found-row-disabled": "One row of the list of installed skins shown as a part of the following message (for a disabled skin):\n* {{msg-mw|default-skin-not-found}}\n----\nParameters:\n* $1 - skin identifier\n* $2 - human-readable skin name\nSee also:\n* {{msg-mw|Default-skin-not-found-row-enabled}}",
index a3e56ef..8ce5c62 100644 (file)
        "history-feed-description": "Istoricul versiunilor pentru această pagină din wiki",
        "history-feed-item-nocomment": "$1 la $2",
        "history-feed-empty": "Pagina solicitată nu există.\nE posibil să fi fost ștearsă sau redenumită.\nÎncearcă să [[Special:Search|cauți]] pe wiki pentru pagini noi semnificative.",
+       "history-edit-tags": "Modifică etichetele versiunilor selectate",
        "rev-deleted-comment": "(descrierea modificării ștearsă)",
        "rev-deleted-user": "(nume de utilizator șters)",
        "rev-deleted-event": "(detaliile din jurnalul șterse)",
        "rev-showdeleted": "arată",
        "revisiondelete": "Ștergere/recuperare versiuni",
        "revdelete-nooldid-title": "Versiune invalidă",
-       "revdelete-nooldid-text": "Fie nu ați specificat versiunea pentru a efectua această\nfuncție, fie versiunea specificată nu există, ori sunteți pe cale să ascundeți versiunea curentă.",
+       "revdelete-nooldid-text": "Fie nu ați specificat versiunea-țintă pentru a efectua această\nfuncție, fie versiunea specificată nu există, ori sunteți pe cale să ascundeți versiunea curentă.",
        "revdelete-no-file": "Fișierul specificat nu există.",
        "revdelete-show-file-confirm": "Sigur doriți să vedeți versiunea ștearsă a fișierului „<nowiki>$1</nowiki>” din $2 ora $3?",
        "revdelete-show-file-submit": "Da",
        "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",
+       "right-applychangetags": "Aplică [[Special:Tags|etichete]] asociate modificărilor unui utilizator",
+       "right-changetags": "Adaugă și înlătură [[Special:Tags|etichete]] arbitrare din versiuni și intrări de jurnal individuale",
        "newuserlogpage": "Jurnal utilizatori noi",
        "newuserlogpagetext": "Acesta este jurnalul creărilor conturilor de utilizator.",
        "rightslog": "Jurnal permisiuni de utilizator",
        "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",
+       "action-applychangetags": "aplicați etichete asociate modificărilor dumneavoastră",
+       "action-changetags": "adăugați și să înlăturați etichete arbitrare din versiuni și intrări de jurnal individuale",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "enhancedrc-history": "istoric",
        "listfiles-delete": "șterge",
        "listfiles-summary": "Această pagină specială listează toate fișierele încărcate.",
        "listfiles_search_for": "Căutare fișiere după nume:",
+       "listfiles-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
        "imgfile": "fișier",
        "listfiles": "Listă fișiere",
        "listfiles_thumb": "Miniatură",
        "logempty": "Nici o înregistrare în jurnal.",
        "log-title-wildcard": "Caută titluri care încep cu acest text",
        "showhideselectedlogentries": "Arată/ascunde intrările selectate din jurnal",
+       "log-edit-tags": "Modifică etichetele intrărilor de jurnal selectate",
        "allpages": "Toate paginile",
        "nextpage": "Pagina următoare ($1)",
        "prevpage": "Pagina anterioară ($1)",
        "emailccsubject": "O copie a mesajului la $1: $2",
        "emailsent": "E-mail trimis",
        "emailsenttext": "E-mailul dumneavoastră a fost trimis.",
-       "emailuserfooter": "Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „Trimite e-mail” de la {{SITENAME}}.",
+       "emailuserfooter": "Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „{{int:emailpage}}” de la {{SITENAME}}.",
        "usermessage-summary": "a lăsat un mesaj de sistem",
        "usermessage-editor": "Mesager de sistem",
        "watchlist": "Pagini urmărite",
        "import-interwiki-history": "Copiază toate versiunile istoricului acestei pagini",
        "import-interwiki-templates": "Includeți toate formatele",
        "import-interwiki-submit": "Importă",
-       "import-interwiki-namespace": "Transferă către spațiul de nume:",
-       "import-interwiki-rootpage": "Pagina rădăcină de destinație (opțional):",
        "import-upload-filename": "Nume fișier:",
        "import-comment": "Comentariu:",
        "importtext": "Vă rugăm să exportați fișierul din wikiul sursă folosind [[Special:Export|utilitarul de exportare]].\nSalvați-l pe calculatorul dumneavoastră și încărcați-l aici.",
        "pageinfo-protect-cascading-yes": "Da",
        "pageinfo-protect-cascading-from": "Protecțiile provin în cascadă de la",
        "pageinfo-category-info": "Informații despre categorie",
+       "pageinfo-category-total": "Număr total de membri",
        "pageinfo-category-pages": "Număr de pagini",
        "pageinfo-category-subcats": "Număr de subcategorii",
        "pageinfo-category-files": "Număr de fișiere",
        "patrol-log-page": "Jurnal verificări",
        "patrol-log-header": "Aceasta este o listă a tuturor versiunilor marcate ca verificate.",
        "log-show-hide-patrol": "$1 jurnalul versiunilor verificate",
+       "log-show-hide-tag": "$1 jurnal etichete",
        "deletedrevision": "A fost ștearsă vechea versiune $1.",
        "filedeleteerror-short": "Eroare la ștergerea fișierului: $1",
        "filedeleteerror-long": "Au apărut erori când se încerca ștergerea fișierului:\n\n$1",
        "tags-deactivate-reason": "Motiv:",
        "tags-deactivate-not-allowed": "Nu este posibilă dezactivarea etichetei „$1”.",
        "tags-deactivate-submit": "Dezactivează",
+       "tags-apply-no-permission": "Nu aveți permisiunea să aplicați etichete de modificare asociate modificărilor dumneavoastră.",
+       "tags-apply-not-allowed-one": "Eticheta „$1” nu poate fi aplicată manual.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Următoarea etichetă|Următoarele etichete}} nu {{PLURAL:$2|poate fi aplicată|pot fi aplicate}} manual: $1",
+       "tags-update-no-permission": "Nu aveți permisiunea să adăugați și să înlăturați etichete de modificare din versiuni și intrări de jurnal individuale.",
+       "tags-update-add-not-allowed-one": "Eticheta „$1” nu poate fi adăugată manual.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Următoarea etichetă|Următoarele etichete}} nu {{PLURAL:$2|poate fi adăugată|pot fi adăugate}} manual: $1",
+       "tags-update-remove-not-allowed-one": "Eticheta „$1” nu poate fi ștearsă.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Următoarea etichetă|Următoarele etichete}} nu {{PLURAL:$2|poate fi ștearsă|pot fi șterse}} manual: $1",
+       "tags-edit-title": "Modificare etichete",
+       "tags-edit-manage-link": "Gestionare etichete",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Versiune selectată|Versiuni selectate}} pentru [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Eveniment din jurnal selectat|Evenimente din jurnal selectate}}:",
+       "tags-edit-revision-legend": "Adaugă sau înlătură etichete din {{PLURAL:$1|această versiune|toate cele $1 versiuni|toate cele $1 de versiuni}}",
+       "tags-edit-logentry-legend": "Adaugă sau înlătură etichete din {{PLURAL:$1|această intrare din jurnal|toate cele $1 intrări din jurnal|toate cele $1 de intrări din jurnal}}",
+       "tags-edit-existing-tags": "Etichete existente:",
+       "tags-edit-existing-tags-none": "''Niciuna''",
+       "tags-edit-new-tags": "Etichete noi:",
+       "tags-edit-add": "Se adaugă aceste etichete:",
+       "tags-edit-remove": "Se șterg aceste etichete:",
+       "tags-edit-remove-all-tags": "(șterge toate etichetele)",
+       "tags-edit-chosen-placeholder": "Alegeți câteva etichete",
+       "tags-edit-chosen-no-results": "Nicio etichetă nu se potrivește",
+       "tags-edit-reason": "Motiv:",
+       "tags-edit-revision-submit": "Aplică modificările {{PLURAL:$1|acestei versiuni|celor $1 versiuni|celor $1 de versiuni}}",
+       "tags-edit-logentry-submit": "Aplică modificările {{PLURAL:$1|acestei intrări din jurnal|celor $1 intrări din jurnal|celor $1 de intrări din jurnal}}",
+       "tags-edit-success": "Modificările au fost aplicate cu succes.",
+       "tags-edit-failure": "Modificările nu au putut fi aplicate:\n$1",
+       "tags-edit-nooldid-title": "Versiune-țintă nevalidă",
+       "tags-edit-nooldid-text": "Fie nu ați indicat nicio versiune-țintă pe care să aplicați această funcție, fie versiunea indicată nu există.",
+       "tags-edit-none-selected": "Alegeți cel puțin o etichetă pe care s-o adăugați sau s-o ștergeți.",
        "comparepages": "Comparație între pagini",
        "compare-page1": "Pagina 1",
        "compare-page2": "Pagina 2",
        "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",
+       "log-name-tag": "Jurnal etichete",
+       "log-description-tag": "Această pagină indică momentul în care utilizatorii au adăugat sau șters [[Special:Tags|etichete]] din versiuni sau intrări de jurnal individuale. Jurnalul nu afișează și acțiunile de etichetare care survin ca parte a unei modificări, ștergeri sau acțiuni similare.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|a adăugat}} {{PLURAL:$7|eticheta|etichetele}} $6 pentru versiunea $4 a paginii $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|a adăugat}} {{PLURAL:$7|eticheta|etichetele}} $6 pentru intrarea din jurnal $5 a paginii $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|a șters}} {{PLURAL:$9|eticheta|etichetele}} $8 din versiunea $4 a paginii $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|a șters}} {{PLURAL:$9|eticheta|etichetele}} $8 ale intrării din jurnal $5 a paginii $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|a actualizat}} etichetele pentru versiunea $4 a paginii $3 ({{PLURAL:$7|adăugat}} $6; {{PLURAL:$9|șters}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|a actualizat}} etichetele intrării din jurnal $5 a paginii $3 ({{PLURAL:$7|adăugat}} $6; {{PLURAL:$9|șters}} $8)",
        "rightsnone": "(niciunul)",
        "revdelete-summary": "descrierea modificărilor",
        "feedback-adding": "Se adaugă părerea pe pagină...",
        "feedback-error1": "Eroare: Rezultat necunoscut de la API",
        "feedback-error2": "Eroare: editarea nu a reușit",
        "feedback-error3": "Eroare: Niciun răspuns de la API",
+       "feedback-error4": "Eroare: Imposibil de publicat comentariile sub titlul furnizat",
        "feedback-message": "Mesaj:",
        "feedback-subject": "Subiect:",
        "feedback-submit": "Trimite",
index 35f8049..7bdaf27 100644 (file)
        "import-interwiki-history": "Copie tutte 'a sotrie de le versiune de sta pàgene",
        "import-interwiki-templates": "Inglude tutte le template",
        "import-interwiki-submit": "'Mborte",
-       "import-interwiki-namespace": "Namespace de destinazione:",
-       "import-interwiki-rootpage": "Pàgena prengepàale de destinazione (opzionale):",
        "import-upload-filename": "Nome d'u file:",
        "import-comment": "Commende:",
        "importtext": "Pe piacere esporte 'u file da 'a Uicchi sorgende ausanne l'[[Special:Export|utilità de esportazione]].\nReggistrele sus a 'u combiuter tune e carechele aqquà.",
        "tags-active-no": "None",
        "tags-edit": "cange",
        "tags-hitcount": "$1 {{PLURAL:$1|cangiamende|cangiaminde}}",
+       "tags-edit-new-tags": "Tag nuève:",
        "comparepages": "Combronde le pàggene",
        "compare-page1": "Pàgene 1",
        "compare-page2": "Pàgene 2",
        "expand_templates_remove_comments": "Live le commende",
        "expand_templates_remove_nowiki": "No fà vede le tag <nowiki> jndr'à 'u resultate",
        "expand_templates_generate_xml": "Fà vedè l'arvule de l'analisi XML",
-       "expand_templates_preview": "Andeprime"
+       "expand_templates_preview": "Andeprime",
+       "special-characters-group-latin": "Latine",
+       "special-characters-group-latinextended": "Latine estese",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simbole",
+       "special-characters-group-greek": "Greche",
+       "special-characters-group-cyrillic": "Cirilliche",
+       "special-characters-group-arabic": "Arabe",
+       "special-characters-group-arabicextended": "Estenziune arabe",
+       "special-characters-group-persian": "Persiane",
+       "special-characters-group-hebrew": "Ebbrèe",
+       "special-characters-group-bangla": "Bangladesciane",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "trattine en",
+       "special-characters-title-emdash": "trattine em",
+       "special-characters-title-minus": "segne mene"
 }
index 06b4b7b..93681e9 100644 (file)
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
        "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
-       "passwordtoolong": "Ð\9fаÑ\80олÑ\8c Ð½Ðµ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c   Ñ\81имволов.",
+       "passwordtoolong": "Ð\9fаÑ\80олÑ\8c Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82 Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c {{PLURAL:$1|1 Ñ\81имвол|$1 Ñ\81имволов|$1 Ñ\81имвола}}.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "listfiles-delete": "удалить",
        "listfiles-summary": "Эта служебная страница показывает все загруженные файлы.",
        "listfiles_search_for": "Поиск по имени файла:",
+       "listfiles-userdoesnotexist": "Учётная запись «$1» не зарегистрирована.",
        "imgfile": "файл",
        "listfiles": "Список файлов",
        "listfiles_thumb": "Миниатюра",
        "emailccsubject": "Копия вашего сообщения для $1: $2",
        "emailsent": "Письмо отправлено",
        "emailsenttext": "Ваше электронное сообщение отправлено.",
-       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «Письмо участнику» проекта {{SITENAME}}.",
+       "emailuserfooter": "Это письмо было отправлено {{GENDER:$2|участнику|участнице}} $2 от {{GENDER:$1|участника|участницы}} $1 с помощью функции «{{int:emailpage}}» проекта {{SITENAME}}.",
        "usermessage-summary": "Оставить системное сообщение.",
        "usermessage-editor": "Системная доставка",
        "watchlist": "Список наблюдения",
        "import-interwiki-history": "Копировать всю историю изменений этой страницы",
        "import-interwiki-templates": "Включить все шаблоны",
        "import-interwiki-submit": "Импортировать",
-       "import-interwiki-namespace": "Целевое пространство имён:",
-       "import-interwiki-rootpage": "Корневая страница (необязательно):",
        "import-upload-filename": "Имя файла:",
        "import-comment": "Примечание:",
        "importtext": "Пожалуйста, экспортируйте страницу из исходной вики, используя [[Special:Export|соответствующий инструмент]]. Сохраните файл на диск, а затем загрузите его сюда.",
        "tags-deactivate-reason": "Причина:",
        "tags-deactivate-not-allowed": "Невозможно отключить метку «$1».",
        "tags-deactivate-submit": "Отключить",
+       "tags-update-add-not-allowed-one": "Тег \"$1\" не может быть добавлен вручную.",
+       "tags-update-add-not-allowed-multi": "Следующее {{PLURAL:$2|tag is|tags are}} не может быть добавлено вручную: $1",
+       "tags-edit-title": "Редактировать теги",
+       "tags-edit-manage-link": "Управление тегами",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Выбранная версия|Выбранные версии}} [[:$2]]:",
+       "tags-edit-revision-legend": "Добавить или удалить теги из {{PLURAL:$1|this revision|all $1 revisions}}",
+       "tags-edit-logentry-legend": "Добавить или удалить теги из {{PLURAL:$1|this log entry|all $1 log entries}}",
+       "tags-edit-existing-tags": "Существующие метки:",
+       "tags-edit-existing-tags-none": "''Нет''",
+       "tags-edit-new-tags": "Новые метки:",
+       "tags-edit-add": "Добавить эти метки:",
+       "tags-edit-remove": "Удалить эти метки:",
+       "tags-edit-remove-all-tags": "(удалить все метки)",
+       "tags-edit-chosen-placeholder": "Выберите один или несколько тэгов",
+       "tags-edit-reason": "Причина:",
+       "tags-edit-none-selected": "Пожалуйста, выберите по крайней мере один тег, чтобы добавить или удалить.",
        "comparepages": "Сравнение страниц",
        "compare-page1": "Первая страница",
        "compare-page2": "Вторая страница",
        "logentry-managetags-create": "$1 создал{{GENDER:$2||а}} метку «$4»",
        "logentry-managetags-activate": "$1 активировал{{GENDER:$2||а}} метку «$4» для использования участниками и ботами",
        "logentry-managetags-deactivate": "$1 отключил{{GENDER:$2||а}} метку «$4» для использования участниками и ботами",
+       "log-name-tag": "Журнал меток",
        "rightsnone": "(нет)",
        "revdelete-summary": "описание изменений",
        "feedback-adding": "Добавление отзыва на страницу…",
        "log-name-pagelang": "Журнал изменения языка",
        "log-description-pagelang": "Это журнал изменений в языках страницы.",
        "logentry-pagelang-pagelang": "$1 изменил{{GENDER:$2||а}} язык страницы для $3 с $4 на $5.",
-       "default-skin-not-found": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nВаша установка, похоже, содержит следующие темы оформления. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n\n$ 2\n\n; Если вы только что установили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Загрузив [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Загрузив архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Клонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code  dir=\"ltr\">skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n; Если вы только что обновили MediaWiki:\n: MediaWiki версии 1.24 и новее больше не включает автоматически установленные темы (см. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВы можете вставить следующие строки в <code>LocalSettings.php</code>, чтобы включить все установленные темы оформления: \n\n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Если вы только что изменили <code>LocalSettings.php</code>:\n: Перепроверьте названия тем на наличие опечаток.",
+       "default-skin-not-found": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nВаша установка, похоже, содержит {{PLURAL:$4|следующую тему|следующие темы}} оформления. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить {{PLURAL:$4|её|их и выбрать тему по умолчанию}}.\n\n$2\n\n; Если вы только что установили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Загрузив [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Загрузив архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Клонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code  dir=\"ltr\">skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.\n; Если вы только что обновили MediaWiki:\n: MediaWiki версии 1.24 и новее больше не включает автоматически установленные темы (см. [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]).\nВы можете вставить {{PLURAL:$5|следующую строку|следующие строки}} в <code>LocalSettings.php</code>, чтобы включить {{PLURAL:$5|установленную в текущее время тему|все установленные в текущее время темы}} оформления: \n\n<pre dir=\"ltr\">$3</pre>\n\n\n; Если вы только что изменили <code>LocalSettings.php</code>:\n: Перепроверьте названия тем на наличие опечаток.",
        "default-skin-not-found-no-skins": "Упс! Тема оформления по умолчанию для вашей вики <code>$wgDefaultSkin</code>, <code>$1</code> недоступна.\n\nУ вас нет установленных тем оформления.\n\n; Если вы только что установили или обновили MediaWiki:\n: Вы, видимо, сделали это с Git или непосредственно из исходного кода с использованием другого способа. Тогда такое возможно. MediaWiki версии 1.24 и новее не содержат темы оформления в основном репозитории. Попробуйте установить некоторые темы из [https://www.mediawiki.org/wiki/Category:All_skins каталога тем оформления сайта mediawiki.org]:\n:* Загрузив [https://www.mediawiki.org/wiki/Download архив установочных файлов], который содержит несколько тем оформления и расширений. Вы можете скопировать папку <code>skins/</code> из него.\n:* Загрузив архивы отдельных тем оформления с [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Клонировав один из репозиториев <code>mediawiki/skins/*</code> через git в подпапку <code dir=\"ltr\">skins/</code> папки, куда установлена MediaWiki.\n: Это не должно навредить вашему репозиторию, если вы MediaWiki-разработчик. См. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] для получения информации о том, как включить темы оформления и выбрать тему по умолчанию.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''отключено''')",
index 7892473..67f3f43 100644 (file)
@@ -31,7 +31,7 @@
        "tog-shownumberswatching": "Aratâ numiru a utilizatorloru cari ti avinu",
        "tog-oldsig": "Cundiľeauâ di tora:",
        "tog-fancysig": "Saidiseaști cundiľeaua ca wikitext (fârâ unâ ligâturâ automatâ)",
-       "tog-uselivepreview": "Ufiliseaști previzualizarea tu chiro realu (experimentalu)",
+       "tog-uselivepreview": "Ufiliseaști previzualizarea live (experimentalu)",
        "tog-forceeditsummary": "Dzâ-ńi anda mi agârșescu s-fânirusescu alâxirili",
        "tog-watchlisthideown": "Ascundi alâxirili a meali la lista a ńia di avinari",
        "tog-watchlisthidebots": "Ascundi alâxirili a boțloru la lista a ńia di avinari",
        "hidden-category-category": "Categorii ascumsi",
        "category-subcat-count": "{{PLURAL:$2|Categoria conține mași subcategoria aestâ.|Categoria conțini {{PLURAL:$1|aestâ subcategorie|aesti $1 subcategorii}}, di-tu $2.}}",
        "category-subcat-count-limited": "Această categorie conțini {{PLURAL:$1|subcategorie|$1 subcategorii}}.",
+       "category-article-count": "{{PLURAL:$2|Categoria ari mași aestâ frândzâ.|{{PLURAL:$1|Frândza di dupâ|Alanti $1 frândzâ}} suntu tu aestâ categorie, di-tu unu totalu di $2.}}",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Frândzâ indexati",
        "noindex-category": "Frândzâ neindexati",
        "disclaimers": "Termeni",
        "disclaimerpage": "Project:Termeni",
        "edithelp": "Agiutoru trâ alâxiri",
+       "helppage-top-gethelp": "Agiutoru",
        "mainpage": "Prota frândzâ",
        "mainpage-description": "Prota frândzâ",
        "policy-url": "Project:Politicâ",
        "pt-login-button": "Leagâ-ti",
        "pt-createaccount": "Fă contu (isape)",
        "pt-userlogout": "Dizleagâ-ti",
+       "changeemail-none": "(țiva)",
+       "changeemail-submit": "Alâxire email",
        "bold_sample": "Scriari groasâ (bold)",
        "bold_tip": "Scriari groasâ (bold)",
        "italic_sample": "Scriari aplicatâ (italic)",
        "showpreview": "Previzualizare",
        "showdiff": "Aratâ alâxirile",
        "loginreqlink": "leagâ-ti",
+       "newarticle": "(Nou)",
        "lineno": "Linia $1:",
        "editundo": "turnari",
        "searchresults": "Rezultatili câftăriľei",
index c3df68d..aa1c8d5 100644 (file)
        "wrongpassword": "भवता/भवत्या लिखितः कूटशब्दः त्रुटियुक्तः । \nकृपया पुनः लिख्यताम् ।",
        "wrongpasswordempty": "कूटशब्दपेटिकायां कूटशब्दः न लिखितः ।\n\nकृपया पुनः प्रयासः क्रियताम् ।",
        "passwordtooshort": "न्यूनातिन्यूनं {{PLURAL:$1| 1 अक्षरात्मकः|$1 अक्षरात्मकः}} कूटशब्दः भवेदेव ।",
+       "passwordtoolong": "कूटशब्दः {{PLURAL:$1| 1 अक्षरात्|$1 अक्षरेभ्यः}} बृहत् न स्यात् ।",
        "password-name-match": "भवतः/भवत्याः प्रयोक्तृनाम, कूटशब्दः च समानः न भवेत् ।",
        "password-login-forbidden": "अस्य प्रयोक्तृनाम्नः कूटशब्दस्य च प्रयोगः वर्जितोऽस्ति ।",
        "mailmypassword": "कूटशब्दः परिवर्त्यताम्",
        "last": "पूर्वतनम्",
        "page_first": "प्रप्रथमम्",
        "page_last": "अन्तिमम्",
-       "histlegend": "भà¥\87दसà¥\8dय à¤\9aयनमà¥\8d : à¤\86वà¥\83तà¥\8dतिभà¥\87दसà¥\8dय à¤¦à¤°à¥\8dशनाय अग्रे प्रदत्ता रेडियो-मञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />\nनूतनसंस्करणम् = नूतनासु आवृत्तिषु भेदः, \n(पूर्वतनम्) = पूर्वतनासु आवृत्तिषु भेदः, (लघु) = लघु सम्पादनम्",
+       "histlegend": "भà¥\87दसà¥\8dय à¤\9aयनमà¥\8d : à¤\86वà¥\83तà¥\8dतिभà¥\87दà¤\82 à¤¦à¥\8dरषà¥\8dà¤\9fà¥\81मà¥\8d अग्रे प्रदत्ता रेडियो-मञ्जूषा नुद्यताम्, एण्टर्-कुड्मलं नुद्यताम्, अधः दत्तं कुड्मलं वा नुद्यताम् । <br />\nनूतनसंस्करणम् = नूतनासु आवृत्तिषु भेदः, \n(पूर्वतनम्) = पूर्वतनासु आवृत्तिषु भेदः, (लघु) = लघु सम्पादनम्",
        "history-fieldset-title": "अन्वेषणस्य इतिहासः",
        "history-show-deleted": "केवलम् अपाकृतम्",
        "histfirst": "पुरातनतमम्",
        "revdelete-unsuppress": "पुनस्स्थापितसंस्करणानां प्रतिबन्धः अपाक्रियताम्",
        "revdelete-log": "कारणम् :",
        "revdelete-submit": "{{PLURAL:$1|चित-संस्करणे|चित-संस्करणेषु}} प्रयोगं क्रियताम्",
-       "revdelete-success": "<strong>संस्करणस्य दृश्यता साफल्येन अद्यतनकृता </strong>",
-       "revdelete-failure": "<strong>संस्करणस्य दृश्यता अद्यतना नाभवत् </strong> $1",
-       "logdelete-success": "<strong>संरक्षिताऽऽवल्याः दृश्यता योग्यतया परिवर्तिता ।</strong>",
-       "logdelete-failure": "<strong>संरक्षिताऽऽवल्याः दृश्यता न परिवर्तिता ।</strong> $1",
+       "revdelete-success": "संस्करणस्य दृश्यता साफल्येन अद्यतनकृता",
+       "revdelete-failure": "संस्करणस्य दृश्यता अद्यतना नाभवत्  $1",
+       "logdelete-success": "संरक्षिताऽऽवल्याः दृश्यता योग्यतया परिवर्तिता ।",
+       "logdelete-failure": "संरक्षिताऽऽवल्याः दृश्यता न परिवर्तिता । $1",
        "revdel-restore": "दृश्यताम्/गोप्यताम्",
        "pagehist": "पृष्ठस्य इतिहासः",
        "deletedhist": "अपाकृतः इतिहासः",
        "notextmatches": "एषः शब्दः न कस्मिंश्चिदपि पृष्ठे अन्तर्भवति ।",
        "prevn": "पूर्वतनम् {{PLURAL:$1|$1}}",
        "nextn": "अग्रिमम् {{PLURAL:$1|$1}}",
+       "prev-page": "पूर्वतनं पृष्ठम्",
+       "next-page": "अग्रिमं पृष्ठम्",
        "prevn-title": "पूर्वतन{{PLURAL:$1|परिणामः|परिणामाः}}",
        "nextn-title": "अग्रिम{{PLURAL:$1|परिणामः|परिणामाः}}",
        "shown-title": "प्रत्येकस्मिन् पृष्ठे $1 {{PLURAL:$1|परिणामः दृश्यताम्|परिणामाः दृश्यन्ताम्}}",
        "right-autopatrol": "स्वस्य सम्पादनानि निरीक्षितत्वेन अङ्क्यन्ताम्",
        "right-patrolmarks": "नूतनपरिवर्तनेषु निरीक्षित-अङ्कनं दृश्यताम्",
        "right-unwatchedpages": "अदृष्टपृष्टानाम् आवलिः दृश्यताम्",
-       "right-mergehistory": "पृष्ठानाम् इतिहासम् वलीयताम्",
+       "right-mergehistory": "पà¥\83षà¥\8dठानामà¥\8d à¤\87तिहासमà¥\8d à¤µà¤¿à¤²à¥\80यतामà¥\8d",
        "right-userrights": "सर्वयोजकाधिकारः सम्पाद्यताम्",
        "right-userrights-interwiki": "अन्यविकि-जालस्थानानां योजकाधिकारः सम्पाद्यताम्",
        "right-siteadmin": "दत्तांशनिधिं किलतु, अकिलितं च करोतु",
        "right-override-export-depth": "यानि पुष्ठानि पञ्चस्तरपर्यन्तं संलग्नानि सन्ति, तेषां सर्वेषां निर्यातं करोतु ।",
-       "right-sendemail": "à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤\88-पतà¥\8dरà¤\82 à¤ªà¤¤à¥\8dरà¤\82 à¤ªà¥\8dरà¥\87षयतà¥\81",
+       "right-sendemail": "अन्ययोजकेभ्यः ई-पत्रं प्रेषयतु",
        "right-passwordreset": "निकुञ्चपुनारचितानां विद्युन्मानपत्राणाम् अवलोकनम् ।",
+       "right-managechangetags": "दत्तांशात् [[Special:Tags|चिह्नानि]] निर्मियन्ताम्, अपाक्रियन्तां च",
        "newuserlogpage": "प्रयोक्तृ-सृजन-सूचिका",
        "newuserlogpagetext": "अयं योजकनिर्माणास्य प्रवेशः ।",
        "rightslog": "प्रयोक्तृ-अधिकार-सूचिका",
        "action-createpage": "पुटानि सृजतु ।",
        "action-createtalk": "चर्चापुटानि सृजतु ।",
        "action-createaccount": "नूतनयोजकस्थानं निर्मातु ।",
+       "action-history": "पृष्ठस्य इतिहासः दृश्यताम्",
        "action-minoredit": "एतत्सम्पादनं लघु इति अङ्कयतु ।",
        "action-move": "एतत्पुटं चालयतु ।",
        "action-move-subpages": "एतत्पुटम् अस्य उपपुटानि च चालयतु ।",
        "action-move-rootuserpages": "मूलयोजकपुटानि चालयतु ।",
+       "action-move-categorypages": "वर्गपृष्ठानि चाल्यन्ताम्",
        "action-movefile": "एतां सञ्चिकां चालयतु ।",
        "action-upload": "एतां सञ्चिकाम् उत्तारयतु ।",
        "action-reupload": "स्थितसञ्चिकां पुनर्लिखतु ।",
        "action-siteadmin": "पाठमूलस्य निशेधनम् अनिशेधनं च ।",
        "action-sendemail": "विद्युन्मानपत्राणि प्रेषयतु ।",
        "nchanges": "$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}",
+       "enhancedrc-history": "इतिहासः",
        "recentchanges": "नूतनपरिवर्तनानि",
        "recentchanges-legend": "सद्यो जातानां परिवर्तनानां विकल्पाः",
-       "recentchanges-summary": "अस्मिन् विकि-प्रकल्पे सद्यो जातानि परिवर्तनानि दृश्यन्ताम् ।",
+       "recentchanges-summary": "à¤\85सà¥\8dमिनà¥\8d à¤µà¤¿à¤\95ि-पà¥\8dरà¤\95लà¥\8dपà¥\87 à¤¸à¤¦à¥\8dयà¥\8b à¤\9cातानि à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनानि à¤\85तà¥\8dर à¤¦à¥\83शà¥\8dयनà¥\8dतामà¥\8d à¥¤",
        "recentchanges-feed-description": "अस्मिन् विकि-प्रकल्पे सद्यो जातानि परिवर्तनानि दर्श्यन्ताम्",
        "recentchanges-label-newpage": "अनेन सम्पादनेन नूतनपृष्ठस्य रचना अभूत् ।",
        "recentchanges-label-minor": "इदं लघु सम्पादनम्",
        "recentchanges-label-unpatrolled": "एतावता अस्य सम्पादनस्य परिशीलिनं नाभूत् ।",
        "recentchanges-label-plusminus": "पृष्ठस्य आकारः एतावद्भिः बैट्स्-संख्याभिः परिवर्तितः",
        "recentchanges-legend-heading": "'''विकल्पविषयकम्'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|अत्र नूतनपृष्ठानाम् आवलिः]] अपि दृश्यताम्)",
        "rcnotefrom": "<strong>$2</strong> तः आरभ्य (<strong>$1</strong> पर्यन्तं) जातानि परिवर्तनानि अधः प्रदर्शितानि ।",
        "rclistfrom": "$3 $2 पश्चात् जातानि नूतनानि परिवर्तनानि दृश्यन्ताम्",
        "rcshowhideminor": "$1 लघुसम्पादनानि",
        "uploadnewversion-linktext": "अस्य पृष्ठस्य नूतनाम् आवृत्तिं उद्भारयतु",
        "shared-repo-from": "$1 इत्यस्मात् ।",
        "shared-repo": "विभक्तः कोशः ।",
-       "upload-disallowed-here": "दà¥\81रदà¥\83षà¥\8dà¤\9fवशातà¥\8d à¤\85सà¥\8dय à¤\9aितà¥\8dरसà¥\8dय उपरि पुनर्लेखनम् अशक्यम् ।",
+       "upload-disallowed-here": "à¤\85सà¥\8dयाà¤\83 à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ायाà¤\83 उपरि पुनर्लेखनम् अशक्यम् ।",
        "filerevert": "$1 अनुवर्तताम् ।",
        "filerevert-legend": "सञ्चिकाम् अनुवर्तताम् ।",
        "filerevert-intro": "भवान् '''[[Media:$1|$1]]''' इति सञ्चिकायाः  $4 इत्यवतरणं $3, $2 इति अनुवर्तमानः अस्ति ।",
        "import-interwiki-history": "एतत्पुटार्थं सर्वेतिहासान् पुनरावृत्तीः च प्रकृतीः करोतु ।",
        "import-interwiki-templates": "प्राकृतीः अनर्भावयतु ।",
        "import-interwiki-submit": "आयातं करोतु ।",
-       "import-interwiki-namespace": "लक्षितनामस्थानानि ।",
-       "import-interwiki-rootpage": "लक्षितमूलपुटम् । (ऐच्छिकम्)",
        "import-upload-filename": "सञ्चिकानाम",
        "import-comment": "टिप्पणी:",
        "importtext": "[[Special:Export|export utility]] एतेनानुबन्धेन स्रोतविकितः सञ्चिकानां निर्यातं करोतु । भवदीयसङ्गणके सुरक्ष्य अत्र उत्तारयतु ।",
        "tooltip-pt-mycontris": "भवतः/भवत्याः योगदानानाम् आवलिः",
        "tooltip-pt-login": "सम्प्रवेशाय प्रोत्सहामहे । परन्तु सम्प्रवेशः ऐच्छिकः ।",
        "tooltip-pt-logout": "निर्गमनम्",
+       "tooltip-pt-createaccount": "नूतनसदस्यतां प्राप्य प्रविश्यताम् इति सूच्यते किन्तु न एतद् अनिवार्यम्",
        "tooltip-ca-talk": "विषयसहितानां पृष्ठानां चर्चा",
        "tooltip-ca-edit": "इदं पृष्ठं सम्पादयितुं शक्यते । रक्षणात्पूर्वं कृपया प्राग्दृश्यं दृश्यताम् ।",
        "tooltip-ca-addsection": "नूतनविभागः आरभ्यताम्",
        "spam_reverting": "$1 इत्यनेन नानुबद्धनां प्राचीनपुनरावृत्तीनां पुनस्थापनं कुर्वन्ति ।",
        "spam_blanking": "सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः पूर्णपाठाः अपनीयन्ते ।",
        "spam_deleting": "सर्वाः पुनरावृत्तयः $1 इत्यस्य अनुबन्धाः । पूर्णपाठाः अपनीयन्ते ।",
-       "simpleantispam-label": "अनिष्टसन्देशविरोधपरीक्षणम् ।\nअस्मिन् '''नहि''' पूर्यताम् !",
+       "simpleantispam-label": "अनिष्टसन्देशविरोधपरीक्षणम् ।\nअस्मिन् <strong>न</strong> पूर्यताम् !",
        "pageinfo-title": "\"$1\" कृते सूचनाः ।",
        "pageinfo-not-current": "क्षम्यताम्, पुरातनाभ्यः आवृत्तिभ्यः एषा सूचना दातुं न शक्यते।",
        "pageinfo-header-basic": "मूलसूचनाः",
        "exif-primarychromaticities": "प्राथमिकस्य वर्णगुणः ।",
        "exif-ycbcrcoefficients": "वर्णाकाशस्य वर्गान्तरम् मॅट्रीक्स कोएफिशीयंट्स्",
        "exif-referenceblackwhite": "उल्लेखमौल्यस्य श्वेतकृष्णयुगम् ।",
-       "exif-datetime": "सञ्चिकापरिवर्तनस्य दिनाङ्कः समयः च ।",
+       "exif-datetime": "सञ्चिकापरिवर्तनस्य दिनाङ्कः समयः च",
        "exif-imagedescription": "चित्रशीर्षकम् ।",
        "exif-make": "चित्रग्राहिण्याः उत्पादकः ।",
        "exif-model": "चित्रग्राहिण्याः स्वरूपम् ।",
-       "exif-software": "तन्त्रांशः उपयुक्तः ।",
+       "exif-software": "तन्त्रांशः उपयुक्तः",
        "exif-artist": "लेखक",
        "exif-copyright": "स्वामित्वस्य धारकः ।",
        "exif-exifversion": "Exif आवृत्तिः ।",
        "exif-flashpixversion": "अनुमोदिता फ्लाश्पिक्स् आवृत्तिः ।",
-       "exif-colorspace": "वर्णावकाशः ।",
+       "exif-colorspace": "वर्णावकाशः",
        "exif-componentsconfiguration": "प्रत्येकं भागस्य अर्थः ।",
        "exif-compressedbitsperpixel": "चित्रसङ्कोचविधानम् ।",
        "exif-pixelydimension": "चित्रविस्तारः ।",
index 4d3bbf3..86f7d25 100644 (file)
        "pager-older-n": "{{PLURAL:$1|аҕа 1|аҕа $1}}",
        "suppress": "Кистээһин",
        "querypage-disabled": "Бу анал сирэй тиһилик үлэтин түргэтэтээри араарыллыбыт.",
+       "apihelp": "API-га көмө",
+       "apihelp-no-such-module": "\"$1\" муодул көстүбэтэ.",
        "booksources": "Кинигэлэр источниктара",
        "booksources-search-legend": "Кинигэ туһунан көрдөө",
        "booksources-search": "Бул",
        "protect-othertime": "Атын кэм:",
        "protect-othertime-op": "атын кэм",
        "protect-existing-expiry": "Билиҥҥи болдьоҕо: $3, $2",
+       "protect-existing-expiry-infinity": "Бүтэр болдьоҕо билигин: болдьоҕо суох",
        "protect-otherreason": "Атын/эбии төрүөтэ:",
        "protect-otherreason-op": "Атын төрүөт",
        "protect-dropdown": "*Уларытыыны хааччахтааһын сүрүн төрүөттэрэ\n** дьаныардаах вандааллааһын\n** наһаалыыр спаамнааһын\n** уларытыы мөккүөрүгэр аһара барыы\n** элбэхтик туттуллар сирэй",
        "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Билэни бастаан бэйэҥ көмпүүтэргэр суруй, онтон манна көһөр.",
        "importcantopen": "Импортанар билэ кыайан арыллыбат",
        "importbadinterwiki": "Интервики ыйынньык сыыһа",
        "importsuccess": "Импортааһын түмүктэннэ!",
-       "importnosources": "Ð\91иики Ñ\8bккÑ\80адÑ\8bнааÒ\95Ñ\8b Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82анаÑ\80 Ð±Ð¸Ð»Ñ\8d Ñ\82алÑ\8bллÑ\8bбаÑ\82аÑ\85, Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82Ñ\8bн ÐºÓ©Ò»Ó©Ñ\80Ò¯Ò¯ Ð°Ñ\80аÑ\85Ñ\81а Ñ\81Ñ\8bлдÑ\8cаÑ\80.",
+       "importnosources": "ЫлÑ\8bллаÑ\80 Ð±Ð¸Ð¸ÐºÐ¸ Ñ\8bйÑ\8bллÑ\8bбаÑ\82аÑ\85 Ð¾Ð½Ð¾Ð½ Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\81Ñ\83Ñ\80Ñ\83наалÑ\8bн ÐºÓ©Ò»Ó©Ñ\80Ò¯Ò¯ Ð°Ñ\80аÑ\85Ñ\81Ñ\8bбÑ\8bÑ\82.",
        "importnofile": "Импортанар билэ сатаан киллэриллибэтэ.",
        "importuploaderrorsize": "Файл ыйааhына наhаа улахан буолан хачайдааhын тохтотулунна.",
        "importuploaderrorpartial": "Хачайдааhын тохтотулунна. Файл сорҕото эрэ сурулунна.",
        "import-upload": "XML-дааннайдары киллэр",
        "import-token-mismatch": "Арахсан хаалбыт. Өссө киирэн көр.",
        "import-invalid-interwiki": "Бу биикиттэн импорт оҥорор сатаммат(а).",
-       "import-error-edit": "«$1» сирэй киллэриллибэтэ, тоҕо диэтэххэ кинини көннөрөрүҥ көҥүллэммэт эбит.",
+       "import-error-edit": "«$1» сирэй көһөрүллүбэтэ, тоҕо диэтэххэ кинини уларытарыҥ көҥүллэммэт эбит.",
        "import-error-create": "«$1» сирэй киллэриллибэтэ, тоҕо диэтэххэ кинини айарыҥ сатаммат эбит.",
        "import-error-interwiki": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ бу аат тас сигэлэргэ (интервикаҕа) аналлаах эбит.",
-       "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини баар аат далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
-       "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бобуллубут.",
+       "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини угуллубут аатын далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
+       "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бу биикигэ бобуулаах.",
        "import-error-unserialize": "«$1» сирэй $2 барыла структуураланар (десериализация) кыаҕа суох. Барылга иһинээҕитин модела маннык: $3, маннык серияланар: $4.",
        "import-options-wrong": "Алҕастаах {{PLURAL:$2|опция|опциялар}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Тирэх сирэй ыйыллыбыт аата алҕастаах.",
        "tags-active-no": "Суох",
        "tags-edit": "уларытыы",
        "tags-hitcount": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
+       "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» тиэк хайыы-үйэ баар эбит.",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "compare-page1": "Бастакы сирэй",
        "compare-page2": "Иккис сирэй",
index 39bcc39..4a7696d 100644 (file)
        "revdelete-unsuppress": "Elìmina le limitazzioni su li rivisioni ripristinati",
        "revdelete-log": "Mutivu:",
        "revdelete-submit": "Àpplica {{PLURAL:$1|â virsioni scigghiuta|ê virsioni scigghiuti}}",
-       "revdelete-success": "<strong>Visibbilitati dâ virsioni mpustata currittamenti.</strong>",
-       "revdelete-failure": "<strong>A visibbilitati dâ virsioni nun potti èssiri mpustata:</strong>\n$1",
-       "logdelete-success": "<strong>Visibbilitati di l'eventu mpustata currittamenti.</strong>",
+       "revdelete-success": "Visibbilitati dâ virsioni mpustata currittamenti.",
+       "revdelete-failure": "A visibbilitati dâ virsioni nun potti èssiri mpustata:\n$1",
+       "logdelete-success": "Visibbilitati di l'eventu mpustata currittamenti.",
        "logdelete-failure": "'''La visibilità dû eventu nun po essiri impustata:'''\n$1",
        "revdel-restore": "cancia la visibbilità",
        "pagehist": "Crunuluggìa dâ pàggina",
        "import-interwiki-history": "Copia la ntera cronoluggìa di sta pàggina",
        "import-interwiki-templates": "Includi tutti li template",
        "import-interwiki-submit": "Mporta",
-       "import-interwiki-namespace": "Trasfirisci li pàggini ntô namespace:",
-       "import-interwiki-rootpage": "Pàggina ràdica di distinazzioni (facultativu):",
        "import-upload-filename": "Nomu file:",
        "import-comment": "Oggettu:",
        "importtext": "Pi favuri, esporta lu file dâ wiki surgenti adupirannu [[Special:Export|a funziunalità d'espurtazzioni]].\nSàrvalu supra a' lu tò computer e carrìcalu ccà.",
index 7fde9ab..c337c98 100644 (file)
        "revdelete-unsuppress": "Remuiv restreections oan restored reveesions",
        "revdelete-log": "Raison:",
        "revdelete-submit": "Applie til selected {{PLURAL:$1|reveesion|reveesions}}",
-       "revdelete-success": "<strong>Reveesion veesibeelitie successfully updated.</strong>",
-       "revdelete-failure": "<strong>Reveesion veesibeelitie coudna be updated:</strong>\n$1",
-       "logdelete-success": "<strong>Log veesibeelitie successfully set.</strong>",
-       "logdelete-failure": "<strong>Log veesibddlitie coudna be set:</strong>\n$1",
+       "revdelete-success": "Reveesion veesibeelitie successfully updated.",
+       "revdelete-failure": "Reveesion veesibeelitie coudna be updated:\n$1",
+       "logdelete-success": "Log veesibeelitie successfully set.",
+       "logdelete-failure": "Log veesibddlitie coudna be set:\n$1",
        "revdel-restore": "chynge veesibeelitie",
        "pagehist": "Page histerie",
        "deletedhist": "Delytit histerie",
        "import-interwiki-history": "Copie aw histerie reveesions fer this page",
        "import-interwiki-templates": "Incluid aw templates",
        "import-interwiki-submit": "Import",
-       "import-interwiki-namespace": "Desteenation namespace:",
-       "import-interwiki-rootpage": "Desteenation ruit page (aen optie):",
        "import-upload-filename": "Filename:",
        "import-comment": "Comment:",
        "importtext": "Please export the file fae the soorce wiki uising the [[Special:Export|export utilitie]].\nHain it til yer computer n uplaid it here.",
        "import-rootpage-nosubpage": "Namespace \"$1\" o the ruit page disna permit subpages.",
        "importlogpage": "The Import log",
        "importlogpagetext": "Admeenistrateeve imports o pages wi eedit histerie fae ither wikis.",
-       "import-logentry-upload": "imported [[$1]] bi file uplaid",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit",
-       "import-logentry-interwiki": "transwikied $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit fae $2",
        "javascripttest": "JavaScript testin",
        "javascripttest-pagetext-noframework": "This page is reserved fer rinnin JavaScript tests.",
        "json-error-utf8": "Malformed UTF-8 chairacters, possiblie wranglie encoded",
        "json-error-recursion": "Yin or mair recurseeve references in the value tae be encoded",
        "json-error-inf-or-nan": "Yin or mair NAN or INF values in the value tae be encoded",
-       "json-error-unsupported-type": "Ae value o ae type that canna be encoded wis gien"
+       "json-error-unsupported-type": "Ae value o ae type that canna be encoded wis gien",
+       "special-characters-group-ipa": "IPA"
 }
index 8ec5156..abe5406 100644 (file)
        "revdelete-unsuppress": "Kankamandey kaa  filla willantey ga",
        "revdelete-log": "Dalil:",
        "revdelete-submit": "Kanandi {PLURAL:$1|filla}} kanante ga",
-       "revdelete-success": "<strong>Filla diiyan alkadar taagandi ka boori.</strong>",
-       "revdelete-failure": "<strong> Filla diiyan alkdar mana hin ka taagandi:</strong>\n$1",
-       "logdelete-success": "<strong>Hantum ceebandu diiyan alkadar kayandi ka boori.</strong>",
-       "logdelete-failure": "<strong>Hantum ceebandu diiyan alkdar mana kayandi:</strong>\n$1",
+       "revdelete-success": "Filla diiyan alkadar taagandi ka boori.",
+       "revdelete-failure": " Filla diiyan alkdar mana hin ka taagandi:\n$1",
+       "logdelete-success": "Hantum ceebandu diiyan alkadar kayandi ka boori.",
+       "logdelete-failure": "Hantum ceebandu diiyan alkdar mana kayandi:\n$1",
        "revdel-restore": "diiyan alkadar barmay",
        "pagehist": "Moo taariki",
        "deletedhist": "Taariku tuusante",
        "import-interwiki-history": "Taariki fillawey kul bere moɲoo woo se",
        "import-interwiki-templates": "Leetey kul dam",
        "import-interwiki-submit": "Dam",
-       "import-interwiki-namespace": "Toodoo maafarru:",
-       "import-interwiki-rootpage": "Toodoo linji moo (suuba-haya):",
        "import-upload-filename": "Tukumaa:",
        "import-comment": "Daara:",
        "importtext": "Tukoo fattandi ka hum aššil wiki ga nda [[Special:Export|fattandi goyjinaa]].\nA gaabu war ordinateroo ga nd'a zijandi ne.",
index ce40d75..646c332 100644 (file)
@@ -28,7 +28,8 @@
                        "Susith Chandira Gts",
                        "Thanushka",
                        "Thirsty",
-                       "Macofe"
+                       "Macofe",
+                       "Roonyh"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
        "tooltip-pt-mycontris": "ඔබගේ දායකත්වයන් ලැයිස්තුව‍",
        "tooltip-pt-login": "පිවිසීම කෙරෙහි ඔබ උද්‍යෝගිමත් කෙරෙයි. එහෙත්, එය අනිවාර්ය නැත",
        "tooltip-pt-logout": "නික්මීම",
+       "tooltip-pt-createaccount": "ඔබ ගිණුමක් තනා පිවිසෙන්නේ නම් මැනවි; කෙසේ වුවත්, එය අනිවාර්ය නොවේ.",
        "tooltip-ca-talk": "අන්තර්ගත පිටුව පිළිබඳ සාකච්ඡාව",
        "tooltip-ca-edit": "ඔබ‍ට මෙම පිටුව සංස්කරණය කල හැක. සුරැකීමට පෙර කරුණාකර පෙරදසුන බොත්තම භාවිතා කරන්න",
        "tooltip-ca-addsection": "නව ඡේදයක් අරඹන්න",
index 38a5e5a..c8e3716 100644 (file)
        "history-feed-description": "Zgodovina navedene strani {{GRAMMAR:rodilnik|{{SITENAME}}}}",
        "history-feed-item-nocomment": "$1 ob $2",
        "history-feed-empty": "Zahtevana stran ne obstaja.\nMorda je bila izbrisana iz wikija ali pa jo je kdo preimenoval.\nProsimo, poskusite [[Special:Search|poiskati v wikiju]] ustrezajoče nove strani.",
+       "history-edit-tags": "Uredi oznake izbranih redakcij",
        "rev-deleted-comment": "(povzetek urejanja je odstranjen)",
        "rev-deleted-user": "(uporabniško ime je bilo odstranjeno)",
        "rev-deleted-event": "(podrobnosti dnevnika so odstranjene)",
        "rev-showdeleted": "prikaži",
        "revisiondelete": "Izbriši/obnovi redakcije",
        "revdelete-nooldid-title": "Napačna ciljna redakcija",
-       "revdelete-nooldid-text": "Bodisi niste navedli ciljne spremembe, navedena sprememba ne obstaja, ali pa poskušate skriti trenutno spremembo.",
+       "revdelete-nooldid-text": "Bodisi niste navedli ciljne redakcije, na kateri želite izvesti dejanje, bodisi navedena redakcija ne obstaja ali pa poskušate skriti trenutno redakcijo.",
        "revdelete-no-file": "Navedena datoteka ne obstaja.",
        "revdelete-show-file-confirm": "Ali ste prepričani da si želite ogledati izbrisano verzijo datoteke \"<nowiki>$1</nowiki>\" od $2 ob $3?",
        "revdelete-show-file-submit": "Da",
        "right-sendemail": "Pošiljanje e-pošte drugim uporabnikom",
        "right-passwordreset": "Ogled e-pošt ponastavitve gesel",
        "right-managechangetags": "Ustvarjanje in brisanje [[Special:Tags|oznak]] iz zbirke podatkov",
+       "right-applychangetags": "Uveljavitev [[Special:Tags|oznak]] skupaj s spremembami",
+       "right-changetags": "Dodajanje in odstranjevanje poljubnih [[Special:Tags|oznak]] na posameznih redakcijah in dnevniških vnosih",
        "newuserlogpage": "Dnevnik registracij uporabnikov",
        "newuserlogpagetext": "Prikazan je dnevnik nedavnih registracij novih uporabnikov.",
        "rightslog": "Dnevnik uporabniških pravic",
        "action-editmyprivateinfo": "urejanje svojih zasebnih informacij",
        "action-editcontentmodel": "urejanje vsebinskega modela strani",
        "action-managechangetags": "ustvarjanje in brisanje oznak iz zbirke podatkov",
+       "action-applychangetags": "uveljavitev oznak skupaj z vašimi spremembami",
+       "action-changetags": "dodajanje in odstranjevanje poljubnih oznak na posameznih redakcijah in dnevniških vnosih",
        "nchanges": "$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od zadnjega obiska}}",
        "enhancedrc-history": "zgodovina",
        "listfiles-delete": "izbriši",
        "listfiles-summary": "Ta posebna stran prikazuje vse naložene datoteke.",
        "listfiles_search_for": "Išči po imenu datoteke:",
+       "listfiles-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
        "imgfile": "dat.",
        "listfiles": "Seznam datotek",
        "listfiles_thumb": "Sličica",
        "logempty": "O tej strani ni v dnevniku ničesar.",
        "log-title-wildcard": "Iskanje po naslovih, začenši s tem besedilom",
        "showhideselectedlogentries": "Pokaži/skrij izbrane dnevniške vnose",
+       "log-edit-tags": "Urejanje oznak izbranih dnevniških vnosov",
        "allpages": "Vse strani",
        "nextpage": "Naslednja stran ($1)",
        "prevpage": "Prejšnja stran ($1)",
        "emailccsubject": "Kopija tvojega sporočila iz $1: $2",
        "emailsent": "E-pismo je poslano!",
        "emailsenttext": "E-pismo je poslano.",
-       "emailuserfooter": "To e-poštno sporočilo je bilo poslano od $1 uporabniku $2 preko funkcije »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
+       "emailuserfooter": "To e-poštno sporočilo je bilo poslal(-a) $1 uporabniku $2 s funkcijo »{{int:emailpage}}« na {{GRAMMAR:dative|{{SITENAME}}}}.",
        "usermessage-summary": "Pusti sistemsko sporočilo.",
        "usermessage-editor": "Sistemski sporočevalec",
        "watchlist": "Spisek nadzorov",
        "import-interwiki-history": "Kopiraj vse dosedanje redakcije te strani",
        "import-interwiki-templates": "Vključi vse predloge",
        "import-interwiki-submit": "Uvozi",
-       "import-interwiki-namespace": "Prenesi strani v imenski prostor:",
-       "import-interwiki-rootpage": "Ciljna korenska stran (neobvezno):",
+       "import-mapping-default": "Uvozi na privzeta nahajališča",
+       "import-mapping-namespace": "Uvozi v imenski prostor:",
+       "import-mapping-subpage": "Uvozi kot podstrani naslednje strani:",
        "import-upload-filename": "Ime datoteke:",
        "import-comment": "Komentar:",
        "importtext": "Prosimo, izvozite datoteko z izvornega wikija s pomočjo [[Special:Export|orodja za izvoz]].\nShranite jo na vaš računalnik in naložite tukaj.",
        "pageinfo-protect-cascading-yes": "Da",
        "pageinfo-protect-cascading-from": "Zaščite se dedujejo od",
        "pageinfo-category-info": "Informacije o kategoriji",
+       "pageinfo-category-total": "Skupno število članov",
        "pageinfo-category-pages": "Število strani",
        "pageinfo-category-subcats": "Število podkategorij",
        "pageinfo-category-files": "Število datotek",
        "patrol-log-page": "Dnevnik patrulje",
        "patrol-log-header": "To je dnevnik nadzorovanih redakcij.",
        "log-show-hide-patrol": "$1 dnevnik nadzora",
+       "log-show-hide-tag": "$1 dnevnik oznak",
        "deletedrevision": "Prejšnja redakcija $1 je izbrisana",
        "filedeleteerror-short": "Napaka pri brisanju datoteke: $1",
        "filedeleteerror-long": "Pri brisanju datoteke so se pojavile napake:\n\n$1",
        "tags-deactivate-reason": "Razlog:",
        "tags-deactivate-not-allowed": "Oznake »$1« ni možno dezaktivirati.",
        "tags-deactivate-submit": "Dezaktiviraj",
+       "tags-apply-no-permission": "Nimate dovoljenja za uveljavljanje sprememb oznak skupaj z vašimi spremembami.",
+       "tags-apply-not-allowed-one": "Oznake »$1« ni mogoče uveljaviti ročno.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Naslednje oznake|Naslednji oznaki|Naslednjih oznak}} ni mogoče uveljaviti ročno: $1",
+       "tags-update-no-permission": "Nimate dovoljenja za dodajanje ali odstranjevanje oznak na posameznih redakcijah ali dnevniških vnosih.",
+       "tags-update-add-not-allowed-one": "Oznake »$1« ni mogoče dodati ročno.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Naslednje oznake|Naslednji oznaki|Naslednjih oznak}} ni mogoče dodati ročno: $1",
+       "tags-update-remove-not-allowed-one": "Oznake »$1« ni mogoče odstraniti.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Naslednje oznake|Naslednji oznaki|Naslednjih oznak}} ni mogoče odstraniti ročno: $1",
+       "tags-edit-title": "Urejanje oznak",
+       "tags-edit-manage-link": "Upravljanje oznak",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Izbrana redakcija|Izbrani redakciji|Izbrane redakcije}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Izbran dnevniški vnos|Izbrana dnevniška vnosa|Izbrani dnevniški vnosi}}:",
+       "tags-edit-revision-legend": "Dodaj ali odstrani oznake od {{PLURAL:$1|redakcije|obeh $1 redakcij|vseh $1 redakcij}}",
+       "tags-edit-logentry-legend": "Dodaj ali odstrani oznake od {{PLURAL:$1|dnevniškega vnosa|obeh $1 dnevniških vnosov|vseh $1 dnevniških vnosov}}",
+       "tags-edit-existing-tags": "Obstoječe oznake:",
+       "tags-edit-existing-tags-none": "''Nobena''",
+       "tags-edit-new-tags": "Nove oznake:",
+       "tags-edit-add": "Dodaj oznake:",
+       "tags-edit-remove": "Odstrani oznake:",
+       "tags-edit-remove-all-tags": "(odstrani vse oznake)",
+       "tags-edit-chosen-placeholder": "Izberite nekaj oznak",
+       "tags-edit-chosen-no-results": "Nismo našli ujemajočih oznak",
+       "tags-edit-reason": "Razlog:",
+       "tags-edit-revision-submit": "Uveljavi spremembe na {{PLURAL:$1|redakciji|$1 redakcijah}}",
+       "tags-edit-logentry-submit": "Uveljavi spremembe na {{PLURAL:$1|dnevniškem vnosu|$1 dnevniških vnosih}}",
+       "tags-edit-success": "Spremembe smo uspešno uveljavili.",
+       "tags-edit-failure": "Sprememb nismo mogli uveljaviti:\n$1",
+       "tags-edit-nooldid-title": "Neveljavna ciljna redakcija",
+       "tags-edit-nooldid-text": "Bodisi niste navedli ciljne redakcije, na kateri želite izvesti dejanje, bodisi navedena redakcija ne obstaja.",
+       "tags-edit-none-selected": "Prosimo, izberite vsaj eno oznako, ki jo želite dodati ali odstraniti.",
        "comparepages": "Primerjaj strani",
        "compare-page1": "Stran 1",
        "compare-page2": "Stran 2",
        "logentry-managetags-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} oznako »$4« (odstranjena iz $5 {{PLURAL:$5|redakcije ali dnevniškega vnosa|redakcij in/ali dnevniških vnosov}})",
        "logentry-managetags-activate": "$1 je {{GENDER:$2|aktiviral|aktivirala|aktiviral(-a)}} oznako »$4« za uporabnike in bote",
        "logentry-managetags-deactivate": "$1 je {{GENDER:$2|dezaktiviral|dezaktivirala|dezaktiviral(-a)}} oznako »$4« za uporabnike in bote",
+       "log-name-tag": "Dnevnik oznak",
+       "log-description-tag": "Stran prikazuje, kdaj so uporabniki dodali ali odstranili [[Special:Tags|oznake]] od posameznih redakcij ali dnevniških vnosov. Dnevnik ne navaja dejanj označevanja, ki so del urejanj, izbrisov ali podobnih dejanj.",
+       "logentry-tag-update-add-revision": "$1 je {{GENDER:$2|dodal|dodala|dodal(-a)}} {{PLURAL:$7|1=oznako|2=oznaki|oznake}} $6 redakciji $4 strani $3",
+       "logentry-tag-update-add-logentry": "$1 je {{GENDER:$2|dodal|dodala|dodal(-a)}} {{PLURAL:$7|1=oznako|2=oznaki|oznake}} $6 dnevniškemu vnosu $5 strani $3",
+       "logentry-tag-update-remove-revision": "$1 je {{GENDER:$2|odstranil|odstranila|odstranil(-a)}} {{PLURAL:$9|1=oznako|2=oznaki|oznake}} $8 redakciji $4 strani $3",
+       "logentry-tag-update-remove-logentry": "$1 je {{GENDER:$2|odstranil|odstranila|odstranil(-a)}} {{PLURAL:$9|1=oznako|2=oznaki|oznake}} $8 dnevniškemu vnosu $5 strani $3",
+       "logentry-tag-update-revision": "$1 je {{GENDER:$2|posodobil|posodobila|posodobil(-a)}} oznake redakcije $4 strani $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|odstranjeno}} $8)",
+       "logentry-tag-update-logentry": "$1 je {{GENDER:$2|posodobil|posodobila|posodobil(-a)}} oznake dnevniškega vnosa $5 strani $3 ({{PLURAL:$7|dodano}} $6; {{PLURAL:$9|odstranjeno}} $8)",
        "rightsnone": "(nobeno)",
        "revdelete-summary": "povzetek urejanja",
        "feedback-adding": "Dodajanje povratne informacije na stran ...",
        "feedback-error1": "Napaka: Neznan rezultat iz API",
        "feedback-error2": "Napaka: Urejanje je spodletelo",
        "feedback-error3": "Napaka: Ni odgovora od API",
+       "feedback-error4": "Napaka: Ne morem objaviti navedenega naslova povratnih informacij",
        "feedback-message": "Sporočilo:",
        "feedback-subject": "Zadeva:",
        "feedback-submit": "Pošlji",
        "log-name-pagelang": "Dnevnik spreminjanja jezika",
        "log-description-pagelang": "Dnevnik sprememb jezika strani.",
        "logentry-pagelang-pagelang": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} jezik strani $3 z jezika $4 na jezik $5.",
-       "default-skin-not-found": "Ups! Privzeta koža vašega wikija, določena v <code dir=\"ltr\">$wgDefaultSkin</code> kot <code>$1</code>, ni na voljo.\n\nKot kaže, vaša namestitev vsebuje kože, navedene spodaj. Oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priročnik: Konfiguracija kož] za več informacij, kako jih omogočiti in nastaviti kot privzete.\n\n$2\n\n; Če ste MediaWiki pravkar namestili:\n: Verjetno ste ga namestili z git ali neposredno iz izvorne kode na kakšen drug način. To je pričakovano. Poskusite namestiti nekaj kož z [https://www.mediawiki.org/wiki/Category:All_skins imenika kož mediawiki.org] tako:\n:* Prenesite [https://www.mediawiki.org/wiki/Download namestitveni program tarball], ki vsebuje nekaj kož in razširitev. Iz njega lahko kopirate in prilepite mapo <code>skins/</code>.\n:* Prenesite tarballe posamezne kož z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klonirajte enega od repozitorijev <code>mediawiki/skins/*</code> z git v mapo <code dir=\"ltr\">skins/</code> vaše namestitve MediaWiki.\n: Če ste razvijalec MediaWiki, to ne sme poseči v vaš repozitorij git.\n\n; Če ste MediaWiki pravkar posodobili:\n: MediaWiki 1.24 in novejši nameščenih kož več ne omogočijo samodejno (oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priročnik: Samodejno odkrivanje kož]). V <code>LocalSettings.php</code> lahko prilepite naslednje vrstice, da omogočite trenutno nameščene kože:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Če ste pravkar spremenili <code>LocalSettings.php</code>:\n: Ponovno preverite imena kož, če ste se morda zatipkali.",
+       "default-skin-not-found": "Ups! Privzeta koža vašega wikija, določena v <code dir=\"ltr\">$wgDefaultSkin</code> kot <code>$1</code>, ni na voljo.\n\nKot kaže, vaša namestitev vsebuje {{PLURAL:$4|kožo, navedeno|koži, navedeni|kože, navedene}} spodaj. Oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priročnik: Konfiguracija kož] za več informacij, kako {{PLURAL:$4|jo omogočiti in nastaviti kot privzeto|ju omogočiti in nastaviti kot privzeti|jih omogočiti in nastaviti kot privzete}}.\n\n$2\n\n; Če ste MediaWiki pravkar namestili:\n: Verjetno ste ga namestili z git ali neposredno iz izvorne kode na kakšen drug način. To je pričakovano. Poskusite namestiti nekaj kož z [https://www.mediawiki.org/wiki/Category:All_skins imenika kož mediawiki.org] tako:\n:* Prenesite [https://www.mediawiki.org/wiki/Download namestitveni program tarball], ki vsebuje nekaj kož in razširitev. Iz njega lahko kopirate in prilepite mapo <code>skins/</code>.\n:* Prenesite tarballe posamezne kož z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klonirajte enega od repozitorijev <code>mediawiki/skins/*</code> z git v mapo <code dir=\"ltr\">skins/</code> vaše namestitve MediaWiki.\n: Če ste razvijalec MediaWiki, to ne sme poseči v vaš repozitorij git.\n\n; Če ste MediaWiki pravkar posodobili:\n: MediaWiki 1.24 in novejši nameščenih kož več ne omogočijo samodejno (oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Priročnik: Samodejno odkrivanje kož]). V <code>LocalSettings.php</code> lahko prilepite {{PLURAL:$5|naslednjo vrstico|naslednji vrstici|naslednje vrstice}}, da omogočite trenutno {{PLURAL:$4|nameščeno kožo|nameščeni koži|nameščene kože}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Če ste pravkar spremenili <code>LocalSettings.php</code>:\n: Ponovno preverite imena kož, če ste se morda zatipkali.",
        "default-skin-not-found-no-skins": "Ups! Privzeta koža vašega wikija, določena v <code dir=\"ltr\">$wgDefaultSkin</code> kot <code>$1</code>, ni na voljo.\n\nNimate nameščenih kož.\n\n; Če ste MediaWiki pravkar namestili ali posodobili:\n: Verjetno ste ga namestili z git ali neposredno iz izvorne kode na kakšen drug način. To je pričakovano. MediaWiki 1.24 in novejši nimajo vključene nobene kože v glavnem repozitoriju. Poskusite namestiti nekaj kož z [https://www.mediawiki.org/wiki/Category:All_skins imenika kož mediawiki.org] tako:\n:* Prenesite [https://www.mediawiki.org/wiki/Download namestitveni program tarball], ki vsebuje nekaj kož in razširitev. Iz njega lahko kopirate in prilepite mapo <code dir=\"ltr\">skins/</code>.\n:* Prenesite tarballe posamezne kož z [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klonirajte enega od repozitorijev <code>mediawiki/skins/*</code> z git v mapo <code>skins/</code> vaše namestitve MediaWiki.\n: Če ste razvijalec MediaWiki, to ne sme poseči v vaš repozitorij git. Oglejte si [https://www.mediawiki.org/wiki/Manual:Skin_configuration Priročnik: Konfiguracija kož] za več informacij, kako jih omogočiti in nastaviti kot privzete.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (omogočeno)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''onemogočeno''')",
index b538424..dee7937 100644 (file)
        "emailsend": "Dir",
        "emailccme": "E-mail iigu soo dir fariinteyda oo koobi ah.",
        "emailsent": "E-mailka waa la diray",
-       "emailsenttext": "Fariintaadii E-mailka aheeyd waa la diray.",
+       "emailsenttext": "Farriintaadii E-mailka ahayd waa la diray.",
        "watchlist": "Liiska-waardiyaha",
        "mywatchlist": "Liiska-waardiyaha",
        "watchlistfor2": "Ku socoto $1 $2",
        "actioncomplete": "Amarka waa la'dhamaystiray",
        "actionfailed": "Shaqada waad ku guul dareesatay",
        "dellogpage": "Tirtiraha guda galaheeda",
-       "rollback_short": "Soo celi",
        "rollbacklink": "dib u soo celi",
        "rollbacklinkcount-morethan": "soo celinta in kabadan $1 {{PLURAL:$1|badal|badallo}}",
        "revertpage": "Wuxuu dib u noqay badalkii oo sameeyay  [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) kuna celiyay badalkii ka  danbeeyay oo sameeyay  [[User:$1|$1]]",
index bf05562..79b7d88 100644 (file)
        "missing-article": "Текст странице под називом „$1“ ($2) није пронађен.\n\nУзрок ове грешке је обично застарела измена или веза до обрисане странице.\n\nАко се не ради о томе, онда сте вероватно пронашли грешку у софтверу.\nПријавите је [[Special:ListUsers/sysop|администратору]] уз одговарајућу везу.",
        "missingarticle-rev": "(измена#: $1)",
        "missingarticle-diff": "(разлика: $1, $2)",
-       "readonly_lag": "Ð\91аза Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\98е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана Ð´Ð¾Ðº Ñ\81е Ñ\81поÑ\80едни Ð±Ð°Ð·Ð½Ð¸ Ñ\81еÑ\80веÑ\80и Ð½Ðµ Ñ\83Ñ\81кладе с главним.",
+       "readonly_lag": "Ð\91аза Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\98е Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ана Ð´Ð° Ð±Ð¸ Ñ\81е Ñ\81екÑ\83ндаÑ\80ни Ñ\81еÑ\80веÑ\80и Ð±Ð°Ð·Ðµ Ð¿Ð¾Ð´Ð°Ñ\82ака Ñ\83Ñ\81кладили с главним.",
        "internalerror": "Унутрашња грешка",
        "internalerror_info": "Унутрашња грешка: $1",
        "filecopyerror": "Не могу да умножим датотеку „$1“ у „$2“.",
        "userinvalidcssjstitle": "'''Упозорење:''' не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ажурирано)",
        "note": "'''Напомена:'''",
-       "previewnote": "'''Имајте у виду да је ово само преглед.'''\nВаше измене још нису сачуване!",
+       "previewnote": "<strong>Ово је претпреглед.</strong>\nВаше измене још нису сачуване!",
        "continue-editing": "Иди на уређивачки оквир",
        "previewconflict": "Овај преглед осликава како ће текст у текстуалном оквиру изгледати.",
        "session_fail_preview": "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''\nПокушајте поново.\nАко и даље не ради, покушајте да се [[Special:UserLogout|одјавите]] и поново пријавите.",
        "nextn-title": "$1 {{PLURAL:$1|следећи резултат|следећа резултата|следећих резултата}}",
        "shown-title": "Прикажи $1 {{PLURAL:$1|резултат|резултата|резултата}} по страници",
        "viewprevnext": "Погледај ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Постоји и чланак под називом „[[:$1]]“.'''",
+       "searchmenu-exists": "<strong>Постоји и страница под називом „[[:$1]]“.</strong> {{PLURAL:$2|0=|Види такође резултате претраге.}}",
        "searchmenu-new": "<strong>Направите страницу „[[:$1]]“!</strong> {{PLURAL:$2|0=|Види такође резултате претраге.}}",
        "searchprofile-articles": "Чланци",
        "searchprofile-images": "Датотеке",
index fd5bf80..5d62903 100644 (file)
        "missing-article": "Tekst stranice pod nazivom „$1“ ($2) nije pronađen.\n\nUzrok ove greške je obično zastarela izmena ili veza do obrisane stranice.\n\nAko se ne radi o tome, onda ste verovatno pronašli grešku u softveru.\nPrijavite je [[Special:ListUsers/sysop|administratoru]] uz odgovarajuću vezu.",
        "missingarticle-rev": "(izmena#: $1)",
        "missingarticle-diff": "(razlika: $1, $2)",
-       "readonly_lag": "Baza podataka je zaključana dok se sporedni bazni serveri ne usklade s glavnim.",
+       "readonly_lag": "Baza podataka je automatski zaključana da bi se sekundarni serveri baze podataka uskladili s glavnim.",
        "internalerror": "Unutrašnja greška",
        "internalerror_info": "Unutrašnja greška: $1",
        "filecopyerror": "Ne mogu da umnožim datoteku „$1“ u „$2“.",
        "userinvalidcssjstitle": "'''Upozorenje:''' ne postoji tema „$1“.\nPrilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:Foo/vector.css, a ne {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ažurirano)",
        "note": "'''Napomena:'''",
-       "previewnote": "'''Imajte u vidu da je ovo samo pregled.'''\nVaše izmene još nisu sačuvane!",
+       "previewnote": "<strong>Ovo je pretpregled.</strong>\nVaše izmene još nisu sačuvane!",
        "continue-editing": "Idi na uređivački okvir",
        "previewconflict": "Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.",
        "session_fail_preview": "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''\nPokušajte ponovo.\nAko i dalje ne radi, pokušajte da se [[Special:UserLogout|odjavite]] i ponovo prijavite.",
        "nextn-title": "$1 {{PLURAL:$1|sledeći rezultat|sledeća rezultata|sledećih rezultata}}",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Postoji i članak pod nazivom „[[:$1]]“.'''",
+       "searchmenu-exists": "<strong>Postoji i stranica pod nazivom „[[:$1]]“.</strong> {{PLURAL:$2|0=|Vidi takođe rezultate pretrage.}}",
        "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]“!</strong> {{PLURAL:$2|0=|Vidi takođe rezultate pretrage.}}",
        "searchprofile-articles": "Članci",
        "searchprofile-images": "Datoteke",
index 01819be..17bdc05 100644 (file)
        "revdelete-unsuppress": "Hapus watesan kana révisi anu geus dipulangkeun",
        "revdelete-log": "Alesan:",
        "revdelete-submit": "Larapkeun kana {{PLURAL:$1|révisi|révisi}} nu dipilih",
-       "revdelete-success": "<strong>Visibilitas révisi geus dimutahirkeun.</strong>",
+       "revdelete-success": "Visibilitas révisi geus dimutahirkeun.",
        "revdelete-failure": "'''Visibilitas révisi teu bisa diapdét:'''\n$1",
        "logdelete-success": "Log pangatur nyumputkeun junun dilarapkeun.",
        "logdelete-failure": "'''Visibilitas log teu bisa disét:'''\n$1",
        "import-interwiki-history": "Salin sakabéh vérsi jujutan pikeun ieu kaca",
        "import-interwiki-templates": "Kaasup sakabéh citakan",
        "import-interwiki-submit": "Impor",
-       "import-interwiki-namespace": "Spasi ngaran tujuan:",
        "import-upload-filename": "Ngaran berkas:",
        "import-comment": "Ringkesan:",
        "importtext": "Mangga ékspor koropakna ti sumber nu dipaké ku wiki migunakeun fungsi Special:Export, simpen na piringan anjeun, teras muatkeun di dieu.",
        "import-invalid-interwiki": "Teu bisa ngimpor ti wiki nu dipilih.",
        "importlogpage": "Log impor",
        "importlogpagetext": "Impor administratif kaca-kaca ti wiki séjén katut jujutanana.",
-       "import-logentry-upload": "Muatkeun [[$1]] make pamuatan koropak",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|vérsi heubeul}}",
-       "import-logentry-interwiki": "$1 geus ditranswikikeun",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|vérsi heubel}} ti $2",
        "javascripttest": "Nguji JavaScript",
        "tooltip-pt-userpage": "Kaca kontributor Anjeun",
        "expand_templates_output": "Hasil:",
        "expand_templates_xml_output": "Output XML",
        "expand_templates_ok": "Heug",
-       "expand_templates_preview": "Pramidang"
+       "expand_templates_preview": "Pramidang",
+       "special-characters-group-latin": "Latin",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Lambang",
+       "special-characters-group-greek": "Yunani",
+       "special-characters-group-cyrillic": "Sirilik",
+       "special-characters-group-arabic": "Arab",
+       "special-characters-group-persian": "Parsi",
+       "special-characters-group-hebrew": "Ibrani",
+       "special-characters-group-bangla": "Bangla",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-thai": "Thai",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer"
 }
index c74e637..eee6163 100644 (file)
        "history-feed-description": "Versionshistorik för denna sida på wikin",
        "history-feed-item-nocomment": "$1 den $2",
        "history-feed-empty": "Den begärda sidan finns inte.\nDen kan ha tagits bort från wikin eller bytt namn.\nProva att [[Special:Search|söka på wikin]] för relevanta nya sidor.",
+       "history-edit-tags": "Redigera märken för valda sidversioner",
        "rev-deleted-comment": "(redigeringssammanfattning togs bort)",
        "rev-deleted-user": "(användarnamn borttaget)",
        "rev-deleted-event": "(loggdetaljer borttagna)",
        "listfiles-delete": "radera",
        "listfiles-summary": "Den här specialsidan visar alla filer som laddats upp.",
        "listfiles_search_for": "Sök efter filnamn:",
+       "listfiles-userdoesnotexist": "Användarkontot \"$1\" är inte registrerat.",
        "imgfile": "fil",
        "listfiles": "Fillista",
        "listfiles_thumb": "Miniatyrbild",
        "emailccsubject": "Kopia av ditt meddelande till $1: $2",
        "emailsent": "E-post har nu skickats",
        "emailsenttext": "Ditt e-postmeddelande har skickats",
-       "emailuserfooter": "Denna e-post skickades av $1 till $2 genom \"Skicka e-post\"-funktionen på {{SITENAME}}.",
+       "emailuserfooter": "Detta e-postmeddelande skickades av $1 till $2 med funktionen \"{{int:emailpage}}\" på {{SITENAME}}.",
        "usermessage-summary": "Lämnar systemmeddelande.",
        "usermessage-editor": "Systemmeddelare",
        "watchlist": "Bevakningslista",
        "import-interwiki-history": "Kopiera hela versionshistoriken för denna sida",
        "import-interwiki-templates": "Inkludera alla mallar",
        "import-interwiki-submit": "Importera",
-       "import-interwiki-namespace": "Målnamnrymd:",
-       "import-interwiki-rootpage": "Destinationens grundsida (valfri):",
        "import-upload-filename": "Filnamn:",
        "import-comment": "Kommentar:",
        "importtext": "Var god exportera filen från ursprungs-wikin med hjälp av [[Special:Export|exporteringsverktyget]].\nSpara den på din dator och ladda upp den här.",
        "patrol-log-page": "Patrulleringslogg",
        "patrol-log-header": "Detta är en logg över patrullerade sidversioner.",
        "log-show-hide-patrol": "$1 patrulleringslogg",
+       "log-show-hide-tag": "$1 märkeslogg",
        "deletedrevision": "Raderade gammal sidversion $1",
        "filedeleteerror-short": "Fel vid radering av fil: $1",
        "filedeleteerror-long": "Fel inträffade vid raderingen av filen:\n\n$1",
        "tags-deactivate-reason": "Anledning:",
        "tags-deactivate-not-allowed": "Det är inte möjligt att inaktivera taggen \"$1\".",
        "tags-deactivate-submit": "Inaktivera",
+       "tags-apply-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
+       "tags-apply-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
+       "tags-update-add-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
+       "tags-update-add-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
+       "tags-update-remove-not-allowed-one": "Märket \"$1\" får inte tas bort.",
+       "tags-update-remove-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} får inte tas bort manuellt: $1",
+       "tags-edit-title": "Redigera märken",
+       "tags-edit-manage-link": "Hantera märken",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Vald sidversion|Valda sidversioner}} från [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Vald logghändelse|Valda logghändelser}}:",
+       "tags-edit-revision-legend": "Lägg eller ta bort märken från {{PLURAL:$1|denna sidversion|alla $1 sidversioner}}",
+       "tags-edit-logentry-legend": "Lägg till eller ta bort märken från {{PLURAL:$1|denna loggpost|alla $1 loggposter}}",
+       "tags-edit-existing-tags": "Befintliga märken:",
+       "tags-edit-existing-tags-none": "''Inga''",
+       "tags-edit-new-tags": "Nya märken:",
+       "tags-edit-add": "Lägg till dessa märken:",
+       "tags-edit-remove": "Ta bort dessa märken:",
+       "tags-edit-remove-all-tags": "(ta bort alla märken)",
+       "tags-edit-chosen-placeholder": "Välj några märken",
+       "tags-edit-chosen-no-results": "Inga överensstämmande märken hittades",
+       "tags-edit-reason": "Anledning:",
+       "tags-edit-revision-submit": "Verkställ ändringar för {{PLURAL:$1|denna sidversion|$1 sidversioner}}",
+       "tags-edit-logentry-submit": "Verkställ ändringar för {{PLURAL:$1|denna loggpost|$1 loggposter}}",
+       "tags-edit-success": "Ändringarna verkställdes.",
+       "tags-edit-failure": "Ändringarna kunde inte verkställas:\n$1",
+       "tags-edit-nooldid-title": "Ogiltig målversion",
+       "tags-edit-none-selected": "Välj åtminstone ett märke att lägga till eller ta bort.",
        "comparepages": "Jämför sidor",
        "compare-page1": "Sida 1",
        "compare-page2": "Sida 2",
        "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.",
+       "log-name-tag": "Märkeslogg",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|lade till}} {{PLURAL:$7|märket|märkena}} $6 för sidversionen $4 av sidan $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|lade till}} {{PLURAL:$7|märket|märkena}} $6 till loggposten $5 för siden $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|tog bort}} {{PLURAL:$9|märket|märkena}} $8 från sidversionen $4 av sidan $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|tog bort}} {{PLURAL:$9|märket|märkena}} $8 från loggposten $5 för sidan $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|uppdaterade}} märken på sidversionen $4 för sidan $3 ({{PLURAL:$7|lade till}} $6; {{PLURAL:$9|tog bort}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|uppdaterade}} märken på loggposten $5 för sidan $3 ({{PLURAL:$7|lade till}} $6; {{PLURAL:$9|tog bort}} $8)",
        "rightsnone": "(inga)",
        "revdelete-summary": "sammanfattning",
        "feedback-adding": "Ge feedback till sida...",
        "feedback-error1": "Fel: Okänt resultat från API",
        "feedback-error2": "Fel: Redigeringen misslyckades",
        "feedback-error3": "Fel: Inget svar från API",
+       "feedback-error4": "Fel: Det gick inte att skicka till angiven återkopplingstitel",
        "feedback-message": "Meddelande:",
        "feedback-subject": "Ämne:",
        "feedback-submit": "Skicka",
        "log-name-pagelang": "Språkändringslogg",
        "log-description-pagelang": "Detta är en logg över ändringar i sidspråken.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ändrade}} sidspråket för $3 från $4 till $5.",
-       "default-skin-not-found": "Ojsan! Standardutseendet för din wiki, definierad i <code dir=\"ltr\">$wgDefaultSkin</code> som <code>$1</code>, är inte tillgängligt.\n\nDin installation verkar innehålla följande utseenden. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur du aktiverar dem och hur standard väljs.\n\n$2\n\n; Om du precis installerat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är normalt. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klippa och klistra in <code>skins/</code>-katalogen från den.\n:* Ladda ner individuella tarballs med utseenden från [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code dir=\"ltr\">skins/</code>-arkiven i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. \n\n; Om du precis har uppgraderat MediaWiki:\n: MediaWiki 1.24 och nyare aktiverar ej längre automatiskt installerade utseenden (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Automatisk identifiering av utseenden]). Du kan klistra in följande rader i <code>LocalSettings.php</code> för att aktivera alla för närvarande installerade utseenden:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Om du precis har modifierat <code>LocalSettings.php</code>:\n: Dubbelkolla namnen för utseendena för att identifiera stavfel.",
+       "default-skin-not-found": "Ojsan! Standardutseendet för din wiki, definierad i <code dir=\"ltr\">$wgDefaultSkin</code> som <code>$1</code>, är inte tillgängligt.\n\nDin installation verkar innehålla följande {{PLURAL:$4|utseende|utseenden}}. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur du aktiverar {{PLURAL:$4|det|dem}} och hur standard väljs.\n\n$2\n\n; Om du precis installerat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är normalt. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klippa och klistra in <code>skins/</code>-katalogen från den.\n:* Ladda ner individuella tarballs med utseenden från [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code dir=\"ltr\">skins/</code>-arkiven i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. \n\n; Om du precis har uppgraderat MediaWiki:\n: MediaWiki 1.24 och nyare aktiverar ej längre automatiskt installerade utseenden (se [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Automatisk identifiering av utseenden]). Du kan klistra in följande {{PLURAL:$5|rad|rader}} i <code>LocalSettings.php</code> för att aktivera {{PLURAL:$5|det för närvarande installerade utseendet|alla för närvarande installerade utseenden}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Om du precis har modifierat <code>LocalSettings.php</code>:\n: Dubbelkolla namnen för utseendena för att identifiera stavfel.",
        "default-skin-not-found-no-skins": "Ojsan! Standardutseendet för din wiki, definierad i <code>$wgDefaultSkin</code> som <code>$1</code>, är inte tillgängligt.\n\nDu har inga installerade utseenden.\n\n; Om du precis installerat eller uppdaterat MediaWiki:\n: Du installerade troligen från git, eller direkt från källkoden via någon annan metod. Detta är att förvänta. MediaWiki 1.24 och nyare inkluderar inte några utseenden i det huvudsakliga centralförvaret. Försök att installera några utseenden från [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org:s utseendekatalog], genom att:\n:* Ladda ner [https://www.mediawiki.org/wiki/Download tarball-installeraren], som kommer med flera utseenden och tillägg. Du kan klipp-och-klistra in <code dir=\"ltr\">skins/</code>-katalogen från den.\n:* Ladda ner individuella tarballs med utseende från [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Klona ett av <code>mediawiki/skins/*</code>-centralförvaren in i <code>skins/</code>-katalogen i din MediaWiki-installation.\n: Att göra detta borde inte påverka ditt git-centralförvar om du är en MediaWiki-utvecklare. Se [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manualen: Utseendeinställningar] för information om hur utseenden aktiveras och hur standardutseendet väljs.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiverad)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''inaktiverad''')",
index 16a5a19..812277b 100644 (file)
        "january": "styczyń",
        "february": "luty",
        "march": "marzec",
-       "april": "kwjećyń",
-       "may_long": "moj",
-       "june": "czyrwjyc",
-       "july": "lipjyc",
-       "august": "śyrpjyń",
-       "september": "wrześyń",
-       "october": "paźdźerńik",
+       "april": "kwiyciyń",
+       "may_long": "mŏj",
+       "june": "czyrwiyc",
+       "july": "lipiyc",
+       "august": "siyrpiyń",
+       "september": "wrzesiyń",
+       "october": "paździyrnik",
        "november": "listopad",
-       "december": "grudźyń",
+       "december": "grudziyń",
        "january-gen": "styczńa",
        "february-gen": "lutygo",
        "march-gen": "marca",
        "jan": "sty",
        "feb": "lut",
        "mar": "mar",
-       "apr": "kwj",
-       "may": "moj",
+       "apr": "kwi",
+       "may": "mŏj",
        "jun": "czy",
        "jul": "lip",
-       "aug": "śyr",
+       "aug": "siy",
        "sep": "wrz",
        "oct": "paź",
        "nov": "lis",
        "actions": "Akcyje",
        "namespaces": "Raumy mjan",
        "variants": "Warjanty",
-       "navigation-heading": "Menu nawigacyji",
+       "navigation-heading": "Menu nawigacyje",
        "errorpagetitle": "Feler",
        "returnto": "Nazod do zajty $1.",
        "tagline": "Ze {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "print": "Drukuj",
        "view": "Podglůnd",
        "view-foreign": "Uobejrzij we {{grammar:MS.lp|$1}}",
-       "edit": "Sprowjej",
+       "edit": "Sprowiyj",
        "create": "Stwůrz",
        "create-local": "Wkludź lokalny uopis",
        "editthispage": "Sprowjej ta zajta",
        "unprotectthispage": "Uodymkńij ta zajta",
        "newpage": "Nowy artikel",
        "talkpage": "Godej uo tym artiklu",
-       "talkpagelinktext": "dyskusyjo",
+       "talkpagelinktext": "Dyskusyjo",
        "specialpage": "Szpecyjolno zajta",
-       "personaltools": "Perzůnolne",
+       "personaltools": "PerzÅ\8d\8flne",
        "articlepage": "Zajta artikla",
        "talk": "Dyskusyjo",
-       "views": "Widok",
+       "views": "Ôbocz",
        "toolbox": "Werkcojg",
        "userpage": "Zajta sprowjorza",
        "projectpage": "Zajta projekta",
        "viewcount": "W ta zajta filowano {{PLURAL:$1|tylko roz|$1 rozůw}}.",
        "protectedpage": "Zajta zawarto",
        "jumpto": "Przyńdź do:",
-       "jumptonavigation": "nawigacyje",
-       "jumptosearch": "sznupańo",
+       "jumptonavigation": "nawigacyjo",
+       "jumptosearch": "sznupaniy",
        "view-pool-error": "Felerńe, syrwyry sům przećůnżone.\n\n$1",
        "pool-timeout": "Za dugi czas uoczekiwańo na blokada",
        "pool-queuefull": "Kolyjność zadań je pełno",
        "pool-errorunknown": "Feler ńyznony",
-       "aboutsite": "Uo {{GRAMMAR:MS.lp|{{SITENAME}}}}",
-       "aboutpage": "Project:Uo serwiśe",
+       "aboutsite": "Ô {{GRAMMAR:MS.lp|{{SITENAME}}}}",
+       "aboutpage": "Project:Ô serwisie",
        "copyright": "Tekst udostympńany na licencyji $1, eli inakszyj ńy podano.",
        "copyrightpage": "{{ns:project}}:Autorske prawa",
        "currentevents": "Aktualne przitrefjyńa",
        "policy-url": "Project:Prawidła",
        "portal": "Portal używoczůw",
        "portal-url": "Project:Portal używoczůw",
-       "privacy": "PrawidÅ\82a chrůÅ\84\84o prywotnoÅ\9bÄ\87i",
-       "privacypage": "Project:PrawidÅ\82a chrůÅ\84\84o prywotnoÅ\9bÄ\87i",
+       "privacy": "PrawidÅ\82a chrÅ\8dniyniÅ\8f prywÅ\8ftnoÅ\9bci",
+       "privacypage": "Project:PrawidÅ\82a chrÅ\8dniyniÅ\8f prywÅ\8ftnoÅ\9bci",
        "badaccess": "Felerne uprawńyńo",
        "badaccess-group0": "Ńy mosz uprawńyń coby wykůnać ta uoperacyjo.",
        "badaccess-groups": "Ta uoperacyjo mogům wykůnać ino użytkownicy ze keryjś z grup {{PLURAL:$2|grupa|grupy}}:$1.",
        "versionrequired": "Wymagano MediaWiki we wersyji $1",
        "versionrequiredtext": "Wymagano jest MediaWiki we wersji $1 coby skorzistać zr tyj zajty. Uobocz [[Special:Version]]",
        "ok": "OK",
-       "retrievedfrom": "Zdrzůdło \"$1\"",
+       "retrievedfrom": "ZdrzÅ\8ddło \"$1\"",
        "youhavenewmessages": "Mosz $1 ($2).",
        "youhavenewmessagesfromusers": "Mosz $1 uod {{PLURAL:$3|inszygo używocza|$3 używoczy}} ($2).",
        "youhavenewmessagesmanyusers": "Mosz $1 uod wjelu używoczy ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|jedno nowina|999=nowiny}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|uostatńe sprowjyńe|999=uostatńe sprowjyńa}}",
        "youhavenewmessagesmulti": "Mosz nowe powjadůmjyńa: $1",
-       "editsection": "Sprowjej",
+       "editsection": "Sprowiyj",
        "editold": "sprowjej",
        "viewsourceold": "pokoż zdrzůdło",
        "editlink": "sprowjej",
        "viewsourcelink": "zdrzůdłowy tekst",
-       "editsectionhint": "Sprowjej tajla: $1",
+       "editsectionhint": "Sprowiyj tajlã: $1",
        "toc": "Treść",
        "showtoc": "uobejrzij",
        "hidetoc": "schrůń",
        "feed-invalid": "Ńywłaściwy typ kanałů informacyjnygo.",
        "feed-unavailable": "Kanoły informacyjne ńy sům dostympne",
        "site-rss-feed": "Kanoł RSS {{GRAMMAR:D.lp|$1}}",
-       "site-atom-feed": "Kanoł Atom {{GRAMMAR:D.lp|$1}}",
+       "site-atom-feed": "Kanŏł Atom {{GRAMMAR:D.lp|$1}}",
        "page-rss-feed": "Kanoł RSS \"$1\"",
        "page-atom-feed": "Kanoł Atom \"$1\"",
-       "red-link-title": "$1 (ńy mo zajty)",
+       "red-link-title": "$1 (niy mŏ zajty)",
        "sort-descending": "Sortuj pomńijszajůnco",
        "sort-ascending": "Sortuj rosnůnco",
        "nstab-main": "Zajta",
        "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",
+       "pt-login": "Zaloguj sie",
+       "pt-createaccount": "TwÅ\8drz nowe konto",
        "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.",
        "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Å\84\84u",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtůw}} po pÅ\8dmiyniyniu",
        "newsectionsummary": "/* $1 */ nowo tajla",
        "rc-enhanced-expand": "Pokoż szczygůły",
        "rc-enhanced-hide": "Schrůń detajle",
        "import-interwiki-text": "Wybjer wiki i nmjano zajty do importowańo.\nDaty a tyž mjana autorůw bydům zachowane.\nWšyjstke uoperacyje importu transwiki sům uodnotowywane w [[Special:Log/import|rejeře importu]].",
        "import-interwiki-history": "Kopjuj couko historja sprowjyń tyi zajty",
        "import-interwiki-submit": "Importuj",
-       "import-interwiki-namespace": "Docelowo przestrzyń mjan:",
        "import-upload-filename": "Mjano plika:",
        "import-comment": "Kůmyntorz:",
        "importtext": "Używajůnc werkcojga [[Special:Export|eksportuj]] wyeksportuj plik ze zdrzůdłowyj wiki, naszkryflej go na swojym dysku, a potym wćepńij go tukej.",
        "import-invalid-interwiki": "Ńy idźe importować s podanyj wiki.",
        "importlogpage": "Rejer importa",
        "importlogpagetext": "Rejer přeprowadzůnych importůw zajtůw s inkšych serwisůw wiki.",
-       "import-logentry-upload": "zaimportowou [[$1]] bez wćepańe sam plika",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}}",
-       "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ńika do adresu IP spod kerygo sprowjosz",
        "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-search": "Sznupej we serwiśe {{SITENAME}}",
-       "tooltip-search-go": "Przyńdź na zajta uo gynał takij titli, eli sam je",
-       "tooltip-search-fulltext": "Sznupej wćepany tekst na zajće",
-       "tooltip-p-logo": "Przodńo zajta",
+       "tooltip-search": "Sznupej we serwisie {{SITENAME}}",
+       "tooltip-search-go": "Przyńdź na zajtã ô gynał takij titli, eli sam je",
+       "tooltip-search-fulltext": "Sznupej wciepany tekst na zajcie",
+       "tooltip-p-logo": "Przodnio zajta",
        "tooltip-n-mainpage": "Przelyź na przodńo zajta",
        "tooltip-n-mainpage-description": "Przelyź na przodńo zajta",
        "tooltip-n-portal": "Uo projekće, co mogesz robić, kaj mogesz nolyźć informacyje",
        "tooltip-t-contributions": "Ukoż ajnzace tygo używocza",
        "tooltip-t-emailuser": "Wyślij e-brif do tygo użytkowńika",
        "tooltip-t-upload": "Wćepej plik na serwer",
-       "tooltip-t-specialpages": "Lista wszyjskich ekstra zajtůw",
+       "tooltip-t-specialpages": "Lista wszeckich ekstra zajt",
        "tooltip-t-print": "Wersyjo do durku",
        "tooltip-t-permalink": "Pewny link do tyj wersyje zajty",
        "tooltip-ca-nstab-main": "Uobźyrej zajta artikla",
index 97a26b9..4d2f59c 100644 (file)
@@ -36,7 +36,9 @@
                        "아라",
                        "Kalyanasundar",
                        "தமிழ்த்தம்பி",
-                       "Macofe"
+                       "Macofe",
+                       "AntanO",
+                       "கலைவாணன்"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "upload_source_file": "(தங்களி்ன் கணினியிலிருந்து தங்களால் தேர்ந்தெடுக்கப்பட்ட கோப்பு)",
        "listfiles-summary": "இச்சிறப்புப் பக்கம் பதிவேற்றப்பட்ட கோப்புகளைப் பட்டியலிடுகிறது.",
        "listfiles_search_for": "பின்வரும் பெயருள்ள ஊடகக் கோப்பைத் தேடு:",
+       "listfiles-userdoesnotexist": "பயனர் கணக்கு \"$1\" பதியப்படவில்லை",
        "imgfile": "கோப்பு",
        "listfiles": "படிமங்களின் பட்டியல்",
        "listfiles_thumb": "நகம் அளவு சிறுபடம்",
        "import-interwiki-history": "இப்பக்கத்தின் அனைத்து வரலாற்றுப் பதிப்புகளையும் நகலெடு",
        "import-interwiki-templates": "அனைத்து வார்ப்புருக்களையும் சேர்",
        "import-interwiki-submit": "இறக்கு",
-       "import-interwiki-namespace": "பின்வரும் பெயர்வெளிக்கு மாற்று:",
+       "import-mapping-default": "வழக்கமான இடங்களுக்கு இறக்குமதி செய்யவும்",
+       "import-mapping-namespace": "ஏதேனும் ஓர் பெயர்வெளிக்கு இறக்குமதி செய்யவும்:",
+       "import-mapping-subpage": "பின் வரும் பக்கத்தை துணை பக்கங்களாக இறக்குமதி செய்யவும்:",
        "import-upload-filename": "கோப்புப்பெயர்:",
        "import-comment": "கருத்து:",
        "importtext": "தயவுசெய்து மூல விக்கியிலிருந்து [[Special:Export|ஏற்றுமதி அம்சத்தைப்]] பயன்படுத்தி கோப்பை ஏற்றுமதி செய்யவும்.\nஉங்கள் கணினியில் இதை சேமித்து பிறகு அக்கோப்பை இங்கே பதிவேற்றவும்.",
index 9838a43..3c6da8d 100644 (file)
        "revdelete-unsuppress": "పునస్థాపిత కూర్పులపై నిబంధనలను తీసివెయ్యి",
        "revdelete-log": "కారణం:",
        "revdelete-submit": "ఎంచుకున్న {{PLURAL:$1|కూర్పుకు|కూర్పులకు}} ఆపాదించు",
-       "revdelete-success": "<strong>కూర్పు కనబడే విధానాన్ని జయప్రదంగా తాజాకరించాం.</strong>",
-       "revdelete-failure": "<strong>కూర్పు కనబడే పద్ధతిని తాజాపరచలేకపోయాం:</strong>\n$1",
-       "logdelete-success": "<strong>ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.</strong>",
+       "revdelete-success": "కూర్పు కనబడే విధానాన్ని జయప్రదంగా తాజాకరించాం.",
+       "revdelete-failure": "కూర్పు కనబడే పద్ధతిని తాజాపరచలేకపోయాం:\n$1",
+       "logdelete-success": "ఘటన కనబడే విధానాన్ని జయప్రదంగా సెట్ చేసాం.",
        "logdelete-failure": "'''చిట్టా కనబడే పద్ధతిని అమర్చలేకపోయాం:'''\n$1",
        "revdel-restore": "దృశ్యతని మార్చు",
        "pagehist": "పేజీ చరిత్ర",
        "import-interwiki-history": "ఈ పేజీ యొక్క అన్ని చారిత్రక కూర్పులను కాపీ చెయ్యి",
        "import-interwiki-templates": "అన్ని మూసలను ఉంచు",
        "import-interwiki-submit": "దిగుమతించు",
-       "import-interwiki-namespace": "లక్ష్యిత నేంస్పేసు:",
-       "import-interwiki-rootpage": "గమ్యస్థానపు మూలపు పేజీ (ఐచ్ఛికం):",
        "import-upload-filename": "పైలుపేరు:",
        "import-comment": "వ్యాఖ్య:",
        "importtext": "[[Special:Export|ఎగుమతి ఉపకరణాన్ని]] ఉపయోగించి, ఈ ఫైలుని  మూల వికీ నుంచి ఎగుమతి చెయ్యండి.\nదాన్ని మీ కంప్యూటర్లో భద్రపరచి, ఆపై ఇక్కడికి ఎక్కించండి.",
index 44b6978..a337bdd 100644 (file)
        "revdelete-unsuppress": "Хотимаи маҳдудиятҳо дар мавриди нусхаҳои интихобшуда",
        "revdelete-log": "Сабаб:",
        "revdelete-submit": "Амалӣ кардан бар {{PLURAL:$1|нусхаи|нусхаҳои}} интихобшуда",
-       "revdelete-success": "<strong>Тағйири намоёнии нусха бо муваффақият анҷом шуд.</strong>",
+       "revdelete-success": "Тағйири намоёнии нусха бо муваффақият анҷом шуд.",
        "logdelete-success": "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
        "revdel-restore": "Тағйири падидорӣ",
        "pagehist": "Таърихи саҳифа",
        "import-interwiki-text": "Як вики ва як номи саҳифаро интихоб кунед, то иттилоот аз он ворид шавад.\nТаърихи нусхаҳо ва номҳои вироишкунандагон сабт хоҳанд монд.\nИттилооти марбут ба ворид кардани саҳифаҳо дар [[Special:Log/import|гузоришҳои воридот]] сабт хоҳад шуд.",
        "import-interwiki-history": "Тамоми таърихи нусхаҳои ин саҳифа интиқол дода шавад",
        "import-interwiki-submit": "Ворид шавад",
-       "import-interwiki-namespace": "Фазои номи мақсад:",
        "import-upload-filename": "Номи парванда:",
        "import-comment": "Тавзеҳ:",
        "importtext": "Лутфан парвандаро аз вики манбаъ содир кунед, аз тариқи саҳифа [[Special:Export|абзори содирот]].\nПас онро ба компютератон захира карда инҷо боргузорӣ кунед.",
index 33c7d5c..d4a2122 100644 (file)
        "wrongpassword": "รหัสผ่านที่กรอกไม่ถูกต้อง \nโปรดลองอีกครั้ง",
        "wrongpasswordempty": "รหัสผ่านที่กรอกว่าง\nโปรดลองอีกครั้ง",
        "passwordtooshort": "รหัสผ่านต้องมีอย่างน้อย $1 อักขระ",
+       "passwordtoolong": "รหัสผ่านยาวกว่า $1 อักขระไม่ได้",
        "password-name-match": "รหัสผ่านต้องต่างจากชื่อผู้ใช้",
        "password-login-forbidden": "ห้ามใช้ชื่อผู้ใช้และรหัสผ่านนี้",
        "mailmypassword": "ตั้งรหัสผ่านใหม่",
        "missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่หัวข้อ/พาดหัวสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีหัวข้อ/พาดหัว",
        "summary-preview": "ตัวอย่างคำอธิบาย:",
        "subject-preview": "ตัวอย่างเรื่อง/พาดหัว:",
+       "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "autoblockedtext": "เลขที่อยู่ไอพีของคุณถูกบล็อกอัตโนมัติ เพราะเคยมีผู้ใช้อื่นใช้ ซึ่งถูกบล็อกโดย $1\nโดยให้เหตุผลว่า\n\n:<em>$2</em>\n\n* เริ่มการบล็อก: $8\n* สิ้นสุดการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ \nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลที่ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดรวมรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
-       "duplicate-args-category": "หà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89อารà¹\8cà¸\81ิวà¹\80มà¸\99à¸\95à¹\8cà¸\88ำลอà¸\87ในการเรียกแม่แบบ",
+       "duplicate-args-category": "หà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89อารà¹\8cà¸\81ิวà¹\80มà¸\99à¸\95à¹\8cà¸\8bà¹\89ำในการเรียกแม่แบบ",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "revdelete-unsuppress": "ลบการจำกัดแก่รุ่นปรับปรุงที่กู้คืน",
        "revdelete-log": "เหตุผล:",
        "revdelete-submit": "ใช้กับรุ่นปรับปรุง{{PLURAL:$1|}}ที่เลือก",
-       "revdelete-success": "<strong>ปรับทัศนวิสัยรุ่นปรับปรุงสำเร็จ</strong>",
-       "revdelete-failure": "<strong>ไม่สามารถปรับทัศนวิสัยของรุ่นปรับปรุงได้:</strong>\n$1",
-       "logdelete-success": "<strong>ตั้งทัศนวิสัยปูมสำเร็จ</strong>",
-       "logdelete-failure": "<strong>ไม่สามารถตั้งทัศนวิสัยของปูม:</strong>\n$1",
+       "revdelete-success": "ปรับทัศนวิสัยรุ่นปรับปรุงสำเร็จ",
+       "revdelete-failure": "ไม่สามารถปรับทัศนวิสัยของรุ่นปรับปรุงได้:\n$1",
+       "logdelete-success": "ตั้งทัศนวิสัยปูมสำเร็จ",
+       "logdelete-failure": "ไม่สามารถตั้งทัศนวิสัยของปูม:\n$1",
        "revdel-restore": "เปลี่ยนทัศนวิสัย",
        "pagehist": "ประวัติหน้า",
        "deletedhist": "ประวัติที่ถูกลบ",
        "notextmatches": "ไม่พบข้อความหน้าตรงกัน",
        "prevn": "ก่อนหน้า $1",
        "nextn": "ถัดไป $1",
+       "prev-page": "หน้าก่อน",
+       "next-page": "หน้าถัดไป",
        "prevn-title": "$1 ผลลัพธ์ก่อนหน้า",
        "nextn-title": "$1 ผลลัพธ์ถัดไป",
        "shown-title": "แสดง $1 ผลลัพธ์ต่อหน้า",
        "listfiles-delete": "ลบ",
        "listfiles-summary": "หน้าพิเศษนี้แสดงไฟล์ทั้งหมดที่อัปโหลด",
        "listfiles_search_for": "ค้นหาชื่อสื่อ:",
+       "listfiles-userdoesnotexist": "บัญชีผู้ใช้ \"$1\" ไม่ได้ถูกลงทะเบียน",
        "imgfile": "ไฟล์",
        "listfiles": "รายการไฟล์",
        "listfiles_thumb": "รูปย่อ",
        "import-interwiki-history": "คัดลอกประวัติทั้งหมดในหน้านี้",
        "import-interwiki-templates": "รวมแม่แบบทั้งหมด",
        "import-interwiki-submit": "นำเข้า",
-       "import-interwiki-namespace": "เนมสเปซปลายทาง:",
        "import-upload-filename": "ชื่อไฟล์:",
        "import-comment": "ความเห็น:",
        "importtext": "กรุณาส่งออกไฟล์จากวิกิต้นทางโดยใช้[[Special:Export|เครื่องมือส่งออก]]\nบันทึกลงคอมพิวเตอร์ของคุณ และอัปโหลดที่นี่",
index a910adf..63528e3 100644 (file)
@@ -70,7 +70,8 @@
                        "Mavrikant",
                        "Ayrıntılı Bilgi",
                        "Gokalpselamet",
-                       "Macofe"
+                       "Macofe",
+                       "Nighteagle2000"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "notextmatches": "Hiçbir sayfada bulunamadı",
        "prevn": "önceki {{PLURAL:$1|$1}}",
        "nextn": "sonraki {{PLURAL:$1|$1}}",
+       "prev-page": "önceki sayfa",
+       "next-page": "sonraki sayfa",
        "prevn-title": "Önceki $1 {{PLURAL:$1|sonuç|sonuç}}",
        "nextn-title": "Sonraki $1 {{PLURAL:$1|sonuç|sonuç}}",
        "shown-title": "Sayfa başına $1 {{PLURAL:$1|sonuç|sonuç}} göster",
        "prefs-rc": "Son değişiklikler",
        "prefs-watchlist": "İzleme listesi",
        "prefs-editwatchlist": "İzleme listesini düzenle",
+       "prefs-editwatchlist-label": "İzleme listesinizdeki girişleri düzenle",
+       "prefs-editwatchlist-edit": "İzleme listesini gör ve düzenle",
+       "prefs-editwatchlist-raw": "Ham izleme listesini düzenle",
+       "prefs-editwatchlist-clear": "İzleme listesini temizle",
        "prefs-watchlist-days": "İzleme listesinde görüntülenecek gün sayısı:",
        "prefs-watchlist-days-max": "en fazla $1 {{PLURAL:$1|gün|gün}}",
        "prefs-watchlist-edits": "Genişletilmiş izleme listesinde gösterilecek değişiklik sayısı:",
        "listfiles-delete": "sil",
        "listfiles-summary": "Bu özel sayfa yüklenen tüm dosyaları gösterir.",
        "listfiles_search_for": "Medya adı ara:",
+       "listfiles-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "imgfile": "dosya",
        "listfiles": "Dosya listesi",
        "listfiles_thumb": "Küçük resim",
index 34f12ac..ce10969 100644 (file)
        "mostlinkedtemplates": "Эң холбаалар майыктар",
        "mostcategories": "Эңне бөлүктер арыннар",
        "mostimages": "Эң холбаалар файлдар",
-       "prefixindex": "Арыннарның эгезиниң аайы-биле айтыкчы",
+       "prefixindex": "Арыннар аттарының эгези-биле айтыкчы",
        "shortpages": "Чолдак арыннар",
        "longpages": "Узун арыннар",
        "protectedpages": "Камгалаган арыннар",
        "htmlform-submit": "Күүcедири",
        "htmlform-selectorother-other": "Өске",
        "rightsnone": "(чок)",
-       "feedback-subject": "Кол сөс:",
-       "feedback-message": "Чагаа:",
        "feedback-cancel": "Соксаары",
+       "feedback-message": "Чагаа:",
+       "feedback-subject": "Кол сөс:",
        "searchsuggest-search": "Дилээшкин",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
index 636129c..8c3e8c0 100644 (file)
@@ -57,7 +57,8 @@
                        "Ypryima",
                        "Purodha",
                        "Green Zero",
-                       "Macofe"
+                       "Macofe",
+                       "Alex Blokha"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "history-feed-description": "Історія редагувань цієї сторінки в вікі",
        "history-feed-item-nocomment": "$1 в $2",
        "history-feed-empty": "Такої сторінки не існує.\nЇї могли вилучити чи перейменувати.\nСпробуйте [[Special:Search|знайти]] подібні сторінки.",
+       "history-edit-tags": "Редагувати теги обраних ревізій",
        "rev-deleted-comment": "(опис редагування вилучено)",
        "rev-deleted-user": "(ім'я автора стерто)",
        "rev-deleted-event": "(запис журналу вилучений)",
        "searchrelated": "пов'язаний",
        "searchall": "усі",
        "showingresults": "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
-       "showingresultsinrange": "Нижче показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатів|<strong>$1</strong> результати}} у діапазоні від #<strong>$2</strong> до #<strong>$3</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": "Розширений пошук",
        "grouppage-sysop": "{{ns:project}}:Адміністратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
        "grouppage-suppress": "{{ns:project}}:Ревізори",
-       "right-read": "Ð\9fерегляд сторінок",
-       "right-edit": "Редагування сторінок",
-       "right-createpage": "Створення сторінок (але не обговорень)",
-       "right-createtalk": "Створення обговорень сторінок",
-       "right-createaccount": "Створення нових облікових записів",
-       "right-minoredit": "Ð\9fозначення редагувань як незначні",
-       "right-move": "Ð\9fерейменування сторінок",
-       "right-move-subpages": "Ð\9fерейменування сторінок і їх підсторінок",
+       "right-read": "перегляд сторінок",
+       "right-edit": "редагування сторінок",
+       "right-createpage": "створення сторінок (але не обговорень)",
+       "right-createtalk": "створення обговорень сторінок",
+       "right-createaccount": "створення нових облікових записів",
+       "right-minoredit": "позначення редагувань як незначні",
+       "right-move": "перейменування сторінок",
+       "right-move-subpages": "перейменування сторінок і їх підсторінок",
        "right-move-rootuserpages": "перейменування кореневих сторінок користувачів",
        "right-move-categorypages": "перейменування сторінок категорій",
        "right-movefile": "перейменування файлів",
-       "right-suppressredirect": "Ð\9dестворення перенаправлення зі старої назви на нову при перейменуванні сторінки",
-       "right-upload": "Ð\97авантаження файлів",
-       "right-reupload": "Ð\9fерезаписування існуючих файлів",
-       "right-reupload-own": "Ð\9fерезаписування існуючих файлів, завантажених тим самим користувачем",
-       "right-reupload-shared": "Ð\9fідміна файлів зі спільного сховища локальними",
+       "right-suppressredirect": "нестворення перенаправлення зі старої назви на нову при перейменуванні сторінки",
+       "right-upload": "завантаження файлів",
+       "right-reupload": "перезаписування існуючих файлів",
+       "right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
+       "right-reupload-shared": "підміна файлів зі спільного сховища локальними",
        "right-upload_by_url": "Завантаження файлів за URL-адресами",
-       "right-purge": "Ð\9eÑ\87иÑ\89еннÑ\8f ÐºÐµÑ\88Ñ\83 Ð´Ð»Ñ\8f Ñ\81Ñ\82оÑ\80Ñ\96нки Ð±ÐµÐ· Ñ\81Ñ\82оÑ\80Ñ\96нки підтвердження",
-       "right-autoconfirmed": "Ð\91ез обмежень швидкості за IP",
-       "right-bot": "Ð\90втоматична обробка",
-       "right-nominornewtalk": "Ð\9dезначні редагування на сторінках обговорень користувачів не викликають попередження про нові повідомлення",
-       "right-apihighlimits": "Розширення обмежень на виконання API-запитів",
-       "right-writeapi": "Ð\92икористання API для запису",
-       "right-delete": "Ð\92илучення сторінок",
+       "right-purge": "оÑ\87иÑ\89еннÑ\8f ÐºÐµÑ\88Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нки Ð±ÐµÐ· Ð½ÐµÐ¾Ð±Ñ\85Ñ\96дноÑ\81Ñ\82Ñ\96 підтвердження",
+       "right-autoconfirmed": "без обмежень швидкості за IP",
+       "right-bot": "автоматична обробка",
+       "right-nominornewtalk": "незначні редагування на сторінках обговорень користувачів не викликають попередження про нові повідомлення",
+       "right-apihighlimits": "розширення обмежень на виконання API-запитів",
+       "right-writeapi": "використання API для запису",
+       "right-delete": "вилучення сторінок",
        "right-bigdelete": "Вилучення сторінок з великою історією",
-       "right-deletelogentry": "Ð\92илучення та відновлення окремих записів журналу",
-       "right-deleterevision": "Ð\92илÑ\83Ñ\87еннÑ\8f Ñ\96 відновлення окремих версій сторінок",
-       "right-deletedhistory": "Ð\9fерегляд історії вилучених сторінок без перегляду вилученого тексту",
+       "right-deletelogentry": "вилучення та відновлення окремих записів журналу",
+       "right-deleterevision": "вилÑ\83Ñ\87еннÑ\8f Ñ\82а відновлення окремих версій сторінок",
+       "right-deletedhistory": "перегляд історії вилучених сторінок без перегляду вилученого тексту",
        "right-deletedtext": "перегляд вилученого тексту та змін між вилученими версіями",
-       "right-browsearchive": "Ð\9fошук вилучених сторінок",
-       "right-undelete": "Ð\92ідновлення сторінок",
-       "right-suppressrevision": "Ð\9fеÑ\80еглÑ\8fд, Ð¿Ñ\80иÑ\85овання та відновлення конкретних змін сторінок від будь-якого користувача",
+       "right-browsearchive": "пошук вилучених сторінок",
+       "right-undelete": "відновлення сторінок",
+       "right-suppressrevision": "пеÑ\80еглÑ\8fд, Ð¿Ñ\80иÑ\85овÑ\83вання та відновлення конкретних змін сторінок від будь-якого користувача",
        "right-viewsuppressed": "Перегляд змін, приховаих від усіх користувачів",
-       "right-suppressionlog": "Ð\9fерегляд приватних журналів",
-       "right-block": "Ð\97аборона редагувань для інших дописувачів",
-       "right-blockemail": "Ð\91локÑ\83ваннÑ\8f ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87ам надсилання електронної пошти",
-       "right-hideuser": "Ð\91локування імені користувача і приховування його",
-       "right-ipblock-exempt": "Уникнення блокування за IP-адресою, автоблокування і блокування діапазонів",
-       "right-proxyunbannable": "Уникнення автоматичного блокування проксі-серверів",
+       "right-suppressionlog": "перегляд приватних журналів",
+       "right-block": "заборона редагувань для інших дописувачів",
+       "right-blockemail": "блокÑ\83ваннÑ\8f ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а Ð²Ñ\96д надсилання електронної пошти",
+       "right-hideuser": "блокування імені користувача і приховування його",
+       "right-ipblock-exempt": "уникнення блокування за IP-адресою, автоблокування і блокування діапазонів",
+       "right-proxyunbannable": "уникнення автоматичного блокування проксі-серверів",
        "right-unblockself": "розблоковування себе",
-       "right-protect": "Ð\97мÑ\96на Ñ\80Ñ\96внÑ\96в Ð·Ð°Ñ\85иÑ\81Ñ\82Ñ\83 Ñ\82а Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ñ\85иÑ\89ениÑ\85 ÐºÐ°Ñ\81кадно сторінок",
+       "right-protect": "змÑ\96на Ñ\80Ñ\96внÑ\96в Ð·Ð°Ñ\85иÑ\81Ñ\82Ñ\83 Ñ\82а Ñ\80едагÑ\83ваннÑ\8f ÐºÐ°Ñ\81кадно Ð·Ð°Ñ\85иÑ\89ениÑ\85 сторінок",
        "right-editprotected": "редагування сторінок з рівнем захисту «{{int:protect-level-sysop}}»",
        "right-editsemiprotected": "редагування сторінок з рівнем захисту «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Редагувати модель вмісту сторінки",
-       "right-editinterface": "Редагування інтерфейсу користувача",
-       "right-editusercssjs": "Редагування CSS- і JS-файлів інших користувачів",
-       "right-editusercss": "Редагування CSS-файлів інших користувачів",
-       "right-edituserjs": "Редагування JS-файлів інших користувачів",
-       "right-editmyusercss": "Редагування власних CSS-файлів користувача",
-       "right-editmyuserjs": "Редагування власних JavaScript-файлів користувача",
-       "right-viewmywatchlist": "Ð\9fеÑ\80еглÑ\8fдаÑ\82и Ð²Ð»Ð°Ñ\81ний Ñ\81пиÑ\81ок спостереження",
-       "right-editmywatchlist": "Редагувати власний список спостереження. Зверніть увагу, що деякі дії будуть додавати сторінки навіть без такого права.",
-       "right-viewmyprivateinfo": "Ð\9fерегляд власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
-       "right-editmyprivateinfo": "Редагування власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
-       "right-editmyoptions": "Редагування власних налаштувань",
-       "right-rollback": "Швидкий відкіт редагувань останнього користувача, який редагував сторінку",
-       "right-markbotedits": "Ð\9fозначення відкинутих редагувань як редагування бота",
-       "right-noratelimit": "Ð\9dема обмежень за швидкістю",
-       "right-import": "Імпорт сторінок з інших вікі",
+       "right-editinterface": "редагування інтерфейсу користувача",
+       "right-editusercssjs": "редагування CSS- і JS-файлів інших користувачів",
+       "right-editusercss": "редагування CSS-файлів інших користувачів",
+       "right-edituserjs": "редагування JS-файлів інших користувачів",
+       "right-editmyusercss": "редагування власних CSS-файлів користувача",
+       "right-editmyuserjs": "редагування власних JavaScript-файлів користувача",
+       "right-viewmywatchlist": "пеÑ\80еглÑ\8fд Ð²Ð»Ð°Ñ\81ного Ñ\81пиÑ\81кÑ\83 спостереження",
+       "right-editmywatchlist": "редагування власного списку спостереження; зверніть увагу, що деякі дії будуть додавати сторінки навіть без такого права.",
+       "right-viewmyprivateinfo": "перегляд власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
+       "right-editmyprivateinfo": "редагування власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
+       "right-editmyoptions": "редагування власних налаштувань",
+       "right-rollback": "швидкий відкіт редагувань останнього користувача, який редагував сторінку",
+       "right-markbotedits": "позначення відкинутих редагувань як редагування бота",
+       "right-noratelimit": "нема обмежень за швидкістю",
+       "right-import": "імпорт сторінок з інших вікі",
        "right-importupload": "Імпорт сторінок через завантаження файлів",
-       "right-patrol": "Ð\9fозначення редагувань патрульованими",
-       "right-autopatrol": "Ð\90втоматичне позначення редагувань патрульованими",
+       "right-patrol": "позначення редагувань патрульованими",
+       "right-autopatrol": "автоматичне позначення редагувань патрульованими",
        "right-patrolmarks": "Перегляд патрульованих сторінок у нових редагуваннях",
-       "right-unwatchedpages": "Ð\9fерегляд списку сторінок, за якими ніхто не спостерігає",
-       "right-mergehistory": "Ð\9eб'єднання історій редагувань сторінок",
-       "right-userrights": "Ð\97міна всіх прав користувачів",
+       "right-unwatchedpages": "перегляд списку сторінок, за якими ніхто не спостерігає",
+       "right-mergehistory": "об'єднання історій редагувань сторінок",
+       "right-userrights": "зміна всіх прав користувачів",
        "right-userrights-interwiki": "Зміна прав користувачів у інших вікі",
        "right-siteadmin": "Блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
        "right-passwordreset": "Перегляд повідомлень електронної пошти для зміни паролю",
-       "right-managechangetags": "Створення та вилучення [[Special:Tags|міток]] з бази даних",
+       "right-managechangetags": "створення та вилучення [[Special:Tags|міток]] з бази даних",
        "newuserlogpage": "Журнал нових користувачів",
        "newuserlogpagetext": "Список нещодавно зареєстрованих користувачів.",
        "rightslog": "Журнал прав користувача",
        "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
        "listfiles_search_for": "Пошук по назві зображення:",
+       "listfiles-userdoesnotexist": "Облыковий запис «$1» не зареэстровано.",
        "imgfile": "файл",
        "listfiles": "Список файлів",
        "listfiles_thumb": "Мініатюра",
        "listgrouprights-members": "(список членів)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "Ð\9cожливість додавати в {{PLURAL:$2|1=групу|групи}}: $1",
-       "listgrouprights-removegroup": "Ð\9cожливість виключати з {{PLURAL:$2|1=групи|груп}}: $1",
-       "listgrouprights-addgroup-all": "Ð\9cожливість додавати до всіх груп",
-       "listgrouprights-removegroup-all": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ»Ñ\8eÑ\87аÑ\82и Ð·Ñ\96 Ð²сіх груп",
+       "listgrouprights-addgroup": "можливість додавати в {{PLURAL:$2|1=групу|групи}}: $1",
+       "listgrouprights-removegroup": "можливість виключати з {{PLURAL:$2|1=групи|груп}}: $1",
+       "listgrouprights-addgroup-all": "можливість додавати до всіх груп",
+       "listgrouprights-removegroup-all": "можливÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸ÐºÐ»Ñ\8eÑ\87аÑ\82и Ð· Ñ\83сіх груп",
        "listgrouprights-addgroup-self": "може додавати {{PLURAL:$2|1=групу|групи}} до свого облікового запису: $1",
        "listgrouprights-removegroup-self": "Можливість вилучити зі свого облікового запису {{PLURAL:$2|1=групу|групи}}: $1",
        "listgrouprights-addgroup-self-all": "Може додавати всі групи до свого облікового запису",
        "import-interwiki-history": "Копіювати всю історію змін цієї сторінки",
        "import-interwiki-templates": "Включити всі шаблони",
        "import-interwiki-submit": "Імпортувати",
-       "import-interwiki-namespace": "Цільовий простір назв:",
-       "import-interwiki-rootpage": "Коренева сторінка (необов'язково):",
        "import-upload-filename": "Назва файлу:",
        "import-comment": "Примітка:",
        "importtext": "Будь ласка, експортуйте сторінку з іншої вікі, використовуючи [[Special:Export|засіб експорту]], збережіть файл, а потім завантажте його сюди.",
        "pageinfo-protect-cascading-yes": "Так",
        "pageinfo-protect-cascading-from": "Каскадний захист починається тут",
        "pageinfo-category-info": "Інформація про категорію",
+       "pageinfo-category-total": "Загальна кількість членів",
        "pageinfo-category-pages": "Кількість сторінок",
        "pageinfo-category-subcats": "Кількість підкатегорій",
        "pageinfo-category-files": "Кількість файлів",
        "tags-deactivate-reason": "Причина:",
        "tags-deactivate-not-allowed": "Неможливо вимкнути мітку «$1».",
        "tags-deactivate-submit": "Вимкнути",
+       "tags-edit-title": "Редагувати теги",
+       "tags-edit-existing-tags": "Існуючі теги:",
+       "tags-edit-new-tags": "Нові теги:",
+       "tags-edit-success": "Зміни успішно застосовано",
        "comparepages": "Порівняння сторінок",
        "compare-page1": "Сторінка 1",
        "compare-page2": "Сторінка 2",
index e1d187f..3c93d85 100644 (file)
        "revdelete-log": "理由:",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
        "revdelete-success": "'''修订个可见性已经成功更新。'''",
-       "revdelete-failure": "<strong>版本个可见性无法更新:</strong>$1",
+       "revdelete-failure": "版本个可见性无法更新:$1",
        "logdelete-success": "'''事件个可见性已经成功设置。'''",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "revdel-restore": "改变可见性",
        "deleteotherreason": "其它/附加理由:",
        "deletereasonotherlist": "别个理由",
        "rollback": "恢复编辑",
-       "rollback_short": "恢复",
        "rollbacklink": "回退",
        "rollbackfailed": "恢复失败",
        "revertpage": "恢复[[Special:Contributions/$2|$2]] ([[User talk:$2|讲张]])个改动;恢复到[[User:$1|$1]]个上一版本",
index fa623c1..09ab08c 100644 (file)
        "wrongpassword": "אומריכטיגע פאסווארט אריינגעלייגט.\nביטע פרובירט נאכאמאל.",
        "wrongpasswordempty": "פאסווארט אריינגעלייגט איז געווען ליידיג.\nביטע פרובירט נאכאמאל.",
        "passwordtooshort": "פאַסווערטער מוזן זײַן כאטש {{PLURAL:$1|איין כאַראַקטער|$1 כאַראַקטערס}}.",
+       "passwordtoolong": "פאַסווערטער טארן נישט זיין לענגער וויי {{PLURAL:$1|איין כאַראַקטער|$1 כאַראַקטערס}}.",
        "password-name-match": "אײַער פאַסווארט מוז זײַן אנדערש פון אײַער באַניצער נאָמען.",
        "password-login-forbidden": "באַניצן דעם נאָמען און שפּריכוואָרט איז פאַרבאָטן.",
        "mailmypassword": "צוריקשטעלן פאַסווארט",
        "missingcommentheader": "'''דערמאַנונג:''' איר האט נישט אַרײַנגעשטעלט א טעמע/קעפל פאר דער אנמערקונג. אויב וועט איר דרוקן נאכאמאל אויפן \"{{int:savearticle}}\", וועט אייער ענדערונג ווערן אפגעהיטן אן דעם.",
        "summary-preview": "סך-הכל פאראויסדיגע ווייזונג:",
        "subject-preview": "טעמע/קעפל פאראויסדיגע ווייזונג:",
+       "previewerrortext": "א פעלער האט פאסירט ביים פרובירן פארויסקוקן אײַערע ענדערונגען.",
        "blockedtitle": "באַניצער איז בלאקירט",
        "blockedtext": "'''אייער באניצער נאמען אדער IP אדרעס איז געווארן בלאקירט.'''\n\nדעם בלאק האט $1 געמאכט פון וועגן ''$2''.\n\n* בלאקירן הייבט אן: $8\n* בלאקירן גייט אויס: $6\n* בלאק מכוון צו: $7\n\nאיר קענט זיך ווענדן צו $1 אדער צו אנדערע [[{{MediaWiki:Grouppage-sysop}}|אדמיניסטראטארן]] אדורכצורעדן דעם בלאק.\n\nגיט אכט אז איר קענט נישט ניצן די \"שיקט דעם באניצער א ע-פאסט\" אייגנקייט אויב האט איר נישט איינגעשטעלט אין אייערע [[Special:Preferences|קונטע פרעפערענצן]] א גילטיקן בליצפאסט אדרעסדאס אדער איר זענט בלאקירט פון שיקן בליצפאסט.\n\nאייער IP אדרעס איז $3, און דער בלאק האט נומער #$5. ביטע שיקט איינעם פון די צוויי (אדער זיי ביידע) ווען איר ווענדט זיך צו די אדמיניסטראטורן.",
        "autoblockedtext": "אײַער [[IP אדרעס|אײַ־פּי־אַדרעס]] איז בלאָקירט געװאָרן אױטאָמאַטיש, צוליב דעם װאָס אַן אַנדער באַניצער װאָס איז בלאָקירט געװאָרן דורך $1 האָט זיך געניצט דעם דאָזיקן אײַ־פּי.\nדי אורזאַך פֿון דער בלאָקירונג איז:\n\n:'''$2'''\n\n* אנהייב פון דער בלאקירונג: $8\n* ענדע פון דער בלאָקירונג: $6\n* וועמען בלאקירט: ִ$7\n\nאיר קענט זיך פֿאַרבינדן דורכן בליצבריװ מיט $1 אָדער מיט יעדן אַנדערן [[{{MediaWiki:Grouppage-sysop}}|סיסאָפּ]] צו דיסקוטירן װעגן דער בלאָקירונג.\n\nאױב האָט איר ניט אַרײַנגעקלאַפּט אײַער בליצפּאָסט־אַדרעס אין אײַערע [[Special:Preferences|פּרעפֿערענצן]] אדער איר זענט בלאקירט פון שיקן בליצפאסט, קענט איר זיך ''נישט'' ניצן די אפציע \"שיקט דעם באניצער אן ע-פאסט\".\n\nאייער יעצטיגער IP אדרעס איז $3, און דער בלאָקירונג־נומער איז #$5.\nביטע צײכנט עס אָן בשעת איר װענדט זיך צו די סיסאָפּן.",
        "history-feed-description": "ווערסיע היסטאריע פאר דעם בלאט אויפן וויקי",
        "history-feed-item-nocomment": "$1 אין $2",
        "history-feed-empty": "דער געבעטענער בלאט עקזיסטירט נישט.\nעס איז מעגליך אויסגעמעקט געווארן פון דער וויקי, אדער דער נאמען געטוישט.\nפרובירט [[Special:Search|צו זיכן אין וויקי]] נאך רעלאווענטע נייע בלעטער.",
+       "history-edit-tags": "רעדאקטירן טאגן פון אויסגעקליבענע ווערסיעס",
        "rev-deleted-comment": "(קורץ־ווארט אראָפגענומען)",
        "rev-deleted-user": "(באנוצער נאמען אראפגענומען)",
        "rev-deleted-event": "(לאגירן פרטים אראפגענומען)",
        "rev-showdeleted": "ווײַזן",
        "revisiondelete": "אויסמעקן\\צוריקשטעלן רעוויזיעס",
        "revdelete-nooldid-title": "ציל ווערסיע נישט גילטיג",
-       "revdelete-nooldid-text": "×\90×\99ר ×\94×\90×\98 × ×\99ש×\98 ×¡×¤×¢×¦×\99פ×\99ר×\98 ×§×\99×\99×\9f ×¦×\99×\9c ×\95×\95ערס×\99×¢ ×\93×\95רצ×\95×\9bפ×\99ר×\9f ×\93×\99 ×¤×\95נקציע.",
+       "revdelete-nooldid-text": "×\90×\93ער ×\94×\90×\98 ×\90×\99ר × ×\99ש×\98 ×¡×¤×¢×¦×\99פ×\99ר×\98 ×§×\99×\99×\9f ×¦×\99×\9c ×\95×\95ערס×\99×¢ ×\93×\95רצ×\95×\9bפ×\99ר×\9f ×\93×\99 ×¤×\95נקצ×\99×¢, ×\90×\93ער ×\93×\99 ×¡×¤×¢×¦×\99פ×\99ר×\98×¢ ×\95×\95ערס×\99×¢ ×¢×§×\96×\99ס×\98×\99רנ×\93×¢ × ×\99ש×\98, ×\90×\93ער ×¤×\90ר×\96×\95×\9b×\98 ×\90×\99ר ×\91×\90×\94×\90×\9c×\98×\9f ×\93×\99 ×\9c×\95×\99פ×\99קע ×\95×\95ערסיע.",
        "revdelete-no-file": "די ספעציפֿירטע טעקע עקזיסטירט נישט.",
        "revdelete-show-file-confirm": "צי זענט איר זעכער איר ווילט באַקוקן אַן אויסגעמעקטע רעוויזיע פון דער טעקע \"<nowiki>$1</nowiki>\" פון $2 בשעה $3?",
        "revdelete-show-file-submit": "יא",
        "notextmatches": "נישטאָ קיין בלעטער מיט פאַסנדיקן אינהאַלט",
        "prevn": "{{PLURAL:$1|פֿריערדיקער|$1 פֿריערדיקע}}",
        "nextn": "{{PLURAL:$1|$1}} קומענדיגע",
+       "prev-page": "פֿריערדיגער בלאַט",
+       "next-page": "קומענדיגער בלאַט",
        "prevn-title": "{{PLURAL:$1|פֿריערדיגער $1 רעזולטאַט|פֿריערדיגע $1 רעזולטאַטן}}",
        "nextn-title": "{{PLURAL:$1|קומענדיקער רעזולטאַט|קומענדיקע $1 רעזולטאַטן}}",
        "shown-title": "ווײַזן $1  {{PLURAL:$1|רעזולטאַט| רעזולטאַטן}} אויף א בלאַט",
        "right-sendemail": "שיקן ע-פאסט צו אנדערע באניצער",
        "right-passwordreset": "באַקוקן פאַסווארט צוריקשטעלן ע־בריוו",
        "right-managechangetags": " [[Special:Tags|טאגן]] פון דעם שאפן און אויסמעקן",
+       "right-applychangetags": "אנווענדן [[Special:Tags|טאגן]] צוזאמען מיט ענדערונגען",
        "newuserlogpage": "נייע באַניצערס לאָג-בוך",
        "newuserlogpagetext": "דאס איז א לאג פון באַניצערס אײַנשרײַבונגען.",
        "rightslog": "באַניצער רעכטן לאג",
        "listfiles-delete": "אויסמעקן",
        "listfiles-summary": "דער דאזיקער באזונדערער בלאט ווייזט אלע ארויפגעלאדענע טעקעס.",
        "listfiles_search_for": "זוכן פֿאַר מעדיע נאָמען:",
+       "listfiles-userdoesnotexist": "באניצער קאנטע \"$1\" נישט איינגעשריבן.",
        "imgfile": "טעקע",
        "listfiles": "טעקע ליסטע",
        "listfiles_thumb": "געמינערט בילד",
        "emailccsubject": "קאפיע פון אײַער מעלדונג צו $1: $2",
        "emailsent": "ע-פאסט געשיקט",
        "emailsenttext": "אײַער אי-בריוו איז געשיקט געווארן.",
-       "emailuserfooter": "דער בליצבריוו איז געשיקט געווארן דורך$1 צו $2 מיט דער  \"שיקן בליצבריוו\"  פֿונקציע בײַ {{SITENAME}}.",
+       "emailuserfooter": "דער בליצבריוו איז געשיקט געווארן דורך$1 צו $2 מיט דער  \"{{int:emailpage}}\" פֿונקציע בײַ {{SITENAME}}.",
        "usermessage-summary": "איבערלאזן סיסטעם אָנזאָג",
        "usermessage-editor": "סיסטעם שליח",
        "usermessage-template": "MediaWiki:באניצער־מעלדונג",
        "import-interwiki-history": "קאפירן אלע היסטאריע ווערסיעס פאר דעם בלאט",
        "import-interwiki-templates": "איינשילסן אלע מוסטערן",
        "import-interwiki-submit": "אימפארט",
-       "import-interwiki-namespace": "ציל נאמענטייל:",
-       "import-interwiki-rootpage": "ציל שטאמבלאט (אפציאנאל):",
        "import-upload-filename": "טעקע נאמען:",
        "import-comment": "הערה:",
        "importtext": "ביטע עקספארטירט די טעקע פון דער מקור וויקי ניצנדיג דאס [[Special:Export|עקספארט הילפמיטל]], שפייכלט אײַן אויף אײַער קאמפיוטער און לאדט אַרויף דא.",
index 7c6e698..cb627d7 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "將我修改嘅頁同檔案加入監視清單",
        "tog-watchmoves": "將我移動嘅頁同檔案加入監視清單",
        "tog-watchdeletion": "將我刪除嘅頁同檔案加入監視清單",
+       "tog-watchrollback": "將我反轉過嘅頁加落監視清單",
        "tog-minordefault": "預設全部編輯做小修改",
        "tog-previewontop": "喺修改欄上方顯示預覽",
        "tog-previewonfirst": "第一次修改時顯示預覽",
        "pool-queuefull": "隊池已滿",
        "pool-errorunknown": "未知嘅錯誤",
        "pool-servererror": "用唔到程序計數服務 ($1)。",
+       "poolcounter-usage-error": "用法出錯:$1",
        "aboutsite": "關於{{SITENAME}}",
        "aboutpage": "Project:關於",
        "copyright": "除非另外講明,響呢版度嘅內容係根據$1嘅條款發佈。",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:一般免責聲明",
        "edithelp": "編輯協助",
+       "helppage-top-gethelp": "幫手",
        "mainpage": "頭版",
        "mainpage-description": "頭版",
        "policy-url": "Project:政策",
        "readonly_lag": "當從伺服器追緊主伺服器時,資料庫會自動被鎖",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤: $1",
+       "internalerror-fatal-exception": "嚴重例外類型「$1」",
        "filecopyerror": "檔案 \"$1\" 抄唔到去 \"$2\"。",
        "filerenameerror": "檔案 \"$1\" 唔改得做 \"$2\"。",
        "filedeleteerror": "檔案 \"$1\" 唔刪得。",
        "wrongpassword": "密碼唔啱,麻煩你再試多次。",
        "wrongpasswordempty": "你都未入密碼,唔該再試多次啦。",
        "passwordtooshort": "你嘅密碼最少要有$1個半形字元。",
+       "passwordtoolong": "密碼唔可以長過{{PLURAL:$1|1個字元|$1個字元}}。",
        "password-name-match": "你嘅密碼一定要同你嘅用戶名唔一樣。",
        "password-login-forbidden": "呢個用戶名同密碼嘅利用係被禁止嘅。",
        "mailmypassword": "重設密碼",
        "anoneditwarning": "'''警告:'''閣下重未登入。閣下嘅 IP 地址會喺爾一版嘅修訂歷史裡邊記錄落嚟。",
        "anonpreviewwarning": "''你重未登入,你嘅 IP 位址會喺呢個頁面嘅修訂歷史中記錄落嚟。''",
        "missingsummary": "'''提醒:''' 你未提供編輯摘要。如果你再撳多一下「{{int:savearticle}}」嘅話,咁你儲存嘅編輯就會無摘要。",
+       "selfredirect": "<strong>警告:</strong> 你個跳轉彈返去自己度。\n你可能設錯咗跳轉目標,或者改錯咗版。\n如果你再撳多「{{int:savearticle}}」一下,就會照幫你開呢個跳轉。",
        "missingcommenttext": "請輸入一個註解。",
        "missingcommentheader": "'''提醒:'''你響呢個註解度並無提供一個主題/標題。如果你再撳一次「{{int:savearticle}}」,你嘅編輯就會無題。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "標題/頭條預覽:",
+       "previewerrortext": "預覽你嘅修改嗰陣出錯。",
        "blockedtitle": "用戶已經封鎖",
        "blockedtext": "你嘅用戶名或者 IP 位址已經被 $1 封咗。\n\n呢次封鎖係由$1所封嘅。當中嘅原因係''$2''。\n\n* 呢次封鎖嘅開始時間係:$8\n* 呢次封鎖嘅到期時間係:$6\n* 對於被封鎖者:$7\n\n你可以聯絡 $1 或者其他嘅[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論呢次封鎖。\n除非你已經響你嘅[[Special:Preferences|戶口喜好設定]]入面設定咗有效嘅電郵地址,否則你係唔可以用「電郵呢個用戶」嘅功能。當設定咗一個有效嘅電郵地址之後,呢個功能係唔會封鎖嘅。\n\n你現時嘅 IP 位址係 $3 ,而個封鎖 ID 係 #$5。 請你喺你嘅查詢都註明以上封鎖嘅資料。",
        "autoblockedtext": "你嘅IP地址已經被自動封鎖,由於之前嘅另一位用戶係畀$1封咗。\n而封鎖嘅原因係:\n\n:''$2''\n\n* 呢次封鎖嘅開始時間係:$8\n* 呢次封鎖嘅到期時間係:$6\n* 對於被封鎖者:$7\n\n你可以聯絡 $1 或者其他嘅[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論呢次封鎖。\n\n除非你已經響你嘅[[Special:Preferences|戶口喜好設定]]入面設定咗有效嘅電郵地址,否則你係唔可以用「電郵呢個用戶」嘅功能。當設定咗一個有效嘅電郵地址之後,呢個功能係唔會封鎖嘅。\n\n你現時用緊嘅 IP 地址係 $3,個封鎖 ID 係 #$5。 請喺你嘅查詢都註明呢個封鎖上面嘅資料。",
        "postedit-confirmation-saved": "呢版經已儲存咗。",
        "edit-already-exists": "唔可以開一新版。\n佢已經存在。",
        "defaultmessagetext": "預設訊息文字",
+       "invalid-content-data": "無效嘅內容資料",
        "content-not-allowed-here": "「$1」唔可以輸入[[$2]]。",
        "editwarning-warning": "離開爾一版會令到閣下嘅修改唔見咗。\n閣下可以喺喜好設定嘅\"{{int:prefs-editing}}\"小節度停用爾個警告。",
        "editpage-notsupportedcontentformat-title": "唔支持爾種內容格式。",
        "content-model-text": "純文字",
        "content-model-javascript": "JavaScript程式語言",
        "content-model-css": "層疊樣式表",
+       "content-json-empty-object": "吉嘅嘢",
+       "content-json-empty-array": "吉嘅陣列",
        "duplicate-args-category": "模用重複參數嘅嘅版面",
        "expensive-parserfunction-warning": "警告: 呢一版有太多耗費嘅語法功能呼叫。\n\n佢應該少過$2次呼叫,佢而家係$1次呼叫。",
        "expensive-parserfunction-category": "響版度有太多嘅耗費嘅語法功能呼叫",
        "undo-success": "呢個編輯可以取消。請檢查一下個差異去確認呢個係你要去做嘅,跟住儲存下面嘅更改去完成編輯。",
        "undo-failure": "呢個編輯唔能夠取消,由於同途中嘅編輯有衝突。",
        "undo-norev": "呢個編輯唔能夠取消,由於佢唔存在或者刪除咗。",
+       "undo-nochange": "呢個編輯睇嚟經已一早取消咗。",
        "undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所做嘅修訂 $1",
+       "undo-summary-username-hidden": "取消匿埋咗嘅用戶嘅修改版本 $1",
        "cantcreateaccounttitle": "唔可以開新戶口",
        "cantcreateaccount-text": "由呢個IP地址 ('''$1''') 開嘅新戶口已經被[[User:$3|$3]]封鎖。\n\n當中俾$3封鎖嘅原因係''$2''",
+       "cantcreateaccount-range-text": "由呢個IP地址範圍'''$1'''(包括你個IP '''$4''')開嘅新戶口已經畀[[User:$3|$3]]封鎖咗。\n\n$3畀嘅理由係''$2''",
        "viewpagelogs": "睇呢頁嘅日誌",
        "nohistory": "呢版冇歷史。",
        "currentrev": "最新嘅修訂",
        "revdelete-no-file": "指定嘅檔案未存在。",
        "revdelete-show-file-confirm": "你係咪真係想去睇響$2 $3刪咗 \"$1\" 嘅檔案修訂?",
        "revdelete-show-file-submit": "係",
+       "revdelete-selected-text": "揀咗[[:$2]]嘅$1個版本:",
+       "revdelete-selected-file": "揀咗[[:$2]]嘅$1個檔案版本:",
        "logdelete-selected": "揀咗嘅日誌事件:",
+       "revdelete-text-text": "刪咗嘅版本重喺修改紀錄度,但入面嘅內容唔畀公眾睇。",
+       "revdelete-text-file": "刪咗嘅檔案版本重喺檔案修改紀錄度,但入面嘅內容唔畀公眾睇。",
+       "logdelete-text": "刪咗嘅日誌項目重喺日誌度,但入面嘅內容唔畀公眾睇。",
+       "revdelete-text-others": "其他管理員可以睇收埋咗嘅內容同埋恢復返佢,除非設咗額外條件。",
        "revdelete-confirm": "請確認你肯定去做嘅話,你就要明白到後果,同埋呢個程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
        "revdelete-suppress-text": "壓制'''只'''應該響下面嘅情況之下進行:\n* 可能係誹謗嘅資料\n* 唔合適嘅個人資料\n*: ''屋企地址、電話號碼、身份證號碼等。''",
        "revdelete-legend": "設定可見性嘅限制",
        "mergehistory-empty": "無修訂可以合併",
        "mergehistory-success": "[[:$1]]嘅$3次修訂已經成功噉合併到[[:$2]]。",
        "mergehistory-fail": "歷史合併唔到,請重新檢查嗰一版同埋時間參數。",
+       "mergehistory-fail-toobig": "唔能夠合併編輯紀錄,因為入面超過咗$1個版本嘅上限。",
        "mergehistory-no-source": "來源頁$1唔存在。",
        "mergehistory-no-destination": "目的頁$1唔存在。",
        "mergehistory-invalid-source": "來源頁一定要係一個有效嘅標題。",
        "mergelogpagetext": "下面係一個最近由一版嘅修訂記錄合併到另一個嘅一覽。",
        "history-title": "「$1」嘅修訂歷史",
        "difference-title": "\"$1\" 版本嘅差別",
+       "difference-title-multipage": "「$1」同「$2」嘅差別",
        "difference-multipage": "(版之間嘅差異)",
        "lineno": "第$1行:",
        "compareselectedversions": "比較被選嘅修訂",
        "showhideselectedversions": "顯示/隱藏揀咗嘅修訂",
        "editundo": "復原",
+       "diff-empty": "(無差別)",
        "diff-multi-sameuser": "(無顯示同一用戶中途改嘅 $1 個版本)",
+       "diff-multi-otherusers": "(無顯示{{PLURAL:$2|另一個用戶|另外$2個用戶}}中途改嘅 $1 個版本)",
        "diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
        "searchresults": "搵嘢結果",
        "searchresults-title": "對\"$1\"嘅搵嘢結果",
        "notextmatches": "冇頁面文字符合",
        "prevn": "前$1",
        "nextn": "後{{PLURAL:$1|$1}}",
+       "prev-page": "上一版",
+       "next-page": "下一版",
        "prevn-title": "前$1項結果",
        "nextn-title": "後$1項結果",
        "shown-title": "每版顯示$1項結果",
        "search-result-category-size": "$1位成員 ($2個細類,$3個檔案)",
        "search-redirect": "(跳轉 $1)",
        "search-section": "(小節 $1)",
+       "search-category": "(類 $1)",
+       "search-file-match": "(夾啱樓案内容)",
        "search-suggest": "你係唔係搵: $1",
        "search-interwiki-caption": "姊妹計劃",
-       "search-interwiki-default": "$1項結果:",
+       "search-interwiki-default": "嚟自$1嘅結果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "有關",
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
+       "showingresultsinrange": "下面顯示由第 <strong>$2</strong> 個到第 <strong>$3</strong> 個入面嘅第 {{PLURAL:$1|<strong>$1</strong> 個結果}}:",
        "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong>個結果,一共有 <strong>$3</strong> 個|第 <strong>$1 - $2</strong> 個結果,一共有 <strong>$3</strong> 個}}",
        "search-nonefound": "響個查詢度無結果配合。",
        "powersearch-legend": "進階搵嘢",
        "powersearch-togglelabel": "检查:",
        "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
+       "powersearch-remember": "記住今次選擇方便第時搵嘢用返",
        "search-external": "出面搵嘢",
        "searchdisabled": "{{SITENAME}}嘅搜尋功能已經關閉。你可以利用Google嚟搵。不過佢哋對{{SITENAME}}嘅索引可能唔係最新嘅。",
+       "search-error": "搵嘢嗰陣出錯:$1",
        "preferences": "喜好設定",
        "mypreferences": "自訂喜好",
        "prefs-edits": "編輯數:",
+       "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": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "最多 $1 日",
        "prefs-watchlist-edits": "喺加強版監視清單度嘅最多顯示更改數:",
        "prefs-watchlist-edits-max": "最大數量:1000",
        "prefs-watchlist-token": "監視清單幣:",
        "prefs-misc": "雜項",
        "prefs-resetpass": "改密碼",
+       "prefs-changeemail": "改電郵地址",
+       "prefs-setemail": "入電郵地址",
        "prefs-email": "電郵選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
-       "restoreprefs": "恢復全部預設設定",
+       "restoreprefs": "恢復全部預設設定(喺所有項目)",
        "prefs-editing": "編輯中",
        "rows": "行數:",
        "columns": "列數:",
        "recentchangesdays-max": "最多 $1 日",
        "recentchangescount": "預設顯示嘅編輯數:",
        "prefs-help-recentchangescount": "呢個包埋最近修改、頁歷史同埋日誌紀錄。",
+       "prefs-help-watchlist-token2": "呢個係網上訂閱你個監視清單嘅密匙。\n任何人只要知道個密匙,就會睇到你個監視清單,所以唔好畀人知。\n如果有需要嘅話,[[Special:ResetTokens|你可以重設佢]]。",
        "savedprefs": "你嘅喜好設定已經儲存。",
        "timezonelegend": "時區:",
        "localtime": "本地時間:",
-       "timezoneuseserverdefault": "用伺服器預設值",
+       "timezoneuseserverdefault": "用維基預設值($1)",
        "timezoneuseoffset": "其他 (指定偏移)",
        "servertime": "伺機器時間:",
        "guesstimezone": "由瀏覽器填上",
        "timezoneregion-indian": "印度洋",
        "timezoneregion-pacific": "太平洋",
        "allowemail": "由其它用戶啟用電子郵件",
-       "prefs-searchoptions": "搵嘢選項",
+       "prefs-searchoptions": "搵嘢",
        "prefs-namespaces": "空間名",
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-reset-intro": "你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。",
        "prefs-emailconfirm-label": "電郵確認:",
        "youremail": "電郵:",
-       "username": "用戶名:",
-       "prefs-memberingroups": "{{PLURAL:$1|一|多}}組嘅成員:",
+       "username": "{{GENDER:$1|用戶名}}:",
+       "prefs-memberingroups": "{{PLURAL:$1|組}}嘅{{GENDER:$2|成員}}:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真名:",
        "yourlanguage": "話:",
-       "yourvariant": "變換:",
+       "yourvariant": "內容語言變換:",
+       "prefs-help-variant": "你想喺呢度嘅內容顯示嘅語言變換。",
        "yournick": "新花名:",
        "prefs-help-signature": "響討論版嘅評論應該要用 \"<nowiki>~~~~</nowiki>\" 簽名,噉就會轉做你嘅簽名同埋一個時間截記。",
        "badsig": "無效嘅程式碼簽名。檢查吓 HTML 有無錯。",
        "badsiglength": "你嘅花名太長喇。\n唔長得過$1個字元。",
-       "yourgender": "性別:",
-       "gender-unknown": "æ\9cªæ\8c\87å®\9a",
-       "gender-male": "",
-       "gender-female": "女",
-       "prefs-help-gender": "å\8f¯é\81¸: ç\94¨å\9a\9fæ\95´è»\9f件æ\80§å\88¥æ\8c\87å®\9aã\80\82呢項資料將會被公開。",
+       "yourgender": "你想點畀人稱呼?",
+       "gender-unknown": "æ\88\91å\94\94æ\83³è¬\9b",
+       "gender-male": "佢寫維基",
+       "gender-female": "å§\96寫維å\9fº",
+       "prefs-help-gender": "å\91¢é \85å\8f¯ä»¥è\87ªå·±æ\8f\80å¡«å®\9aå\94\94å¡«ã\80\82\n系統æ\9c\83ç\94¨å\91¢é \85è³\87æ\96\99å\9a\9få\88¤æ\96·é»\9eç\94¨é\81©ç\95¶èª\9eæ³\95å\8e»ç¨±å\91¼ä½ ã\80\82\n呢項資料將會被公開。",
        "email": "電郵",
-       "prefs-help-realname": "真名可以唔填。\n如果你畀埋佢,有需要嘅時候會用佢來標示你嘅工夫。",
+       "prefs-help-realname": "真名可以揀填定唔填。\n如果你畀埋佢,可能會用佢嚟標示你嘅貢獻。",
        "prefs-help-email": "電郵地址可以唔填,但當你唔記得咗你個密碼嗰陣需要利用電郵地址將新密碼重設寄番畀你。",
        "prefs-help-email-others": "亦可以響人哋唔知你電郵地址嘅情況之下都可以聯絡你。",
        "prefs-help-email-required": "需要電郵地址。",
        "prefs-signature": "簽名",
        "prefs-dateformat": "日期格式",
        "prefs-timeoffset": "時間偏移",
-       "prefs-advancedediting": "進階選項",
+       "prefs-advancedediting": "普通選項",
+       "prefs-editor": "編輯",
+       "prefs-preview": "預覽",
        "prefs-advancedrc": "進階選項",
        "prefs-advancedrendering": "進階選項",
        "prefs-advancedsearchoptions": "進階選項",
        "prefs-advancedwatchlist": "進階選項",
        "prefs-displayrc": "顯示選項",
        "prefs-displaywatchlist": "顯示選項",
+       "prefs-tokenwatchlist": "密匙",
        "prefs-diffs": "差異",
+       "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
+       "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
        "email-address-validity-valid": "電郵地址睇嚟有效",
        "email-address-validity-invalid": "請打一個有效嘅電郵地址",
        "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}}]]) 嘅用戶權限",
+       "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-editusergroup": "編輯用戶組",
        "saveusergroups": "儲存用戶組",
        "userrights-groupsmember": "屬於:",
        "userrights-no-interwiki": "你並無權限去編輯響其它wiki嘅用戶權限。",
        "userrights-nodatabase": "資料庫$1唔存在或者唔係本地嘅。",
        "userrights-nologin": "你一定要以操作員戶口[[Special:UserLogin|登入]]咗之後先可以指定用戶權限。",
-       "userrights-notallowed": "你嘅戶口無權限去指定用戶權限。",
+       "userrights-notallowed": "你無權限去加減用戶權限。",
        "userrights-changeable-col": "你可以改嘅組",
        "userrights-unchangeable-col": "你唔可以改嘅組",
        "group": "組:",
        "group-bureaucrat": "事務員",
        "group-suppress": "監督",
        "group-all": "(全部)",
-       "group-user-member": "用戶",
-       "group-autoconfirmed-member": "自動確認用戶",
+       "group-user-member": "{{GENDER:$1|用戶}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|自動確認用戶}}",
        "group-bot-member": "{{GENDER:$1|機械人}}",
        "group-sysop-member": "{{GENDER:$1|管理員}}",
-       "group-bureaucrat-member": "事務員",
-       "group-suppress-member": "監督",
+       "group-bureaucrat-member": "{{GENDER:$1|事務員}}",
+       "group-suppress-member": "{{GENDER:$1|監督}}",
        "grouppage-user": "{{ns:project}}:用戶",
        "grouppage-autoconfirmed": "{{ns:project}}:自動確認用戶",
        "grouppage-bot": "{{ns:project}}:機械人",
        "right-reupload-shared": "於本地無視共用媒體檔案庫上嘅檔案",
        "right-upload_by_url": "由一個URL上載檔案",
        "right-purge": "唔需要確認之下清除網站快取",
-       "right-autoconfirmed": "編輯半保護版",
+       "right-autoconfirmed": "唔受IP嘅利用率限制影響",
        "right-bot": "視為一個自動程序",
        "right-nominornewtalk": "小編輯唔引發新信息提示",
        "right-apihighlimits": "響API查詢度用更高嘅上限",
        "right-deletedtext": "睇刪咗嘅修訂度嘅已刪嘅字同更改",
        "right-browsearchive": "搵刪咗嘅版",
        "right-undelete": "反刪版",
-       "right-suppressrevision": "睇同恢復由操作員隱藏嘅修訂",
+       "right-suppressrevision": "睇下、收埋同恢復任何用戶指定頁面版本",
        "right-suppressionlog": "去睇私人嘅日誌",
        "right-block": "封鎖其他用戶唔畀編輯",
        "right-blockemail": "封鎖用戶唔畀寄電郵",
        "right-hideuser": "封鎖用戶名,對公眾隱藏",
        "right-ipblock-exempt": "繞過IP封鎖、自動封鎖同埋範圍封鎖",
        "right-proxyunbannable": "繞過Proxy嘅自動封鎖",
-       "right-unblockself": "解封佢哋自己",
-       "right-protect": "改保護等級同埋編輯保護版",
-       "right-editprotected": "編輯ä¿\9dè­·ç\89\88ï¼\88ç\84¡é\80£ä¸²ä¿\9dè­·ï¼\89",
+       "right-unblockself": "解封自己",
+       "right-protect": "改保護等級同埋編輯流水保護版",
+       "right-editprotected": "ç\94¨ã\80\8c{{int:protect-level-sysop}}ã\80\8dæ¬\8aé\99\90å\8e»ç·¨è¼¯ä¿\9dè­·ç\89\88",
        "right-editinterface": "編輯用戶界面",
        "right-editusercssjs": "編輯其他用戶嘅CSS同埋JavaScript檔",
        "right-editusercss": "編輯其他用戶嘅CSS檔",
        "action-suppressionlog": "睇呢個私有日誌",
        "action-block": "封鎖呢位用戶嘅編輯",
        "action-protect": "改呢版嘅保護等級",
-       "action-import": "ç\94±å\8f¦ä¸\80å\80\8bwikiå\80\92å\85¥å\91¢ä¸\80版",
-       "action-importupload": "由一個檔案上載倒入呢一版",
+       "action-import": "ç\94±å\85¶å®\83wiki度å\80\92å\85¥版",
+       "action-importupload": "由檔案上載度倒入版",
        "action-patrol": "標示其它嘅編輯做已巡查嘅",
        "action-autopatrol": "將你嘅編輯標示做已巡查嘅",
        "action-unwatchedpages": "睇未畀人監視嘅版",
        "action-userrights": "編輯全部嘅權限",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
+       "action-sendemail": "送電郵",
+       "action-editmywatchlist": "改監視清單",
+       "action-viewmywatchlist": "睇監視清單",
+       "action-viewmyprivateinfo": "睇你嘅私人資料",
+       "action-editmyprivateinfo": "改你嘅私人資料",
        "nchanges": "$1次更改",
+       "enhancedrc-since-last-visit": "{{PLURAL:$1|你上次嚟之後}}有 $1 個",
        "enhancedrc-history": "歷史",
        "recentchanges": "最近改過嘅嘢",
        "recentchanges-legend": "最近更改選項",
        "recentchanges-summary": "追蹤對哩一個 wiki 嘅最後更改。",
+       "recentchanges-noresult": "喺指定時段無符合呢啲條件嘅改動。",
        "recentchanges-feed-description": "追蹤對哩一個 wiki 度呢個集合嘅最後更改。",
        "recentchanges-label-newpage": "呢次編輯開咗一個新版",
        "recentchanges-label-minor": "呢個係一個細編輯",
        "recentchanges-label-plusminus": "頁面位元組大細變化",
        "recentchanges-legend-heading": "'''標記:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
-       "rcnotefrom": "以ä¸\8bä¿\82è\87ª'''$2'''å\98\85æ\9b´æ\94¹(顯示到'''$1''')。",
+       "rcnotefrom": "ä¸\8bé\9d¢å\98\85{{PLURAL:$5|æ\94¹å\8b\95}}ç\94± <strong>$3 $4</strong> é\96\8bå§\8b(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "rcshowhideminor-show": "顯示",
        "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": "收埋",
        "rc_categories_any": "任何",
        "rc-change-size-new": "改完後係$1位元組",
        "newsectionsummary": "/* $1 */ 新小節",
-       "rc-enhanced-expand": "顯示細節 (需要 JavaScript)",
+       "rc-enhanced-expand": "顯示細節",
        "rc-enhanced-hide": "隱藏細節",
+       "rc-old-title": "原先標題係「$1」",
        "recentchangeslinked": "連結頁嘅更改",
        "recentchangeslinked-feed": "連結頁嘅更改",
        "recentchangeslinked-toolbox": "連結頁嘅更改",
        "reuploaddesc": "取消上載再返到去上載表格",
        "upload-tryagain": "遞交改咗嘅檔案描述",
        "uploadnologin": "重未登入",
-       "uploadnologintext": "你必須先[[Special:UserLogin|登入]]去上載檔案。",
+       "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}}:file.jpg<nowiki>]]</nowiki></code>'''去用檔案嘅完整版\n* '''<code><nowiki>[[</nowiki>{{ns:file}}:file.png|200px|thumb|left|替代文字<nowiki>]]</nowiki></code>'''去用200像素比例闊,靠左邊加盒,響描述度加'替代文字'\n* '''<code><nowiki>[[</nowiki>{{ns:media}}:file.ogg<nowiki>]]</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": "檔名",
        "ignorewarnings": "忽略任何警告",
        "minlength1": "檔名必須最少要有一個字。",
        "illegalfilename": "檔名「$1」含有頁面標題所唔允許嘅字。請試下改檔名再上載。",
+       "filename-toolong": "檔案名唔可以長過240位元組。",
        "badfilename": "檔名已經更改成「$1」。",
        "filetype-mime-mismatch": "檔案擴展名 \".$1\" 唔搭偵測到檔案嘅MIME類型 ($2)。",
        "filetype-badmime": "「$1」嘅MIME類型檔案係唔容許上載嘅。",
        "large-file": "建議檔案嘅大細唔好大過$1 bytes,呢個檔案有$2 bytes",
        "largefileserver": "呢個檔案超過咗伺服器設定允許嘅大細。",
        "emptyfile": "你上載嘅檔案似乎係空嘅。噉樣可能係因為你打錯咗個檔名。請檢查吓你係唔係真係要上載呢個檔案。",
-       "fileexists": "呢個檔名已經存在,如果你唔肯定係唔係要更改<strong>[[:$1]]</strong>,請先檢查佢。 [[$1|thumb]]",
+       "windows-nonascii-filename": "呢個維基唔支援有特殊字元嘅檔案名。",
+       "fileexists": "呢個檔名已經存在,如果你唔肯定係唔係要更改,請先檢查<strong>[[:$1]]</strong>。 [[$1|thumb]]",
        "filepageexists": "呢個檔嘅描述頁已經響<strong>[[:$1]]</strong>開咗,但係呢個名嘅檔案重未存在。你輸入咗嘅摘要係唔會顯示響個描述頁度。要令到個摘要響嗰度出現,你就要手動噉去改佢。\n[[$1|thumb]]",
-       "fileexists-extension": "一個相似檔名嘅檔案已經存在: [[$2|thumb]]\n* 上載檔案嘅檔名: <strong>[[:$1]]</strong>\n* 現有檔案嘅檔名: <strong>[[:$2]]</strong>\n請揀一個唔同嘅名。",
+       "fileexists-extension": "一個相似檔名嘅檔案已經存在: [[$2|thumb]]\n* 上載檔案嘅檔名:<strong>[[:$1]]</strong>\n* 現有檔案嘅檔名:<strong>[[:$2]]</strong>\n你係咪要揀返個唔同嘅名?",
        "fileexists-thumbnail-yes": "呢個檔案好似係一幅圖像縮細咗嘅版本''(縮圖)''。 [[$1|thumb]]\n請檢查清楚個檔案<strong>[[:$1]]</strong>。\n如果檢查咗嘅檔案係同原本幅圖個大細係一樣嘅話,就唔使再上載多一幅縮圖。",
        "file-thumbnail-no": "個檔名係以<strong>$1</strong>開始。佢好似係一幅圖像嘅縮細版本''(縮圖)''。\n如果你有呢幅圖像嘅完整大細,唔係嘅話請再改過個檔名。",
        "fileexists-forbidden": "呢個檔案嘅名已經存在,唔可以覆蓋;麻煩返轉去用第二個名嚟上載呢個檔案。[[File:$1|thumb|center|$1]]",
        "upload-http-error": "一個HTTP錯誤發生咗: $1",
        "backend-fail-notexists": "檔案$1唔存在。",
        "backend-fail-delete": "刪唔到檔案「$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」,因為佢大過$2個位元組。",
+       "backend-fail-readonly": "儲存後臺「$1」而家只能夠唯讀。理由係:「<em>$2</em>」",
+       "backend-fail-synced": "檔案「$1」喺內部儲存後臺入面狀態唔一致。",
+       "backend-fail-connect": "連唔到儲存後臺「$1」",
+       "backend-fail-internal": "儲存後臺「$1」唔知點解出錯",
+       "backend-fail-contenttype": "確定唔到存喺儲存後臺「$1」嘅內容類型。",
+       "lockmanager-notlocked": "唔可以解鎖「$1」;佢都無鎖住到。",
        "zip-file-open-error": "在開啟檔案進行ZIP檢查時出錯。",
        "zip-wrong-format": "呢個唔係一個ZIP檔案。",
        "zip-bad": "呢個係不可讀嘅ZIP檔案。\n因為呢個原因,唔可以進行保安檢查。",
        "uploadstash-errclear": "清除檔案唔成功。",
        "uploadstash-refresh": "更新檔案清單",
        "img-auth-accessdenied": "拒絕通行",
-       "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
+       "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 。",
        "img-auth-notindir": "所請求嘅路徑唔響個已經設定咗嘅上載目錄。",
        "img-auth-badtitle": "唔能夠由\"$1\"整一個有效標題。",
        "img-auth-nologinnWL": "你而家無登入,\"$1\"唔響個白名單度。",
        "license": "協議:",
        "license-header": "協議",
        "nolicense": "未揀",
+       "licenses-edit": "改牌照選項",
        "license-nopreview": "(無預覽可以用得到)",
-       "upload_source_url": " (啱嘅,公開嘅網址)",
-       "upload_source_file": " (你部電腦裏面嘅一個檔案)",
-       "listfiles-summary": "呢個特別版顯示全部上載過嘅檔案。\n響預設最後上載嘅檔案會顯示響呢個表嘅最頂。\n撳一欄嘅標題去改個排列。",
+       "upload_source_url": "(你個檔案來源嚟自一個啱嘅、公開嘅網址)",
+       "upload_source_file": "(你個檔案來源嚟自你部電腦裏面)",
+       "listfiles-delete": "刪除",
+       "listfiles-summary": "呢個特別頁顯示全部上載咗嘅檔案。",
        "listfiles_search_for": "搵媒體名:",
        "imgfile": "檔案",
        "listfiles": "檔案清單",
        "listfiles_size": "大細",
        "listfiles_description": "描述",
        "listfiles_count": "版本",
+       "listfiles-show-all": "包埋圖像舊版",
+       "listfiles-latestversion": "而家嘅版本",
+       "listfiles-latestversion-yes": "係",
+       "listfiles-latestversion-no": "唔係",
        "file-anchor-link": "檔案",
        "filehist": "檔案歷史",
        "filehist-help": "撳個日期/時間去睇響嗰個時間出現過嘅檔案。",
        "linkstoimage-more": "多過$1版連過去呢個檔案。\n下面嘅表只係列示咗連去呢個檔案嘅最頭$1版。\n一個[[Special:WhatLinksHere/$2|完整嘅表]]可以提供。",
        "nolinkstoimage": "冇個頁面連結到呢個檔案。",
        "morelinkstoimage": "去睇連到呢個檔案嘅[[Special:WhatLinksHere/$1|更多連結]]。",
+       "linkstoimage-redirect": "$1(檔案跳轉)$2",
        "duplicatesoffile": "下面嘅$1個檔案係同呢個檔案重覆 ([[Special:FileDuplicateSearch/$2|更多細節]]):",
        "sharedupload": "呢個檔案係出自$1,可以喺其他計劃中使用。",
        "sharedupload-desc-there": "呢個檔案係出自$1,可以喺其他計劃中使用。\n更多資訊請睇[$2 檔案描述頁]。",
        "filedelete-reason-dropdown": "\n*常用刪除原因\n** 侵犯版權\n** 重覆檔案",
        "filedelete-edit-reasonlist": "編輯刪除原因",
        "filedelete-maintenance": "響維護嗰陣已經暫時停用檔案刪除同恢復。",
+       "filedelete-maintenance-title": "刪唔到檔案",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "呢一版可以過濾有關檔案嘅MIME類型。輸入方法:contenttype/subtype,例如 <code>image/jpeg</code>。",
+       "mimesearch-summary": "呢一版可以過濾有關檔案嘅MIME類型。\n輸入方法:contenttype/subtype 或者 contenttype/*,例如 <code>image/jpeg</code>。",
        "mimetype": "MIME 類型:",
        "download": "下載",
        "unwatchedpages": "未監視嘅頁面",
        "listredirects": "彈嚟彈去一覽",
+       "listduplicatedfiles": "重覆檔案一覽",
        "unusedtemplates": "未用嘅模",
        "unusedtemplatestext": "呢一頁列示喺{{ns:template}}空間名未包括喺其它頁面嘅全部頁面。請記得喺刪除佢哋之前檢查其它連結到呢個模嘅頁面。",
        "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-users": "註冊咗嘅[[Special:ListUsers|用戶]]",
        "statistics-users-active": "活躍用戶",
        "statistics-users-active-desc": "響$1日前做過動作嘅用戶",
+       "pageswithprop": "有屬性嘅頁",
+       "pageswithprop-legend": "有屬性嘅頁",
+       "pageswithprop-prop": "屬性名:",
+       "pageswithprop-submit": "去",
        "doubleredirects": "雙重跳轉",
        "doubleredirectstext": "每一行都順次序寫住第一頁名,佢嘅目的頁,同埋目的頁再指去邊度。改嘅時候,應該將第一個跳轉頁轉入第三頁。\n<del>劃咗</del>嘅項目係已經解決咗嘅。",
-       "double-redirect-fixed-move": "[[$1]]已經搬好咗,佢而家跳轉過去[[$2]]。",
-       "double-redirect-fixed-maintenance": "修復[[$1]]嘅重定向到[[$2]]。",
+       "double-redirect-fixed-move": "[[$1]]已經搬好咗。\n佢自動更新咗,而家跳轉過去[[$2]]。",
+       "double-redirect-fixed-maintenance": "喺維護工作度自動修復[[$1]]嘅跳轉到[[$2]]。",
        "double-redirect-fixer": "跳轉修正器",
        "brokenredirects": "破碎嘅跳轉",
        "brokenredirectstext": "以下嘅跳轉係指向唔存在嘅頁面:",
        "fewestrevisions": "有最少修改嘅版",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 個分類",
+       "ninterwikis": "$1 {{PLURAL:$1|個跨維基連結}}",
        "nlinks": "$1 條連結",
        "nmembers": "$1 位成員",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|位成員}}",
        "nrevisions": "$1 次修訂",
        "nviews": "$1 次瀏覽",
        "nimagelinks": "用響$1版",
        "wantedpages": "被徵求嘅頁面",
        "wantedpages-badtitle": "響結果組嘅無效標題: $1",
        "wantedfiles": "被徵求嘅檔案",
+       "wantedfiletext-nocat-noforeign": "下面檔案有用到,但係唔存在。",
        "wantedtemplates": "被徵求嘅模",
        "mostlinked": "有最多連結嘅頁面",
        "mostlinkedcategories": "有最多連結嘅分類",
-       "mostlinkedtemplates": "有最多連結嘅模",
+       "mostlinkedtemplates": "有最多嵌入嘅版",
        "mostcategories": "有最多分類嘅頁面",
        "mostimages": "有最多連結嘅檔案",
+       "mostinterwikis": "有最多跨維基連結嘅頁面",
        "mostrevisions": "有最多修改嘅頁面",
        "prefixindex": "全部頁嘅前綴",
        "shortpages": "短頁",
        "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": "保護咗嘅標題",
        "protectedtitlesempty": "響呢啲參數之下並無標題保護住。",
        "listusers": "用戶一覽",
        "listusers-editsonly": "只顯示有編輯嘅用戶",
        "listusers-creationsort": "按建立日期排序",
+       "listusers-desc": "反向排序",
        "usereditcount": "$1次編輯",
        "usercreated": "響$1 $2{{GENDER:$3|建立}}",
        "newpages": "新頁",
        "pager-older-n": "舊$1次",
        "suppress": "監督",
        "querypage-disabled": "呢個特別版基於效能嘅原因停用咗。",
+       "apihelp": "API幫手",
+       "apihelp-no-such-module": "搵唔到模組「$1」。",
        "booksources": "書籍來源",
        "booksources-search-legend": "搵書源",
        "booksources-search": "搵",
        "booksources-text": "以下嘅連結清單列出其它一啲賣新書同二手書嘅網站,可能可以提供到有關你想搵嘅書嘅更多資料:",
        "booksources-invalid-isbn": "個ISBN無效;請檢查原來源複製落來嘅錯。",
-       "specialloguserlabel": "用戶:",
+       "specialloguserlabel": "執行人:",
        "speciallogtitlelabel": "目標(題目或者用戶):",
        "log": "日誌",
        "all-logs-page": "全部嘅公共日誌",
        "allpagesprefix": "用以下開頭嘅頁面:",
        "allpagesbadtitle": "提供嘅頁面名無效,又或者有一個跨語言或跨wiki嘅字頭。佢可能包括一個或多個字係唔可以用響標題度嘅。",
        "allpages-bad-ns": "{{SITENAME}}係無一個空間名叫做\"$1\"。",
+       "allpages-hide-redirects": "收埋跳轉",
+       "cachedspecial-refresh-now": "睇最新。",
        "categories": "類",
        "categoriespagetext": "下面嘅{{PLURAL:$1|類}}有版或媒體。\n[[Special:UnusedCategories|未用類]]唔會響呢度列示。\n請同時參閱[[Special:WantedCategories|需要嘅分類]]。",
        "categoriesfrom": "顯示由呢項起嘅類:",
        "deletedcontributions": "已經刪除咗嘅用戶貢獻",
        "deletedcontributions-title": "已經刪除咗嘅用戶貢獻",
        "sp-deletedcontributions-contribs": "貢獻",
-       "linksearch": "外部連結",
+       "linksearch": "搵出面嘅連結",
        "linksearch-pat": "搵嘅形態:",
        "linksearch-ns": "空間名",
        "linksearch-ok": "搵",
-       "linksearch-text": "可以用類似\"*.wikipedia.org\"嘅萬用字元。<br />\n支援嘅協議: <code>$1</code>",
+       "linksearch-text": "可以用類似「*.wikipedia.org」嘅萬用字元。\n需要至少一個頂級域名,好似「*.org」。<br />\n支援嘅{{PLURAL:$2|協議}}:<code>$1</code> (預設用 http:// 如果唔指定協議)",
        "linksearch-line": "$1 連自 $2",
        "linksearch-error": "萬用字元只可以響主機名嘅開頭度用。",
        "listusersfrom": "顯示由呢個字開始嘅用戶:",
        "listusers-blocked": "(封鎖咗)",
        "activeusers": "活躍用戶名單",
        "activeusers-intro": "呢個係響最近$1日之內有一啲動作嘅用戶名單。",
-       "activeusers-count": "響$3日之內嘅$1次編輯",
+       "activeusers-count": "響{{PLURAL:$3|$3日}}之內嘅$1次{{PLURAL:$1|編輯}}",
        "activeusers-from": "顯示用戶開始於:",
        "activeusers-hidebots": "隱藏機械人",
        "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "搵唔到用戶。",
        "listgrouprights": "用戶組權限",
        "listgrouprights-summary": "下面係一個響呢個wiki定義咗嘅用戶權限一覽,同埋佢哋嘅存取權。\n更多有關個別權限嘅[[{{MediaWiki:Listgrouprights-helppage}}|更多細節]]可以響嗰度搵到。",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">畀咗嘅權限</span>\n* <span class=\"listgrouprights-revoked\">拎咗嘅權限</span>",
+       "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">畀咗嘅權限</span>\n* <span class=\"listgrouprights-revoked\">拎咗嘅權限</span>",
        "listgrouprights-group": "組",
        "listgrouprights-rights": "權",
        "listgrouprights-helppage": "Help:組權限",
        "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-nodesc": "冇解說資料",
+       "trackingcategories-disabled": "類停用咗",
        "mailnologin": "冇傳送地址",
        "mailnologintext": "你一定要[[Special:UserLogin|登入咗]]同埋喺你嘅[[Special:Preferences|喜好設定]]度有個有效嘅電郵地址先可以傳送電郵畀其他用戶。",
        "emailuser": "發電郵畀呢位用戶",
+       "emailuser-title-target": "電郵畀呢個{{GENDER:$1|用戶}}",
+       "emailuser-title-notarget": "發電郵畀用戶",
        "emailpage": "發電郵畀用戶",
-       "emailpagetext": "你可以用下面嘅表去寄一封電郵畀呢位用戶。\n你喺[[Special:Preferences|你嘅用戶喜好設定]]入面填寫嘅電郵地址會出現喺呢封電郵「由」嘅地址度,以便收件人可以回覆到。",
-       "defemailsubject": "{{SITENAME}} 電郵",
+       "emailpagetext": "你可以用下面嘅表去寄一封電郵畀呢位{{GENDER:$1|用戶}}。\n你喺[[Special:Preferences|你嘅用戶喜好設定]]入面填寫嘅電郵地址會出現喺呢封電郵「由」嘅地址度,方便收件人可以直接回覆你。",
+       "defemailsubject": "由用戶「$1」送嘅 {{SITENAME}} 電郵",
        "usermaildisabled": "用戶電郵已停用",
        "usermaildisabledtext": "你唔可以發送電郵到響呢個wiki度嘅其他用戶",
        "noemailtitle": "無電郵地址",
        "noemailtext": "呢個用戶重未指定一個有效嘅電郵地址。",
        "nowikiemailtext": "呢位用戶揀咗唔收其他用戶畀佢嘅電郵。",
+       "emailnotarget": "收件人填錯名。",
+       "emailtarget": "入收件人嘅用戶名",
+       "emailusername": "用戶名:",
+       "emailusernamesubmit": "遞交",
        "email-legend": "寄電郵畀另一位{{SITENAME}}用戶",
        "emailfrom": "由:",
        "emailto": "到:",
        "emailccsubject": "你畀$1: $2封信嘅副本",
        "emailsent": "電郵已傳送",
        "emailsenttext": "你嘅電郵信息已傳送。",
-       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「電郵用戶」功能發出嘅。",
+       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「{{int:emailpage}}」功能發出嘅。",
        "usermessage-summary": "留低系統訊息。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視名單",
        "mywatchlist": "監視清單",
        "watchlistfor2": "$1嘅監視清單 $2",
        "nowatchlist": "你嘅監視清單度並冇任何項目。",
-       "watchlistanontext": "請先$1去睇或者改響你監視清單度嘅項目。",
+       "watchlistanontext": "請先簽到去睇或者改響你監視清單度嘅項目。",
        "watchnologin": "未登入",
-       "addedwatchtext": "頁面「[[:$1]]」已加入到你嘅[[Special:Watchlist|監視清單]]度。\n呢個頁面以及佢個討論頁以後嘅修改都會列喺嗰度,佢喺[[Special:RecentChanges|最近更改清單]]度會以'''粗體'''顯示,等你可以容易啲睇到佢。",
+       "addwatch": "加到監視清單",
+       "addedwatchtext": "頁面「[[:$1]]」已加入到你嘅[[Special:Watchlist|監視清單]]度。\n呢個頁面以及佢個討論頁以後嘅修改都會列喺嗰度。",
+       "addedwatchtext-short": "「$1」呢一版已經加咗入監視清單。",
+       "removewatch": "響監視清單度拎走",
        "removedwatchtext": "頁面「[[:$1]]」已經喺[[Special:Watchlist|你嘅監視清單]]度刪除。",
+       "removedwatchtext-short": "「$1」呢一版已經由監視清單度拎走咗。",
        "watch": "監視",
        "watchthispage": "監視呢頁",
        "unwatch": "唔使監視",
        "unwatchthispage": "停止監視",
        "notanarticle": "唔係一個內容頁",
        "notvisiblerev": "上次由唔同用戶嘅修訂已經刪除咗",
-       "watchlist-details": "唔計討論頁,有 $1 響你個監視清單度。",
-       "wlheader-enotif": "電子郵件通知已經啟用。",
-       "wlheader-showupdated": "'''粗體字'''嘅頁響你上次嚟之後被人改過",
-       "wlnote": "以ä¸\8bä¿\82最近'''$2'''個鐘之內嘅最新$1次修改。",
-       "wlshowlast": "顯示最近 $1 個鐘 $2 日  嘅修改",
+       "watchlist-details": "唔計討論頁,有 $1 {{PLURAL:$1|版}}響你個監視清單度。",
+       "wlheader-enotif": "電郵通知已經啟用咗。",
+       "wlheader-showupdated": "標'''粗體字'''嘅頁響你上次嚟之後畀人改過。",
+       "wlnote": "ä¸\8bé\9d¢ä¿\82ç\9b´å\88°$3 $4ç\82ºæ­¢ï¼\8c最近'''$2'''個鐘之內嘅最新$1次修改。",
+       "wlshowlast": "顯示最近 $1 個鐘 $2 日",
        "watchlist-options": "監視清單選項",
        "watching": "監視緊...",
        "unwatching": "唔再監視緊...",
+       "watcherrortext": "更改「$1」嘅監視清單嗰陣出錯。",
        "enotif_reset": "將所有頁面標成已視察",
        "enotif_impersonal_salutation": "{{SITENAME}}用戶",
+       "enotif_subject_deleted": "{{SITENAME}}頁面 $1 已經畀 $2 {{GENDER:$2|刪咗}}。",
+       "enotif_subject_created": "{{SITENAME}}頁面 $1 已經畀 $2 {{GENDER:$2|開咗}}。",
+       "enotif_subject_moved": "{{SITENAME}}頁面 $1 已經畀 $2 {{GENDER:$2|搬咗}}。",
+       "enotif_subject_restored": "{{SITENAME}}頁面 $1 已經畀 $2 {{GENDER:$2|恢復咗}}。",
+       "enotif_subject_changed": "{{SITENAME}}頁面 $1 已經畀 $2 {{GENDER:$2|改咗}}。",
+       "enotif_body_intro_deleted": "{{SITENAME}}頁面 $1 已經喺 $PAGEEDITDATE 畀 $2 {{GENDER:$2|刪咗}}。睇下 $3 。",
+       "enotif_body_intro_created": "{{SITENAME}}頁面 $1 已經喺 $PAGEEDITDATE 畀 $2 {{GENDER:$2|開咗}}。睇下而家個版本 $3 。",
+       "enotif_body_intro_moved": "{{SITENAME}}頁面 $1 已經喺 $PAGEEDITDATE 畀 $2 {{GENDER:$2|搬咗}}。睇下而家個版本 $3 。",
+       "enotif_body_intro_restored": "{{SITENAME}}頁面 $1 已經喺 $PAGEEDITDATE 畀 $2 {{GENDER:$2|恢復咗}}。睇下而家個版本 $3 。",
+       "enotif_body_intro_changed": "{{SITENAME}}頁面 $1 已經喺 $PAGEEDITDATE 畀 $2 {{GENDER:$2|改咗}}。睇下而家個版本 $3 。",
        "enotif_lastvisited": "你上次視察以嚟嘅修改請睇$1。",
        "enotif_lastdiff": "睇$1去睇吓呢一次更改。",
        "enotif_anon_editor": "匿名用戶$1",
        "exbeforeblank": "喺清空之前嘅內容係:「$1」",
        "delete-confirm": "刪除\"$1\"",
        "delete-legend": "刪除",
-       "historywarning": "警告:你要刪除嘅頁面有大約$1次嘅修訂:",
+       "historywarning": "<strong>警告:</strong>你要刪除嘅頁面有大約$1次嘅修訂:",
        "confirmdeletetext": "你準備刪除一個頁面或者圖像,包括佢嘅所有歷史版本。\n請確認你打算噉做,而且你知道後果係點,加上確認你噉做冇違反到[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失敗",
        "deletecomment": "原因:",
        "deleteotherreason": "其它/附加嘅原因:",
        "deletereasonotherlist": "其它原因",
-       "deletereason-dropdown": "*常用刪除原因\n** 作者請求\n** 侵犯版權\n** 破壞",
+       "deletereason-dropdown": "*常用刪除原因\n** 垃圾訊息\n** 破壞\n** 侵犯版權\n** 作者請求\n** 壞咗嘅跳轉",
        "delete-edit-reasonlist": "編輯刪除原因",
        "delete-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除呢類版嘅動作已經限制咗,以防止響{{SITENAME}}嘅意外擾亂。",
        "delete-warning-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除佢可能會擾亂{{SITENAME}}嘅資料庫操作;響繼續嗰陣請小心。",
+       "deleteprotected": "你唔可以刪呢版,因為佢畀人保護咗。",
        "rollback": "反轉修改",
        "rollbacklink": "反轉",
        "rollbacklinkcount": "反轉 $1 次修改",
        "alreadyrolled": "無法反轉[[User:$2|$2]]([[User talk:$2|留言]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])對[[:$1]]嘅最後編輯;有人已經修改過或者反轉咗呢個頁面。\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": "已經反轉由(刪咗用戶名)所寫嘅編輯到[[User:$1|$1]]所寫嘅最後修訂。",
+       "revertpage-nouser": "已經反轉咗由收埋咗嘅用戶名所寫嘅編輯,到[[User:$1|$1]]所寫嘅最後修訂版本。",
        "rollback-success": "已經反轉由$1所寫嘅編輯;恢復到$2嘅最後修訂。",
        "sessionfailure-title": "會話失敗",
        "sessionfailure": "你嘅登入會話 (session) 好似有啲問題;\n為咗防止會話劫持,呢個操作已經取消。\n請返去之前嗰版,重新載入嗰版然後再試。",
        "protectlogpage": "保護日誌",
-       "protectlogtext": "下面係一個保護同埋解除保護頁面嘅一覽表。睇吓[[Special:ProtectedPages|保護頁面一覽]]去搵鎖咗嘅頁。",
+       "protectlogtext": "下面係一個保護同埋解除保護頁面改動嘅一覽表。\n睇吓[[Special:ProtectedPages|保護頁面一覽]]去搵而家鎖咗嘅頁。",
        "protectedarticle": "已經保護 \"[[$1]]\"",
        "modifiedarticleprotection": "已經改咗 \"[[$1]]\" 嘅保護等級",
-       "unprotectedarticle": "已經唔再保護 \"[[$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-locked-blocked": "當你響被封鎖嗰陣唔可以改呢版嘅保護等級。\n呢個係'''$1'''版嘅現時設定:",
        "protect-locked-dblock": "響資料庫主動鎖住咗嗰陣係唔可以改呢版嘅保護等級。\n呢個係'''$1'''版嘅現時設定:",
        "protect-locked-access": "你嘅戶口係無權限去改呢版嘅保護等級。\n呢個係'''$1'''版嘅現時設定:",
-       "protect-cascadeon": "呢一版現時正響度保護緊,因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗,而當中又開咗連串保護。你可以更改呢一版嘅保護等級,但係呢個修改係唔會影響到嗰個連串保護。",
+       "protect-cascadeon": "呢一版現時正響度保護緊,因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗,而當中又開咗連串保護。更改呢一版嘅保護等級唔會影響到嗰個連串保護。",
        "protect-default": "容許全部用戶",
-       "protect-fallback": "需要\"$1\"嘅許可",
+       "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": "現時到期嘅時間: $2 $3",
+       "protect-existing-expiry-infinity": "到期時間:無限期",
        "protect-otherreason": "其它/附加嘅原因:",
        "protect-otherreason-op": "其它原因",
        "protect-dropdown": "*通用保護原因\n** 過量嘅破壞\n** 過量嘅灌水\n** 反生產性編輯戰\n** 高流量頁",
        "viewdeletedpage": "去睇被刪除咗嘅頁面",
        "undeletepagetext": "以下嘅$1個頁面已經刪除,但係重喺檔庫度可以恢復。檔案庫可能會定時清理。",
        "undelete-fieldset-title": "恢復修訂",
-       "undeleteextrahelp": "要恢復成個頁面,唔好剔任何嘅核選盒,再撳'''''{{int:undeletebtn}}'''''。\n要恢復已經選擇咗嘅修訂,將要恢復代表有關修訂嘅核選盒剔上,再撳'''''{{int:undeletebtn}}'''''。\n撳'''''{{int:undeletereset}}'''''會清除註解文字同埋全部嘅核選盒。",
+       "undeleteextrahelp": "要恢復成個頁面,唔好剔任何嘅核選盒,再撳<strong><em>{{int:undeletebtn}}</em></strong>。\n要恢復已經選擇咗嘅修訂,將要恢復代表有關修訂嘅核選盒剔上,再撳<strong><em>{{int:undeletebtn}}</em></strong>。",
        "undeleterevisions": "$1個修訂都已經存檔",
        "undeletehistory": "如果你恢復呢個頁面,佢嘅所有修改歷史都會恢復返到嗰篇頁面嘅歷史度。如果喺佢刪除之後又新開咗同名嘅頁面,你恢復嘅修改歷史會顯示喺先前歷史度。",
        "undeleterevdel": "如果響最新修訂度部份刪除,噉就反刪除唔到。如果遇到呢種情況,你一定要反選或者反隱藏最新刪除咗嘅修訂。",
        "undeletedrevisions": "$1個修訂已經救返",
        "undeletedrevisions-files": "$1個修訂同$2個檔案已經救返",
        "undeletedfiles": "$1個檔案已經救返",
-       "cannotundelete": "æ\95\91å\94\94å\88°ï¼\9bå\8f¯è\83½æ\9c\89å\85¶ä»\96人已ç¶\93æ\95\91è¿\94å\97°é \81ã\80\82",
+       "cannotundelete": "æ\95\91å\94\94å\88°ï¼\9a\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-bad-store-key": "唔能夠刪除帶有時間截記嘅檔案修訂 $1: 檔案響刪除之前唔見咗。",
        "undelete-cleanup-error": "刪除無用嘅歸檔檔案 \"$1\" 時出錯。",
        "undelete-missing-filearchive": "由於檔案歸檔 ID $1 唔響個數據庫度,唔能夠響個檔案歸檔恢復。佢可能已經反刪除咗。",
+       "undelete-error": "還原刪版出錯",
        "undelete-error-short": "反刪除檔案嗰陣出錯: $1",
        "undelete-error-long": "當反刪除緊個檔案嗰陣遇到錯誤:\n\n$1",
        "undelete-show-file-confirm": "你係咪肯定你想去睇響 $2 $3 嘅 \"<nowiki>$1</nowiki>\" 檔案?",
        "contributions": "{{GENDER:$1|用戶}}貢獻",
        "contributions-title": "$1嘅用戶貢獻",
        "mycontris": "個人貢獻",
-       "contribsub2": "$1嘅貢獻 ($2)",
+       "contribsub2": "{{GENDER:$3|$1}}嘅貢獻 ($2)",
+       "contributions-userdoesnotexist": "用戶「$1」未有註冊。",
        "nocontribs": "搵唔到符合呢啲條件嘅修改。",
-       "uctop": "(最頂)",
+       "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-search": "搵貢獻",
        "sp-contributions-username": "IP地址或用戶名:",
        "sp-contributions-toponly": "只顯示最新修訂嘅編輯",
+       "sp-contributions-newonly": "只顯示開新版嘅編輯",
        "sp-contributions-submit": "搵",
        "whatlinkshere": "有乜嘢連結來呢度",
        "whatlinkshere-title": "連到「$1」嘅頁",
        "whatlinkshere-hidelinks": "$1連結",
        "whatlinkshere-hideimages": "$1檔案連結",
        "whatlinkshere-filters": "過濾器",
-       "blockip": "封鎖用戶",
+       "autoblockid": "自動封鎖 #$1",
+       "block": "封鎖用戶",
+       "unblock": "解封用戶",
+       "blockip": "封鎖{{GENDER:$1|用戶}}",
        "blockip-legend": "封鎖用戶",
        "blockiptext": "使用以下嘅表格嚟去阻止指定嘅IP地址或用戶名嘅寫權限。\n僅當僅當為咗避免有版畀人惡意破壞嘅時候先可以使用,而且唔可以違反[[{{MediaWiki:Policy-url}}|政策]]。\n喺下面填寫阻止嘅確切原因(比如:引用咗某啲已經破壞咗嘅頁面)。",
        "ipaddressorusername": "IP地址或用戶名:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*共用封鎖原因\n** 插入錯嘅資料\n** 響頁面度拎走\n** 亂加入外部連結\n** 響頁度加入冇意義嘅嘢\n** 嚇人/騷擾\n** 濫用多個戶口\n** 唔能夠接受嘅用戶名",
+       "ipb-hardblock": "唔畀簽到用戶用呢個IP位址去改文",
        "ipbcreateaccount": "防止開新戶口",
        "ipbemailban": "防止用戶傳送電郵",
        "ipbenableautoblock": "自動封鎖呢個用戶上次用過嘅IP地址,同埋佢地做過編輯嘅IP地址",
        "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": "無效嘅IP地址",
        "blockipsuccesssub": "封鎖成功",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經封鎖。<br />\n去[[Special:BlockList|IP封鎖清單]]睇返封鎖名單。",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經封鎖。<br />\n去[[Special:BlockList|封鎖清單]]睇返封鎖。",
+       "ipb-blockingself": "你將會封鎖自己!你肯定要咁做?",
+       "ipb-confirmaction": "如果你肯定要咁做,請剔下低嘅「{{int:ipb-confirm}}」格。",
        "ipb-edit-dropdown": "改封鎖原因",
        "ipb-unblock-addr": "解封$1",
        "ipb-unblock": "解封一個用戶名或IP地址",
        "ipb-blocklist": "去睇現時嘅封鎖",
-       "ipb-blocklist-contribs": "$1嘅貢獻",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}嘅貢獻",
        "unblockip": "解封用戶",
        "unblockiptext": "使用以下表格恢復之前阻止嘅某個IP地址或者某個用戶名嘅寫權限。",
        "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": "收埋單一IP封鎖",
+       "blocklist-rangeblocks": "收埋大範圍IP封鎖",
+       "blocklist-timestamp": "時間",
+       "blocklist-target": "目標",
+       "blocklist-expiry": "到期",
+       "blocklist-by": "封鎖管理員",
+       "blocklist-params": "封鎖參數",
+       "blocklist-reason": "原因",
        "ipblocklist-submit": "搵",
        "ipblocklist-localblock": "本地封鎖",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖|封鎖}}",
        "unblocklink": "解封",
        "change-blocklink": "改封",
        "contribslink": "貢獻",
-       "autoblocker": "已經自動封鎖,因為你嘅IP地址冇幾耐之前\"[[User:$1|$1]]\"使用過。$1\\嘅封鎖原因係: 「$2」",
+       "emaillink": "送電郵",
+       "autoblocker": "已經自動封鎖咗,因為你嘅IP地址冇幾耐之前畀「[[User:$1|$1]]」用過。\n$1嘅封鎖原因係「$2」",
        "blocklogpage": "封鎖日誌",
        "blocklog-showlog": "呢位用戶已經響之前被封鎖過。響下面提供咗封鎖紀錄以便參考:",
        "blocklog-showsuppresslog": "呢位用戶已經響之前被封鎖同隱藏過。響下面提供咗廢止紀錄以便參考:",
        "blocklogentry": "已封鎖[[$1]],到期時間為$2 $3",
        "reblock-logentry": "已改[[$1]]嘅封鎖設定,到期時間為$2 $3",
-       "blocklogtext": "呢個係封鎖同埋解封動作嘅日誌。自動封鎖IP地址嘅動作冇列出嚟。去[[Special:BlockList|IP封鎖名單]]睇現時生效嘅封鎖名單",
+       "blocklogtext": "呢個係封鎖同埋解封動作嘅日誌。\n自動封鎖IP地址嘅動作冇列出嚟。\n去[[Special:BlockList|封鎖名單]]睇現時生效嘅封鎖名單",
        "unblocklogentry": "已經解封$1",
        "block-log-flags-anononly": "只限匿名用戶",
        "block-log-flags-nocreate": "停用開新戶口",
        "range_block_disabled": "操作員嘅建立範圍封鎖已經停用。",
        "ipb_expiry_invalid": "無效嘅期限。",
        "ipb_expiry_temp": "隱藏用戶名封鎖定一定係要永久性嘅。",
-       "ipb_hide_invalid": "唔能夠壓止呢個戶口;佢可能有太多編輯。",
+       "ipb_hide_invalid": "唔能夠壓止呢個戶口;佢有多過{{PLURAL:$1|一次編輯|$1次編輯}}。",
        "ipb_already_blocked": "\"$1\"已經封鎖咗",
        "ipb-needreblock": "$1已經被封鎖。你係咪想更改呢個設定?",
        "ipb-otherblocks-header": "其他{{PLURAL:$1|封鎖|封鎖}}",
+       "unblock-hideuser": "你唔可以解鎖呢個用戶,因為佢個用戶名收埋咗。",
        "ipb_cant_unblock": "錯誤:搵唔到封鎖ID$1。可能已經解封咗。",
        "ipb_blocked_as_range": "錯誤:個IP $1 無直接封鎖,唔可以解封。但係佢係響 $2 嘅封鎖範圍之內,嗰段範圍係可以解封嘅。",
        "ip_range_invalid": "無效嘅IP範圍",
        "delete_and_move": "刪除並移動",
        "delete_and_move_text": "==需要刪除==\n\n目標頁「[[:$1]]」已經存在。你要唔要刪咗佢空個位出嚟畀個搬文動作?",
        "delete_and_move_confirm": "好,刪咗嗰個頁面",
-       "delete_and_move_reason": "已經刪咗嚟畀位畀個搬文動作",
+       "delete_and_move_reason": "已經刪咗「[[$1]]」嚟畀位畀個搬文動作",
        "selfmove": "原始標題同目的標題一樣;唔可以將個頁面搬返去自己度。",
        "immobile-source-namespace": "唔可以響空間名「$1」度搬版",
        "immobile-target-namespace": "唔可以將版搬到「$1」度",
        "immobile-target-namespace-iw": "垮維基連結響搬版度係無效嘅目標。",
        "immobile-source-page": "呢版唔搬得。",
        "immobile-target-page": "搬唔到去目標標題度。",
+       "bad-target-model": "指定目標用緊唔同內容模型。轉唔到 $1 做 $2。",
        "imagenocrossnamespace": "唔可以搬檔案到非檔案空間名",
        "nonfile-cannot-move-to-file": "唔可以搬非檔案到檔案空間名",
        "imagetypemismatch": "個新副檔名唔配佢嘅類型",
        "file-exists-sharedrepo": "同名檔案已於共享資源存在。\n請選擇另一個檔名。",
        "export": "倒出/導出/匯出(Export)頁面",
        "exporttext": "你可以倒出文字、編輯某個頁面、編輯封裝(wrap)喺一啲XML度嘅一組頁面。呢啲嘢可以用MediaWiki透過[[Special:Import|倒入]]頁倒入去其他wiki度。\n\n要倒出頁面嘅話,就喺下面嘅文字框度打標題名,一行一個標題,然後揀你係要現時修訂加上所有嘅舊修訂同歷史,定係淨係要現時修訂同最後編輯嘅相關資訊。\n\n喺後面嗰種情況下,你亦都可以用一個連結,例如[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]對頁面\"[[{{MediaWiki:Mainpage}}]]\"。",
+       "exportall": "倒出所有頁面",
        "exportcuronly": "淨係包括而家嘅修訂版本,唔包括完整歷史",
        "exportnohistory": "----\n'''注意:'''因為性能嘅原因,已經停用禁止咗使用呢個表格倒出頁面嘅完整歷史",
+       "exportlistauthors": "包埋每頁完整嘅貢獻者清單",
        "export-submit": "倒出/導出/匯出",
        "export-addcattext": "由分類度加入頁面:",
        "export-addcat": "加入",
        "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": "唔能夠響DjVu檔度攞個XML",
+       "thumbnail-temp-create": "整唔到臨時縮圖檔",
+       "thumbnail-dest-create": "儲唔到縮圖到目標",
        "thumbnail_invalid_params": "唔正確嘅縮圖參數",
+       "thumbnail_toobigimagearea": "檔案大細大過 $1",
        "thumbnail_dest_directory": "唔能夠開目標目錄",
        "thumbnail_image-type": "圖像類型唔支援",
        "thumbnail_gd-library": "未完成嘅GD設定: 功能唔見咗 $1",
        "thumbnail_image-missing": "檔案似乎唔見咗: $1",
+       "thumbnail_image-failure-limit": "近排顯示呢個縮圖已經失敗過好多次(超過$1 次),請遲些少再試過。",
        "import": "倒入頁面",
-       "importinterwiki": "Transwiki 倒入",
+       "importinterwiki": "由其它wiki度倒入",
        "import-interwiki-text": "揀一個 wiki 同埋一頁去倒入。\n修訂日期同編輯者會被保存落嚟。\n所有 transwiki 嘅倒入動作會響[[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": "請由原 wiki 嘅[[Special:Export|匯出工具]]匯出成檔案。\n儲存喺你個磁碟度,然後再上載到呢度。",
+       "importtext": "請由原 wiki 嘅[[Special:Export|匯出工具]]匯出成檔案。\n儲存喺你部電腦度,然後再上載到呢度。",
        "importstart": "倒入緊...",
        "import-revision-count": "$1次修訂",
        "importnopages": "冇頁面去倒入。",
        "importcantopen": "唔能夠開個倒入檔案",
        "importbadinterwiki": "壞嘅跨 wiki 連結",
        "importsuccess": "已經完成倒入!",
-       "importnosources": "未定義 transwiki 嘅匯入來源,同埋歷史嘅直接上載已經停用。",
+       "importnosources": "未定義匯入來源,同埋歷史嘅直接上載已經停用。",
        "importnofile": "冇上載到任何要倒入嘅檔案。",
        "importuploaderrorsize": "上載要倒入嘅檔案失敗。個檔案大過可以容許嘅上載大細。",
        "importuploaderrorpartial": "上載要倒入嘅檔案失敗。個檔案只係部份上載咗。",
        "importuploaderrortemp": "上載要倒入嘅檔案失敗。個臨時資料夾唔見咗。",
        "import-parse-failure": "XML倒入語法失敗",
        "import-noarticle": "無版去倒入!",
-       "import-nonewrevisions": "全部嘅修訂已經響之前倒入咗。",
+       "import-nonewrevisions": "無修訂倒入(全部嘅修訂已經響之前倒入咗,或者因為出錯而跳咗唔做)。",
        "xml-error-string": "$1 響行$2,欄$3 ($4 bytes): $5",
        "import-upload": "上載XML資料",
        "import-token-mismatch": "小節資料遺失。請再試過。",
        "import-invalid-interwiki": "唔能夠響指定嘅wiki倒入。",
+       "import-error-edit": "頁「$1」未倒入,因為你無權改佢。",
+       "import-error-create": "頁「$1」未倒入,因為你無權建立佢。",
+       "import-error-interwiki": "頁「$1」未倒入,因為個名要留畀出面連結(跨維基)。",
+       "import-error-special": "頁「$1」未倒入,因為佢屬於一個特別名空間,唔畀開頁。",
+       "import-error-invalid": "頁「$1」未倒入,倒入個名響呢個維基無效。",
+       "import-options-wrong": "錯嘅{{PLURAL:$2|選項}}:<nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "你畀嘅根頁係個無效嘅名。",
+       "import-rootpage-nosubpage": "根頁名空間「$1」唔畀有子頁。",
        "importlogpage": "倒入日誌",
        "importlogpagetext": "管理員由其它嘅 wiki 倒入頁面同埋佢哋嘅編輯歷史記錄。",
-       "import-logentry-upload-detail": "$1個修訂",
-       "import-logentry-interwiki-detail": "由$2嘅$1個修訂",
+       "import-logentry-upload-detail": "$1個修訂都已經倒入咗",
+       "import-logentry-interwiki-detail": "由$2倒入嘅$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": "睇 mediawiki.org 嘅 [$1 測試文檔]。",
        "tooltip-pt-userpage": "你嘅用戶頁",
        "tooltip-pt-anonuserpage": "你編輯呢個IP嘅對應用戶頁",
        "tooltip-pt-mytalk": "你嘅對話頁",
        "tooltip-ca-viewsource": "呢一頁已經被保護。你可以睇吓呢一頁呢原始碼。",
        "tooltip-ca-history": "呢一頁之前嘅修訂",
        "tooltip-ca-protect": "保護呢一頁",
-       "tooltip-ca-unprotect": "唔再保護呢一頁",
+       "tooltip-ca-unprotect": "改呢版保護",
        "tooltip-ca-delete": "刪除呢一頁",
        "tooltip-ca-undelete": "將呢個頁面還原到被刪除之前嘅狀態",
        "tooltip-ca-move": "移動呢一頁",
        "tooltip-feed-atom": "呢一頁嘅Atom集合",
        "tooltip-t-contributions": "睇吓呢個用戶嘅貢獻一覽",
        "tooltip-t-emailuser": "寄封電子郵件畀呢一位用戶",
+       "tooltip-t-info": "更多關於呢版嘅資料",
        "tooltip-t-upload": "上載檔案",
        "tooltip-t-specialpages": "所有特別頁嘅一覽",
        "tooltip-t-print": "呢一版嘅可打印版本",
        "tooltip-diff": "顯示你對頁面所作嘅修改",
        "tooltip-compareselectedversions": "顯示該頁面兩個所選修訂嘅唔同之處。",
        "tooltip-watch": "加呢頁入你張監視清單",
+       "tooltip-watchlistedit-normal-submit": "拎走標題",
+       "tooltip-watchlistedit-raw-submit": "更新監視清單",
        "tooltip-recreate": "即使已經刪過都要重新整過呢頁",
        "tooltip-upload": "開始上載",
        "tooltip-rollback": "『反轉』可以一撳復原上一位貢獻者對呢版嘅編輯",
        "spambot_username": "MediaWiki垃圾清除",
        "spam_reverting": "恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。",
        "spam_blanking": "全部版本都含有指去$1嘅連結,留空",
+       "spam_deleting": "全部版本都含有指去$1嘅連結,刪緊",
        "simpleantispam-label": "反垃圾檢查。\n'''唔好'''填呢個!",
+       "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": "頁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": "計做內容頁",
+       "pageinfo-contentpage-yes": "係",
+       "pageinfo-protect-cascading": "保護引申到呢度",
+       "pageinfo-protect-cascading-yes": "係",
+       "pageinfo-protect-cascading-from": "保護引申來源",
+       "pageinfo-category-info": "類資料",
+       "pageinfo-category-pages": "頁數",
+       "pageinfo-category-subcats": "子類數",
+       "pageinfo-category-files": "檔案數",
        "markaspatrolleddiff": "標示為已巡查嘅",
        "markaspatrolledtext": "標示呢版做查咗嘅",
        "markedaspatrolled": "已經標示做已巡查嘅",
        "markedaspatrollederror": "唔可以標示做已巡查嘅",
        "markedaspatrollederrortext": "你需要指定一個修訂用嚟將佢標示做已巡查嘅。",
        "markedaspatrollederror-noautopatrol": "你係唔准去標示你自己嘅更改做已巡查嘅。",
+       "markedaspatrollednotify": "$1 嘅呢次修改已經標做睇過。",
+       "markedaspatrollederrornotify": "標做睇過失敗。",
        "patrol-log-page": "巡查日誌",
        "patrol-log-header": "呢個係已經巡查過嘅日誌。",
        "log-show-hide-patrol": "$1巡查紀錄",
        "widthheightpage": "$1 × $2, $3版",
        "file-info": "檔案大細:$1 ,MIME類型:$2",
        "file-info-size": "$1 × $2 像素,檔案大細:$3 ,MIME類型:$4",
+       "file-info-size-pages": "$1 × $2 像素,檔案大細: $3 ,MIME type: $4,$5 {{PLURAL:$5|頁}}",
        "file-nohires": "冇更高解像度嘅圖像。",
        "svg-long-desc": "SVG檔案,表面大細: $1 × $2 像素,檔案大細:$3",
+       "svg-long-desc-animated": "動態SVG檔案,表面大細: $1 × $2 像素,檔案大細:$3",
+       "svg-long-error": "無效嘅SVG檔: $1",
        "show-big-image": "原本檔案",
        "show-big-image-preview": "預覽大細:$1。",
        "show-big-image-other": "第啲{{PLURAL:$2|解像度}}:$1。",
        "file-info-png-looped": "循環",
        "file-info-png-repeat": "播咗$1次",
        "file-info-png-frames": "$1格",
+       "file-no-thumb-animation": "<strong>注意:因為技術限制,呢個檔案縮圖唔係動態。</strong>",
+       "file-no-thumb-animation-gif": "<strong>注意:因為技術限制,呢個高解像GIF圖嘅縮圖唔係動態。</strong>",
        "newimages": "新檔案畫廊",
        "imagelisttext": "以下係'''$1'''個檔案$2排序嘅清單。",
        "newimages-summary": "呢個特別頁顯示最後上載咗嘅檔案。",
        "newimages-legend": "過濾",
        "newimages-label": "檔名(或佢嘅一部份):",
+       "newimages-showbots": "顯示機械人嘅上載",
        "noimages": "冇嘢去睇。",
        "ilsubmit": "搵嘢",
        "bydate": "以時間",
        "sp-newimages-showfrom": "顯示由$1 $2嘅新檔",
+       "seconds": "{{PLURAL:$1|$1 秒}}",
+       "minutes": "{{PLURAL:$1|$1 分鐘}}",
        "hours": "$1{{PLURAL:$1|個鐘}}",
+       "days": "{{PLURAL:$1|$1 日}}",
+       "weeks": "{{PLURAL:$1|$1 個禮拜}}",
+       "months": "{{PLURAL:$1|$1 個月}}",
+       "years": "{{PLURAL:$1|$1 年}}",
+       "ago": "$1 之前",
+       "just-now": "啱啱",
        "hours-ago": "$1{{PLURAL:$1|個鐘}}之前",
+       "minutes-ago": "$1 {{PLURAL:$1|分鐘}}前",
+       "seconds-ago": "$1 {{PLURAL:$1|秒}}前",
+       "monday-at": "$1 禮拜一",
+       "tuesday-at": "$1 禮拜二",
+       "wednesday-at": "$1 禮拜三",
+       "thursday-at": "$1 禮拜四",
+       "friday-at": "$1 禮拜五",
+       "saturday-at": "$1 禮拜六",
+       "sunday-at": "$1 禮拜日",
        "bad_image_list": "請根據下面嘅格式去寫:\n\n只有列示項目(以 * 開頭嘅項目)會考慮。第一個連結一定要連去幅壞檔度。\n之後響同一行嘅連結會考慮做例外,即係個檔可以響邊版度同時顯示。",
        "variantname-zh-hans": "簡體",
        "variantname-zh-hant": "繁體",
        "exif-colorspace": "色彩空間",
        "exif-componentsconfiguration": "每個部份嘅意思",
        "exif-compressedbitsperpixel": "影像壓縮模式",
-       "exif-pixelydimension": "影像有效闊度",
-       "exif-pixelxdimension": "影像有效高度",
+       "exif-pixelydimension": "影像闊度",
+       "exif-pixelxdimension": "影像高度",
        "exif-usercomment": "用家註腳",
        "exif-relatedsoundfile": "相關聲音檔",
        "exif-datetimeoriginal": "原創日期時間",
        "exif-exposureprogram": "曝光程序",
        "exif-spectralsensitivity": "光譜敏感度",
        "exif-isospeedratings": "ISO 速率",
-       "exif-shutterspeedvalue": "快門速度",
-       "exif-aperturevalue": "光圈",
-       "exif-brightnessvalue": "光度",
+       "exif-shutterspeedvalue": "APEX快門速度",
+       "exif-aperturevalue": "APEX光圈",
+       "exif-brightnessvalue": "APEX光度",
        "exif-exposurebiasvalue": "曝光偏壓",
        "exif-maxaperturevalue": "最大陸地孔徑",
        "exif-subjectdistance": "主體距離",
        "exif-gpsdatestamp": "GPS 日期",
        "exif-gpsdifferential": "GPS 差動修正",
        "exif-objectname": "短標題",
+       "exif-headline": "標題",
+       "exif-source": "來源",
+       "exif-languagecode": "語言",
+       "exif-iimcategory": "類",
+       "exif-label": "標籤",
+       "exif-copyrighted": "版權狀態",
+       "exif-copyrightowner": "版權人",
+       "exif-disclaimer": "免責聲明",
        "exif-compression-1": "未壓過",
        "exif-unknowndate": "未知日期",
        "exif-orientation-1": "正常",
        "exif-orientation-3": "轉一百八十度",
        "exif-orientation-4": "上下倒轉",
        "exif-orientation-5": "逆時針轉九十度,再上下倒轉",
-       "exif-orientation-6": "é \86æ\99\82é\87\9dè½\89ä¹\9då\8d\81度",
+       "exif-orientation-6": "é\80\86æ\99\82é\87\9dè½\89ä¹\9då\8d\81度",
        "exif-orientation-7": "順時針轉九十度,再上下倒轉",
-       "exif-orientation-8": "é\80\86æ\99\82é\87\9dè½\89ä¹\9då\8d\81度",
+       "exif-orientation-8": "é \86æ\99\82é\87\9dè½\89ä¹\9då\8d\81度",
        "exif-planarconfiguration-1": "chunky 格式",
        "exif-planarconfiguration-2": "planar 格式",
        "exif-componentsconfiguration-0": "根本無",
        "exif-gpsdestdistance-n": "浬",
        "exif-gpsdirection-t": "真實方向",
        "exif-gpsdirection-m": "地磁方向",
+       "exif-dc-contributor": "貢獻者",
+       "exif-dc-date": "日子",
+       "exif-dc-publisher": "發佈者",
+       "exif-dc-rights": "權",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
        "confirm_purge_button": "肯定",
        "confirm-purge-top": "肯定要洗咗呢版個快取版本?",
        "confirm-purge-bottom": "清理一版係會清除快取同埋強迫顯示最現時嘅修訂。",
+       "confirm-watch-button": "好",
+       "confirm-watch-top": "加呢頁入你張監視清單?",
+       "confirm-unwatch-button": "好",
+       "confirm-unwatch-top": "將呢一頁喺你嘅監視清單中移走?",
        "comma-separator": "、",
        "word-separator": "",
        "parentheses": "($1)",
+       "quotation-marks": "「$1」",
        "imgmultipageprev": "← 上一版",
        "imgmultipagenext": "下一版 →",
        "imgmultigo": "去!",
        "imgmultigoto": "去第$1版",
+       "img-lang-default": "(預設語言)",
+       "img-lang-go": "去",
        "ascending_abbrev": "增",
        "descending_abbrev": "減",
        "table_pager_next": "下一版",
        "watchlistedit-raw-done": "你嘅監視清單已經更新。",
        "watchlistedit-raw-added": "已經加入咗$1個標題:",
        "watchlistedit-raw-removed": "已經拎走咗$1個標題:",
+       "watchlistedit-clear-titles": "標題:",
        "watchlisttools-view": "睇吓有關嘅更改",
        "watchlisttools-edit": "睇吓同埋編輯監視清單",
        "watchlisttools-raw": "編輯原始監視清單",
        "duplicate-defaultsort": "警告: 預設嘅排序鍵 \"$2\" 覆蓋之前嘅預設排序鍵 \"$1\"。",
        "version": "版本",
        "version-extensions": "裝咗嘅擴展",
-       "version-skins": "畫面",
+       "version-skins": "裝咗嘅畫面",
        "version-specialpages": "特別頁",
        "version-parserhooks": "語法鈎",
        "version-variables": "變數",
        "version-hook-name": "鈎名",
        "version-hook-subscribedby": "利用於",
        "version-version": "($1)",
-       "version-license": "牌照",
+       "version-no-ext-name": "[無名]",
+       "version-license": "MediaWiki牌照",
+       "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-poweredby-credits": "呢個 Wiki 係由 '''[https://www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
+       "version-poweredby-translators": "translatewiki.net 翻譯者",
        "version-license-info": "MediaWiki係自由軟件;你可以根據Free Software Foundation所發表嘅GNU General Public License條款規定,就本程式再發佈同/或修改;無論你根據嘅係呢個牌照嘅第二版或(任你揀)任一日之後發行嘅版本。\n\nMediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅責任;亦都唔會對適售性或都係特定目的適用性嘅默示性擔保。詳情請目睇GNU General Public License。\n\n你應該已經收到跟往呢個程式嘅[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public License嘅副本];如果冇嘅話,請寫信到至Free Software Foundation, Inc.:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 上網睇]。",
        "version-software": "裝咗嘅軟件",
        "version-software-product": "產品",
        "version-software-version": "版本",
+       "version-entrypoints-header-url": "網址",
+       "version-libraries-version": "版本",
+       "redirect-submit": "去",
+       "redirect-value": "值:",
+       "redirect-user": "用戶ID",
+       "redirect-page": "頁ID",
+       "redirect-revision": "頁版本",
+       "redirect-file": "檔名",
        "fileduplicatesearch": "㨂重覆檔案",
        "fileduplicatesearch-summary": "用重覆檔案嘅切細值去搵個檔案係唔係重覆。",
        "fileduplicatesearch-legend": "搵重覆",
        "fileduplicatesearch-result-n": "個檔案 \"$1\" 有$2項完全相同嘅重覆。",
        "fileduplicatesearch-noresults": "檔案名\"$1\"找不到",
        "specialpages": "特別頁",
-       "specialpages-note": "* 標準特別頁。\n* <strong class=\"mw-specialpagerestricted\">有限制嘅特別頁。</strong>",
+       "specialpages-note": "* 標準特別頁。\n* <span class=\"mw-specialpagerestricted\">有限制嘅特別頁。</span>",
        "specialpages-group-maintenance": "維護報告",
        "specialpages-group-other": "其它特別頁",
-       "specialpages-group-login": "ç\99»å\85¥ï¼\8fé\96\8b戶口",
+       "specialpages-group-login": "ç°½å\88°ï¼\8fé\96\8bæ\96°戶口",
        "specialpages-group-changes": "最近更改同日誌",
        "specialpages-group-media": "媒體報告同上載",
        "specialpages-group-users": "用戶同權限",
        "specialpages-group-highuse": "高度使用頁",
        "specialpages-group-pages": "頁面一覽",
        "specialpages-group-pagetools": "版工具",
-       "specialpages-group-wiki": "Wiki資料同工具",
+       "specialpages-group-wiki": "資料同工具",
        "specialpages-group-redirects": "跳轉特別頁",
        "specialpages-group-spam": "反垃圾工具",
        "specialpages-group-developer": "開發者工具",
        "tags-tag": "標籤名",
        "tags-display-header": "響更改表嘅出現方式",
        "tags-description-header": "解釋完整描述",
+       "tags-source-header": "來源",
        "tags-hitcount-header": "加咗標籤嘅更改",
+       "tags-actions-header": "動作",
+       "tags-active-yes": "係",
+       "tags-active-no": "唔係",
        "tags-edit": "編輯",
+       "tags-delete": "刪除",
        "tags-hitcount": "$1次更改",
+       "tags-create-reason": "原因:",
+       "tags-create-submit": "開",
+       "tags-delete-reason": "原因:",
+       "tags-activate-reason": "原因:",
+       "tags-deactivate-reason": "原因:",
        "comparepages": "比較版",
        "compare-page1": "第1版",
        "compare-page2": "第2版",
        "compare-submit": "比較",
        "dberr-problems": "對唔住!呢一版出現咗一啲技術性問題。",
        "dberr-again": "試吓等多幾分種然後開試。",
-       "dberr-info": "(唔能夠連繫個資料伺服器: $1)",
+       "dberr-info": "(唔能夠連繫個資料庫:$1)",
        "dberr-usegoogle": "響現階段你可以用 Google 去搵嘢。",
        "dberr-outofdate": "留意佢哋索引嘅內容可能會過時。",
        "dberr-cachederror": "呢個係所要求版嘅快取複本,可能會過時。",
        "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",
        "logentry-upload-upload": "$1 {{GENDER:$2|上傳咗}} $3",
        "rightsnone": "(冇)",
        "revdelete-summary": "編輯摘要",
+       "feedback-back": "返轉頭",
+       "feedback-cancel": "取消",
+       "feedback-close": "搞掂",
+       "feedback-error-title": "出錯",
+       "feedback-submit": "遞交",
+       "feedback-thanks-title": "多謝!",
        "searchsuggest-search": "搵嘢",
        "searchsuggest-containing": "名單傳送緊...",
+       "api-error-unclassified": "發生未知嘅錯誤。",
+       "api-error-unknown-code": "未知嘅出錯:$1。",
+       "api-error-unknown-warning": "未知嘅警告:$1。",
+       "api-error-unknownerror": "未知嘅出錯:$1。",
+       "api-error-uploaddisabled": "呢個維基唔畀上載檔案。",
+       "api-error-verification-error": "檔案壞咗或者用錯副檔名。",
+       "duration-seconds": "$1 {{PLURAL:$1|秒}}",
+       "duration-minutes": "$1 {{PLURAL:$1|分鐘}}",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
+       "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|個千禧年}}",
+       "rotate-comment": "幅圖順時針轉 $1 {{PLURAL:$1|度}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|秒}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|秒}}",
        "expandtemplates": "展開模",
-       "expand_templates_intro": "呢個特別頁係用於將一啲文字中嘅模展開,包括響個模度引用嘅模。同時亦都展開解譯器函數好似<nowiki>{{</nowiki>#language:...}},以及一啲變數好似<nowiki>{{</nowiki>CURRENTDAY}}&mdash;實際上,幾乎所有響雙括弧中嘅內容都會被展開。呢個特別頁係通過使用MediaWiki嘅相關解釋階段嘅功能完成嘅。",
+       "expand_templates_intro": "呢個特別頁係用於將一啲文字中嘅模展開,包括響個模度引用嘅模。\n同時亦都展開解譯器函數好似\n<code><nowiki>{{</nowiki>#language:...}}</code>,同埋一啲變數好似\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,幾乎所有響雙括弧中嘅內容都會被展開。",
        "expand_templates_title": "內容標題,用於 {{FULLPAGENAME}} 等頁面:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果:",
        "expand_templates_xml_output": "XML輸出",
+       "expand_templates_html_output": "原始HTML輸出",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "拎走注釋",
+       "expand_templates_remove_nowiki": "結果壓制<nowiki>標籤",
        "expand_templates_generate_xml": "顯示XML語法樹",
+       "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": "改語言紀錄",
+       "log-description-pagelang": "呢個係改語言嘅紀錄。",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (可以用)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (唔可以用)",
+       "mediastatistics": "媒體統計",
+       "mediastatistics-header-unknown": "唔知",
+       "mediastatistics-header-bitmap": "點陣圖",
+       "mediastatistics-header-drawing": "向量圖",
+       "mediastatistics-header-audio": "語音",
+       "mediastatistics-header-video": "影片",
+       "mediastatistics-header-multimedia": "多媒體",
+       "mediastatistics-header-office": "Office文件",
+       "mediastatistics-header-text": "文字",
+       "mediastatistics-header-executable": "執行檔",
+       "mediastatistics-header-archive": "壓縮格式",
+       "json-error-syntax": "語法錯咗",
+       "headline-anchor-title": "連結到呢一節",
        "special-characters-group-latin": "拉丁文",
        "special-characters-group-latinextended": "Latin擴展左",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-greek": "希臘文",
        "special-characters-group-cyrillic": "西里爾文",
        "special-characters-group-arabic": "阿拉伯文",
+       "special-characters-group-arabicextended": "阿剌伯文擴充",
+       "special-characters-group-persian": "波斯文",
        "special-characters-group-hebrew": "希伯來文",
        "special-characters-group-bangla": "Bangla\nBangla",
+       "special-characters-group-tamil": "淡米爾文",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Sinhala",
-       "special-characters-group-gujarati": "Gujarati"
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "梵文",
+       "special-characters-group-thai": "泰文",
+       "special-characters-group-lao": "老撾文",
+       "special-characters-group-khmer": "高棉文",
+       "special-characters-title-endash": "短破折號",
+       "special-characters-title-emdash": "長破折號",
+       "special-characters-title-minus": "減號"
 }
index 91a19dc..e0a6c87 100644 (file)
@@ -82,7 +82,9 @@
                        "NigelSoft",
                        "Zhuyifei1999",
                        "Davidzdh",
-                       "LNDDYL"
+                       "LNDDYL",
+                       "Jiang123aa",
+                       "Cdz"
                ]
        },
        "tog-underline": "链接下划线:",
@@ -94,7 +96,7 @@
        "tog-numberheadings": "自动编号标题",
        "tog-showtoolbar": "显示编辑工具栏",
        "tog-editondblclick": "双击编辑页面",
-       "tog-editsectiononrightclick": "å\90¯ç\94¨å\8f³å\87»å°\8fè\8a\82æ \87é¢\98编辑段落",
+       "tog-editsectiononrightclick": "å\8f³å\87»æ®µè\90½æ \87é¢\98å\90¯ç\94¨编辑段落",
        "tog-watchcreations": "添加我创建的页面和我上传的文件至我的监视列表",
        "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
        "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "badarticleerror": "无法在此页进行该操作。",
-       "cannotdelete": "无法删除页面或图像“$1”。\n它可能已被其他人删除了。",
-       "cannotdelete-title": "无法删除“$1”",
+       "cannotdelete": "无法删除页面或文件“$1”。\n它可能已被其他人删除了。",
+       "cannotdelete-title": "无法删除页面“$1”",
        "delete-hook-aborted": "删除被扩展钩子取消。钩子并没有给出解释。",
        "no-null-revision": "无法创建对\"$1\"页面新的空白版本",
        "badtitle": "错误标题",
-       "badtitletext": "æ\89\80请æ±\82页é\9d¢ç\9a\84æ \87é¢\98æ\98¯æ\97 æ\95\88ç\9a\84ã\80\81ä¸\8då­\98å\9c¨ï¼\8c跨语è¨\80æ\88\96è·¨wikié\93¾æ\8e¥ç\9a\84æ \87é¢\98é\94\99误ã\80\82å®\83å\8f¯è\83½å\8c\85å\90«ä¸\80个æ\88\96æ\9b´å¤\9aç\9a\84不能用于标题的字符。",
+       "badtitletext": "æ\82¨è¯·æ±\82äº\86个æ\97 æ\95\88ã\80\81ä¸\8då­\98å\9c¨æ\88\96è\80\85跨语è¨\80æ\88\96è·¨wikié\93¾æ\8e¥æ \87é¢\98é\94\99误ç\9a\84页é\9d¢ã\80\82å®\83å\8f¯è\83½å\8c\85å\90«ä¸\80个æ\88\96å¤\9a个不能用于标题的字符。",
        "perfcached": "以下是缓存的数据,可能不是最新的数据。缓存中最多有{{PLURAL:$1|$1条结果}}。",
        "perfcachedts": "以下是缓存的数据,最后更新于$1。缓存中最多有{{PLURAL:$4|$4条结果}}。",
        "querypage-no-updates": "该页面的更新目前停用。这里的数据不会马上刷新。",
        "viewsource": "查看源代码",
        "viewsource-title": "查看“$1”的源代码",
        "actionthrottled": "操作被限制",
-       "actionthrottledtext": "基于反垃圾的考量,您被限制在短时间内多次重复该操作,但您已超过此上限。请在数分钟后再尝试。",
+       "actionthrottledtext": "作为反破坏措施,您被限制在短时间段内执行太多次该操作,并且您已超越此限制。请在数分钟后再试。",
        "protectedpagetext": "该页面已被保护以防止编辑和其他操作。",
        "viewsourcetext": "您可以查看并复制此页面的源代码:",
        "viewyourtext": "您可以查看并复制<strong>您对此页面作出编辑后</strong>的源代码:",
        "createacct-realname": "真实姓名(可选)",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
-       "createacct-reason-ph": "为什么要创建另一个账户",
+       "createacct-reason-ph": "为什么要创建另一个账户",
        "createacct-captcha": "安全检查",
        "createacct-imgcaptcha-ph": "请输入上图中的文字",
-       "createacct-submit": "创建的账户",
+       "createacct-submit": "创建的账户",
        "createacct-another-submit": "创建另一个账户",
        "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
        "createacct-benefit-body1": "{{PLURAL:$1|编辑}}",
        "emaildisabled": "该网站无法发送电子邮件。",
        "accountcreated": "已建立账户",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])的账户已创建。",
-       "createaccount-title": "在{{SITENAME}}创建新账户",
+       "createaccount-title": "在{{SITENAME}}创建新账户",
        "createaccount-text": "有人在{{SITENAME}}中利用您的邮箱创建了一个名为 \"$2\" 的新帐户($4),密码是 \"$3\" 。您应该立即登录并更改密码。\n\n如果该账户创建错误的话,您可以忽略此信息。",
        "login-throttled": "你最近尝试登录的次数过多。请等待$1后再试。",
        "login-abort-generic": "登录失败 - 已终止",
        "history-feed-description": "本wiki的该页面的版本历史",
        "history-feed-item-nocomment": "$2 $1",
        "history-feed-empty": "所请求的页面不存在。它可能已被删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关的新建页面。",
+       "history-edit-tags": "编辑选定修订版本的标签",
        "rev-deleted-comment": "(编辑摘要被删除)",
        "rev-deleted-user": "(用户名被删除)",
        "rev-deleted-event": "(日志详情已移除)",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除/还原版本",
        "revdelete-nooldid-title": "无效目标版本",
-       "revdelete-nooldid-text": "æ\82¨å°\9aæ\9cªæ\8c\87å®\9aä¸\80个ç\9b®æ \87ç\89\88æ\9c¬å\8e»è¿\9bè¡\8cè¿\99个å\8a\9fè\83½ã\80\81所指定的版本不存在,或者您尝试去隐藏现时的版本。",
+       "revdelete-nooldid-text": "æ\82¨å°\9aæ\9cªæ\8c\87å®\9aä»»ä½\95è¦\81æ\89§è¡\8cæ­¤å\8a\9fè\83½ç\9a\84ç\9b®æ \87ç\89\88æ\9c¬ï¼\8cæ\88\96è\80\85所指定的版本不存在,或者您尝试去隐藏现时的版本。",
        "revdelete-no-file": "指定的文件不存在。",
        "revdelete-show-file-confirm": "确定要查看文件“<nowiki>$1</nowiki>”于$2$3被删除的版本吗?",
        "revdelete-show-file-submit": "是",
        "revdelete-unsuppress": "在已恢复的版本中移除限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "应用于选中的{{PLURAL:$1|版本}}",
-       "revdelete-success": "<strong>版本可见性更新成功。</strong>",
-       "revdelete-failure": "<strong>版本可见性无法更新:</strong>$1",
+       "revdelete-success": "版本可见性更新成功。",
+       "revdelete-failure": "版本可见性无法更新:\n$1",
        "logdelete-success": "'''事件的可见性已经成功设置。'''",
        "logdelete-failure": "'''事件的可见性无法设置:'''\n$1",
        "revdel-restore": "更改可见性",
        "revdelete-edit-reasonlist": "编辑删除原因",
        "revdelete-offender": "版本作者:",
        "suppressionlog": "监督日志",
-       "suppressionlogtext": "该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
+       "suppressionlogtext": "该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
        "mergehistory": "合并页面历史",
        "mergehistory-header": "这一页可以让您将来源页面的版本合并到新页面中去。请确保此次更改能继续保持历史页面的连续性。",
        "mergehistory-box": "合并两个页面的版本历史:",
        "right-sendemail": "发送电子邮件给其他用户",
        "right-passwordreset": "查看密码重置电子邮件",
        "right-managechangetags": "从数据库创建和删除[[Special:Tags|标签]]",
+       "right-applychangetags": "连同某人的更改一起应用[[Special:Tags|标签]]",
+       "right-changetags": "在个别修订和日志记录中添加和移除任意[[Special:Tags|标签]]",
        "newuserlogpage": "用户创建日志",
        "newuserlogpagetext": "这是用户创建的日志。",
        "rightslog": "用户权限日志",
        "action-editmyprivateinfo": "编辑你的私人信息",
        "action-editcontentmodel": "编辑页面的内容模型",
        "action-managechangetags": "创建和从数据库中删除标签",
+       "action-applychangetags": "连同您的更改应用标签",
+       "action-changetags": "在个别修订和日志记录中添加和移除任意标签",
        "nchanges": "$1次更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
        "enhancedrc-history": "历史",
        "listfiles-delete": "删除",
        "listfiles-summary": "本特殊页面展示所有上传的文件。",
        "listfiles_search_for": "按媒体名称搜索:",
+       "listfiles-userdoesnotexist": "用户帐户“$1”未注册。",
        "imgfile": "文件",
        "listfiles": "文件列表",
        "listfiles_thumb": "缩略图",
        "logempty": "在日志中不存在匹配项。",
        "log-title-wildcard": "搜索以该文字开头的标题",
        "showhideselectedlogentries": "显示/隐藏所选日志项",
+       "log-edit-tags": "编辑选定日志记录的标签",
        "allpages": "所有页面",
        "nextpage": "下一页($1)",
        "prevpage": "上一页($1)",
        "emailccsubject": "您发送给$1的消息的副本:$2",
        "emailsent": "电子邮件已发送",
        "emailsenttext": "您的电子邮件已经发出。",
-       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“电邮联系”功能被$1发送至$2的。",
+       "emailuserfooter": "本电子邮件是通过{{SITENAME}}的“{{int:emailpage}}”功能被$1发送至$2的。",
        "usermessage-summary": "留下系统消息。",
        "usermessage-editor": "系统信息编辑器",
        "watchlist": "监视列表",
        "import-interwiki-history": "复制此页的所有历史版本",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "导入",
-       "import-interwiki-namespace": "目标名字空间:",
-       "import-interwiki-rootpage": "目标根页面(可选):",
+       "import-mapping-default": "导入至默认位置",
+       "import-mapping-namespace": "导入至一个名字空间:",
+       "import-mapping-subpage": "作为以下页面的子页面导入:",
        "import-upload-filename": "文件名:",
        "import-comment": "注释:",
        "importtext": "请使用[[Special:Export|导出功能]]从源 wiki 导出文件,\n保存到您的电脑并上传到这里。",
        "pageinfo-protect-cascading-yes": "是",
        "pageinfo-protect-cascading-from": "保护级联自",
        "pageinfo-category-info": "分类信息",
+       "pageinfo-category-total": "总成员数",
        "pageinfo-category-pages": "页面数",
        "pageinfo-category-subcats": "子分类数",
        "pageinfo-category-files": "文件数",
        "patrol-log-page": "巡查日志",
        "patrol-log-header": "这是已巡查版本的日志。",
        "log-show-hide-patrol": "$1巡查纪录",
+       "log-show-hide-tag": "$1标签日志",
        "deletedrevision": "已删除旧版本$1",
        "filedeleteerror-short": "删除文件发生错误:$1",
        "filedeleteerror-long": "删除文件时出错:\n\n$1",
        "tags-deactivate-reason": "原因:",
        "tags-deactivate-not-allowed": "无法取消激活标签“$1”。",
        "tags-deactivate-submit": "取消激活",
+       "tags-apply-no-permission": "您并无权限连带您的更改一起应用更改标签。",
+       "tags-apply-not-allowed-one": "标签“$1”不允许手动应用。",
+       "tags-apply-not-allowed-multi": "以下{{PLURAL:$2|标签}}不允许手动应用:$1",
+       "tags-update-no-permission": "您并无权限从个别修订或日志记录中添加或移除更改标签。",
+       "tags-update-add-not-allowed-one": "标签“$1”不被允许手动添加。",
+       "tags-update-add-not-allowed-multi": "以下{{PLURAL:$2|标签}}不被允许手动添加:$1",
+       "tags-update-remove-not-allowed-one": "标签“$1”不被允许移除。",
+       "tags-update-remove-not-allowed-multi": "以下{{PLURAL:$2|标签}}不被允许手动移除:$1",
+       "tags-edit-title": "编辑标签",
+       "tags-edit-manage-link": "管理标签",
+       "tags-edit-revision-selected": "[[:$2]]的{{PLURAL:$1|选定修订}}:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|选定日志活动}}:",
+       "tags-edit-revision-legend": "从{{PLURAL:$1|此|所有$1个}}修订版本添加或移除标签",
+       "tags-edit-logentry-legend": "从{{PLURAL:$1|此日志记录|所有$1个日志记录}}添加或移除标签",
+       "tags-edit-existing-tags": "现有标签:",
+       "tags-edit-existing-tags-none": "''无''",
+       "tags-edit-new-tags": "新标签:",
+       "tags-edit-add": "添加这些标签:",
+       "tags-edit-remove": "移除这些标签:",
+       "tags-edit-remove-all-tags": "(移除所有标签)",
+       "tags-edit-chosen-placeholder": "选择一些标签",
+       "tags-edit-chosen-no-results": "没有找到匹配的标签",
+       "tags-edit-reason": "原因:",
+       "tags-edit-revision-submit": "将更改应用至{{PLURAL:$1|此|$1个}}修订版本",
+       "tags-edit-logentry-submit": "将更改应用至{{PLURAL:$1|此日志记录|$1个日志记录}}",
+       "tags-edit-success": "更改已成功应用。",
+       "tags-edit-failure": "更改无法被应用:\n$1",
+       "tags-edit-nooldid-title": "无效目标版本",
+       "tags-edit-nooldid-text": "您尚未指定任何要执行此功能的目标版本,或者所指定的版本不存在。",
+       "tags-edit-none-selected": "请选择至少一个要添加或移除的标签。",
        "comparepages": "对比页面",
        "compare-page1": "页面1",
        "compare-page2": "页面2",
        "logentry-managetags-delete": "$1 {{GENDER:$2|删除了}}“$4”标签(已从$5个{{PLURAL:$5|修订版本和/或日志条目}}中移除)",
        "logentry-managetags-activate": "$1 {{GENDER:$2|激活了}}“$4”标签供用户和机器人使用",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|停用了}}“$4”标签供用户和机器人使用",
+       "log-name-tag": "标签日志",
+       "log-description-tag": "此页面显示用户从个别修订或日志记录中添加或移除的[[Special:Tags|标签]]。日志不列举他们作为编辑、删除或类似操作的一部分进行的标记操作。",
+       "logentry-tag-update-add-revision": "$1{{GENDER:$2|添加了}}{{PLURAL:$7|标签}}$6至页面$3的修订版本$4",
+       "logentry-tag-update-add-logentry": "$1{{GENDER:$2|添加了}}{{PLURAL:$7|标签}}$6至页面$3的日志记录$5",
+       "logentry-tag-update-remove-revision": "$1从页面$3的修订$4中{{GENDER:$2|移除了}}{{PLURAL:$9|标签}}$8",
+       "logentry-tag-update-remove-logentry": "$1从页面$3的日志记录$5中{{GENDER:$2|移除了}}{{PLURAL:$9|标签}}$8",
+       "logentry-tag-update-revision": "$1{{GENDER:$2|更新了}}在页面$3的修订版本$4上的标签({{PLURAL:$7|添加了}}$6;并{{PLURAL:$9|移除了}}$8)",
+       "logentry-tag-update-logentry": "$1在页面$3的日志记录$5中{{GENDER:$2|更新了}}标签({{PLURAL:$7|添加了}}$6;并{{PLURAL:$9|移除了}}$8)",
        "rightsnone": "(无)",
        "revdelete-summary": "编辑摘要",
        "feedback-adding": "正在添加反馈至页面...",
        "feedback-error1": "错误:从API返回无法识别的结果",
        "feedback-error2": "错误:编辑失败",
        "feedback-error3": "错误:API没有响应",
+       "feedback-error4": "错误:无法发布至指定的反馈标题",
        "feedback-message": "信息:",
        "feedback-subject": "主题:",
        "feedback-submit": "提交",
        "log-name-pagelang": "更改语言日志",
        "log-description-pagelang": "这是页面语言更改的日志。",
        "logentry-pagelang-pagelang": "$1{{GENDER:$2|更改}}$3的页面语言:从$4改为$5。",
-       "default-skin-not-found": "天哪!您在<code dir=\"ltr\">$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。您的安装版本看起来需要包含以下皮肤。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 从[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]单独下载皮肤安装包。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下文本至您wiki的<code>LocalSettings.php</code>以启用安装的皮肤:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 如果您已经修改了<code>LocalSettings.php</code>:\n: 请再次检查皮肤名以确保不存在错误拼写。",
+       "default-skin-not-found": "天哪!您在<code dir=\"ltr\">$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。\n\n您的安装版本看起来需要包含以下{{PLURAL:$4|皮肤}}。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用{{PLURAL:$4|它|它们并设置为默认}}。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 从[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]单独下载皮肤安装包。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下{{PLURAL:$5|几行}}文本至您wiki的<code>LocalSettings.php</code>以启用{{PLURAL:$5||所有}}安装的{{PLURAL:$5|皮肤}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 如果您已经修改了<code>LocalSettings.php</code>:\n: 请再次检查皮肤名以确保不存在错误拼写。",
        "default-skin-not-found-no-skins": "天哪!您在<code>$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的,这是预期的。这是因为MediaWiki 1.24版本起主代码库不再包含任何皮肤。尝试通过以下方法从[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 从[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]单独下载皮肤安装包。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2(已启用)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2('''已禁用''')",
index 4b756d3..9653cbf 100644 (file)
        "revdelete-unsuppress": "移除已還原修訂上的顯示限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "套用至已選取的{{PLURAL:$1|一筆|多筆}}修訂",
-       "revdelete-success": "<strong>已成功更新修訂的顯示設定。</strong>",
-       "revdelete-failure": "<strong>無法更新修訂的顯示設定:</strong>\n$1",
-       "logdelete-success": "<strong>已成功更新日誌的顯示設定。</strong>",
-       "logdelete-failure": "<strong>無法更新日誌的顯示設定:</strong>\n$1",
+       "revdelete-success": "已成功更新修訂的顯示設定。",
+       "revdelete-failure": "無法更新修訂的顯示設定:\n$1",
+       "logdelete-success": "已成功更新日誌的顯示設定。",
+       "logdelete-failure": "無法更新日誌的顯示設定:\n$1",
        "revdel-restore": "更改顯示設定",
        "pagehist": "頁面歷史",
        "deletedhist": "已刪除歷史",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "匯入",
-       "import-interwiki-namespace": "目標命名空間:",
-       "import-interwiki-rootpage": "目標根頁面 (選填):",
        "import-upload-filename": "檔案名稱:",
        "import-comment": "評論:",
        "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "log-name-pagelang": "更改語言日誌",
        "log-description-pagelang": "此頁為頁面語言的變更日誌。",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。",
-       "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下外觀。 請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [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": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下{{PLURAL:$4|外觀}}。請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何{{PLURAL:$4|開啟外觀並設為預設值}}的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。您可以將下{{PLURAL:$5|列行}}貼上至 <code>LocalSettings.php</code> 來開啟{{PLURAL:$5|所有}}目前已經安裝的{{PLURAL:$5|外觀}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 若您才剛修改 <code>LocalSettings.php</code>:\n: 請再次確認您輸入的外觀名稱是否有誤。",
        "default-skin-not-found-no-skins": "哎呀!您於 <code>$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您未安裝任何的外觀。\n\n; 若您才剛安裝完或升級完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。 MediaWiki 1.24 或較新的版本在主要儲存庫中不再包含任何的外觀。 請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (已開啟)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''已停用''')",
index 9abb137..74a4542 100644 (file)
     "session_fail_preview": "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''\n請再試一次。\n如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
     "session_fail_preview_html": "'''很抱歉!部份資料已遺失,我們無法處理您的編輯。''''''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請登出後再重新登入一次。'''",
     "token_suffix_mismatch": "'''由於您使用者端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。\n這種情況通常出現於使用含有很多臭蟲、以網路為主的匿名代理服務的時候。'''",
-    "editing": "正在编辑 $1",
     "editingcomment": "正在編輯$1(新段落)",
     "storedversion": "已保存版本",
     "nonunicodebrowser": "'''警告: 您的瀏覽器不相容Unicode編碼。這裡有一個工作區將使您能安全地編輯頁面: 非ASCII字元將以十六進製編碼模式出現在編輯框中。'''",
index 797bfda..9f86bd6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tunisian Spoken Arabic (   زَوُن)
+/** Tunisian Spoken Arabic (تونسي/Tûnsi)
  *
  * To improve a translation please visit https://translatewiki.net
  *
@@ -8,7 +8,4 @@
  *
  */
 
-$fallback = 'ar';
-
-$rtl = true;
-
+$fallback = 'aeb-arab';
\ No newline at end of file
diff --git a/languages/messages/MessagesAeb_arab.php b/languages/messages/MessagesAeb_arab.php
new file mode 100644 (file)
index 0000000..1043496
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/** Tunisian Spoken Arabic (Arabic script) (تونسي)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'ar';
+
+$rtl = true;
\ No newline at end of file
index 74d3bb9..9961227 100644 (file)
@@ -6,6 +6,9 @@
  * @ingroup Language
  * @file
  *
+ * @author Arjanizary
+ * @author E THP
+ * @author Mjbmr
  */
 
 $fallback = 'fa';
@@ -17,7 +20,7 @@ $namespaceNames = array(
        NS_TALK             => 'دانیشیق',
        NS_USER             => 'ایستیفاده‌چی',
        NS_USER_TALK        => 'ایستیفاده‌چی_دانیشیغی',
-       NS_PROJECT_TALK     => '$1_دانیشیق',
+       NS_PROJECT_TALK     => '$1_دانیشیغی',
        NS_FILE             => 'فایل',
        NS_FILE_TALK        => 'فایل_دانیشیغی',
        NS_MEDIAWIKI        => 'مئدیا‌ویکی',
index 3d0aafc..cb52c1a 100644 (file)
@@ -1,11 +1,13 @@
 <?php
-/** Western Balochi
+/** Western Balochi (بلوچی رخشانی)
  *
  * To improve a translation please visit https://translatewiki.net
  *
  * @ingroup Language
  * @file
  *
+ * @author Ibrahim khashrowdi
+ * @author Mjbmr
  */
 
 $fallback = 'fa';
@@ -20,8 +22,8 @@ $namespaceNames = array(
        NS_PROJECT_TALK     => '$1_ئی_گپ',
        NS_FILE             => 'ورق',
        NS_FILE_TALK        => 'ورق_ئی_گپ',
-       NS_MEDIAWIKI        => 'Ù\88Û\8cÚ©Û\8c_رساÙ\86Ú¯',
-       NS_MEDIAWIKI_TALK   => 'Ù\88Û\8cÚ©Û\8c_رساÙ\86Ú¯_ئی_گپ',
+       NS_MEDIAWIKI        => 'Ù\85Û\8cÚ\88Û\8cاÙ\88Û\8cÚ©Û\8c',
+       NS_MEDIAWIKI_TALK   => 'Ù\85Û\8cÚ\88Û\8cاÙ\88Û\8cÚ©Û\8c_ئی_گپ',
        NS_TEMPLATE         => 'تراشوان',
        NS_TEMPLATE_TALK    => 'تراشوان_ئی_گپ',
        NS_HELP             => 'کومک',
@@ -29,3 +31,125 @@ $namespaceNames = array(
        NS_CATEGORY         => 'تهر',
        NS_CATEGORY_TALK    => 'تهر_ئی_گپ',
 );
+
+$namespaceAliases = array(
+       'میڈیا' => NS_MEDIA,
+       'اکس' => NS_FILE,
+       'اکس_ئی_گپ' => NS_FILE_TALK,
+);
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'پئالین_کارمرزوکان' ),
+       'Allmessages'               => array( 'موچین_پیامان' ),
+       'AllMyUploads'              => array( 'نی_موچین_ایرگیج_ئآن', 'نی_موچین_وّرک_ئآن' ),
+       'Allpages'                  => array( 'موچین_تاکدیمان' ),
+       'ApiHelp'                   => 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( 'بن_بست_ئین_تاکدیمان' ),
+       '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( 'بسته_بوته_ئآنی_لیست', 'آی_پی_نشانی_بستینی_لیست' ),
+       'LinkSearch'                => array( 'گشتین_په_لینکا' ),
+       'Listadmins'                => array( 'مدیرئانی_لیست' ),
+       'Listbots'                  => 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( 'بازتیرین_تهر' ),
+       '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( 'نۆکین_وَرق_ئان' ),
+       '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( 'دسته_بندی_نه_بوته_ئین_اکس_ئان' ),
+       '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( 'لینک_په_ای_دیما' ),
+       'Withoutinterwiki'          => array( 'بئ_شه_مانیجین_ویکی_ئا' ),
+);
+
+$linkTrail = "/^([اآأبپتثجچحخدڈذرڑزژسشصضطظعغفقکگلمنوۆؤھهئیێ‌]+)(.*)$/sDu";
index 7ee29c1..67d126a 100644 (file)
@@ -311,3 +311,18 @@ $magicWords = array(
        'url_wiki'                  => array( '0', 'ЧЕХКА', 'ВИКИ', 'WIKI' ),
 );
 
+$datePreferences = array(
+       'default',
+       'ydm',
+       'ISO 8601',
+);
+
+$dateFormats = array(
+       'ydm time' => 'H:i',
+       'ydm date' => 'Y, j F',
+       'ydm both' => 'Y, j F, H:i',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
index a2c1873..23b702c 100644 (file)
@@ -405,6 +405,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'DeletedContributions' ),
        'Diff'                      => array( 'Diff' ),
        'DoubleRedirects'           => array( 'DoubleRedirects' ),
+       'EditTags'                  => array( 'EditTags' ),
        'EditWatchlist'             => array( 'EditWatchlist' ),
        'Emailuser'                 => array( 'EmailUser', 'Email' ),
        'ExpandTemplates'           => array( 'ExpandTemplates' ),
index 4d964fb..dd1cc55 100644 (file)
@@ -50,10 +50,10 @@ $specialPageAliases = array(
        'Booksources'               => array( 'منابع_کتاب' ),
        'BrokenRedirects'           => array( 'تغییرمسیرهای_خراب' ),
        'Categories'                => array( 'رده‌ها' ),
-       'ChangeEmail'               => array( 'تغییر_رایانامه' ),
+       'ChangeEmail'               => array( 'تغÛ\8cÛ\8cر_اÛ\8cÙ\85Û\8cÙ\84', 'تغÛ\8cÛ\8cر_راÛ\8cاÙ\86اÙ\85Ù\87' ),
        'ChangePassword'            => array( 'از_نو_کردن_گذرواژه' ),
        'ComparePages'              => array( 'مقایسهٔ_صفحات' ),
-       'Confirmemail'              => array( 'تأیید_رایانامه' ),
+       'Confirmemail'              => array( 'تأÛ\8cÛ\8cد_اÛ\8cÙ\85Û\8cÙ\84', 'تأÛ\8cÛ\8cد_راÛ\8cاÙ\86اÙ\85Ù\87' ),
        'Contributions'             => array( 'مشارکت‌ها' ),
        'CreateAccount'             => array( 'ایجاد_حساب_کاربری' ),
        'Deadendpages'              => array( 'صفحه‌های_بن‌بست' ),
@@ -61,14 +61,14 @@ $specialPageAliases = array(
        'Diff'                      => array( 'تفاوت' ),
        'DoubleRedirects'           => array( 'تغییرمسیرهای_دوتایی' ),
        'EditWatchlist'             => array( 'ویرایش_فهرست_پی‌گیری‌ها' ),
-       'Emailuser'                 => array( 'نامه_به_کاربر' ),
+       'Emailuser'                 => array( 'ایمیل_به_کاربر', 'نامه_به_کاربر' ),
        'ExpandTemplates'           => array( 'گسترش_الگوها' ),
        'Export'                    => array( 'برون‌بری_صفحه' ),
        'Fewestrevisions'           => array( 'کمترین_نسخه' ),
        'FileDuplicateSearch'       => array( 'جستجوی_پروندهٔ_تکراری' ),
        'Filepath'                  => array( 'مسیر_پرونده' ),
        'Import'                    => array( 'درون‌ریزی_صفحه' ),
-       'Invalidateemail'           => array( 'باطل‌کردن_رایانامه' ),
+       'Invalidateemail'           => array( 'باطÙ\84â\80\8cکردÙ\86§Û\8cÙ\85Û\8cÙ\84', 'باطÙ\84â\80\8cکردÙ\86±Ø§Û\8cاÙ\86اÙ\85Ù\87' ),
        'JavaScriptTest'            => array( 'تست_جاوااسکریپت' ),
        'BlockList'                 => array( 'فهرست_بسته‌شده‌ها', 'فهرست_بستن_نشانی_آی‌پی' ),
        'LinkSearch'                => array( 'جستجوی_پیوند' ),
index 3d579c5..559cfff 100644 (file)
@@ -8,8 +8,10 @@
  *
  * @author Bonevarluri
  * @author Mogoeilor
+ * @author Mjbmr
  */
 
+$fallback = 'fa';
 $rtl = true;
 
 $namespaceNames = array(
@@ -20,15 +22,20 @@ $namespaceNames = array(
        NS_USER_TALK        => 'چک_چنه_کارور',
        NS_PROJECT_TALK     => 'چک_چنه_$1',
        NS_FILE             => 'جانیا',
-       NS_FILE_TALK        => 'جانیا_چک_چنه',
+       NS_FILE_TALK        => 'چک_چنه_جانیا',
        NS_MEDIAWIKI        => 'ویکی_رسانه',
        NS_MEDIAWIKI_TALK   => 'چک_چنه_ویکی_رسانه',
-       NS_TEMPLATE         => 'قالو',
-       NS_TEMPLATE_TALK    => 'قالو_چک_چنه',
+       NS_TEMPLATE         => 'چوئه',
+       NS_TEMPLATE_TALK    => 'چک_چنه_چوئه',
        NS_HELP             => 'هومیاری',
        NS_HELP_TALK        => 'چک_چنه_هومیاری',
        NS_CATEGORY         => 'دسه',
-       NS_CATEGORY_TALK    => 'دسه_چک_چنه',
+       NS_CATEGORY_TALK    => 'چک_چنه_دسه',
+);
+
+$namespaceAliases = array(
+       'عسگ' => NS_FILE,
+       'چک_چنه_عسگ' => NS_FILE_TALK,
 );
 
 $specialPageAliases = array(
@@ -48,7 +55,7 @@ $specialPageAliases = array(
        'ChangePassword'            => array( 'آلشت_دئن_رازینه_گواردن' ),
        'ComparePages'              => array( 'تی_یک_نیائن_بلگه_یا' ),
        'Confirmemail'              => array( 'پشت_راس_کاری_ایمیل' ),
-       'Contributions'             => array( 'هومیاریا' ),
+       'Contributions'             => array( 'هومیاری_کردنیا' ),
        'CreateAccount'             => array( 'راس_کردن_حساو' ),
        'Deadendpages'              => array( 'بلگه_یا_بی_ویرگار' ),
        'DeletedContributions'      => array( 'هومیاریا_پاکسا_بیه' ),
@@ -143,4 +150,4 @@ $specialPageAliases = array(
        'Watchlist'                 => array( 'سیل_برگ' ),
        'Whatlinkshere'             => array( 'چه_هوم_پیوندیایی_ها_ایچه' ),
        'Withoutinterwiki'          => array( 'بی_مین_ویکی' ),
-);
\ No newline at end of file
+);
index 62bf716..c85f4ff 100644 (file)
@@ -42,8 +42,7 @@ $namespaceAliases = array(
 // Remove Russian aliases
 $namespaceGenderAliases = array();
 
-$linkTrail = '/^([a-zа-яёӝӟӥӧӵ“»]+)(.*)$/sDu';
-$linkPrefixCharset = '„«';
+$linkTrail = '/^([a-zа-яёӝӟӥӧӵ]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
index fb3c764..af16169 100644 (file)
--- a/load.php5
+++ b/load.php5
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './load.php';
index a0ffcb2..f97f6dc 100644 (file)
@@ -38,6 +38,8 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Abstract maintenance class for quickly writing and churning out
  * maintenance scripts with minimal effort. All that _must_ be defined
@@ -612,6 +614,11 @@ abstract class Maintenance {
                        $profiler->setTemplated( true );
                        Profiler::replaceStubInstance( $profiler );
                }
+
+               $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
+               # Catch huge single updates that lead to slave lag
+               $trxProfiler->setExpectation( 'maxAffected', 1000, __METHOD__ );
        }
 
        /**
@@ -1099,7 +1106,7 @@ abstract class Maintenance {
         */
        private function lockSearchindex( $db ) {
                $write = array( 'searchindex' );
-               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user' );
+               $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user', 'page_restrictions' );
                $db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
        }
 
index 4c858f4..2a2d361 100644 (file)
@@ -1,4 +1,4 @@
 ALTER TABLE /*_*/imagelinks
   ADD COLUMN il_from_namespace int NOT NULL default 0;
 
-CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_to,il_from_namespace,il_from);
\ No newline at end of file
+CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from);
\ No newline at end of file
index 2f7ff04..dcf2b60 100644 (file)
@@ -1,4 +1,4 @@
 ALTER TABLE /*_*/pagelinks
        ADD COLUMN pl_from_namespace int NOT NULL default 0;
 
-CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from_namespace,pl_from);
+CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from);
index 8d6c76b..edfb7a5 100644 (file)
@@ -1,4 +1,4 @@
 ALTER TABLE /*_*/templatelinks
        ADD COLUMN tl_from_namespace int NOT NULL default 0;
 
-CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from_namespace,tl_from);
+CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from);
index 3921c07..0364db2 100644 (file)
@@ -42,39 +42,33 @@ class CheckImages extends Maintenance {
                $numImages = 0;
                $numGood = 0;
 
+               $repo = RepoGroup::singleton()->getLocalRepo();
                do {
                        $res = $dbr->select( 'image', '*', array( 'img_name > ' . $dbr->addQuotes( $start ) ),
                                __METHOD__, array( 'LIMIT' => $this->mBatchSize ) );
                        foreach ( $res as $row ) {
                                $numImages++;
                                $start = $row->img_name;
-                               $file = RepoGroup::singleton()->getLocalRepo()->newFileFromRow( $row );
+                               $file = $repo->newFileFromRow( $row );
                                $path = $file->getPath();
                                if ( !$path ) {
                                        $this->output( "{$row->img_name}: not locally accessible\n" );
                                        continue;
                                }
-                               wfSuppressWarnings();
-                               $stat = stat( $file->getPath() );
-                               wfRestoreWarnings();
-                               if ( !$stat ) {
+                               $size = $repo->getFileSize( $file->getPath() );
+                               if ( $size === false ) {
                                        $this->output( "{$row->img_name}: missing\n" );
                                        continue;
                                }
 
-                               if ( $stat['mode'] & 040000 ) {
-                                       $this->output( "{$row->img_name}: is a directory\n" );
-                                       continue;
-                               }
-
-                               if ( $stat['size'] == 0 && $row->img_size != 0 ) {
+                               if ( $size == 0 && $row->img_size != 0 ) {
                                        $this->output( "{$row->img_name}: truncated, was {$row->img_size}\n" );
                                        continue;
                                }
 
-                               if ( $stat['size'] != $row->img_size ) {
+                               if ( $size != $row->img_size ) {
                                        $this->output( "{$row->img_name}: size mismatch DB={$row->img_size}, "
-                                               . "actual={$stat['size']}\n" );
+                                               . "actual={$size}\n" );
                                        continue;
                                }
 
index 777c833..a64bc49 100644 (file)
@@ -56,7 +56,7 @@ class CheckUsernames extends Maintenance {
 
                        foreach ( $res as $row ) {
                                if ( !User::isValidUserName( $row->user_name ) ) {
-                                       $this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
+                                       $this->output( sprintf( "Found: %6d: '%s'\n", $row->user_id, $row->user_name ) );
                                        wfDebugLog( 'checkUsernames', $row->user_name );
                                }
                        }
index 24b63a8..70490e1 100644 (file)
@@ -87,6 +87,7 @@ class UploadStashCleanup extends Maintenance {
                                        $this->output( "Failed removing stashed upload with key: $key ($type)\n" );
                                }
                                if ( $i % 100 == 0 ) {
+                                       wfWaitForSlaves();
                                        $this->output( "$i\n" );
                                }
                        }
index 76bc982..2fb3697 100644 (file)
@@ -10,10 +10,20 @@ class ConvertExtensionToRegistration extends Maintenance {
                'AutoloadClasses' => 'removeAbsolutePath',
                'ExtensionCredits' => 'handleCredits',
                'ResourceModules' => 'handleResourceModules',
+               'ResourceModuleSkinStyles' => 'handleResourceModules',
                'Hooks' => 'handleHooks',
                'ExtensionFunctions' => 'handleExtensionFunctions',
        );
 
+       /**
+        * Things that were formerly globals and should still be converted
+        *
+        * @var array
+        */
+       protected $formerGlobals = array(
+               'TrackingCategories',
+       );
+
        /**
         * Keys that should be put at the top of the generated JSON file (T86608)
         *
@@ -44,7 +54,7 @@ class ConvertExtensionToRegistration extends Maintenance {
                $processor = new ReflectionClass( 'ExtensionProcessor' );
                $settings = $processor->getProperty( 'globalSettings' );
                $settings->setAccessible( true );
-               return $settings->getValue();
+               return $settings->getValue() + $this->formerGlobals;
        }
 
        public function execute() {
index 732bdc0..eab2b63 100644 (file)
@@ -23,6 +23,7 @@
                                "classes": [
                                        "mw.Title",
                                        "mw.Uri",
+                                       "mw.messagePoster.*",
                                        "mw.notification",
                                        "mw.Notification_",
                                        "mw.user",
index 71641ef..4ab57d4 100755 (executable)
@@ -203,13 +203,16 @@ def customRules( path ):
     fp = open( path, 'r', encoding = 'U8' )
     ret = dict()
     for line in fp:
-        elems = line.split( '#' )[0].split()
+        line = line.rstrip( '\r\n' )
+        if '#' in line:
+            line = line.split( '#' )[0].rstrip()
+        elems = line.split( '\t' )
         if len( elems ) > 1:
             ret[elems[0]] = elems[1]
     return ret
 
 def dictToSortedList( src_table, pos ):
-    return sorted( src_table.items(), key = lambda m: m[pos] )
+    return sorted( src_table.items(), key = lambda m: ( m[pos], m[1 - pos] ) )
 
 def translate( text, conv_table ):
     i = 0
@@ -229,7 +232,7 @@ def manualWordsTable( path, conv_table, reconv_table ):
     reconv_table = {}
     wordlist = [line.split( '#' )[0].strip() for line in fp]
     wordlist = list( set( wordlist ) )
-    wordlist.sort( key = len, reverse = True )
+    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
     while wordlist:
         word = wordlist.pop()
         new_word = translate( word, conv_table )
@@ -241,7 +244,7 @@ def manualWordsTable( path, conv_table, reconv_table ):
 
 def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
     wordlist = list( src_wordlist )
-    wordlist.sort( key = len, reverse = True )
+    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
     word_conv_table = {}
     word_reconv_table = {}
     conv_table = char_conv_table.copy()
@@ -276,7 +279,7 @@ def PHPArray( table ):
 def main():
     #Get Unihan.zip:
     url = 'http://www.unicode.org/Public/%s/ucd/Unihan.zip' % UNIHAN_VER
-    han_dest = 'Unihan.zip'
+    han_dest = 'Unihan-%s.zip' % UNIHAN_VER
     download( url, han_dest )
     
     # Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
index da75c44..b686f3d 100644 (file)
@@ -59,7 +59,7 @@ U+05446呆|U+05446呆|U+07343獃|
 U+054B8咸|U+054B8咸|U+09E79鹹|
 U+054C4哄|U+054C4哄|U+09B28鬨|
 U+0556E啮|U+09F67齧|U+056D3囓|U+05699嚙|
-U+05582喂|U+05582喂|U+09935餵|
+U+05582喂|U+09935餵|U+05582喂|
 U+056DE回|U+056DE回|U+08FF4迴|
 U+056E2团|U+05718團|U+07CF0糰|
 U+056F0困|U+056F0困|U+0774F睏|
index 3266168..58686d8 100644 (file)
@@ -7,4 +7,6 @@
 桿
 錶
 蘋
-詑
\ No newline at end of file
+詑
+堖
+嶴
\ No newline at end of file
index 3b14982..431a9fb 100644 (file)
 字乾生
 乾神
 乾西
+乾东
 象乾
 陈遇乾
 曾运乾
 孙乾
 乾潭
 乾贵士
+承乾
+乾生元
 於乎
 於戏
 魏徵
 於氏
 於夫罗
 於梨华
-卷舌
 樊於期
 於菟
 於潜县
 於哲
 於除鞬
 於志贺
-覆
+覆
 五箇山
 麽麽
 幺厮
 石碁
 碁圣
 暗闇
+闇公
+山崎闇斋
 繙㠾
 惏慄
 惏悷
 目劄
-橡椀
 谢肇淛
 朱淛
 諲譔
 庆馀
 馀庆
 子馀
-行馀
+行馀
 王馀鱼
-馀年无多
\ No newline at end of file
+傒倖
+倖田
+倖一郎
+兒宽
+穀旦
+不穀
+穀水
+岳讬
+硕讬
+讬庸
+讬恩多
+博和讬
+讬麻
+饱讬
+蔡絛
\ No newline at end of file
index b4dd3e0..0516daa 100644 (file)
@@ -26,5 +26,6 @@
 硷淡
 悽恻
 鲇鱼
-和尚撞一天钟
-余
\ No newline at end of file
+钟
+余
+老么
\ No newline at end of file
index 09e1415..7c26621 100644 (file)
@@ -18,7 +18,7 @@ U+08600蘀|U+0841A萚|
 U+08AE1諡|U+08C25谥|
 U+09746靆|U+053C7叇|
 U+09749靉|U+053C6叆|
-U+09A44驄|U+29A02𩨂|
+U+09A44驄|U+09AA2骢|
 U+09C1B鰛|U+09CC1鳁|
 U+09EB3麳|U+2A38C𪎌|
 U+295E1𩗡|U+29667𩙧|
index a678ac9..3b5f3dd 100644 (file)
@@ -58,6 +58,7 @@
 學姊 学姐
 乾姊 干姐
 澈底 彻底
+卯足 铆足
 逕庭 径庭
 逕到 径到
 逕取 径取
 帳外 账外
 帳務 账务
 螢光棒      荧光棒
-辭彙 词汇
 著業 着业
 著絲 着丝
 著麼 着么
 繫著 系着
 颳著 刮着
 鬥著 斗着
+縱著 纵着
+伏著 伏着
+視著 视着
+視著名      视著名
+蓋著 盖着
+蓋著名      盖著名
+蓋著稱      盖著称
+蓋著作      盖著作
+覆蓋著      覆盖着 #勿删此条
 象徵著      象征着
 象徵著名   象征著名
 三十六著   三十六着
 晶片 芯片
 晶元 芯片
 片語 词组
+隻字片語   只字片语
+隻言片語   只言片语
 軟碟機      软驱
 快閃記憶體        闪存
 滑鼠 鼠标
 行動電話   移动电话
 流動電話   移动电话
 數據機      调制解调器
-烏茲別克   乌兹别克斯坦
 葉門 也门
 貝里斯      伯利兹
 維德角      佛得角
 厄瓜多      厄瓜多尔
 厄利垂亞   厄立特里亚
 吉布地      吉布提
-哈薩克      哈萨克斯坦
 哥斯大黎加        哥斯达黎加
 吐瓦魯      图瓦卢
-土庫曼      土库曼斯坦
 聖露西亞   圣卢西亚
 聖吉斯納域斯     圣基茨和尼维斯
 聖克里斯多福及尼維斯 圣基茨和尼维斯
 衣索匹亞   埃塞俄比亚
 衣索比亞   埃塞俄比亚
 吉里巴斯   基里巴斯
-塔吉克      塔吉克斯坦
-塔吉克斯坦        塔吉克斯坦
 塞拉利昂   塞拉利昂
 塞普勒斯   塞浦路斯
 塞席爾      塞舌尔
 象牙海岸   科特迪瓦
 突尼西亞   突尼斯
 寮國 老挝
+貢寮國      贡寮国
 蘇利南      苏里南
 莫三比克   莫桑比克
 賴索托      莱索托
 螢屏 荧屏
 解像度      分辨率
 IP位址       IP地址
-IP 位址      IP 地址
 程式設計師        程序员
 公尺 米
 公升 升
@@ -2608,7 +2614,6 @@ A型肝炎        甲型肝炎
 金氏世界紀錄     吉尼斯世界纪录
 祖雲達斯   尤文图斯
 若且唯若   当且仅当
-山葉 雅马哈
 複製人      克隆人
 白朗寧      勃朗宁
 形上學      形而上学
@@ -2659,7 +2664,7 @@ A型肝炎        甲型肝炎
 共和联邦   英联邦
 阿布達比   阿布扎比
 蓋曼群島   开曼群岛
-柴契爾      撒切尔       
+柴契爾      撒切尔
 戴卓爾      撒切尔
 凱薩琳      凯瑟琳
 嘉芙蓮      凯瑟琳
@@ -2706,4 +2711,11 @@ A型肝炎       甲型肝炎
 翁山蘇姬   昂山素季
 昂山素姬   昂山素季
 西洋棋      囯际象棋
-私隱 隐私
\ No newline at end of file
+私隱 隐私
+格林美獎   格莱美奖
+葛萊美獎   格莱美奖
+史丹福      斯坦福
+賈伯斯      乔布斯
+波里活      宝莱坞
+庫德族      库尔德族
+庫德人      库尔德人
index c31d232..f765873 100644 (file)
@@ -19,7 +19,9 @@
 写字台      寫字枱
 工作台      工作枱
 弹子台      彈子枱
+上台面      上枱面
 台面上      枱面上
+台面化      枱面化
 柜台 櫃枱
 球台 球枱
 赌台 賭枱
@@ -35,7 +37,7 @@
 发布 發佈
 發布 發佈
 秀发布      秀發佈
-并发布      並發佈       
+并发布      並發佈
 分布 分佈
 宣布 宣佈
 公布 公佈
 袖里 袖裏
 被里 被裏
 里勾外连   裏勾外連
-里手 裏手
+行家里手   行家裏手
 里海 裏海
 里屋 裏屋
 里层 裏層
 话里有话   話裏有話
 车库里      車庫裏
 车站里      車站裏
+网站里      網站裏
 车里 車裏
 车里雅宾斯克     車里雅賓斯克
 这里 這裏
 山里有      山裏有
 棉里 棉裏
 语里 語裏
+言里 言裏
+境里 境裏
 方法里      方法裏
 语法里      語法裏
 看法里      看法裏
 宪法里      憲法裏
 用法里      用法裏
 法里,      法裏,
+框里 框裏
+碗里 碗裏
+电梯里      電梯裏
 苑裡 苑裡
 霄裡 霄裡
 岸裡 岸裡
 放著名      放著名
 放著稱      放著稱
 放著称      放著稱
+縱著 縱着
+伏著 伏着
+視著 視着
+視著名      視著名
+蓋著 蓋着
+蓋著名      蓋著名
+蓋著稱      蓋著稱
+蓋著作      蓋著作
+覆蓋著      覆蓋着
 三十六著   三十六着
 走為上著   走為上着
 鬧著 鬧着
 萬那杜      瓦努阿圖
 葛摩 科摩羅
 寮國 老撾
+貢寮國      貢寮國
 肯尼亚      肯雅
 莫三比克   莫桑比克
 賴索托      萊索托
 莱特湾      雷伊泰灣
 萊特灣      雷伊泰灣
 蘭卡威      浮羅交怡
-吉尔吉斯斯坦     吉爾吉斯
 撒马尔罕   撒馬爾罕
 伊斯蘭瑪巴德     伊斯蘭堡
 喀拉蚩      卡拉奇
@@ -2930,7 +2947,6 @@ C型肝炎        丙型肝炎
 晶体管      電晶體
 源代码      原始碼
 IP地址       IP位址
-IP 地址      IP 位址
 屏幕 螢幕
 荧屏 螢屏
 版权信息   版權資訊
@@ -2951,7 +2967,6 @@ IP 地址 IP 位址
 泰坦尼克号        鐵達尼號
 自行火炮   自走炮
 冰激凌      雪糕
-奥斯曼      鄂圖曼
 里氏0        黎克特制0
 里氏1        黎克特制1
 里氏2        黎克特制2
@@ -3041,4 +3056,12 @@ IP 地址        IP 位址
 西洋棋      國際象棋
 隐私 私隱
 隱私 私隱
-硅藻 硅藻
\ No newline at end of file
+硅藻 硅藻
+格莱美奖   格林美獎
+葛萊美獎   格林美獎
+斯坦福      史丹福
+賈伯斯      喬布斯
+宝莱坞      波里活
+寶萊塢      波里活
+庫德族      库爾德族
+庫德人      库爾德人
index b857e5f..1956391 100644 (file)
@@ -57,9 +57,9 @@
 男性为乾   男性为乾
 男为乾      男为乾
 阳为乾      阳为乾
\94·æ\80§ç\88²乾   男性为乾
\94·ç\88²乾      男为乾
\99½ç\88²乾      阳为乾
\94·æ\80§ç\82º乾   男性为乾
\94·ç\82º乾      男为乾
\99½ç\82º乾      阳为乾
 乾一组      乾一组
 乾一坛      乾一坛
 陈乾生      陈乾生
 孙乾 孙乾
 陈遇乾      陈遇乾
 曾运乾      曾运乾
-象乾 象乾
 乾贵士      乾贵士
+乾东 乾东
 柳诒徵      柳诒徵
 於夫罗      於夫罗
 於梨华      於梨华
-於潜县      於潜县
+於潜 於潜
 於志贺      於志贺
 憑藉 凭借
 藉端 借端
 么篇 幺篇
 么謙 幺谦
 六么 六幺
+老么 老幺
+么正 幺正
+么女 幺女
+么九 幺九
+么子 幺子
 这么 这么
+那么 那么
+什么 什么
+怎么 怎么
+多么 多么
 乾乾淨淨   干干净净
 乾乾脆脆   干干脆脆
 肉乾乾      肉干干
 獨鍾 独钟
 鍾靈 钟灵
 龍鍾 龙钟
-鍾山 钟山
-一鍾 一钟
-千鍾 千钟
 薰心 熏心
 薰習 熏习
 薰陶 熏陶
 麴黴 曲霉
 造麴 造曲
 大麴 大曲
-黃麴毒素   黄曲毒素
\ No newline at end of file
+黃麴毒素   黄曲毒素
+硃砂 朱砂
+硃紅 朱红
+硃色 朱色
+銀硃 银朱
+遶境 绕境
+侷促 局促
+侷限 局限
+馬鞌 马鞍
+觔斗 斤斗
\ No newline at end of file
index 14f7eae..b0be071 100644 (file)
 钚    鈽
 硅    矽
 煙草 菸草
+烟草 菸草
 煙蒂 菸蒂
+烟蒂 菸蒂
 煙斗 菸斗
+烟斗 菸斗
 煙鬼 菸鬼
+烟鬼 菸鬼
 煙灰 菸灰
+烟灰 菸灰
 煙具 菸具
+烟具 菸具
 煙民 菸民
+烟民 菸民
 煙農 菸農
+烟农 菸農
 煙絲 菸絲
+烟丝 菸絲
 煙頭 菸頭
+烟头 菸頭
 煙葉 菸葉
+烟叶 菸葉
 煙癮 菸癮
+烟瘾 菸癮
 煙嘴 菸嘴
+烟嘴 菸嘴
 煙酒 菸酒
+烟酒 菸酒
 煙袋 菸袋
+烟袋 菸袋
 煙品 菸品
+烟品 菸品
 煙鹼 菸鹼
+烟碱 菸鹼
 煙捲 菸捲
+烟卷 菸捲
 香煙 香菸
+香烟 香菸
 捲煙 捲菸
+卷烟 捲菸
 旱煙 旱菸
+旱烟 旱菸
 烤煙 烤菸
+烤烟 烤菸
 禁煙 禁菸
+禁烟 禁菸
 戒煙 戒菸
+戒烟 戒菸
 拒煙 拒菸
+拒烟 拒菸
 紙煙 紙菸
+纸烟 紙菸
 抽煙 抽菸
+抽烟 抽菸
 吸煙 吸菸
+吸烟 吸菸
 反煙 反菸
+反烟 反菸
 私煙 私菸
+私烟 私菸
 點煙 點菸
+点烟 點菸
 洋煙 洋菸
+洋烟 洋菸
 二手煙      二手菸
+二手烟      二手菸
 電子煙      電子菸
+电子烟      電子菸
 呂宋煙      呂宋菸
+吕宋烟      呂宋菸
 雪茄煙      雪茄菸
+雪茄烟      雪茄菸
 無煙日      無菸日
+无烟日      無菸日
 無煙環境   無菸環境
+无烟环境   無菸環境
 榴莲 榴槤
 榴蓮 榴槤
+铆足 卯足
 霉素 黴素
 想象 想像
 迭代 疊代
 斗着 鬥著
 徵狀 症狀
 系数 係數
+汇编 彙編
+划着船      划著船
+划着竹筏   划著竹筏
+划着独木舟        划著獨木舟
 缺省 預設
 以太网      乙太網
 光盘 光碟
 调制解调器        數據機
 調制解調器        數據機
 短信 簡訊
-乌兹别克斯坦     烏茲別克
 乍得 查德
 也门 葉門
 也門 葉門
 厄立特里亞        厄利垂亞
 吉布提      吉布地
 吉布堤      吉布地
-哈萨克斯坦        哈薩克
 哥斯达黎加        哥斯大黎加
 哥斯達黎加        哥斯大黎加
 图瓦卢      吐瓦魯
 圖瓦盧      吐瓦魯
-土库曼斯坦        土庫曼
 圣卢西亚   聖露西亞
 聖盧西亞   聖露西亞
 圣基茨和尼维斯  聖克里斯多福及尼維斯
 埃塞俄比亚        衣索比亞
 埃塞俄比亞        衣索比亞
 基里巴斯   吉里巴斯
-塔吉克斯坦        塔吉克
 塞拉利昂   獅子山
 塞浦路斯   塞普勒斯
 塞舌尔      塞席爾
 莱特湾      雷伊泰灣
 萊特灣      雷伊泰灣
 耶加達      雅加達
-吉尔吉斯斯坦     吉爾吉斯
 伊斯兰堡   伊斯蘭瑪巴德
 伊斯蘭堡   伊斯蘭瑪巴德
 卡拉奇      喀拉蚩
 晶體管      電晶體
 晶体管      電晶體
 IP地址       IP位址
-IP 地址      IP 位址
 解像度      解析度
 屏幕 螢幕
 荧屏 螢屏
@@ -614,7 +651,6 @@ IP 地址   IP 位址
 沙律 沙拉
 忌廉 奶油
 味美思      苦艾酒
-奥斯曼      鄂圖曼
 埃博拉      伊波拉
 克隆人      複製人
 荧光 螢光
@@ -672,7 +708,7 @@ IP 地址   IP 位址
 自由泳      自由式
 机床 工具機
 機床 工具機
-空气质量   空氣品質    
+空气质量   空氣品質
 空氣質素   空氣品質
 俯卧撑      伏地挺身
 掌上壓      伏地挺身
@@ -701,4 +737,10 @@ IP 地址  IP 位址
 囯际象棋   西洋棋
 國際象棋   西洋棋
 私隱 隱私
-硅藻 硅藻
\ No newline at end of file
+硅藻 硅藻
+格林美獎   葛萊美獎
+格莱美奖   葛萊美獎
+乔布斯      賈伯斯
+波里活      寶萊塢
+库尔德族   庫德族
+库尔德人   庫德人
index 7fc60c7..a82dd1e 100644 (file)
@@ -2,14 +2,24 @@
 “    「
 ‘    『
 ’    』
-’s   ’s 
+’s   ’s
 手塚治虫   手塚治虫
 無言不仇   無言不讎
 視如寇仇   視如寇讎
 往日無仇   往日無讎
 近日無仇   近日無讎
 李連杰      李連杰
-周杰倫      周杰倫
+杰倫 杰倫
+杰威爾      杰威爾
+黃詩杰      黃詩杰
+陳士杰      陳士杰
+林杰樑      林杰樑
+許聖杰      許聖杰
+張杰 張杰
+孫杰 孫杰
+陳杰 陳杰
+黃杰 黃杰
+謝杰 謝杰
 寶曆 寶曆
 涂謹申      涂謹申
 涂鴻欽      涂鴻欽
 于明濤      于明濤
 于根偉      于根偉
 于樹潔      于樹潔
-于正昇      于正昇
 于漢超      于漢超
 于洪區      于洪區
 于湘蘭      于湘蘭
 余三勝      余三勝
 簡筑翎      簡筑翎
 楊雅筑      楊雅筑
-杰威爾音樂        杰威爾音樂
 尸羅精舍   尸羅精舍
 騰格里      騰格里
 村里長      村里長
 進制 進制
 模范三軍   模范三軍
-黃詩杰      黃詩杰
 陳冲 陳冲
 劉佳怜      劉佳怜
 范賢惠      范賢惠
 苹果 蘋果
 苹果干      蘋果乾
 后庄 后庄
+後庄 後庄
 龜山庄      龜山庄
 寶山庄      寶山庄
 員山庄      員山庄
 鮮于樞      鮮于樞
 鳳凰于飛   鳳凰于飛
 賦范 賦范
-陳士杰      陳士杰
-林杰樑      林杰樑
 茅于軾      茅于軾
 陳有后      陳有后
 天神之后   天神之后
 划動 划動
 划得來      划得來
 划著 划著
+划著 劃著名
 划進 划進
 划過 划過
 划龍舟      划龍舟
 么弟 么弟
 六么 六么
 么雞 么雞
+么正 么正
+么女 么女
+么九 么九
+么子 么子
+么半 么半
 義联 義联
 杠轂 杠轂
 局促 侷促
 万余 萬餘
 亿余 億餘
 兆余 兆餘
+仅余 僅餘
 0余   0餘
 1余   1餘
 2余   2餘
 7余   7餘
 8余   8餘
 9余   9餘
+带余 帶餘
+余干 餘干
+余江 餘江
 于余曲折   于餘曲折
 尸居余气   尸居餘氣
 余光生      余光生
 曲钱 麴錢
 曲车 麴車
 鼠曲草      鼠麴草
-大曲酒      大麴酒
-泸州大曲   瀘州大麯 #商標名
-洋河大曲   洋河大麴
-双沟大曲   雙溝大麯 #商標名
\ No newline at end of file
+曲酒 麯酒
+泸州大曲   瀘州大麯  #商標名
+洋河大曲   洋河大麯
+沟大曲      溝大麯
+朱砂 硃砂
+银朱 銀硃
+喲喂 喲喂
+鳥栖 鳥栖
+澄江县      澂江縣 #以下為含異體字地名
+横峰县      橫峯縣
+鹤峰县      鶴峯縣
+五峰县      五峯縣
+兰溪市      蘭谿市
+金溪县      金谿縣
+竹溪县      竹谿縣
+辰溪县      辰谿縣
+松溪县      松谿縣
+慈溪 慈谿
+浚州 濬州
+浚县 濬縣
+穆棱 穆稜
+绥棱 綏稜
+丹棱 丹稜
+仙游 仙遊
+麟游 麟遊
+乐游原      樂遊原
+托克逊      託克遜
+托里县      託里縣
+沾化 霑化
+沾益 霑益
+岫岩 岫巖
+黄岩县      黃巖縣
+黄岩区      黃巖區
+北仑河      北崙河
+昆嵛 崑嵛
+昆承湖      崑承湖
+灵昆 靈崑
+龙岩 龍巖
+扑冬 撲鼕
+冬冬鼓      鼕鼕鼓
index f76a949..5a0c6c3 100644 (file)
@@ -1,4 +1,3 @@
-U+0347A㑺|U+04FCA俊|
 U+034BA㒺|U+07F54罔|
 U+034C2㓂|U+05BC7寇|
 U+03541㕁|U+05374却|
@@ -15,8 +14,6 @@ U+0384C㡌|U+05E3D帽|
 U+03898㢘|U+05EC9廉|
 U+03919㤙|U+06069恩|
 U+03966㥦|U+060EC惬|
-U+0396B㥫|U+060C7惇|
-U+039F1㧱|U+062FF拿|
 U+03A17㨗|U+06377捷|
 U+03A2A㨪|U+06643晃|
 U+03A3F㨿|U+0636E据|
@@ -61,7 +58,6 @@ U+04EB7亷|U+05EC9廉|
 U+04EBE亾|U+04EA1亡|
 U+04F48佈|U+05E03布|
 U+04F54佔|U+05360占|
-U+04FB7侷|U+05C40局|
 U+04FFB俻|U+05907备|
 U+05010倐|U+0500F倏|
 U+05016倖|U+05E78幸|
@@ -138,7 +134,6 @@ U+056D9囙|U+056E0因|
 U+05705圅|U+051FD函|
 U+0577F坿|U+09644附|
 U+0579C垜|U+0579B垛|
-U+0585A塚|U+051A2冢|
 U+0585F塟|U+0846C葬|
 U+05872塲|U+0573A场|
 U+05896墖|U+05854塔|
@@ -227,7 +222,7 @@ U+0617C慼|U+0621A戚|
 U+0617D慽|U+0621A戚|
 U+0617E慾|U+06B32欲|
 U+06187憇|U+061A9憩|
-U+061DE懞|U+08499蒙|
+U+061DE懞|U+061DE懞|U+08499蒙|
 U+0621E戞|U+0621B戛|
 U+0622F戯|U+0620F戏|
 U+06239戹|U+05384厄|
@@ -275,7 +270,6 @@ U+0671E朞|U+0671F期|
 U+06722朢|U+0671B望|
 U+0672E朮|U+0672F术|
 U+06736朶|U+06735朵|
-U+06792枒|U+04E2B桠|
 U+067B1枱|U+053F0台|
 U+067FA柺|U+062D0拐|
 U+067FB査|U+067E5查|
@@ -287,8 +281,6 @@ U+06852桒|U+06851桑|
 U+0686E桮|U+0676F杯|
 U+0687A桺|U+067F3柳|
 U+068CA棊|U+068CB棋|
-U+06900椀|U+07897碗|
-U+06909椉|U+04E58乘|
 U+06917椗|U+07887碇|
 U+06936椶|U+068D5棕|
 U+06937椷|U+07F04缄|
@@ -324,7 +316,6 @@ U+06DDB淛|U+06D59浙|
 U+06DE8淨|U+051C0净|
 U+06DE9淩|U+051CC凌|
 U+06E67湧|U+06D8C涌|
-U+06E7B湻|U+06DF3淳|
 U+06E7C湼|U+06D85涅|
 U+06EBC溼|U+06E7F湿|
 U+06ED9滙|U+06C47汇|
@@ -417,7 +408,6 @@ U+077C1矁|U+07785瞅|
 U+077C7矇|U+08499蒙|U+077C7矇|
 U+077D9矙|U+077B0瞰|
 U+07832砲|U+070AE炮|
-U+07843硃|U+06731朱|
 U+07881碁|U+068CB棋|
 U+078AA碪|U+07827砧|
 U+078DF磟|U+0788C碌|
@@ -446,7 +436,7 @@ U+07AE2竢|U+04FDF俟|
 U+07AEA竪|U+07AD6竖|
 U+07B5E筞|U+07B56策|
 U+07B69筩|U+07B52筒|
-U+07B6F筯|U+07BB8箸| 
+U+07B6F筯|U+07BB8箸|
 U+07B87箇|U+04E2A个|
 U+07B92箒|U+05E1A帚|
 U+07BA0箠|U+068F0棰|
@@ -567,7 +557,6 @@ U+08842衂|U+08844衄|
 U+08846衆|U+04F17众|
 U+08847衇|U+08109脉|
 U+0884A衊|U+08511蔑|
-U+08856衖|U+05F04弄|
 U+0885E衞|U+0536B卫|
 U+0887A衺|U+090AA邪|
 U+0889F袟|U+05E19帙|
@@ -584,7 +573,6 @@ U+08988覈|U+06838核|
 U+0898A覊|U+07F81羁|
 U+08994覔|U+089C5觅|
 U+089A9覩|U+07779睹|
-U+089D4觔|U+065A4斤|
 U+089DD觝|U+062B5抵|
 U+08A17託|U+06258托|U+08BAC讬|
 U+08A3C証|U+08BC1证|
@@ -649,7 +637,6 @@ U+09049遉|U+04FA6侦|
 U+0904A遊|U+06E38游|
 U+09061遡|U+06EAF溯|
 U+0906F遯|U+09041遁|
-U+09076遶|U+07ED5绕|
 U+09156酖|U+09E29鸩|
 U+09167酧|U+0916C酬|
 U+09183醃|U+0814C腌|
@@ -711,7 +698,6 @@ U+096A3隣|U+090BB邻|
 U+096B7隷|U+096B6隶|
 U+0976D靭|U+097E7韧|
 U+09771靱|U+097E7韧|
-U+0978C鞌|U+0978D鞍|
 U+097A6鞦|U+079CB秋|U+097A7鞧|
 U+097B5鞵|U+0978B鞋|
 U+097BE鞾|U+09774靴|
@@ -734,6 +720,7 @@ U+098F1飱|U+098E7飧|
 U+09901餁|U+0996A饪|
 U+09908餈|U+07CCD糍|
 U+09918餘|U+09980馀|U+04F59余|
+U+09935餵|U+05582喂|
 U+09939餹|U+07CD6糖|
 U+0993B餻|U+07CD5糕|
 U+0993D餽|U+09988馈|
@@ -742,22 +729,18 @@ U+09951饑|U+09965饥|
 U+0995D饝|U+0998D馍|
 U+099C8駈|U+09A71驱|
 U+099E1駡|U+09A82骂|
-U+099EE駮|U+09A73驳|
 U+09A10騐|U+09A8C验|
 U+09A23騣|U+09B03鬃|
 U+09A58驘|U+09AA1骡|
 U+09ABD骽|U+0817F腿|
 U+09ABE骾|U+09CA0鲠|
 U+09AC8髈|U+08180膀|
-U+09AE3髣|U+04EFF仿|
 U+09AE5髥|U+09AEF髯|
-U+09AF4髴|U+04F5B佛|
 U+09B00鬀|U+05243剃|
 U+09B09鬉|U+09B03鬃|
 U+09B26鬦|U+06597斗|
 U+09B28鬨|U+054C4哄|
 U+09B2A鬪|U+06597斗|
-U+09B2D鬭|U+06597斗|
 U+09B30鬰|U+090C1郁|
 U+09B8E鮎|U+09C87鲇|
 U+09B9D鮝|U+09C9E鲞|
@@ -786,47 +769,25 @@ U+09EF4黴|U+09709霉|
 U+09F03鼃|U+086D9蛙|
 U+09F07鼇|U+09CCC鳌|
 U+09F08鼈|U+09CD6鳖|
-U+09F15鼕|U+051AC冬|
+U+09F15鼕|U+0549A咚|
 U+09F63齣|U+051FA出|
 U+09F67齧|U+0556E啮|
 U+09F69齩|U+054AC咬|
-U+201EE𠇮|U+0547D命|
-U+20302𠌂|U+04F1E伞|
 U+20542𠕂|U+0518D再|
 U+20545𠕅|U+0518D再|
-U+20587𠖇|U+051A5冥|
 U+207B0𠞰|U+0527F剿|
-U+20ABE𠪾|U+05386历|
-U+20D1F𠴟|U+054A9咩|
-U+20EF3𠻳|U+055FD嗽|
-U+21428𡐨|U+091CE野|
 U+21681𡚁|U+05F0A弊|
-U+21A18𡨘|U+051A4冤|
 U+21A25𡨥|U+05BC7寇|
-U+21B36𡬶|U+05BFB寻|
 U+21ED5𡻕|U+05C81岁|
-U+22B38𢬸|U+062EC括|
-U+22B4F𢭏|U+06363捣|
-U+22BA5𢮥|U+064CD操|
-U+22DEC𢷬|U+06363捣|
 U+2365C𣙜|U+069B7榷|
 U+242EE𤋮|U+07199熙|
 U+24A0F𤨏|U+07410琐|
-U+24C1C𤰜|U+04EA9亩|
 U+24C48𤱈|U+04EA9亩|
-U+24C4A𤱊|U+07559留|
 U+24EA5𤺥|U+07629瘩|
-U+25128𥄨|U+07785瞅|
-U+25997𥦗|U+07A97窗|
-U+25CBB𥲻|U+07E82纂|
-U+260B3𦂳|U+07D27紧|
-U+260C2𦃂|U+07D27紧|
-U+26246𦉆|U+078B4碴|
 U+262B1𦊱|U+06302挂|
 U+26351𦍑|U+07F8C羌|
 U+26548𦕈|U+07707眇|
-U+26A99𦪙|U+0447D䑽|
 U+26D4F𦵏|U+0846C葬|
 U+28F7B𨽻|U+096B6隶|
 U+294D0𩓐|U+08116脖|
-U+295D7𩗗|U+098D3飓|
\ No newline at end of file
+U+295D7𩗗|U+098D3飓|
index 15192ea..9c81a80 100644 (file)
@@ -11,4 +11,6 @@
 幺
 苹
 厘
-𫍟
\ No newline at end of file
+𫍟
+垴
+岙
\ No newline at end of file
index 4d313b4..64e41b1 100644 (file)
 複流
 反複製
 複對數
+複分解
+複合材
+複合物
+複合體
+複合制
+複合式
+複合弓
+複合函數
 撥穀
 扁擬穀盜蟲
 不穀
 脫穀機
 年穀
 礱穀機
-孤寡不穀
 穀米
 穀旦
 穀圭
 南迴鐵路
 北迴線
 北迴鐵路
-文匯報
-河流匯集
-品彙
-博彙
 滙豐
 伙頭
-方几
 伏几
 高几
 雪窗螢几
 灕然
 澤滲灕而下降
 裏勾外連
-裏手
 水里溪
 二里頭
 年歷史
 辣麵
 肉麵
 燴麵
-雲吞麵
+蝦麵
+雲吞
+一碗麵
+吃碗麵
 冷面相
 糞穢衊面
 僕僕
 瀋河
 瀋水
 瀋州
+瀋北
+瀋吉
 瀋山線
-瀋吉線
-墨沈
+瀋山鐵路
 瀋海鐵路
+瀋丹線
+瀋丹鐵路
+瀋丹客運
+瀋大線
+瀋大鐵路
+瀋大高速
+秦瀋客運
 遼瀋
+京瀋
 胜肽
 胜鍵
 雙胜類
 骨罈
 菜罈
 罈騞
-餵驢
-剪牡丹喂牛
 鹹粥
 鹹食
 鹹潟
 龍眼乾
 乾乾淨淨
 乾柴烈火
-乾乾兒的
 桑乾
 撈乾
 搭乾鋪
 幹事
 幹什麼
 幹細胞
-頭兒幹
 配水幹管
-繐幃飄井幹
-站乾岸兒
-秋陰入井幹
-沒梢幹
+口燥唇乾
+舌乾唇焦
+不食乾腊
+不乾不淨
+乾重
+蒸乾
+乾物
+乾食
+乾鍋
 楨幹
-據榦而窺井底
-井榦摧敗
-杰特
+新幹縣
+誰幹的
+得力幹將
+黑幹將
+的幹將
 李連杰
-周杰
+周杰
 杰倫
-姜文杰
+文杰
+杰威爾
+黃詩杰
+何杰
+狄志杰
+伊適杰
+張杰
+孫杰
+胡杰
+陳杰
+黃杰
+謝杰
+正杰
+柳斌杰
 稜鏡
 稜角
 稜台
 筑邦
 筑陽
 南筑
+悲筑
 批准的
 核准的
 為準
 舊錶
 台鐘
 鐘響
+船鐘
+電波鐘
+石鐘
+自由鐘
+鐘螺
+鐘花
 計時錶
 防水錶
 顯示表格
 遊牧
 遊蕩
 遊刃
+遊美學務
 黑奴籲天錄
 林郁方
 讚歌
 爭奇鬥豔
 使其鬥
 鬥地主
+鈎心鬥角
+鬥劍
+激鬥
+政鬥
+鬥獸
+鬥龍
 石樑
 木樑
 藏歷史
 頁面
-方面
 面條目
 大讚
 唄讚
 詩讚
 賞讚
 讚唄
+點讚
 飛紮
 紮裹
 紮腳
 徵吏
 徵令
 本徵
-船鐘
 黃鈺筑
 香山庄
 當準
 趙治勳
 殭屍
 有栖川
+栗栖溪
+鳥栖市
 兇惡
 兇狠
 兇猛
 鼕鼕鼓
 剷頭
 剷刈
-口燥唇乾
-舌乾唇焦
 花菴詞選
 渾箇
 箇中原因
 箇中好手
 箇中強手
 箇中滋味
-箇中奧
-箇中奧妙
+箇中奧
+箇中道理
 箇中玄機
-箇中消息
-箇中資訊
-箇中訊息
+箇中翹楚
+,箇中
+。箇中
+的箇中
 對表達
 對表現
 對表演
 之一只
 之二只
 之八九只
-也斗了膽
-事情干脆
-事都干脆
 二只得
 亦云
 人云
 以自制
-們斗了膽
-你斗了膽
 其一只
 其二只
 其八九只
 台風穩健
 穩健的台風
 台風獎
+電視台風
+足球台
+網球台
 合府上
 後面店
 向往常
 精制住
 精制服
 經有云
-給我干脆
 編制法
 能干休
 能干戈
 面店鋪
 面粉碎
 面粉紅
-面食麵
 面食飯
 顛顛仆仆
 高干擾
 黃金表
 天后宮
 一吊錢
-不食乾腊
 傳位于四太子
 儉确之教
 党懷英
 八蜡
 憑几
 南宮适
+洪适
+李适
 大蜡
 子云
 分子雲
 折子戲
 搤肮拊背
 文采郁郁
-洪适
 腊之以為餌
 腊毒
 蜡月
 宜云
 貴价
 郁郁菲菲
-不乾不淨
 生發生
 必須
 須根據
 ·范
 剋剝
+休克期
+克期間
+溫洛克期
 科尼亞克期
 馬斯垂克期
 滿拚自盡
 拚絕
 成於思
 單單於
+名單於
 積澱
 澱積
 澱北片
 范文藤
 范文虎
 范文照
-乾重
-鈎心鬥角
 全面包圍
 全面包裹
 機械系
 體系
 心理
-複分解
 鹰鵰
 天地志狼
 薴烯
 山裡有
 棉裡
 語裡
+言裡
+境裡
+境里程
+中境里
 方法裡
 語法裡
 看法裡
 憲法裡
 用法裡
 法裡,
+框裡
+碗裡
+電梯裡
+網站裡
+行家裡手
 首發
 夸脫
-誰幹的
-鐘螺
 風采
 代碼表
 編碼表
 劃入
 中庄子
 埔裏社
+手裏劍
+裏水鎮
+裏運河
 懸掛
 僱傭
 四捨六入
 莜麵
 簡筑翎
 楊雅筑
-魔杰座
-杰威爾音樂
 彭于晏
 尸羅精舍
 進制
-黃詩杰
-何杰
 劉佳怜
 于小惠
 于耘婕
 劉芸后
 謝華后
 趙惠后
+昭惠后
+周惠后
+孝惠后
 趙威后
 聖后
 陳有后
 許虬
-狄志杰
-伊適杰
 于冠華
 于雲鶴
 于忠肅集
 于天龍
 于謹
 于榮光
-電波鐘
 掛名
-啟發式
 舞后
 甄后
 郭后
 于寶軒
 于震
 於震前
\96¼é\9c\87å\90\8e
\96¼é\9c\87å¾\8c
 於震中
 固定制
 毗婆尸佛
 划艇
 划行
 划算
+划着船
+划着竹筏
+划着獨木舟
 總裁制
 仲裁制
 獨裁制
 恒生
 嚴云農
-手裏劍
 伊東怜
 衛後莊公
 並行
 併發重症
 併發模式
 併發型模式
+啟發式
+連發式
 色長髮
 頭長髮
 的長髮
+黑長髮
+留長髮
+髮披肩
+髮及腰
 後天
 學家
 游離
 功勳
 蝎虎
 磨蝎
-鬥劍
-激鬥
-政鬥
 沈海蓉
 方志恒
 古蹟
 騰衝
 沖天
 豐臺
+煙臺
 陽穀
-蒸乾
 太醜
 御製
 合併
 皮托管
 白面包青天
 天神之后
-栗栖溪
 羅馬曆
 羅馬歷史
 羅馬歷代
 自誇
 誇稱
 誇讚
-更加注
+讚嘆
 繼承制
 布穀鳥
 黎克特制
 墨瀋
 米瀋
 拾瀋
-乾物
 姦污
 託兒
 同人誌
 衝着
 確係
 乃係
-開山
+開山
 穀祿
 製衣
 巨製
 錦滷
 汤滷
 浸滷
-石鐘
-石鐘山
 花葯
 聚葯雄蕊
 遺蹟
 辦公檯
 檯面上
 上檯面
+檯面化
 牴觸
 牴牾
 角牴
 涼蓆
 灘蓆
 麻將蓆
-裏水鎮
 被廢後
 蒸製
 體徵
 被繫上
 繫上,
 繫上。
+繫舟
 亂發生
 亂發脾氣
 秀發村
 秀發現
 秀發生
 秀發起
-秀發展
\ No newline at end of file
+秀發展
+縮短發
+簡短發
+短發生
+古人有云
+昔人有云
+云敞
+喂,
+喂!
+喂喲
+喲喂
+啊喂
+呵喂
+呦喂
+水表面
+表面包
+松口鎮
+沙瑯
+琺瑯
+菜餚
\ No newline at end of file
index 4a3613b..2ff49c4 100644 (file)
 複流
 複畝珍
 起複
-餘
\ No newline at end of file
+餘
+旋乾轉坤
+乾坤
+乾卦
+乾隆
+乾掉
+讚嘆不已
+讚歎
+好乾
+加註
+幹將
+鼕
+彙報
+彙整
+彙編
+彙集
\ No newline at end of file
index 2a6f8a8..b491497 100644 (file)
@@ -85,12 +85,24 @@ class MergeMessageFileList extends Maintenance {
                                if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
                                        continue;
                                }
-                               $extfile = "{$extdir}/{$extname}/{$extname}.php";
-                               if ( file_exists( $extfile ) ) {
-                                       $mmfl['setupFiles'][] = $extfile;
-                               } else {
+                               $possibilities = array(
+                                       "$extdir/$extname/extension.json",
+                                       "$extdir/$extname/skin.json",
+                                       "$extdir/$extname/$extname.php"
+                               );
+                               $found = false;
+                               foreach ( $possibilities as $extfile ) {
+                                       if ( file_exists( $extfile ) ) {
+                                               $mmfl['setupFiles'][] = $extfile;
+                                               $found = true;
+                                               break;
+                                       }
+                               }
+
+                               if ( !$found ) {
                                        $this->hasError = true;
-                                       $this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
+                                       $this->error( "Extension {$extname} in {$extdir} lacks expected entry point: " .
+                                               "extension.json, skin.json, or {$extname}.php." );
                                }
                        }
                }
@@ -150,6 +162,7 @@ class MergeMessageFileList extends Maintenance {
 
 require_once RUN_MAINTENANCE_IF_MAIN;
 
+$queue = array();
 foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( strval( $fileName ) === '' ) {
                continue;
@@ -157,12 +170,24 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       // Include the extension to update $wgExtensionMessagesFiles
-       if ( !( include_once $fileName ) ) {
-               fwrite( STDERR, "Unable to read $fileName\n" );
-               exit( 1 );
+       // Using extension.json or skin.json
+       if ( substr( $fileName, -strlen( '.json' ) ) === '.json' ) {
+               $queue[$fileName] = 1;
+       } else {
+               require_once $fileName;
+       }
+}
+
+if ( $queue ) {
+       $registry = new ExtensionRegistry();
+       $data = $registry->readFromQueue( $queue );
+       foreach ( array( 'wgExtensionMessagesFiles', 'wgMessagesDirs' ) as $var ) {
+               if ( isset( $data['globals'][$var] ) ) {
+                       $GLOBALS[$var] = array_merge( $data['globals'][$var], $GLOBALS[$var] );
+               }
        }
 }
+
 fwrite( STDERR, "\n" );
 $s =
        "<" . "?php\n" .
diff --git a/maintenance/populateBloomCache.php b/maintenance/populateBloomCache.php
deleted file mode 100644 (file)
index 40ad5fc..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Script to populate a bloom filter with a BloomFilter* class
- *
- * @ingroup Maintenance
- */
-class PopulateBloomFilter extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->addOption( 'cache', 'Bloom cache store name', true, true );
-               $this->addOption( 'filter', 'Bloom filter name', true, true );
-               $this->addOption( 'domain', 'Bloom filter domain', true, true );
-               $this->addOption( 'delay', 'Sleep delay between batches (us)', false, true );
-               $this->mDescription = "Populate the specified bloom filter";
-       }
-
-       public function execute() {
-               $type = $this->getOption( 'filter' );
-               $domain = $this->getOption( 'domain' );
-               $bcache = BloomCache::get( $this->getOption( 'cache' ) );
-               $delay = $this->getOption( 'delay', 1e5 );
-
-               if ( !method_exists( "BloomFilter{$type}", 'merge' ) ) {
-                       $this->error( "No \"BloomFilter{$type}::merge\" method found.", 1 );
-               }
-
-               $virtualKey = "$domain:$type";
-               $status = $bcache->getStatus( $virtualKey );
-               if ( $status == false ) {
-                       $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
-               }
-
-               $startTime = microtime( true );
-               $this->output( "Current timestamp is '$startTime'.\n" );
-               $this->output( "Current filter timestamp is '{$status['asOfTime']}'.\n" );
-
-               do {
-                       $status = call_user_func_array(
-                               array( "BloomFilter{$type}", 'merge' ),
-                               array( $bcache, $domain, $virtualKey, $status )
-                       );
-                       if ( $status == false ) {
-                               $this->error( "Could not query virtual bloom filter '$virtualKey'.", 1 );
-                       }
-                       $this->output( "Filter updated to timestamp '{$status['asOfTime']}'.\n" );
-                       usleep( $delay );
-               } while ( $status['asOfTime'] && $status['asOfTime'] < $startTime );
-
-               $this->output( "Done, filter $type of domain $domain reached time '$startTime'.\n" );
-       }
-}
-
-$maintClass = "PopulateBloomFilter";
-require_once RUN_MAINTENANCE_IF_MAIN;
index 3864e3c..3c5d28b 100644 (file)
@@ -52,9 +52,7 @@ class RunJobs extends Maintenance {
        }
 
        public function execute() {
-               if ( wfReadOnly() ) {
-                       $this->error( "Unable to run jobs; the wiki is in read-only mode.", 1 ); // die
-               }
+               global $wgCommandLineMode;
 
                if ( $this->hasOption( 'procs' ) ) {
                        $procs = intval( $this->getOption( 'procs' ) );
@@ -68,21 +66,29 @@ class RunJobs extends Maintenance {
                        }
                }
 
-               $json = ( $this->getOption( 'result' ) === 'json' );
+               $outputJSON = ( $this->getOption( 'result' ) === 'json' );
+
+               // Enable DBO_TRX for atomicity; JobRunner manages transactions
+               // and works well in web server mode already (@TODO: this is a hack)
+               $wgCommandLineMode = false;
 
                $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
-               if ( !$json ) {
+               if ( !$outputJSON ) {
                        $runner->setDebugHandler( array( $this, 'debugInternal' ) );
                }
+
                $response = $runner->run( array(
                        'type'     => $this->getOption( 'type', false ),
                        'maxJobs'  => $this->getOption( 'maxjobs', false ),
                        'maxTime'  => $this->getOption( 'maxtime', false ),
                        'throttle' => $this->hasOption( 'nothrottle' ) ? false : true,
                ) );
-               if ( $json ) {
+
+               if ( $outputJSON ) {
                        $this->output( FormatJson::encode( $response, true ) );
                }
+
+               $wgCommandLineMode = true;
        }
 
        /**
index 9e9ad32..a989aef 100644 (file)
@@ -58,6 +58,9 @@ class ShowJobs extends Maintenance {
                                foreach ( $queue->getAllDelayedJobs() as $job ) {
                                        $this->output( $job->toString() . " status=delayed\n" );
                                }
+                               foreach ( $queue->getAllAcquiredJobs() as $job ) {
+                                       $this->output( $job->toString() . " status=claimed\n" );
+                               }
                                foreach ( $queue->getAllAbandonedJobs() as $job ) {
                                        $this->output( $job->toString() . " status=abandoned\n" );
                                }
index bf93a23..de36d26 100644 (file)
@@ -490,7 +490,7 @@ CREATE TABLE /*_*/pagelinks (
 
 CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
 CREATE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from_namespace,pl_from);
+CREATE INDEX /*i*/pl_backlinks_namespace ON /*_*/pagelinks (pl_from_namespace,pl_namespace,pl_title,pl_from);
 
 
 --
@@ -512,7 +512,7 @@ CREATE TABLE /*_*/templatelinks (
 
 CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
 CREATE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from_namespace,tl_from);
+CREATE INDEX /*i*/tl_backlinks_namespace ON /*_*/templatelinks (tl_from_namespace,tl_namespace,tl_title,tl_from);
 
 
 --
@@ -534,7 +534,7 @@ CREATE TABLE /*_*/imagelinks (
 
 CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
 CREATE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_to,il_from_namespace,il_from);
+CREATE INDEX /*i*/il_backlinks_namespace ON /*_*/imagelinks (il_from_namespace,il_to,il_from);
 
 
 --
index 6e93011..0fd1fd8 100755 (executable)
@@ -161,7 +161,7 @@ class UpdateMediaWiki extends Maintenance {
                        wfCountDown( 5 );
                }
 
-               $time1 = new MWTimestamp();
+               $time1 = microtime( true );
 
                $shared = $this->hasOption( 'doshared' );
 
@@ -197,9 +197,10 @@ class UpdateMediaWiki extends Maintenance {
                        $updater->purgeCache();
                }
 
-               $time2 = new MWTimestamp();
-               $timeDiff = $time2->diff( $time1 );
-               $this->output( "\nDone in " . $timeDiff->format( "%i:%S" ) . ".\n" );
+               $time2 = microtime( true );
+
+               $timeDiff = $wgLang->formatTimePeriod( $time2 - $time1 );
+               $this->output( "\nDone in $timeDiff.\n" );
        }
 
        function afterFinalSetup() {
index a4dde37..874920e 100644 (file)
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './opensearch_desc.php';
index 14ef421..6d430f6 100644 (file)
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './profileinfo.php';
index f9d2eac..e2f05b6 100644 (file)
@@ -311,6 +311,7 @@ return array(
        'jquery.textSelection' => array(
                'scripts' => 'resources/src/jquery/jquery.textSelection.js',
                'dependencies' => 'jquery.client',
+               'targets' => array( 'mobile', 'desktop' ),
        ),
        'jquery.throttle-debounce' => array(
                'scripts' => 'resources/lib/jquery/jquery.ba-throttle-debounce.js',
@@ -823,6 +824,7 @@ return array(
                        'mediawiki.Title',
                        'user.tokens',
                ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api.login' => array(
                'scripts' => 'resources/src/mediawiki.api/mediawiki.api.login.js',
@@ -877,7 +879,7 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.feedback.js',
                'styles' => 'resources/src/mediawiki/mediawiki.feedback.css',
                'dependencies' => array(
-                       'mediawiki.api.edit',
+                       'mediawiki.messagePoster',
                        'mediawiki.Title',
                        'oojs-ui',
                ),
@@ -896,6 +898,7 @@ return array(
                        'feedback-error1',
                        'feedback-error2',
                        'feedback-error3',
+                       'feedback-error4',
                        'feedback-message',
                        'feedback-subject',
                        'feedback-submit',
@@ -955,6 +958,27 @@ return array(
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.messagePoster' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js',
+                       'resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js',
+               ),
+               'dependencies' => array(
+                       'oojs',
+                       'mediawiki.api',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
+       'mediawiki.messagePoster.wikitext' => array(
+               'scripts' => array(
+                       'resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js',
+               ),
+               'dependencies' => array(
+                       'mediawiki.api.edit',
+                       'mediawiki.messagePoster',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.notification' => array(
                'styles' => array(
                        'resources/src/mediawiki/mediawiki.notification.css',
@@ -1245,6 +1269,7 @@ return array(
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.language',
+                       'dom-level2-shim',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1378,6 +1403,20 @@ return array(
        'mediawiki.special.changeslist.enhanced' => array(
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ),
+       'mediawiki.special.edittags' => array(
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.edittags.js',
+               'dependencies' => array(
+                       'jquery.chosen',
+               ),
+               'messages' => array(
+                       'tags-edit-chosen-placeholder',
+                       'tags-edit-chosen-no-results',
+               ),
+       ),
+       'mediawiki.special.edittags.styles' => array(
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.edittags.css',
+               'position' => 'top',
+       ),
        'mediawiki.special.import' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.import.js',
        ),
@@ -1657,6 +1696,14 @@ return array(
                'skipFunction' => 'resources/src/es5-skip.js',
        ),
 
+       /* dom-level2-shim */
+       // IE 8
+       'dom-level2-shim' => array(
+               'scripts' => 'resources/src/polyfill-nodeTypes.js',
+               'targets' => array( 'desktop', 'mobile' ),
+               'skipFunction' => 'resources/src/dom-level2-skip.js',
+       ),
+
        /* OOjs */
        'oojs' => array(
                'scripts' => array(
index c7df768..1cfa6c4 100644 (file)
@@ -19,6 +19,7 @@
        "ooui-toolgroup-collapse": "কম দেখাও",
        "ooui-dialog-message-accept": "ঠিক আছে",
        "ooui-dialog-message-reject": "বাতিল",
+       "ooui-dialog-process-error": "কিছু একটায় ত্রুটি হয়েছে",
        "ooui-dialog-process-dismiss": "বাতিল করুন",
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
        "ooui-dialog-process-continue": "অগ্রসর হোন"
index 099b0f3..aa916af 100644 (file)
@@ -4,5 +4,6 @@
                        "ОйЛ"
                ]
        },
-       "ooui-toolbar-more": "вѧщє"
+       "ooui-toolbar-more": "вѧщє",
+       "ooui-toolgroup-expand": "вѧщє"
 }
index 1581fd8..00894e4 100644 (file)
@@ -8,5 +8,13 @@
        "ooui-outline-control-move-down": "Zapisk dele přesunyć",
        "ooui-outline-control-move-up": "Zapisk horje přesunyć",
        "ooui-outline-control-remove": "Zapisk wotstronić",
-       "ooui-toolbar-more": "Wjace"
+       "ooui-toolbar-more": "Wjace",
+       "ooui-toolgroup-expand": "Wjace",
+       "ooui-toolgroup-collapse": "Mjenje",
+       "ooui-dialog-message-accept": "W porjadku",
+       "ooui-dialog-message-reject": "Přetorhnyć",
+       "ooui-dialog-process-error": "Něšto je so nimokuliło",
+       "ooui-dialog-process-dismiss": "Schować",
+       "ooui-dialog-process-retry": "Hišće raz spytać",
+       "ooui-dialog-process-continue": "Dale"
 }
index 2a1f95e..dde49bf 100644 (file)
@@ -5,5 +5,17 @@
                        "Psubhashish",
                        "ଶିତିକଣ୍ଠ ଦାଶ"
                ]
-       }
+       },
+       "ooui-outline-control-move-down": "ବସ୍ତୁଟିକୁ ତଳକୁ ଘୁଞ୍ଚାନ୍ତୁ",
+       "ooui-outline-control-move-up": "ବସ୍ତୁଟିକୁ ଉପରକୁ ଘୁଞ୍ଚାନ୍ତୁ",
+       "ooui-outline-control-remove": "ବସ୍ତୁଟିକୁ ଲିଭାନ୍ତୁ",
+       "ooui-toolbar-more": "ଅଧିକ",
+       "ooui-toolgroup-expand": "ଅଧିକ",
+       "ooui-toolgroup-collapse": "ଅଳ୍ପ",
+       "ooui-dialog-message-accept": "ହେଉ",
+       "ooui-dialog-message-reject": "ନାକଚ",
+       "ooui-dialog-process-error": "ଅସୁବିଧାଟିଏ ଘଟିଲା",
+       "ooui-dialog-process-dismiss": "ଖାରଜ",
+       "ooui-dialog-process-retry": "ଆଉ ଥରେ ଚେଷ୍ଟା କରନ୍ତୁ",
+       "ooui-dialog-process-continue": "ଚାଲୁରଖିବେ"
 }
index b16755e..ed2f61e 100644 (file)
@@ -19,9 +19,9 @@
                        "Great Brightstar"
                ]
        },
-       "ooui-outline-control-move-down": "下移项",
-       "ooui-outline-control-move-up": "上移项",
-       "ooui-outline-control-remove": "删除项",
+       "ooui-outline-control-move-down": "项目下移",
+       "ooui-outline-control-move-up": "项目上移",
+       "ooui-outline-control-remove": "移除项目",
        "ooui-toolbar-more": "更多",
        "ooui-toolgroup-expand": "更多",
        "ooui-toolgroup-collapse": "更少",
index 019cfa5..37012b2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-bell {
        background-image: url("themes/mediawiki/images/icons/bell.png");
index c6800f5..b48bbdf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-article {
        background-image: url("themes/mediawiki/images/icons/article-ltr.png");
index fd4c009..a61f630 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-alignCentre {
        background-image: url("themes/mediawiki/images/icons/align-center.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-float-right.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/align-float-right.png");
 }
+.oo-ui-icon-find {
+       background-image: url("themes/mediawiki/images/icons/find-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/find-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/find-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/find-ltr.png");
+}
 .oo-ui-icon-insert {
        background-image: url("themes/mediawiki/images/icons/insert.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/insert.svg");
index 5bb13a8..42c2b14 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-edit {
        background-image: url("themes/mediawiki/images/icons/edit-ltr.png");
index e9edf16..4fe87ca 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-indent {
        background-image: url("themes/mediawiki/images/icons/indent-ltr.png");
index 562701a..6990522 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-bigger {
        background-image: url("themes/mediawiki/images/icons/bigger-ltr.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-a.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-a.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ar) {
        background-image: url("themes/mediawiki/images/icons/bold-arab-ain.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-ain.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-ain.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-arab-ain.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(be) {
        background-image: url("themes/mediawiki/images/icons/bold-cyrl-te.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-te.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-te.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-te.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(cs) {
        background-image: url("themes/mediawiki/images/icons/bold-b.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(en) {
        background-image: url("themes/mediawiki/images/icons/bold-b.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(he) {
        background-image: url("themes/mediawiki/images/icons/bold-b.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ml) {
        background-image: url("themes/mediawiki/images/icons/bold-b.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(pl) {
        background-image: url("themes/mediawiki/images/icons/bold-b.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(da) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(de) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(hu) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ksh) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(nn) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(no) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(sv) {
        background-image: url("themes/mediawiki/images/icons/bold-f.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(es) {
        background-image: url("themes/mediawiki/images/icons/bold-n.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(gl) {
        background-image: url("themes/mediawiki/images/icons/bold-n.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(pt) {
        background-image: url("themes/mediawiki/images/icons/bold-n.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(eu) {
        background-image: url("themes/mediawiki/images/icons/bold-l.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-l.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(fi) {
        background-image: url("themes/mediawiki/images/icons/bold-l.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-l.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(fa) {
        background-image: url("themes/mediawiki/images/icons/bold-arab-dad.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-dad.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-dad.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-arab-dad.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(fr) {
        background-image: url("themes/mediawiki/images/icons/bold-g.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-g.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(it) {
        background-image: url("themes/mediawiki/images/icons/bold-g.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-g.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(hy) {
        background-image: url("themes/mediawiki/images/icons/bold-armn-to.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-armn-to.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-armn-to.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-armn-to.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ka) {
        background-image: url("themes/mediawiki/images/icons/bold-geor-man.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-geor-man.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-geor-man.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-geor-man.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ky) {
        background-image: url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(ru) {
        background-image: url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(nl) {
        background-image: url("themes/mediawiki/images/icons/bold-v.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-v.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-v.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-v.png");
 }
+/* @noflip */
 .oo-ui-icon-bold:lang(os) {
        background-image: url("themes/mediawiki/images/icons/bold-cyrl-be.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-be.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-a.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-a.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ar) {
        background-image: url("themes/mediawiki/images/icons/italic-arab-meem.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-meem.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-meem.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-arab-meem.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(cs) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(en) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(fr) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(he) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ml) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(pl) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(pt) {
        background-image: url("themes/mediawiki/images/icons/italic-i.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(be) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(da) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(de) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(fi) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ky) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(nn) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(no) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(os) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(sv) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ru) {
        background-image: url("themes/mediawiki/images/icons/italic-k.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(es) {
        background-image: url("themes/mediawiki/images/icons/italic-c.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(gl) {
        background-image: url("themes/mediawiki/images/icons/italic-c.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(it) {
        background-image: url("themes/mediawiki/images/icons/italic-c.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(nl) {
        background-image: url("themes/mediawiki/images/icons/italic-c.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(eu) {
        background-image: url("themes/mediawiki/images/icons/italic-e.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-e.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-e.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-e.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(fa) {
        background-image: url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(hu) {
        background-image: url("themes/mediawiki/images/icons/italic-d.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-d.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-d.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-d.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(hy) {
        background-image: url("themes/mediawiki/images/icons/italic-armn-sha.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-armn-sha.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-armn-sha.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-armn-sha.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ksh) {
        background-image: url("themes/mediawiki/images/icons/italic-s.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-s.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-s.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-s.png");
 }
+/* @noflip */
 .oo-ui-icon-italic:lang(ka) {
        background-image: url("themes/mediawiki/images/icons/italic-geor-kan.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-geor-kan.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-a.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/strikethrough-a.png");
 }
+/* @noflip */
 .oo-ui-icon-strikethrough:lang(en) {
        background-image: url("themes/mediawiki/images/icons/strikethrough-s.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-s.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-s.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/strikethrough-s.png");
 }
+/* @noflip */
 .oo-ui-icon-strikethrough:lang(fi) {
        background-image: url("themes/mediawiki/images/icons/strikethrough-y.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-y.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-a.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/underline-a.png");
 }
+/* @noflip */
 .oo-ui-icon-underline:lang(en) {
        background-image: url("themes/mediawiki/images/icons/underline-u.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-u.svg");
index 5efa95a..e310e39 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-beta {
        background-image: url("themes/mediawiki/images/icons/beta.png");
index 97ff08b..76f456d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-stripeFlow {
        background-image: url("themes/mediawiki/images/icons/stripeFlow-ltr.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/stripeToC-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/stripeToC-ltr.png");
 }
+.oo-ui-icon-viewCompact {
+       background-image: url("themes/mediawiki/images/icons/viewCompact.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/viewCompact.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/viewCompact.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/viewCompact.png");
+}
+.oo-ui-icon-viewDetails {
+       background-image: url("themes/mediawiki/images/icons/viewDetails-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/viewDetails-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/viewDetails-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/viewDetails-ltr.png");
+}
+.oo-ui-icon-visionSimulator {
+       background-image: url("themes/mediawiki/images/icons/visionSimulator.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/visionSimulator.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/visionSimulator.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/visionSimulator.png");
+}
index ef4b991..2842e3b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-map {
        background-image: url("themes/mediawiki/images/icons/map-ltr.png");
index 2c34631..82df52f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-image {
        background-image: url("themes/mediawiki/images/icons/image-ltr.png");
index e80d325..6b5befd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-block {
        background-image: url("themes/mediawiki/images/icons/block.png");
index c93ead8..5161f0a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-arrowNext {
        background-image: url("themes/mediawiki/images/icons/arrow-ltr.png");
index 096ae08..2ea8adf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-userActive {
        background-image: url("themes/mediawiki/images/icons/userActive-ltr.png");
index afbb610..fbafe17 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
 .oo-ui-icon-logoCC {
        background-image: url("themes/mediawiki/images/icons/logo-cc.png");
index afef7bf..54be6b4 100644 (file)
@@ -1,19 +1,13 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
-.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%;
             -o-transition: all ease-in-out 200ms;
                transition: all ease-in-out 200ms;
 }
+.oo-ui-menuLayout-menu {
+       height: 18em;
+       width: 18em;
+}
 .oo-ui-menuLayout-content {
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
+       top: 18em;
+       left: 18em;
+       right: 18em;
+       bottom: 18em;
+}
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+       width: 0 !important;
+       height: 0 !important;
+       overflow: hidden;
+}
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+       top: 0 !important;
+       left: 0 !important;
+       right: 0 !important;
+       bottom: 0 !important;
 }
-.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+       width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+       height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+       width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+       height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 .oo-ui-toolGroup-empty {
        display: none;
 }
+.oo-ui-toolGroup .oo-ui-tool-link {
+       text-decoration: none;
+}
 .oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-position: center center;
        background-repeat: no-repeat;
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        display: block;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-iconElement-icon {
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement > .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-accel,
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement > .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
        cursor: default;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-title,
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-accel {
-       display: none;
-}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        cursor: pointer;
 }
        width: 1.5em;
        opacity: 0.8;
 }
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2.1em;
+       font-size: 0.8em;
+}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled {
        background-color: #eeeeee;
 }
        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,
index cfca47b..17ab620 100644 (file)
@@ -1,19 +1,13 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:34Z
+ * Date: 2015-04-23T00:54:33Z
  */
-.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%;
             -o-transition: all ease-in-out 200ms;
                transition: all ease-in-out 200ms;
 }
+.oo-ui-menuLayout-menu {
+       height: 18em;
+       width: 18em;
+}
 .oo-ui-menuLayout-content {
-       top: 0;
-       left: 0;
-       right: 0;
-       bottom: 0;
+       top: 18em;
+       left: 18em;
+       right: 18em;
+       bottom: 18em;
+}
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-menu {
+       width: 0 !important;
+       height: 0 !important;
+       overflow: hidden;
+}
+.oo-ui-menuLayout.oo-ui-menuLayout-hideMenu .oo-ui-menuLayout-content {
+       top: 0 !important;
+       left: 0 !important;
+       right: 0 !important;
+       bottom: 0 !important;
 }
-.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+       width: auto !important;
        left: 0;
        top: 0;
        right: 0;
 }
-.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
        right: 0 !important;
        bottom: 0 !important;
        left: 0 !important;
 }
-.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+       height: auto !important;
        top: 0;
        right: 0;
        bottom: 0;
 }
-.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
        bottom: 0 !important;
        left: 0 !important;
        top: 0 !important;
 }
-.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+       width: auto !important;
        right: 0;
        bottom: 0;
        left: 0;
 }
-.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
        left: 0 !important;
        top: 0 !important;
        right: 0 !important;
 }
-.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+       height: auto !important;
        bottom: 0;
        left: 0;
        top: 0;
 }
-.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+.oo-ui-menuLayout.oo-ui-menuLayout-showMenu.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
 .oo-ui-toolGroup-empty {
        display: none;
 }
+.oo-ui-toolGroup .oo-ui-tool-link {
+       text-decoration: none;
+}
 .oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
        background-position: center center;
        background-repeat: no-repeat;
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        display: block;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-iconElement-icon {
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement > .oo-ui-tool-link .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-accel,
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-iconElement > .oo-ui-tool-link .oo-ui-tool-title {
        display: none;
 }
 .oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
        cursor: default;
 }
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-title,
-.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-accel {
-       display: none;
-}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
        cursor: pointer;
 }
        width: 1.5em;
        opacity: 0.8;
 }
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2.1em;
+       font-size: 0.8em;
+}
 .oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled {
        background-color: #eeeeee;
 }
        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,
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr.png");
 }
+/* @noflip */
+.oo-ui-icon-help:lang(he) {
+       background-image: url("themes/mediawiki/images/icons/help-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr.png");
+}
+/* @noflip */
+.oo-ui-icon-help:lang(yi) {
+       background-image: url("themes/mediawiki/images/icons/help-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr.png");
+}
 .oo-ui-image-invert .oo-ui-icon-help,
 .oo-ui-image-invert.oo-ui-icon-help {
        background-image: url("themes/mediawiki/images/icons/help-ltr-invert.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr-invert.png");
 }
+/* @noflip */
+.oo-ui-image-invert .oo-ui-icon-help:lang(he),
+.oo-ui-image-invert.oo-ui-icon-help:lang(he) {
+       background-image: url("themes/mediawiki/images/icons/help-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr-invert.png");
+}
+/* @noflip */
+.oo-ui-image-invert .oo-ui-icon-help:lang(yi),
+.oo-ui-image-invert.oo-ui-icon-help:lang(yi) {
+       background-image: url("themes/mediawiki/images/icons/help-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr-invert.png");
+}
+.oo-ui-icon-history {
+       background-image: url("themes/mediawiki/images/icons/history.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/history.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/history.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/history.png");
+}
+.oo-ui-image-invert .oo-ui-icon-history,
+.oo-ui-image-invert.oo-ui-icon-history {
+       background-image: url("themes/mediawiki/images/icons/history-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/history-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/history-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/history-invert.png");
+}
 .oo-ui-icon-info {
        background-image: url("themes/mediawiki/images/icons/info.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/info.svg");
index 688262a..a03734a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:28Z
+ * Date: 2015-04-23T00:54:26Z
  */
 /**
  * @class
index ccedf60..1011949 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.10.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-04-03T21:01:28Z
+ * Date: 2015-04-23T00:54:26Z
  */
 ( function ( OO ) {
 
@@ -44,6 +44,39 @@ OO.ui.Keys = {
        SPACE: 32
 };
 
+/**
+ * Check if an element is focusable.
+ * Inspired from :focusable in jQueryUI v1.11.4 - 2015-04-14
+ *
+ * @param {jQuery} element Element to test
+ * @return {Boolean} [description]
+ */
+OO.ui.isFocusableElement = function ( $element ) {
+       var node = $element[0],
+               nodeName = node.nodeName.toLowerCase(),
+               // Check if the element have tabindex set
+               isInElementGroup = /^(input|select|textarea|button|object)$/.test( nodeName ),
+               // Check if the element is a link with href or if it has tabindex
+               isOtherElement = (
+                       ( nodeName === 'a' && node.href ) ||
+                       !isNaN( $element.attr( 'tabindex' ) )
+               ),
+               // Check if the element is visible
+               isVisible = (
+                       // This is quicker than calling $element.is( ':visible' )
+                       $.expr.filters.visible( node ) &&
+                       // Check that all parents are visible
+                       !$element.parents().addBack().filter( function () {
+                               return $.css( this, 'visibility' ) === 'hidden';
+                       } ).length
+               );
+
+       return (
+               ( isInElementGroup ? !node.disabled : isOtherElement ) &&
+               isVisible
+       );
+};
+
 /**
  * Get the user's language and any fallback languages.
  *
@@ -3340,13 +3373,32 @@ OO.ui.WindowManager.prototype.destroy = function () {
 };
 
 /**
+ * Errors contain a required message (either a string or jQuery selection) that is used to describe what went wrong
+ * in a {@link OO.ui.Process process}. The error's #recoverable and #warning configurations are used to customize the
+ * appearance and functionality of the error interface.
+ *
+ * The basic error interface contains a formatted error message as well as two buttons: 'Dismiss' and 'Try again' (i.e., the error
+ * is 'recoverable' by default). If the error is not recoverable, the 'Try again' button will not be rendered and the widget
+ * that initiated the failed process will be disabled.
+ *
+ * If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button, which will try the
+ * process again.
+ *
+ * For an example of error interfaces, please see the [OOjs UI documentation on MediaWiki][1].
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Windows/Process_Dialogs#Processes_and_errors
+ *
  * @class
  *
  * @constructor
  * @param {string|jQuery} message Description of error
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [recoverable=true] Error is recoverable
- * @cfg {boolean} [warning=false] Whether this error is a warning or not.
+ * @cfg {boolean} [recoverable=true] Error is recoverable.
+ *  By default, errors are recoverable, and users can try the process again.
+ * @cfg {boolean} [warning=false] Error is a warning.
+ *  If the error is a warning, the error interface will include a
+ *  'Dismiss' and a 'Continue' button. It is the responsibility of the developer to ensure that the warning
+ *  is not triggered a second time if the user chooses to continue.
  */
 OO.ui.Error = function OoUiError( message, config ) {
        // Allow passing positional parameters inside the config object
@@ -3371,7 +3423,9 @@ OO.initClass( OO.ui.Error );
 /* Methods */
 
 /**
- * Check if error can be recovered from.
+ * Check if the error is recoverable.
+ *
+ * If the error is recoverable, users are able to try the process again.
  *
  * @return {boolean} Error is recoverable
  */
@@ -3380,7 +3434,9 @@ OO.ui.Error.prototype.isRecoverable = function () {
 };
 
 /**
- * Check if the error is a warning
+ * Check if the error is a warning.
+ *
+ * If the error is a warning, the error interface will include a 'Dismiss' and a 'Continue' button.
  *
  * @return {boolean} Error is warning
  */
@@ -3400,7 +3456,7 @@ OO.ui.Error.prototype.getMessage = function () {
 };
 
 /**
- * Get error message as text.
+ * Get the error message text.
  *
  * @return {string} Error message
  */
@@ -6605,6 +6661,132 @@ OO.ui.Tool.prototype.destroy = function () {
 /**
  * Collection of tool groups.
  *
+ *     @example
+ *     // Basic OOjs UI toolbar example
+ *
+ *     // Create the toolbar
+ *     var toolFactory = new OO.ui.ToolFactory();
+ *     var toolGroupFactory = new OO.ui.ToolGroupFactory();
+ *     var toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory );
+ *
+ *     // We will be placing status text in this element when tools are used
+ *     var $area = $( '<p>' ).css( 'font-size', '0.8em' ).text( 'Toolbar example' );
+ *
+ *     // Define the tools that we're going to place in our toolbar
+ *
+ *     // Create a class inheriting from OO.ui.Tool
+ *     function PictureTool() {
+ *         PictureTool.super.apply( this, arguments );
+ *     };
+ *     OO.inheritClass( PictureTool, OO.ui.Tool );
+ *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one
+ *     // of 'icon' and 'title' (displayed icon and text).
+ *     PictureTool.static.name = 'picture';
+ *     PictureTool.static.icon = 'picture';
+ *     PictureTool.static.title = 'Insert picture';
+ *     // Defines the action that will happen when this tool is selected (clicked).
+ *     PictureTool.prototype.onSelect = function () {
+ *         $area.text( 'Picture tool clicked!' );
+ *         this.setActive( false );
+ *     };
+ *     // The toolbar can be synchronized with the state of some external stuff, like a text
+ *     // editor's editing area, highlighting the tools (e.g. a 'bold' tool would be shown as active
+ *     // when the text cursor was inside bolded text). Here we simply disable this feature.
+ *     PictureTool.prototype.onUpdateState = function () {
+ *         this.setActive( false );
+ *     };
+ *     // Make this tool available in our toolFactory and thus our toolbar
+ *     toolFactory.register( PictureTool );
+ *
+ *     // Register two more tools, nothing interesting here
+ *     function SettingsTool() {
+ *         SettingsTool.super.apply( this, arguments );
+ *     };
+ *     OO.inheritClass( SettingsTool, OO.ui.Tool );
+ *     SettingsTool.static.name = 'settings';
+ *     SettingsTool.static.icon = 'settings';
+ *     SettingsTool.static.title = 'Change settings';
+ *     SettingsTool.prototype.onSelect = function () {
+ *         $area.text( 'Settings tool clicked!' );
+ *         this.setActive( false );
+ *     };
+ *     SettingsTool.prototype.onUpdateState = function () {
+ *         this.setActive( false );
+ *     };
+ *     toolFactory.register( SettingsTool );
+ *
+ *     // Register two more tools, nothing interesting here
+ *     function StuffTool() {
+ *         StuffTool.super.apply( this, arguments );
+ *     };
+ *     OO.inheritClass( StuffTool, OO.ui.Tool );
+ *     StuffTool.static.name = 'stuff';
+ *     StuffTool.static.icon = 'ellipsis';
+ *     StuffTool.static.title = 'More stuff';
+ *     StuffTool.prototype.onSelect = function () {
+ *         $area.text( 'More stuff tool clicked!' );
+ *         this.setActive( false );
+ *     };
+ *     StuffTool.prototype.onUpdateState = function () {
+ *         this.setActive( false );
+ *     };
+ *     toolFactory.register( StuffTool );
+ *
+ *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a
+ *     // little popup window (a PopupWidget). 'onUpdateState' is also already implemented.
+ *     function HelpTool( toolGroup, config ) {
+ *         OO.ui.PopupTool.call( this, toolGroup, $.extend( { popup: {
+ *             padded: true,
+ *             label: 'Help',
+ *             head: true
+ *         } }, config ) );
+ *         this.popup.$body.append( '<p>I am helpful!</p>' );
+ *     };
+ *     OO.inheritClass( HelpTool, OO.ui.PopupTool );
+ *     HelpTool.static.name = 'help';
+ *     HelpTool.static.icon = 'help';
+ *     HelpTool.static.title = 'Help';
+ *     toolFactory.register( HelpTool );
+ *
+ *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be
+ *     // used once (but not all defined tools must be used).
+ *     toolbar.setup( [
+ *         {
+ *             // 'bar' tool groups display tools' icons only, side-by-side.
+ *             type: 'bar',
+ *             include: [ 'picture', 'help' ]
+ *         },
+ *         {
+ *             // 'list' tool groups display both the titles and icons, in a dropdown list.
+ *             type: 'list',
+ *             indicator: 'down',
+ *             label: 'More',
+ *             include: [ 'settings', 'stuff' ]
+ *         }
+ *         // Note how the tools themselves are toolgroup-agnostic - the same tool can be displayed
+ *         // either in a 'list' or a 'bar'. There is a 'menu' tool group too, not showcased here.
+ *     ] );
+ *
+ *     // Create some UI around the toolbar and place it in the document
+ *     var frame = new OO.ui.PanelLayout( {
+ *         expanded: false,
+ *         framed: true
+ *     } );
+ *     var contentFrame = new OO.ui.PanelLayout( {
+ *         expanded: false,
+ *         padded: true
+ *     } );
+ *     frame.$element.append(
+ *         toolbar.$element,
+ *         contentFrame.$element.append( $area )
+ *     );
+ *     $( 'body' ).append( frame.$element );
+ *
+ *     // Here is where the toolbar is actually built. This must be done after inserting it into the
+ *     // document.
+ *     toolbar.initialize();
+ *     toolbar.emit( 'updateState' );
+ *
  * @class
  * @extends OO.ui.Element
  * @mixins OO.EventEmitter
@@ -7520,7 +7702,7 @@ OO.ui.MessageDialog.prototype.fitActions = function () {
  *
  *     MyProcessDialog.prototype.initialize = function () {
  *         MyProcessDialog.super.prototype.initialize.apply( this, arguments );
- *         this.content = new OO.ui.PanelLayout( { $: this.$, padded: true, expanded: false } );
+ *         this.content = new OO.ui.PanelLayout( { padded: true, expanded: false } );
  *         this.content.$element.append( '<p>This is a process dialog window. The header contains the title and two buttons: \'Cancel\' (a safe action) on the left and \'Done\' (a primary action)  on the right.</p>' );
  *         this.$body.append( this.content.$element );
  *     };
@@ -8121,6 +8303,18 @@ OO.mixinClass( OO.ui.FieldsetLayout, OO.ui.GroupElement );
  * FormLayouts are used to wrap {@link OO.ui.FieldsetLayout FieldsetLayouts} when you intend to use browser-based
  * form submission for the fields instead of handling them in JavaScript. Form layouts can be configured with an
  * HTML form action, an encoding type, and a method using the #action, #enctype, and #method configs, respectively.
+ * See the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
+ *
+ * Only widgets from the {@link OO.ui.InputWidget InputWidget} family support form submission. It
+ * includes standard form elements like {@link OO.ui.CheckboxInputWidget checkboxes}, {@link
+ * OO.ui.RadioInputWidget radio buttons} and {@link OO.ui.TextInputWidget text fields}, as well as
+ * some fancier controls. Some controls have both regular and InputWidget variants, for example
+ * OO.ui.DropdownWidget and OO.ui.DropdownInputWidget – only the latter support form submission and
+ * often have simplified APIs to match the capabilities of HTML forms.
+ * See the [OOjs UI Inputs documentation on MediaWiki] [2] for more information about InputWidgets.
+ *
+ * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Layouts/Forms
+ * [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Inputs
  *
  *     @example
  *     // Example of a form layout that wraps a fieldset layout
@@ -8225,34 +8419,80 @@ OO.ui.FormLayout.prototype.onFormSubmit = function () {
 };
 
 /**
- * Layout with a content and menu area.
+ * MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned relative to the content (after, before, top, or bottom)
+ * and its size is customized with the #menuSize config. The content area will fill all remaining space.
  *
- * The menu area can be positioned at the top, after, bottom or before. The content area will fill
- * all remaining space.
+ *     @example
+ *     var menuLayout = new OO.ui.MenuLayout( {
+ *         position: 'top'
+ *     } ),
+ *         menuPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),
+ *         contentPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),
+ *         select = new OO.ui.SelectWidget( {
+ *             items: [
+ *                 new OO.ui.OptionWidget( {
+ *                     data: 'before',
+ *                     label: 'Before',
+ *                 } ),
+ *                 new OO.ui.OptionWidget( {
+ *                     data: 'after',
+ *                     label: 'After',
+ *                 } ),
+ *                 new OO.ui.OptionWidget( {
+ *                     data: 'top',
+ *                     label: 'Top',
+ *                 } ),
+ *                 new OO.ui.OptionWidget( {
+ *                     data: 'bottom',
+ *                     label: 'Bottom',
+ *                 } )
+ *              ]
+ *         } ).on( 'select', function ( item ) {
+ *            menuLayout.setMenuPosition( item.getData() );
+ *         } );
+ *
+ *     menuLayout.$menu.append(
+ *         menuPanel.$element.append( '<b>Menu panel</b>', select.$element )
+ *     );
+ *     menuLayout.$content.append(
+ *         contentPanel.$element.append( '<b>Content panel</b>', '<p>Note that the menu is positioned relative to the content panel: top, bottom, after, before.</p>')
+ *     );
+ *     $( 'body' ).append( menuLayout.$element );
+ *
+ * If menu size needs to be overridden, it can be accomplished using CSS similar to the snippet
+ * below. MenuLayout's CSS will override the appropriate values with 'auto' or '0' to display the
+ * menu correctly. If `menuPosition` is known beforehand, CSS rules corresponding to other positions
+ * may be omitted.
+ *
+ *     .oo-ui-menuLayout-menu {
+ *         height: 200px;
+ *         width: 200px;
+ *     }
+ *     .oo-ui-menuLayout-content {
+ *         top: 200px;
+ *         left: 200px;
+ *         right: 200px;
+ *         bottom: 200px;
+ *     }
  *
  * @class
  * @extends OO.ui.Layout
  *
  * @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} [menuPosition='before'] Position of menu: `top`, `after`, `bottom` or `before`
  */
 OO.ui.MenuLayout = function OoUiMenuLayout( config ) {
-       var positions = this.constructor.static.menuPositions;
-
        // Configuration initialization
-       config = config || {};
+       config = $.extend( {
+               showMenu: true,
+               menuPosition: 'before'
+       }, config );
 
        // Parent constructor
        OO.ui.MenuLayout.super.call( this, config );
 
-       // Properties
-       this.showMenu = config.showMenu !== false;
-       this.menuSize = config.menuSize || '18em';
-       this.menuPosition = positions[ config.menuPosition ] || positions.before;
-
        /**
         * Menu DOM node
         *
@@ -8267,42 +8507,20 @@ OO.ui.MenuLayout = function OoUiMenuLayout( config ) {
        this.$content = $( '<div>' );
 
        // Initialization
-       this.toggleMenu( this.showMenu );
-       this.updateSizes();
        this.$menu
-               .addClass( 'oo-ui-menuLayout-menu' )
-               .css( this.menuPosition.sizeProperty, this.menuSize );
+               .addClass( 'oo-ui-menuLayout-menu' );
        this.$content.addClass( 'oo-ui-menuLayout-content' );
        this.$element
-               .addClass( 'oo-ui-menuLayout ' + this.menuPosition.className )
+               .addClass( 'oo-ui-menuLayout' )
                .append( this.$content, this.$menu );
+       this.setMenuPosition( config.menuPosition );
+       this.toggleMenu( config.showMenu );
 };
 
 /* Setup */
 
 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 */
 
 /**
@@ -8316,7 +8534,9 @@ OO.ui.MenuLayout.prototype.toggleMenu = function ( showMenu ) {
 
        if ( this.showMenu !== showMenu ) {
                this.showMenu = showMenu;
-               this.updateSizes();
+               this.$element
+                       .toggleClass( 'oo-ui-menuLayout-showMenu', this.showMenu )
+                       .toggleClass( 'oo-ui-menuLayout-hideMenu', !this.showMenu );
        }
 
        return this;
@@ -8331,59 +8551,6 @@ OO.ui.MenuLayout.prototype.isMenuVisible = function () {
        return this.showMenu;
 };
 
-/**
- * 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;
-};
-
-/**
- * Update menu and content CSS based on current menu size and visibility
- *
- * This method is called internally when size or position is changed.
- */
-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
-               } );
-       }
-};
-
-/**
- * Get menu size.
- *
- * @return {number|string} Menu size
- */
-OO.ui.MenuLayout.prototype.getMenuSize = function () {
-       return this.menuSize;
-};
-
 /**
  * Set menu position.
  *
@@ -8392,19 +8559,9 @@ OO.ui.MenuLayout.prototype.getMenuSize = function () {
  * @chainable
  */
 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 );
+       this.$element.removeClass( 'oo-ui-menuLayout-' + this.menuPosition );
+       this.menuPosition = position;
+       this.$element.addClass( 'oo-ui-menuLayout-' + position );
 
        return this;
 };
@@ -8596,9 +8753,18 @@ OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( 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.
+ * @param {number} [itemIndex] A specific item to focus on
  */
-OO.ui.BookletLayout.prototype.focus = function () {
-       var $input, page = this.stackLayout.getCurrentItem();
+OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
+       var $input, page,
+               items = this.stackLayout.getItems();
+
+       if ( itemIndex !== undefined && items[ itemIndex ] ) {
+               page = items[ itemIndex ];
+       } else {
+               page = this.stackLayout.getCurrentItem();
+       }
+
        if ( !page && this.outlined ) {
                this.selectFirstSelectablePage();
                page = this.stackLayout.getCurrentItem();
@@ -8615,6 +8781,35 @@ OO.ui.BookletLayout.prototype.focus = function () {
        }
 };
 
+/**
+ * Find the first focusable input in the booklet layout and focus
+ * on it.
+ */
+OO.ui.BookletLayout.prototype.focusFirstFocusable = function () {
+       var i, len,
+               found = false,
+               items = this.stackLayout.getItems(),
+               checkAndFocus = function () {
+                       if ( OO.ui.isFocusableElement( $( this ) ) ) {
+                               $( this ).focus();
+                               found = true;
+                               return false;
+                       }
+               };
+
+       for ( i = 0, len = items.length; i < len; i++ ) {
+               if ( found ) {
+                       break;
+               }
+               // Find all potentially focusable elements in the item
+               // and check if they are focusable
+               items[i].$element
+                       .find( 'input, select, textarea, button, object' )
+                       /* jshint loopfunc:true */
+                       .each( checkAndFocus );
+       }
+};
+
 /**
  * Handle outline widget select events.
  *
@@ -10125,11 +10320,12 @@ OO.ui.OutlineControlsWidget.prototype.onOutlineChange = function () {
 };
 
 /**
- * ToggleWidget is mixed into other classes to create widgets with an on/off state.
+ * ToggleWidget implements basic behavior of widgets with an on/off state.
  * Please see OO.ui.ToggleButtonWidget and OO.ui.ToggleSwitchWidget for examples.
  *
  * @abstract
  * @class
+ * @extends OO.ui.Widget
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10140,6 +10336,9 @@ OO.ui.ToggleWidget = function OoUiToggleWidget( config ) {
        // Configuration initialization
        config = config || {};
 
+       // Parent constructor
+       OO.ui.ToggleWidget.super.call( this, config );
+
        // Properties
        this.value = null;
 
@@ -10148,6 +10347,10 @@ OO.ui.ToggleWidget = function OoUiToggleWidget( config ) {
        this.setValue( !!config.value );
 };
 
+/* Setup */
+
+OO.inheritClass( OO.ui.ToggleWidget, OO.ui.Widget );
+
 /* Events */
 
 /**
@@ -10279,8 +10482,7 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
  */
 OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        // Configuration initialization
-       // FIXME: The `nofollow` alias is deprecated and will be removed (T89767)
-       config = $.extend( { noFollow: config && config.nofollow }, config );
+       config = config || {};
 
        // Parent constructor
        OO.ui.ButtonWidget.super.call( this, config );
@@ -10298,7 +10500,9 @@ OO.ui.ButtonWidget = function OoUiButtonWidget( config ) {
        this.href = null;
        this.target = null;
        this.noFollow = false;
-       this.isHyperlink = false;
+
+       // Events
+       this.connect( this, { disable: 'onDisable' } );
 
        // Initialization
        this.$button.append( this.$icon, this.$label, this.$indicator );
@@ -10352,7 +10556,7 @@ OO.ui.ButtonWidget.prototype.onMouseUp = function ( e ) {
  */
 OO.ui.ButtonWidget.prototype.onClick = function ( e ) {
        var ret = OO.ui.ButtonElement.prototype.onClick.call( this, e );
-       if ( this.isHyperlink ) {
+       if ( this.href ) {
                return true;
        }
        return ret;
@@ -10363,7 +10567,7 @@ OO.ui.ButtonWidget.prototype.onClick = function ( e ) {
  */
 OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
        var ret = OO.ui.ButtonElement.prototype.onKeyPress.call( this, e );
-       if ( this.isHyperlink ) {
+       if ( this.href ) {
                return true;
        }
        return ret;
@@ -10406,18 +10610,39 @@ OO.ui.ButtonWidget.prototype.setHref = function ( href ) {
 
        if ( href !== this.href ) {
                this.href = href;
-               if ( href !== null ) {
-                       this.$button.attr( 'href', href );
-                       this.isHyperlink = true;
-               } else {
-                       this.$button.removeAttr( 'href' );
-                       this.isHyperlink = false;
-               }
+               this.updateHref();
+       }
+
+       return this;
+};
+
+/**
+ * Update the `href` attribute, in case of changes to href or
+ * disabled state.
+ *
+ * @private
+ * @chainable
+ */
+OO.ui.ButtonWidget.prototype.updateHref = function () {
+       if ( this.href !== null && !this.isDisabled() ) {
+               this.$button.attr( 'href', this.href );
+       } else {
+               this.$button.removeAttr( 'href' );
        }
 
        return this;
 };
 
+/**
+ * Handle disable events.
+ *
+ * @private
+ * @param {boolean} disabled Element is disabled
+ */
+OO.ui.ButtonWidget.prototype.onDisable = function () {
+       this.updateHref();
+};
+
 /**
  * Set hyperlink target.
  *
@@ -10710,8 +10935,14 @@ OO.ui.PopupButtonWidget.prototype.onAction = function () {
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Toggle_buttons
  *
  * @class
- * @extends OO.ui.ButtonWidget
- * @mixins OO.ui.ToggleWidget
+ * @extends OO.ui.ToggleWidget
+ * @mixins OO.ui.ButtonElement
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.LabelElement
+ * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.FlaggedElement
+ * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10726,26 +10957,41 @@ OO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {
        OO.ui.ToggleButtonWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ToggleWidget.call( this, config );
+       OO.ui.ButtonElement.call( this, config );
+       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.$button } ) );
+       OO.ui.FlaggedElement.call( this, config );
+       OO.ui.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );
 
        // Events
        this.connect( this, { click: 'onAction' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-toggleButtonWidget' );
+       this.$button.append( this.$icon, this.$label, this.$indicator );
+       this.$element
+               .addClass( 'oo-ui-toggleButtonWidget' )
+               .append( this.$button );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ButtonWidget );
-OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
+OO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.ButtonElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.FlaggedElement );
+OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.TabIndexedElement );
 
 /* Methods */
 
 /**
+ * Handle the button action being triggered.
  *
  * @private
- * Handle the button action being triggered.
  */
 OO.ui.ToggleButtonWidget.prototype.onAction = function () {
        this.setValue( !this.value );
@@ -10757,16 +11003,30 @@ OO.ui.ToggleButtonWidget.prototype.onAction = function () {
 OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
        value = !!value;
        if ( value !== this.value ) {
-               this.$button.attr( 'aria-pressed', value.toString() );
+               // Might be called from parent constructor before ButtonElement constructor
+               if ( this.$button ) {
+                       this.$button.attr( 'aria-pressed', value.toString() );
+               }
                this.setActive( value );
        }
 
-       // Parent method (from mixin)
-       OO.ui.ToggleWidget.prototype.setValue.call( this, value );
+       // Parent method
+       OO.ui.ToggleButtonWidget.super.prototype.setValue.call( this, value );
 
        return this;
 };
 
+/**
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.prototype.setButtonElement = function ( $button ) {
+       if ( this.$button ) {
+               this.$button.removeAttr( 'aria-pressed' );
+       }
+       OO.ui.ButtonElement.prototype.setButtonElement.call( this, $button );
+       this.$button.attr( 'aria-pressed', this.value.toString() );
+};
+
 /**
  * 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
@@ -11258,7 +11518,6 @@ OO.ui.InputWidget.prototype.blur = function () {
  * @mixins OO.ui.IndicatorElement
  * @mixins OO.ui.LabelElement
  * @mixins OO.ui.TitledElement
- * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -11284,7 +11543,6 @@ OO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {
        OO.ui.IndicatorElement.call( this, config );
        OO.ui.LabelElement.call( this, config );
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );
-       OO.ui.FlaggedElement.call( this, config );
 
        // Initialization
        if ( !config.useInputTag ) {
@@ -11301,7 +11559,6 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.IndicatorElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.LabelElement );
 OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.TitledElement );
-OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.FlaggedElement );
 
 /* Methods */
 
@@ -11360,10 +11617,12 @@ OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
 
 /**
  * CheckboxInputWidgets, like HTML checkboxes, can be selected and/or configured with a value.
- *  Note that these {@link OO.ui.InputWidget input widgets} are best laid out
+ * Note that these {@link OO.ui.InputWidget input widgets} are best laid out
  * in {@link OO.ui.FieldLayout field layouts} that use the {@link OO.ui.FieldLayout#align inline}
  * alignment. For more information, please see the [OOjs UI documentation on MediaWiki][1].
  *
+ * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ *
  *     @example
  *     // An example of selected, unselected, and disabled checkbox inputs
  *     var checkbox1=new OO.ui.CheckboxInputWidget( {
@@ -11469,8 +11728,8 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
 
 /**
  * DropdownInputWidget is a {@link OO.ui.DropdownWidget DropdownWidget} intended to be used
- * within a {@link OO.ui.FormLayout form}. The selected value is synchronized with the value
- * of  a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
+ * within a HTML form, such as a OO.ui.FormLayout. The selected value is synchronized with the value
+ * of a hidden HTML `input` tag. Please see the [OOjs UI documentation on MediaWiki][1] for
  * more information about input widgets.
  *
  *     @example
@@ -11614,6 +11873,8 @@ OO.ui.DropdownInputWidget.prototype.blur = function () {
  * with {@link OO.ui.RadioOptionWidget radio options} instead of this class. For more information,
  * please see the [OOjs UI documentation on MediaWiki][1].
  *
+ * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ *
  *     @example
  *     // An example of selected, unselected, and disabled radio inputs
  *     var radio1 = new OO.ui.RadioInputWidget( {
@@ -11709,6 +11970,8 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
  * which modifies incoming values rather than validating them.
  * Please see the [OOjs UI documentation on MediaWiki] [1] for more information and examples.
  *
+ * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ *
  *     @example
  *     // Example of a text input widget
  *     var textInput = new OO.ui.TextInputWidget( {
@@ -14075,11 +14338,7 @@ OO.ui.SelectWidget.prototype.unbindKeyDownListener = function () {
  * @return {OO.ui.OptionWidget|null} Outline item widget, `null` if none was found
  */
 OO.ui.SelectWidget.prototype.getTargetItem = function ( e ) {
-       var $item = $( e.target ).closest( '.oo-ui-optionWidget' );
-       if ( $item.length ) {
-               return $item.data( 'oo-ui-optionWidget' );
-       }
-       return null;
+       return $( e.target ).closest( '.oo-ui-optionWidget' ).data( 'oo-ui-optionWidget' ) || null;
 };
 
 /**
@@ -14898,8 +15157,7 @@ OO.mixinClass( OO.ui.OutlineSelectWidget, OO.ui.TabIndexedElement );
  *     $( 'body' ).append( fieldset.$element );
  *
  * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.ToggleWidget
+ * @extends OO.ui.ToggleWidget
  * @mixins OO.ui.TabIndexedElement
  *
  * @constructor
@@ -14912,7 +15170,6 @@ OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
        OO.ui.ToggleSwitchWidget.super.call( this, config );
 
        // Mixin constructors
-       OO.ui.ToggleWidget.call( this, config );
        OO.ui.TabIndexedElement.call( this, config );
 
        // Properties
@@ -14939,8 +15196,7 @@ OO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {
 
 /* Setup */
 
-OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
+OO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );
 OO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.TabIndexedElement );
 
 /* Methods */
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png
new file mode 100644 (file)
index 0000000..4336892
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-ltr.svg
new file mode 100644 (file)
index 0000000..f8578cf
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="find">
+        <path id="magnifying-glass" d="m 13.65625,11 c -1.921,0 -3.5,1.54775 -3.5,3.46875 0,1.92 1.579,3.5 3.5,3.5 0.749,0 1.432,-0.25225 2,-0.65625 l 0.09375,0.15625 2.375,2.375 c 0.19,0.189 0.53425,0.15325 0.78125,-0.09375 0.247,-0.247 0.314,-0.59125 0.125,-0.78125 l -2.375,-2.375 L 16.46875,16.5 C 16.87175,15.934 17.125,15.21775 17.125,14.46875 17.124,12.54875 15.57525,11 13.65625,11 z m 0,1.65625 c 1.011306,0 1.8125,0.801194 1.8125,1.8125 0,1.011306 -0.801194,1.84375 -1.8125,1.84375 -1.011306,0 -1.84375,-0.832444 -1.84375,-1.84375 0,-1.011306 0.832444,-1.8125 1.84375,-1.8125 z" />
+        <path id="text" d="M 6,5 6,7 16,7 16,5 6,5 z m 0,3 0,2 11,0 0,-2 -11,0 z m 0,3 0,2 3.53125,0 c 0.2825289,-0.797203 0.786096,-1.486208 1.4375,-2 L 6,11 z m 0,3 0,2 3.53125,0 C 9.3537004,15.520243 9.25,15.010236 9.25,14.46875 9.25,14.309811 9.2962033,14.154621 9.3125,14 L 6,14 z" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png
new file mode 100644 (file)
index 0000000..f492c79
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/find-rtl.svg
new file mode 100644 (file)
index 0000000..2a1e9c6
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="find">
+        <path id="magnifying-glass" d="m 11.343828,11.000025 c 1.921,0 3.5,1.54775 3.5,3.46875 0,1.92 -1.579,3.5 -3.5,3.5 -0.749,0 -1.432,-0.25225 -2,-0.65625 l -0.09375,0.15625 -2.375,2.375 c -0.19,0.189 -0.53425,0.15325 -0.78125,-0.09375 -0.247,-0.247 -0.314,-0.59125 -0.125,-0.78125 l 2.375,-2.375 0.1875,-0.09375 c -0.403,-0.566 -0.65625,-1.28225 -0.65625,-2.03125 10e-4,-1.92 1.54975,-3.46875 3.46875,-3.46875 z m 0,1.65625 c -1.011306,0 -1.8125,0.801194 -1.8125,1.8125 0,1.011306 0.801194,1.84375 1.8125,1.84375 1.011306,0 1.84375,-0.832444 1.84375,-1.84375 0,-1.011306 -0.832444,-1.8125 -1.84375,-1.8125 z" />
+        <path id="text" d="M 19,5 19,7 9,7 9,5 z m 0,3 0,2 -11,0 0,-2 z m 0,3 0,2 -3.53125,0 c -0.282529,-0.797203 -0.786096,-1.486208 -1.4375,-2 z m 0,3 0,2 -3.53125,0 C 15.6463,15.520243 15.75,15.010236 15.75,14.46875 15.75,14.309811 15.703797,14.154621 15.6875,14 z" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png
new file mode 100644 (file)
index 0000000..24d3e17
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history-invert.svg
new file mode 100644 (file)
index 0000000..fb61382
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="history">
+        <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.559 1.702-6.559s-4.35 5.363-4.877 6.699c-.463 1.168 1.459 2.209 2.346 1.678 1.9.551 4.834 1.244 4.834 1.244z"/>
+        <path id="arrow" d="M12.086 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 1.783.476 3.454 1.301 4.898l-2.223 2.04h5.688v-5.219l-2.066 1.896c-.55-1.088-.866-2.312-.866-3.615 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874 5.476 0 9.914-4.438 9.914-9.914-.001-5.477-4.439-9.915-9.915-9.915z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png
new file mode 100644 (file)
index 0000000..f5a7d36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/history.svg
new file mode 100644 (file)
index 0000000..35f15af
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="history">
+        <path id="clock-hands" d="M17.26 15.076s-2.385-1.935-4.005-3.062c.72-2.397 1.702-6.559 1.702-6.559s-4.35 5.363-4.877 6.699c-.463 1.168 1.459 2.209 2.346 1.678 1.9.551 4.834 1.244 4.834 1.244z"/>
+        <path id="arrow" d="M12.086 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 1.783.476 3.454 1.301 4.898l-2.223 2.04h5.688v-5.219l-2.066 1.896c-.55-1.088-.866-2.312-.866-3.615 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083-1.145 0-2.228-.247-3.213-.678l-.833 1.634c1.235.557 2.602.874 4.045.874 5.476 0 9.914-4.438 9.914-9.914-.001-5.477-4.439-9.915-9.915-9.915z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.png
new file mode 100644 (file)
index 0000000..bc4bc26
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewCompact.svg
new file mode 100644 (file)
index 0000000..d96a2e3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewCompact">
+        <circle cx="6" cy="6" r="2"/>
+        <circle cx="12" cy="6" r="2"/>
+        <circle cx="18" cy="6" r="2"/>
+        <circle cx="6" cy="12" r="2"/>
+        <circle cx="12" cy="12" r="2"/>
+        <circle cx="18" cy="12" r="2"/>
+        <circle cx="6" cy="18" r="2"/>
+        <circle cx="12" cy="18" r="2"/>
+        <circle cx="18" cy="18" r="2"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.png
new file mode 100644 (file)
index 0000000..4ab5394
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-ltr.svg
new file mode 100644 (file)
index 0000000..4f5f9b3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="5.5" cy="8.5" r="2.5"/>
+        <path d="M10 6h12v1H10zM10 8h9v1h-9zM10 10h4v1h-4z"/>
+        <circle cx="5.5" cy="16.5" r="2.5"/>
+        <path d="M10 14h12v1H10zM10 16h9v1h-9zM10 18h4v1h-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.png
new file mode 100644 (file)
index 0000000..46587ec
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/viewDetails-rtl.svg
new file mode 100644 (file)
index 0000000..f43b05f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="18.5" cy="8.5" r="2.5"/>
+        <path d="M14 6H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+        <circle cx="18.5" cy="16.5" r="2.5"/>
+        <path d="M14 14H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.png
new file mode 100644 (file)
index 0000000..e1afbae
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/visionSimulator.svg
new file mode 100644 (file)
index 0000000..ae6ba27
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M0 10v8h2.3c.3.6 1 1 1.7 1h4c1.5 0 2.7-.8 3-2h2c.3 1.2 1.5 2 3 2h4c.7 0 1.4 0 1.7-1H24v-8zm10 6c0 1-.4 2-2 2H4c-.6 0-1-.4-1-1v-3c0-.6.4-1 1-1h5c.6 0 1 .4 1 1zm11 1c0 .6-.4 1-1 1h-4c-1.6 0-2-1-2-2v-2c0-.6.4-1 1-1h5c.6 0 1 .4 1 1z"/>
+</svg>
diff --git a/resources/src/dom-level2-skip.js b/resources/src/dom-level2-skip.js
new file mode 100644 (file)
index 0000000..484c295
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+ * Skip function for dom-level2-shim module.
+ *
+ * Tests for window.Node because that's the only thing that this shim is adding.
+ */
+return !!window.Node;
index 813c37c..7c9bec3 100644 (file)
  * @param {Function} options.result.select Called in context of the suggestions-result-current element.
  * @param {jQuery} options.result.select.$textbox
  *
+ * @param {Object} [options.update] Set of callbacks for listening to a change in the text input.
+ *
+ * @param {Function} options.update.before Called right after the user changes the textbox text.
+ * @param {Function} options.update.after Called after results are updated either from the cache or
+ * the API as a result of the user input.
+ *
  * @param {jQuery} [options.$region=this] The element to place the suggestions below and match width of.
  *
  * @param {string[]} [options.suggestions] Array of suggestions to display.
@@ -83,7 +89,7 @@
  * @param {boolean} [options.positionFromLeft] Sets `expandFrom=left`, for backwards
  *  compatibility.
  *
- * @param {boolean} [options.highlightInput=false] Whether to hightlight matched portions of the
+ * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the
  *  input or not.
  */
 ( function ( $ ) {
@@ -144,6 +150,10 @@ $.suggestions = {
                                cache = context.data.cache,
                                cacheHit;
 
+                       if ( typeof context.config.update.before === 'function' ) {
+                               context.config.update.before.call( context.data.$textbox );
+                       }
+
                        // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
                        // if the textbox is empty then clear the result div, but leave other settings intouched
                        if ( val.length === 0 ) {
@@ -158,6 +168,9 @@ $.suggestions = {
                                if ( context.config.cache && hasOwn.call( cache, val ) ) {
                                        if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
                                                context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
+                                               if ( typeof context.config.update.after === 'function' ) {
+                                                       context.config.update.after.call( context.data.$textbox );
+                                               }
                                                cacheHit = true;
                                        } else {
                                                // Cache expired
@@ -171,6 +184,9 @@ $.suggestions = {
                                                function ( suggestions ) {
                                                        suggestions = suggestions.slice( 0, context.config.maxRows );
                                                        context.data.$textbox.suggestions( 'suggestions', suggestions );
+                                                       if ( typeof context.config.update.after === 'function' ) {
+                                                               context.config.update.after.call( context.data.$textbox );
+                                                       }
                                                        if ( context.config.cache ) {
                                                                cache[ val ] = {
                                                                        suggestions: suggestions,
@@ -227,6 +243,7 @@ $.suggestions = {
                        case 'cancel':
                        case 'special':
                        case 'result':
+                       case 'update':
                        case '$region':
                        case 'expandFrom':
                                context.config[property] = value;
@@ -559,6 +576,7 @@ $.fn.suggestions = function () {
                                        cancel: function () {},
                                        special: {},
                                        result: {},
+                                       update: {},
                                        $region: $( this ),
                                        suggestions: [],
                                        maxRows: 10,
index ac48c59..2ebfe92 100644 (file)
@@ -85,7 +85,8 @@ jQuery( function ( $ ) {
                                $copyForm.find( 'input[name^="ids["]:checked' ).prop( 'checked', false );
 
                        // Remove diff=&oldid=, change action=historysubmit to revisiondelete, remove revisiondelete
-                       } else if ( $historySubmitter.hasClass( 'mw-history-revisiondelete-button' ) ) {
+                       } else if ( $historySubmitter.hasClass( 'mw-history-revisiondelete-button' ) ||
+                                       $historySubmitter.hasClass( 'mw-history-editchangetags-button' ) ) {
                                $copyRadios.remove();
                                $copyAction.val( $historySubmitter.attr( 'name' ) );
                                $copyForm.find( ':submit' ).remove();
index bab92a1..d4446ab 100644 (file)
@@ -1 +1,445 @@
-{"latin":["Á","á","À","à","Â","â","Ä","ä","Ã","ã","Ǎ","ǎ","Ā","ā","Ă","ă","Ą","ą","Å","å","Ć","ć","Ĉ","ĉ","Ç","ç","Č","č","Ċ","ċ","Đ","đ","Ď","ď","É","é","È","è","Ê","ê","Ë","ë","Ě","ě","Ē","ē","Ĕ","ĕ","Ė","ė","Ę","ę","Ĝ","ĝ","Ģ","ģ","Ğ","ğ","Ġ","ġ","Ĥ","ĥ","Ħ","ħ","Í","í","Ì","ì","Î","î","Ï","ï","Ĩ","ĩ","Ǐ","ǐ","Ī","ī","Ĭ","ĭ","İ","ı","Į","į","Ĵ","ĵ","Ķ","ķ","Ĺ","ĺ","Ļ","ļ","Ľ","ľ","Ł","ł","Ń","ń","Ñ","ñ","Ņ","ņ","Ň","ň","Ó","ó","Ò","ò","Ô","ô","Ö","ö","Õ","õ","Ǒ","ǒ","Ō","ō","Ŏ","ŏ","Ǫ","ǫ","Ő","ő","Ŕ","ŕ","Ŗ","ŗ","Ř","ř","Ś","ś","Ŝ","ŝ","Ş","ş","Š","š","Ș","ș","Ț","ț","Ť","ť","Ú","ú","Ù","ù","Û","û","Ü","ü","Ũ","ũ","Ů","ů","Ǔ","ǔ","Ū","ū","ǖ","ǘ","ǚ","ǜ","Ŭ","ŭ","Ų","ų","Ű","ű","Ŵ","ŵ","Ý","ý","Ŷ","ŷ","Ÿ","ÿ","Ȳ","ȳ","Ź","ź","Ž","ž","Ż","ż","Æ","æ","Ǣ","ǣ","Ø","ø","Œ","œ","ß","Ð","ð","Þ","þ","Ə","ə"],"latinextended":["Ḁ","ḁ","ẚ","Ạ","ạ","Ả","ả","Ấ","ấ","Ầ","ầ","Ẩ","ẩ","Ẫ","ẫ","Ậ","ậ","Ắ","ắ","Ằ","ằ","Ẳ","ẳ","Ẵ","ẵ","Ặ","ặ","Ḃ","ḃ","Ḅ","ḅ","Ḇ","ḇ","Ḉ","ḉ","Ḋ","ḋ","Ḍ","ḍ","Ḏ","ḏ","Ḑ","ḑ","Ḓ","ḓ","Ḕ","ḕ","Ḗ","ḗ","Ḙ","ḙ","Ḛ","ḛ","Ḝ","ḝ","Ẹ","ẹ","Ẻ","ẻ","Ẽ","ẽ","Ế","ế","Ề","ề","Ể","ể","Ễ","ễ","Ệ","ệ","Ḟ","ḟ","Ḡ","ḡ","Ḣ","ḣ","Ḥ","ḥ","Ḧ","ḧ","Ḩ","ḩ","Ḫ","ḫ","ẖ","Ḭ","ḭ","Ḯ","ḯ","Ỉ","ỉ","Ị","ị","Ḱ","ḱ","Ḳ","ḳ","Ḵ","ḵ","Ḷ","ḷ","Ḹ","ḹ","Ḻ","ḻ","Ḽ","ḽ","Ỻ","ỻ","Ḿ","ḿ","Ṁ","ṁ","Ṃ","ṃ","Ṅ","ṅ","Ṇ","ṇ","Ṉ","ṉ","Ṋ","ṋ","Ṍ","ṍ","Ṏ","ṏ","Ṑ","ṑ","Ṓ","ṓ","Ọ","ọ","Ỏ","ỏ","Ố","ố","Ồ","ồ","Ổ","ổ","Ỗ","ỗ","Ộ","ộ","Ớ","ớ","Ờ","ờ","Ở","ở","Ỡ","ỡ","Ợ","ợ","Ǿ","ǿ","Ơ","ơ","Ṕ","ṕ","Ṗ","ṗ","Ṙ","ṙ","Ṛ","ṛ","Ṝ","ṝ","Ṟ","ṟ","Ṡ","ṡ","ẛ","Ṣ","ṣ","Ṥ","ṥ","Ṧ","ṧ","Ṩ","ṩ","ẜ","ẝ","Ṫ","ṫ","Ṭ","ṭ","Ṯ","ṯ","Ṱ","ṱ","ẗ","Ṳ","ṳ","Ṵ","ṵ","Ṷ","ṷ","Ṹ","ṹ","Ṻ","ṻ","Ụ","ụ","Ủ","ủ","Ứ","ứ","Ừ","ừ","Ử","ử","Ữ","ữ","Ự","ự","Ư","ư","Ǖ","Ǘ","Ǚ","Ǜ","Ṽ","ṽ","Ṿ","ṿ","Ỽ","ỽ","Ẁ","ẁ","Ẃ","ẃ","Ẅ","ẅ","Ẇ","ẇ","Ẉ","ẉ","ẘ","Ẋ","ẋ","Ẍ","ẍ","Ẏ","ẏ","ẙ","Ỳ","ỳ","Ỵ","ỵ","Ỷ","ỷ","Ỹ","ỹ","Ỿ","ỿ","Ẑ","ẑ","Ẓ","ẓ","Ẕ","ẕ","Ǽ","ǽ","ẞ","ẟ"],"ipa":["p","t̪","t","ʈ","c","k","q","ʡ","ʔ","b","d̪","d","ɖ","ɟ","ɡ","ɢ","ɓ","ɗ","ʄ","ɠ","ʛ","t͡s","t͡ʃ","t͡ɕ","d͡z","d͡ʒ","d͡ʑ","ɸ","f","θ","s","ʃ","ʅ","ʆ","ʂ","ɕ","ç","ɧ","x","χ","ħ","ʜ","h","β","v","ʍ","ð","z","ʒ","ʓ","ʐ","ʑ","ʝ","ɣ","ʁ","ʕ","ʖ","ʢ","ɦ","ɬ","ɮ","m","m̩","ɱ","ɱ̩","ɱ̍","n̪","n̪̍","n","n̩","ɳ","ɳ̩","ɲ","ɲ̩","ŋ","ŋ̍","ŋ̩","ɴ","ɴ̩","ʙ","ʙ̩","r","r̩","ʀ","ʀ̩","ɾ","ɽ","ɿ","ɺ","l̪","l̪̩","l","l̩","ɫ","ɫ̩","ɭ","ɭ̩","ʎ","ʎ̩","ʟ","ʟ̩","w","ɥ","ʋ","ɹ","ɻ","j","ɰ","ʘ","ǂ","ǀ","!","ǁ","ʰ","ʱ","ʷ","ʸ","ʲ","ʳ","ⁿ","ˡ","ʴ","ʵ","ˢ","ˣ","ˠ","ʶ","ˤ","ˁ","ˀ","ʼ","i","i̯","ĩ","y","y̯","ỹ","ɪ","ɪ̯","ɪ̃","ʏ","ʏ̯","ʏ̃","ɨ","ɨ̯","ɨ̃","ʉ","ʉ̯","ʉ̃","ɯ","ɯ̯","ɯ̃","u","u̯","ũ","ʊ","ʊ̯","ʊ̃","e","e̯","ẽ","ø","ø̯","ø̃","ɘ","ɘ̯","ɘ̃","ɵ","ɵ̯","ɵ̃","ɤ","ɤ̯","ɤ̃","o","o̯","õ","ɛ","ɛ̯","ɛ̃","œ","œ̯","œ̃","ɜ","ɜ̯","ɜ̃","ə","ə̯","ə̃","ɞ","ɞ̯","ɞ̃","ʌ","ʌ̯","ʌ̃","ɔ","ɔ̯","ɔ̃","æ","æ̯","æ̃","ɶ","ɶ̯","ɶ̃","a","a̯","ã","ɐ","ɐ̯","ɐ̃","ɑ","ɑ̯","ɑ̃","ɒ","ɒ̯","ɒ̃","ˈ","ˌ","ː","ˑ","˘",".","‿","|","‖","ɚ","ɝ"],"symbols":["~","|","¡","¿","†","‡","↔","↑","↓","•","¶","#","½","⅓","⅔","¼","¾","⅛","⅜","⅝","⅞","∞","‘","’",{"label":"“”","action":{"type":"encapsulate","options":{"pre":"“","post":"”"}}},{"label":"„“","action":{"type":"encapsulate","options":{"pre":"„","post":"“"}}},{"label":"„”","action":{"type":"encapsulate","options":{"pre":"„","post":"”"}}},{"label":"«»","action":{"type":"encapsulate","options":{"pre":"«","post":"»"}}},"¤","₳","฿","₵","¢","₡","₢","$","₫","₯","€","₠","₣","ƒ","₴","₭","₤","ℳ","₥","₦","№","₧","₰","£","៛","₨","₪","৳","₮","₩","¥","♠","♣","♥","♦","m²","m³",{"label":"–","titleMsg":"special-characters-title-endash","action":{"type":"replace","options":{"peri":"–","selectPeri":false}}},{"label":"—","titleMsg":"special-characters-title-emdash","action":{"type":"replace","options":{"peri":"—","selectPeri":false}}},"…","‘","’","“","”","°","′","″","≈","≠","≤","≥","±",{"label":"−","titleMsg":"special-characters-title-minus","action":{"type":"replace","options":{"peri":"−","selectPeri":false}}},"×","÷","←","→","·","§","‽"],"greek":["Α","Ά","α","ά","Β","β","Γ","γ","Δ","δ","Ε","Έ","ε","έ","Ζ","ζ","Η","Ή","η","ή","Θ","θ","Ι","Ί","ι","ί","Κ","κ","Λ","λ","Μ","μ","Ν","ν","Ξ","ξ","Ο","Ό","ο","ό","Π","π","Ρ","ρ","Σ","σ","ς","Τ","τ","Υ","Ύ","υ","ύ","Φ","φ","Χ","χ","Ψ","ψ","Ω","Ώ","ω","ώ"],"cyrillic":["А","а","Ӑ","ӑ","Ӓ","ӓ","Ә","ә","Ӛ","ӛ","Б","б","В","в","Г","г","Ґ","ґ","Ӷ","ӷ","Ѓ","ѓ","Ӻ","ӻ","Ғ","ғ","Ҕ","ҕ","Д","д","Ԁ","ԁ","Ԃ","ԃ","Ђ","ђ","Е","е","Ѐ","ѐ","Є","є","Ё","ё","Ӗ","ӗ","Ҽ","ҽ","Ҿ","ҿ","Ж","ж","Җ","җ","Ӂ","ӂ","Ӝ","ӝ","З","з","Ҙ","ҙ","Ӟ","ӟ","Ԑ","ԑ","Ӡ","ӡ","Ѕ","ѕ","Ԅ","ԅ","Ԇ","ԇ","И","и","І","і","Ї","ї",["◌Ӏ","Ӏ"],["◌ӏ","ӏ"],"Й","й","Ӣ","ӣ","Ѝ","ѝ","Ҋ","ҋ","Ӥ","ӥ","Ј","ј","К","к","Ќ","ќ","Қ","қ","Ҝ","ҝ","Ҟ","ҟ","Ҡ","ҡ","Ӄ","ӄ","Ԛ","ԛ","Л","л","Љ","љ","Ԉ","ԉ","Ԓ","ԓ","Ӆ","ӆ","М","м","Ӎ","ӎ","Н","н","Њ","њ","Ң","ң","Ҥ","ҥ","Ӈ","ӈ","Ԋ","ԋ","Ӊ","ӊ","О","о","Ҩ","ҩ","Ӧ","ӧ","Ө","ө","Ӫ","ӫ","П","п","Ԥ","ԥ","Ҧ","ҧ","Р","р","Ҏ","ҏ","С","с","Ҫ","ҫ","Т","т","Ћ","ћ","Ԍ","ԍ","Ҭ","ҭ","Ԏ","ԏ","У","у","Ў","ў","Ӯ","ӯ","Ӱ","ӱ","Ӳ","ӳ","Ү","ү","Ұ","ұ","Ф","ф","Х","х","Ҳ","ҳ","Ӽ","ӽ","Ӿ","ӿ","Һ","һ","Ц","ц","Ч","ч","Ҵ","ҵ","Ҷ","ҷ","Ҹ","ҹ","Ӌ","ӌ","Ӵ","ӵ","Џ","џ","Ш","ш","Щ","щ","Ъ","ъ","Ы","ы","Ӹ","ӹ","Ь","ь","Ҍ","ҍ","Э","э","Ӭ","ӭ","Ю","ю","Я","я","Ԝ","ԝ","Ѡ","ѡ","Ѣ","ѣ","Ѥ","ѥ","Ѧ","ѧ","Ѩ","ѩ","Ѫ","ѫ","Ѭ","ѭ","Ѯ","ѯ","Ѱ","ѱ","Ѳ","ѳ","Ѵ","ѵ","Ѷ","ѷ","Ѹ","ѹ","Ѻ","ѻ","Ѽ","ѽ","Ѿ","ѿ","Ҁ","ҁ"],"arabic":["ا","ب","ت","ث","ج","ح","خ","د","ذ","ر","ز","س","ش","ص","ض","ط","ظ","ع","غ","ف","ق","ك","ل","م","ن","ه","و","ي","ء","آ","أ","إ","ٱ","ؤ","ئ","ى","ة","َ","ُ","ِ","ً","ٌ","ٍ","ّ","ْ","ٰ","،","؛","؟","ـ","٠","١","٢","٣","٤","٥","٦","٧","٨","٩","٪","٫","٬","٭",["ZWNJ","‌"],["ZWJ","‍"]],"arabicextended":["ٲ","ٳ","ٴ","ٵ","ݳ","ݴ","ٮ","ٻ","پ","ڀ","ݐ","ݑ","ݒ","ݓ","ݔ","ݕ","ݖ","ٹ","ٺ","ټ","ٽ","ٿ","ځ","ڂ","ڃ","ڄ","څ","چ","ڇ","ڿ","ݗ","ݘ","ݮ","ݯ","ݲ","ݼ","ڈ","ډ","ڊ","ڋ","ڌ","ڍ","ڎ","ڏ","ڐ","ۮ","ݙ","ݚ","ڑ","ڒ","ړ","ڔ","ڕ","ږ","ڗ","ژ","ڙ","ۯ","ݛ","ݫ","ݬ","ݱ","ښ","ڛ","ڜ","ݽ","ۺ","ݜ","ݭ","ݰ","ݾ","ڝ","ڞ","ۻ","ڟ","ڠ","ݝ","ݞ","ݟ","ۼ","ڡ","ڢ","ڣ","ڤ","ڥ","ڦ","ݠ","ݡ","ٯ","ڧ","ڨ","ػ","ؼ","ک","ڪ","ګ","ڬ","ڭ","ڮ","گ","ڰ","ڱ","ڲ","ڳ","ڴ","ݢ","ݣ","ݤ","ݿ","ڵ","ڶ","ڷ","ڸ","ݪ","ݥ","ݦ","ڹ","ں","ڻ","ڼ","ڽ","ݧ","ݨ","ݩ","ھ","ۀ","ہ","ۂ","ۃ","ە","ۿ","ٶ","ٷ","ۄ","ۅ","ۆ","ۇ","ۈ","ۉ","ۊ","ۋ","ۏ","ݸ","ݹ","ؠ","ؽ","ؾ","ؿ","ٸ","ی","ۍ","ێ","ې","ۑ","ے","ۓ","ݵ","ݶ","ݷ","ݺ","ݻ","ٖ","ٗ","٘","ٙ","ٚ","ٛ","ٜ","ٝ","ٞ","ٟ","۔","۽","۾","۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"],"hebrew":["א","ב","ג","ד","ה","ו","ז","ח","ט","י","כ","ך","ל","מ","ם","נ","ן","ס","ע","פ","ף","צ","ץ","ק","ר","ש","ת","װ","ױ","ײ","׳","״","־","–",{"label":"„”","action":{"type":"encapsulate","options":{"pre":"„","post":"”"}}},{"label":"‚’","action":{"type":"encapsulate","options":{"pre":"‚","post":"’"}}},["◌ְ","ְ"],["◌ֱ","ֱ"],["◌ֲ","ֲ"],["◌ֳ","ֳ"],["◌ִ","ִ"],["◌ֵ","ֵ"],["◌ֶ","ֶ"],["◌ַ","ַ"],["◌ָ","ָ"],["◌ֹ","ֹ"],["◌ֻ","ֻ"],["◌ּ","ּ"],["◌ׁ","ׁ"],["◌ׂ","ׂ"],["◌ׇ","ׇ"],["◌֑","֑"],["◌֒","֒"],["◌֓","֓"],["◌֔","֔"],["◌֕","֕"],["◌֖","֖"],["◌֗","֗"],["◌֘","֘"],["◌֙","֙"],["◌֚","֚"],["◌֛","֛"],["◌֜","֜"],["◌֝","֝"],["◌֞","֞"],["◌֟","֟"],["◌֠","֠"],["◌֡","֡"],["◌֢","֢"],["◌֣","֣"],["◌֤","֤"],["◌֥","֥"],["◌֦","֦"],["◌֧","֧"],["◌֨","֨"],["◌֩","֩"],["◌֪","֪"],["◌֫","֫"],["◌֬","֬"],["◌֭","֭"],["◌֮","֮"],["◌֯","֯"],["◌ֿ","ֿ"],["◌׀","׀"],["◌׃","׃"]],"bangla":["অ","আ","ই","ঈ","উ","ঊ","ঋ","এ","ঐ","ও","ঔ","া","ি","ী","ু","ূ","ৃ","ে","ৈ","ো","ৌ","ক","খ","গ","ঘ","ঙ","চ","ছ","জ","ঝ","ঞ","ট","ঠ","ড","ঢ","ণ","ত","থ","দ","ধ","ন","প","ফ","ব","ভ","ম","য","র","ল","শ","ষ","স","হ","ড়","ঢ়","য়","ৎ","ং","ঃ","ঁ","্","১","২","৩","৪","৫","৬","৭","৮","৯","০"],"tamil":["௦","௧","௨","௩","௪","௫","௬","௭","௮","௯","௰","௱","௲","௳","௴","௵","௶","௷","௸","௹","௺","ௐ"],"telugu":["ఁ","ం","ః","అ","ఆ","ఇ","ఈ","ఉ","ఊ","ఋ","ౠ","ఌ","ౡ","ఎ","ఏ","ఐ","ఒ","ఓ","ఔ","క","ఖ","గ","ఘ","ఙ","చ","ఛ","జ","ఝ","ఞ","ట","ఠ","డ","ఢ","ణ","త","థ","ద","ధ","న","ప","ఫ","బ","భ","మ","య","ర","ఱ","ల","ళ","వ","శ","ష","స","హ","ా","ి","ీ","ు","ూ","ృ","ౄ","ె","ే","ై","ొ","ో","ౌ","్","ౢ","ౣ","ౘ","ౙ","౦","౧","౨","౩","౪","౫","౬","౭","౮","౯","ఽ","౸","౹","౺","౻","౼","౽","౾","౿"],"sinhala":["අ","ආ","ඇ","ඈ","ඉ","ඊ","උ","ඌ","ඍ","ඎ","ඏ","ඐ","එ","ඒ","ඓ","ඔ","ඕ","ඖ","ක","ඛ","ග","ඝ","ඞ","ඟ","ච","ඡ","ජ","ඣ","ඤ","ඥ","ඦ","ට","ඨ","ඩ","ඪ","ණ","ඬ","ත","ථ","ද","ධ","න","ඳ","ප","ඵ","බ","භ","ම","ඹ","ය","ර","ල","ව","ශ","ෂ","ස","හ","ළ","ෆ",["◌ා","ා"],["◌ැ","ැ"],["◌ෑ","ෑ"],["◌ි","ි"],["◌ී","ී"],["◌ු","ු"],["◌ූ","ූ"],["◌ෘ","ෘ"],["◌ෲ","ෲ"],["◌ෟ","ෟ"],["◌ෳ","ෳ"],["◌ෙ","ෙ"],["◌ේ","ේ"],["◌ො","ො"],["◌ෝ","ෝ"],["◌ෞ","ෞ"],["◌්","්"]],"devanagari":["ऀ","ँ","ं","ः","ऄ","अ","आ","इ","ई","उ","ऊ","ऋ","ऌ","ऍ","ऎ","ए","ऐ","ऑ","ऒ","ओ","औ","क","ख","ग","घ","ङ","च","छ","ज","झ","ञ","ट","ठ","ड","ढ","ण","त","थ","द","ध","न","ऩ","प","फ","ब","भ","म","य","र","ऱ","ल","ळ","ऴ","व","श","ष","स","ह","ऺ","ऻ","़","ऽ","ा","ि","ी","ु","ू","ृ","ॄ","ॅ","ॆ","े","ै","ॉ","ॊ","ो","ौ","्","ॎ","ॏ","ॐ","॑","॒","॓","॔","ॕ","ॖ","ॗ","क़","ख़","ग़","ज़","ड़","ढ़","फ़","य़","ॠ","ॡ","ॢ","ॣ","।","॥","०","१","२","३","४","५","६","७","८","९","॰","ॱ","ॲ","ॳ","ॴ","ॵ","ॶ","ॷ","ॹ","ॺ","ॻ","ॼ","ॽ","ॾ","ॿ"],"gujarati":["ૐ","ઁ","ં","ઃ","અ","આ","ઇ","ઈ","ઉ","ઊ","એ","ઐ","ઓ","ઔ","અં","ઋ","ઍ","ઑ","ઌ","ૠ","ૡ","ક","ખ","ગ","ઘ","ઙ","ચ","છ","જ","ઝ","ઞ","ટ","ઠ","ડ","ઢ","ણ","ત","થ","દ","ધ","ન","પ","ફ","બ","ભ","મ","ય","ર","લ","ળ","વ","શ","ષ","સ","હ","ક્ષ","જ્ઞ","ઽ","ા","િ","ી","ી","ુ","ૂ","ૃ","ૄ","ૅ","ે","ૈ","ૉ","ો","ૌ","ૢ","ૣ","્","૦","૧","૨","૩","૪","૫","૬","૭","૮","૯","૱"],"thai":["ก","ข","ฃ","ค","ฅ","ฆ","ง","จ","ฉ","ช","ซ","ฌ","ญ","ฎ","ฏ","ฐ","ฑ","ฒ","ณ","ด","ต","ถ","ท","ธ","น","บ","ป","ผ","ฝ","พ","ฟ","ภ","ม","ย","ร","ฤ","ล","ฦ","ว","ศ","ษ","ส","ห","ฬ","อ","ฮ","ะ","ั","า","ๅ","ำ","ิ","ี","ึ","ื","ุ","ู","เ","แ","โ","ใ","ไ","็","่","้","๊","๋","์","ํ","ฺ","๎","๐","๑","๒","๓","๔","๕","๖","๗","๘","๙","฿","ๆ","ฯ","๚","๏","๛"],"lao":["ກ","ຂ","ຄ","ງ","ຈ","ສ","ຊ","ຍ","ດ","ຕ","ຖ","ທ","ນ","ບ","ປ","ຜ","ຝ","ພ","ຟ","ມ","ຢ","ລ","ວ","ຫ","ອ","ຮ","ຣ","ໜ","ໝ","ຼ","ຽ","ະ","ັ","າ","ຳ","ິ","ີ","ຶ","ື","ຸ","ູ","ົ","ເ","ແ","ໂ","ໃ","ໄ","່","້","໊","໋","໌","ໍ","໐","໑","໒","໓","໔","໕","໖","໗","໘","໙","₭","ໆ","ຯ"],"khmer":["ក","ខ","គ","ឃ","ង","ច","ឆ","ជ","ឈ","ញ","ដ","ឋ","ឌ","ឍ","ណ","ត","ថ","ទ","ធ","ន","ប","ផ","ព","ភ","ម","យ","រ","ល","វ","ស","ហ","ឡ","អ","ឣ","ឤ","ឥ","ឦ","ឧ","ឨ","ឩ","ឪ","ឫ","ឬ","ឭ","ឮ","ឯ","ឰ","ឱ","ឲ","ឳ","្","឴","឵","ា","ិ","ី","ឹ","ឺ","ុ","ូ","ួ","ើ","ឿ","ៀ","េ","ែ","ៃ","ោ","ៅ","ំ","ះ","ៈ","៉","៊","់","៌","៍","៎","៏","័","៑","៓","៝","ៜ","០","១","២","៣","៤","៥","៦","៧","៨","៩","៛","។","៕","៖","ៗ","៘","៙","៚","៰","៱","៲","៳","៴","៵","៶","៷","៸","៹","᧠","᧡","᧢","᧣","᧤","᧥","᧦","᧧","᧨","᧩","᧪","᧫","᧬","᧭","᧮","᧯","᧰","᧱","᧲","᧳","᧴","᧵","᧶","᧷","᧸","᧹","᧺","᧻","᧼","᧽","᧾","᧿"]}
\ No newline at end of file
+{
+       "latin": [
+               "Á", "á", "À", "à", "Â", "â", "Ä", "ä", "Ã", "ã", "Ǎ", "ǎ", "Ā", "ā", "Ă", "ă", "Ą", "ą", "Å", "å", "Ć", "ć", "Ĉ", "ĉ", "Ç", "ç", "Č", "č", "Ċ", "ċ", "Đ", "đ", "Ď", "ď", "É", "é", "È", "è", "Ê", "ê", "Ë", "ë", "Ě", "ě", "Ē", "ē", "Ĕ", "ĕ", "Ė", "ė", "Ę", "ę", "Ĝ", "ĝ", "Ģ", "ģ", "Ğ", "ğ", "Ġ", "ġ", "Ĥ", "ĥ", "Ħ", "ħ", "Í", "í", "Ì", "ì", "Î", "î", "Ï", "ï", "Ĩ", "ĩ", "Ǐ", "ǐ", "Ī", "ī", "Ĭ", "ĭ", "İ", "ı", "Į", "į", "Ĵ", "ĵ", "Ķ", "ķ", "Ĺ", "ĺ", "Ļ", "ļ", "Ľ", "ľ", "Ł", "ł", "Ń", "ń", "Ñ", "ñ", "Ņ", "ņ", "Ň", "ň", "Ó", "ó", "Ò", "ò", "Ô", "ô", "Ö", "ö", "Õ", "õ", "Ǒ", "ǒ", "Ō", "ō", "Ŏ", "ŏ", "Ǫ", "ǫ", "Ő", "ő", "Ŕ", "ŕ", "Ŗ", "ŗ", "Ř", "ř", "Ś", "ś", "Ŝ", "ŝ", "Ş", "ş", "Š", "š", "Ș", "ș", "Ț", "ț", "Ť", "ť", "Ú", "ú", "Ù", "ù", "Û", "û", "Ü", "ü", "Ũ", "ũ", "Ů", "ů", "Ǔ", "ǔ", "Ū", "ū", "ǖ", "ǘ", "ǚ", "ǜ", "Ŭ", "ŭ", "Ų", "ų", "Ű", "ű", "Ŵ", "ŵ", "Ý", "ý", "Ŷ", "ŷ", "Ÿ", "ÿ", "Ȳ", "ȳ", "Ź", "ź", "Ž", "ž", "Ż", "ż", "Æ", "æ", "Ǣ", "ǣ", "Ø", "ø", "Œ", "œ", "ß", "Ð", "ð", "Þ", "þ", "Ə", "ə"
+       ],
+       "latinextended": [
+               "Ḁ", "ḁ", "ẚ", "Ạ", "ạ", "Ả", "ả", "Ấ", "ấ", "Ầ", "ầ", "Ẩ", "ẩ", "Ẫ", "ẫ", "Ậ", "ậ", "Ắ", "ắ", "Ằ", "ằ", "Ẳ", "ẳ", "Ẵ", "ẵ", "Ặ", "ặ", "Ḃ", "ḃ", "Ḅ", "ḅ", "Ḇ", "ḇ", "Ḉ", "ḉ", "Ḋ", "ḋ", "Ḍ", "ḍ", "Ḏ", "ḏ", "Ḑ", "ḑ", "Ḓ", "ḓ", "Ḕ", "ḕ", "Ḗ", "ḗ", "Ḙ", "ḙ", "Ḛ", "ḛ", "Ḝ", "ḝ", "Ẹ", "ẹ", "Ẻ", "ẻ", "Ẽ", "ẽ", "Ế", "ế", "Ề", "ề", "Ể", "ể", "Ễ", "ễ", "Ệ", "ệ", "Ḟ", "ḟ", "Ḡ", "ḡ", "Ḣ", "ḣ", "Ḥ", "ḥ", "Ḧ", "ḧ", "Ḩ", "ḩ", "Ḫ", "ḫ", "ẖ", "Ḭ", "ḭ", "Ḯ", "ḯ", "Ỉ", "ỉ", "Ị", "ị", "Ḱ", "ḱ", "Ḳ", "ḳ", "Ḵ", "ḵ", "Ḷ", "ḷ", "Ḹ", "ḹ", "Ḻ", "ḻ", "Ḽ", "ḽ", "Ỻ", "ỻ", "Ḿ", "ḿ", "Ṁ", "ṁ", "Ṃ", "ṃ", "Ṅ", "ṅ", "Ṇ", "ṇ", "Ṉ", "ṉ", "Ṋ", "ṋ", "Ṍ", "ṍ", "Ṏ", "ṏ", "Ṑ", "ṑ", "Ṓ", "ṓ", "Ọ", "ọ", "Ỏ", "ỏ", "Ố", "ố", "Ồ", "ồ", "Ổ", "ổ", "Ỗ", "ỗ", "Ộ", "ộ", "Ớ", "ớ", "Ờ", "ờ", "Ở", "ở", "Ỡ", "ỡ", "Ợ", "ợ", "Ǿ", "ǿ", "Ơ", "ơ", "Ṕ", "ṕ", "Ṗ", "ṗ", "Ṙ", "ṙ", "Ṛ", "ṛ", "Ṝ", "ṝ", "Ṟ", "ṟ", "Ṡ", "ṡ", "ẛ", "Ṣ", "ṣ", "Ṥ", "ṥ", "Ṧ", "ṧ", "Ṩ", "ṩ", "ẜ", "ẝ", "Ṫ", "ṫ", "Ṭ", "ṭ", "Ṯ", "ṯ", "Ṱ", "ṱ", "ẗ", "Ṳ", "ṳ", "Ṵ", "ṵ", "Ṷ", "ṷ", "Ṹ", "ṹ", "Ṻ", "ṻ", "Ụ", "ụ", "Ủ", "ủ", "Ứ", "ứ", "Ừ", "ừ", "Ử", "ử", "Ữ", "ữ", "Ự", "ự", "Ư", "ư", "Ǖ", "Ǘ", "Ǚ", "Ǜ", "Ṽ", "ṽ", "Ṿ", "ṿ", "Ỽ", "ỽ", "Ẁ", "ẁ", "Ẃ", "ẃ", "Ẅ", "ẅ", "Ẇ", "ẇ", "Ẉ", "ẉ", "ẘ", "Ẋ", "ẋ", "Ẍ", "ẍ", "Ẏ", "ẏ", "ẙ", "Ỳ", "ỳ", "Ỵ", "ỵ", "Ỷ", "ỷ", "Ỹ", "ỹ", "Ỿ", "ỿ", "Ẑ", "ẑ", "Ẓ", "ẓ", "Ẕ", "ẕ", "Ǽ", "ǽ", "ẞ", "ẟ"
+       ],
+       "ipa": [
+               "p", "t̪", "t", "ʈ", "c", "k", "q", "ʡ", "ʔ", "b", "d̪", "d", "ɖ", "ɟ", "ɡ", "ɢ", "ɓ", "ɗ", "ʄ", "ɠ", "ʛ", "t͡s", "t͡ʃ", "t͡ɕ", "d͡z", "d͡ʒ", "d͡ʑ", "ɸ", "f", "θ", "s", "ʃ", "ʅ", "ʆ", "ʂ", "ɕ", "ç", "ɧ", "x", "χ", "ħ", "ʜ", "h", "β", "v", "ʍ", "ð", "z", "ʒ", "ʓ", "ʐ", "ʑ", "ʝ", "ɣ", "ʁ", "ʕ", "ʖ", "ʢ", "ɦ", "ɬ", "ɮ", "m", "m̩", "ɱ", "ɱ̩", "ɱ̍", "n̪", "n̪̍", "n", "n̩", "ɳ", "ɳ̩", "ɲ", "ɲ̩", "ŋ", "ŋ̍", "ŋ̩", "ɴ", "ɴ̩", "ʙ", "ʙ̩", "r", "r̩", "ʀ", "ʀ̩", "ɾ", "ɽ", "ɿ", "ɺ", "l̪", "l̪̩", "l", "l̩", "ɫ", "ɫ̩", "ɭ", "ɭ̩", "ʎ", "ʎ̩", "ʟ", "ʟ̩", "w", "ɥ", "ʋ", "ɹ", "ɻ", "j", "ɰ", "ʘ", "ǂ", "ǀ", "!", "ǁ", "ʰ", "ʱ", "ʷ", "ʸ", "ʲ", "ʳ", "ⁿ", "ˡ", "ʴ", "ʵ", "ˢ", "ˣ", "ˠ", "ʶ", "ˤ", "ˁ", "ˀ", "ʼ", "i", "i̯", "ĩ", "y", "y̯", "ỹ", "ɪ", "ɪ̯", "ɪ̃", "ʏ", "ʏ̯", "ʏ̃", "ɨ", "ɨ̯", "ɨ̃", "ʉ", "ʉ̯", "ʉ̃", "ɯ", "ɯ̯", "ɯ̃", "u", "u̯", "ũ", "ʊ", "ʊ̯", "ʊ̃", "e", "e̯", "ẽ", "ø", "ø̯", "ø̃", "ɘ", "ɘ̯", "ɘ̃", "ɵ", "ɵ̯", "ɵ̃", "ɤ", "ɤ̯", "ɤ̃", "o", "o̯", "õ", "ɛ", "ɛ̯", "ɛ̃", "œ", "œ̯", "œ̃", "ɜ", "ɜ̯", "ɜ̃", "ə", "ə̯", "ə̃", "ɞ", "ɞ̯", "ɞ̃", "ʌ", "ʌ̯", "ʌ̃", "ɔ", "ɔ̯", "ɔ̃", "æ", "æ̯", "æ̃", "ɶ", "ɶ̯", "ɶ̃", "a", "a̯", "ã", "ɐ", "ɐ̯", "ɐ̃", "ɑ", "ɑ̯", "ɑ̃", "ɒ", "ɒ̯", "ɒ̃", "ˈ", "ˌ", "ː", "ˑ", "˘", ".", "‿", "|", "‖", "ɚ", "ɝ"
+       ],
+       "symbols": [
+               "~", "|", "¡", "¿", "†", "‡", "↔", "↑", "↓", "•", "¶", "#", "½", "⅓", "⅔", "¼", "¾", "⅛", "⅜", "⅝", "⅞", "∞", "‘", "’",
+               {
+                       "label": "“”",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "“",
+                                       "post": "”"
+                               }
+                       }
+               },
+               {
+                       "label": "„“",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "„",
+                                       "post": "“"
+                               }
+                       }
+               },
+               {
+                       "label": "„”",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "„",
+                                       "post": "”"
+                               }
+                       }
+               },
+               {
+                       "label": "«»",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "«",
+                                       "post": "»"
+                               }
+                       }
+               },
+               "¤", "₳", "฿", "₵", "¢", "₡", "₢", "$", "₫", "₯", "€", "₠", "₣", "ƒ", "₴", "₭", "₤", "ℳ", "₥", "₦", "№", "₧", "₰", "£", "៛", "₨", "₪", "৳", "₮", "₩", "¥", "♠", "♣", "♥", "♦", "m²", "m³",
+               {
+                       "label": "–",
+                       "titleMsg": "special-characters-title-endash",
+                       "action": {
+                               "type": "replace",
+                               "options": {
+                                       "peri": "–",
+                                       "selectPeri": false
+                               }
+                       }
+               },
+               {
+                       "label": "—",
+                       "titleMsg": "special-characters-title-emdash",
+                       "action": {
+                               "type": "replace",
+                               "options": {
+                                       "peri": "—",
+                                       "selectPeri": false
+                               }
+                       }
+               },
+               "…", "‘", "’", "“", "”", "°", "′", "″", "≈", "≠", "≤", "≥", "±",
+               {
+                       "label": "−",
+                       "titleMsg": "special-characters-title-minus",
+                       "action": {
+                               "type": "replace",
+                               "options": {
+                                       "peri": "−",
+                                       "selectPeri": false
+                               }
+                       }
+               },
+               "×", "÷", "←", "→", "·", "§", "‽"
+       ],
+       "greek": [
+               "Α", "Ά", "α", "ά", "Β", "β", "Γ", "γ", "Δ", "δ", "Ε", "Έ", "ε", "έ", "Ζ", "ζ", "Η", "Ή", "η", "ή", "Θ", "θ", "Ι", "Ί", "ι", "ί", "Κ", "κ", "Λ", "λ", "Μ", "μ", "Ν", "ν", "Ξ", "ξ", "Ο", "Ό", "ο", "ό", "Π", "π", "Ρ", "ρ", "Σ", "σ", "ς", "Τ", "τ", "Υ", "Ύ", "υ", "ύ", "Φ", "φ", "Χ", "χ", "Ψ", "ψ", "Ω", "Ώ", "ω", "ώ"
+       ],
+       "cyrillic": [
+               "А", "а", "Ӑ", "ӑ", "Ӓ", "ӓ", "Ә", "ә", "Ӛ", "ӛ", "Б", "б", "В", "в", "Г", "г", "Ґ", "ґ", "Ӷ", "ӷ", "Ѓ", "ѓ", "Ӻ", "ӻ", "Ғ", "ғ", "Ҕ", "ҕ", "Д", "д", "Ԁ", "ԁ", "Ԃ", "ԃ", "Ђ", "ђ", "Е", "е", "Ѐ", "ѐ", "Є", "є", "Ё", "ё", "Ӗ", "ӗ", "Ҽ", "ҽ", "Ҿ", "ҿ", "Ж", "ж", "Җ", "җ", "Ӂ", "ӂ", "Ӝ", "ӝ", "З", "з", "Ҙ", "ҙ", "Ӟ", "ӟ", "Ԑ", "ԑ", "Ӡ", "ӡ", "Ѕ", "ѕ", "Ԅ", "ԅ", "Ԇ", "ԇ", "И", "и", "І", "і", "Ї", "ї",
+               [
+                       "◌Ӏ",
+                       "Ӏ"
+               ],
+               [
+                       "◌ӏ",
+                       "ӏ"
+               ],
+               "Й", "й", "Ӣ", "ӣ", "Ѝ", "ѝ", "Ҋ", "ҋ", "Ӥ", "ӥ", "Ј", "ј", "К", "к", "Ќ", "ќ", "Қ", "қ", "Ҝ", "ҝ", "Ҟ", "ҟ", "Ҡ", "ҡ", "Ӄ", "ӄ", "Ԛ", "ԛ", "Л", "л", "Љ", "љ", "Ԉ", "ԉ", "Ԓ", "ԓ", "Ӆ", "ӆ", "М", "м", "Ӎ", "ӎ", "Н", "н", "Њ", "њ", "Ң", "ң", "Ҥ", "ҥ", "Ӈ", "ӈ", "Ԋ", "ԋ", "Ӊ", "ӊ", "О", "о", "Ҩ", "ҩ", "Ӧ", "ӧ", "Ө", "ө", "Ӫ", "ӫ", "П", "п", "Ԥ", "ԥ", "Ҧ", "ҧ", "Р", "р", "Ҏ", "ҏ", "С", "с", "Ҫ", "ҫ", "Т", "т", "Ћ", "ћ", "Ԍ", "ԍ", "Ҭ", "ҭ", "Ԏ", "ԏ", "У", "у", "Ў", "ў", "Ӯ", "ӯ", "Ӱ", "ӱ", "Ӳ", "ӳ", "Ү", "ү", "Ұ", "ұ", "Ф", "ф", "Х", "х", "Ҳ", "ҳ", "Ӽ", "ӽ", "Ӿ", "ӿ", "Һ", "һ", "Ц", "ц", "Ч", "ч", "Ҵ", "ҵ", "Ҷ", "ҷ", "Ҹ", "ҹ", "Ӌ", "ӌ", "Ӵ", "ӵ", "Џ", "џ", "Ш", "ш", "Щ", "щ", "Ъ", "ъ", "Ы", "ы", "Ӹ", "ӹ", "Ь", "ь", "Ҍ", "ҍ", "Э", "э", "Ӭ", "ӭ", "Ю", "ю", "Я", "я", "Ԝ", "ԝ", "Ѡ", "ѡ", "Ѣ", "ѣ", "Ѥ", "ѥ", "Ѧ", "ѧ", "Ѩ", "ѩ", "Ѫ", "ѫ", "Ѭ", "ѭ", "Ѯ", "ѯ", "Ѱ", "ѱ", "Ѳ", "ѳ", "Ѵ", "ѵ", "Ѷ", "ѷ", "Ѹ", "ѹ", "Ѻ", "ѻ", "Ѽ", "ѽ", "Ѿ", "ѿ", "Ҁ", "ҁ"
+       ],
+       "arabic": [
+               "ا", "ب", "ت", "ث", "ج", "ح", "خ", "د", "ذ", "ر", "ز", "س", "ش", "ص", "ض", "ط", "ظ", "ع", "غ", "ف", "ق", "ك", "ل", "م", "ن", "ه", "و", "ي", "ء", "آ", "أ", "إ", "ٱ", "ؤ", "ئ", "ى", "ة", "َ", "ُ", "ِ", "ً", "ٌ", "ٍ", "ّ", "ْ", "ٰ", "،", "؛", "؟", "ـ", "٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٪", "٫", "٬", "٭",
+               [
+                       "zwnj",
+                       "‌"
+               ],
+               [
+                       "zwj",
+                       "‍"
+               ]
+       ],
+       "arabicextended": [
+               "ٲ", "ٳ", "ٴ", "ٵ", "ݳ", "ݴ", "ٮ", "ٻ", "پ", "ڀ", "ݐ", "ݑ", "ݒ", "ݓ", "ݔ", "ݕ", "ݖ", "ٹ", "ٺ", "ټ", "ٽ", "ٿ", "ځ", "ڂ", "ڃ", "ڄ", "څ", "چ", "ڇ", "ڿ", "ݗ", "ݘ", "ݮ", "ݯ", "ݲ", "ݼ", "ڈ", "ډ", "ڊ", "ڋ", "ڌ", "ڍ", "ڎ", "ڏ", "ڐ", "ۮ", "ݙ", "ݚ", "ڑ", "ڒ", "ړ", "ڔ", "ڕ", "ږ", "ڗ", "ژ", "ڙ", "ۯ", "ݛ", "ݫ", "ݬ", "ݱ", "ښ", "ڛ", "ڜ", "ݽ", "ۺ", "ݜ", "ݭ", "ݰ", "ݾ", "ڝ", "ڞ", "ۻ", "ڟ", "ڠ", "ݝ", "ݞ", "ݟ", "ۼ", "ڡ", "ڢ", "ڣ", "ڤ", "ڥ", "ڦ", "ݠ", "ݡ", "ٯ", "ڧ", "ڨ", "ػ", "ؼ", "ک", "ڪ", "ګ", "ڬ", "ڭ", "ڮ", "گ", "ڰ", "ڱ", "ڲ", "ڳ", "ڴ", "ݢ", "ݣ", "ݤ", "ݿ", "ڵ", "ڶ", "ڷ", "ڸ", "ݪ", "ݥ", "ݦ", "ڹ", "ں", "ڻ", "ڼ", "ڽ", "ݧ", "ݨ", "ݩ", "ھ", "ۀ", "ہ", "ۂ", "ۃ", "ە", "ۿ", "ٶ", "ٷ", "ۄ", "ۅ", "ۆ", "ۇ", "ۈ", "ۉ", "ۊ", "ۋ", "ۏ", "ݸ", "ݹ", "ؠ", "ؽ", "ؾ", "ؿ", "ٸ", "ی", "ۍ", "ێ", "ې", "ۑ", "ے", "ۓ", "ݵ", "ݶ", "ݷ", "ݺ", "ݻ", "ٖ", "ٗ", "٘", "ٙ", "ٚ", "ٛ", "ٜ", "ٝ", "ٞ", "ٟ", "۔", "۽", "۾", "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"
+       ],
+       "hebrew": [
+               "א", "ב", "ג", "ד", "ה", "ו", "ז", "ח", "ט", "י", "כ", "ך", "ל", "מ", "ם", "נ", "ן", "ס", "ע", "פ", "ף", "צ", "ץ", "ק", "ר", "ש", "ת", "װ", "ױ", "ײ", "׳", "״", "־", "–",
+               {
+                       "label": "„”",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "„",
+                                       "post": "”"
+                               }
+                       }
+               },
+               {
+                       "label": "‚’",
+                       "action": {
+                               "type": "encapsulate",
+                               "options": {
+                                       "pre": "‚",
+                                       "post": "’"
+                               }
+                       }
+               },
+               [
+                       "◌ְ",
+                       "ְ"
+               ],
+               [
+                       "◌ֱ",
+                       "ֱ"
+               ],
+               [
+                       "◌ֲ",
+                       "ֲ"
+               ],
+               [
+                       "◌ֳ",
+                       "ֳ"
+               ],
+               [
+                       "◌ִ",
+                       "ִ"
+               ],
+               [
+                       "◌ֵ",
+                       "ֵ"
+               ],
+               [
+                       "◌ֶ",
+                       "ֶ"
+               ],
+               [
+                       "◌ַ",
+                       "ַ"
+               ],
+               [
+                       "◌ָ",
+                       "ָ"
+               ],
+               [
+                       "◌ֹ",
+                       "ֹ"
+               ],
+               [
+                       "◌ֻ",
+                       "ֻ"
+               ],
+               [
+                       "◌ּ",
+                       "ּ"
+               ],
+               [
+                       "◌ׁ",
+                       "ׁ"
+               ],
+               [
+                       "◌ׂ",
+                       "ׂ"
+               ],
+               [
+                       "◌ׇ",
+                       "ׇ"
+               ],
+               [
+                       "◌֑",
+                       "֑"
+               ],
+               [
+                       "◌֒",
+                       "֒"
+               ],
+               [
+                       "◌֓",
+                       "֓"
+               ],
+               [
+                       "◌֔",
+                       "֔"
+               ],
+               [
+                       "◌֕",
+                       "֕"
+               ],
+               [
+                       "◌֖",
+                       "֖"
+               ],
+               [
+                       "◌֗",
+                       "֗"
+               ],
+               [
+                       "◌֘",
+                       "֘"
+               ],
+               [
+                       "◌֙",
+                       "֙"
+               ],
+               [
+                       "◌֚",
+                       "֚"
+               ],
+               [
+                       "◌֛",
+                       "֛"
+               ],
+               [
+                       "◌֜",
+                       "֜"
+               ],
+               [
+                       "◌֝",
+                       "֝"
+               ],
+               [
+                       "◌֞",
+                       "֞"
+               ],
+               [
+                       "◌֟",
+                       "֟"
+               ],
+               [
+                       "◌֠",
+                       "֠"
+               ],
+               [
+                       "◌֡",
+                       "֡"
+               ],
+               [
+                       "◌֢",
+                       "֢"
+               ],
+               [
+                       "◌֣",
+                       "֣"
+               ],
+               [
+                       "◌֤",
+                       "֤"
+               ],
+               [
+                       "◌֥",
+                       "֥"
+               ],
+               [
+                       "◌֦",
+                       "֦"
+               ],
+               [
+                       "◌֧",
+                       "֧"
+               ],
+               [
+                       "◌֨",
+                       "֨"
+               ],
+               [
+                       "◌֩",
+                       "֩"
+               ],
+               [
+                       "◌֪",
+                       "֪"
+               ],
+               [
+                       "◌֫",
+                       "֫"
+               ],
+               [
+                       "◌֬",
+                       "֬"
+               ],
+               [
+                       "◌֭",
+                       "֭"
+               ],
+               [
+                       "◌֮",
+                       "֮"
+               ],
+               [
+                       "◌֯",
+                       "֯"
+               ],
+               [
+                       "◌ֿ",
+                       "ֿ"
+               ],
+               [
+                       "◌׀",
+                       "׀"
+               ],
+               [
+                       "◌׃",
+                       "׃"
+               ]
+       ],
+       "bangla": [
+               "ঀ", "অ", "আ", "ই", "ঈ", "উ", "ঊ", "ঋ", "ঌ", "এ", "ঐ", "ও", "ঔ", "া", "ি", "ী", "ু", "ূ", "ৃ", "ে", "ৈ", "ো", "ৌ", "্য", "্র", "ক", "খ", "গ", "ঘ", "ঙ", "চ", "ছ", "জ", "ঝ", "ঞ", "ট", "ঠ", "ড", "ঢ", "ণ", "ত", "থ", "দ", "ধ", "ন", "প", "ফ", "ব", "ভ", "ম", "য", "র", "ল", "শ", "ষ", "স", "হ", "ড়", "ঢ়", "য়", "ৎ", "ং", "ঃ", "ঁ", "্", "৷", "॥", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "০", "ঽ", "ৗ", "়", "ৰ", "ৱ", "৲", "৻", "৳", "৴", "৵", "৶", "৷", "৸", "৹", "৺", "ৠ", "ৡ", "ৄ", "ৢ", "ৣ", "‘", "’", "“", "”",
+               [
+                       "zws",
+                       "​"
+               ],
+               [
+                       "zwnj",
+                       "‌"
+               ],
+               [
+                       "zwj",
+                       "‍"
+               ]
+       ],
+       "tamil": [
+               "௦", "௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯", "௰", "௱", "௲", "௳", "௴", "௵", "௶", "௷", "௸", "௹", "௺", "ௐ"
+       ],
+       "telugu": [
+               "ఁ", "ం", "ః", "అ", "ఆ", "ఇ", "ఈ", "ఉ", "ఊ", "ఋ", "ౠ", "ఌ", "ౡ", "ఎ", "ఏ", "ఐ", "ఒ", "ఓ", "ఔ", "క", "ఖ", "గ", "ఘ", "ఙ", "చ", "ఛ", "జ", "ఝ", "ఞ", "ట", "ఠ", "డ", "ఢ", "ణ", "త", "థ", "ద", "ధ", "న", "ప", "ఫ", "బ", "భ", "మ", "య", "ర", "ఱ", "ల", "ళ", "వ", "శ", "ష", "స", "హ", "ా", "ి", "ీ", "ు", "ూ", "ృ", "ౄ", "ె", "ే", "ై", "ొ", "ో", "ౌ", "్", "ౢ", "ౣ", "ౘ", "ౙ", "౦", "౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯", "ఽ", "౸", "౹", "౺", "౻", "౼", "౽", "౾", "౿"
+       ],
+       "sinhala": [
+               "අ", "ආ", "ඇ", "ඈ", "ඉ", "ඊ", "උ", "ඌ", "ඍ", "ඎ", "ඏ", "ඐ", "එ", "ඒ", "ඓ", "ඔ", "ඕ", "ඖ", "ක", "ඛ", "ග", "ඝ", "ඞ", "ඟ", "ච", "ඡ", "ජ", "ඣ", "ඤ", "ඥ", "ඦ", "ට", "ඨ", "ඩ", "ඪ", "ණ", "ඬ", "ත", "ථ", "ද", "ධ", "න", "ඳ", "ප", "ඵ", "බ", "භ", "ම", "ඹ", "ය", "ර", "ල", "ව", "ශ", "ෂ", "ස", "හ", "ළ", "ෆ",
+               [
+                       "◌ා",
+                       "ා"
+               ],
+               [
+                       "◌ැ",
+                       "ැ"
+               ],
+               [
+                       "◌ෑ",
+                       "ෑ"
+               ],
+               [
+                       "◌ි",
+                       "ි"
+               ],
+               [
+                       "◌ී",
+                       "ී"
+               ],
+               [
+                       "◌ු",
+                       "ු"
+               ],
+               [
+                       "◌ූ",
+                       "ූ"
+               ],
+               [
+                       "◌ෘ",
+                       "ෘ"
+               ],
+               [
+                       "◌ෲ",
+                       "ෲ"
+               ],
+               [
+                       "◌ෟ",
+                       "ෟ"
+               ],
+               [
+                       "◌ෳ",
+                       "ෳ"
+               ],
+               [
+                       "◌ෙ",
+                       "ෙ"
+               ],
+               [
+                       "◌ේ",
+                       "ේ"
+               ],
+               [
+                       "◌ො",
+                       "ො"
+               ],
+               [
+                       "◌ෝ",
+                       "ෝ"
+               ],
+               [
+                       "◌ෞ",
+                       "ෞ"
+               ],
+               [
+                       "◌්",
+                       "්"
+               ]
+       ],
+       "devanagari": [
+               "ऀ", "ँ", "ं", "ः", "ऄ", "अ", "आ", "इ", "ई", "उ", "ऊ", "ऋ", "ऌ", "ऍ", "ऎ", "ए", "ऐ", "ऑ", "ऒ", "ओ", "औ", "क", "ख", "ग", "घ", "ङ", "च", "छ", "ज", "झ", "ञ", "ट", "ठ", "ड", "ढ", "ण", "त", "थ", "द", "ध", "न", "ऩ", "प", "फ", "ब", "भ", "म", "य", "र", "ऱ", "ल", "ळ", "ऴ", "व", "श", "ष", "स", "ह", "ऺ", "ऻ", "़", "ऽ", "ा", "ि", "ी", "ु", "ू", "ृ", "ॄ", "ॅ", "ॆ", "े", "ै", "ॉ", "ॊ", "ो", "ौ", "्", "ॎ", "ॏ", "ॐ", "॑", "॒", "॓", "॔", "ॕ", "ॖ", "ॗ", "क़", "ख़", "ग़", "ज़", "ड़", "ढ़", "फ़", "य़", "ॠ", "ॡ", "ॢ", "ॣ", "।", "॥", "०", "१", "२", "३", "४", "५", "६", "७", "८", "९", "॰", "ॱ", "ॲ", "ॳ", "ॴ", "ॵ", "ॶ", "ॷ", "ॹ", "ॺ", "ॻ", "ॼ", "ॽ", "ॾ", "ॿ"
+       ],
+       "gujarati": [
+               "ૐ", "ઁ", "ં", "ઃ", "અ", "આ", "ઇ", "ઈ", "ઉ", "ઊ", "એ", "ઐ", "ઓ", "ઔ", "અં", "ઋ", "ઍ", "ઑ", "ઌ", "ૠ", "ૡ", "ક", "ખ", "ગ", "ઘ", "ઙ", "ચ", "છ", "જ", "ઝ", "ઞ", "ટ", "ઠ", "ડ", "ઢ", "ણ", "ત", "થ", "દ", "ધ", "ન", "પ", "ફ", "બ", "ભ", "મ", "ય", "ર", "લ", "ળ", "વ", "શ", "ષ", "સ", "હ", "ક્ષ", "જ્ઞ", "ઽ", "ા", "િ", "ી", "ી", "ુ", "ૂ", "ૃ", "ૄ", "ૅ", "ે", "ૈ", "ૉ", "ો", "ૌ", "ૢ", "ૣ", "્", "૦", "૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯", "૱"
+       ],
+       "thai": [
+               "ก", "ข", "ฃ", "ค", "ฅ", "ฆ", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ", "ฎ", "ฏ", "ฐ", "ฑ", "ฒ", "ณ", "ด", "ต", "ถ", "ท", "ธ", "น", "บ", "ป", "ผ", "ฝ", "พ", "ฟ", "ภ", "ม", "ย", "ร", "ฤ", "ล", "ฦ", "ว", "ศ", "ษ", "ส", "ห", "ฬ", "อ", "ฮ", "ะ", "ั", "า", "ๅ", "ำ", "ิ", "ี", "ึ", "ื", "ุ", "ู", "เ", "แ", "โ", "ใ", "ไ", "็", "่", "้", "๊", "๋", "์", "ํ", "ฺ", "๎", "๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙", "฿", "ๆ", "ฯ", "๚", "๏", "๛"
+       ],
+       "lao": [
+               "ກ", "ຂ", "ຄ", "ງ", "ຈ", "ສ", "ຊ", "ຍ", "ດ", "ຕ", "ຖ", "ທ", "ນ", "ບ", "ປ", "ຜ", "ຝ", "ພ", "ຟ", "ມ", "ຢ", "ລ", "ວ", "ຫ", "ອ", "ຮ", "ຣ", "ໜ", "ໝ", "ຼ", "ຽ", "ະ", "ັ", "າ", "ຳ", "ິ", "ີ", "ຶ", "ື", "ຸ", "ູ", "ົ", "ເ", "ແ", "ໂ", "ໃ", "ໄ", "່", "້", "໊", "໋", "໌", "ໍ", "໐", "໑", "໒", "໓", "໔", "໕", "໖", "໗", "໘", "໙", "₭", "ໆ", "ຯ"
+       ],
+       "khmer": [
+               "ក", "ខ", "គ", "ឃ", "ង", "ច", "ឆ", "ជ", "ឈ", "ញ", "ដ", "ឋ", "ឌ", "ឍ", "ណ", "ត", "ថ", "ទ", "ធ", "ន", "ប", "ផ", "ព", "ភ", "ម", "យ", "រ", "ល", "វ", "ស", "ហ", "ឡ", "អ", "ឣ", "ឤ", "ឥ", "ឦ", "ឧ", "ឨ", "ឩ", "ឪ", "ឫ", "ឬ", "ឭ", "ឮ", "ឯ", "ឰ", "ឱ", "ឲ", "ឳ", "្", "឴", "឵", "ា", "ិ", "ី", "ឹ", "ឺ", "ុ", "ូ", "ួ", "ើ", "ឿ", "ៀ", "េ", "ែ", "ៃ", "ោ", "ៅ", "ំ", "ះ", "ៈ", "៉", "៊", "់", "៌", "៍", "៎", "៏", "័", "៑", "៓", "៝", "ៜ", "០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩", "៛", "។", "៕", "៖", "ៗ", "៘", "៙", "៚", "៰", "៱", "៲", "៳", "៴", "៵", "៶", "៷", "៸", "៹", "᧠", "᧡", "᧢", "᧣", "᧤", "᧥", "᧦", "᧧", "᧨", "᧩", "᧪", "᧫", "᧬", "᧭", "᧮", "᧯", "᧰", "᧱", "᧲", "᧳", "᧴", "᧵", "᧶", "᧷", "᧸", "᧹", "᧺", "᧻", "᧼", "᧽", "᧾", "᧿"
+       ]
+}
index eb4741f..3657b12 100644 (file)
@@ -426,7 +426,7 @@ p.mw-upload-editlicenses {
        border: 1px dashed #aaa;
 }
 
-.mw-history-revisiondelete-button, #mw-fileduplicatesearch-icon {
+.mw-history-revisionactions, #mw-fileduplicatesearch-icon {
        float: right;
 }
 
@@ -528,7 +528,7 @@ table.wikitable > tr > td,
 table.wikitable > * > tr > th,
 table.wikitable > * > tr > td {
        border: 1px solid #aaa;
-       padding: 0.3em 0.4em;
+       padding: 0.2em 0.4em;
 }
 
 table.wikitable > tr > th,
index dffc6e8..32cd79a 100644 (file)
@@ -5,7 +5,8 @@
        var msg,
                win = window,
                ua = navigator.userAgent.toLowerCase(),
-               onloadFuncts = [];
+               onloadFuncts = [],
+               loadedScripts = {};
 
        /**
         * User-agent sniffing.
 
        /**
         * Wikipage import methods
+        *
+        * See https://www.mediawiki.org/wiki/ResourceLoader/Legacy_JavaScript#wikibits.js
         */
 
-       // included-scripts tracker
-       win.loadedScripts = {};
-
-       win.importScript = function ( page ) {
+       function importScript( page ) {
                var uri = mw.config.get( 'wgScript' ) + '?title=' +
                        mw.util.wikiUrlencode( page ) +
                        '&action=raw&ctype=text/javascript';
-               return win.importScriptURI( uri );
-       };
+               return importScriptURI( uri );
+       }
 
-       win.importScriptURI = function ( url ) {
-               if ( win.loadedScripts[url] ) {
+       /**
+        * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
+        */
+       function importScriptURI( url ) {
+               if ( loadedScripts[url] ) {
                        return null;
                }
-               win.loadedScripts[url] = true;
+               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 ) {
+       function importStylesheet( page ) {
                var uri = mw.config.get( 'wgScript' ) + '?title=' +
                        mw.util.wikiUrlencode( page ) +
                        '&action=raw&ctype=text/css';
-               return win.importStylesheetURI( uri );
-       };
+               return importStylesheetURI( uri );
+       }
 
-       win.importStylesheetURI = function ( url, media ) {
+       /**
+        * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
+        */
+       function importStylesheetURI( url, media ) {
                var l = document.createElement( 'link' );
                l.rel = 'stylesheet';
                l.href = url;
                }
                document.getElementsByTagName( 'head' )[0].appendChild( l );
                return l;
-       };
+       }
+
+       msg = 'Use mw.loader instead.';
+       mw.log.deprecate( win, 'loadedScripts', loadedScripts, msg );
+       mw.log.deprecate( win, 'importScriptURI', importScriptURI, msg );
+       mw.log.deprecate( win, 'importStylesheetURI', importStylesheetURI, msg );
+       // Not quite deprecated yet.
+       win.importScript = importScript;
+       win.importStylesheet = importStylesheet;
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js b/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js
new file mode 100644 (file)
index 0000000..91366ff
--- /dev/null
@@ -0,0 +1,38 @@
+/*global OO*/
+( function ( mw ) {
+       /**
+        * This is the abstract base class for MessagePoster implementations.
+        *
+        * @abstract
+        * @class
+        *
+        * @constructor
+        * @param {mw.Title} title Title to post to
+        */
+       mw.messagePoster.MessagePoster = function MwMessagePoster() {};
+
+       OO.initClass( mw.messagePoster.MessagePoster );
+
+       /**
+        * Post a message (with subject and body) to a talk page.
+        *
+        * @param {string} subject Subject/topic title; plaintext only (no wikitext or HTML)
+        * @param {string} body Body, as wikitext.  Signature code will automatically be added
+        *   by MessagePosters that require one, unless the message already contains the string
+        *   ~~~.
+        * @return {jQuery.Promise} Promise completing when the post succeeds or fails.
+        *   For failure, will be rejected with three arguments:
+        *
+        *   - primaryError - Primary error code.  For a mw.Api failure,
+        *       this should be 'api-fail'.
+        *   - secondaryError - Secondary error code.  For a mw.Api failure,
+        *       this, should be mw.Api's code, e.g. 'http', 'ok-but-empty', or the error passed through
+        *       from the server.
+        *   - details - Further details about the error
+        *
+        * @localdoc
+        * The base class currently does nothing, but could be used for shared analytics or
+        * something.
+        */
+       mw.messagePoster.MessagePoster.prototype.post = function () {};
+}( mediaWiki ) );
diff --git a/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js b/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js
new file mode 100644 (file)
index 0000000..296576b
--- /dev/null
@@ -0,0 +1,53 @@
+/*global OO*/
+( function ( mw, $ ) {
+       /**
+        * This is an implementation of MessagePoster for wikitext talk pages.
+        *
+        * @class mw.messagePoster.WikitextMessagePoster
+        * @extends mw.messagePoster.MessagePoster
+        *
+        * @constructor
+        * @param {mw.Title} title Wikitext page in a talk namespace, to post to
+        */
+       function WikitextMessagePoster( title ) {
+               this.api = new mw.Api();
+               this.title = title;
+       }
+
+       OO.inheritClass(
+               WikitextMessagePoster,
+               mw.messagePoster.MessagePoster
+       );
+
+       /**
+        * @inheritdoc
+        */
+       WikitextMessagePoster.prototype.post = function ( subject, body ) {
+               mw.messagePoster.WikitextMessagePoster.parent.prototype.post.call( this, subject, body );
+
+               // Add signature if needed
+               if ( body.indexOf( '~~~' ) === -1 ) {
+                       body += '\n\n~~~~';
+               }
+
+               return this.api.newSection(
+                       this.title,
+                       subject,
+                       body,
+                       { redirect: true }
+               ).then( function ( resp, jqXHR ) {
+                       if ( resp.edit.result === 'Success' ) {
+                               return $.Deferred().resolve( resp, jqXHR );
+                       } else {
+                               // mediawiki.api.js checks for resp.error.  Are there actually cases where the
+                               // request fails, but it's not caught there?
+                               return $.Deferred().reject( 'api-unexpected' );
+                       }
+               }, function ( code, details ) {
+                       return $.Deferred().reject( 'api-fail', code, details );
+               } ).promise();
+       };
+
+       mw.messagePoster.factory.register( 'wikitext', WikitextMessagePoster );
+       mw.messagePoster.WikitextMessagePoster = WikitextMessagePoster;
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js b/resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
new file mode 100644 (file)
index 0000000..9d28080
--- /dev/null
@@ -0,0 +1,109 @@
+/*global OO*/
+( function ( mw, $ ) {
+       /**
+        * This is a factory for MessagePoster objects, which allows a pluggable to way to script leaving a
+        * talk page message.
+        *
+        * @class mw.messagePoster.factory
+        * @singleton
+        */
+       function MwMessagePosterFactory() {
+               this.api = new mw.Api();
+               this.contentModelToClass = {};
+       }
+
+       OO.initClass( MwMessagePosterFactory );
+
+       // Note: This registration scheme is currently not compatible with LQT, since that doesn't
+       // have its own content model, just islqttalkpage.  LQT pages will be passed to the wikitext
+       // MessagePoster.
+       /**
+        * Registers a MessagePoster subclass for a given content model.
+        *
+        * @param {string} contentModel Content model of pages this MessagePoster can post to
+        * @param {Function} messagePosterConstructor Constructor for MessagePoster
+        */
+       MwMessagePosterFactory.prototype.register = function ( contentModel, messagePosterConstructor ) {
+               if ( this.contentModelToClass[contentModel] !== undefined ) {
+                       throw new Error( 'The content model \'' + contentModel + '\' is already registered.' );
+               }
+
+               this.contentModelToClass[contentModel] = messagePosterConstructor;
+       };
+
+       /**
+        * Unregisters a given content model
+        * This is exposed for testing and should not normally be needed.
+        *
+        * @param {string} contentModel Content model to unregister
+        */
+       MwMessagePosterFactory.prototype.unregister = function ( contentModel ) {
+               delete this.contentModelToClass[contentModel];
+       };
+
+       /**
+        * Creates a MessagePoster, given a title.  A promise for this is returned.
+        * This works by determining the content model, then loading the corresponding
+        * module (which will register the MessagePoster class), and finally constructing it.
+        *
+        * This does not require the message and should be called as soon as possible, so it does the
+        * API and ResourceLoader requests in the background.
+        *
+        * @param {mw.Title} title Title that will be posted to
+        * @return {jQuery.Promise} Promise resolving to a mw.messagePoster.MessagePoster.
+        *   For failure, rejected with up to three arguments:
+        *
+        *   - errorCode Error code string
+        *   - error Error explanation
+        *   - details Further error details
+        */
+       MwMessagePosterFactory.prototype.create = function ( title ) {
+               var pageId, page, contentModel, moduleName,
+                       factory = this;
+
+               return this.api.get( {
+                       action: 'query',
+                       prop: 'info',
+                       indexpageids: 1,
+                       titles: title.getPrefixedDb()
+               } ).then( function ( result ) {
+                       if ( result.query.pageids.length > 0 ) {
+                               pageId = result.query.pageids[0];
+                               page = result.query.pages[pageId];
+
+                               contentModel = page.contentmodel;
+                               moduleName = 'mediawiki.messagePoster.' + contentModel;
+                               return mw.loader.using( moduleName ).then( function () {
+                                       return factory.createForContentModel(
+                                               contentModel,
+                                               title
+                                       );
+                               }, function () {
+                                       return $.Deferred().reject( 'failed-to-load-module', 'Failed to load the \'' + moduleName + '\' module' );
+                               } );
+                       } else {
+                               return $.Deferred().reject( 'unexpected-response', 'Unexpected API response' );
+                       }
+               }, function ( errorCode, details ) {
+                       return $.Deferred().reject( 'content-model-query-failed', errorCode, details );
+               } ).promise();
+       };
+
+       /**
+        * Creates a MessagePoster instance, given a title and content model
+        *
+        * @private
+        *
+        * @param {string} contentModel Content model of title
+        * @param {mw.Title} title Title being posted to
+        * @return {mw.messagePoster.MessagePoster}
+        *
+        */
+       MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title ) {
+               return new this.contentModelToClass[contentModel]( title );
+       };
+
+       mw.messagePoster = {
+               factory: new MwMessagePosterFactory()
+       };
+}( mediaWiki, jQuery ) );
index d245726..a13ec3c 100644 (file)
@@ -84,13 +84,10 @@ td#mw-prefixindex-nav-form {
        font-weight: bold;
 }
 
-.mw-specialpages-table {
-       margin-top: -1em;
-       margin-bottom: 1em;
-}
-
-.mw-specialpages-table td {
-       vertical-align: top;
+.mw-specialpages-list {
+       -webkit-columns: 16em 2;
+       -moz-columns: 16em 2;
+       columns: 16em 2;
 }
 
 /* Special:Statistics */
diff --git a/resources/src/mediawiki.special/mediawiki.special.edittags.css b/resources/src/mediawiki.special/mediawiki.special.edittags.css
new file mode 100644 (file)
index 0000000..204009c
--- /dev/null
@@ -0,0 +1,15 @@
+/*!
+ * Styling for Special:EditTags and action=editchangetags
+ */
+#mw-edittags-tags-selector td {
+       vertical-align: top;
+}
+
+#mw-edittags-tags-selector-multi td {
+       vertical-align: top;
+       padding-right: 1.5em;
+}
+
+#mw-edittags-tag-list {
+       min-width: 20em;
+}
diff --git a/resources/src/mediawiki.special/mediawiki.special.edittags.js b/resources/src/mediawiki.special/mediawiki.special.edittags.js
new file mode 100644 (file)
index 0000000..69a2a67
--- /dev/null
@@ -0,0 +1,24 @@
+/*!
+ * JavaScript for Special:EditTags
+ */
+( function ( mw, $ ) {
+       $( function () {
+               var $tagList = $( '#mw-edittags-tag-list' );
+               if ( $tagList.length ) {
+                       $tagList.chosen( {
+                               /*jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
+                               placeholder_text_multiple: mw.msg( 'tags-edit-chosen-placeholder' ),
+                               no_results_text: mw.msg( 'tags-edit-chosen-no-results' )
+                       } );
+               }
+
+               $( '#mw-edittags-remove-all' ).on( 'change', function ( e ) {
+                       $( '.mw-edittags-remove-checkbox' ).prop( 'checked', e.target.checked );
+               } );
+               $( '.mw-edittags-remove-checkbox' ).on( 'change', function ( e ) {
+                       if ( !e.target.checked ) {
+                               $( '#mw-edittags-remove-all' ).prop( 'checked', false );
+                       }
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 7c87d68..b4efa9a 100644 (file)
@@ -5,6 +5,7 @@
        font-weight: bold;
 }
 
+.mw-version-ext-license,
 .mw-version-ext-vcs-timestamp {
        white-space: nowrap;
 }
index d127232..7d7b413 100644 (file)
@@ -29,6 +29,10 @@ div.apihelp-linktrail {
        color: red;
 }
 
+.apihelp-unknown {
+       color: #888;
+}
+
 .apihelp-empty {
        color: #888;
 }
index 9a671c0..6e12f49 100644 (file)
@@ -22,8 +22,8 @@
         * dialog box. Submitting that dialog box appends its contents to a
         * wiki page that you specify, as a new section.
         *
-        * This feature works with classic MediaWiki pages
-        * and is not compatible with LiquidThreads or Flow.
+        * This feature works with any content model that defines a
+        * `mw.messagePoster.MessagePoster`.
         *
         * Minimal usage example:
         *
@@ -36,7 +36,6 @@
         * @class
         * @constructor
         * @param {Object} [config] Configuration object
-        * @cfg {mw.Api} [api] if omitted, will just create a standard API
         * @cfg {mw.Title} [title="Feedback"] The title of the page where you collect
         *  feedback.
         * @cfg {string} [dialogTitleMessageKey="feedback-dialog-title"] Message key for the
        mw.Feedback = function MwFeedback( config ) {
                config = config || {};
 
-               this.api = config.api || new mw.Api();
                this.dialogTitleMessageKey = config.dialogTitleMessageKey || 'feedback-dialog-title';
 
                // Feedback page title
                this.feedbackPageTitle = config.title || new mw.Title( 'Feedback' );
 
+               this.messagePosterPromise = mw.messagePoster.factory.create( this.feedbackPageTitle );
+
                // Links
                this.bugsTaskSubmissionLink = config.bugsLink || '//phabricator.wikimedia.org/maniphest/task/create/';
                this.bugsTaskListLink = config.bugsListLink || '//phabricator.wikimedia.org/maniphest/query/advanced';
                        case 'error1':
                        case 'error2':
                        case 'error3':
+                       case 'error4':
                                dialogConfig = {
                                        title: mw.msg( 'feedback-error-title' ),
                                        message: mw.msg( 'feedback-' + status ),
         * Modify the display form, and then open it, focusing interface on the subject.
         *
         * @param {Object} [contents] Prefilled contents for the feedback form.
-        * @param {string} [contents.subject] The subject of the feedback
-        * @param {string} [contents.message] The content of the feedback
+        * @param {string} [contents.subject] The subject of the feedback, as plaintext
+        * @param {string} [contents.message] The content of the feedback, as wikitext
         */
        mw.Feedback.prototype.launch = function ( contents ) {
                // Dialog
                        {
                                title: mw.msg( this.dialogTitleMessageKey ),
                                settings: {
-                                       api: this.api,
+                                       messagePosterPromise: this.messagePosterPromise,
                                        title: this.feedbackPageTitle,
                                        dialogTitleMessageKey: this.dialogTitleMessageKey,
                                        bugsTaskSubmissionLink: this.bugsTaskSubmissionLink,
                                this.feedbackMessageInput.setValue( data.contents.message );
 
                                this.status = '';
-                               this.api = settings.api;
+                               this.messagePosterPromise = settings.messagePosterPromise;
                                this.setBugReportLink( settings.bugsTaskSubmissionLink );
                                this.feedbackPageTitle = settings.title;
                                this.feedbackPageName = settings.title.getNameText();
                                        message = userAgentMessage + message;
                                }
 
-                               // Add signature if needed
-                               if ( message.indexOf( '~~~' ) === -1 ) {
-                                       message += '\n\n~~~~';
-                               }
-
-                               // Post the message, resolving redirects
-                               this.pushPending();
-                               this.api.newSection(
-                                       this.feedbackPageTitle,
-                                       subject,
-                                       message,
-                                       { redirect: true }
-                               )
-                               .done( function ( result ) {
-                                       if ( result.edit.result === 'Success' ) {
-                                               fb.status = 'submitted';
-                                       } else {
-                                               fb.status = 'error1';
-                                       }
-                                       fb.popPending();
-                                       fb.close();
-                               } )
-                               .fail( function ( code, result ) {
-                                       if ( code === 'http' ) {
-                                               fb.status = 'error3';
-                                               // ajax request failed
-                                               mw.log.warn( 'Feedback report failed with HTTP error: ' +  result.textStatus );
-                                       } else {
-                                               fb.status = 'error2';
-                                               mw.log.warn( 'Feedback report failed with API error: ' +  code );
-                                       }
-                                       fb.popPending();
+                               // Post the message
+                               return this.messagePosterPromise.then( function ( poster ) {
+                                       return fb.postMessage( poster, subject, message );
+                               }, function () {
+                                       fb.status = 'error4';
+                                       mw.log.warn( 'Feedback report failed because MessagePoster could not be fetched' );
+                               } ).always( function () {
                                        fb.close();
                                } );
                        }, this );
                return mw.Feedback.Dialog.super.prototype.getActionProcess.call( this, action );
        };
 
+       /**
+        * Posts the message
+        *
+        * @private
+        *
+        * @param {mw.messagePoster.MessagePoster} poster Poster implementation used to leave feedback
+        * @param {string} subject Subject of message
+        * @param {string} message Body of message
+        * @return {jQuery.Promise} Promise representing success of message posting action
+        */
+       mw.Feedback.Dialog.prototype.postMessage = function ( poster, subject, message ) {
+               var fb = this;
+
+               return poster.post(
+                       subject,
+                       message
+               ).then( function () {
+                       fb.status = 'submitted';
+               }, function ( mainCode, secondaryCode, details ) {
+                       if ( mainCode === 'api-fail' ) {
+                               if ( secondaryCode === 'http' ) {
+                                       fb.status = 'error3';
+                                       // ajax request failed
+                                       mw.log.warn( 'Feedback report failed with HTTP error: ' +  details.textStatus );
+                               } else {
+                                       fb.status = 'error2';
+                                       mw.log.warn( 'Feedback report failed with API error: ' +  secondaryCode );
+                               }
+                       } else {
+                               fb.status = 'error1';
+                       }
+               } );
+       };
+
        /**
         * @inheritdoc
         */
index ee57c21..237157c 100644 (file)
                                }
                        };
 
+                       /**
+                        * Write a message the console's error channel.
+                        *
+                        * Most browsers provide a stacktrace by default if the argument
+                        * is a caught Error object.
+                        *
+                        * @since 1.26
+                        * @param {Error|string...} msg Messages to output to console
+                        */
+                       log.error = function () {
+                               var console = window.console;
+                               if ( console && console.error && console.error.apply ) {
+                                       console.error.apply( console, arguments );
+                               }
+                       };
+
                        /**
                         * Create a property in a host object that, when accessed, will produce
                         * a deprecation warning in the console with backtrace.
index ad68967..053fb1a 100644 (file)
@@ -79,6 +79,7 @@
 
        // Restore original methods
        mw.log.warn = original.warn;
+       mw.log.error = original.error;
        mw.log.deprecate = original.deprecate;
 
 }( mediaWiki, jQuery ) );
index 7b7ccf3..f981b90 100644 (file)
@@ -12,7 +12,8 @@
                        // element (not the search form, as that would leave the buttons
                        // vertically between the input and the suggestions).
                        $searchRegion = $( '#simpleSearch, #searchInput' ).first(),
-                       $searchInput = $( '#searchInput' );
+                       $searchInput = $( '#searchInput' ),
+                       previousSearchText = $searchInput.val();
 
                // Compatibility map
                map = {
                        };
                }
 
+               /**
+                * Callback that's run when the user changes the search input text
+                * 'this' is the search input box (jQuery object)
+                * @ignore
+                */
+               function onBeforeUpdate() {
+                       var searchText = this.val();
+
+                       if ( searchText && searchText !== previousSearchText ) {
+                               mw.track( 'mediawiki.searchSuggest', {
+                                       action: 'session-start'
+                               } );
+                       }
+                       previousSearchText = searchText;
+               }
+
+               /**
+                * Callback that's run when suggestions have been updated either from the cache or the API
+                * 'this' is the search input box (jQuery object)
+                * @ignore
+                */
+               function onAfterUpdate() {
+                       var context = this.data( 'suggestionsContext' );
+
+                       mw.track( 'mediawiki.searchSuggest', {
+                               action: 'impression-results',
+                               numberOfResults: context.config.suggestions.length,
+                               // FIXME: when other types of search become available change this value accordingly
+                               // See the API call below (opensearch = prefix)
+                               resultSetType: 'prefix'
+                       } );
+               }
+
                // The function used to render the suggestions.
                function renderFunction( text, context ) {
                        if ( !resultRenderCache ) {
                                );
                }
 
+               // The function used when the user makes a selection
+               function selectFunction( $input ) {
+                       var context = $input.data( 'suggestionsContext' ),
+                               text = $input.val();
+
+                       mw.track( 'mediawiki.searchSuggest', {
+                               action: 'click-result',
+                               numberOfResults: context.config.suggestions.length,
+                               clickIndex: context.config.suggestions.indexOf( text ) + 1
+                       } );
+
+                       // allow the form to be submitted
+                       return true;
+               }
+
                function specialRenderFunction( query, context ) {
                        var $el = this;
 
                        return;
                }
 
-               // Special suggestions functionality for skin-provided search box
+               // Special suggestions functionality and tracking for skin-provided search box
                $searchInput.suggestions( {
+                       update: {
+                               before: onBeforeUpdate,
+                               after: onAfterUpdate
+                       },
+                       result: {
+                               render: renderFunction,
+                               select: selectFunction
+                       },
                        special: {
                                render: specialRenderFunction,
                                select: function ( $input ) {
diff --git a/resources/src/polyfill-nodeTypes.js b/resources/src/polyfill-nodeTypes.js
new file mode 100644 (file)
index 0000000..556b51b
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+ * Adds window.Node with node types according to:
+ * http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
+ */
+
+window.Node = window.Node || {
+       ELEMENT_NODE:                1,
+       ATTRIBUTE_NODE:              2,
+       TEXT_NODE:                   3,
+       CDATA_SECTION_NODE:          4,
+       ENTITY_REFERENCE_NODE:       5,
+       ENTITY_NODE:                 6,
+       PROCESSING_INSTRUCTION_NODE: 7,
+       COMMENT_NODE:                8,
+       DOCUMENT_NODE:               9,
+       DOCUMENT_TYPE_NODE:          10,
+       DOCUMENT_FRAGMENT_NODE:      11,
+       NOTATION_NODE:               12
+};
index def23da..1a2e0cb 100644 (file)
@@ -66,8 +66,10 @@ $wgAutoloadClasses += array(
        'TestRecentChangesHelper' => "$testDir/phpunit/includes/changes/TestRecentChangesHelper.php",
 
        # tests/phpunit/includes/content
-       'DummyContentHandlerForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
-       'DummyContentForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
+       'DummyContentHandlerForTesting' => "$testDir/phpunit/mocks/content/DummyContentHandlerForTesting.php",
+       'DummyContentForTesting' => "$testDir/phpunit/mocks/content/DummyContentForTesting.php",
+       'DummyNonTextContentHandler' => "$testDir/phpunit/mocks/content/DummyNonTextContentHandler.php",
+       'DummyNonTextContent' => "$testDir/phpunit/mocks/content/DummyNonTextContent.php",
        'ContentHandlerTest' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
        'JavaScriptContentTest' => "$testDir/phpunit/includes/content/JavaScriptContentTest.php",
        'TextContentTest' => "$testDir/phpunit/includes/content/TextContentTest.php",
index 15778e4..27959b1 100644 (file)
  */
 class EditPageTest extends MediaWikiLangTestCase {
 
+       protected function setUp() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgExtraNamespaces' => $wgExtraNamespaces,
+                       'wgNamespaceContentModels' => $wgNamespaceContentModels,
+                       'wgContentHandlers' => $wgContentHandlers,
+                       'wgContLang' => $wgContLang,
+               ) );
+
+               $wgExtraNamespaces[12312] = 'Dummy';
+               $wgExtraNamespaces[12313] = 'Dummy_talk';
+
+               $wgNamespaceContentModels[12312] = "testing";
+               $wgContentHandlers["testing"] = 'DummyContentHandlerForTesting';
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+       }
+
        /**
         * @dataProvider provideExtractSectionTitle
         * @covers EditPage::extractSectionTitle
@@ -499,4 +521,37 @@ hello
                $this->assertEdit( 'EditPageTest_testAutoMerge', null, 'Berta', $bertasEdit,
                        $expectedCode, $expectedText, $message );
        }
+
+       /**
+        * @depends testAutoMerge
+        */
+       public function testCheckDirectEditingDisallowed_forNonTextContent() {
+               $title = Title::newFromText( 'Dummy:NonTextPageForEditPage' );
+               $page = WikiPage::factory( $title );
+
+               $article = new Article( $title );
+               $article->getContext()->setTitle( $title );
+               $ep = new EditPage( $article );
+               $ep->setContextTitle( $title );
+
+               $user = $GLOBALS['wgUser'];
+
+               $edit = array(
+                       'wpTextbox1' => serialize( 'non-text content' ),
+                       'wpEditToken' => $user->getEditToken(),
+                       'wpEdittime' => '',
+                       'wpStarttime' => wfTimestampNow()
+               );
+
+               $req = new FauxRequest( $edit, true );
+               $ep->importFormData( $req );
+
+               $this->setExpectedException(
+                       'MWException',
+                       'This content model is not supported: testing'
+               );
+
+               $ep->internalAttemptSave( $result, false );
+       }
+
 }
index 4a4130e..77b26b3 100644 (file)
@@ -2,6 +2,8 @@
 
 /**
  * Parser-related tests that don't suit for parserTests.txt
+ *
+ * @group Database
  */
 class ExtraParserTest extends MediaWikiTestCase {
 
index dcafb73..1e30273 100644 (file)
@@ -374,24 +374,6 @@ class GlobalTest extends MediaWikiTestCase {
                }
        }
 
-       /**
-        * @covers ::swap
-        */
-       public function testSwapVarsTest() {
-               $this->hideDeprecated( 'swap' );
-
-               $var1 = 1;
-               $var2 = 2;
-
-               $this->assertEquals( $var1, 1, 'var1 is set originally' );
-               $this->assertEquals( $var2, 2, 'var1 is set originally' );
-
-               swap( $var1, $var2 );
-
-               $this->assertEquals( $var1, 2, 'var1 is swapped' );
-               $this->assertEquals( $var2, 1, 'var2 is swapped' );
-       }
-
        /**
         * @covers ::wfPercent
         */
index 022c7d5..fd10ae7 100644 (file)
@@ -664,7 +664,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['permission'] = '';
                $this->title->mTitleProtection['user'] = $this->user->getID();
-               $this->title->mTitleProtection['expiry'] = wfGetDB( DB_SLAVE )->getInfinity();
+               $this->title->mTitleProtection['expiry'] = 'infinity';
                $this->title->mTitleProtection['reason'] = 'test';
                $this->title->mCascadeRestriction = false;
 
index d55f958..00c29ee 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group Database
  * @group Title
  */
 class TitleTest extends MediaWikiTestCase {
index b74a7ea..370b5b2 100644 (file)
@@ -425,4 +425,24 @@ class UserTest extends MediaWikiTestCase {
                $this->assertFalse( $user->isLoggedIn() );
                $this->assertTrue( $user->isAnon() );
        }
+
+       /**
+        * @covers User::checkAndSetTouched
+        */
+       public function testCheckAndSetTouched() {
+               $user = TestingAccessWrapper::newFromObject( User::newFromName( 'UTSysop' ) );
+               $this->assertTrue( $user->isLoggedIn() );
+
+               $touched = $user->getDBTouched();
+               $this->assertTrue(
+                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded" );
+               $this->assertGreaterThan(
+                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched()" );
+
+               $touched = $user->getDBTouched();
+               $this->assertTrue(
+                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded #2" );
+               $this->assertGreaterThan(
+                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched() #2" );
+       }
 }
index 83f5922..3babb97 100644 (file)
@@ -19,7 +19,7 @@ class ActionTest extends MediaWikiTestCase {
                        'disabled' => false,
                        'view' => true,
                        'edit' => true,
-                       'revisiondelete' => true,
+                       'revisiondelete' => 'SpecialPageAction',
                        'dummy' => true,
                        'string' => 'NamedDummyAction',
                        'declared' => 'NonExistingClassName',
diff --git a/tests/phpunit/includes/api/ApiContinuationManagerTest.php b/tests/phpunit/includes/api/ApiContinuationManagerTest.php
new file mode 100644 (file)
index 0000000..2edf0c6
--- /dev/null
@@ -0,0 +1,195 @@
+<?php
+
+/**
+ * @covers ApiContinuationManager
+ * @group API
+ */
+class ApiContinuationManagerTest extends MediaWikiTestCase {
+
+       private static function getManager( $continue, $allModules, $generatedModules ) {
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $context->setRequest( new FauxRequest( array( 'continue' => $continue ) ) );
+               $main = new ApiMain( $context );
+               return new ApiContinuationManager( $main, $allModules, $generatedModules );
+       }
+
+       public function testContinuation() {
+               $allModules = array(
+                       new MockApiQueryBase( 'mock1' ),
+                       new MockApiQueryBase( 'mock2' ),
+                       new MockApiQueryBase( 'mocklist' ),
+               );
+               $generator = new MockApiQueryBase( 'generator' );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( 'ApiMain', $manager->getSource() );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $this->assertSame( array( array(
+                       'mlcontinue' => 2,
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2',
+               ), false ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $manager->getRawContinuation() );
+
+               $result = new ApiResult( 0 );
+               $manager->setContinuationIntoResult( $result );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $manager->addGeneratorContinueParam( $generator, 'gcontinue', array( 3, 4 ) );
+               $this->assertSame( array( array(
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2|mocklist',
+               ), false ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'generator' => array( 'gcontinue' => '3|4' ),
+               ), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $this->assertSame( array( array(
+                       'mlcontinue' => 2,
+                       'gcontinue' => 3,
+                       'continue' => 'gcontinue||',
+               ), true ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $manager->getRawContinuation() );
+
+               $result = new ApiResult( 0 );
+               $manager->setContinuationIntoResult( $result );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'gcontinue' => 3,
+                       'continue' => 'gcontinue||',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $this->assertSame( array( array(
+                       'gcontinue' => 3,
+                       'continue' => 'gcontinue||mocklist',
+               ), true ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $this->assertSame( array( array(
+                       'mlcontinue' => 2,
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2',
+               ), false ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+               ), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $this->assertSame( array( array(
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2|mocklist',
+               ), false ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+               ), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $manager->addContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $this->assertSame( array( array(
+                       'mlcontinue' => 2,
+                       'continue' => '-||mock1|mock2',
+               ), true ), $manager->getContinuation() );
+               $this->assertSame( array(
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+               ), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame( $allModules, $manager->getRunModules() );
+               $this->assertSame( array( array(), true ), $manager->getContinuation() );
+               $this->assertSame( array(), $manager->getRawContinuation() );
+
+               $manager = self::getManager( '||mock2', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( false, $manager->isGeneratorDone() );
+               $this->assertSame(
+                       array_values( array_diff_key( $allModules, array( 1 => 1 ) ) ),
+                       $manager->getRunModules()
+               );
+
+               $manager = self::getManager( '-||', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( true, $manager->isGeneratorDone() );
+               $this->assertSame(
+                       array_values( array_diff_key( $allModules, array( 0 => 0, 1 => 1 ) ) ),
+                       $manager->getRunModules()
+               );
+
+               try {
+                       self::getManager( 'foo', $allModules, array( 'mock1', 'mock2' ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UsageException $ex ) {
+                       $this->assertSame(
+                               'Invalid continue param. You should pass the original value returned by the previous query',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $manager = self::getManager( '||mock2', array_slice( $allModules, 0, 2 ), array( 'mock1', 'mock2' ) );
+               try {
+                       $manager->addContinueParam( $allModules[1], 'm2continue', 1 );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'Module \'mock2\' was not supposed to have been executed, but it was executed anyway',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       $manager->addContinueParam( $allModules[2], 'mlcontinue', 1 );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam but was not passed to ApiContinuationManager::__construct',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+       }
+
+}
index 3179a45..865f1c2 100644 (file)
@@ -27,9 +27,14 @@ class ApiEditPageTest extends ApiTestCase {
 
                $wgExtraNamespaces[12312] = 'Dummy';
                $wgExtraNamespaces[12313] = 'Dummy_talk';
+               $wgExtraNamespaces[12314] = 'DummyNonText';
+               $wgExtraNamespaces[12315] = 'DummyNonText_talk';
 
                $wgNamespaceContentModels[12312] = "testing";
+               $wgNamespaceContentModels[12314] = "testing-nontext";
+
                $wgContentHandlers["testing"] = 'DummyContentHandlerForTesting';
+               $wgContentHandlers["testing-nontext"] = 'DummyNonTextContentHandler';
 
                MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
                $wgContLang->resetNamespaces(); # reset namespace cache
@@ -96,33 +101,6 @@ class ApiEditPageTest extends ApiTestCase {
                );
        }
 
-       public function testNonTextEdit() {
-               $name = 'Dummy:ApiEditPageTest_testNonTextEdit';
-               $data = serialize( 'some bla bla text' );
-
-               // -- test new page --------------------------------------------
-               $apiResult = $this->doApiRequestWithToken( array(
-                       'action' => 'edit',
-                       'title' => $name,
-                       'text' => $data, ) );
-               $apiResult = $apiResult[0];
-
-               // Validate API result data
-               $this->assertArrayHasKey( 'edit', $apiResult );
-               $this->assertArrayHasKey( 'result', $apiResult['edit'] );
-               $this->assertEquals( 'Success', $apiResult['edit']['result'] );
-
-               $this->assertArrayHasKey( 'new', $apiResult['edit'] );
-               $this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
-
-               $this->assertArrayHasKey( 'pageid', $apiResult['edit'] );
-
-               // validate resulting revision
-               $page = WikiPage::factory( Title::newFromText( $name ) );
-               $this->assertEquals( "testing", $page->getContentModel() );
-               $this->assertEquals( $data, $page->getContent()->serialize() );
-       }
-
        /**
         * @return array
         */
@@ -493,4 +471,45 @@ class ApiEditPageTest extends ApiTestCase {
 
                $page->clear();
        }
+
+       public function testCheckDirectApiEditingDisallowed_forNonTextContent() {
+               $this->setExpectedException(
+                       'UsageException',
+                       'Direct editing via API is not supported for this content type.'
+               );
+
+               $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => 'Dummy:ApiEditPageTest_nonTextPageEdit',
+                       'text' => '{"animals":["kittens!"]}'
+               ) );
+       }
+
+       public function testSupportsDirectApiEditing_withContentHandlerOverride() {
+               $name = 'DummyNonText:ApiEditPageTest_testNonTextEdit';
+               $data = serialize( 'some bla bla text' );
+
+               $result = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $name,
+                       'text' => $data,
+               ) );
+
+               $apiResult = $result[0];
+
+               // Validate API result data
+               $this->assertArrayHasKey( 'edit', $apiResult );
+               $this->assertArrayHasKey( 'result', $apiResult['edit'] );
+               $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+
+               $this->assertArrayHasKey( 'new', $apiResult['edit'] );
+               $this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
+
+               $this->assertArrayHasKey( 'pageid', $apiResult['edit'] );
+
+               // validate resulting revision
+               $page = WikiPage::factory( Title::newFromText( $name ) );
+               $this->assertEquals( "testing-nontext", $page->getContentModel() );
+               $this->assertEquals( $data, $page->getContent()->serialize() );
+       }
 }
diff --git a/tests/phpunit/includes/api/ApiErrorFormatterTest.php b/tests/phpunit/includes/api/ApiErrorFormatterTest.php
new file mode 100644 (file)
index 0000000..8ebdf60
--- /dev/null
@@ -0,0 +1,351 @@
+<?php
+
+/**
+ * @group API
+ */
+class ApiErrorFormatterTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ApiErrorFormatter
+        * @dataProvider provideErrorFormatter
+        */
+       public function testErrorFormatter( $format, $lang, $useDB,
+               $expect1, $expect2, $expect3
+       ) {
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( $lang ), $format, $useDB );
+
+               // Add default type
+               $expect1[ApiResult::META_TYPE] = 'assoc';
+               $expect2[ApiResult::META_TYPE] = 'assoc';
+               $expect3[ApiResult::META_TYPE] = 'assoc';
+
+               $formatter->addWarning( 'string', 'mainpage' );
+               $formatter->addError( 'err', 'mainpage' );
+               $this->assertSame( $expect1, $result->getResultData(), 'Simple test' );
+
+               $result->reset();
+               $formatter->addWarning( 'foo', 'mainpage' );
+               $formatter->addWarning( 'foo', 'mainpage' );
+               $formatter->addWarning( 'foo', array( 'parentheses', 'foobar' ) );
+               $msg1 = wfMessage( 'mainpage' );
+               $formatter->addWarning( 'message', $msg1 );
+               $msg2 = new ApiMessage( 'mainpage', 'overriddenCode', array( 'overriddenData' => true ) );
+               $formatter->addWarning( 'messageWithData', $msg2 );
+               $formatter->addError( 'errWithData', $msg2 );
+               $this->assertSame( $expect2, $result->getResultData(), 'Complex test' );
+
+               $result->reset();
+               $status = Status::newGood();
+               $status->warning( 'mainpage' );
+               $status->warning( 'parentheses', 'foobar' );
+               $status->warning( $msg1 );
+               $status->warning( $msg2 );
+               $status->error( 'mainpage' );
+               $status->error( 'parentheses', 'foobar' );
+               $formatter->addMessagesFromStatus( 'status', $status );
+               $this->assertSame( $expect3, $result->getResultData(), 'Status test' );
+
+               $this->assertSame(
+                       $expect3['errors']['status'],
+                       $formatter->arrayFromStatus( $status, 'error' ),
+                       'arrayFromStatus test for error'
+               );
+               $this->assertSame(
+                       $expect3['warnings']['status'],
+                       $formatter->arrayFromStatus( $status, 'warning' ),
+                       'arrayFromStatus test for warning'
+               );
+       }
+
+       public static function provideErrorFormatter() {
+               $mainpagePlain = wfMessage( 'mainpage' )->useDatabase( false )->plain();
+               $parensPlain = wfMessage( 'parentheses', 'foobar' )->useDatabase( false )->plain();
+               $mainpageText = wfMessage( 'mainpage' )->inLanguage( 'de' )->text();
+               $parensText = wfMessage( 'parentheses', 'foobar' )->inLanguage( 'de' )->text();
+               $C = ApiResult::META_CONTENT;
+               $I = ApiResult::META_INDEXED_TAG_NAME;
+
+               return array(
+                       array( 'wikitext', 'de', true,
+                               array(
+                                       'errors' => array(
+                                               'err' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'string' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'errWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                               'overriddenData' => true, $C => 'text' ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'messageWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                               'overriddenData' => true, $C => 'text' ),
+                                                       $I => 'warning',
+                                               ),
+                                               'message' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       $I => 'warning',
+                                               ),
+                                               'foo' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       array( 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       array( 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage', 'text' => $mainpageText, $C => 'text' ),
+                                                       array( 'code' => 'parentheses', 'text' => $parensText, $C => 'text' ),
+                                                       array( 'code' => 'overriddenCode', 'text' => $mainpageText,
+                                                               'overriddenData' => true, $C => 'text' ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array( 'raw', 'fr', true,
+                               array(
+                                       'errors' => array(
+                                               'err' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'string' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'errWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'messageWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true ),
+                                                       $I => 'warning',
+                                               ),
+                                               'message' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       $I => 'warning',
+                                               ),
+                                               'foo' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                                                       array( 'code' => 'parentheses', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                                                       array( 'code' => 'overriddenCode', 'message' => 'mainpage', 'params' => array( $I => 'param' ),
+                                                               'overriddenData' => true ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       array( 'none', 'fr', true,
+                               array(
+                                       'errors' => array(
+                                               'err' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'string' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'errWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'overriddenData' => true ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'messageWithData' => array(
+                                                       array( 'code' => 'overriddenCode', 'overriddenData' => true ),
+                                                       $I => 'warning',
+                                               ),
+                                               'message' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       $I => 'warning',
+                                               ),
+                                               'foo' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       array( 'code' => 'parentheses' ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                               array(
+                                       'errors' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       array( 'code' => 'parentheses' ),
+                                                       $I => 'error',
+                                               ),
+                                       ),
+                                       'warnings' => array(
+                                               'status' => array(
+                                                       array( 'code' => 'mainpage' ),
+                                                       array( 'code' => 'parentheses' ),
+                                                       array( 'code' => 'overriddenCode', 'overriddenData' => true ),
+                                                       $I => 'warning',
+                                               ),
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @covers ApiErrorFormatter_BackCompat
+        */
+       public function testErrorFormatterBC() {
+               $mainpagePlain = wfMessage( 'mainpage' )->useDatabase( false )->plain();
+               $parensPlain = wfMessage( 'parentheses', 'foobar' )->useDatabase( false )->plain();
+
+               $result = new ApiResult( 8388608 );
+               $formatter = new ApiErrorFormatter_BackCompat( $result );
+
+               $formatter->addWarning( 'string', 'mainpage' );
+               $formatter->addError( 'err', 'mainpage' );
+               $this->assertSame( array(
+                       'error' => array(
+                               'code' => 'mainpage',
+                               'info' => $mainpagePlain,
+                       ),
+                       'warnings' => array(
+                               'string' => array(
+                                       'warnings' => $mainpagePlain,
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ),
+                       ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData(), 'Simple test' );
+
+               $result->reset();
+               $formatter->addWarning( 'foo', 'mainpage' );
+               $formatter->addWarning( 'foo', 'mainpage' );
+               $formatter->addWarning( 'foo', array( 'parentheses', 'foobar' ) );
+               $msg1 = wfMessage( 'mainpage' );
+               $formatter->addWarning( 'message', $msg1 );
+               $msg2 = new ApiMessage( 'mainpage', 'overriddenCode', array( 'overriddenData' => true ) );
+               $formatter->addWarning( 'messageWithData', $msg2 );
+               $formatter->addError( 'errWithData', $msg2 );
+               $this->assertSame( array(
+                       'error' => array(
+                               'code' => 'overriddenCode',
+                               'info' => $mainpagePlain,
+                               'overriddenData' => true,
+                       ),
+                       'warnings' => array(
+                               'messageWithData' => array(
+                                       'warnings' => $mainpagePlain,
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ),
+                               'message' => array(
+                                       'warnings' => $mainpagePlain,
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ),
+                               'foo' => array(
+                                       'warnings' => "$mainpagePlain\n$parensPlain",
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ),
+                       ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData(), 'Complex test' );
+
+               $result->reset();
+               $status = Status::newGood();
+               $status->warning( 'mainpage' );
+               $status->warning( 'parentheses', 'foobar' );
+               $status->warning( $msg1 );
+               $status->warning( $msg2 );
+               $status->error( 'mainpage' );
+               $status->error( 'parentheses', 'foobar' );
+               $formatter->addMessagesFromStatus( 'status', $status );
+               $this->assertSame( array(
+                       'error' => array(
+                               'code' => 'parentheses',
+                               'info' => $parensPlain,
+                       ),
+                       'warnings' => array(
+                               'status' => array(
+                                       'warnings' => "$mainpagePlain\n$parensPlain",
+                                       ApiResult::META_CONTENT => 'warnings',
+                               ),
+                       ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData(), 'Status test' );
+
+               $I = ApiResult::META_INDEXED_TAG_NAME;
+               $this->assertSame(
+                       array(
+                               array( 'type' => 'error', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                               array( 'type' => 'error', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                               $I => 'error',
+                       ),
+                       $formatter->arrayFromStatus( $status, 'error' ),
+                       'arrayFromStatus test for error'
+               );
+               $this->assertSame(
+                       array(
+                               array( 'type' => 'warning', 'message' => 'mainpage', 'params' => array( $I => 'param' ) ),
+                               array( 'type' => 'warning', 'message' => 'parentheses', 'params' => array( 'foobar', $I => 'param' ) ),
+                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
+                               array( 'message' => 'mainpage', 'params' => array( $I => 'param' ), 'type' => 'warning' ),
+                               $I => 'warning',
+                       ),
+                       $formatter->arrayFromStatus( $status, 'warning' ),
+                       'arrayFromStatus test for warning'
+               );
+       }
+
+}
index 7a03f7d..e8ef180 100644 (file)
@@ -16,7 +16,7 @@ class ApiMainTest extends ApiTestCase {
                        new FauxRequest( array( 'action' => 'query', 'meta' => 'siteinfo' ) )
                );
                $api->execute();
-               $data = $api->getResultData();
+               $data = $api->getResult()->getResultData();
                $this->assertInternalType( 'array', $data );
                $this->assertArrayHasKey( 'query', $data );
        }
diff --git a/tests/phpunit/includes/api/ApiMessageTest.php b/tests/phpunit/includes/api/ApiMessageTest.php
new file mode 100644 (file)
index 0000000..6c3ce60
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * @group API
+ */
+class ApiMessageTest extends MediaWikiTestCase {
+
+       private function compareMessages( $msg, $msg2 ) {
+               $this->assertSame( $msg->getKey(), $msg2->getKey(), 'getKey' );
+               $this->assertSame( $msg->getKeysToTry(), $msg2->getKeysToTry(), 'getKeysToTry' );
+               $this->assertSame( $msg->getParams(), $msg2->getParams(), 'getParams' );
+               $this->assertSame( $msg->getFormat(), $msg2->getFormat(), 'getFormat' );
+               $this->assertSame( $msg->getLanguage(), $msg2->getLanguage(), 'getLanguage' );
+
+               $msg = TestingAccessWrapper::newFromObject( $msg );
+               $msg2 = TestingAccessWrapper::newFromObject( $msg2 );
+               foreach ( array( 'interface', 'useDatabase', 'title' ) as $key ) {
+                       $this->assertSame( $msg->$key, $msg2->$key, $key );
+               }
+       }
+
+       /**
+        * @covers ApiMessage
+        */
+       public function testApiMessage() {
+               $msg = new Message( array( 'foo', 'bar' ), array( 'baz' ) );
+               $msg->inLanguage( 'de' )->title( Title::newMainPage() );
+               $msg2 = new ApiMessage( $msg, 'code', array( 'data' ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
+               $msg = new Message( array( 'foo', 'bar' ), array( 'baz' ) );
+               $msg2 = new ApiMessage( array( array( 'foo', 'bar' ), 'baz' ), 'code', array( 'data' ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
+               $msg = new Message( 'foo' );
+               $msg2 = new ApiMessage( 'foo' );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'foo', $msg2->getApiCode() );
+               $this->assertEquals( array(), $msg2->getApiData() );
+
+               $msg2->setApiCode( 'code', array( 'data' ) );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+               $msg2->setApiCode( null );
+               $this->assertEquals( 'foo', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+               $msg2->setApiData( array( 'data2' ) );
+               $this->assertEquals( array( 'data2' ), $msg2->getApiData() );
+       }
+
+       /**
+        * @covers ApiRawMessage
+        */
+       public function testApiRawMessage() {
+               $msg = new RawMessage( 'foo', array( 'baz' ) );
+               $msg->inLanguage( 'de' )->title( Title::newMainPage() );
+               $msg2 = new ApiRawMessage( $msg, 'code', array( 'data' ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
+               $msg = new RawMessage( 'foo', array( 'baz' ) );
+               $msg2 = new ApiRawMessage( array( 'foo', 'baz' ), 'code', array( 'data' ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
+               $msg = new RawMessage( 'foo' );
+               $msg2 = new ApiRawMessage( 'foo', 'code', array( 'data' ) );
+               $this->compareMessages( $msg, $msg2 );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+
+               $msg2->setApiCode( 'code', array( 'data' ) );
+               $this->assertEquals( 'code', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+               $msg2->setApiCode( null );
+               $this->assertEquals( 'foo', $msg2->getApiCode() );
+               $this->assertEquals( array( 'data' ), $msg2->getApiData() );
+               $msg2->setApiData( array( 'data2' ) );
+               $this->assertEquals( array( 'data2' ), $msg2->getApiData() );
+       }
+
+       /**
+        * @covers ApiMessage::create
+        */
+       public function testApiMessageCreate() {
+               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( new Message( 'mainpage' ) ) );
+               $this->assertInstanceOf( 'ApiRawMessage', ApiMessage::create( new RawMessage( 'mainpage' ) ) );
+               $this->assertInstanceOf( 'ApiMessage', ApiMessage::create( 'mainpage' ) );
+
+               $msg = new ApiMessage( 'mainpage' );
+               $this->assertSame( $msg, ApiMessage::create( $msg ) );
+
+               $msg = new ApiRawMessage( 'mainpage' );
+               $this->assertSame( $msg, ApiMessage::create( $msg ) );
+       }
+
+}
index bd34018..51154ae 100644 (file)
@@ -138,7 +138,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
                $this->mTested->execute();
 
-               return $this->mTested->getResult()->getData();
+               return $this->mTested->getResult()->getResultData( null, array( 'Strip' => 'all' ) );
        }
 
        /**
@@ -396,7 +396,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => array(
                                'options' => array(
-                                       '*' => "Validation error for 'special': cannot be set by this module"
+                                       'warnings' => "Validation error for 'special': cannot be set by this module"
                                )
                        )
                ), $response );
@@ -419,7 +419,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'options' => 'success',
                        'warnings' => array(
                                'options' => array(
-                                       '*' => "Validation error for 'unknownOption': not a valid preference"
+                                       'warnings' => "Validation error for 'unknownOption': not a valid preference"
                                )
                        )
                ), $response );
diff --git a/tests/phpunit/includes/api/ApiResultTest.php b/tests/phpunit/includes/api/ApiResultTest.php
new file mode 100644 (file)
index 0000000..f2fcb4a
--- /dev/null
@@ -0,0 +1,1473 @@
+<?php
+
+/**
+ * @covers ApiResult
+ * @group API
+ */
+class ApiResultTest extends MediaWikiTestCase {
+
+       /**
+        * @covers ApiResult
+        */
+       public function testStaticDataMethods() {
+               $arr = array();
+
+               ApiResult::setValue( $arr, 'setValue', '1' );
+
+               ApiResult::setValue( $arr, null, 'unnamed 1' );
+               ApiResult::setValue( $arr, null, 'unnamed 2' );
+
+               ApiResult::setValue( $arr, 'deleteValue', '2' );
+               ApiResult::unsetValue( $arr, 'deleteValue' );
+
+               ApiResult::setContentValue( $arr, 'setContentValue', '3' );
+
+               $this->assertSame( array(
+                       'setValue' => '1',
+                       'unnamed 1',
+                       'unnamed 2',
+                       ApiResult::META_CONTENT => 'setContentValue',
+                       'setContentValue' => '3',
+               ), $arr );
+
+               try {
+                       ApiResult::setValue( $arr, 'setValue', '99' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Attempting to add element setValue=99, existing value is 1',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               try {
+                       ApiResult::setContentValue( $arr, 'setContentValue2', '99' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Attempting to set content element as setContentValue2 when setContentValue ' .
+                                       'is already set as the content element',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               ApiResult::setValue( $arr, 'setValue', '99', ApiResult::OVERRIDE );
+               $this->assertSame( '99', $arr['setValue'] );
+
+               ApiResult::setContentValue( $arr, 'setContentValue2', '99', ApiResult::OVERRIDE );
+               $this->assertSame( 'setContentValue2', $arr[ApiResult::META_CONTENT] );
+
+               $arr = array( 'foo' => 1, 'bar' => 1 );
+               ApiResult::setValue( $arr, 'top', '2', ApiResult::ADD_ON_TOP );
+               ApiResult::setValue( $arr, null, '2', ApiResult::ADD_ON_TOP );
+               ApiResult::setValue( $arr, 'bottom', '2' );
+               ApiResult::setValue( $arr, 'foo', '2', ApiResult::OVERRIDE );
+               ApiResult::setValue( $arr, 'bar', '2', ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP );
+               $this->assertSame( array( 0, 'top', 'foo', 'bar', 'bottom' ), array_keys( $arr ) );
+
+               $arr = array();
+               ApiResult::setValue( $arr, 'sub', array( 'foo' => 1 ) );
+               ApiResult::setValue( $arr, 'sub', array( 'bar' => 1 ) );
+               $this->assertSame( array( 'sub' => array( 'foo' => 1, 'bar' => 1 ) ), $arr );
+
+               try {
+                       ApiResult::setValue( $arr, 'sub', array( 'foo' => 2, 'baz' => 2 ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Conflicting keys (foo) when attempting to merge element sub',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $arr = array();
+               $title = Title::newFromText( "MediaWiki:Foobar" );
+               $obj = new stdClass;
+               $obj->foo = 1;
+               $obj->bar = 2;
+               ApiResult::setValue( $arr, 'title', $title );
+               ApiResult::setValue( $arr, 'obj', $obj );
+               $this->assertSame( array(
+                       'title' => (string)$title,
+                       'obj' => array( 'foo' => 1, 'bar' => 2, ApiResult::META_TYPE => 'assoc' ),
+               ), $arr );
+
+               $fh = tmpfile();
+               try {
+                       ApiResult::setValue( $arr, 'file', $fh );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add resource(stream) to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       $obj->file = $fh;
+                       ApiResult::setValue( $arr, 'sub', $obj );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add resource(stream) to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               fclose( $fh );
+
+               try {
+                       ApiResult::setValue( $arr, 'inf', INF );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       ApiResult::setValue( $arr, 'nan', NAN );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $arr = array();
+               $result2 = new ApiResult( 8388608 );
+               $result2->addValue( null, 'foo', 'bar' );
+               ApiResult::setValue( $arr, 'baz', $result2 );
+               $this->assertSame( array(
+                       'baz' => array(
+                               ApiResult::META_TYPE => 'assoc',
+                               'foo' => 'bar',
+                       )
+               ), $arr );
+
+               $arr = array();
+               ApiResult::setValue( $arr, 'foo', "foo\x80bar" );
+               ApiResult::setValue( $arr, 'bar', "a\xcc\x81" );
+               ApiResult::setValue( $arr, 'baz', 74 );
+               $this->assertSame( array(
+                       'foo' => "foo\xef\xbf\xbdbar",
+                       'bar' => "\xc3\xa1",
+                       'baz' => 74,
+               ), $arr );
+       }
+
+       /**
+        * @covers ApiResult
+        */
+       public function testInstanceDataMethods() {
+               $result = new ApiResult( 8388608 );
+
+               $result->addValue( null, 'setValue', '1' );
+
+               $result->addValue( null, null, 'unnamed 1' );
+               $result->addValue( null, null, 'unnamed 2' );
+
+               $result->addValue( null, 'deleteValue', '2' );
+               $result->removeValue( null, 'deleteValue' );
+
+               $result->addValue( array( 'a', 'b' ), 'deleteValue', '3' );
+               $result->removeValue( array( 'a', 'b', 'deleteValue' ), null, '3' );
+
+               $result->addContentValue( null, 'setContentValue', '3' );
+
+               $this->assertSame( array(
+                       'setValue' => '1',
+                       'unnamed 1',
+                       'unnamed 2',
+                       'a' => array( 'b' => array() ),
+                       'setContentValue' => '3',
+                       ApiResult::META_TYPE => 'assoc',
+                       ApiResult::META_CONTENT => 'setContentValue',
+               ), $result->getResultData() );
+               $this->assertSame( 20, $result->getSize() );
+
+               try {
+                       $result->addValue( null, 'setValue', '99' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Attempting to add element setValue=99, existing value is 1',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               try {
+                       $result->addContentValue( null, 'setContentValue2', '99' );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Attempting to set content element as setContentValue2 when setContentValue ' .
+                                       'is already set as the content element',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $result->addValue( null, 'setValue', '99', ApiResult::OVERRIDE );
+               $this->assertSame( '99', $result->getResultData( array( 'setValue' ) ) );
+
+               $result->addContentValue( null, 'setContentValue2', '99', ApiResult::OVERRIDE );
+               $this->assertSame( 'setContentValue2',
+                       $result->getResultData( array( ApiResult::META_CONTENT ) ) );
+
+               $result->reset();
+               $this->assertSame( array(
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+               $this->assertSame( 0, $result->getSize() );
+
+               $result->addValue( null, 'foo', 1 );
+               $result->addValue( null, 'bar', 1 );
+               $result->addValue( null, 'top', '2', ApiResult::ADD_ON_TOP );
+               $result->addValue( null, null, '2', ApiResult::ADD_ON_TOP );
+               $result->addValue( null, 'bottom', '2' );
+               $result->addValue( null, 'foo', '2', ApiResult::OVERRIDE );
+               $result->addValue( null, 'bar', '2', ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP );
+               $this->assertSame( array( 0, 'top', 'foo', 'bar', 'bottom', ApiResult::META_TYPE ),
+                       array_keys( $result->getResultData() ) );
+
+               $result->reset();
+               $result->addValue( null, 'foo', array( 'bar' => 1 ) );
+               $result->addValue( array( 'foo', 'top' ), 'x', 2, ApiResult::ADD_ON_TOP );
+               $result->addValue( array( 'foo', 'bottom' ), 'x', 2 );
+               $this->assertSame( array( 'top', 'bar', 'bottom' ),
+                       array_keys( $result->getResultData( array( 'foo' ) ) ) );
+
+               $result->reset();
+               $result->addValue( null, 'sub', array( 'foo' => 1 ) );
+               $result->addValue( null, 'sub', array( 'bar' => 1 ) );
+               $this->assertSame( array(
+                       'sub' => array( 'foo' => 1, 'bar' => 1 ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+
+               try {
+                       $result->addValue( null, 'sub', array( 'foo' => 2, 'baz' => 2 ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( RuntimeException $ex ) {
+                       $this->assertSame(
+                               'Conflicting keys (foo) when attempting to merge element sub',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $result->reset();
+               $title = Title::newFromText( "MediaWiki:Foobar" );
+               $obj = new stdClass;
+               $obj->foo = 1;
+               $obj->bar = 2;
+               $result->addValue( null, 'title', $title );
+               $result->addValue( null, 'obj', $obj );
+               $this->assertSame( array(
+                       'title' => (string)$title,
+                       'obj' => array( 'foo' => 1, 'bar' => 2, ApiResult::META_TYPE => 'assoc' ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+
+               $fh = tmpfile();
+               try {
+                       $result->addValue( null, 'file', $fh );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add resource(stream) to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       $obj->file = $fh;
+                       $result->addValue( null, 'sub', $obj );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add resource(stream) to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               fclose( $fh );
+
+               try {
+                       $result->addValue( null, 'inf', INF );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       $result->addValue( null, 'nan', NAN );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $result->reset();
+               $result->addParsedLimit( 'foo', 12 );
+               $this->assertSame( array(
+                       'limits' => array( 'foo' => 12 ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+               $result->addParsedLimit( 'foo', 13 );
+               $this->assertSame( array(
+                       'limits' => array( 'foo' => 13 ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+               $this->assertSame( null, $result->getResultData( array( 'foo', 'bar', 'baz' ) ) );
+               $this->assertSame( 13, $result->getResultData( array( 'limits', 'foo' ) ) );
+               try {
+                       $result->getResultData( array( 'limits', 'foo', 'bar' ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame(
+                               'Path limits.foo is not an array',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $result = new ApiResult( 10 );
+               $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'none', false );
+               $result->setErrorFormatter( $formatter );
+               $this->assertFalse( $result->addValue( null, 'foo', '12345678901' ) );
+               $this->assertTrue( $result->addValue( null, 'foo', '12345678901', ApiResult::NO_SIZE_CHECK ) );
+               $this->assertSame( 0, $result->getSize() );
+               $result->reset();
+               $this->assertTrue( $result->addValue( null, 'foo', '1234567890' ) );
+               $this->assertFalse( $result->addValue( null, 'foo', '1' ) );
+               $result->removeValue( null, 'foo' );
+               $this->assertTrue( $result->addValue( null, 'foo', '1' ) );
+
+               $result = new ApiResult( 8388608 );
+               $result2 = new ApiResult( 8388608 );
+               $result2->addValue( null, 'foo', 'bar' );
+               $result->addValue( null, 'baz', $result2 );
+               $this->assertSame( array(
+                       'baz' => array(
+                               'foo' => 'bar',
+                               ApiResult::META_TYPE => 'assoc',
+                       ),
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+
+               $result = new ApiResult( 8388608 );
+               $result->addValue( null, 'foo', "foo\x80bar" );
+               $result->addValue( null, 'bar', "a\xcc\x81" );
+               $result->addValue( null, 'baz', 74 );
+               $this->assertSame( array(
+                       'foo' => "foo\xef\xbf\xbdbar",
+                       'bar' => "\xc3\xa1",
+                       'baz' => 74,
+                       ApiResult::META_TYPE => 'assoc',
+               ), $result->getResultData() );
+       }
+
+       /**
+        * @covers ApiResult
+        */
+       public function testMetadata() {
+               $arr = array( 'foo' => array( 'bar' => array() ) );
+               $result = new ApiResult( 8388608 );
+               $result->addValue( null, 'foo', array( 'bar' => array() ) );
+
+               $expect = array(
+                       'foo' => array(
+                               'bar' => array(
+                                       ApiResult::META_INDEXED_TAG_NAME => 'ritn',
+                                       ApiResult::META_TYPE => 'default',
+                               ),
+                               ApiResult::META_INDEXED_TAG_NAME => 'ritn',
+                               ApiResult::META_TYPE => 'default',
+                       ),
+                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar' ),
+                       ApiResult::META_TYPE => 'array',
+               );
+
+               ApiResult::setSubelementsList( $arr, 'foo' );
+               ApiResult::setSubelementsList( $arr, array( 'bar', 'baz' ) );
+               ApiResult::unsetSubelementsList( $arr, 'baz' );
+               ApiResult::setIndexedTagNameRecursive( $arr, 'ritn' );
+               ApiResult::setIndexedTagName( $arr, 'itn' );
+               ApiResult::setPreserveKeysList( $arr, 'foo' );
+               ApiResult::setPreserveKeysList( $arr, array( 'bar', 'baz' ) );
+               ApiResult::unsetPreserveKeysList( $arr, 'baz' );
+               ApiResult::setArrayTypeRecursive( $arr, 'default' );
+               ApiResult::setArrayType( $arr, 'array' );
+               $this->assertSame( $expect, $arr );
+
+               $result->addSubelementsList( null, 'foo' );
+               $result->addSubelementsList( null, array( 'bar', 'baz' ) );
+               $result->removeSubelementsList( null, 'baz' );
+               $result->addIndexedTagNameRecursive( null, 'ritn' );
+               $result->addIndexedTagName( null, 'itn' );
+               $result->addPreserveKeysList( null, 'foo' );
+               $result->addPreserveKeysList( null, array( 'bar', 'baz' ) );
+               $result->removePreserveKeysList( null, 'baz' );
+               $result->addArrayTypeRecursive( null, 'default' );
+               $result->addArrayType( null, 'array' );
+               $this->assertEquals( $expect, $result->getResultData() );
+
+               $arr = array( 'foo' => array( 'bar' => array() ) );
+               $expect = array(
+                       'foo' => array(
+                               'bar' => array(
+                                       ApiResult::META_TYPE => 'kvp',
+                                       ApiResult::META_KVP_KEY_NAME => 'key',
+                               ),
+                               ApiResult::META_TYPE => 'kvp',
+                               ApiResult::META_KVP_KEY_NAME => 'key',
+                       ),
+                       ApiResult::META_TYPE => 'BCkvp',
+                       ApiResult::META_KVP_KEY_NAME => 'bc',
+               );
+               ApiResult::setArrayTypeRecursive( $arr, 'kvp', 'key' );
+               ApiResult::setArrayType( $arr, 'BCkvp', 'bc' );
+               $this->assertSame( $expect, $arr );
+       }
+
+       /**
+        * @covers ApiResult
+        */
+       public function testUtilityFunctions() {
+               $arr = array(
+                       'foo' => array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       'foo2' => (object)array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                       ApiResult::META_TYPE => 'array',
+                       '_dummy' => 'foobaz',
+                       '_dummy2' => 'foobaz!',
+               );
+               $this->assertEquals( array(
+                       'foo' => array(
+                               'bar' => array(),
+                               'bar2' => (object)array(),
+                               'x' => 'ok',
+                       ),
+                       'foo2' => (object)array(
+                               'bar' => array(),
+                               'bar2' => (object)array(),
+                               'x' => 'ok',
+                       ),
+                       '_dummy2' => 'foobaz!',
+               ), ApiResult::stripMetadata( $arr ), 'ApiResult::stripMetadata' );
+
+               $metadata = array();
+               $data = ApiResult::stripMetadataNonRecursive( $arr, $metadata );
+               $this->assertEquals( array(
+                       'foo' => array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       'foo2' => (object)array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       '_dummy2' => 'foobaz!',
+               ), $data, 'ApiResult::stripMetadataNonRecursive ($data)' );
+               $this->assertEquals( array(
+                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                       ApiResult::META_TYPE => 'array',
+                       '_dummy' => 'foobaz',
+               ), $metadata, 'ApiResult::stripMetadataNonRecursive ($metadata)' );
+
+               $metadata = null;
+               $data = ApiResult::stripMetadataNonRecursive( (object)$arr, $metadata );
+               $this->assertEquals( (object)array(
+                       'foo' => array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       'foo2' => (object)array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'bar2' => (object)array( '_dummy' => 'foobaz' ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       '_dummy2' => 'foobaz!',
+               ), $data, 'ApiResult::stripMetadataNonRecursive on object ($data)' );
+               $this->assertEquals( array(
+                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                       ApiResult::META_TYPE => 'array',
+                       '_dummy' => 'foobaz',
+               ), $metadata, 'ApiResult::stripMetadataNonRecursive on object ($metadata)' );
+       }
+
+       /**
+        * @covers ApiResult
+        * @dataProvider provideTransformations
+        * @param string $label
+        * @param array $input
+        * @param array $transforms
+        * @param array|Exception $expect
+        */
+       public function testTransformations( $label, $input, $transforms, $expect ) {
+               $result = new ApiResult( false );
+               $result->addValue( null, 'test', $input );
+
+               if ( $expect instanceof Exception ) {
+                       try {
+                               $output = $result->getResultData( 'test', $transforms );
+                               $this->fail( 'Expected exception not thrown', $label );
+                       } catch ( Exception $ex ) {
+                               $this->assertEquals( $ex, $expect, $label );
+                       }
+               } else {
+                       $output = $result->getResultData( 'test', $transforms );
+                       $this->assertEquals( $expect, $output, $label );
+               }
+       }
+
+       public function provideTransformations() {
+               $kvp = function ( $keyKey, $key, $valKey, $value ) {
+                       return array(
+                               $keyKey => $key,
+                               $valKey => $value,
+                               ApiResult::META_PRESERVE_KEYS => array( $keyKey ),
+                               ApiResult::META_CONTENT => $valKey,
+                               ApiResult::META_TYPE => 'assoc',
+                       );
+               };
+               $typeArr = array(
+                       'defaultArray' => array( 2 => 'a', 0 => 'b', 1 => 'c' ),
+                       'defaultAssoc' => array( 'x' => 'a', 1 => 'b', 0 => 'c' ),
+                       'defaultAssoc2' => array( 2 => 'a', 3 => 'b', 0 => 'c' ),
+                       'array' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'array' ),
+                       'BCarray' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'BCarray' ),
+                       'BCassoc' => array( 'a', 'b', 'c', ApiResult::META_TYPE => 'BCassoc' ),
+                       'assoc' => array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                       'kvp' => array( 'x' => 'a', 'y' => 'b', 'z' => array( 'c' ), ApiResult::META_TYPE => 'kvp' ),
+                       'BCkvp' => array( 'x' => 'a', 'y' => 'b',
+                               ApiResult::META_TYPE => 'BCkvp',
+                               ApiResult::META_KVP_KEY_NAME => 'key',
+                       ),
+                       'emptyDefault' => array( '_dummy' => 1 ),
+                       'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                       '_dummy' => 1,
+                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+               );
+               $stripArr = array(
+                       'foo' => array(
+                               'bar' => array( '_dummy' => 'foobaz' ),
+                               'baz' => array(
+                                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                                       ApiResult::META_TYPE => 'array',
+                               ),
+                               'x' => 'ok',
+                               '_dummy' => 'foobaz',
+                       ),
+                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                       ApiResult::META_TYPE => 'array',
+                       '_dummy' => 'foobaz',
+                       '_dummy2' => 'foobaz!',
+               );
+
+               return array(
+                       array(
+                               'BC: META_BC_BOOLS',
+                               array(
+                                       'BCtrue' => true,
+                                       'BCfalse' => false,
+                                       'true' => true,
+                                       'false' => false,
+                                       ApiResult::META_BC_BOOLS => array( 0, 'true', 'false' ),
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       'BCtrue' => '',
+                                       'true' => true,
+                                       'false' => false,
+                                       ApiResult::META_BC_BOOLS => array( 0, 'true', 'false' ),
+                               )
+                       ),
+                       array(
+                               'BC: META_BC_SUBELEMENTS',
+                               array(
+                                       'bc' => 'foo',
+                                       'nobc' => 'bar',
+                                       ApiResult::META_BC_SUBELEMENTS => array( 'bc' ),
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       'bc' => array(
+                                               '*' => 'foo',
+                                               ApiResult::META_CONTENT => '*',
+                                               ApiResult::META_TYPE => 'assoc',
+                                       ),
+                                       'nobc' => 'bar',
+                                       ApiResult::META_BC_SUBELEMENTS => array( 'bc' ),
+                               ),
+                       ),
+                       array(
+                               'BC: META_CONTENT',
+                               array(
+                                       'content' => '!!!',
+                                       ApiResult::META_CONTENT => 'content',
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       '*' => '!!!',
+                                       ApiResult::META_CONTENT => '*',
+                               ),
+                       ),
+                       array(
+                               'BC: BCkvp type',
+                               array(
+                                       'foo' => 'foo value',
+                                       'bar' => 'bar value',
+                                       '_baz' => 'baz value',
+                                       ApiResult::META_TYPE => 'BCkvp',
+                                       ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ApiResult::META_PRESERVE_KEYS => array( '_baz' ),
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       $kvp( 'key', 'foo', '*', 'foo value' ),
+                                       $kvp( 'key', 'bar', '*', 'bar value' ),
+                                       $kvp( 'key', '_baz', '*', 'baz value' ),
+                                       ApiResult::META_TYPE => 'array',
+                                       ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ApiResult::META_PRESERVE_KEYS => array( '_baz' ),
+                               ),
+                       ),
+                       array(
+                               'BC: BCarray type',
+                               array(
+                                       ApiResult::META_TYPE => 'BCarray',
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       ApiResult::META_TYPE => 'default',
+                               ),
+                       ),
+                       array(
+                               'BC: BCassoc type',
+                               array(
+                                       ApiResult::META_TYPE => 'BCassoc',
+                               ),
+                               array( 'BC' => array() ),
+                               array(
+                                       ApiResult::META_TYPE => 'default',
+                               ),
+                       ),
+                       array(
+                               'BC: BCkvp exception',
+                               array(
+                                       ApiResult::META_TYPE => 'BCkvp',
+                               ),
+                               array( 'BC' => array() ),
+                               new UnexpectedValueException(
+                                       'Type "BCkvp" used without setting ApiResult::META_KVP_KEY_NAME metadata item'
+                               ),
+                       ),
+                       array(
+                               'BC: nobool, no*, nosub',
+                               array(
+                                       'true' => true,
+                                       'false' => false,
+                                       'content' => 'content',
+                                       ApiResult::META_CONTENT => 'content',
+                                       'bc' => 'foo',
+                                       ApiResult::META_BC_SUBELEMENTS => array( 'bc' ),
+                                       'BCarray' => array( ApiResult::META_TYPE => 'BCarray' ),
+                                       'BCassoc' => array( ApiResult::META_TYPE => 'BCassoc' ),
+                                       'BCkvp' => array(
+                                               'foo' => 'foo value',
+                                               'bar' => 'bar value',
+                                               '_baz' => 'baz value',
+                                               ApiResult::META_TYPE => 'BCkvp',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                               ApiResult::META_PRESERVE_KEYS => array( '_baz' ),
+                                       ),
+                               ),
+                               array( 'BC' => array( 'nobool', 'no*', 'nosub' ) ),
+                               array(
+                                       'true' => true,
+                                       'false' => false,
+                                       'content' => 'content',
+                                       'bc' => 'foo',
+                                       'BCarray' => array( ApiResult::META_TYPE => 'default' ),
+                                       'BCassoc' => array( ApiResult::META_TYPE => 'default' ),
+                                       'BCkvp' => array(
+                                               $kvp( 'key', 'foo', '*', 'foo value' ),
+                                               $kvp( 'key', 'bar', '*', 'bar value' ),
+                                               $kvp( 'key', '_baz', '*', 'baz value' ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                               ApiResult::META_PRESERVE_KEYS => array( '_baz' ),
+                                       ),
+                                       ApiResult::META_CONTENT => 'content',
+                                       ApiResult::META_BC_SUBELEMENTS => array( 'bc' ),
+                               ),
+                       ),
+
+                       array(
+                               'Types: Normal transform',
+                               $typeArr,
+                               array( 'Types' => array() ),
+                               array(
+                                       'defaultArray' => array( 'b', 'c', 'a', ApiResult::META_TYPE => 'array' ),
+                                       'defaultAssoc' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'defaultAssoc2' => array( 2 => 'a', 3 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'array' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCarray' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCassoc' => array( 'a', 'b', 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'assoc' => array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'kvp' => array( 'x' => 'a', 'y' => 'b',
+                                               'z' => array( 'c', ApiResult::META_TYPE => 'array' ),
+                                               ApiResult::META_TYPE => 'assoc'
+                                       ),
+                                       'BCkvp' => array( 'x' => 'a', 'y' => 'b',
+                                               ApiResult::META_TYPE => 'assoc',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ),
+                                       'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
+                                       'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                                       '_dummy' => 1,
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+                                       ApiResult::META_TYPE => 'assoc',
+                               ),
+                       ),
+                       array(
+                               'Types: AssocAsObject',
+                               $typeArr,
+                               array( 'Types' => array( 'AssocAsObject' => true ) ),
+                               (object)array(
+                                       'defaultArray' => array( 'b', 'c', 'a', ApiResult::META_TYPE => 'array' ),
+                                       'defaultAssoc' => (object)array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'defaultAssoc2' => (object)array( 2 => 'a', 3 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'array' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCarray' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCassoc' => (object)array( 'a', 'b', 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'assoc' => (object)array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'kvp' => (object)array( 'x' => 'a', 'y' => 'b',
+                                               'z' => array( 'c', ApiResult::META_TYPE => 'array' ),
+                                               ApiResult::META_TYPE => 'assoc'
+                                       ),
+                                       'BCkvp' => (object)array( 'x' => 'a', 'y' => 'b',
+                                               ApiResult::META_TYPE => 'assoc',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ),
+                                       'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
+                                       'emptyAssoc' => (object)array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                                       '_dummy' => 1,
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+                                       ApiResult::META_TYPE => 'assoc',
+                               ),
+                       ),
+                       array(
+                               'Types: ArmorKVP',
+                               $typeArr,
+                               array( 'Types' => array( 'ArmorKVP' => 'name' ) ),
+                               array(
+                                       'defaultArray' => array( 'b', 'c', 'a', ApiResult::META_TYPE => 'array' ),
+                                       'defaultAssoc' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'defaultAssoc2' => array( 2 => 'a', 3 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'array' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCarray' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCassoc' => array( 'a', 'b', 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'assoc' => array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'kvp' => array(
+                                               $kvp( 'name', 'x', 'value', 'a' ),
+                                               $kvp( 'name', 'y', 'value', 'b' ),
+                                               $kvp( 'name', 'z', 'value', array( 'c', ApiResult::META_TYPE => 'array' ) ),
+                                               ApiResult::META_TYPE => 'array'
+                                       ),
+                                       'BCkvp' => array(
+                                               $kvp( 'key', 'x', 'value', 'a' ),
+                                               $kvp( 'key', 'y', 'value', 'b' ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ),
+                                       'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
+                                       'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                                       '_dummy' => 1,
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+                                       ApiResult::META_TYPE => 'assoc',
+                               ),
+                       ),
+                       array(
+                               'Types: ArmorKVP + BC',
+                               $typeArr,
+                               array( 'BC' => array(), 'Types' => array( 'ArmorKVP' => 'name' ) ),
+                               array(
+                                       'defaultArray' => array( 'b', 'c', 'a', ApiResult::META_TYPE => 'array' ),
+                                       'defaultAssoc' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'defaultAssoc2' => array( 2 => 'a', 3 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'array' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCarray' => array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'BCassoc' => array( 'a', 'b', 'c', ApiResult::META_TYPE => 'array' ),
+                                       'assoc' => array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'kvp' => array(
+                                               $kvp( 'name', 'x', '*', 'a' ),
+                                               $kvp( 'name', 'y', '*', 'b' ),
+                                               $kvp( 'name', 'z', '*', array( 'c', ApiResult::META_TYPE => 'array' ) ),
+                                               ApiResult::META_TYPE => 'array'
+                                       ),
+                                       'BCkvp' => array(
+                                               $kvp( 'key', 'x', '*', 'a' ),
+                                               $kvp( 'key', 'y', '*', 'b' ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ),
+                                       'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
+                                       'emptyAssoc' => array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                                       '_dummy' => 1,
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+                                       ApiResult::META_TYPE => 'assoc',
+                               ),
+                       ),
+                       array(
+                               'Types: ArmorKVP + AssocAsObject',
+                               $typeArr,
+                               array( 'Types' => array( 'ArmorKVP' => 'name', 'AssocAsObject' => true ) ),
+                               (object)array(
+                                       'defaultArray' => array( 'b', 'c', 'a', ApiResult::META_TYPE => 'array' ),
+                                       'defaultAssoc' => (object)array( 'x' => 'a', 1 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'defaultAssoc2' => (object)array( 2 => 'a', 3 => 'b', 0 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'array' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCarray' => array( 'a', 'c', 'b', ApiResult::META_TYPE => 'array' ),
+                                       'BCassoc' => (object)array( 'a', 'b', 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'assoc' => (object)array( 2 => 'a', 0 => 'b', 1 => 'c', ApiResult::META_TYPE => 'assoc' ),
+                                       'kvp' => array(
+                                               (object)$kvp( 'name', 'x', 'value', 'a' ),
+                                               (object)$kvp( 'name', 'y', 'value', 'b' ),
+                                               (object)$kvp( 'name', 'z', 'value', array( 'c', ApiResult::META_TYPE => 'array' ) ),
+                                               ApiResult::META_TYPE => 'array'
+                                       ),
+                                       'BCkvp' => array(
+                                               (object)$kvp( 'key', 'x', 'value', 'a' ),
+                                               (object)$kvp( 'key', 'y', 'value', 'b' ),
+                                               ApiResult::META_TYPE => 'array',
+                                               ApiResult::META_KVP_KEY_NAME => 'key',
+                                       ),
+                                       'emptyDefault' => array( '_dummy' => 1, ApiResult::META_TYPE => 'array' ),
+                                       'emptyAssoc' => (object)array( '_dummy' => 1, ApiResult::META_TYPE => 'assoc' ),
+                                       '_dummy' => 1,
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy' ),
+                                       ApiResult::META_TYPE => 'assoc',
+                               ),
+                       ),
+                       array(
+                               'Types: BCkvp exception',
+                               array(
+                                       ApiResult::META_TYPE => 'BCkvp',
+                               ),
+                               array( 'Types' => array() ),
+                               new UnexpectedValueException(
+                                       'Type "BCkvp" used without setting ApiResult::META_KVP_KEY_NAME metadata item'
+                               ),
+                       ),
+
+                       array(
+                               'Strip: With ArmorKVP + AssocAsObject transforms',
+                               $typeArr,
+                               array( 'Types' => array( 'ArmorKVP' => 'name', 'AssocAsObject' => true ), 'Strip' => 'all' ),
+                               (object)array(
+                                       'defaultArray' => array( 'b', 'c', 'a' ),
+                                       'defaultAssoc' => (object)array( 'x' => 'a', 1 => 'b', 0 => 'c' ),
+                                       'defaultAssoc2' => (object)array( 2 => 'a', 3 => 'b', 0 => 'c' ),
+                                       'array' => array( 'a', 'c', 'b' ),
+                                       'BCarray' => array( 'a', 'c', 'b' ),
+                                       'BCassoc' => (object)array( 'a', 'b', 'c' ),
+                                       'assoc' => (object)array( 2 => 'a', 0 => 'b', 1 => 'c' ),
+                                       'kvp' => array(
+                                               (object)array( 'name' => 'x', 'value' => 'a' ),
+                                               (object)array( 'name' => 'y', 'value' => 'b' ),
+                                               (object)array( 'name' => 'z', 'value' => array( 'c' ) ),
+                                       ),
+                                       'BCkvp' => array(
+                                               (object)array( 'key' => 'x', 'value' => 'a' ),
+                                               (object)array( 'key' => 'y', 'value' => 'b' ),
+                                       ),
+                                       'emptyDefault' => array(),
+                                       'emptyAssoc' => (object)array(),
+                                       '_dummy' => 1,
+                               ),
+                       ),
+
+                       array(
+                               'Strip: all',
+                               $stripArr,
+                               array( 'Strip' => 'all' ),
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(),
+                                               'baz' => array(),
+                                               'x' => 'ok',
+                                       ),
+                                       '_dummy2' => 'foobaz!',
+                               ),
+                       ),
+                       array(
+                               'Strip: base',
+                               $stripArr,
+                               array( 'Strip' => 'base' ),
+                               array(
+                                       'foo' => array(
+                                               'bar' => array( '_dummy' => 'foobaz' ),
+                                               'baz' => array(
+                                                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                                                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                                                       ApiResult::META_PRESERVE_KEYS => array( 'foo', 'bar', '_dummy2', 0 ),
+                                                       ApiResult::META_TYPE => 'array',
+                                               ),
+                                               'x' => 'ok',
+                                               '_dummy' => 'foobaz',
+                                       ),
+                                       '_dummy2' => 'foobaz!',
+                               ),
+                       ),
+                       array(
+                               'Strip: bc',
+                               $stripArr,
+                               array( 'Strip' => 'bc' ),
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(),
+                                               'baz' => array(
+                                                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                                                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                                               ),
+                                               'x' => 'ok',
+                                       ),
+                                       '_dummy2' => 'foobaz!',
+                                       ApiResult::META_SUBELEMENTS => array( 'foo', 'bar' ),
+                                       ApiResult::META_INDEXED_TAG_NAME => 'itn',
+                               ),
+                       ),
+
+                       array(
+                               'Custom transform',
+                               array(
+                                       'foo' => '?',
+                                       'bar' => '?',
+                                       '_dummy' => '?',
+                                       '_dummy2' => '?',
+                                       '_dummy3' => '?',
+                                       ApiResult::META_CONTENT => 'foo',
+                                       ApiResult::META_PRESERVE_KEYS => array( '_dummy2', '_dummy3' ),
+                               ),
+                               array(
+                                       'Custom' => array( $this, 'customTransform' ),
+                                       'BC' => array(),
+                                       'Types' => array(),
+                                       'Strip' => 'all'
+                               ),
+                               array(
+                                       '*' => 'FOO',
+                                       'bar' => 'BAR',
+                                       'baz' => array( 'a', 'b' ),
+                                       '_dummy2' => '_DUMMY2',
+                                       '_dummy3' => '_DUMMY3',
+                                       ApiResult::META_CONTENT => 'bar',
+                               ),
+                       ),
+               );
+
+       }
+
+       /**
+        * Custom transformer for testTransformations
+        * @param array &$data
+        * @param array &$metadata
+        */
+       public function customTransform( &$data, &$metadata ) {
+               // Prevent recursion
+               if ( isset( $metadata['_added'] ) ) {
+                       $metadata[ApiResult::META_TYPE] = 'array';
+                       return;
+               }
+
+               foreach ( $data as $k => $v ) {
+                       $data[$k] = strtoupper( $k );
+               }
+               $data['baz'] = array( '_added' => 1, 'z' => 'b', 'y' => 'a' );
+               $metadata[ApiResult::META_PRESERVE_KEYS][0] = '_dummy';
+               $data[ApiResult::META_CONTENT] = 'bar';
+       }
+
+       /**
+        * @covers ApiResult
+        */
+       public function testDeprecatedFunctions() {
+               // Ignore ApiResult deprecation warnings during this test
+               set_error_handler( function ( $errno, $errstr ) use ( &$warnings ) {
+                       if ( preg_match( '/Use of ApiResult::\S+ was deprecated in MediaWiki \d+.\d+\./', $errstr ) ) {
+                               return true;
+                       }
+                       if ( preg_match( '/Use of ApiMain to ApiResult::__construct was deprecated in MediaWiki \d+.\d+\./', $errstr ) ) {
+                               return true;
+                       }
+                       return false;
+               } );
+               $reset = new ScopedCallback( 'restore_error_handler' );
+
+               $context = new DerivativeContext( RequestContext::getMain() );
+               $context->setConfig( new HashConfig( array(
+                       'APIModules' => array(),
+                       'APIFormatModules' => array(),
+                       'APIMaxResultSize' => 42,
+               ) ) );
+               $main = new ApiMain( $context );
+               $result = TestingAccessWrapper::newFromObject( new ApiResult( $main ) );
+               $this->assertSame( 42, $result->maxSize );
+               $this->assertSame( $main->getErrorFormatter(), $result->errorFormatter );
+               $this->assertSame( $main, $result->mainForContinuation );
+
+               $result = new ApiResult( 8388608 );
+
+               $result->addContentValue( null, 'test', 'content' );
+               $result->addContentValue( array( 'foo', 'bar' ), 'test', 'content' );
+               $result->addIndexedTagName( null, 'itn' );
+               $result->addSubelementsList( null, array( 'sub' ) );
+               $this->assertSame( array(
+                       'foo' => array(
+                               'bar' => array(
+                                       '*' => 'content',
+                               ),
+                       ),
+                       '*' => 'content',
+               ), $result->getData() );
+               $result->setRawMode();
+               $this->assertSame( array(
+                       'foo' => array(
+                               'bar' => array(
+                                       '*' => 'content',
+                               ),
+                       ),
+                       '*' => 'content',
+                       '_element' => 'itn',
+                       '_subelements' => array( 'sub' ),
+               ), $result->getData() );
+
+               $arr = array();
+               ApiResult::setContent( $arr, 'value' );
+               ApiResult::setContent( $arr, 'value2', 'foobar' );
+               $this->assertSame( array(
+                       ApiResult::META_CONTENT => 'content',
+                       'content' => 'value',
+                       'foobar' => array(
+                               ApiResult::META_CONTENT => 'content',
+                               'content' => 'value2',
+                       ),
+               ), $arr );
+
+               $result = new ApiResult( 3 );
+               $formatter = new ApiErrorFormatter_BackCompat( $result );
+               $result->setErrorFormatter( $formatter );
+               $result->disableSizeCheck();
+               $this->assertTrue( $result->addValue( null, 'foo', '1234567890' ) );
+               $result->enableSizeCheck();
+               $this->assertSame( 0, $result->getSize() );
+               $this->assertFalse( $result->addValue( null, 'foo', '1234567890' ) );
+
+               $arr = array( 'foo' => array( 'bar' => 1 ) );
+               $result->setIndexedTagName_recursive( $arr, 'itn' );
+               $this->assertSame( array(
+                       'foo' => array(
+                               'bar' => 1,
+                               ApiResult::META_INDEXED_TAG_NAME => 'itn'
+                       ),
+               ), $arr );
+
+               $status = Status::newGood();
+               $status->fatal( 'parentheses', '1' );
+               $status->fatal( 'parentheses', '2' );
+               $status->warning( 'parentheses', '3' );
+               $status->warning( 'parentheses', '4' );
+               $this->assertSame( array(
+                       array(
+                               'type' => 'error',
+                               'message' => 'parentheses',
+                               'params' => array(
+                                       0 => '1',
+                                       ApiResult::META_INDEXED_TAG_NAME => 'param',
+                               ),
+                       ),
+                       array(
+                               'type' => 'error',
+                               'message' => 'parentheses',
+                               'params' => array(
+                                       0 => '2',
+                                       ApiResult::META_INDEXED_TAG_NAME => 'param',
+                               ),
+                       ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'error',
+               ), $result->convertStatusToArray( $status, 'error' ) );
+               $this->assertSame( array(
+                       array(
+                               'type' => 'warning',
+                               'message' => 'parentheses',
+                               'params' => array(
+                                       0 => '3',
+                                       ApiResult::META_INDEXED_TAG_NAME => 'param',
+                               ),
+                       ),
+                       array(
+                               'type' => 'warning',
+                               'message' => 'parentheses',
+                               'params' => array(
+                                       0 => '4',
+                                       ApiResult::META_INDEXED_TAG_NAME => 'param',
+                               ),
+                       ),
+                       ApiResult::META_INDEXED_TAG_NAME => 'warning',
+               ), $result->convertStatusToArray( $status, 'warning' ) );
+       }
+
+       /**
+        * @covers ApiResult
+        */
+       public function testDeprecatedContinuation() {
+               // Ignore ApiResult deprecation warnings during this test
+               set_error_handler( function ( $errno, $errstr ) use ( &$warnings ) {
+                       if ( preg_match( '/Use of ApiResult::\S+ was deprecated in MediaWiki \d+.\d+\./', $errstr ) ) {
+                               return true;
+                       }
+                       return false;
+               } );
+
+               $reset = new ScopedCallback( 'restore_error_handler' );
+               $allModules = array(
+                       new MockApiQueryBase( 'mock1' ),
+                       new MockApiQueryBase( 'mock2' ),
+                       new MockApiQueryBase( 'mocklist' ),
+               );
+               $generator = new MockApiQueryBase( 'generator' );
+
+               $main = new ApiMain( RequestContext::getMain() );
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $result->setContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $result->setGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $result->setGeneratorContinueParam( $generator, 'gcontinue', array( 3, 4 ) );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2|mocklist',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'generator' => array( 'gcontinue' => '3|4' ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $result->setGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'gcontinue' => 3,
+                       'continue' => 'gcontinue||',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setGeneratorContinueParam( $generator, 'gcontinue', 3 );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'gcontinue' => 3,
+                       'continue' => 'gcontinue||mocklist',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'generator' => array( 'gcontinue' => 3 ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $result->setContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[0], 'm1continue', array( 1, 2 ) );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'm1continue' => '1|2',
+                       'continue' => '||mock2|mocklist',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( null, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mock1' => array( 'm1continue' => '1|2' ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->setContinueParam( $allModules[2], 'mlcontinue', 2 );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( array(
+                       'mlcontinue' => 2,
+                       'continue' => '-||mock1|mock2',
+               ), $result->getResultData( 'continue' ) );
+               $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( array(
+                       'mocklist' => array( 'mlcontinue' => 2 ),
+               ), $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( null, $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame( array( false, $allModules ), $ret );
+               $result->endContinuation( 'raw' );
+               $result->endContinuation( 'standard' );
+               $this->assertSame( null, $result->getResultData( 'continue' ) );
+               $this->assertSame( true, $result->getResultData( 'batchcomplete' ) );
+               $this->assertSame( null, $result->getResultData( 'query-continue' ) );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( '||mock2', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame(
+                       array( false, array_values( array_diff_key( $allModules, array( 1 => 1 ) ) ) ),
+                       $ret
+               );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $ret = $result->beginContinuation( '-||', $allModules, array( 'mock1', 'mock2' ) );
+               $this->assertSame(
+                       array( true, array_values( array_diff_key( $allModules, array( 0 => 0, 1 => 1 ) ) ) ),
+                       $ret
+               );
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               try {
+                       $result->beginContinuation( 'foo', $allModules, array( 'mock1', 'mock2' ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UsageException $ex ) {
+                       $this->assertSame(
+                               'Invalid continue param. You should pass the original value returned by the previous query',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               $main->setContinuationManager( null );
+
+               $result = new ApiResult( 8388608 );
+               $result->setMainForContinuation( $main );
+               $result->beginContinuation( '||mock2', array_slice( $allModules, 0, 2 ), array( 'mock1', 'mock2' ) );
+               try {
+                       $result->setContinueParam( $allModules[1], 'm2continue', 1 );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'Module \'mock2\' was not supposed to have been executed, but it was executed anyway',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               try {
+                       $result->setContinueParam( $allModules[2], 'mlcontinue', 1 );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'Module \'mocklist\' called ApiContinuationManager::addContinueParam but was not passed to ApiContinuationManager::__construct',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+               $main->setContinuationManager( null );
+
+       }
+
+       public function testObjectSerialization() {
+               $arr = array();
+               ApiResult::setValue( $arr, 'foo', (object)array( 'a' => 1, 'b' => 2 ) );
+               $this->assertSame( array(
+                       'a' => 1,
+                       'b' => 2,
+                       ApiResult::META_TYPE => 'assoc',
+               ), $arr['foo'] );
+
+               $arr = array();
+               ApiResult::setValue( $arr, 'foo', new ApiResultTestStringifiableObject() );
+               $this->assertSame( 'Ok', $arr['foo'] );
+
+               $arr = array();
+               ApiResult::setValue( $arr, 'foo', new ApiResultTestSerializableObject( 'Ok' ) );
+               $this->assertSame( 'Ok', $arr['foo'] );
+
+               try {
+                       $arr = array();
+                       ApiResult::setValue( $arr, 'foo',  new ApiResultTestSerializableObject(
+                               new ApiResultTestStringifiableObject()
+                       ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'ApiResultTestSerializableObject::serializeForApiResult() returned an object of class ApiResultTestStringifiableObject',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               try {
+                       $arr = array();
+                       ApiResult::setValue( $arr, 'foo',  new ApiResultTestSerializableObject( NAN ) );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( UnexpectedValueException $ex ) {
+                       $this->assertSame(
+                               'ApiResultTestSerializableObject::serializeForApiResult() returned an invalid value: Cannot add non-finite floats to ApiResult',
+                               $ex->getMessage(),
+                               'Expected exception'
+                       );
+               }
+
+               $arr = array();
+               ApiResult::setValue( $arr, 'foo',  new ApiResultTestSerializableObject(
+                       array(
+                               'one' => new ApiResultTestStringifiableObject( '1' ),
+                               'two' => new ApiResultTestSerializableObject( 2 ),
+                       )
+               ) );
+               $this->assertSame( array(
+                       'one' => '1',
+                       'two' => 2,
+               ), $arr['foo'] );
+       }
+
+}
+
+class ApiResultTestStringifiableObject {
+       private $ret;
+
+       public function __construct( $ret = 'Ok' ) {
+               $this->ret = $ret;
+       }
+
+       public function __toString() {
+               return $this->ret;
+       }
+}
+
+class ApiResultTestSerializableObject {
+       private $ret;
+
+       public function __construct( $ret ) {
+               $this->ret = $ret;
+       }
+
+       public function __toString() {
+               return "Fail";
+       }
+
+       public function serializeForApiResult() {
+               return $this->ret;
+       }
+}
index 8c27b10..da62bb0 100644 (file)
@@ -116,7 +116,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
                // construct result
                $results = array(
-                       $module->getResultData(),
+                       $module->getResult()->getResultData( null, array( 'Strip' => 'all' ) ),
                        $context->getRequest(),
                        $context->getRequest()->getSessionArray()
                );
index d94aa2c..516da0c 100644 (file)
@@ -4,9 +4,6 @@ class MockApi extends ApiBase {
        public function execute() {
        }
 
-       public function getVersion() {
-       }
-
        public function __construct() {
        }
 
index 4bede51..f5b50e5 100644 (file)
@@ -1,11 +1,15 @@
 <?php
 class MockApiQueryBase extends ApiQueryBase {
+       private $name;
+
        public function execute() {
        }
 
-       public function getVersion() {
+       public function __construct( $name = 'mock' ) {
+               $this->name = $name;
        }
 
-       public function __construct() {
+       public function getModuleName() {
+               return $this->name;
        }
 }
index 1e4ea53..3fcfc73 100644 (file)
@@ -16,8 +16,12 @@ class ApiFormatDbgTest extends ApiFormatTestBase {
                return array(
                        // Basic types
                        array( array( null ), "array ({$warning}\n  0 => NULL,\n)" ),
-                       array( array( true ), "array ({$warning}\n  0 => true,\n)" ),
-                       array( array( false ), "array ({$warning}\n  0 => false,\n)" ),
+                       array( array( true ), "array ({$warning}\n  0 => '',\n)" ),
+                       array( array( false ), "array ({$warning}\n)" ),
+                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "array ({$warning}\n  0 => true,\n)" ),
+                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "array ({$warning}\n  0 => false,\n)" ),
                        array( array( 42 ), "array ({$warning}\n  0 => 42,\n)" ),
                        array( array( 42.5 ), "array ({$warning}\n  0 => 42.5,\n)" ),
                        array( array( 1e42 ), "array ({$warning}\n  0 => 1.0E+42,\n)" ),
@@ -29,9 +33,22 @@ class ApiFormatDbgTest extends ApiFormatTestBase {
                        array( array( array( 1 ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
                        array( array( array( 'x' => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
                        array( array( array( 2 => 1 ) ), "array ({$warning}\n  0 => \n  array (\n    2 => 1,\n  ),\n)" ),
+                       array( array( (object)array() ), "array ({$warning}\n  0 => \n  array (\n  ),\n)" ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               "array ({$warning}\n  0 => \n  array (\n    0 => \n    array (\n      'key' => 'x',\n      '*' => 1,\n    ),\n  ),\n)" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)" ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "array ({$warning}\n  0 => \n  array (\n    0 => 'a',\n    1 => 'b',\n  ),\n)" ),
 
                        // Content
-                       array( array( '*' => 'foo' ), "array ({$warning}\n  '*' => 'foo',\n)" ),
+                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               "array ({$warning}\n  '*' => 'foo',\n)" ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                               "array ({$warning}\n  'foo' => \n  array (\n    '*' => 'foo',\n  ),\n)" ),
                );
        }
 
index 2800d2d..c0f67f8 100644 (file)
@@ -24,8 +24,12 @@ class ApiFormatDumpTest extends ApiFormatTestBase {
                return array(
                        // Basic types
                        array( array( null ), "array(2) {{$warning}\n  [0]=>\n  NULL\n}\n" ),
-                       array( array( true ), "array(2) {{$warning}\n  [0]=>\n  bool(true)\n}\n" ),
-                       array( array( false ), "array(2) {{$warning}\n  [0]=>\n  bool(false)\n}\n" ),
+                       array( array( true ), "array(2) {{$warning}\n  [0]=>\n  string(0) \"\"\n}\n" ),
+                       array( array( false ), "array(1) {{$warning}\n}\n" ),
+                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "array(2) {{$warning}\n  [0]=>\n  bool(true)\n}\n" ),
+                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "array(2) {{$warning}\n  [0]=>\n  bool(false)\n}\n" ),
                        array( array( 42 ), "array(2) {{$warning}\n  [0]=>\n  int(42)\n}\n" ),
                        array( array( 42.5 ), "array(2) {{$warning}\n  [0]=>\n  float(42.5)\n}\n" ),
                        array( array( 1e42 ), "array(2) {{$warning}\n  [0]=>\n  float(1.0E+42)\n}\n" ),
@@ -37,9 +41,22 @@ class ApiFormatDumpTest extends ApiFormatTestBase {
                        array( array( array( 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
                        array( array( array( 'x' => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
                        array( array( array( 2 => 1 ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [2]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( (object)array() ), "array(2) {{$warning}\n  [0]=>\n  array(0) {\n  }\n}\n" ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [0]=>\n    array(2) {\n      [\"key\"]=>\n      string(1) \"x\"\n      [\"*\"]=>\n      int(1)\n    }\n  }\n}\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "array(2) {{$warning}\n  [0]=>\n  array(1) {\n    [\"x\"]=>\n    int(1)\n  }\n}\n" ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "array(2) {{$warning}\n  [0]=>\n  array(2) {\n    [0]=>\n    string(1) \"a\"\n    [1]=>\n    string(1) \"b\"\n  }\n}\n" ),
 
                        // Content
-                       array( array( '*' => 'foo' ), "array(2) {{$warning}\n  [\"*\"]=>\n  string(3) \"foo\"\n}\n" ),
+                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               "array(2) {{$warning}\n  [\"*\"]=>\n  string(3) \"foo\"\n}\n" ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                               "array(2) {{$warning}\n  [\"foo\"]=>\n  array(1) {\n    [\"*\"]=>\n    string(3) \"foo\"\n  }\n}\n" ),
                );
        }
 
index bdf3f13..3dfcaf0 100644 (file)
@@ -8,34 +8,102 @@ class ApiFormatJsonTest extends ApiFormatTestBase {
 
        protected $printerName = 'json';
 
+       private static function addFormatVersion( $format, $arr ) {
+               foreach ( $arr as &$p ) {
+                       if ( !isset( $p[2] ) ) {
+                               $p[2] = array( 'formatversion' => $format );
+                       } else {
+                               $p[2]['formatversion'] = $format;
+                       }
+               }
+               return $arr;
+       }
+
        public static function provideGeneralEncoding() {
-               return array(
-                       // Basic types
-                       array( array( null ), '[null]' ),
-                       array( array( true ), '[true]' ),
-                       array( array( false ), '[false]' ),
-                       array( array( 42 ), '[42]' ),
-                       array( array( 42.5 ), '[42.5]' ),
-                       array( array( 1e42 ), '[1.0e+42]' ),
-                       array( array( 'foo' ), '["foo"]' ),
-                       array( array( 'fóo' ), '["f\u00f3o"]' ),
-                       array( array( 'fóo' ), '["fóo"]', array( 'utf8' => 1 ) ),
-
-                       // Arrays and objects
-                       array( array( array() ), '[[]]' ),
-                       array( array( array( 1 ) ), '[[1]]' ),
-                       array( array( array( 'x' => 1 ) ), '[{"x":1}]' ),
-                       array( array( array( 2 => 1 ) ), '[{"2":1}]' ),
-                       array( array( (object)array() ), '[{}]' ),
-
-                       // Content
-                       array( array( '*' => 'foo' ), '{"*":"foo"}' ),
-
-                       // Callbacks
-                       array( array( 1 ), '/**/myCallback([1])', array( 'callback' => 'myCallback' ) ),
-
-                       // Cross-domain mangling
-                       array( array( '< Cross-Domain-Policy >' ), '["\u003C Cross-Domain-Policy \u003E"]' ),
+               return array_merge(
+                       self::addFormatVersion( 1, array(
+                               // Basic types
+                               array( array( null ), '[null]' ),
+                               array( array( true ), '[""]' ),
+                               array( array( false ), '[]' ),
+                               array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ), '[true]' ),
+                               array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ), '[false]' ),
+                               array( array( 42 ), '[42]' ),
+                               array( array( 42.5 ), '[42.5]' ),
+                               array( array( 1e42 ), '[1.0e+42]' ),
+                               array( array( 'foo' ), '["foo"]' ),
+                               array( array( 'fóo' ), '["f\u00f3o"]' ),
+                               array( array( 'fóo' ), '["fóo"]', array( 'utf8' => 1 ) ),
+
+                               // Arrays and objects
+                               array( array( array() ), '[[]]' ),
+                               array( array( array( 1 ) ), '[[1]]' ),
+                               array( array( array( 'x' => 1 ) ), '[{"x":1}]' ),
+                               array( array( array( 2 => 1 ) ), '[{"2":1}]' ),
+                               array( array( (object)array() ), '[{}]' ),
+                               array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                                       '[[{"key":"x","*":1}]]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[{"x":1}]' ),
+                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[["a","b"]]' ),
+
+                               // Content
+                               array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                                       '{"*":"foo"}' ),
+
+                               // BC Subelements
+                               array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                                       '{"foo":{"*":"foo"}}' ),
+
+                               // Callbacks
+                               array( array( 1 ), '/**/myCallback([1])', array( 'callback' => 'myCallback' ) ),
+
+                               // Cross-domain mangling
+                               array( array( '< Cross-Domain-Policy >' ), '["\u003C Cross-Domain-Policy \u003E"]' ),
+                       ) ),
+                       self::addFormatVersion( 2, array(
+                               // Basic types
+                               array( array( null ), '[null]' ),
+                               array( array( true ), '[true]' ),
+                               array( array( false ), '[false]' ),
+                               array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ), '[true]' ),
+                               array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ), '[false]' ),
+                               array( array( 42 ), '[42]' ),
+                               array( array( 42.5 ), '[42.5]' ),
+                               array( array( 1e42 ), '[1.0e+42]' ),
+                               array( array( 'foo' ), '["foo"]' ),
+                               array( array( 'fóo' ), '["fóo"]' ),
+                               array( array( 'fóo' ), '["f\u00f3o"]', array( 'ascii' => 1 ) ),
+
+                               // Arrays and objects
+                               array( array( array() ), '[[]]' ),
+                               array( array( array( 'x' => 1 ) ), '[{"x":1}]' ),
+                               array( array( array( 2 => 1 ) ), '[{"2":1}]' ),
+                               array( array( (object)array() ), '[{}]' ),
+                               array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '[{"0":1}]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '[[1]]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '[{"x":1}]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                                       '[{"x":1}]' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '[[1]]' ),
+                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '[{"0":"a","1":"b"}]' ),
+
+                               // Content
+                               array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                                       '{"content":"foo"}' ),
+
+                               // BC Subelements
+                               array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                                       '{"foo":"foo"}' ),
+
+                               // Callbacks
+                               array( array( 1 ), '/**/myCallback([1])', array( 'callback' => 'myCallback' ) ),
+
+                               // Cross-domain mangling
+                               array( array( '< Cross-Domain-Policy >' ), '["\u003C Cross-Domain-Policy \u003E"]' ),
+                       ) )
                );
        }
 
index 1487ad0..8f81a41 100644 (file)
@@ -25,9 +25,19 @@ class ApiFormatNoneTest extends ApiFormatTestBase {
                        array( array( array( 1 ) ), '' ),
                        array( array( array( 'x' => 1 ) ), '' ),
                        array( array( array( 2 => 1 ) ), '' ),
+                       array( array( (object)array() ), '' ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), '' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ), '' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '' ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '' ),
 
                        // Content
                        array( array( '*' => 'foo' ), '' ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ), '' ),
                );
        }
 
index 469346c..0cb44e9 100644 (file)
@@ -8,26 +8,93 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
 
        protected $printerName = 'php';
 
+       private static function addFormatVersion( $format, $arr ) {
+               foreach ( $arr as &$p ) {
+                       if ( !isset( $p[2] ) ) {
+                               $p[2] = array( 'formatversion' => $format );
+                       } else {
+                               $p[2]['formatversion'] = $format;
+                       }
+               }
+               return $arr;
+       }
+
        public static function provideGeneralEncoding() {
-               return array(
-                       // Basic types
-                       array( array( null ), 'a:1:{i:0;N;}' ),
-                       array( array( true ), 'a:1:{i:0;b:1;}' ),
-                       array( array( false ), 'a:1:{i:0;b:0;}' ),
-                       array( array( 42 ), 'a:1:{i:0;i:42;}' ),
-                       array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
-                       array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
-                       array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
-                       array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
+               return array_merge(
+                       self::addFormatVersion( 1, array(
+                               // Basic types
+                               array( array( null ), 'a:1:{i:0;N;}' ),
+                               array( array( true ), 'a:1:{i:0;s:0:"";}' ),
+                               array( array( false ), 'a:0:{}' ),
+                               array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                                       'a:1:{i:0;b:1;}' ),
+                               array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                                       'a:1:{i:0;b:0;}' ),
+                               array( array( 42 ), 'a:1:{i:0;i:42;}' ),
+                               array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
+                               array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
+                               array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
+                               array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
+
+                               // Arrays and objects
+                               array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
+                               array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
+                               array( array( (object)array() ), 'a:1:{i:0;a:0:{}}' ),
+                               array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                                       'a:1:{i:0;a:1:{i:0;a:2:{s:3:"key";s:1:"x";s:1:"*";i:1;}}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ),
+
+                               // Content
+                               array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                                       'a:1:{s:1:"*";s:3:"foo";}' ),
+
+                               // BC Subelements
+                               array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                                       'a:1:{s:3:"foo";a:1:{s:1:"*";s:3:"foo";}}' ),
+                       ) ),
+                       self::addFormatVersion( 2, array(
+                               // Basic types
+                               array( array( null ), 'a:1:{i:0;N;}' ),
+                               array( array( true ), 'a:1:{i:0;b:1;}' ),
+                               array( array( false ), 'a:1:{i:0;b:0;}' ),
+                               array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                                       'a:1:{i:0;b:1;}' ),
+                               array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                                       'a:1:{i:0;b:0;}' ),
+                               array( array( 42 ), 'a:1:{i:0;i:42;}' ),
+                               array( array( 42.5 ), 'a:1:{i:0;d:42.5;}' ),
+                               array( array( 1e42 ), 'a:1:{i:0;d:1.0E+42;}' ),
+                               array( array( 'foo' ), 'a:1:{i:0;s:3:"foo";}' ),
+                               array( array( 'fóo' ), 'a:1:{i:0;s:4:"fóo";}' ),
+
+                               // Arrays and objects
+                               array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
+                               array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
+                               array( array( (object)array() ), 'a:1:{i:0;a:0:{}}' ),
+                               array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                                       'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
+                               array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
+                               array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), 'a:1:{i:0;a:2:{i:0;s:1:"a";i:1;s:1:"b";}}' ),
 
-                       // Arrays and objects
-                       array( array( array() ), 'a:1:{i:0;a:0:{}}' ),
-                       array( array( array( 1 ) ), 'a:1:{i:0;a:1:{i:0;i:1;}}' ),
-                       array( array( array( 'x' => 1 ) ), 'a:1:{i:0;a:1:{s:1:"x";i:1;}}' ),
-                       array( array( array( 2 => 1 ) ), 'a:1:{i:0;a:1:{i:2;i:1;}}' ),
+                               // Content
+                               array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                                       'a:1:{s:7:"content";s:3:"foo";}' ),
 
-                       // Content
-                       array( array( '*' => 'foo' ), 'a:1:{s:1:"*";s:3:"foo";}' ),
+                               // BC Subelements
+                               array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                                       'a:1:{s:3:"foo";s:3:"foo";}' ),
+                       ) )
                );
        }
 
index 67949ab..cabf62b 100644 (file)
@@ -33,6 +33,7 @@ abstract class ApiFormatTestBase extends MediaWikiTestCase {
                        $main->getModuleManager()->addModule( $this->printerName, 'format', $class );
                }
                $result = $main->getResult();
+               $result->addArrayType( null, 'default' );
                foreach ( $data as $k => $v ) {
                        $result->addValue( null, $k, $v );
                }
index 06e9204..b0a2a96 100644 (file)
@@ -16,8 +16,12 @@ class ApiFormatTxtTest extends ApiFormatTestBase {
                return array(
                        // Basic types
                        array( array( null ), "Array\n({$warning}\n    [0] => \n)\n" ),
-                       array( array( true ), "Array\n({$warning}\n    [0] => 1\n)\n" ),
-                       array( array( false ), "Array\n({$warning}\n    [0] => \n)\n" ),
+                       array( array( true ), "Array\n({$warning}\n    [0] => \n)\n" ),
+                       array( array( false ), "Array\n({$warning}\n)\n" ),
+                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "Array\n({$warning}\n    [0] => 1\n)\n" ),
+                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "Array\n({$warning}\n    [0] => \n)\n" ),
                        array( array( 42 ), "Array\n({$warning}\n    [0] => 42\n)\n" ),
                        array( array( 42.5 ), "Array\n({$warning}\n    [0] => 42.5\n)\n" ),
                        array( array( 1e42 ), "Array\n({$warning}\n    [0] => 1.0E+42\n)\n" ),
@@ -29,9 +33,22 @@ class ApiFormatTxtTest extends ApiFormatTestBase {
                        array( array( array( 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
                        array( array( array( 'x' => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
                        array( array( array( 2 => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [2] => 1\n        )\n\n)\n" ),
+                       array( array( (object)array() ), "Array\n({$warning}\n    [0] => Array\n        (\n        )\n\n)\n" ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => Array\n                (\n                    [key] => x\n                    [*] => 1\n                )\n\n        )\n\n)\n" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => a\n            [1] => b\n        )\n\n)\n" ),
 
                        // Content
-                       array( array( '*' => 'foo' ), "Array\n({$warning}\n    [*] => foo\n)\n" ),
+                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               "Array\n({$warning}\n    [*] => foo\n)\n" ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                               "Array\n({$warning}\n    [foo] => Array\n        (\n            [*] => foo\n        )\n\n)\n" ),
                );
        }
 
index 81676e0..0711130 100644 (file)
@@ -24,8 +24,12 @@ class ApiFormatWddxTest extends ApiFormatTestBase {
                return array(
                        // Basic types
                        array( array( null ), "{$p}<var name='0'><null/></var>{$s}" ),
-                       array( array( true ), "{$p}<var name='0'><boolean value='true'/></var>{$s}" ),
-                       array( array( false ), "{$p}<var name='0'><boolean value='false'/></var>{$s}" ),
+                       array( array( true ), "{$p}<var name='0'><string></string></var>{$s}" ),
+                       array( array( false ), "{$p}{$s}" ),
+                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "{$p}<var name='0'><boolean value='true'/></var>{$s}" ),
+                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
+                               "{$p}<var name='0'><boolean value='false'/></var>{$s}" ),
                        array( array( 42 ), "{$p}<var name='0'><number>42</number></var>{$s}" ),
                        array( array( 42.5 ), "{$p}<var name='0'><number>42.5</number></var>{$s}" ),
                        array( array( 1e42 ), "{$p}<var name='0'><number>1.0E+42</number></var>{$s}" ),
@@ -37,9 +41,22 @@ class ApiFormatWddxTest extends ApiFormatTestBase {
                        array( array( array( 1 ) ), "{$p}<var name='0'><array length='1'><number>1</number></array></var>{$s}" ),
                        array( array( array( 'x' => 1 ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
                        array( array( array( 2 => 1 ) ), "{$p}<var name='0'><struct><var name='2'><number>1</number></var></struct></var>{$s}" ),
+                       array( array( (object)array() ), "{$p}<var name='0'><struct></struct></var>{$s}" ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "{$p}<var name='0'><struct><var name='0'><number>1</number></var></struct></var>{$s}" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "{$p}<var name='0'><array length='1'><number>1</number></array></var>{$s}" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               "{$p}<var name='0'><array length='1'><struct><var name='key'><string>x</string></var><var name='*'><number>1</number></var></struct></array></var>{$s}" ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "{$p}<var name='0'><struct><var name='x'><number>1</number></var></struct></var>{$s}" ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "{$p}<var name='0'><array length='2'><string>a</string><string>b</string></array></var>{$s}" ),
 
                        // Content
-                       array( array( '*' => 'foo' ), "{$p}<var name='*'><string>foo</string></var>{$s}" ),
+                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               "{$p}<var name='*'><string>foo</string></var>{$s}" ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                               "{$p}<var name='foo'><struct><var name='*'><string>foo</string></var></struct></var>{$s}" ),
                );
        }
 
index afb47e7..0c31b95 100644 (file)
@@ -9,8 +9,8 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
 
        protected $printerName = 'xml';
 
-       protected function setUp() {
-               parent::setUp();
+       public static function setUpBeforeClass() {
+               parent::setUpBeforeClass();
                $page = WikiPage::factory( Title::newFromText( 'MediaWiki:ApiFormatXmlTest.xsl' ) );
                $page->doEditContent( new WikitextContent(
                        '<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" />'
@@ -22,29 +22,79 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
        }
 
        public static function provideGeneralEncoding() {
-               $tests = array(
+               return array(
                        // Basic types
-                       array( array( null ), '<?xml version="1.0"?><api><x /></api>' ),
-                       array( array( true, 'a' => true ), '<?xml version="1.0"?><api a=""><x>1</x></api>' ),
-                       array( array( false, 'a' => false ), '<?xml version="1.0"?><api><x></x></api>' ),
-                       array( array( 42, 'a' => 42 ), '<?xml version="1.0"?><api a="42"><x>42</x></api>' ),
-                       array( array( 42.5, 'a' => 42.5 ), '<?xml version="1.0"?><api a="42.5"><x>42.5</x></api>' ),
-                       array( array( 1e42, 'a' => 1e42 ), '<?xml version="1.0"?><api a="1.0E+42"><x>1.0E+42</x></api>' ),
-                       array( array( 'foo', 'a' => 'foo' ), '<?xml version="1.0"?><api a="foo"><x>foo</x></api>' ),
-                       array( array( 'fóo', 'a' => 'fóo' ), '<?xml version="1.0"?><api a="fóo"><x>fóo</x></api>' ),
+                       array( array( null, 'a' => null ), '<?xml version="1.0"?><api><_v _idx="0" /></api>' ),
+                       array( array( true, 'a' => true ), '<?xml version="1.0"?><api a=""><_v _idx="0">true</_v></api>' ),
+                       array( array( false, 'a' => false ), '<?xml version="1.0"?><api><_v _idx="0">false</_v></api>' ),
+                       array( array( true, 'a' => true, ApiResult::META_BC_BOOLS => array( 0, 'a' ) ),
+                               '<?xml version="1.0"?><api a=""><_v _idx="0">1</_v></api>' ),
+                       array( array( false, 'a' => false, ApiResult::META_BC_BOOLS => array( 0, 'a' ) ),
+                               '<?xml version="1.0"?><api><_v _idx="0"></_v></api>' ),
+                       array( array( 42, 'a' => 42 ), '<?xml version="1.0"?><api a="42"><_v _idx="0">42</_v></api>' ),
+                       array( array( 42.5, 'a' => 42.5 ), '<?xml version="1.0"?><api a="42.5"><_v _idx="0">42.5</_v></api>' ),
+                       array( array( 1e42, 'a' => 1e42 ), '<?xml version="1.0"?><api a="1.0E+42"><_v _idx="0">1.0E+42</_v></api>' ),
+                       array( array( 'foo', 'a' => 'foo' ), '<?xml version="1.0"?><api a="foo"><_v _idx="0">foo</_v></api>' ),
+                       array( array( 'fóo', 'a' => 'fóo' ), '<?xml version="1.0"?><api a="fóo"><_v _idx="0">fóo</_v></api>' ),
 
                        // Arrays and objects
-                       array( array( array() ), '<?xml version="1.0"?><api><x /></api>' ),
-                       array( array( array( 'x' => 1 ) ), '<?xml version="1.0"?><api><x x="1" /></api>' ),
-                       array( array( array( 2 => 1, '_element' => 'x' ) ), '<?xml version="1.0"?><api><x><x>1</x></x></api>' ),
+                       array( array( array() ), '<?xml version="1.0"?><api><_v /></api>' ),
+                       array( array( array( 'x' => 1 ) ), '<?xml version="1.0"?><api><_v x="1" /></api>' ),
+                       array( array( array( 2 => 1 ) ), '<?xml version="1.0"?><api><_v><_v _idx="2">1</_v></_v></api>' ),
+                       array( array( (object)array() ), '<?xml version="1.0"?><api><_v /></api>' ),
+                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), '<?xml version="1.0"?><api><_v><_v _idx="0">1</_v></_v></api>' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), '<?xml version="1.0"?><api><_v><_v>1</_v></_v></api>' ),
+                       array( array( array( 'x' => 1, 'y' => array( 'z' => 1 ), ApiResult::META_TYPE => 'kvp' ) ),
+                               '<?xml version="1.0"?><api><_v><_v _name="x" xml:space="preserve">1</_v><_v _name="y"><z xml:space="preserve">1</z></_v></_v></api>' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp', ApiResult::META_INDEXED_TAG_NAME => 'i', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               '<?xml version="1.0"?><api><_v><i key="x" xml:space="preserve">1</i></_v></api>' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
+                               '<?xml version="1.0"?><api><_v><_v key="x" xml:space="preserve">1</_v></_v></api>' ),
+                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), '<?xml version="1.0"?><api><_v x="1" /></api>' ),
+                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), '<?xml version="1.0"?><api><_v><_v _idx="0">a</_v><_v _idx="1">b</_v></_v></api>' ),
 
                        // Content
-                       array( array( '*' => 'foo' ), '<?xml version="1.0"?><api xml:space="preserve">foo</api>' ),
+                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               '<?xml version="1.0"?><api xml:space="preserve">foo</api>' ),
+
+                       // Specified element name
+                       array( array( 'foo', 'bar', ApiResult::META_INDEXED_TAG_NAME => 'itn' ),
+                               '<?xml version="1.0"?><api><itn>foo</itn><itn>bar</itn></api>' ),
 
                        // Subelements
                        array( array( 'a' => 1, 's' => 1, '_subelements' => array( 's' ) ),
                                '<?xml version="1.0"?><api a="1"><s xml:space="preserve">1</s></api>' ),
 
+                       // Content and subelement
+                       array( array( 'a' => 1, 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               '<?xml version="1.0"?><api a="1" xml:space="preserve">foo</api>' ),
+                       array( array( 's' => array(), 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
+                               '<?xml version="1.0"?><api><s /><content xml:space="preserve">foo</content></api>' ),
+                       array(
+                               array(
+                                       's' => 1,
+                                       'content' => 'foo',
+                                       ApiResult::META_CONTENT => 'content',
+                                       ApiResult::META_SUBELEMENTS => array( 's' )
+                               ),
+                               '<?xml version="1.0"?><api><s xml:space="preserve">1</s><content xml:space="preserve">foo</content></api>'
+                       ),
+
+                       // BC Subelements
+                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
+                               '<?xml version="1.0"?><api><foo xml:space="preserve">foo</foo></api>' ),
+
+                       // Name mangling
+                       array( array( 'foo.bar' => 1 ), '<?xml version="1.0"?><api foo.bar="1" />' ),
+                       array( array( '' => 1 ), '<?xml version="1.0"?><api _="1" />' ),
+                       array( array( 'foo bar' => 1 ), '<?xml version="1.0"?><api _foo.20.bar="1" />' ),
+                       array( array( 'foo:bar' => 1 ), '<?xml version="1.0"?><api _foo.3A.bar="1" />' ),
+                       array( array( 'foo%.bar' => 1 ), '<?xml version="1.0"?><api _foo.25..2E.bar="1" />' ),
+                       array( array( '4foo' => 1, 'foo4' => 1 ), '<?xml version="1.0"?><api _4foo="1" foo4="1" />' ),
+                       array( array( "foo\xe3\x80\x80bar" => 1 ), '<?xml version="1.0"?><api _foo.3000.bar="1" />' ),
+                       array( array( 'foo:bar' => 1, ApiResult::META_PRESERVE_KEYS => array( 'foo:bar' ) ),
+                               '<?xml version="1.0"?><api foo:bar="1" />' ),
+
                        // includenamespace param
                        array( array( 'x' => 'foo' ), '<?xml version="1.0"?><api x="foo" xmlns="http://www.mediawiki.org/xml/api/" />',
                                array( 'includexmlnamespace' => 1 ) ),
@@ -62,40 +112,6 @@ class ApiFormatXmlTest extends ApiFormatTestBase {
                                        '" type="text/xsl" ?><api />',
                                array( 'xslt' => 'MediaWiki:ApiFormatXmlTest.xsl' ) ),
                );
-
-               // Add in the needed "_element" for all indexed arrays
-               $ret = array();
-               foreach ( $tests as $v ) {
-                       $v[0] += array( '_element' => 'x' );
-                       $ret[] = $v;
-               }
-               return $ret;
-       }
-
-       /**
-        * @dataProvider provideXmlFail
-        */
-       public function testXmlFail( array $data, $expect, array $params = array() ) {
-               try {
-                       echo $this->encodeData( $params, $data ) . "\n";
-                       $this->fail( "Expected exception not thrown" );
-               } catch ( MWException $ex ) {
-                       $this->assertSame( $expect, $ex->getMessage(), 'Expected exception' );
-               }
-       }
-
-       public static function provideXmlFail() {
-               return array(
-                       // Array without _element
-                       array( array( 1 ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName().' ),
-                       // Content and subelement
-                       array( array( 1, 's' => array(), '*' => 2, '_element' => 'x' ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
-                       array( array( 1, 's' => 1, '*' => 2, '_element' => 'x', '_subelements' => array( 's' ) ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
-                       // These should fail but don't because of a long-standing bug (see T57371#639713)
-                       //array( array( 1, '*' => 2, '_element' => 'x' ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
-                       //array( array( 's' => array(), '*' => 2 ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
-                       //array( array( 's' => 1, '*' => 2, '_subelements' => array( 's' ) ), 'Internal error in ApiFormatXml::recXmlPrint: (api, ...) has content and subelements' ),
-               );
        }
 
 }
index 2431761..cd73522 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
                };
                // generator + 1 prop + 1 list
                $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
                $this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
                $this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
index de9965b..d441f4c 100644 (file)
@@ -67,7 +67,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                $data = $this->query( $mk( 99 ), 1, '1L', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
 
                // 1 list
                $this->checkC( $data, $mk( 1 ), 5, '1L-1' );
@@ -95,7 +95,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // 2 lists
                $data = $this->query( $mk( 99, 99 ), 1, '2L', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
                $this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
                $this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
@@ -120,7 +120,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 1 prop
                $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
                $this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
                $this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
@@ -146,7 +146,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 2 props
                $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
                $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
                $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
@@ -180,7 +180,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 1 prop + 1 list
                $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
                $this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
                $this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
@@ -218,7 +218,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 1 prop + 1 list
                $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
                $this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
                $this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
                $this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
@@ -249,7 +249,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 1 prop
                $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
 
                $this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
                $this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
@@ -296,7 +296,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 1 list
                $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false ) +
-                       array( 'batchcomplete' => '' );
+                       array( 'batchcomplete' => true );
 
                $this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
                $this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
index dabf72e..9e830f2 100644 (file)
@@ -56,12 +56,12 @@ STR;
         * @return array
         */
        private function validateRequestExpectedPair( $v ) {
-               $this->assertType( 'array', $v, self::PARAM_ASSERT );
+               $this->assertInternalType( 'array', $v, self::PARAM_ASSERT );
                $this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
                $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
                $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
-               $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
-               $this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+               $this->assertInternalType( 'array', $v[0], self::PARAM_ASSERT );
+               $this->assertInternalType( 'array', $v[1], self::PARAM_ASSERT );
 
                return $v;
        }
index b3cb7b5..0dba183 100644 (file)
@@ -46,6 +46,7 @@ class RecentChangeTest extends MediaWikiTestCase {
         * - protect/protect
         * - protect/modifyprotect
         * - protect/unprotect
+        * - protect/move_prot
         * - upload/upload
         * - merge/merge
         * - import/upload
@@ -223,6 +224,15 @@ class RecentChangeTest extends MediaWikiTestCase {
                        $protectParams,
                        $this->user_comment
                );
+
+               # protect/move_prot
+               $this->assertIRCComment(
+                       $this->context->msg( 'movedarticleprotection', 'SomeTitle', 'OldTitle' )
+                               ->plain() . $sep . $this->user_comment,
+                       'protect', 'move_prot',
+                       array( 'OldTitle' ),
+                       $this->user_comment
+               );
        }
 
        /**
index 988a59e..63743eb 100644 (file)
@@ -338,6 +338,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
        }
        */
 
+       public function testSupportsDirectEditing() {
+               $handler = new DummyContentHandlerForTesting( CONTENT_MODEL_JSON );
+               $this->assertFalse( $handler->supportsDirectEditing(), 'direct editing is not supported' );
+       }
+
        /**
         * @covers ContentHandler::runLegacyHooks
         */
@@ -365,164 +370,3 @@ class ContentHandlerTest extends MediaWikiTestCase {
                return true;
        }
 }
-
-class DummyContentHandlerForTesting extends ContentHandler {
-
-       public function __construct( $dataModel ) {
-               parent::__construct( $dataModel, array( "testing" ) );
-       }
-
-       /**
-        * @see ContentHandler::serializeContent
-        *
-        * @param Content $content
-        * @param string $format
-        *
-        * @return string
-        */
-       public function serializeContent( Content $content, $format = null ) {
-               return $content->serialize();
-       }
-
-       /**
-        * @see ContentHandler::unserializeContent
-        *
-        * @param string $blob
-        * @param string $format Unused.
-        *
-        * @return Content
-        */
-       public function unserializeContent( $blob, $format = null ) {
-               $d = unserialize( $blob );
-
-               return new DummyContentForTesting( $d );
-       }
-
-       /**
-        * Creates an empty Content object of the type supported by this ContentHandler.
-        *
-        */
-       public function makeEmptyContent() {
-               return new DummyContentForTesting( '' );
-       }
-}
-
-class DummyContentForTesting extends AbstractContent {
-
-       public function __construct( $data ) {
-               parent::__construct( "testing" );
-
-               $this->data = $data;
-       }
-
-       public function serialize( $format = null ) {
-               return serialize( $this->data );
-       }
-
-       /**
-        * @return string A string representing the content in a way useful for
-        *   building a full text search index. If no useful representation exists,
-        *   this method returns an empty string.
-        */
-       public function getTextForSearchIndex() {
-               return '';
-       }
-
-       /**
-        * @return string|bool The wikitext to include when another page includes this  content,
-        *  or false if the content is not includable in a wikitext page.
-        */
-       public function getWikitextForTransclusion() {
-               return false;
-       }
-
-       /**
-        * Returns a textual representation of the content suitable for use in edit
-        * summaries and log messages.
-        *
-        * @param int $maxlength Maximum length of the summary text.
-        * @return string The summary text.
-        */
-       public function getTextForSummary( $maxlength = 250 ) {
-               return '';
-       }
-
-       /**
-        * Returns native represenation of the data. Interpretation depends on the data model used,
-        * as given by getDataModel().
-        *
-        * @return mixed The native representation of the content. Could be a string, a nested array
-        *  structure, an object, a binary blob... anything, really.
-        */
-       public function getNativeData() {
-               return $this->data;
-       }
-
-       /**
-        * returns the content's nominal size in bogo-bytes.
-        *
-        * @return int
-        */
-       public function getSize() {
-               return strlen( $this->data );
-       }
-
-       /**
-        * Return a copy of this Content object. The following must be true for the object returned
-        * if $copy = $original->copy()
-        *
-        * * get_class($original) === get_class($copy)
-        * * $original->getModel() === $copy->getModel()
-        * * $original->equals( $copy )
-        *
-        * If and only if the Content object is imutable, the copy() method can and should
-        * return $this. That is,  $copy === $original may be true, but only for imutable content
-        * objects.
-        *
-        * @return Content A copy of this object
-        */
-       public function copy() {
-               return $this;
-       }
-
-       /**
-        * Returns true if this content is countable as a "real" wiki page, provided
-        * that it's also in a countable location (e.g. a current revision in the main namespace).
-        *
-        * @param bool $hasLinks If it is known whether this content contains links,
-        * provide this information here, to avoid redundant parsing to find out.
-        * @return bool
-        */
-       public function isCountable( $hasLinks = null ) {
-               return false;
-       }
-
-       /**
-        * @param Title $title
-        * @param int $revId Unused.
-        * @param null|ParserOptions $options
-        * @param bool $generateHtml Whether to generate Html (default: true). If false, the result
-        *  of calling getText() on the ParserOutput object returned by this method is undefined.
-        *
-        * @return ParserOutput
-        */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true
-       ) {
-               return new ParserOutput( $this->getNativeData() );
-       }
-
-       /**
-        * @see AbstractContent::fillParserOutput()
-        *
-        * @param Title $title Context title for parsing
-        * @param int|null $revId Revision ID (for {{REVISIONID}})
-        * @param ParserOptions $options Parser options
-        * @param bool $generateHtml Whether or not to generate HTML
-        * @param ParserOutput &$output The output object to fill (reference).
-        */
-       protected function fillParserOutput( Title $title, $revId,
-                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
-               $output = new ParserOutput( $this->getNativeData() );
-       }
-}
diff --git a/tests/phpunit/includes/content/TextContentHandlerTest.php b/tests/phpunit/includes/content/TextContentHandlerTest.php
new file mode 100644 (file)
index 0000000..33861f1
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @group ContentHandler
+ */
+class TextContentHandlerTest extends MediaWikiLangTestCase {
+
+       public function testSupportsDirectEditing() {
+               $handler = new TextContentHandler();
+               $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
+       }
+
+}
index 38fb573..361238b 100644 (file)
@@ -115,6 +115,11 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
        }
 
+       public function testSupportsDirectEditing() {
+               $handler = new WikiTextContentHandler();
+               $this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
+       }
+
        public static function dataMerge3() {
                return array(
                        array(
index 06951b7..1abb47e 100644 (file)
@@ -96,12 +96,11 @@ class MWDebugTest extends MediaWikiTestCase {
                $apiMain = new ApiMain( $context );
 
                $result = new ApiResult( $apiMain );
-               $result->setRawMode( true );
 
                MWDebug::appendDebugInfoToApiResult( $context, $result );
 
                $this->assertInstanceOf( 'ApiResult', $result );
-               $data = $result->getData();
+               $data = $result->getResultData();
 
                $expectedKeys = array( 'mwVersion', 'phpEngine', 'phpVersion', 'gitRevision', 'gitBranch',
                        'gitViewUrl', 'time', 'log', 'debugLog', 'queries', 'request', 'memory',
index b70880e..90438a0 100644 (file)
@@ -17,7 +17,6 @@ class MockSearch extends SearchEngine {
 
 /**
  * @group Search
- * @group Database
  */
 class SearchUpdateTest extends MediaWikiTestCase {
 
index bfca75a..aaa93ef 100644 (file)
@@ -2376,7 +2376,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = Status::newGood();
                $sl = $this->backend->getScopedFileLocks( $paths, LockManager::LOCK_EX, $status );
-               $this->assertType( 'ScopedLock', $sl,
+               $this->assertInstanceOf( 'ScopedLock', $sl,
                        "Scoped locking of files succeeded ($backendName)." );
                $this->assertEquals( array(), $status->errors,
                        "Scoped locking of files succeeded ($backendName)." );
index 5c5052e..3c5754b 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * These tests should work regardless of $wgCapitalLinks
- * @group Database
  * @todo Split tests into providers and test methods
  */
 
index f0ac6ac..8bca333 100644 (file)
@@ -159,12 +159,12 @@ class FormatJsonTest extends MediaWikiTestCase {
                $this->assertJson( $json );
 
                $st = FormatJson::parse( $json );
-               $this->assertType( 'Status', $st );
+               $this->assertInstanceOf( 'Status', $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $expected, $st->getValue() );
 
                $st = FormatJson::parse( $json, FormatJson::FORCE_ASSOC );
-               $this->assertType( 'Status', $st );
+               $this->assertInstanceOf( 'Status', $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $value, $st->getValue() );
        }
@@ -230,7 +230,7 @@ class FormatJsonTest extends MediaWikiTestCase {
                }
 
                $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
-               $this->assertType( 'Status', $st );
+               $this->assertInstanceOf( 'Status', $st );
                if ( $expected === false ) {
                        $this->assertFalse( $st->isOK(), 'Expected isOK() == false' );
                } else {
@@ -256,7 +256,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         */
        public function testParseErrors( $value ) {
                $st = FormatJson::parse( $value );
-               $this->assertType( 'Status', $st );
+               $this->assertInstanceOf( 'Status', $st );
                $this->assertFalse( $st->isOK() );
        }
 
@@ -313,7 +313,7 @@ class FormatJsonTest extends MediaWikiTestCase {
         */
        public function testParseStripComments( $json, $expect ) {
                $st = FormatJson::parse( $json, FormatJson::STRIP_COMMENTS );
-               $this->assertType( 'Status', $st );
+               $this->assertInstanceOf( 'Status', $st );
                $this->assertTrue( $st->isGood() );
                $this->assertEquals( $expect, $st->getValue() );
        }
index 6210d09..515990e 100644 (file)
@@ -239,4 +239,57 @@ class LogFormatterTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( $comment, $formatter->getComment() );
        }
+
+       /**
+        * @dataProvider provideApiParamFormatting
+        * @covers LogFormatter::formatParametersForApi
+        * @covers LogFormatter::formatParameterValueForApi
+        */
+       public function testApiParamFormatting( $key, $value, $expected ) {
+               $entry = $this->newLogEntry( 'param', array( $key => $value ) );
+               $formatter = LogFormatter::newFromEntry( $entry );
+               $formatter->setContext( $this->context );
+
+               ApiResult::setIndexedTagName( $expected, 'param' );
+               ApiResult::setArrayType( $expected, 'assoc' );
+
+               $this->assertEquals( $expected, $formatter->formatParametersForApi() );
+       }
+
+       public static function provideApiParamFormatting() {
+               return array(
+                       array( 0, 'value', array( 'value' ) ),
+                       array( 'named', 'value', array( 'named' => 'value' ) ),
+                       array( '::key', 'value', array( 'key' => 'value' ) ),
+                       array( '4::key', 'value', array( 'key' => 'value' ) ),
+                       array( '4:raw:key', 'value', array( 'key' => 'value' ) ),
+                       array( '4:plain:key', 'value', array( 'key' => 'value' ) ),
+                       array( '4:bool:key', '1', array( 'key' => true ) ),
+                       array( '4:bool:key', '0', array( 'key' => false ) ),
+                       array( '4:number:key', '123', array( 'key' => 123 ) ),
+                       array( '4:number:key', '123.5', array( 'key' => 123.5 ) ),
+                       array( '4:array:key', array(), array( 'key' => array( ApiResult::META_TYPE => 'array' ) ) ),
+                       array( '4:assoc:key', array(), array( 'key' => array( ApiResult::META_TYPE => 'assoc' ) ) ),
+                       array( '4:kvp:key', array(), array( 'key' => array( ApiResult::META_TYPE => 'kvp' ) ) ),
+                       array( '4:timestamp:key', '20150102030405', array( 'key' => '2015-01-02T03:04:05Z' ) ),
+                       array( '4:msg:key', 'parentheses', array(
+                               'key_key' => 'parentheses',
+                               'key_text' => wfMessage( 'parentheses' )->text(),
+                       ) ),
+                       array( '4:msg-content:key', 'parentheses', array(
+                               'key_key' => 'parentheses',
+                               'key_text' => wfMessage( 'parentheses' )->inContentLanguage()->text(),
+                       ) ),
+                       array( '4:title:key', 'project:foo', array(
+                               'key_ns' => NS_PROJECT,
+                               'key_title' => Title::newFromText( 'project:foo' )->getFullText(),
+                       ) ),
+                       array( '4:title-link:key', 'project:foo', array(
+                               'key_ns' => NS_PROJECT,
+                               'key_title' => Title::newFromText( 'project:foo' )->getFullText(),
+                       ) ),
+                       array( '4:user:key', 'foo', array( 'key' => 'Foo' ) ),
+                       array( '4:user-link:key', 'foo', array( 'key' => 'Foo' ) ),
+               );
+       }
 }
diff --git a/tests/phpunit/includes/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/objectcache/WANObjectCacheTest.php
new file mode 100644 (file)
index 0000000..3161d18
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+
+class WANObjectCacheTest extends MediaWikiTestCase {
+       /** @var WANObjectCache */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
+                       $name = $this->getCliArg( 'use-wanobjectcache' );
+
+                       $this->cache = ObjectCache::getWANInstance( $name );
+               } else {
+                       $this->cache = new WANObjectCache( array(
+                               'cache'   => new HashBagOStuff(),
+                               'pool'    => 'testcache-hash',
+                               'relayer' => new EventRelayerNull( array() )
+                       ) );
+               }
+       }
+
+       /**
+        * @dataProvider provider_testSetAndGet
+        * @covers WANObjectCache::set()
+        * @covers WANObjectCache::get()
+        * @param mixed $value
+        * @param integer $ttl
+        */
+       public function testSetAndGet( $value, $ttl ) {
+               $key = wfRandomString();
+               $this->cache->set( $key, $value, $ttl );
+
+               $curTTL = null;
+               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
+               if ( is_infinite( $ttl ) || $ttl == 0 ) {
+                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
+               } else {
+                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
+                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
+               }
+       }
+
+       public static function provider_testSetAndGet() {
+               return array(
+                       array( 14141, 3 ),
+                       array( 3535.666, 3 ),
+                       array( array(), 3 ),
+                       array( null, 3 ),
+                       array( '0', 3 ),
+                       array( (object)array( 'meow' ), 3 ),
+                       array( INF, 3 ),
+                       array( '', 3 ),
+                       array( 'pizzacat', INF ),
+               );
+       }
+
+       public function testGetNotExists() {
+               $key = wfRandomString();
+               $curTTL = null;
+               $value = $this->cache->get( $key, $curTTL );
+
+               $this->assertFalse( $value, "Non-existing key has false value" );
+               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
+       }
+
+       public function testSetOver() {
+               $key = wfRandomString();
+               for ( $i=0; $i<3; ++$i ) {
+                       $value = wfRandomString();
+                       $this->cache->set($key, $value, 3);
+
+                       $this->assertEquals( $this->cache->get( $key ), $value );
+               }
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testGetWithSetCallback() {
+               $cache = $this->cache;
+
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+
+               $wasSet = 0;
+               $func = function() use ( &$wasSet, $value ) { ++$wasSet; return $value; };
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $v, $value );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $v, $value );
+               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $v, $value );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
+
+               $priorTime = microtime( true );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $v, $value );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
+
+               $curTTL = null;
+               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $v, $value );
+               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        */
+       public function testGetMulti() {
+               $cache = $this->cache;
+
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+               $key1 = wfRandomString();
+               $key2 = wfRandomString();
+               $key3 = wfRandomString();
+
+               $cache->set( $key1, $value1, 5 );
+               $cache->set( $key2, $value2, 10 );
+
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
+               );
+
+               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
+               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
+               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
+
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
+                       'Result array populated'
+               );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array populated even with new check keys"
+               );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
+
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array still populated even with new check keys"
+               );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
+               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
+               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
+       }
+
+       /**
+        * @covers WANObjectCache::delete()
+        */
+       public function testDelete() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertEquals( $value, $v, "Key was created with value" );
+               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
+
+               $this->cache->delete( $key );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
+
+               $this->cache->set( $key, $value . 'more' );
+               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
+       }
+
+       /**
+        * @covers WANObjectCache::touchCheckKey()
+        * @covers WANObjectCache::getCheckKeyTime()
+        */
+       public function testTouchKeys() {
+               $key = wfRandomString();
+
+               $t0 = $this->cache->getCheckKeyTime( $key );
+               $this->assertFalse( $t0, 'Check key time is false' );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $this->cache->touchCheckKey( $key );
+               $t1 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
+
+               $t2 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
+
+               usleep( 1 );
+               $this->cache->touchCheckKey( $key );
+               $t3 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
+
+               $t4 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
+       }
+}
\ No newline at end of file
index 1722611..cd54a9e 100644 (file)
@@ -10,6 +10,8 @@
  * @copyright Copyright © 2011, Antoine Musso
  * @file
  * @todo covers tags
+ *
+ * @group Database
  */
 
 class MagicVariableTest extends MediaWikiTestCase {
index 1790086..af143ca 100644 (file)
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @group Database
+ */
+
 class ParserMethodsTest extends MediaWikiLangTestCase {
 
        public static function providePreSaveTransform() {
index 251da47..3605e50 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group Database
  * @group Parser
  */
 class TagHookTest extends MediaWikiTestCase {
index b4c225c..b95316c 100644 (file)
@@ -261,6 +261,57 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                                        ),
                                ),
                        ),
+                       // ResourceModuleSkinStyles with file module paths
+                       array(
+                               // Input
+                               array(
+                                       'ResourceFileModulePaths' => array(
+                                               'localBasePath' => '',
+                                               'remoteSkinPath' => 'FooBar',
+                                       ),
+                                       'ResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                               )
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'localBasePath' => $dir,
+                                                       'remoteSkinPath' => 'FooBar',
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       // ResourceModuleSkinStyles with file module paths and an override
+                       array(
+                               // Input
+                               array(
+                                       'ResourceFileModulePaths' => array(
+                                               'localBasePath' => '',
+                                               'remoteSkinPath' => 'FooBar',
+                                       ),
+                                       'ResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'remoteSkinPath' => 'BarFoo'
+                                               ),
+                                       ),
+                               ),
+                               // Expected
+                               array(
+                                       'wgResourceModuleSkinStyles' => array(
+                                               'foobar' => array(
+                                                       'test.foo' => 'foo.css',
+                                                       'localBasePath' => $dir,
+                                                       'remoteSkinPath' => 'BarFoo',
+                                               ),
+                                       ),
+                               ),
+                       ),
                );
        }
 
index 122995a..e1197df 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group Database
  * @group ResourceLoader
  */
 class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
index 758cfe1..cc121ba 100644 (file)
@@ -109,9 +109,6 @@ class ResourceLoaderImageTest extends ResourceLoaderTestCase {
 
 class ResourceLoaderImageTestable extends ResourceLoaderImage {
        // Make some protected methods public
-       public function getPath( ResourceLoaderContext $context ) {
-               return parent::getPath( $context );
-       }
        public function massageSvgPathdata( $svg ) {
                return parent::massageSvgPathdata( $svg );
        }
index 4f6c411..1545d7e 100644 (file)
@@ -4,10 +4,11 @@
  *
  * Copyright © 2013, Antoine Musso
  * Copyright © 2013, Wikimedia Foundation Inc.
- *
  */
 
 /**
+ * @group Database
+ *
  * @covers SpecialPreferences
  */
 class SpecialPreferencesTest extends MediaWikiTestCase {
index ec56b63..b749662 100644 (file)
@@ -35,7 +35,10 @@ class UploadFromUrlTest extends ApiTestCase {
 
                wfSetupSession( $sessionId );
 
-               return array( $module->getResultData(), $req );
+               return array(
+                       $module->getResult()->getResultData( null, array( 'Strip' => 'all' ) ),
+                       $req
+               );
        }
 
        /**
index 09c1587..acc9dfc 100644 (file)
 
 class IPTest extends PHPUnit_Framework_TestCase {
        /**
-        *  not sure it should be tested with boolean false. hashar 20100924
         * @covers IP::isIPAddress
+        * @dataProvider provideInvalidIPs
         */
-       public function testisIPAddress() {
-               $this->assertFalse( IP::isIPAddress( false ), 'Boolean false is not an IP' );
-               $this->assertFalse( IP::isIPAddress( true ), 'Boolean true is not an IP' );
-               $this->assertFalse( IP::isIPAddress( "" ), 'Empty string is not an IP' );
-               $this->assertFalse( IP::isIPAddress( 'abc' ), 'Garbage IP string' );
-               $this->assertFalse( IP::isIPAddress( ':' ), 'Single ":" is not an IP' );
-               $this->assertFalse( IP::isIPAddress( '2001:0DB8::A:1::1' ), 'IPv6 with a double :: occurrence' );
-               $this->assertFalse(
-                       IP::isIPAddress( '2001:0DB8::A:1::' ),
-                       'IPv6 with a double :: occurrence, last at end'
-               );
-               $this->assertFalse(
-                       IP::isIPAddress( '::2001:0DB8::5:1' ),
-                       'IPv6 with a double :: occurrence, firt at beginning'
+       public function isNotIPAddress( $val, $desc ) {
+               $this->assertFalse( IP::isIPAddress( $val ), $desc );
+       }
+
+       /**
+        * Provide a list of things that aren't IP addresses
+        */
+       public function provideInvalidIPs() {
+               return array(
+                       array( false, 'Boolean false is not an IP' ),
+                       array( true, 'Boolean true is not an IP' ),
+                       array( '', 'Empty string is not an IP' ),
+                       array( 'abc', 'Garbage IP string' ),
+                       array( ':', 'Single ":" is not an IP' ),
+                       array( '2001:0DB8::A:1::1', 'IPv6 with a double :: occurrence' ),
+                       array( '2001:0DB8::A:1::', 'IPv6 with a double :: occurrence, last at end' ),
+                       array( '::2001:0DB8::5:1', 'IPv6 with a double :: occurrence, firt at beginning' ),
+                       array( '124.24.52', 'IPv4 not enough quads' ),
+                       array( '24.324.52.13', 'IPv4 out of range' ),
+                       array( '.24.52.13', 'IPv4 starts with period' ),
+                       array( 'fc:100:300', 'IPv6 with only 3 words' ),
                );
-               $this->assertFalse( IP::isIPAddress( '124.24.52' ), 'IPv4 not enough quads' );
-               $this->assertFalse( IP::isIPAddress( '24.324.52.13' ), 'IPv4 out of range' );
-               $this->assertFalse( IP::isIPAddress( '.24.52.13' ), 'IPv4 starts with period' );
-               $this->assertFalse( IP::isIPAddress( 'fc:100:300' ), 'IPv6 with only 3 words' );
+       }
 
+       /**
+        * @covers IP::isIPAddress
+        */
+       public function testisIPAddress() {
                $this->assertTrue( IP::isIPAddress( '::' ), 'RFC 4291 IPv6 Unspecified Address' );
                $this->assertTrue( IP::isIPAddress( '::1' ), 'RFC 4291 IPv6 Loopback Address' );
                $this->assertTrue( IP::isIPAddress( '74.24.52.13/20', 'IPv4 range' ) );
@@ -107,20 +115,42 @@ class IPTest extends PHPUnit_Framework_TestCase {
 
        /**
         * @covers IP::isIPv4
+        * @dataProvider provideInvalidIPv4Addresses
         */
-       public function testisIPv4() {
-               $this->assertFalse( IP::isIPv4( false ), 'Boolean false is not an IP' );
-               $this->assertFalse( IP::isIPv4( true ), 'Boolean true is not an IP' );
-               $this->assertFalse( IP::isIPv4( "" ), 'Empty string is not an IP' );
-               $this->assertFalse( IP::isIPv4( 'abc' ) );
-               $this->assertFalse( IP::isIPv4( ':' ) );
-               $this->assertFalse( IP::isIPv4( '124.24.52' ), 'IPv4 not enough quads' );
-               $this->assertFalse( IP::isIPv4( '24.324.52.13' ), 'IPv4 out of range' );
-               $this->assertFalse( IP::isIPv4( '.24.52.13' ), 'IPv4 starts with period' );
+       public function testisNotIPv4( $bogusIP, $desc ) {
+               $this->assertFalse( IP::isIPv4( $bogusIP ), $desc );
+       }
 
-               $this->assertTrue( IP::isIPv4( '124.24.52.13' ) );
-               $this->assertTrue( IP::isIPv4( '1.24.52.13' ) );
-               $this->assertTrue( IP::isIPv4( '74.24.52.13/20', 'IPv4 range' ) );
+       public function provideInvalidIPv4Addresses() {
+               return array(
+                       array( false, 'Boolean false is not an IP' ),
+                       array( true, 'Boolean true is not an IP' ),
+                       array( '', 'Empty string is not an IP' ),
+                       array( 'abc', 'Letters are not an IP' ),
+                       array( ':', 'A colon is not an IP' ),
+                       array( '124.24.52', 'IPv4 not enough quads' ),
+                       array( '24.324.52.13', 'IPv4 out of range' ),
+                       array( '.24.52.13', 'IPv4 starts with period' ),                
+               );
+       }
+
+       /**
+        * @covers IP::isIPv4
+        * @dataProvider provideValidIPv4Address
+        */
+       public function testIsIPv4( $ip, $desc ) {
+               $this->assertTrue( IP::isIPv4( $ip ), $desc );
+       }
+
+       /**
+        * Provide some IPv4 addresses and ranges
+        */
+       public function provideValidIPv4Address() {
+               return array(
+                       array( '124.24.52.13', 'Valid IPv4 address' ),
+                       array( '1.24.52.13', 'Another valid IPv4 address' ),
+                       array( '74.24.52.13/20', 'An IPv4 range' ),
+               );
        }
 
        /**
@@ -224,49 +254,56 @@ class IPTest extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * @covers IP::isValidBlock
+        * Provide some valid IP blocks
         */
-       public function testValidBlocks() {
-               $valid = array(
-                       '116.17.184.5/32',
-                       '0.17.184.5/30',
-                       '16.17.184.1/24',
-                       '30.242.52.14/1',
-                       '10.232.52.13/8',
-                       '30.242.52.14/0',
-                       '::e:f:2001/96',
-                       '::c:f:2001/128',
-                       '::10:f:2001/70',
-                       '::fe:f:2001/1',
-                       '::6d:f:2001/8',
-                       '::fe:f:2001/0',
+       public function provideValidBlocks() {
+               return array(
+                       array( '116.17.184.5/32' ),
+                       array( '0.17.184.5/30' ),
+                       array( '16.17.184.1/24' ),
+                       array( '30.242.52.14/1' ),
+                       array( '10.232.52.13/8' ),
+                       array( '30.242.52.14/0' ),
+                       array( '::e:f:2001/96' ),
+                       array( '::c:f:2001/128' ),
+                       array( '::10:f:2001/70' ),
+                       array( '::fe:f:2001/1' ),
+                       array( '::6d:f:2001/8' ),
+                       array( '::fe:f:2001/0' ),
                );
-               foreach ( $valid as $i ) {
-                       $this->assertTrue( IP::isValidBlock( $i ), "$i is a valid IP block" );
-               }
        }
 
        /**
         * @covers IP::isValidBlock
+        * @dataProvider provideValidBlocks
         */
-       public function testInvalidBlocks() {
-               $invalid = array(
-                       '116.17.184.5/33',
-                       '0.17.184.5/130',
-                       '16.17.184.1/-1',
-                       '10.232.52.13/*',
-                       '7.232.52.13/ab',
-                       '11.232.52.13/',
-                       '::e:f:2001/129',
-                       '::c:f:2001/228',
-                       '::10:f:2001/-1',
-                       '::6d:f:2001/*',
-                       '::86:f:2001/ab',
-                       '::23:f:2001/',
+       public function testValidBlocks( $block ) {
+               $this->assertTrue( IP::isValidBlock( $block ), "$block is a valid IP block" );
+       }
+
+       /**
+        * @covers IP::isValidBlock
+        * @dataProvider provideInvalidBlocks
+        */
+       public function testInvalidBlocks( $invalid ) {
+               $this->assertFalse( IP::isValidBlock( $invalid ), "$invalid is not a valid IP block" );
+       }
+
+       public function provideInvalidBlocks() {
+               return array(
+                       array( '116.17.184.5/33' ),
+                       array( '0.17.184.5/130' ),
+                       array( '16.17.184.1/-1' ),
+                       array( '10.232.52.13/*' ),
+                       array( '7.232.52.13/ab' ),
+                       array( '11.232.52.13/' ),
+                       array( '::e:f:2001/129' ),
+                       array( '::c:f:2001/228' ),
+                       array( '::10:f:2001/-1' ),
+                       array( '::6d:f:2001/*' ),
+                       array( '::86:f:2001/ab' ),
+                       array( '::23:f:2001/' ),
                );
-               foreach ( $invalid as $i ) {
-                       $this->assertFalse( IP::isValidBlock( $i ), "$i is not a valid IP block" );
-               }
        }
 
        /**
@@ -336,40 +373,55 @@ class IPTest extends PHPUnit_Framework_TestCase {
 
        /**
         * @covers IP::hexToQuad
+        * @dataProvider provideIPsAndHexes
         */
-       public function testHexToQuad() {
-               $this->assertEquals( '0.0.0.1', IP::hexToQuad( '00000001' ) );
-               $this->assertEquals( '255.0.0.0', IP::hexToQuad( 'FF000000' ) );
-               $this->assertEquals( '255.255.255.255', IP::hexToQuad( 'FFFFFFFF' ) );
-               $this->assertEquals( '10.188.222.255', IP::hexToQuad( '0ABCDEFF' ) );
-               // hex not left-padded...
-               $this->assertEquals( '0.0.0.0', IP::hexToQuad( '0' ) );
-               $this->assertEquals( '0.0.0.1', IP::hexToQuad( '1' ) );
-               $this->assertEquals( '0.0.0.255', IP::hexToQuad( 'FF' ) );
-               $this->assertEquals( '0.0.255.0', IP::hexToQuad( 'FF00' ) );
+       public function testHexToQuad( $ip, $hex ) {
+               $this->assertEquals( $ip, IP::hexToQuad( $hex ) );
+       }
+
+       /**
+        * Provide some IP addresses and their equivalent hex representations
+        */
+       public function provideIPsandHexes() {
+               return array(
+                       array( '0.0.0.1', '00000001' ),
+                       array( '255.0.0.0', 'FF000000' ),
+                       array( '255.255.255.255', 'FFFFFFFF' ),
+                       array( '10.188.222.255', '0ABCDEFF' ),
+                       // hex not left-padded...
+                       array( '0.0.0.0', '0' ),
+                       array( '0.0.0.1', '1' ),
+                       array( '0.0.0.255', 'FF' ),
+                       array( '0.0.255.0', 'FF00' ),
+               );
        }
 
        /**
         * @covers IP::hexToOctet
+        * @dataProvider provideOctetsAndHexes
         */
-       public function testHexToOctet() {
-               $this->assertEquals( '0:0:0:0:0:0:0:1',
-                       IP::hexToOctet( '00000000000000000000000000000001' ) );
-               $this->assertEquals( '0:0:0:0:0:0:FF:3',
-                       IP::hexToOctet( '00000000000000000000000000FF0003' ) );
-               $this->assertEquals( '0:0:0:0:0:0:FF00:6',
-                       IP::hexToOctet( '000000000000000000000000FF000006' ) );
-               $this->assertEquals( '0:0:0:0:0:0:FCCF:FAFF',
-                       IP::hexToOctet( '000000000000000000000000FCCFFAFF' ) );
-               $this->assertEquals( 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF',
-                       IP::hexToOctet( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' ) );
-               // hex not left-padded...
-               $this->assertEquals( '0:0:0:0:0:0:0:0', IP::hexToOctet( '0' ) );
-               $this->assertEquals( '0:0:0:0:0:0:0:1', IP::hexToOctet( '1' ) );
-               $this->assertEquals( '0:0:0:0:0:0:0:FF', IP::hexToOctet( 'FF' ) );
-               $this->assertEquals( '0:0:0:0:0:0:0:FFD0', IP::hexToOctet( 'FFD0' ) );
-               $this->assertEquals( '0:0:0:0:0:0:FA00:0', IP::hexToOctet( 'FA000000' ) );
-               $this->assertEquals( '0:0:0:0:0:0:FCCF:FAFF', IP::hexToOctet( 'FCCFFAFF' ) );
+       public function testHexToOctet( $octet, $hex ) {
+               $this->assertEquals( $octet, IP::hexToOctet( $hex ) );
+       }
+
+       /**
+        * Provide some hex and octet representations of the same IPs
+        */
+       public function provideOctetsAndHexes() {
+               return array(
+                       array( '0:0:0:0:0:0:0:1', '00000000000000000000000000000001' ),
+                       array( '0:0:0:0:0:0:FF:3', '00000000000000000000000000FF0003' ),
+                       array( '0:0:0:0:0:0:FF00:6', '000000000000000000000000FF000006' ),
+                       array( '0:0:0:0:0:0:FCCF:FAFF', '000000000000000000000000FCCFFAFF' ),
+                       array( 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF', 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' ),
+                       // hex not left-padded...
+                       array( '0:0:0:0:0:0:0:0', '0' ),
+                       array( '0:0:0:0:0:0:0:1', '1' ),
+                       array( '0:0:0:0:0:0:0:FF', 'FF' ),
+                       array( '0:0:0:0:0:0:0:FFD0', 'FFD0' ),
+                       array( '0:0:0:0:0:0:FA00:0', 'FA000000' ),
+                       array( '0:0:0:0:0:0:FCCF:FAFF', 'FCCFFAFF' ),
+               );
        }
 
        /**
index 0e11cca..fedcc76 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class UIDGeneratorTest extends MediaWikiTestCase {
+class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
 
        protected function tearDown() {
                // Bug: 44850
@@ -28,7 +28,7 @@ class UIDGeneratorTest extends MediaWikiTestCase {
 
                $lastId = array_shift( $ids );
 
-               $this->assertArrayEquals( array_unique( $ids ), $ids, "All generated IDs are unique." );
+               $this->assertSame( array_unique( $ids ), $ids, "All generated IDs are unique." );
 
                foreach ( $ids as $id ) {
                        $id_bin = wfBaseConvert( $id, 10, 2 );
@@ -105,8 +105,8 @@ class UIDGeneratorTest extends MediaWikiTestCase {
                $id1 = UIDGenerator::newSequentialPerNodeID( 'test', 32 );
                $id2 = UIDGenerator::newSequentialPerNodeID( 'test', 32 );
 
-               $this->assertType( 'float', $id1, "ID returned as float" );
-               $this->assertType( 'float', $id2, "ID returned as float" );
+               $this->assertInternalType( 'float', $id1, "ID returned as float" );
+               $this->assertInternalType( 'float', $id2, "ID returned as float" );
                $this->assertGreaterThan( 0, $id1, "ID greater than 1" );
                $this->assertGreaterThan( $id1, $id2, "IDs increasing in value" );
        }
@@ -118,7 +118,7 @@ class UIDGeneratorTest extends MediaWikiTestCase {
                $ids = UIDGenerator::newSequentialPerNodeIDs( 'test', 32, 5 );
                $lastId = null;
                foreach ( $ids as $id ) {
-                       $this->assertType( 'float', $id, "ID returned as float" );
+                       $this->assertInternalType( 'float', $id, "ID returned as float" );
                        $this->assertGreaterThan( 0, $id, "ID greater than 1" );
                        if ( $lastId ) {
                                $this->assertGreaterThan( $lastId, $id, "IDs increasing in value" );
index a5ef762..7fc9997 100644 (file)
@@ -434,7 +434,10 @@ class TextPassDumperDatabaseTest 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();
diff --git a/tests/phpunit/mocks/content/DummyContentForTesting.php b/tests/phpunit/mocks/content/DummyContentForTesting.php
new file mode 100644 (file)
index 0000000..0c69027
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+class DummyContentForTesting extends AbstractContent {
+
+       public function __construct( $data ) {
+               parent::__construct( "testing" );
+
+               $this->data = $data;
+       }
+
+       public function serialize( $format = null ) {
+               return serialize( $this->data );
+       }
+
+       /**
+        * @return string A string representing the content in a way useful for
+        *   building a full text search index. If no useful representation exists,
+        *   this method returns an empty string.
+        */
+       public function getTextForSearchIndex() {
+               return '';
+       }
+
+       /**
+        * @return string|bool The wikitext to include when another page includes this  content,
+        *  or false if the content is not includable in a wikitext page.
+        */
+       public function getWikitextForTransclusion() {
+               return false;
+       }
+
+       /**
+        * Returns a textual representation of the content suitable for use in edit
+        * summaries and log messages.
+        *
+        * @param int $maxlength Maximum length of the summary text.
+        * @return string The summary text.
+        */
+       public function getTextForSummary( $maxlength = 250 ) {
+               return '';
+       }
+
+       /**
+        * Returns native represenation of the data. Interpretation depends on the data model used,
+        * as given by getDataModel().
+        *
+        * @return mixed The native representation of the content. Could be a string, a nested array
+        *  structure, an object, a binary blob... anything, really.
+        */
+       public function getNativeData() {
+               return $this->data;
+       }
+
+       /**
+        * returns the content's nominal size in bogo-bytes.
+        *
+        * @return int
+        */
+       public function getSize() {
+               return strlen( $this->data );
+       }
+
+       /**
+        * Return a copy of this Content object. The following must be true for the object returned
+        * if $copy = $original->copy()
+        *
+        * * get_class($original) === get_class($copy)
+        * * $original->getModel() === $copy->getModel()
+        * * $original->equals( $copy )
+        *
+        * If and only if the Content object is imutable, the copy() method can and should
+        * return $this. That is,  $copy === $original may be true, but only for imutable content
+        * objects.
+        *
+        * @return Content A copy of this object
+        */
+       public function copy() {
+               return $this;
+       }
+
+       /**
+        * Returns true if this content is countable as a "real" wiki page, provided
+        * that it's also in a countable location (e.g. a current revision in the main namespace).
+        *
+        * @param bool $hasLinks If it is known whether this content contains links,
+        * provide this information here, to avoid redundant parsing to find out.
+        * @return bool
+        */
+       public function isCountable( $hasLinks = null ) {
+               return false;
+       }
+
+       /**
+        * @param Title $title
+        * @param int $revId Unused.
+        * @param null|ParserOptions $options
+        * @param bool $generateHtml Whether to generate Html (default: true). If false, the result
+        *  of calling getText() on the ParserOutput object returned by this method is undefined.
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               return new ParserOutput( $this->getNativeData() );
+       }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
+}
diff --git a/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php b/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
new file mode 100644 (file)
index 0000000..fd253f2
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+class DummyContentHandlerForTesting extends ContentHandler {
+
+       public function __construct( $dataModel ) {
+               parent::__construct( $dataModel, array( "testing" ) );
+       }
+
+       /**
+        * @see ContentHandler::serializeContent
+        *
+        * @param Content $content
+        * @param string $format
+        *
+        * @return string
+        */
+       public function serializeContent( Content $content, $format = null ) {
+               return $content->serialize();
+       }
+
+       /**
+        * @see ContentHandler::unserializeContent
+        *
+        * @param string $blob
+        * @param string $format Unused.
+        *
+        * @return Content
+        */
+       public function unserializeContent( $blob, $format = null ) {
+               $d = unserialize( $blob );
+
+               return new DummyContentForTesting( $d );
+       }
+
+       /**
+        * Creates an empty Content object of the type supported by this ContentHandler.
+        *
+        */
+       public function makeEmptyContent() {
+               return new DummyContentForTesting( '' );
+       }
+}
diff --git a/tests/phpunit/mocks/content/DummyNonTextContent.php b/tests/phpunit/mocks/content/DummyNonTextContent.php
new file mode 100644 (file)
index 0000000..889efb7
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+class DummyNonTextContent extends AbstractContent {
+
+       public function __construct( $data ) {
+               parent::__construct( "testing-nontext" );
+
+               $this->data = $data;
+       }
+
+       public function serialize( $format = null ) {
+               return serialize( $this->data );
+       }
+
+       /**
+        * @return string A string representing the content in a way useful for
+        *   building a full text search index. If no useful representation exists,
+        *   this method returns an empty string.
+        */
+       public function getTextForSearchIndex() {
+               return '';
+       }
+
+       /**
+        * @return string|bool The wikitext to include when another page includes this  content,
+        *  or false if the content is not includable in a wikitext page.
+        */
+       public function getWikitextForTransclusion() {
+               return false;
+       }
+
+       /**
+        * Returns a textual representation of the content suitable for use in edit
+        * summaries and log messages.
+        *
+        * @param int $maxlength Maximum length of the summary text.
+        * @return string The summary text.
+        */
+       public function getTextForSummary( $maxlength = 250 ) {
+               return '';
+       }
+
+       /**
+        * Returns native represenation of the data. Interpretation depends on the data model used,
+        * as given by getDataModel().
+        *
+        * @return mixed The native representation of the content. Could be a string, a nested array
+        *  structure, an object, a binary blob... anything, really.
+        */
+       public function getNativeData() {
+               return $this->data;
+       }
+
+       /**
+        * returns the content's nominal size in bogo-bytes.
+        *
+        * @return int
+        */
+       public function getSize() {
+               return strlen( $this->data );
+       }
+
+       /**
+        * Return a copy of this Content object. The following must be true for the object returned
+        * if $copy = $original->copy()
+        *
+        * * get_class($original) === get_class($copy)
+        * * $original->getModel() === $copy->getModel()
+        * * $original->equals( $copy )
+        *
+        * If and only if the Content object is imutable, the copy() method can and should
+        * return $this. That is,  $copy === $original may be true, but only for imutable content
+        * objects.
+        *
+        * @return Content A copy of this object
+        */
+       public function copy() {
+               return $this;
+       }
+
+       /**
+        * Returns true if this content is countable as a "real" wiki page, provided
+        * that it's also in a countable location (e.g. a current revision in the main namespace).
+        *
+        * @param bool $hasLinks If it is known whether this content contains links,
+        * provide this information here, to avoid redundant parsing to find out.
+        * @return bool
+        */
+       public function isCountable( $hasLinks = null ) {
+               return false;
+       }
+
+       /**
+        * @param Title $title
+        * @param int $revId Unused.
+        * @param null|ParserOptions $options
+        * @param bool $generateHtml Whether to generate Html (default: true). If false, the result
+        *  of calling getText() on the ParserOutput object returned by this method is undefined.
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               return new ParserOutput( $this->getNativeData() );
+       }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
+}
diff --git a/tests/phpunit/mocks/content/DummyNonTextContentHandler.php b/tests/phpunit/mocks/content/DummyNonTextContentHandler.php
new file mode 100644 (file)
index 0000000..6995ae7
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+class DummyNonTextContentHandler extends DummyContentHandlerForTesting {
+
+       public function __construct( $dataModel ) {
+               parent::__construct( $dataModel, array( "testing-nontext" ) );
+       }
+
+       /**
+        * @see ContentHandler::serializeContent
+        *
+        * @param Content $content
+        * @param string $format
+        *
+        * @return string
+        */
+       public function serializeContent( Content $content, $format = null ) {
+               return $content->serialize();
+       }
+
+       /**
+        * @see ContentHandler::unserializeContent
+        *
+        * @param string $blob
+        * @param string $format Unused.
+        *
+        * @return Content
+        */
+       public function unserializeContent( $blob, $format = null ) {
+               $d = unserialize( $blob );
+
+               return new DummyNonTextContent( $d );
+       }
+
+       /**
+        * Creates an empty Content object of the type supported by this ContentHandler.
+        */
+       public function makeEmptyContent() {
+               return new DummyNonTextContent( '' );
+       }
+
+       public function supportsDirectApiEditing() {
+               return true;
+       }
+
+}
index e59b506..d18ab73 100755 (executable)
@@ -228,12 +228,14 @@ foreach ( array(
 }
 
 if ( !$ok ) {
-       die( "Couldn't find a usable PHPUnit.\n" );
+       echo "Couldn't find a usable PHPUnit.\n";
+       exit( 1 );
 }
 
 $puVersion = PHPUnit_Runner_Version::id();
 if ( $puVersion !== '@package_version@' && version_compare( $puVersion, '3.7.0', '<' ) ) {
-       die( "PHPUnit 3.7.0 or later required; you have {$puVersion}.\n" );
+       echo "PHPUnit 3.7.0 or later required; you have {$puVersion}.\n";
+       exit( 1 );
 }
 
 PHPUnit_TextUI_Command::main();
index 9a3dab6..17b8b63 100644 (file)
@@ -65,6 +65,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
@@ -106,6 +107,7 @@ return array(
                        'mediawiki.api.parse',
                        'mediawiki.api.watch',
                        'mediawiki.jqueryMsg',
+                       'mediawiki.messagePoster',
                        'mediawiki.Title',
                        'mediawiki.toc',
                        'mediawiki.Uri',
index 03aaf4a..3dd2af6 100644 (file)
         * </code>
         */
        QUnit.newMwEnvironment = ( function () {
-               var warn, log, liveConfig, liveMessages;
+               var warn, error, log, liveConfig, liveMessages,
+                       ajaxRequests = [];
 
                liveConfig = mw.config.values;
                liveMessages = mw.messages.values;
 
                function suppressWarnings() {
                        warn = mw.log.warn;
-                       mw.log.warn = $.noop;
+                       error = mw.log.error;
+                       mw.log.warn = mw.log.error = $.noop;
                }
 
                function restoreWarnings() {
+                       // Guard against calls not balanced with suppressWarnings()
                        if ( warn !== undefined ) {
                                mw.log.warn = warn;
-                               warn = undefined;
+                               mw.log.error = error;
+                               warn = error = undefined;
                        }
                }
 
                        return $.extend( /*deep=*/true, {}, liveMessages, custom );
                }
 
+               /**
+                * @param {jQuery.Event} event
+                * @param {jqXHR} jqXHR
+                * @param {Object} ajaxOptions
+                */
+               function trackAjax( event, jqXHR, ajaxOptions ) {
+                       ajaxRequests.push( { xhr: jqXHR, options: ajaxOptions } );
+               }
+
                log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
 
                return function ( localEnv ) {
                                        this.suppressWarnings = suppressWarnings;
                                        this.restoreWarnings = restoreWarnings;
 
+                                       // Start tracking ajax requests
+                                       $( document ).on( 'ajaxSend', trackAjax );
+
                                        localEnv.setup.call( this );
                                },
 
                                teardown: function () {
-                                       var timers;
+                                       var timers, active;
                                        log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
                                                + ': ' + QUnit.config.current.testName + '"' );
 
                                        localEnv.teardown.call( this );
 
+                                       // Stop tracking ajax requests
+                                       $( document ).off( 'ajaxSend', trackAjax );
+
                                        // Farewell, mock environment!
                                        mw.config.values = liveConfig;
                                        mw.messages.values = liveMessages;
                                        // still suppressed by the end of the test.
                                        restoreWarnings();
 
-                                       // Check for incomplete animations/requests/etc and throw
-                                       // error if there are any.
+                                       // Tests should use fake timers or wait for animations to complete
+                                       // Check for incomplete animations/requests/etc and throw if there are any.
                                        if ( $.timers && $.timers.length !== 0 ) {
                                                timers = $.timers.length;
-                                               // Tests shoulld use fake timers or wait for animations to complete
                                                $.each( $.timers, function ( i, timer ) {
                                                        var node = timer.elem;
                                                        mw.log.warn( 'Unfinished animation #' + i + ' in ' + timer.queue + ' queue on ' +
 
                                                throw new Error( 'Unfinished animations: ' + timers );
                                        }
+
+                                       // Test should use fake XHR, wait for requests, or call abort()
                                        if ( $.active !== undefined && $.active !== 0 ) {
-                                               // Test may need to use fake XHR, wait for requests or
-                                               // call abort().
-                                               throw new Error( 'Unfinished AJAX requests: ' + $.active );
+                                               active = $.grep( ajaxRequests, function ( ajax ) {
+                                                       return ajax.xhr.state() === 'pending';
+                                               } );
+                                               if ( active.length !== $.active ) {
+                                                       mw.log.warn( 'Pending requests does not match jQuery.active count' );
+                                               }
+                                               // Force requests to stop to give the next test a clean start
+                                               $.each( active, function ( i, ajax ) {
+                                                       mw.log.warn( 'Unfinished AJAX request #' + i, ajax.options );
+                                                       ajax.xhr.abort();
+                                               } );
+                                               ajaxRequests = [];
+
+                                               throw new Error( 'Unfinished AJAX requests: ' + active.length );
                                        }
                                }
                        };
index 7e23e2f..5dcd941 100644 (file)
        /**
         * @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.
+        * @param {Function} complete Called when all tasks are done, or when the sequence is aborted.
         * @return
         */
-       function process( tasks, done ) {
-               function run() {
+       function process( tasks, complete ) {
+               function abort() {
+                       tasks.splice( 0, tasks.length );
+                       next();
+               }
+               function next() {
+                       if ( !tasks ) {
+                               // This happens if after the process is completed, one of our callbacks is
+                               // invoked. This can happen if a test timed out but the process was still
+                               // running. In that case, ignore it. Don't invoke complete() a second time.
+                               return;
+                       }
                        var task = tasks.shift();
                        if ( task ) {
-                               task( run );
+                               task( next, abort );
                        } else {
-                               done();
+                               // Remove tasks list to indicate the process is final.
+                               tasks = null;
+                               complete();
                        }
                }
-               run();
+               next();
        }
 
        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 );
                var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
-                       return function ( next ) {
+                       return function ( next, abort ) {
                                getMwLanguage( test.lang )
-                                       .done( function ( langClass ) {
+                                       .then( function ( langClass ) {
                                                mw.config.set( 'wgUserLanguage', test.lang );
                                                var parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        test.result,
                                                        test.name
                                                );
-                                       } )
-                                       .fail( function () {
+                                       }, function () {
                                                assert.ok( false, 'Language "' + test.lang + '" failed to load.' );
                                        } )
-                                       .always( next );
+                                       .then( next, abort );
                        };
                } );
 
                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 ) {
+                       return function ( next, abort ) {
                                getMwLanguage( test.lang )
-                                       .done( function ( langClass ) {
+                                       .then( function ( langClass ) {
                                                mw.config.set( 'wgUserLanguage', test.lang );
                                                var parser = new mw.jqueryMsg.parser( { language: langClass } );
                                                assert.equal(
                                                        test.result,
                                                        test.description
                                                );
-                                       } )
-                                       .fail( function () {
+                                       }, function () {
                                                assert.ok( false, 'Language "' + test.lang + '" failed to load' );
                                        } )
-                                       .always( next );
+                                       .then( next, abort );
                        };
                } );
                QUnit.stop();
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js
new file mode 100644 (file)
index 0000000..61bab03
--- /dev/null
@@ -0,0 +1,28 @@
+( function ( mw ) {
+       var TEST_MODEL = 'test-content-model';
+
+       QUnit.module( 'mediawiki.messagePoster', QUnit.newMwEnvironment( {
+               teardown: function () {
+                       mw.messagePoster.factory.unregister( TEST_MODEL );
+               }
+       } ) );
+
+       QUnit.test( 'register', 2, function ( assert ) {
+               var testMessagePosterConstructor = function () {};
+
+               mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
+               assert.strictEqual(
+                       mw.messagePoster.factory.contentModelToClass[TEST_MODEL],
+                       testMessagePosterConstructor,
+                       'Constructor is registered'
+               );
+
+               assert.throws(
+                       function () {
+                               mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
+                       },
+                       new RegExp( 'The content model \'' + TEST_MODEL + '\' is already registered.' ),
+                       'Throws exception is same model is registered a second time'
+               );
+       } );
+}( mediaWiki ) );
index cf36ea8..77fecb3 100644 (file)
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.callback', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )], {}, {} );
+               mw.loader.implement( 'test.callback', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
 
                mw.loader.using( 'test.callback', function () {
 
                        isAwesomeDone = true;
                };
 
-               mw.loader.implement( 'test.promise', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )], {}, {} );
+               mw.loader.implement( 'test.promise', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )] );
 
                mw.loader.using( 'test.promise' )
                .done( function () {
                        },
                        {
                                'all': '.mw-test-implement-a { float: right; }'
-                       },
-                       {}
+                       }
                );
 
                mw.loader.load( [
                                                urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
                                        ]
                                }
-                       },
-                       {}
+                       }
                );
 
                mw.loader.load( [
                        },
                        {
                                'all': '.mw-test-implement-c { float: right; }'
-                       },
-                       {}
+                       }
                );
 
                mw.loader.load( [
                        {
                                'all': [urlStyleTest( '.mw-test-implement-d', 'float', 'right' )],
                                'print': [urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' )]
-                       },
-                       {}
+                       }
                );
 
                mw.loader.load( [
                        ['test.module5', '0', ['test.module4']],
                        ['test.module6', '0', ['test.module5']]
                ] );
-               mw.loader.implement( 'test.module4', function () {
-               }, {}, {} );
+               mw.loader.implement( 'test.module4', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
                assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
                assert.strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
-               mw.loader.implement( 'test.module6', function () {
-               }, {}, {} );
+               mw.loader.implement( 'test.module6', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
                assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
                assert.strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
-               mw.loader.implement( 'test.module5', function () {
-               }, {}, {} );
+               mw.loader.implement( 'test.module5', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
                assert.strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
                assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
                        ['test.module8', '0', ['test.module7']],
                        ['test.module9', '0', ['test.module8']]
                ] );
-               mw.loader.implement( 'test.module8', function () {
-               }, {}, {} );
+               mw.loader.implement( 'test.module8', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
                assert.strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' );
                assert.strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' );
                assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
                assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
                assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
-               mw.loader.implement( 'test.module9', function () {
-               }, {}, {} );
+               mw.loader.implement( 'test.module9', function () {} );
                assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
                assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
                assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
index d07b86f..5bfe328 100644 (file)
@@ -22,4 +22,6 @@
  * @ingroup Media
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './thumb.php';
index 0e0c3c0..c9e10cd 100644 (file)
@@ -22,4 +22,6 @@
  * @ingroup Media
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './thumb_handler.php';