Merge "Change error/warning messages to be parsed instead of escaped"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 22 Apr 2015 22:12:58 +0000 (22:12 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 22 Apr 2015 22:12:58 +0000 (22:12 +0000)
463 files changed:
CREDITS
RELEASE-NOTES-1.25
RELEASE-NOTES-1.26
api.php5
autoload.php
composer.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/Import.php
includes/Message.php
includes/MessageBlobStore.php [deleted file]
includes/OutputPage.php
includes/Preferences.php
includes/ProtectionForm.php
includes/RevisionList.php
includes/Setup.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/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/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/LoadBalancer.php
includes/debug/MWDebug.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LoggerFactory.php
includes/deferred/SiteStatsUpdate.php
includes/diff/DifferenceEngine.php
includes/installer/DatabaseUpdater.php
includes/installer/i18n/azb.json [new file with mode: 0644]
includes/installer/i18n/ce.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/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/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/page/CategoryPage.php
includes/page/WikiPage.php
includes/profiler/SectionProfiler.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/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBlock.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialDiff.php
includes/specials/SpecialEditTags.php [new file with mode: 0644]
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/SpecialRevisiondelete.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUpload.php
includes/specials/SpecialVersion.php
index.php5
languages/Language.php
languages/i18n/ace.json
languages/i18n/aeb.json
languages/i18n/af.json
languages/i18n/ang.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/cs.json
languages/i18n/cv.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/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/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/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/pl.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/MessagesAzb.php
languages/messages/MessagesBgn.php
languages/messages/MessagesCe.php
languages/messages/MessagesEn.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/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/runJobs.php
maintenance/showJobs.php
maintenance/tables.sql
maintenance/update.php
opensearch_desc.php5
profileinfo.php5
resources/Resources.php
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/src/dom-level2-skip.js [new file with mode: 0644]
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.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/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/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/filebackend/FileBackendTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/logging/LogFormatterTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/TagHooksTest.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/data/testrunner.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
thumb.php5
thumb_handler.php5

diff --git a/CREDITS b/CREDITS
index 49616a3..7725034 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -85,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
index 4612c45..e74474d 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.
@@ -122,6 +121,13 @@ production.
 * (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
@@ -184,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
@@ -248,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.
@@ -285,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
@@ -301,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
@@ -363,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.
@@ -429,6 +481,19 @@ changes to languages because of Bugzilla reports.
 * 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 importScript and importStylesheet functions, as well as the loadedScripts object,
+  from wikibits.js (deprecated since 1.17) now emit warnings through mw.log.warn when accessed.
+
 
 == Compatibility ==
 
index 46509be..9426635 100644 (file)
@@ -11,12 +11,18 @@ 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 ===
 
@@ -28,7 +34,16 @@ 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 ==
 
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 b480096..ddd8254 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',
@@ -510,6 +522,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',
@@ -757,7 +770,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',
@@ -1102,6 +1115,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',
@@ -1125,6 +1139,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',
@@ -1194,6 +1209,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',
@@ -1260,6 +1276,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',
index 88ee9cf..d0c8f53 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.9.8",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
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 873a26d..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 );
@@ -452,11 +443,15 @@ class Block {
 
                $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 pointless gap locks.
+               # Do this after trying to insert to avoid locking.
                if ( !$affected ) {
-                       $dbw->delete( 'ipblocks',
+                       # 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'],
@@ -464,13 +459,14 @@ class Block {
                                ),
                                __METHOD__
                        );
-
-                       $dbw->insert( 'ipblocks', $row, __METHOD__, array( 'IGNORE' ) );
-                       $affected = $dbw->affectedRows();
+                       if ( $ids ) {
+                               $dbw->delete( 'ipblocks', array( 'ipb_id' => $ids ), __METHOD__ );
+                               $dbw->insert( 'ipblocks', $row, __METHOD__, array( 'IGNORE' ) );
+                               $affected = $dbw->affectedRows();
+                               $this->mId = $dbw->insertId();
+                       }
                }
 
-               $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 52c665c..0000000
+++ /dev/null
@@ -1,885 +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;
-
-               if ( !$tags ) {
-                       return array( '', array() );
-               }
-
-               $classes = array();
-
-               $tags = explode( ',', $tags );
-               $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 dc16ae3..3cfeb8c 100644 (file)
@@ -4297,6 +4297,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
 );
 
 /**
@@ -4556,6 +4557,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;
@@ -5036,7 +5039,11 @@ $wgRateLimits = array(
                'newbie' => null,
                'ip' => null,
                'subnet' => null,
-       )
+       ),
+       'changetag' => array( // adding or removing change tags
+               'user' => null,
+               'newbie' => null,
+       ),
 );
 
 /**
@@ -6467,8 +6474,7 @@ $wgJobQueueAggregator = array(
  * Expensive Querypages are already updated.
  */
 $wgSpecialPageCacheUpdates = array(
-       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' ),
-       'Activeusers' => array( 'SpecialActiveUsers', 'cacheUpdate' ),
+       'Statistics' => array( 'SiteStatsUpdate', 'cacheUpdate' )
 );
 
 /**
@@ -6566,6 +6572,7 @@ $wgLogTypes = array(
        'patrol',
        'merge',
        'suppress',
+       'tag',
        'managetags',
 );
 
@@ -6603,7 +6610,8 @@ $wgLogRestrictions = array(
  * for the link text.
  */
 $wgFilterLogTypes = array(
-       'patrol' => true
+       'patrol' => true,
+       'tag' => true,
 );
 
 /**
@@ -6666,7 +6674,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
@@ -6684,10 +6692,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',
@@ -6765,6 +6774,7 @@ $wgActions = array(
        'credits' => true,
        'delete' => true,
        'edit' => true,
+       'editchangetags' => 'SpecialPageAction',
        'history' => true,
        'info' => true,
        'markpatrolled' => true,
@@ -6773,7 +6783,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 3be43b3..0287798 100644 (file)
@@ -2459,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;
 }
@@ -2473,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
@@ -2535,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;
        }
 
@@ -3780,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 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 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 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..596e605 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 );
 }
index bf0fb8e..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? */
@@ -263,7 +263,7 @@ class Title {
                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.' );
+                       wfWarn( __METHOD__ . ': $text must be a string. This will throw an InvalidArgumentException in future.', 2 );
                }
 
                $cache = self::getTitleCache();
@@ -451,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;
@@ -2574,6 +2577,7 @@ class Title {
                                if ( $row['permission'] == 'autoconfirmed' ) {
                                        $row['permission'] = 'editsemiprotected'; // B/C
                                }
+                               $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] );
                        }
                        $this->mTitleProtection = $row;
                }
@@ -2711,7 +2715,6 @@ class Title {
         *        false.
         */
        public function getCascadeProtectionSources( $getPages = true ) {
-               global $wgContLang;
                $pagerestrictions = array();
 
                if ( $this->mCascadeSources !== null && $getPages ) {
@@ -2754,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;
@@ -2887,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
@@ -2921,9 +2925,6 @@ class Title {
                                        }
                                }
                        }
-
-                       $this->mOldRestrictions = true;
-
                }
 
                if ( count( $rows ) ) {
@@ -2940,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 ) {
@@ -2962,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' ),
@@ -2980,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
@@ -2990,7 +2989,7 @@ class Title {
                                                $this->mTitleProtection = false;
                                        }
                                } else {
-                                       $this->mRestrictionsExpiry['create'] = $wgContLang->formatExpiry( '', TS_MW );
+                                       $this->mRestrictionsExpiry['create'] = 'infinity';
                                }
                                $this->mRestrictionsLoaded = true;
                        }
@@ -3274,6 +3273,7 @@ class Title {
                }
                $this->mRestrictionsLoaded = false;
                $this->mRestrictions = array();
+               $this->mOldRestrictions = false;
                $this->mRedirect = null;
                $this->mLength = -1;
                $this->mLatestID = false;
@@ -3420,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
@@ -3435,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;
        }
 
@@ -4424,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 f526fe0..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',
@@ -1429,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.
@@ -2339,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
@@ -3601,7 +3662,7 @@ class User implements IDBAccessObject {
                // This will be used for a CAS check as a last-resort safety
                // check against race conditions and slave lag.
                $oldTouched = $this->mTouched;
-               $this->mTouched = $this->newTouchedTimestamp();
+               $newTouched = $this->newTouchedTimestamp();
 
                if ( !$wgAuth->allowSetLocalPassword() ) {
                        $this->mPassword = self::getPasswordFactory()->newFromCiphertext( null );
@@ -3617,7 +3678,7 @@ 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 ),
@@ -3629,21 +3690,31 @@ class User implements IDBAccessObject {
                );
 
                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}'."
+                               "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."
                        ) );
-                       // Maybe the problem was a missed cache update; clear it to be safe
-                       $this->clearSharedCache();
 
                        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();
+               } );
        }
 
        /**
@@ -4737,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..b05c219 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(
 '𩧿' => '䮠',
 '𩨀' => '騔',
 '𩨁' => '䮞',
-'𩨂' => '驄',
 '𩨃' => '騝',
 '𩨄' => '騪',
 '𩨅' => '𩤸',
@@ -3004,8 +3002,8 @@ $zh2Hant = array(
 '𫛸' => '鶗',
 '0出現' => '0出現',
 '0出现' => '0出現',
-'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(
 '不干她' => '不干她',
 '不干它' => '不干它',
 '不干我' => '不干我',
-'不干擾' => '不干擾',
 '不干扰' => '不干擾',
+'不干擾' => '不干擾',
 '不干涉' => '不干涉',
 '不干牠' => '不干牠',
 '不干犯' => '不干犯',
@@ -3228,8 +3228,8 @@ $zh2Hant = array(
 '不负所托' => '不負所托',
 '不通吊庆' => '不通弔慶',
 '不丑' => '不醜',
-'不采聲' => '不采聲',
 '不采声' => '不采聲',
+'不采聲' => '不采聲',
 '不锈钢' => '不鏽鋼',
 '不食干腊' => '不食乾腊',
 '不斗' => '不鬥',
@@ -3260,6 +3260,7 @@ $zh2Hant = array(
 '中型钟表面' => '中型鐘表面',
 '中型钟表' => '中型鐘錶',
 '中型钟面' => '中型鐘面',
+'中境里' => '中境里',
 '中岳' => '中嶽',
 '中庄子' => '中庄子',
 '中文里' => '中文裡',
@@ -3275,8 +3276,8 @@ $zh2Hant = array(
 '中签订' => '中簽訂',
 '中签' => '中籤',
 '中风后' => '中風後',
-'丰儀' => '丰儀',
 '丰仪' => '丰儀',
+'丰儀' => '丰儀',
 '丰南' => '丰南',
 '丰姿' => '丰姿',
 '丰容' => '丰容',
@@ -3290,16 +3291,22 @@ $zh2Hant = array(
 '丰采' => '丰采',
 '丰韻' => '丰韻',
 '丰韵' => '丰韻',
+'丹棱' => '丹稜',
 '主仆' => '主僕',
 '主干' => '主幹',
 '主钟差' => '主鐘差',
 '主钟曲线' => '主鐘曲線',
 '乃系' => '乃係',
 '么么唱唱' => '么么唱唱',
+'么九' => '么九',
 '么儿' => '么兒',
+'么半' => '么半',
 '么喝' => '么喝',
+'么女' => '么女',
 '么妹' => '么妹',
+'么子' => '么子',
 '么弟' => '么弟',
+'么正' => '么正',
 '么爷' => '么爺',
 '么雞' => '么雞',
 '么么小丑' => '么麼小丑',
@@ -3321,14 +3328,12 @@ $zh2Hant = array(
 '九扎' => '九紮',
 '九只' => '九隻',
 '九余' => '九餘',
-'也斗了胆' => '也斗了膽',
 '干上' => '乾上',
 '干干' => '乾乾',
-'干干儿的' => '乾乾兒的',
 '干干净净' => '乾乾淨淨',
 '干了' => '乾了',
 '干井' => '乾井',
-'干个够' => '乾個夠',
+'干个' => '乾個',
 '干儿' => '乾兒',
 '干冰' => '乾冰',
 '干冷' => '乾冷',
@@ -3349,7 +3354,6 @@ $zh2Hant = array(
 '干回付' => '乾回付',
 '干圆洁净' => '乾圓潔淨',
 '干地' => '乾地',
-'干坤' => '乾坤',
 '干坞' => '乾塢',
 '干女' => '乾女',
 '干奴才' => '乾奴才',
@@ -3464,13 +3468,14 @@ $zh2Hant = array(
 '干醋' => '乾醋',
 '干重' => '乾重',
 '干量' => '乾量',
+'干锅' => '乾鍋',
 '干阿奶' => '乾阿奶',
-'干隆' => '乾隆',
 '干雷' => '乾雷',
 '干电' => '乾電',
 '干霍乱' => '乾霍亂',
 '干颡' => '乾顙',
 '干台' => '乾颱',
+'干食' => '乾食',
 '干饭' => '乾飯',
 '干馆' => '乾館',
 '干糇' => '乾餱',
@@ -3484,10 +3489,8 @@ $zh2Hant = array(
 '乱哄' => '亂鬨',
 '乱哄不过来' => '亂鬨不過來',
 '了然后' => '了然後',
-'事情干脆' => '事情干脆',
 '事有斗巧' => '事有鬥巧',
 '事里' => '事裡',
-'事都干脆' => '事都干脆',
 '二不棱登' => '二不稜登',
 '二个' => '二個',
 '二只得' => '二只得',
@@ -3497,8 +3500,8 @@ $zh2Hant = array(
 '二缶钟惑' => '二缶鐘惑',
 '二老板' => '二老板',
 '二虎相斗' => '二虎相鬥',
-'二里头' => '二里頭',
 '二里頭' => '二里頭',
+'二里头' => '二里頭',
 '二只' => '二隻',
 '二余' => '二餘',
 '于丹' => '于丹',
@@ -3510,10 +3513,10 @@ $zh2Hant = array(
 '于偉國' => '于偉國',
 '于伟国' => '于偉國',
 '于光新' => '于光新',
-'于光遠' => '于光遠',
 '于光远' => '于光遠',
-'äº\8eå\85\8b\85°å¤\9aå\8e¿' => 'äº\8eå\85\8b\98­å¤\9a縣',
+'äº\8eå\85\89é\81 ' => 'äº\8eå\85\89é\81 ',
 '于克-蘭多縣' => '于克-蘭多縣',
+'于克-兰多县' => '于克-蘭多縣',
 '于克勒' => '于克勒',
 '于再清' => '于再清',
 '于冕' => '于冕',
@@ -3524,16 +3527,16 @@ $zh2Hant = array(
 '于化虎' => '于化虎',
 '于占元' => '于占元',
 '于友泽' => '于友澤',
-'于台烟' => '于台煙',
 '于台煙' => '于台煙',
+'于台烟' => '于台煙',
 '于右任' => '于右任',
 '于吉' => '于吉',
 '于和伟' => '于和偉',
 '于品海' => '于品海',
-'于國楨' => '于國楨',
 '于国桢' => '于國楨',
-'äº\8eå\9b½æ²»' => 'äº\8eå\9c\8bæ²»',
+'äº\8eå\9c\8b楨' => 'äº\8eå\9c\8b楨',
 '于國治' => '于國治',
+'于国治' => '于國治',
 '于堅' => '于堅',
 '于坚' => '于堅',
 '于大宝' => '于大寶',
@@ -3547,8 +3550,8 @@ $zh2Hant = array(
 '于娟' => '于娟',
 '于子千' => '于子千',
 '于孔兼' => '于孔兼',
-'于学忠' => '于學忠',
 '于學忠' => '于學忠',
+'于学忠' => '于學忠',
 '于家堡' => '于家堡',
 '于寘' => '于寘',
 '于宝轩' => '于寶軒',
@@ -3560,10 +3563,10 @@ $zh2Hant = array(
 '于山' => '于山',
 '于山國' => '于山國',
 '于山国' => '于山國',
-'于帅' => '于帥',
 '于帥' => '于帥',
-'äº\8eå¹¼è»\8d' => 'äº\8eå¹¼è»\8d',
+'äº\8eå¸\85' => 'äº\8e帥',
 '于幼军' => '于幼軍',
+'于幼軍' => '于幼軍',
 '于康震' => '于康震',
 '于广洲' => '于廣洲',
 '于廣洲' => '于廣洲',
@@ -3571,8 +3574,8 @@ $zh2Hant = array(
 '于从濂' => '于從濂',
 '于從濂' => '于從濂',
 '于德海' => '于德海',
-'于志寧' => '于志寧',
 '于志宁' => '于志寧',
+'于志寧' => '于志寧',
 '于忠肃集' => '于忠肅集',
 '于思' => '于思',
 '于慎行' => '于慎行',
@@ -3585,19 +3588,19 @@ $zh2Hant = array(
 '于敏中' => '于敏中',
 '于斌' => '于斌',
 '于斯塔德' => '于斯塔德',
-'于斯納爾斯貝里' => '于斯納爾斯貝里',
 '于斯纳尔斯贝里' => '于斯納爾斯貝里',
-'于斯達爾' => '于斯達爾',
+'于斯納爾斯貝里' => '于斯納爾斯貝里',
 '于斯达尔' => '于斯達爾',
-'äº\8eæ\98\8e濤' => 'äº\8eæ\98\8e濤',
+'äº\8eæ\96¯é\81\94ç\88¾' => 'äº\8eæ\96¯é\81\94ç\88¾',
 '于明涛' => '于明濤',
+'于明濤' => '于明濤',
 '于是之' => '于是之',
 '于晨楠' => '于晨楠',
 '于晴' => '于晴',
-'于会泳' => '于會泳',
 '于會泳' => '于會泳',
-'于根偉' => '于根偉',
+'于会泳' => '于會泳',
 '于根伟' => '于根偉',
+'于根偉' => '于根偉',
 '于格' => '于格',
 '于枫' => '于楓',
 '于楓' => '于楓',
@@ -3620,20 +3623,20 @@ $zh2Hant = array(
 '于浩威' => '于浩威',
 '于海' => '于海',
 '于海洋' => '于海洋',
-'于湘蘭' => '于湘蘭',
 '于湘兰' => '于湘蘭',
+'于湘蘭' => '于湘蘭',
 '于漢超' => '于漢超',
 '于汉超' => '于漢超',
 '于澄' => '于澄',
 '于澤爾' => '于澤爾',
 '于泽尔' => '于澤爾',
-'于涛' => '于濤',
 '于濤' => '于濤',
+'于涛' => '于濤',
 '于熙珍' => '于熙珍',
 '于尔岑' => '于爾岑',
 '于爾岑' => '于爾岑',
-'于尔根' => '于爾根',
 '于爾根' => '于爾根',
+'于尔根' => '于爾根',
 '于尔里克' => '于爾里克',
 '于爾里克' => '于爾里克',
 '于特森' => '于特森',
@@ -3653,18 +3656,18 @@ $zh2Hant = array(
 '于謙' => '于謙',
 '于谦' => '于謙',
 '于谨' => '于謹',
-'于貝爾' => '于貝爾',
 '于贝尔' => '于貝爾',
-'äº\8eèµ ' => 'äº\8eè´\88',
+'äº\8eè²\9dç\88¾' => 'äº\8eè²\9dç\88¾',
 '于贈' => '于贈',
+'于赠' => '于贈',
 '于越' => '于越',
 '于军' => '于軍',
 '于軍' => '于軍',
 '于道泉' => '于道泉',
 '于远伟' => '于遠偉',
 '于遠偉' => '于遠偉',
-'于都县' => '于都縣',
 '于都縣' => '于都縣',
+'于都县' => '于都縣',
 '于里察' => '于里察',
 '于阗' => '于闐',
 '于双戈' => '于雙戈',
@@ -3677,8 +3680,8 @@ $zh2Hant = array(
 '于靖' => '于靖',
 '于非暗' => '于非闇',
 '于非闇' => '于非闇',
-'于韋斯屈萊' => '于韋斯屈萊',
 '于韦斯屈莱' => '于韋斯屈萊',
+'于韋斯屈萊' => '于韋斯屈萊',
 '于风政' => '于風政',
 '于風政' => '于風政',
 '于飞' => '于飛',
@@ -3687,8 +3690,8 @@ $zh2Hant = array(
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
-'于鳳桐' => '于鳳桐',
 '于凤桐' => '于鳳桐',
+'于鳳桐' => '于鳳桐',
 '于鳳至' => '于鳳至',
 '于凤至' => '于鳳至',
 '于默奧' => '于默奧',
@@ -3696,14 +3699,16 @@ $zh2Hant = array(
 '云乎' => '云乎',
 '云云' => '云云',
 '云何' => '云何',
-'云为' => '云為',
+'云敞' => '云敞',
 '云為' => '云為',
+'云为' => '云為',
 '云然' => '云然',
 '云尔' => '云爾',
 '云:' => '云:',
 '五个' => '五個',
 '五周后' => '五周後',
 '五天后' => '五天後',
+'五峰县' => '五峯縣',
 '五岳' => '五嶽',
 '五年' => '五年',
 '五谷' => '五穀',
@@ -3715,7 +3720,6 @@ $zh2Hant = array(
 '五只' => '五隻',
 '五余' => '五餘',
 '井干' => '井幹',
-'井干摧败' => '井榦摧敗',
 '井里' => '井裡',
 '亚于' => '亞於',
 '亚美尼亚历' => '亞美尼亞曆',
@@ -3723,6 +3727,7 @@ $zh2Hant = array(
 '交游' => '交遊',
 '交哄' => '交鬨',
 '亦云' => '亦云',
+'京沈' => '京瀋',
 '亮丑' => '亮醜',
 '亮钟' => '亮鐘',
 '人云' => '人云',
@@ -3739,6 +3744,7 @@ $zh2Hant = array(
 '付托' => '付託',
 '仙后' => '仙后',
 '仙后座' => '仙后座',
+'仙游' => '仙遊',
 '代数里' => '代數裡',
 '代理发行' => '代理發行',
 '代码表' => '代碼表',
@@ -3767,6 +3773,7 @@ $zh2Hant = array(
 '伊郁' => '伊鬱',
 '伏几' => '伏几',
 '伐罪吊民' => '伐罪弔民',
+'休克期' => '休克期',
 '休征' => '休徵',
 '伙头' => '伙頭',
 '伴游' => '伴遊',
@@ -3793,13 +3800,12 @@ $zh2Hant = array(
 '作品里' => '作品裡',
 '作奸犯科' => '作姦犯科',
 '作准' => '作準',
-'你斗了胆' => '你斗了膽',
 '你夸' => '你誇',
 '佣金' => '佣金',
-'佣鈿' => '佣鈿',
 '佣钿' => '佣鈿',
-'ä½£é\92±' => 'ä½£é\8c¢',
+'ä½£é\88¿' => 'ä½£é\88¿',
 '佣錢' => '佣錢',
+'佣钱' => '佣錢',
 '佳肴' => '佳肴',
 '佳里鎮' => '佳里鎮',
 '并一不二' => '併一不二',
@@ -3808,7 +3814,7 @@ $zh2Hant = array(
 '并到' => '併到',
 '并合' => '併合',
 '并名' => '併名',
-'并吞' => '併吞',
+'并吞下' => '併吞下',
 '并拢' => '併攏',
 '并案' => '併案',
 '并流' => '併流',
@@ -3846,7 +3852,6 @@ $zh2Hant = array(
 '个里' => '個裡',
 '个钟' => '個鐘',
 '个钟表' => '個鐘錶',
-'们斗了胆' => '們斗了膽',
 '幸免' => '倖免',
 '幸存' => '倖存',
 '幸幸' => '倖幸',
@@ -3875,6 +3880,7 @@ $zh2Hant = array(
 '传于' => '傳於',
 '债累累' => '債纍纍',
 '傻里傻气' => '傻裡傻氣',
+'仅余' => '僅餘',
 '仆人' => '僕人',
 '仆使' => '僕使',
 '仆仆' => '僕僕',
@@ -3956,14 +3962,15 @@ $zh2Hant = array(
 '凶险' => '兇險',
 '先采' => '先採',
 '光致致' => '光緻緻',
+'克期间' => '克期間',
 '免征' => '免徵',
 '党太尉' => '党太尉',
 '党姓' => '党姓',
 '党家' => '党家',
 '党怀英' => '党懷英',
 '党进' => '党進',
-'党项' => '党項',
 '党項' => '党項',
+'党项' => '党項',
 '内脏' => '內臟',
 '内制' => '內製',
 '内面包' => '內面包',
@@ -4034,8 +4041,8 @@ $zh2Hant = array(
 '准三后' => '准三后',
 '准保護' => '准保護',
 '准保护' => '准保護',
-'准保釋' => '准保釋',
 '准保释' => '准保釋',
+'准保釋' => '准保釋',
 '凌蒙初' => '凌濛初',
 '凝炼' => '凝鍊',
 '几上' => '几上',
@@ -4079,20 +4086,22 @@ $zh2Hant = array(
 '划具' => '划具',
 '划到岸' => '划到岸',
 '划到江心' => '划到江心',
-'划动' => '划動',
 '划動' => '划動',
+'划动' => '划動',
 '划去' => '划去',
 '划子' => '划子',
 '划得來' => '划得來',
 '划得来' => '划得來',
 '划拳' => '划拳',
-'划槳' => '划槳',
 '划桨' => '划槳',
+'划槳' => '划槳',
 '划水' => '划水',
+'划着独木舟' => '划着獨木舟',
+'划着竹筏' => '划着竹筏',
+'划着船' => '划着船',
 '划算' => '划算',
 '划船' => '划船',
 '划艇' => '划艇',
-'划著' => '划著',
 '划行' => '划行',
 '划走' => '划走',
 '划起' => '划起',
@@ -4100,8 +4109,8 @@ $zh2Hant = array(
 '划进' => '划進',
 '划过' => '划過',
 '划過' => '划過',
-'划龙舟' => '划龍舟',
 '划龍舟' => '划龍舟',
+'划龙舟' => '划龍舟',
 '判断发' => '判斷發',
 '别辟' => '別闢',
 '利欲' => '利慾',
@@ -4136,7 +4145,6 @@ $zh2Hant = array(
 '剥制' => '剝製',
 '剩余' => '剩餘',
 '剪其发' => '剪其髮',
-'剪牡丹喂牛' => '剪牡丹喂牛',
 '剪发' => '剪髮',
 '割舍' => '割捨',
 '创获' => '創穫',
@@ -4148,8 +4156,9 @@ $zh2Hant = array(
 '铲头' => '剷頭',
 '划入' => '劃入',
 '划为' => '劃為',
-'å\8a\89ä½³æ\80\9c' => 'å\8a\89ä½³æ\80\9c',
+'å\88\92è\91\97' => 'å\8a\83è\91\97å\90\8d',
 '刘佳怜' => '劉佳怜',
+'劉佳怜' => '劉佳怜',
 '刘芸后' => '劉芸后',
 '力拼' => '力拚',
 '力拼众敌' => '力拼眾敵',
@@ -4157,7 +4166,6 @@ $zh2Hant = array(
 '功勋' => '功勳',
 '功致' => '功緻',
 '加氢精制' => '加氫精制',
-'加注' => '加註',
 '劣于' => '劣於',
 '助于' => '助於',
 '劫余' => '劫餘',
@@ -4179,6 +4187,7 @@ $zh2Hant = array(
 '包扎' => '包紮',
 '匏系' => '匏繫',
 '北山索面' => '北山索麵',
+'北仑河' => '北崙河',
 '北岳' => '北嶽',
 '北回线' => '北迴線',
 '北回铁路' => '北迴鐵路',
@@ -4199,8 +4208,8 @@ $zh2Hant = array(
 '十出' => '十齣',
 '千个' => '千個',
 '千只可' => '千只可',
-'千只够' => '千只夠',
 '千只夠' => '千只夠',
+'千只够' => '千只夠',
 '千只怕' => '千只怕',
 '千只能' => '千只能',
 '千只足够' => '千只足夠',
@@ -4230,7 +4239,6 @@ $zh2Hant = array(
 '南回线' => '南迴線',
 '南回铁路' => '南迴鐵路',
 '南游' => '南遊',
-'博汇' => '博彙',
 '博采' => '博採',
 '博尔术' => '博爾朮',
 '卜云吉' => '卜云吉',
@@ -4254,8 +4262,8 @@ $zh2Hant = array(
 '反朴' => '反樸',
 '反冲' => '反衝',
 '反复制' => '反複製',
-'反覆' => '反覆',
 '反复' => '反覆',
+'反覆' => '反覆',
 '取舍' => '取捨',
 '受雇' => '受僱',
 '受托' => '受託',
@@ -4270,8 +4278,9 @@ $zh2Hant = array(
 '口腹之欲' => '口腹之慾',
 '口里' => '口裡',
 '口钟' => '口鐘',
-'古書云' => '古書云',
+'古人有云' => '古人有云',
 '古书云' => '古書云',
+'古書云' => '古書云',
 '古柯咸' => '古柯鹹',
 '古朴' => '古樸',
 '古语云' => '古語云',
@@ -4310,10 +4319,10 @@ $zh2Hant = array(
 '只身旁' => '只身旁',
 '只身材' => '只身材',
 '只身段' => '只身段',
-'只身为' => '只身為',
 '只身為' => '只身為',
-'只身邊' => '只身邊',
+'只身为' => '只身為',
 '只身边' => '只身邊',
+'只身邊' => '只身邊',
 '只身首' => '只身首',
 '只身體' => '只身體',
 '只身体' => '只身體',
@@ -4339,6 +4348,7 @@ $zh2Hant = array(
 '叶音' => '叶音',
 '叶韵' => '叶韻',
 '吃板刀面' => '吃板刀麵',
+'吃碗面' => '吃碗麵',
 '吃姜' => '吃薑',
 '吃里扒外' => '吃裡扒外',
 '吃里爬外' => '吃裡爬外',
@@ -4359,6 +4369,7 @@ $zh2Hant = array(
 '同伙' => '同夥',
 '同于' => '同於',
 '同余' => '同餘',
+'名单于' => '名單於',
 '后冠' => '后冠',
 '后北街' => '后北街',
 '后土' => '后土',
@@ -4369,21 +4380,21 @@ $zh2Hant = array(
 '后庄' => '后庄',
 '后座' => '后座',
 '后母戊' => '后母戊',
-'后海灣' => '后海灣',
 '后海湾' => '后海灣',
+'后海灣' => '后海灣',
 '后瑞站' => '后瑞站',
 '后稷' => '后稷',
 '后綜' => '后綜',
 '后羿' => '后羿',
 '后街' => '后街',
 '后角' => '后角',
-'后豐' => '后豐',
 '后丰' => '后豐',
+'后豐' => '后豐',
 '后里' => '后里',
 '后髮FK型星' => '后髮FK型星',
 '后发FK型星' => '后髮FK型星',
-'后发座' => '后髮座',
 '后髮座' => '后髮座',
+'后发座' => '后髮座',
 '后发星系团' => '后髮星系團',
 '后髮星系團' => '后髮星系團',
 '吐哺捉发' => '吐哺捉髮',
@@ -4400,18 +4411,20 @@ $zh2Hant = array(
 '吹发' => '吹髮',
 '吹胡' => '吹鬍',
 '吾为之范我驰驱' => '吾爲之範我馳驅',
-'吕后' => '呂后',
 '呂后' => '呂后',
+'吕后' => '呂后',
 '呆呆兽' => '呆呆獸',
 '呆致致' => '呆緻緻',
 '呆里呆气' => '呆裡呆氣',
 '告札' => '告劄',
+'呦喂' => '呦喂',
 '周后' => '周后',
+'周惠后' => '周惠后',
 '周历' => '周曆',
-'周杰倫' => '周杰倫',
-'周杰伦' => '周杰倫',
+'周杰' => '周杰',
 '周历史' => '周歷史',
-'周游' => '周遊',
+'周游列国' => '周遊列國',
+'呵喂' => '呵喂',
 '呼吁' => '呼籲',
 '命中注定' => '命中注定',
 '和奸' => '和姦',
@@ -4422,7 +4435,6 @@ $zh2Hant = array(
 '咯当' => '咯噹',
 '哀吊' => '哀弔',
 '哀挽' => '哀輓',
-'品汇' => '品彙',
 '品鉴' => '品鑑',
 '哄堂大笑' => '哄堂大笑',
 '員山庄' => '員山庄',
@@ -4437,9 +4449,14 @@ $zh2Hant = array(
 '商历' => '商曆',
 '商标准许' => '商標准許',
 '商历史' => '商歷史',
+'啊喂' => '啊喂',
 '启发式' => '啟發式',
 '啷当' => '啷噹',
 '喂了一声' => '喂了一聲',
+'喂喂' => '喂喂',
+'喂哟' => '喂喲',
+'喂!' => '喂!',
+'喂,' => '喂,',
 '善于' => '善於',
 '喜向往' => '喜向往',
 '喜欢表' => '喜歡錶',
@@ -4450,11 +4467,13 @@ $zh2Hant = array(
 '喧哄' => '喧鬨',
 '丧钟' => '喪鐘',
 '乔岳' => '喬嶽',
-'單于' => '單于',
 '单于' => '單于',
+'單于' => '單于',
 '单单于' => '單單於',
 '单干' => '單幹',
 '单打独斗' => '單打獨鬥',
+'喲喂' => '喲喂',
+'哟喂' => '喲喂',
 '嘉谷' => '嘉穀',
 '嘉肴' => '嘉肴',
 '嘴里' => '嘴裡',
@@ -4497,6 +4516,7 @@ $zh2Hant = array(
 '回旋加速' => '回旋加速',
 '回历' => '回曆',
 '回历史' => '回歷史',
+'回荡' => '回蕩',
 '回复中' => '回覆中',
 '回复你' => '回覆你',
 '回复帖子' => '回覆帖子',
@@ -4570,12 +4590,14 @@ $zh2Hant = array(
 '堡子里' => '堡子里',
 '场里' => '場裡',
 '塞耳盗钟' => '塞耳盜鐘',
+'境里' => '境裡',
+'境里程' => '境里程',
 '墓志铭' => '墓志銘',
 '墓志' => '墓誌',
 '增辟' => '增闢',
 '墨子里' => '墨子里',
-'墨沈' => '墨沈',
-'墨沈未干' => '墨瀋未乾',
+'墨沈沈' => '墨沈沈',
+'墨沈' => '墨瀋',
 '垦辟' => '墾闢',
 '壮游' => '壯遊',
 '壮面' => '壯麵',
@@ -4584,8 +4606,8 @@ $zh2Hant = array(
 '壸范' => '壼範',
 '壽天里' => '壽天里',
 '寿面' => '壽麵',
-'夏于乔' => '夏于喬',
 '夏于喬' => '夏于喬',
+'夏于乔' => '夏于喬',
 '夏历' => '夏曆',
 '夏历史' => '夏歷史',
 '夏游' => '夏遊',
@@ -4597,16 +4619,16 @@ $zh2Hant = array(
 '多只含' => '多只含',
 '多只在' => '多只在',
 '多只是' => '多只是',
-'多只會' => '多只會',
 '多只会' => '多只會',
+'多只會' => '多只會',
 '多只有' => '多只有',
 '多只比' => '多只比',
 '多只用' => '多只用',
 '多只能' => '多只能',
 '多只限' => '多只限',
 '多只需' => '多只需',
-'多只须' => '多只須',
 '多只須' => '多只須',
+'多只须' => '多只須',
 '多周后' => '多周後',
 '多天后' => '多天後',
 '多于' => '多於',
@@ -4665,7 +4687,6 @@ $zh2Hant = array(
 '大钟' => '大鐘',
 '大只' => '大隻',
 '大风后' => '大風後',
-'大曲酒' => '大麴酒',
 '天克地冲' => '天克地衝',
 '天后' => '天后',
 '天后宫' => '天后宮',
@@ -4692,14 +4713,10 @@ $zh2Hant = array(
 '太丑' => '太醜',
 '太阁' => '太閤',
 '夯干' => '夯幹',
-'夸人' => '夸人',
 '夸克' => '夸克',
-'夸姣' => '夸姣',
-'夸容' => '夸容',
 '夸父' => '夸父',
 '夸特' => '夸特',
 '夸脱' => '夸脫',
-'夸丽' => '夸麗',
 '奇勋' => '奇勳',
 '奇迹' => '奇蹟',
 '奇丑' => '奇醜',
@@ -4710,7 +4727,6 @@ $zh2Hant = array(
 '女仆' => '女僕',
 '奴仆' => '奴僕',
 '奸淫掳掠' => '奸淫擄掠',
-'好干' => '好乾',
 '好家伙' => '好傢夥',
 '好凶' => '好兇',
 '好勇斗狠' => '好勇鬥狠',
@@ -4734,7 +4750,6 @@ $zh2Hant = array(
 '始于' => '始於',
 '委托' => '委託',
 '委托书' => '委託書',
-'姜文杰' => '姜文杰',
 '奸夫' => '姦夫',
 '奸妇' => '姦婦',
 '奸宄' => '姦宄',
@@ -4765,7 +4780,9 @@ $zh2Hant = array(
 '存折' => '存摺',
 '存于' => '存於',
 '孛里海' => '孛里海',
-'孤寡不谷' => '孤寡不穀',
+'孝惠后' => '孝惠后',
+'孙杰' => '孫杰',
+'孫杰' => '孫杰',
 '学家' => '學家',
 '学里' => '學裡',
 '宇宙志' => '宇宙誌',
@@ -4867,8 +4884,8 @@ $zh2Hant = array(
 '尸弃佛' => '尸棄佛',
 '尸祝' => '尸祝',
 '尸禄' => '尸祿',
-'尸罗精舍' => '尸羅精舍',
 '尸羅精舍' => '尸羅精舍',
+'尸罗精舍' => '尸羅精舍',
 '尸臣' => '尸臣',
 '尸谏' => '尸諫',
 '尸魂界' => '尸魂界',
@@ -4894,24 +4911,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 +4968,7 @@ $zh2Hant = array(
 '师范' => '師範',
 '席卷' => '席捲',
 '带征' => '帶徵',
+'带余' => '帶餘',
 '带发修行' => '帶髮修行',
 '幅图里' => '幅圖裡',
 '干系' => '干係',
@@ -4960,6 +4981,7 @@ $zh2Hant = array(
 '年里' => '年裡',
 '年鉴' => '年鑑',
 '并力' => '并力',
+'并吞' => '并吞',
 '并州' => '并州',
 '并日而食' => '并日而食',
 '并迭' => '并迭',
@@ -4973,7 +4995,7 @@ $zh2Hant = array(
 '干些' => '幹些',
 '干人' => '幹人',
 '干什么' => '幹什麼',
-'干个' => '幹個',
+'干个够' => '幹個夠',
 '干劲' => '幹勁',
 '干吏' => '幹吏',
 '干员' => '幹員',
@@ -4983,7 +5005,6 @@ $zh2Hant = array(
 '干坏事' => '幹壞事',
 '干完' => '幹完',
 '干家' => '幹家',
-'干将' => '幹將',
 '干得了' => '幹得了',
 '干性油' => '幹性油',
 '干才' => '幹才',
@@ -5027,13 +5048,13 @@ $zh2Hant = array(
 '床席' => '床蓆',
 '店里' => '店裡',
 '府干卿' => '府干卿',
-'府干擾' => '府干擾',
 '府干扰' => '府干擾',
+'府干擾' => '府干擾',
 '府干政' => '府干政',
 '府干涉' => '府干涉',
 '府干犯' => '府干犯',
-'府干預' => '府干預',
 '府干预' => '府干預',
+'府干預' => '府干預',
 '府干' => '府幹',
 '座钟' => '座鐘',
 '廍子里' => '廍子里',
@@ -5041,8 +5062,8 @@ $zh2Hant = array(
 '厨余' => '廚餘',
 '厮斗' => '廝鬥',
 '庙里' => '廟裡',
-'廢后' => '廢后',
 '废后' => '廢后',
+'廢后' => '廢后',
 '广征' => '廣徵',
 '广舍' => '廣捨',
 '延历' => '延曆',
@@ -5096,6 +5117,8 @@ $zh2Hant = array(
 '張三丰' => '張三丰',
 '张三丰' => '張三丰',
 '张勋' => '張勳',
+'張杰' => '張杰',
+'张杰' => '張杰',
 '张乐于张徐' => '張樂于張徐',
 '强制作用' => '強制作用',
 '强奸' => '強姦',
@@ -5109,13 +5132,9 @@ $zh2Hant = array(
 '弹子台' => '彈子檯',
 '弹珠台' => '彈珠檯',
 '汇刊' => '彙刊',
-'汇报' => '彙報',
-'汇整' => '彙整',
 '汇算' => '彙算',
-'汇编' => '彙編',
 '汇纂' => '彙纂',
 '汇辑' => '彙輯',
-'汇集' => '彙集',
 '形单影只' => '形單影隻',
 '形于' => '形於',
 '彭于晏' => '彭于晏',
@@ -5133,11 +5152,13 @@ $zh2Hant = array(
 '后印' => '後印',
 '后台老板' => '後台老板',
 '后天' => '後天',
+'後庄' => '後庄',
 '后面店' => '後面店',
 '徐干' => '徐幹',
 '徒杠' => '徒杠',
 '徒托空言' => '徒託空言',
 '得到回复' => '得到回覆',
+'得力干将' => '得力幹將',
 '从仆' => '從僕',
 '从图里' => '從圖裡',
 '从山里' => '從山裡',
@@ -5326,7 +5347,7 @@ $zh2Hant = array(
 '忠人之托' => '忠人之托',
 '忠仆' => '忠僕',
 '忠于' => '忠於',
-'快干' => '快',
+'快干' => '快',
 '快快当当' => '快快當當',
 '快冲' => '快衝',
 '怒于' => '怒於',
@@ -5376,11 +5397,12 @@ $zh2Hant = array(
 '意大利面' => '意大利麵',
 '爱困' => '愛睏',
 '感于' => '感於',
-'愿朴' => '愿樸',
 '愿樸' => '愿樸',
+'愿朴' => '愿樸',
 '愿而恭' => '愿而恭',
 '栗冽' => '慄冽',
 '栗栗' => '慄慄',
+'慈溪' => '慈谿',
 '慌里慌张' => '慌裡慌張',
 '惨淡' => '慘澹',
 '庆吊' => '慶弔',
@@ -5406,9 +5428,8 @@ $zh2Hant = array(
 '应征' => '應徵',
 '应钟' => '應鐘',
 '懔栗' => '懍慄',
-'蒙懂' => '懞懂',
-'蒙蒙懂懂' => '懞懞懂懂',
-'蒙直' => '懞直',
+'懞懞懂懂' => '懞懞懂懂',
+'懞直' => '懞直',
 '惩忿窒欲' => '懲忿窒欲',
 '怀里' => '懷裡',
 '怀钟' => '懷鐘',
@@ -5437,7 +5458,6 @@ $zh2Hant = array(
 '所占算' => '所占算',
 '所托' => '所託',
 '扁拟谷盗虫' => '扁擬穀盜蟲',
-'手冢治虫' => '手塚治虫',
 '手塚治虫' => '手塚治虫',
 '手折' => '手摺',
 '手表態' => '手表態',
@@ -5446,15 +5466,15 @@ $zh2Hant = array(
 '手表決' => '手表決',
 '手表决' => '手表決',
 '手表演' => '手表演',
-'手表現' => '手表現',
 '手表现' => '手表現',
+'手表現' => '手表現',
 '手表示' => '手表示',
 '手表達' => '手表達',
 '手表达' => '手表達',
 '手表露' => '手表露',
 '手表面' => '手表面',
+'手里' => '手裏',
 '手里剑' => '手裏劍',
-'手里' => '手裡',
 '手表' => '手錶',
 '手链' => '手鍊',
 '手松' => '手鬆',
@@ -5492,6 +5512,7 @@ $zh2Hant = array(
 '批复' => '批覆',
 '批注' => '批註',
 '批斗' => '批鬥',
+'扼肮' => '扼肮',
 '承制' => '承製',
 '抑制作用' => '抑制作用',
 '抑制剂' => '抑制劑',
@@ -5500,8 +5521,8 @@ $zh2Hant = array(
 '抓斗' => '抓鬥',
 '抗御' => '抗禦',
 '折向往' => '折向往',
-'折子戏' => '折子戲',
 '折子戲' => '折子戲',
+'折子戏' => '折子戲',
 '折戟沈河' => '折戟沈河',
 '折冲' => '折衝',
 '披榛采兰' => '披榛採蘭',
@@ -5567,6 +5588,7 @@ $zh2Hant = array(
 '挑大梁' => '挑大樑',
 '挑斗' => '挑鬥',
 '振荡' => '振蕩',
+'捆扎' => '捆紮',
 '捉奸徒' => '捉奸徒',
 '捉奸细' => '捉奸細',
 '捉奸贼' => '捉奸賊',
@@ -5686,8 +5708,8 @@ $zh2Hant = array(
 '采种' => '採種',
 '采空区' => '採空區',
 '采空采穗' => '採空採穗',
-'采纳' => '採納',
 '采納' => '採納',
+'采纳' => '採納',
 '采给' => '採給',
 '采花' => '採花',
 '采芹人' => '採芹人',
@@ -5734,13 +5756,12 @@ $zh2Hant = array(
 '揪发' => '揪髮',
 '揪须' => '揪鬚',
 '揭丑' => '揭醜',
-'揮手表' => '揮手表',
 '挥手表' => '揮手表',
+'揮手表' => '揮手表',
 '搋面' => '搋麵',
 '损于' => '損於',
 '搏斗' => '搏鬥',
 '捣鬼吊白' => '搗鬼弔白',
-'扼肮' => '搤肮',
 '扼肮拊背' => '搤肮拊背',
 '搬斗' => '搬鬥',
 '搭干铺' => '搭乾鋪',
@@ -5772,8 +5793,9 @@ $zh2Hant = array(
 '拨谷' => '撥穀',
 '撩斗' => '撩鬥',
 '播于' => '播於',
+'扑咚' => '撲鼕',
 '扑冬' => '撲鼕',
-'æ\89\91å\86¬å\86¬' => '撲鼕鼕',
+'æ\89\91å\92\9aå\92\9a' => '撲鼕鼕',
 '擀面' => '擀麵',
 '击扑' => '擊扑',
 '击钟' => '擊鐘',
@@ -5781,7 +5803,6 @@ $zh2Hant = array(
 '担仔面' => '擔仔麵',
 '担担面' => '擔擔麵',
 '据云' => '據云',
-'据干而窥井底' => '據榦而窺井底',
 '擢发' => '擢髮',
 '擦干' => '擦乾',
 '擦干净' => '擦乾淨',
@@ -5793,7 +5814,7 @@ $zh2Hant = array(
 '收获' => '收穫',
 '改征' => '改徵',
 '改采' => '改採',
-'放挣' => '放懞掙',
+'放挣' => '放懞掙',
 '放荡' => '放蕩',
 '放松' => '放鬆',
 '政斗' => '政鬥',
@@ -5840,14 +5861,15 @@ $zh2Hant = array(
 '数与虏确' => '數與虜确',
 '数只' => '數隻',
 '文丑' => '文丑',
-'文汇报' => '文匯報',
 '文学志' => '文學誌',
 '文征明' => '文徵明',
 '文思泉涌' => '文思泉湧',
+'文杰' => '文杰',
 '文采郁郁' => '文采郁郁',
 '斗牛星' => '斗牛星',
 '斫雕为朴' => '斫雕為樸',
 '新井里美' => '新井里美',
+'新干县' => '新幹縣',
 '新历' => '新曆',
 '新历史' => '新歷史',
 '新扎' => '新紮',
@@ -5855,12 +5877,10 @@ $zh2Hant = array(
 '断发' => '斷髮',
 '断发文身' => '斷髮文身',
 '方便面' => '方便麵',
-'方几' => '方几',
 '方向往' => '方向往',
 '方志恒' => '方志恒',
 '方法里' => '方法裡',
 '方志' => '方誌',
-'方面' => '方面',
 '于0' => '於0',
 '于1' => '於1',
 '于2' => '於2',
@@ -5900,9 +5920,9 @@ $zh2Hant = array(
 '于国' => '於國',
 '于坏' => '於坏',
 '于垂' => '於垂',
-'于夫罗' => '於夫羅',
-'於夫罗' => '於夫羅',
 '於夫羅' => '於夫羅',
+'於夫罗' => '於夫羅',
+'于夫罗' => '於夫羅',
 '于她' => '於她',
 '于好' => '於好',
 '于始' => '於始',
@@ -5927,8 +5947,8 @@ $zh2Hant = array(
 '于是' => '於是',
 '于是乎' => '於是乎',
 '于时' => '於時',
-'于梨华' => '於梨華',
 '於梨華' => '於梨華',
+'于梨华' => '於梨華',
 '于乐' => '於樂',
 '于此' => '於此',
 '於氏' => '於氏',
@@ -5964,14 +5984,13 @@ $zh2Hant = array(
 '于陆' => '於陸',
 '于震中' => '於震中',
 '于震前' => '於震前',
-'äº\8eé\9c\87å\90\8e' => 'æ\96¼é\9c\87å\90\8e',
+'äº\8eé\9c\87å\90\8e' => 'æ\96¼é\9c\87å¾\8c',
 '施舍' => '施捨',
 '施于' => '施於',
 '施舍之道' => '施舍之道',
 '旁征博引' => '旁徵博引',
 '旁注' => '旁註',
 '旅游' => '旅遊',
-'旋干转坤' => '旋乾轉坤',
 '旋回' => '旋迴',
 '族里' => '族裡',
 '日心历表' => '日心曆表',
@@ -5991,11 +6010,13 @@ $zh2Hant = array(
 '明范' => '明範',
 '明鉴' => '明鑑',
 '易于' => '易於',
+'昔人有云' => '昔人有云',
 '星历' => '星曆',
 '星期后' => '星期後',
 '星历史' => '星歷史',
 '春游' => '春遊',
 '春香斗学' => '春香鬥學',
+'昭惠后' => '昭惠后',
 '是发小' => '是髮小',
 '时钟' => '時鐘',
 '时间不准' => '時間不準',
@@ -6004,7 +6025,7 @@ $zh2Hant = array(
 '晚钟' => '晚鐘',
 '晞发' => '晞髮',
 '晨钟' => '晨鐘',
-'æ\99®å\86¬å\86¬' => '普鼕鼕',
+'æ\99®å\92\9aå\92\9a' => '普鼕鼕',
 '晾干' => '晾乾',
 '暗地里' => '暗地裡',
 '暗沟里' => '暗溝裡',
@@ -6030,7 +6051,6 @@ $zh2Hant = array(
 '晒谷' => '曬穀',
 '曰云' => '曰云',
 '更仆难数' => '更僕難數',
-'更加注' => '更加注',
 '更签' => '更籤',
 '更钟' => '更鐘',
 '书签' => '書籤',
@@ -6040,8 +6060,8 @@ $zh2Hant = array(
 '曾朴' => '曾樸',
 '最多' => '最多',
 '最多只' => '最多只',
-'會干擾' => '會干擾',
 '会干扰' => '會干擾',
+'會干擾' => '會干擾',
 '会干' => '會幹',
 '会吊' => '會弔',
 '会里' => '會裡',
@@ -6056,15 +6076,15 @@ $zh2Hant = array(
 '有只不' => '有只不',
 '有只允' => '有只允',
 '有只容' => '有只容',
-'有只采' => '有只採',
 '有只採' => '有只採',
+'有只采' => '有只採',
 '有只是' => '有只是',
 '有只用' => '有只用',
 '有回复' => '有回覆',
 '有够赞' => '有夠讚',
 '有征伐' => '有征伐',
-'有征战' => '有征戰',
 '有征戰' => '有征戰',
+'有征战' => '有征戰',
 '有征服' => '有征服',
 '有征讨' => '有征討',
 '有征討' => '有征討',
@@ -6081,8 +6101,8 @@ $zh2Hant = array(
 '望后石' => '望后石',
 '朝乾夕惕' => '朝乾夕惕',
 '朝钟' => '朝鐘',
-'朦胧' => '朦朧',
 '蒙胧' => '朦朧',
+'朦胧' => '朦朧',
 '木偶戏扎' => '木偶戲紮',
 '木材干馏' => '木材乾餾',
 '木梁' => '木樑',
@@ -6101,6 +6121,7 @@ $zh2Hant = array(
 '朱理安历史' => '朱理安歷史',
 '朴子里' => '朴子里',
 '李志喜' => '李志喜',
+'李适' => '李适',
 '李连杰' => '李連杰',
 '李連杰' => '李連杰',
 '材干' => '材幹',
@@ -6113,20 +6134,22 @@ $zh2Hant = array(
 '束发' => '束髮',
 '杠人' => '杠人',
 '杠梁' => '杠梁',
-'杠轂' => '杠轂',
 '杠毂' => '杠轂',
+'杠轂' => '杠轂',
 '杯干' => '杯乾',
 '杯面' => '杯麵',
+'杰倫' => '杰倫',
 '杰伦' => '杰倫',
-'杰威爾音樂' => '杰威爾音樂',
-'杰威尔音乐' => '杰威爾音樂',
-'杰特' => '杰特',
+'杰威爾' => '杰威爾',
+'杰威尔' => '杰威爾',
 '东周钟' => '東周鐘',
 '东岳' => '東嶽',
 '東湖里' => '東湖里',
 '东冲西突' => '東衝西突',
 '东游' => '東遊',
+'松口镇' => '松口鎮',
 '松山庄' => '松山庄',
+'松溪县' => '松谿縣',
 '板荡' => '板蕩',
 '林宏岳' => '林宏嶽',
 '林杰樑' => '林杰樑',
@@ -6147,6 +6170,7 @@ $zh2Hant = array(
 '柜子' => '柜子',
 '柜柳' => '柜柳',
 '柱梁' => '柱樑',
+'柳斌杰' => '柳斌杰',
 '柳诒征' => '柳詒徵',
 '栖栖皇皇' => '栖栖皇皇',
 '栗栖溪' => '栗栖溪',
@@ -6160,6 +6184,7 @@ $zh2Hant = array(
 '格里高利历' => '格里高利曆',
 '格斗' => '格鬥',
 '桂圆干' => '桂圓乾',
+'框里' => '框裡',
 '桌几' => '桌几',
 '桌历' => '桌曆',
 '桌历史' => '桌歷史',
@@ -6185,14 +6210,15 @@ $zh2Hant = array(
 '植发' => '植髮',
 '椒面' => '椒麵',
 '椰枣干' => '椰棗乾',
-'楊雅筑' => '楊雅筑',
 '杨雅筑' => '楊雅筑',
+'楊雅筑' => '楊雅筑',
 '桢干' => '楨幹',
 '业余' => '業餘',
 '榨干' => '榨乾',
 '枪杆' => '槍桿',
 '杠杆' => '槓桿',
 '乐器钟' => '樂器鐘',
+'乐游原' => '樂遊原',
 '樊于期' => '樊於期',
 '梁上' => '樑上',
 '梁柱' => '樑柱',
@@ -6208,8 +6234,8 @@ $zh2Hant = array(
 '模范14棒' => '模范14棒',
 '模范21棒' => '模范21棒',
 '模范七棒' => '模范七棒',
-'模范三軍' => '模范三軍',
 '模范三军' => '模范三軍',
+'模范三軍' => '模范三軍',
 '模范棒棒堂' => '模范棒棒堂',
 '模制' => '模製',
 '样范' => '樣範',
@@ -6233,15 +6259,16 @@ $zh2Hant = array(
 '朴陋' => '樸陋',
 '朴马' => '樸馬',
 '朴鲁' => '樸魯',
-'树干' => '樹幹',
 '树林里' => '樹林裡',
+'树干' => '樹榦',
 '树梁' => '樹樑',
 '桥梁' => '橋樑',
-'机械系' => '機械系',
 '機械系' => '機械系',
+'机械系' => '機械系',
 '机械表' => '機械錶',
 '机械钟' => '機械鐘',
 '机械钟表' => '機械鐘錶',
+'横峰县' => '橫峯縣',
 '横征暴敛' => '橫徵暴斂',
 '横梁' => '橫樑',
 '横冲' => '橫衝',
@@ -6250,6 +6277,7 @@ $zh2Hant = array(
 '台灯' => '檯燈',
 '台球' => '檯球',
 '台面上' => '檯面上',
+'台面化' => '檯面化',
 '柜台' => '櫃檯',
 '栉发工' => '櫛髮工',
 '欲海难填' => '欲海難填',
@@ -6259,6 +6287,7 @@ $zh2Hant = array(
 '欧游' => '歐遊',
 '止于' => '止於',
 '正官庄' => '正官庄',
+'正杰' => '正杰',
 '武丑' => '武丑',
 '武后' => '武后',
 '武斗' => '武鬥',
@@ -6299,6 +6328,7 @@ $zh2Hant = array(
 '水来汤里去' => '水來湯裡去',
 '水准' => '水準',
 '水无怜奈' => '水無怜奈',
+'水表面' => '水表面',
 '水里' => '水裡',
 '水里商工' => '水里商工',
 '水里溪' => '水里溪',
@@ -6327,15 +6357,14 @@ $zh2Hant = array(
 '没事干' => '沒事幹',
 '没干' => '沒幹',
 '没折至' => '沒摺至',
-'没梢干' => '沒梢幹',
 '没样范' => '沒樣範',
 '没准' => '沒準',
 '冲冠发怒' => '沖冠髮怒',
 '冲天' => '沖天',
+'沙琅' => '沙瑯',
 '沙羡' => '沙羡',
 '沙里淘金' => '沙裡淘金',
 '河岳' => '河嶽',
-'河流汇集' => '河流匯集',
 '河里' => '河裡',
 '油泼面' => '油潑麵',
 '油斗' => '油鬥',
@@ -6356,7 +6385,7 @@ $zh2Hant = array(
 '泱郁' => '泱鬱',
 '泳气钟' => '泳氣鐘',
 '洄游' => '洄遊',
-'æ´\8b河大æ\9b²' => 'æ´\8b河大麴',
+'æ´\8b河大æ\9b²' => 'æ´\8b河大麯',
 '洒家' => '洒家',
 '洒扫' => '洒掃',
 '洒水' => '洒水',
@@ -6366,8 +6395,8 @@ $zh2Hant = array(
 '洒濯' => '洒濯',
 '洒然' => '洒然',
 '洒脱' => '洒脫',
-'洗炼' => '洗鍊',
 '洗练' => '洗鍊',
+'洗炼' => '洗鍊',
 '洗发' => '洗髮',
 '洛钟东应' => '洛鐘東應',
 '洞里' => '洞裡',
@@ -6396,13 +6425,13 @@ $zh2Hant = array(
 '浸卤' => '浸滷',
 '涂善妮' => '涂善妮',
 '涂坤' => '涂坤',
-'涂壮勋' => '涂壯勳',
 '涂壯勳' => '涂壯勳',
+'涂壮勋' => '涂壯勳',
 '涂天相' => '涂天相',
 '涂姓' => '涂姓',
 '涂序瑄' => '涂序瑄',
-'涂敏恆' => '涂敏恆',
 '涂敏恒' => '涂敏恆',
+'涂敏恆' => '涂敏恆',
 '涂泽民' => '涂澤民',
 '涂澤民' => '涂澤民',
 '涂绍煃' => '涂紹煃',
@@ -6411,8 +6440,8 @@ $zh2Hant = array(
 '涂谨申' => '涂謹申',
 '涂逢年' => '涂逢年',
 '涂醒哲' => '涂醒哲',
-'涂長望' => '涂長望',
 '涂长望' => '涂長望',
+'涂長望' => '涂長望',
 '涂鸿钦' => '涂鴻欽',
 '涂鴻欽' => '涂鴻欽',
 '涳蒙' => '涳濛',
@@ -6425,7 +6454,6 @@ $zh2Hant = array(
 '泪如泉涌' => '淚如泉湧',
 '淡于' => '淡於',
 '淡蒙蒙' => '淡濛濛',
-'淡朱' => '淡硃',
 '净余' => '淨餘',
 '净发' => '淨髮',
 '淫欲' => '淫慾',
@@ -6495,8 +6523,10 @@ $zh2Hant = array(
 '准军事' => '準軍事',
 '准头' => '準頭',
 '准点' => '準點',
+'沟大曲' => '溝大麯',
 '溟蒙' => '溟濛',
 '溢于' => '溢於',
+'温洛克期' => '溫洛克期',
 '溲面' => '溲麵',
 '溺于' => '溺於',
 '滃郁' => '滃鬱',
@@ -6542,6 +6572,7 @@ $zh2Hant = array(
 '潮涌' => '潮湧',
 '溃于' => '潰於',
 '涩谷区' => '澀谷區',
+'澄江县' => '澂江縣',
 '澄澹精致' => '澄澹精致',
 '澒蒙' => '澒濛',
 '泽渗漓而下降' => '澤滲灕而下降',
@@ -6560,11 +6591,20 @@ $zh2Hant = array(
 '蒙汜' => '濛汜',
 '蒙蒙细雨' => '濛濛細雨',
 '蒙雾' => '濛霧',
-'蒙松雨' => '濛鬆雨',
 '蒙鸿' => '濛鴻',
+'浚州' => '濬州',
+'浚县' => '濬縣',
 '滨田里佳子' => '濱田里佳子',
-'沈吉线' => '瀋吉線',
+'沈丹客运' => '瀋丹客運',
+'沈丹线' => '瀋丹線',
+'沈丹铁路' => '瀋丹鐵路',
+'沈北' => '瀋北',
+'沈吉' => '瀋吉',
+'沈大线' => '瀋大線',
+'沈大铁路' => '瀋大鐵路',
+'沈大高速' => '瀋大高速',
 '沈山线' => '瀋山線',
+'沈山铁路' => '瀋山鐵路',
 '沈州' => '瀋州',
 '沈抚' => '瀋撫',
 '沈水' => '瀋水',
@@ -6613,6 +6653,7 @@ $zh2Hant = array(
 '炼制' => '煉製',
 '煎面' => '煎麵',
 '烟卷' => '煙捲',
+'烟台' => '煙臺',
 '照入签' => '照入籤',
 '照相干片' => '照相乾片',
 '煨干' => '煨乾',
@@ -6701,6 +6742,7 @@ $zh2Hant = array(
 '理次发' => '理次髮',
 '理发' => '理髮',
 '琴钟' => '琴鐘',
+'珐琅' => '琺瑯',
 '瑞城里' => '瑞城里',
 '瑞征' => '瑞徵',
 '瑶签' => '瑤籤',
@@ -6736,6 +6778,7 @@ $zh2Hant = array(
 '男仆' => '男僕',
 '界里' => '界裡',
 '畏于' => '畏於',
+'留长发' => '留長髮',
 '留发' => '留髮',
 '毕于' => '畢於',
 '毕业于' => '畢業於',
@@ -6785,11 +6828,11 @@ $zh2Hant = array(
 '白霉' => '白黴',
 '百个' => '百個',
 '百只可' => '百只可',
-'百只夠' => '百只夠',
 '百只够' => '百只夠',
+'百只夠' => '百只夠',
 '百只怕' => '百只怕',
-'百只足夠' => '百只足夠',
 '百只足够' => '百只足夠',
+'百只足夠' => '百只足夠',
 '百周后' => '百周後',
 '百天后' => '百天後',
 '百年' => '百年',
@@ -6805,6 +6848,8 @@ $zh2Hant = array(
 '的回复' => '的回覆',
 '的图里' => '的圖裡',
 '的山里' => '的山裡',
+'的干将' => '的幹將',
+'的个中' => '的箇中',
 '的钟' => '的鐘',
 '的长发' => '的長髮',
 '的发小' => '的髮小',
@@ -6877,6 +6922,7 @@ $zh2Hant = array(
 '瞳蒙' => '瞳矇',
 '蒙事' => '矇事',
 '蒙昧无知' => '矇昧無知',
+'蒙松雨' => '矇松雨',
 '蒙混' => '矇混',
 '蒙瞍' => '矇瞍',
 '蒙眬' => '矇矓',
@@ -6887,6 +6933,7 @@ $zh2Hant = array(
 '矜夸' => '矜誇',
 '短几' => '短几',
 '短于' => '短於',
+'短发生' => '短發生',
 '短发' => '短髮',
 '矮几' => '矮几',
 '石几' => '石几',
@@ -6895,20 +6942,14 @@ $zh2Hant = array(
 '石英钟' => '石英鐘',
 '石英钟表' => '石英鐘錶',
 '石钟' => '石鐘',
-'石钟山' => '石鐘山',
 '研制' => '研製',
 '砰当' => '砰噹',
 '破鉴' => '破鑑',
-'朱唇皓齿' => '硃唇皓齒',
-'朱批' => '硃批',
 '朱砂' => '硃砂',
-'朱笔' => '硃筆',
-'朱红色' => '硃紅色',
-'朱色' => '硃色',
-'朱谕' => '硃諭',
 '硬干' => '硬幹',
 '确瘠' => '确瘠',
 '碑志' => '碑誌',
+'碗里' => '碗裡',
 '碰钟' => '碰鐘',
 '确系' => '確係',
 '码表' => '碼錶',
@@ -6952,7 +6993,6 @@ $zh2Hant = array(
 '私欲' => '私慾',
 '私斗' => '私鬥',
 '秋游' => '秋遊',
-'秋阴入井干' => '秋陰入井幹',
 '秋发' => '秋髮',
 '种丹妮' => '种丹妮',
 '种师中' => '种師中',
@@ -6965,6 +7005,7 @@ $zh2Hant = array(
 '秒表示' => '秒表示',
 '秒钟' => '秒鐘',
 '秤杆' => '秤桿',
+'秦沈客运' => '秦瀋客運',
 '移祸于' => '移禍於',
 '稀松' => '稀鬆',
 '棱台' => '稜台',
@@ -7010,6 +7051,7 @@ $zh2Hant = array(
 '谷雨' => '穀雨',
 '谷类' => '穀類',
 '谷食' => '穀食',
+'穆棱' => '穆稜',
 '穆罕默德历' => '穆罕默德曆',
 '穆罕默德历史' => '穆罕默德歷史',
 '积淀' => '積澱',
@@ -7035,7 +7077,6 @@ $zh2Hant = array(
 '窃钟掩耳' => '竊鐘掩耳',
 '立于' => '立於',
 '立范' => '立範',
-'站干岸儿' => '站乾岸兒',
 '童仆' => '童僕',
 '竞斗' => '競鬥',
 '竹几' => '竹几',
@@ -7043,18 +7084,19 @@ $zh2Hant = array(
 '竹签' => '竹籤',
 '竹席' => '竹蓆',
 '竹制' => '竹製',
+'竹溪县' => '竹谿縣',
 '笑里藏刀' => '笑裡藏刀',
 '第一出现' => '第一出現',
 '第一出現' => '第一出現',
-'第一出線' => '第一出線',
 '第一出线' => '第一出線',
+'第一出線' => '第一出線',
 '第一出' => '第一齣',
 '第七出' => '第七齣',
 '第三出局' => '第三出局',
 '第三出' => '第三齣',
 '第九出' => '第九齣',
-'第二出线' => '第二出線',
 '第二出線' => '第二出線',
+'第二出线' => '第二出線',
 '第二出' => '第二齣',
 '第五出局' => '第五出局',
 '第五出' => '第五齣',
@@ -7069,8 +7111,8 @@ $zh2Hant = array(
 '筑前' => '筑前',
 '筑北' => '筑北',
 '筑州' => '筑州',
-'筑后' => '筑後',
 '筑後' => '筑後',
+'筑后' => '筑後',
 '筑波' => '筑波',
 '筑紫' => '筑紫',
 '筑肥' => '筑肥',
@@ -7081,16 +7123,14 @@ $zh2Hant = array(
 '答复' => '答覆',
 '筵几' => '筵几',
 '个中原因' => '箇中原因',
-'个中奥妙' => '箇中奧妙',
-'个中奥秘' => '箇中奧秘',
+'个中奥' => '箇中奧',
 '个中好手' => '箇中好手',
 '个中强手' => '箇中強手',
-'个中消息' => '箇中消息',
 '个中滋味' => '箇中滋味',
 '个中玄机' => '箇中玄機',
 '个中理由' => '箇中理由',
-'个中讯息' => '箇中訊息',
-'个中资讯' => '箇中資訊',
+'个中翘楚' => '箇中翹楚',
+'个中道理' => '箇中道理',
 '个中高手' => '箇中高手',
 '个旧' => '箇舊',
 '算历' => '算曆',
@@ -7115,8 +7155,9 @@ $zh2Hant = array(
 '范金' => '範金',
 '简并' => '簡併',
 '简朴' => '簡樸',
-'ç°¡ç­\91ç¿\8e' => 'ç°¡ç­\91ç¿\8e',
+'ç®\80ç\9f­å\8f\91' => 'ç°¡ç\9f­ç\99¼',
 '简筑翎' => '簡筑翎',
+'簡筑翎' => '簡筑翎',
 '簸荡' => '簸蕩',
 '签幐' => '籤幐',
 '签押' => '籤押',
@@ -7198,14 +7239,12 @@ $zh2Hant = array(
 '绝于' => '絕於',
 '绞干' => '絞乾',
 '络腮胡' => '絡腮鬍',
-'給我干脆' => '給我干脆',
-'给我干脆' => '給我干脆',
 '给于' => '給於',
 '丝恩发怨' => '絲恩髮怨',
 '丝制' => '絲製',
 '丝发' => '絲髮',
 '绑扎' => '綁紮',
-'捆扎' => '綑紮',
+'绥棱' => '綏稜',
 '經有云' => '經有云',
 '经有云' => '經有云',
 '综合征' => '綜合徵',
@@ -7213,6 +7252,9 @@ $zh2Hant = array(
 '维系' => '維繫',
 '绾发' => '綰髮',
 '纲鉴' => '綱鑑',
+'網球台' => '網球台',
+'网球台' => '網球台',
+'网站里' => '網站裡',
 '网里' => '網裡',
 '网志' => '網誌',
 '网游' => '網遊',
@@ -7237,6 +7279,7 @@ $zh2Hant = array(
 '缝里' => '縫裡',
 '缝制' => '縫製',
 '缩栗' => '縮慄',
+'缩短发' => '縮短發',
 '纵欲' => '縱慾',
 '纤夫' => '縴夫',
 '纤手' => '縴手',
@@ -7247,7 +7290,6 @@ $zh2Hant = array(
 '繁复' => '繁複',
 '繁钟' => '繁鐘',
 '绷扒吊拷' => '繃扒弔拷',
-'穗帏飘井干' => '繐幃飄井幹',
 '绕梁' => '繞樑',
 '绘制' => '繪製',
 '系上。' => '繫上。',
@@ -7273,6 +7315,7 @@ $zh2Hant = array(
 '系紧' => '繫緊',
 '系绳' => '繫繩',
 '系累' => '繫纍',
+'系舟' => '繫舟',
 '系船' => '繫船',
 '系辞' => '繫辭',
 '系鞋带' => '繫鞋帶',
@@ -7317,7 +7360,7 @@ $zh2Hant = array(
 '老干' => '老乾',
 '老仆' => '老僕',
 '老干部' => '老幹部',
-'老' => '老懞',
+'老' => '老懞',
 '老于' => '老於',
 '老爷钟' => '老爺鐘',
 '老姜' => '老薑',
@@ -7357,6 +7400,7 @@ $zh2Hant = array(
 '胜键' => '胜鍵',
 '胡云' => '胡云',
 '胡子昂' => '胡子昂',
+'胡杰' => '胡杰',
 '胡朴安' => '胡樸安',
 '胡里胡涂' => '胡裡胡塗',
 '胰脏' => '胰臟',
@@ -7419,6 +7463,7 @@ $zh2Hant = array(
 '自制能力' => '自制能力',
 '自于' => '自於',
 '自然数里' => '自然數裡',
+'自由钟' => '自由鐘',
 '自制' => '自製',
 '自觉自愿' => '自覺自愿',
 '自夸' => '自誇',
@@ -7431,8 +7476,8 @@ $zh2Hant = array(
 '台静农' => '臺靜農',
 '臻于' => '臻於',
 '舂谷' => '舂穀',
-'舉手表' => '舉手表',
 '举手表' => '舉手表',
+'舉手表' => '舉手表',
 '舊庄' => '舊庄',
 '旧历' => '舊曆',
 '旧历史' => '舊歷史',
@@ -7474,18 +7519,18 @@ $zh2Hant = array(
 '茂都淀' => '茂都澱',
 '范文同' => '范文同',
 '范文正公' => '范文正公',
-'范文瀾' => '范文瀾',
 '范文澜' => '范文瀾',
+'范文瀾' => '范文瀾',
 '范文照' => '范文照',
 '范文程' => '范文程',
 '范文芳' => '范文芳',
 '范文藤' => '范文藤',
 '范文虎' => '范文虎',
 '范登堡' => '范登堡',
-'范賢惠' => '范賢惠',
 '范贤惠' => '范賢惠',
-'è\8c\85äº\8eè½¼' => 'è\8c\85äº\8e軾',
+'è\8c\83è³¢æ\83 ' => 'è\8c\83è³¢æ\83 ',
 '茅于軾' => '茅于軾',
+'茅于轼' => '茅于軾',
 '茶几' => '茶几',
 '茶余' => '茶餘',
 '茶面' => '茶麵',
@@ -7502,7 +7547,7 @@ $zh2Hant = array(
 '莽荡' => '莽蕩',
 '菜干' => '菜乾',
 '菜坛' => '菜罈',
-'菜肴' => '菜',
+'菜肴' => '菜',
 '菠棱菜' => '菠稜菜',
 '菠萝干' => '菠蘿乾',
 '华严钟' => '華嚴鐘',
@@ -7612,10 +7657,11 @@ $zh2Hant = array(
 '藤制' => '藤製',
 '药签' => '藥籤',
 '药面儿' => '藥麵兒',
-'苏昆' => '蘇崑',
 '苏崑' => '蘇崑',
+'苏昆' => '蘇崑',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
+'兰溪市' => '蘭谿市',
 '萝卜' => '蘿蔔',
 '萝卜干' => '蘿蔔乾',
 '虎须' => '虎鬚',
@@ -7634,6 +7680,7 @@ $zh2Hant = array(
 '蝎虎' => '蝎虎',
 '蝎蝎螫螫' => '蝎蝎螫螫',
 '蝎谮' => '蝎譖',
+'虾面' => '蝦麵',
 '虮虱相吊' => '蟣蝨相弔',
 '蛏干' => '蟶乾',
 '蚁后' => '蟻后',
@@ -7645,6 +7692,7 @@ $zh2Hant = array(
 '行事历' => '行事曆',
 '行事历史' => '行事歷史',
 '行凶' => '行兇',
+'行家里手' => '行家裡手',
 '行于' => '行於',
 '行百里者半于九十' => '行百里者半於九十',
 '卫后庄公' => '衛後莊公',
@@ -7698,6 +7746,7 @@ $zh2Hant = array(
 '冲头阵' => '衝頭陣',
 '冲风' => '衝風',
 '衡鉴' => '衡鑑',
+'表面包' => '表面包',
 '衷于' => '衷於',
 '袋杆' => '袋桿',
 '袋里' => '袋裡',
@@ -7716,13 +7765,13 @@ $zh2Hant = array(
 '夹裙' => '袷裙',
 '裁并' => '裁併',
 '裁制' => '裁製',
-'里手' => '裏手',
+'里勾外连' => '裏勾外連',
 '里水镇' => '裏水鎮',
 '里海' => '裏海',
+'里运河' => '裏運河',
 '补于' => '補於',
 '补注' => '補註',
 '装折' => '裝摺',
-'里勾外连' => '裡勾外連',
 '里屋' => '裡屋',
 '里层' => '裡層',
 '里带' => '裡帶',
@@ -7771,6 +7820,13 @@ $zh2Hant = array(
 '复利' => '複利',
 '复印' => '複印',
 '复句' => '複句',
+'复合函数' => '複合函數',
+'复合制' => '複合制',
+'复合式' => '複合式',
+'复合弓' => '複合弓',
+'复合材' => '複合材',
+'复合物' => '複合物',
+'复合体' => '複合體',
 '复壁' => '複壁',
 '复姓' => '複姓',
 '复字键' => '複字鍵',
@@ -7846,6 +7902,7 @@ $zh2Hant = array(
 '触须' => '觸鬚',
 '言云' => '言云',
 '言大而夸' => '言大而夸',
+'言里' => '言裡',
 '言辩而确' => '言辯而确',
 '订制' => '訂製',
 '计划' => '計劃',
@@ -7855,6 +7912,7 @@ $zh2Hant = array(
 '托交' => '託交',
 '托人' => '託人',
 '托付' => '託付',
+'托克逊' => '託克遜',
 '托儿' => '託兒',
 '托古讽今' => '託古諷今',
 '托名' => '託名',
@@ -7876,8 +7934,10 @@ $zh2Hant = array(
 '托辞' => '託辭',
 '托运' => '託運',
 '托过' => '託過',
+'托里县' => '託里縣',
 '托附' => '託附',
 '许愿起经' => '許愿起經',
+'許聖杰' => '許聖杰',
 '许虬' => '許虬',
 '注上' => '註上',
 '注册' => '註冊',
@@ -7915,6 +7975,7 @@ $zh2Hant = array(
 '诔赞' => '誄讚',
 '夸下海口' => '誇下海口',
 '夸了' => '誇了',
+'夸人' => '誇人',
 '夸他' => '誇他',
 '夸你' => '誇你',
 '夸来夸去' => '誇來誇去',
@@ -7926,7 +7987,9 @@ $zh2Hant = array(
 '夸多斗靡' => '誇多鬥靡',
 '夸大' => '誇大',
 '夸她' => '誇她',
+'夸姣' => '誇姣',
 '夸官' => '誇官',
+'夸容' => '誇容',
 '夸张' => '誇張',
 '夸强说会' => '誇強說會',
 '夸得' => '誇得',
@@ -7951,6 +8014,7 @@ $zh2Hant = array(
 '夸辩' => '誇辯',
 '夸过' => '誇過',
 '夸饰' => '誇飾',
+'夸丽' => '誇麗',
 '志哀' => '誌哀',
 '志喜' => '誌喜',
 '志庆' => '誌慶',
@@ -7959,8 +8023,8 @@ $zh2Hant = array(
 '诱奸' => '誘姦',
 '语云' => '語云',
 '语汇' => '語彙',
-'語有云' => '語有云',
 '语有云' => '語有云',
+'語有云' => '語有云',
 '语法里' => '語法裡',
 '语里' => '語裡',
 '诚征' => '誠徵',
@@ -7980,12 +8044,14 @@ $zh2Hant = array(
 '咨询' => '諮詢',
 '诸余' => '諸餘',
 '谋干' => '謀幹',
+'谢杰' => '謝杰',
+'謝杰' => '謝杰',
 '谢华后' => '謝華后',
 '谬采虚声' => '謬採虛聲',
 '谬赞' => '謬讚',
 '謷丑' => '謷醜',
-'謹愿' => '謹愿',
 '谨愿' => '謹愿',
+'謹愿' => '謹愿',
 '谨于心' => '謹於心',
 '哗噪' => '譁噪',
 '哗嚣' => '譁囂',
@@ -8036,8 +8102,8 @@ $zh2Hant = array(
 '买凶' => '買兇',
 '买断发' => '買斷發',
 '贻范' => '貽範',
-'賈后' => '賈后',
 '贾后' => '賈后',
+'賈后' => '賈后',
 '赈饥' => '賑饑',
 '赏赞' => '賞讚',
 '賢后' => '賢后',
@@ -8065,6 +8131,7 @@ $zh2Hant = array(
 '赵治勋' => '趙治勳',
 '趱干' => '趲幹',
 '足于' => '足於',
+'足球台' => '足球台',
 '跌扑' => '跌扑',
 '路图里' => '路圖裡',
 '路签' => '路籤',
@@ -8112,6 +8179,7 @@ $zh2Hant = array(
 '辞汇' => '辭彙',
 '辫发' => '辮髮',
 '辩斗' => '辯鬥',
+'辰溪县' => '辰谿縣',
 '农历' => '農曆',
 '农历史' => '農歷史',
 '农民历' => '農民曆',
@@ -8134,7 +8202,6 @@ $zh2Hant = array(
 '回翔' => '迴翔',
 '回肠' => '迴腸',
 '回肠荡气' => '迴腸盪氣',
-'回荡' => '迴蕩',
 '回诵' => '迴誦',
 '回路' => '迴路',
 '回转' => '迴轉',
@@ -8196,11 +8263,12 @@ $zh2Hant = array(
 '造钟' => '造鐘',
 '连三并四' => '連三併四',
 '连采' => '連採',
+'连发式' => '連發式',
 '连系' => '連繫',
-'周游世界' => '週遊世界',
+'周游' => '週遊',
 '进两出' => '進兩出',
-'進制' => '進制',
 '进制' => '進制',
+'進制' => '進制',
 '逼并' => '逼併',
 '遇风后' => '遇風後',
 '游了' => '遊了',
@@ -8234,6 +8302,7 @@ $zh2Hant = array(
 '游目骋怀' => '遊目騁懷',
 '游程' => '遊程',
 '游丝' => '遊絲',
+'游美学务' => '遊美學務',
 '游兴' => '遊興',
 '游船' => '遊船',
 '游艇' => '遊艇',
@@ -8302,10 +8371,10 @@ $zh2Hant = array(
 '部落发' => '部落發',
 '郭后' => '郭后',
 '都于' => '都於',
-'乡愿' => '鄉愿',
 '鄉愿' => '鄉愿',
-'郑凯云' => '鄭凱云',
+'乡愿' => '鄉愿',
 '鄭凱云' => '鄭凱云',
+'郑凯云' => '鄭凱云',
 '配制饲料' => '配制飼料',
 '配图里' => '配圖裡',
 '配水干管' => '配水幹管',
@@ -8314,8 +8383,8 @@ $zh2Hant = array(
 '酒气冲天' => '酒氣衝天',
 '酒坛' => '酒罈',
 '酒肴' => '酒肴',
-'酒麹' => '酒麴',
 '酒曲' => '酒麴',
+'酒麹' => '酒麴',
 '酥松' => '酥鬆',
 '酸姜' => '酸薑',
 '醇朴' => '醇樸',
@@ -8378,10 +8447,10 @@ $zh2Hant = array(
 '采石之役' => '采石之役',
 '采石之战' => '采石之戰',
 '采石之戰' => '采石之戰',
-'采石矶' => '采石磯',
 '采石磯' => '采石磯',
-'é\87\8c海大学' => 'é\87\8c海大學',
+'é\87\87ç\9f³ç\9f¶' => 'é\87\87ç\9f³ç£¯',
 '里海大學' => '里海大學',
+'里海大学' => '里海大學',
 '里海崖' => '里海崖',
 '里海茨' => '里海茨',
 '里铺' => '里舖',
@@ -8417,6 +8486,7 @@ $zh2Hant = array(
 '金表露' => '金表露',
 '金表面' => '金表面',
 '金装玉里' => '金裝玉裡',
+'金溪县' => '金谿縣',
 '金链' => '金鍊',
 '金钟' => '金鐘',
 '金发' => '金髮',
@@ -8511,6 +8581,7 @@ $zh2Hant = array(
 '钟罩' => '鐘罩',
 '钟声' => '鐘聲',
 '钟腰' => '鐘腰',
+'钟花' => '鐘花',
 '钟螺' => '鐘螺',
 '钟行' => '鐘行',
 '钟表面' => '鐘表面',
@@ -8545,13 +8616,13 @@ $zh2Hant = array(
 '鉴察' => '鑑察',
 '鉴往知来' => '鑑往知來',
 '鉴戒' => '鑑戒',
+'鉴于' => '鑑於',
 '鉴湖' => '鑑湖',
 '鉴藏' => '鑑藏',
 '鉴谅' => '鑑諒',
 '鉴证' => '鑑證',
 '鉴识' => '鑑識',
 '鉴赏' => '鑑賞',
-'鉴于' => '鑒於',
 '长几' => '長几',
 '长于' => '長於',
 '长历' => '長曆',
@@ -8620,8 +8691,10 @@ $zh2Hant = array(
 '陳冲' => '陳冲',
 '陳士杰' => '陳士杰',
 '陈升' => '陳昇',
-'陳有后' => '陳有后',
 '陈有后' => '陳有后',
+'陳有后' => '陳有后',
+'陈杰' => '陳杰',
+'陳杰' => '陳杰',
 '陈炼' => '陳鍊',
 '陆游' => '陸遊',
 '阳春面' => '陽春麵',
@@ -8649,7 +8722,6 @@ $zh2Hant = array(
 '雕梁画栋' => '雕樑畫棟',
 '双折射' => '雙折射',
 '双折' => '雙摺',
-'双沟大曲' => '雙溝大麯',
 '双胜类' => '雙胜類',
 '双雕' => '雙鵰',
 '杂合面儿' => '雜合麵兒',
@@ -8671,7 +8743,7 @@ $zh2Hant = array(
 '雪里' => '雪裡',
 '雪里红' => '雪裡紅',
 '雪里蕻' => '雪裡蕻',
-'云吞面' => '雲吞麵',
+'云吞' => '雲吞',
 '云笈七签' => '雲笈七籤',
 '云游' => '雲遊',
 '云须' => '雲鬚',
@@ -8684,16 +8756,21 @@ $zh2Hant = array(
 '电子表格' => '電子表格',
 '电子钟' => '電子鐘',
 '电子钟表' => '電子鐘錶',
+'电梯里' => '電梯裡',
 '电波钟' => '電波鐘',
 '电码表' => '電碼表',
 '电冲' => '電衝',
+'电视台风' => '電視台風',
 '电表' => '電錶',
 '电钟' => '電鐘',
 '震栗' => '震慄',
 '霉气冲天' => '霉氣衝天',
+'沾化' => '霑化',
+'沾益' => '霑益',
 '雾里' => '霧裡',
 '露丑' => '露醜',
 '霁范' => '霽範',
+'灵昆' => '靈崑',
 '青山一发' => '青山一髮',
 '青霉' => '青黴',
 '非常准' => '非常準',
@@ -8721,7 +8798,6 @@ $zh2Hant = array(
 '面粉碎' => '面粉碎',
 '面粉红' => '面粉紅',
 '面食饭' => '面食飯',
-'面食面' => '面食麵',
 '鞋里' => '鞋裡',
 '鞣制' => '鞣製',
 '秋千' => '鞦韆',
@@ -8749,7 +8825,6 @@ $zh2Hant = array(
 '预报不准' => '預報不準',
 '预制' => '預製',
 '领袖欲' => '領袖慾',
-'头儿干' => '頭兒幹',
 '头里' => '頭裡',
 '头长发' => '頭長髮',
 '头发' => '頭髮',
@@ -8759,8 +8834,8 @@ $zh2Hant = array(
 '额我略历史' => '額我略歷史',
 '颜范' => '顏範',
 '颠干倒坤' => '顛乾倒坤',
-'顛顛仆仆' => '顛顛仆仆',
 '颠颠仆仆' => '顛顛仆仆',
+'顛顛仆仆' => '顛顛仆仆',
 '颤栗' => '顫慄',
 '显示表明' => '顯示表明',
 '显示表格' => '顯示表格',
@@ -8854,6 +8929,7 @@ $zh2Hant = array(
 '余子' => '餘子',
 '余存' => '餘存',
 '余孽' => '餘孽',
+'余干' => '餘干',
 '余年' => '餘年',
 '余式' => '餘式',
 '余弦' => '餘弦',
@@ -8876,6 +8952,7 @@ $zh2Hant = array(
 '余殃' => '餘殃',
 '余毒' => '餘毒',
 '余气' => '餘氣',
+'余江' => '餘江',
 '余波' => '餘波',
 '余温' => '餘溫',
 '余泽' => '餘澤',
@@ -8924,7 +9001,6 @@ $zh2Hant = array(
 '馄饨面' => '餛飩麵',
 '馆谷' => '館穀',
 '馆里' => '館裡',
-'餵驴' => '餵驢',
 '饥寒' => '饑寒',
 '饥民' => '饑民',
 '饥渴' => '饑渴',
@@ -8941,12 +9017,12 @@ $zh2Hant = array(
 '马干' => '馬乾',
 '馬占山' => '馬占山',
 '马斯垂克期' => '馬斯垂克期',
-'馬格里布' => '馬格里布',
 '马格里布' => '馬格里布',
+'馬格里布' => '馬格里布',
 '驻扎' => '駐紮',
 '骀荡' => '駘蕩',
-'騰格里' => '騰格里',
 '腾格里' => '騰格里',
+'騰格里' => '騰格里',
 '腾涌' => '騰湧',
 '腾冲' => '騰衝',
 '惊栗' => '驚慄',
@@ -8973,6 +9049,7 @@ $zh2Hant = array(
 '发乳' => '髮乳',
 '发光可鉴' => '髮光可鑑',
 '发匪' => '髮匪',
+'发及腰' => '髮及腰',
 '发型' => '髮型',
 '发夹' => '髮夾',
 '发妻' => '髮妻',
@@ -8983,6 +9060,7 @@ $zh2Hant = array(
 '发廊' => '髮廊',
 '发式' => '髮式',
 '发引千钧' => '髮引千鈞',
+'发披肩' => '髮披肩',
 '发指' => '髮指',
 '发卷' => '髮捲',
 '发根' => '髮根',
@@ -9111,6 +9189,7 @@ $zh2Hant = array(
 '斗犀台' => '鬥犀臺',
 '斗犬' => '鬥犬',
 '斗狠' => '鬥狠',
+'斗兽' => '鬥獸',
 '斗叠' => '鬥疊',
 '斗百草' => '鬥百草',
 '斗眼' => '鬥眼',
@@ -9119,13 +9198,13 @@ $zh2Hant = array(
 '斗而铸锥' => '鬥而鑄錐',
 '斗脚' => '鬥腳',
 '斗舰' => '鬥艦',
+'斗艳' => '鬥艷',
 '斗茶' => '鬥茶',
 '斗草' => '鬥草',
 '斗叶儿' => '鬥葉兒',
 '斗叶子' => '鬥葉子',
 '斗蟋蟀' => '鬥蟋蟀',
 '斗话' => '鬥話',
-'斗艳' => '鬥豔',
 '斗起' => '鬥起',
 '斗趣' => '鬥趣',
 '斗闲气' => '鬥閒氣',
@@ -9140,6 +9219,7 @@ $zh2Hant = array(
 '斗鸭' => '鬥鴨',
 '斗鹌鹑' => '鬥鵪鶉',
 '斗丽' => '鬥麗',
+'斗龙' => '鬥龍',
 '闹表' => '鬧錶',
 '闹钟' => '鬧鐘',
 '哄动' => '鬨動',
@@ -9189,13 +9269,14 @@ $zh2Hant = array(
 '鬼谷子' => '鬼谷子',
 '魂牵梦系' => '魂牽夢繫',
 '魏征' => '魏徵',
-'魔杰座' => '魔杰座',
 '魔表' => '魔錶',
 '鱼干' => '魚乾',
 '鱼松' => '魚鬆',
 '鲜于枢' => '鮮于樞',
 '鮮于樞' => '鮮于樞',
 '鲸须' => '鯨鬚',
+'鳥栖' => '鳥栖',
+'鸟栖市' => '鳥栖市',
 '鳳凰于飛' => '鳳凰于飛',
 '凤梨干' => '鳳梨乾',
 '鸣钟' => '鳴鐘',
@@ -9206,6 +9287,7 @@ $zh2Hant = array(
 '雕悍' => '鵰悍',
 '雕翎' => '鵰翎',
 '雕鹗' => '鵰鶚',
+'鹤峰县' => '鶴峯縣',
 '鹤吊' => '鶴弔',
 '鹤发' => '鶴髮',
 '鸾鉴' => '鸞鑑',
@@ -9242,14 +9324,16 @@ $zh2Hant = array(
 '盐余' => '鹽餘',
 '鹿場里' => '鹿場里',
 '丽于' => '麗於',
+'麟游' => '麟遊',
+'曲酒' => '麯酒',
 '曲尘' => '麴塵',
 '曲櫱' => '麴櫱',
 '曲秀才' => '麴秀才',
 '曲车' => '麴車',
 '曲道士' => '麴道士',
 '曲钱' => '麴錢',
-'麹霉' => '麴黴',
 '曲霉' => '麴黴',
+'麹霉' => '麴黴',
 '面人儿' => '麵人兒',
 '面价' => '麵價',
 '面包' => '麵包',
@@ -9280,7 +9364,11 @@ $zh2Hant = array(
 '麻将席' => '麻將蓆',
 '麻酱面' => '麻醬麵',
 '黄干黑瘦' => '黃乾黑瘦',
+'黄岩区' => '黃巖區',
+'黄岩县' => '黃巖縣',
 '黄历' => '黃曆',
+'黄杰' => '黃杰',
+'黃杰' => '黃杰',
 '黄历史' => '黃歷史',
 '黃詩杰' => '黃詩杰',
 '黄诗杰' => '黃詩杰',
@@ -9294,11 +9382,14 @@ $zh2Hant = array(
 '黎吉雲' => '黎吉雲',
 '黎吉云' => '黎吉雲',
 '黑奴吁天录' => '黑奴籲天錄',
+'黑干将' => '黑幹將',
+'黑长发' => '黑長髮',
 '黑发' => '黑髮',
 '点札' => '點劄',
 '点半钟' => '點半鐘',
 '点多钟' => '點多鐘',
 '点里' => '點裡',
+'点赞' => '點讚',
 '点里程' => '點里程',
 '点钟' => '點鐘',
 '霉毒' => '黴毒',
@@ -9308,6 +9399,7 @@ $zh2Hant = array(
 '霉黧' => '黴黧',
 '鼓里' => '鼓裡',
 '鼓噪' => '鼓譟',
+'咚咚鼓' => '鼕鼕鼓',
 '冬冬鼓' => '鼕鼕鼓',
 '鼠曲草' => '鼠麴草',
 '鼻梁儿' => '鼻梁兒',
@@ -9318,6 +9410,7 @@ $zh2Hant = array(
 '齿落发白' => '齒落髮白',
 '齿发' => '齒髮',
 '出儿' => '齣兒',
+'龙岩' => '龍巖',
 '龙卷' => '龍捲',
 '龙眼干' => '龍眼乾',
 '龙须' => '龍鬚',
@@ -9325,13 +9418,13 @@ $zh2Hant = array(
 '龙斗虎伤' => '龍鬥虎傷',
 '龜山庄' => '龜山庄',
 '龟鉴' => '龜鑑',
+',个中' => ',箇中',
 );
 
 $zh2Hans = array(
 '㑯' => '㑔',
 '㑳' => '㑇',
 '㑶' => '㐹',
-'㑺' => '俊',
 '㒓' => '𠉂',
 '㒺' => '罔',
 '㓂' => '寇',
@@ -9359,10 +9452,8 @@ $zh2Hans = array(
 '㢝' => '𢋈',
 '㤙' => '恩',
 '㥦' => '惬',
-'㥫' => '惇',
 '㥮' => '㤘',
 '㦎' => '𢛯',
-'㧱' => '拿',
 '㨗' => '捷',
 '㨪' => '晃',
 '㨿' => '据',
@@ -9489,7 +9580,6 @@ $zh2Hans = array(
 '來' => '来',
 '侖' => '仑',
 '侶' => '侣',
-'侷' => '局',
 '俁' => '俣',
 '係' => '系',
 '俔' => '伣',
@@ -9766,7 +9856,6 @@ $zh2Hans = array(
 '執' => '执',
 '堅' => '坚',
 '堊' => '垩',
-'堖' => '垴',
 '堝' => '埚',
 '堯' => '尧',
 '報' => '报',
@@ -9776,7 +9865,6 @@ $zh2Hans = array(
 '塏' => '垲',
 '塒' => '埘',
 '塗' => '涂',
-'塚' => '冢',
 '塟' => '葬',
 '塢' => '坞',
 '塤' => '埙',
@@ -9933,7 +10021,6 @@ $zh2Hans = array(
 '嶧' => '峄',
 '嶨' => '峃',
 '嶮' => '崄',
-'嶴' => '岙',
 '嶸' => '嵘',
 '嶺' => '岭',
 '嶼' => '屿',
@@ -10075,7 +10162,6 @@ $zh2Hans = array(
 '應' => '应',
 '懌' => '怿',
 '懍' => '懔',
-'懞' => '蒙',
 '懟' => '怼',
 '懣' => '懑',
 '懨' => '恹',
@@ -10281,8 +10367,6 @@ $zh2Hans = array(
 '棧' => '栈',
 '棲' => '栖',
 '棶' => '梾',
-'椀' => '碗',
-'椉' => '乘',
 '椏' => '桠',
 '椗' => '碇',
 '椲' => '㭏',
@@ -10446,7 +10530,6 @@ $zh2Hans = array(
 '湞' => '浈',
 '湧' => '涌',
 '湯' => '汤',
-'湻' => '淳',
 '湼' => '涅',
 '溈' => '沩',
 '準' => '准',
@@ -10794,7 +10877,6 @@ $zh2Hans = array(
 '矚' => '瞩',
 '矯' => '矫',
 '砲' => '炮',
-'硃' => '朱',
 '硜' => '硁',
 '硤' => '硖',
 '硨' => '砗',
@@ -11426,7 +11508,6 @@ $zh2Hans = array(
 '衊' => '蔑',
 '術' => '术',
 '衕' => '同',
-'衖' => '弄',
 '衚' => '胡',
 '衛' => '卫',
 '衝' => '冲',
@@ -11489,7 +11570,6 @@ $zh2Hans = array(
 '覽' => '览',
 '覿' => '觌',
 '觀' => '观',
-'觔' => '斤',
 '觝' => '抵',
 '觴' => '觞',
 '觶' => '觯',
@@ -11920,7 +12000,6 @@ $zh2Hans = array(
 '適' => '适',
 '遯' => '遁',
 '遲' => '迟',
-'遶' => '绕',
 '遷' => '迁',
 '選' => '选',
 '遺' => '遗',
@@ -12380,7 +12459,6 @@ $zh2Hans = array(
 '靭' => '韧',
 '靱' => '韧',
 '鞀' => '鼗',
-'鞌' => '鞍',
 '鞏' => '巩',
 '鞝' => '绱',
 '鞦' => '秋',
@@ -12528,6 +12606,7 @@ $zh2Hans = array(
 '餭' => '𫗮',
 '餱' => '糇',
 '餳' => '饧',
+'餵' => '喂',
 '餶' => '馉',
 '餷' => '馇',
 '餸' => '𩠌',
@@ -12582,7 +12661,6 @@ $zh2Hans = array(
 '駧' => '𩧲',
 '駩' => '𩧴',
 '駭' => '骇',
-'駮' => '驳',
 '駰' => '骃',
 '駱' => '骆',
 '駶' => '𩧺',
@@ -12621,7 +12699,7 @@ $zh2Hans = array(
 '驁' => '骜',
 '驂' => '骖',
 '驃' => '骠',
-'驄' => '𩨂',
+'驄' => '',
 '驅' => '驱',
 '驊' => '骅',
 '驋' => '𩧯',
@@ -12649,10 +12727,8 @@ $zh2Hans = array(
 '體' => '体',
 '髕' => '髌',
 '髖' => '髋',
-'髣' => '仿',
 '髥' => '髯',
 '髮' => '发',
-'髴' => '佛',
 '鬀' => '剃',
 '鬆' => '松',
 '鬉' => '鬃',
@@ -12665,7 +12741,6 @@ $zh2Hans = array(
 '鬨' => '哄',
 '鬩' => '阋',
 '鬪' => '斗',
-'鬭' => '斗',
 '鬮' => '阄',
 '鬰' => '郁',
 '鬱' => '郁',
@@ -12944,7 +13019,7 @@ $zh2Hans = array(
 '鼇' => '鳌',
 '鼈' => '鳖',
 '鼉' => '鼍',
-'é¼\95' => 'å\86¬',
+'é¼\95' => 'å\92\9a',
 '鼴' => '鼹',
 '齊' => '齐',
 '齋' => '斋',
@@ -12977,43 +13052,30 @@ $zh2Hans = array(
 '龜' => '龟',
 '龭' => '𩨎',
 '龯' => '𨱆',
-'𠇮' => '命',
-'𠌂' => '伞',
 '𠌥' => '𠆿',
 '𠏢' => '𠉗',
 '𠕂' => '再',
 '𠕅' => '再',
-'𠖇' => '冥',
 '𠞆' => '𠛆',
 '𠞰' => '剿',
 '𠠎' => '𠚳',
-'𠪾' => '历',
-'𠴟' => '咩',
-'𠻳' => '嗽',
 '𡄔' => '𠴢',
 '𡄣' => '𠵸',
 '𡅏' => '𠲥',
-'𡐨' => '野',
 '𡑭' => '𡋗',
 '𡓾' => '𡋀',
 '𡚁' => '弊',
 '𡞵' => '㛟',
 '𡠹' => '㛿',
 '𡢃' => '㛠',
-'𡨘' => '冤',
 '𡨥' => '寇',
-'𡬶' => '寻',
 '𡮉' => '𡭜',
 '𡮣' => '𡭬',
 '𡻕' => '岁',
 '𡾱' => '㟜',
 '𢣚' => '𢘝',
 '𢣭' => '𢘞',
-'𢬸' => '括',
-'𢭏' => '捣',
-'𢮥' => '操',
 '𢶫' => '𢫞',
-'𢷬' => '捣',
 '𢷮' => '𢫊',
 '𢹿' => '𢬦',
 '𣙎' => '㭣',
@@ -13030,20 +13092,15 @@ $zh2Hans = array(
 '𤨏' => '琐',
 '𤪺' => '㻘',
 '𤫩' => '㻏',
-'𤰜' => '亩',
 '𤱈' => '亩',
-'𤱊' => '留',
 '𤳸' => '𤳄',
 '𤸫' => '𤶧',
 '𤺥' => '瘩',
-'𥄨' => '瞅',
 '𥌃' => '𥅘',
 '𥕥' => '𥐰',
 '𥖅' => '𥐯',
 '𥢢' => '䅪',
-'𥦗' => '窗',
 '𥨐' => '𥧂',
-'𥲻' => '纂',
 '𥵃' => '𥱔',
 '𥵊' => '𥭉',
 '𥸠' => '𥮋',
@@ -13051,16 +13108,12 @@ $zh2Hans = array(
 '𥽖' => '𥺇',
 '𥿊' => '𦈈',
 '𦂅' => '𦈒',
-'𦂳' => '紧',
-'𦃂' => '紧',
 '𦃄' => '𦈗',
-'𦉆' => '碴',
 '𦊱' => '挂',
 '𦍑' => '羌',
 '𦕈' => '眇',
 '𦢈' => '𣍨',
 '𦣎' => '𦟗',
-'𦪙' => '䑽',
 '𦪽' => '𦨩',
 '𦵏' => '葬',
 '𧔥' => '𧒭',
@@ -13182,22 +13235,21 @@ $zh2Hans = array(
 '』' => '’',
 '「' => '“',
 '「' => '“',
-'」' => '”',
 '」' => '”',
+'」' => '”',
 '。陞' => '。升',
 '《易乾' => '《易乾',
 '一釐' => '一厘',
-'一口鍾' => '一口钟',
-'一鍾' => '一钟',
 '上昇' => '上升',
+'不穀' => '不穀',
 '專著' => '专著',
-'世界鍾' => '世界钟',
-'喪鍾' => '丧钟',
 '乾一坛' => '乾一坛',
 '乾一壇' => '乾一坛',
 '乾一组' => '乾一组',
 '乾一組' => '乾一组',
 '乾上乾下' => '乾上乾下',
+'乾東' => '乾东',
+'乾东' => '乾东',
 '乾為天' => '乾为天',
 '乾為陽' => '乾为阳',
 '乾九' => '乾九',
@@ -13214,20 +13266,20 @@ $zh2Hans = array(
 '乾興' => '乾兴',
 '乾岡' => '乾冈',
 '乾冈' => '乾冈',
-'乾刘' => '乾刘',
 '乾劉' => '乾刘',
-'ä¹¾å\88\9a' => 'ä¹¾å\88\9a',
+'ä¹¾å\88\98' => 'ä¹¾å\88\98',
 '乾剛' => '乾刚',
+'乾刚' => '乾刚',
 '乾務' => '乾务',
 '乾务' => '乾务',
 '乾化' => '乾化',
 '乾卦' => '乾卦',
-'乾县' => '乾县',
 '乾縣' => '乾县',
+'乾县' => '乾县',
 '乾台' => '乾台',
 '乾吉' => '乾吉',
-'乾啟' => '乾启',
 '乾启' => '乾启',
+'乾啟' => '乾启',
 '乾命' => '乾命',
 '乾和' => '乾和',
 '乾嘉' => '乾嘉',
@@ -13239,8 +13291,8 @@ $zh2Hans = array(
 '乾天也' => '乾天也',
 '乾始' => '乾始',
 '乾姓' => '乾姓',
-'乾宁' => '乾宁',
 '乾寧' => '乾宁',
+'乾宁' => '乾宁',
 '乾宅' => '乾宅',
 '乾宇' => '乾宇',
 '乾安' => '乾安',
@@ -13252,8 +13304,8 @@ $zh2Hans = array(
 '乾巛' => '乾巛',
 '乾州' => '乾州',
 '乾式' => '乾式',
-'乾錄' => '乾录',
 '乾录' => '乾录',
+'乾錄' => '乾录',
 '乾律' => '乾律',
 '乾德' => '乾德',
 '乾心' => '乾心',
@@ -13266,17 +13318,17 @@ $zh2Hans = array(
 '乾旦' => '乾旦',
 '乾明' => '乾明',
 '乾昧' => '乾昧',
-'乾暉' => '乾晖',
 '乾晖' => '乾晖',
+'乾暉' => '乾晖',
 '乾景' => '乾景',
 '乾晷' => '乾晷',
 '乾曜' => '乾曜',
-'乾構' => '乾构',
 '乾构' => '乾构',
+'乾構' => '乾构',
 '乾枢' => '乾枢',
 '乾樞' => '乾枢',
-'乾棟' => '乾栋',
 '乾栋' => '乾栋',
+'乾棟' => '乾栋',
 '乾步' => '乾步',
 '乾氏' => '乾氏',
 '乾沓和' => '乾沓和',
@@ -13288,6 +13340,7 @@ $zh2Hans = array(
 '乾潭' => '乾潭',
 '乾灵' => '乾灵',
 '乾靈' => '乾灵',
+'乾生元' => '乾生元',
 '乾男' => '乾男',
 '乾皋' => '乾皋',
 '乾盛世' => '乾盛世',
@@ -13295,22 +13348,22 @@ $zh2Hans = array(
 '乾祐' => '乾祐',
 '乾神' => '乾神',
 '乾穹' => '乾穹',
-'乾竇' => '乾窦',
 '乾窦' => '乾窦',
+'乾竇' => '乾窦',
 '乾竺' => '乾竺',
 '乾笃' => '乾笃',
 '乾篤' => '乾笃',
 '乾符' => '乾符',
 '乾策' => '乾策',
 '乾精' => '乾精',
-'乾紅' => '乾红',
 '乾红' => '乾红',
+'乾紅' => '乾红',
 '乾綱' => '乾纲',
 '乾纲' => '乾纲',
 '乾纽' => '乾纽',
 '乾紐' => '乾纽',
-'乾络' => '乾络',
 '乾絡' => '乾络',
+'乾络' => '乾络',
 '乾統' => '乾统',
 '乾统' => '乾统',
 '乾维' => '乾维',
@@ -13318,8 +13371,8 @@ $zh2Hans = array(
 '乾罗' => '乾罗',
 '乾羅' => '乾罗',
 '乾花' => '乾花',
-'乾荫' => '乾荫',
 '乾蔭' => '乾荫',
+'乾荫' => '乾荫',
 '乾行' => '乾行',
 '乾衡' => '乾衡',
 '乾西' => '乾西',
@@ -13327,23 +13380,23 @@ $zh2Hans = array(
 '乾象' => '乾象',
 '乾象歷' => '乾象历',
 '乾象历' => '乾象历',
-'乾貞' => '乾贞',
 '乾贞' => '乾贞',
+'乾貞' => '乾贞',
 '乾贵士' => '乾贵士',
 '乾貴士' => '乾贵士',
-'乾貺' => '乾贶',
 '乾贶' => '乾贶',
+'乾貺' => '乾贶',
 '乾車' => '乾车',
 '乾车' => '乾车',
-'乾轴' => '乾轴',
 '乾軸' => '乾轴',
+'乾轴' => '乾轴',
 '乾通' => '乾通',
 '乾造' => '乾造',
 '乾道' => '乾道',
 '乾鉴' => '乾鉴',
 '乾鑒' => '乾鉴',
-'乾鈞' => '乾钧',
 '乾钧' => '乾钧',
+'乾鈞' => '乾钧',
 '乾闥' => '乾闼',
 '乾闼' => '乾闼',
 '乾陀' => '乾陀',
@@ -13352,8 +13405,8 @@ $zh2Hans = array(
 '乾音' => '乾音',
 '乾顧' => '乾顾',
 '乾顾' => '乾顾',
-'乾風' => '乾风',
 '乾风' => '乾风',
+'乾風' => '乾风',
 '乾首' => '乾首',
 '乾马' => '乾马',
 '乾馬' => '乾马',
@@ -13361,19 +13414,21 @@ $zh2Hans = array(
 '乾鹄' => '乾鹄',
 '乾鵲' => '乾鹊',
 '乾鹊' => '乾鹊',
-'乾龙' => '乾龙',
 '乾龍' => '乾龙',
+'乾龙' => '乾龙',
 '乾,健也' => '乾,健也',
 '乾,天也' => '乾,天也',
 '五箇山' => '五箇山',
+'什么' => '什么',
 '仇讎' => '仇雠',
 '以微知著' => '以微知著',
-'以莛叩鍾' => '以莛叩钟',
 '仰屋著書' => '仰屋著书',
 '彷彿' => '仿佛',
 '夥計' => '伙计',
 '佛頭著糞' => '佛头著粪',
 '偵蒐' => '侦搜',
+'倖一郎' => '倖一郎',
+'倖田' => '倖田',
 '候覆' => '候复',
 '藉助' => '借助',
 '藉口' => '借口',
@@ -13384,19 +13439,18 @@ $zh2Hans = array(
 '藉由' => '借由',
 '藉端' => '借端',
 '藉詞' => '借词',
+'傒倖' => '傒倖',
 '先名後姓' => '先名后姓',
+'兒寬' => '兒宽',
 '六么' => '六幺',
 '蘭質薰心' => '兰质薰心',
 '內聯陞' => '内联升',
 '憑藉' => '凭借',
-'分鍾' => '分钟',
 '初昇' => '初升',
 '利欲薰心' => '利欲薰心',
-'刻鍾' => '刻钟',
 '剋了' => '剋了',
 '剋架' => '剋架',
 '剖釐' => '剖厘',
-'千鍾' => '千钟',
 '陞為' => '升为',
 '陞了' => '升了',
 '昇仙' => '升仙',
@@ -13412,7 +13466,6 @@ $zh2Hans = array(
 '昇降' => '升降',
 '卓著' => '卓著',
 '博和託' => '博和讬',
-'卷舌' => '卷舌',
 '歷陞' => '历升',
 '釐改' => '厘改',
 '釐整' => '厘整',
@@ -13421,14 +13474,11 @@ $zh2Hans = array(
 '釐清' => '厘清',
 '釐訂' => '厘订',
 '釐革' => '厘革',
-'原子鍾' => '原子钟',
 '原著' => '原著',
 '又陞' => '又升',
 '反反覆覆' => '反反复复',
 '反覆' => '反复',
-'古鍾' => '古钟',
 '可穿著' => '可穿著',
-'台鍾' => '台钟',
 '吃衣著飯' => '吃衣著饭',
 '合著' => '合著',
 '同陞和' => '同升和',
@@ -13439,16 +13489,13 @@ $zh2Hans = array(
 '回覆' => '回复',
 '土著' => '土著',
 '坤乾' => '坤乾',
-'塔鍾' => '塔钟',
 '墨瀋' => '墨渖',
-'壁鍾' => '壁钟',
 '覆查' => '复查',
 '覆核' => '复核',
 '覆检' => '复检',
 '復甦' => '复苏',
-'多鍾' => '多钟',
+'多么' => '多么',
 '大麴' => '大曲',
-'大鍾' => '大钟',
 '天道為乾' => '天道为乾',
 '天道为乾' => '天道为乾',
 '奧區' => '奧区',
@@ -13456,9 +13503,8 @@ $zh2Hans = array(
 '姓么' => '姓幺',
 '子餘' => '子馀',
 '字乾生' => '字乾生',
-'孫乾' => '孙乾',
 '孙乾' => '孙乾',
-'å®\8bé\8d¾å\9c\8b' => 'å®\8bé\92\9få\9b½',
+'å­«ä¹¾' => 'å­\99ä¹¾',
 '宏碁' => '宏碁',
 '官陞' => '官升',
 '將軍抽俥' => '将军抽俥',
@@ -13466,31 +13512,37 @@ $zh2Hans = array(
 '爾冬陞' => '尔冬升',
 '尼乾陀' => '尼乾陀',
 '跼促' => '局促',
+'侷促' => '局促',
 '跼限' => '局限',
-'山崩鍾應' => '山崩钟应',
-'崔秀鍾' => '崔秀钟',
+'侷限' => '局限',
+'山崎闇齋' => '山崎闇斋',
+'岳託' => '岳讬',
 '巨著' => '巨著',
 '乾乾淨淨' => '干干净净',
 '乾乾脆脆' => '干干脆脆',
 '乾泉水' => '干泉水',
 '年陞' => '年升',
+'么九' => '幺九',
 '么二三' => '幺二三',
 '么元' => '幺元',
 '么鳳' => '幺凤',
 '么半' => '幺半',
 '么半群' => '幺半群',
-'么廝' => '幺厮',
 '幺厮' => '幺厮',
+'么廝' => '幺厮',
 '么叔' => '幺叔',
+'么女' => '幺女',
 '么媽' => '幺妈',
 '么妹' => '幺妹',
 '么姓' => '幺姓',
 '么姨' => '幺姨',
 '么娘' => '幺娘',
-'幺孃' => '幺娘',
 '么孃' => '幺娘',
+'幺孃' => '幺娘',
+'么子' => '幺子',
 '么小' => '幺小',
 '么弟' => '幺弟',
+'么正' => '幺正',
 '么氏' => '幺氏',
 '么爸' => '幺爸',
 '么爹' => '幺爹',
@@ -13502,18 +13554,16 @@ $zh2Hans = array(
 '么麼' => '幺麽',
 '么麽小丑' => '幺麽小丑',
 '慶餘' => '庆馀',
-'座鍾' => '座钟',
 '康乾' => '康乾',
 '張法乾' => '张法乾',
 '张法乾' => '张法乾',
-'張鍾英' => '张钟英',
 '彰明較著' => '彰明较著',
 '待覆' => '待复',
 '後姓' => '後姓',
 '慫慂' => '怂恿',
+'怎么' => '怎么',
 '恩威並著' => '恩威并著',
 '噁心' => '恶心',
-'懸鍾' => '悬钟',
 '情蒐' => '情搜',
 '情鍾' => '情钟',
 '惏悷' => '惏悷',
@@ -13526,6 +13576,7 @@ $zh2Hans = array(
 '扞格' => '扞格',
 '執著' => '执著',
 '批覆' => '批复',
+'承乾' => '承乾',
 '拉鍊' => '拉链',
 '拙著' => '拙著',
 '拚命' => '拚命',
@@ -13533,9 +13584,7 @@ $zh2Hans = array(
 '拚死' => '拚死',
 '拾瀋' => '拾渖',
 '拿破崙' => '拿破仑',
-'掛鍾' => '挂钟',
 '挨剋' => '挨剋',
-'掩耳盜鍾' => '掩耳盗钟',
 '提昇' => '提升',
 '蒐錄' => '搜录',
 '蒐索' => '搜索',
@@ -13544,28 +13593,26 @@ $zh2Hans = array(
 '蒐證' => '搜证',
 '蒐購' => '搜购',
 '蒐輯' => '搜辑',
-'蒐采' => '搜采',
 '蒐採' => '搜采',
+'蒐采' => '搜采',
 '蒐集' => '搜集',
 '搥打' => '搥打',
 '搥胸頓足' => '搥胸顿足',
-'擺鍾' => '摆钟',
-'撞鍾' => '撞钟',
 '撰著' => '撰著',
 '效果顯著' => '效果显著',
-'敲鍾' => '敲钟',
 '文徵明' => '文徵明',
+'觔斗' => '斤斗',
 '新著' => '新著',
 '於世成' => '於世成',
-'於之瑩' => '於之莹',
 '於之莹' => '於之莹',
+'於之瑩' => '於之莹',
 '於乎' => '於乎',
 '於乙于同' => '於乙于同',
 '於乙宇同' => '於乙宇同',
 '於于同' => '於于同',
 '於哲' => '於哲',
-'於夫罗' => '於夫罗',
 '於夫羅' => '於夫罗',
+'於夫罗' => '於夫罗',
 '於姓' => '於姓',
 '於宇同' => '於宇同',
 '於崇文' => '於崇文',
@@ -13575,7 +13622,7 @@ $zh2Hans = array(
 '於梨華' => '於梨华',
 '於梨华' => '於梨华',
 '於氏' => '於氏',
-'於潜县' => '於潜县',
+'於潜' => '於潜',
 '於潛縣' => '於潜县',
 '於祥玉' => '於祥玉',
 '於菟' => '於菟',
@@ -13583,7 +13630,6 @@ $zh2Hans = array(
 '於除鞬' => '於除鞬',
 '旋乾轉坤' => '旋乾转坤',
 '旋乾转坤' => '旋乾转坤',
-'時鍾' => '时钟',
 '曠若發矇' => '旷若发矇',
 '崑崙' => '昆仑',
 '崑劇' => '昆剧',
@@ -13593,10 +13639,10 @@ $zh2Hans = array(
 '崑蘇' => '昆苏',
 '崑調' => '昆调',
 '易·乾' => '易·乾',
-'易经·乾' => '易经·乾',
 '易經·乾' => '易经·乾',
-'易经乾' => '易经乾',
+'易经·乾' => '易经·乾',
 '易經乾' => '易经乾',
+'易经乾' => '易经乾',
 '昭著' => '昭著',
 '顯著' => '显著',
 '顯著地' => '显著地',
@@ -13606,17 +13652,17 @@ $zh2Hans = array(
 '顯著效果' => '显著效果',
 '顯著特點' => '显著特点',
 '晉陞' => '晋升',
-'晚鍾' => '晚钟',
-'晨鍾' => '晨钟',
 '暗闇' => '暗闇',
 '麴黴' => '曲霉',
-'曾運乾' => '曾运乾',
 '曾运乾' => '曾运乾',
+'曾運乾' => '曾运乾',
 '月陞' => '月升',
 '朝乾夕惕' => '朝乾夕惕',
-'朝鍾暮鼓' => '朝钟暮鼓',
 '朱有燉' => '朱有燉',
 '朱淛' => '朱淛',
+'硃砂' => '朱砂',
+'硃紅' => '朱红',
+'硃色' => '朱色',
 '朴於宇同' => '朴於宇同',
 '李乾德' => '李乾德',
 '李乾順' => '李乾顺',
@@ -13624,15 +13670,11 @@ $zh2Hans = array(
 '李澤鉅' => '李泽钜',
 '李祕' => '李祕',
 '李譔' => '李譔',
-'李鍾原' => '李钟原',
-'林鍾' => '林钟',
-'柳诒徵' => '柳诒徵',
 '柳詒徵' => '柳诒徵',
+'柳诒徵' => '柳诒徵',
 '校讎' => '校雠',
 '楈枒' => '楈枒',
 '樊於期' => '樊於期',
-'橡椀' => '橡椀',
-'此鍾' => '此钟',
 '殘瀋' => '残渖',
 '慇懃' => '殷勤',
 '慇勤' => '殷勤',
@@ -13647,9 +13689,7 @@ $zh2Hans = array(
 '沈默' => '沉默',
 '氾濫' => '泛滥',
 '洗鍊' => '洗练',
-'洪鍾' => '洪钟',
 '瀋液' => '渖液',
-'點鍾' => '点钟',
 '薰習' => '熏习',
 '薰心' => '熏心',
 '薰沐' => '熏沐',
@@ -13660,12 +13700,8 @@ $zh2Hans = array(
 '王道乾' => '王道乾',
 '王餘魚' => '王馀鱼',
 '甚夥' => '甚夥',
-'生物鍾' => '生物钟',
-'電鍾' => '电钟',
-'男為乾' => '男为乾',
 '男为乾' => '男为乾',
-'男爲乾' => '男为乾',
-'男性爲乾' => '男性为乾',
+'男為乾' => '男为乾',
 '男性為乾' => '男性为乾',
 '男性为乾' => '男性为乾',
 '療效顯著' => '疗效显著',
@@ -13677,19 +13713,19 @@ $zh2Hans = array(
 '瞭臺' => '瞭台',
 '瞭台' => '瞭台',
 '瞭望' => '瞭望',
-'矇眬' => '矇眬',
 '矇矓' => '矇眬',
+'矇眬' => '矇眬',
 '石碁' => '石碁',
 '石碁鎮' => '石碁镇',
-'石英鍾' => '石英钟',
-'石鍾乳' => '石钟乳',
+'碩託' => '硕讬',
 '鹼菜' => '硷菜',
-'碁聖' => '碁圣',
 '碁圣' => '碁圣',
+'碁聖' => '碁圣',
 '碁所' => '碁所',
 '祕宜' => '祕宜',
-'ç§\92é\8d¾' => 'ç§\92é\92\9f',
+'ç©\80æ\97¦' => 'ç©\80æ\97¦',
 '穀梁' => '穀梁',
+'穀水' => '穀水',
 '穿著者' => '穿着者',
 '竹昇' => '竹升',
 '答覆' => '答复',
@@ -13697,15 +13733,16 @@ $zh2Hans = array(
 '米瀋' => '米渖',
 '餬口' => '糊口',
 '繙㠾' => '繙㠾',
+'遶境' => '绕境',
 '線國安' => '缐国安',
 '線姓' => '缐姓',
 '編著' => '编著',
-'編鍾' => '编钟',
+'老么' => '老幺',
 '肉乾乾' => '肉干干',
 '肘手鍊足' => '肘手链足',
 '甦醒' => '苏醒',
-'苧烯' => '苧烯',
 '薴烯' => '苧烯',
+'苧烯' => '苧烯',
 '蘋果' => '苹果',
 '荠苧' => '荠苧',
 '榮陞' => '荣升',
@@ -13723,14 +13760,18 @@ $zh2Hans = array(
 '著者' => '著者',
 '著身' => '著身',
 '著述' => '著述',
-'覆蓋' => '覆蓋',
+'蔡絛' => '蔡絛',
+'行餘' => '行馀',
+'覆蓋' => '覆盖',
 '見微知著' => '见微知著',
 '見著' => '见著',
 '視微知著' => '视微知著',
 '言幾析理' => '言幾析理',
 '諲譔' => '諲譔',
-'警鍾' => '警钟',
 '譩譆' => '譩譆',
+'託庸' => '讬庸',
+'託恩多' => '讬恩多',
+'託麻' => '讬麻',
 '論著' => '论著',
 '譯著' => '译著',
 '謝肇淛' => '谢肇淛',
@@ -13739,62 +13780,30 @@ $zh2Hans = array(
 '較著' => '较著',
 '近角聪信' => '近角聪信',
 '这么' => '这么',
-'進化鍾' => '进化钟',
 '造麴' => '造曲',
 '遺著' => '遗著',
+'那么' => '那么',
 '那麽' => '那麽',
 '郭子乾' => '郭子乾',
-'郭行餘' => '郭行馀',
 '酒麴' => '酒曲',
 '醉瀋' => '醉渖',
 '醯壶' => '醯壶',
 '醯壺' => '醯壶',
-'醯酱' => '醯酱',
 '醯醬' => '醯酱',
+'醯酱' => '醯酱',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
-'醯鸡' => '醯鸡',
 '醯雞' => '醯鸡',
+'醯鸡' => '醯鸡',
 '重覆' => '重复',
-'金尚鍾' => '金尚钟',
-'金民鍾' => '金民钟',
-'金鍾' => '金钟',
 '金鍊' => '金链',
-'鍾麗緹' => '钟丽缇',
-'鍾乳石' => '钟乳石',
-'鍾儀奏楚' => '钟仪奏楚',
-'鍾關' => '钟关',
-'鍾聲' => '钟声',
-'鍾頭' => '钟头',
-'鍾山' => '钟山',
-'鍾差' => '钟差',
-'鍾座' => '钟座',
 '鍾情' => '钟情',
 '鍾意' => '钟意',
-'鍾慧冰' => '钟慧冰',
-'鍾擺' => '钟摆',
-'鍾架' => '钟架',
-'鍾楚紅' => '钟楚红',
-'鍾樓' => '钟楼',
-'鍾漢良' => '钟汉良',
-'鍾汶' => '钟汶',
-'鍾淑慧' => '钟淑慧',
 '鍾靈' => '钟灵',
-'鍾點' => '钟点',
 '鍾愛' => '钟爱',
-'鍾琴' => '钟琴',
-'鍾相' => '钟相',
-'鍾祥' => '钟祥',
-'鍾離' => '钟离',
-'鍾表' => '钟表',
-'鍾鎮濤' => '钟镇涛',
-'鍾面' => '钟面',
-'鍾馗' => '钟馗',
-'鍾鳴漏盡' => '钟鸣漏尽',
-'鍾鳴鼎食' => '钟鸣鼎食',
-'鍾鼓' => '钟鼓',
 '鐵鍊' => '铁链',
 '鉸鍊' => '铰链',
+'銀硃' => '银朱',
 '銀鍊' => '银链',
 '鍊子' => '链子',
 '鍊條' => '链条',
@@ -13802,22 +13811,21 @@ $zh2Hans = array(
 '鍊鎖' => '链锁',
 '鍊錘' => '链锤',
 '鎖鍊' => '锁链',
+'闇公' => '闇公',
 '閻懷禮' => '闫怀礼',
-'鬧鍾' => '闹钟',
-'陽為乾' => '阳为乾',
 '阳为乾' => '阳为乾',
-'é\99½ç\88²乾' => '阳为乾',
+'é\99½ç\82º乾' => '阳为乾',
 '阿部正瞭' => '阿部正瞭',
 '陆徵祥' => '陆徵祥',
 '陸徵祥' => '陆徵祥',
-'陈乾生' => '陈乾生',
 '陳乾生' => '陈乾生',
-'陈元扞' => '陈元扞',
+'陈乾生' => '陈乾生',
 '陳元扞' => '陈元扞',
+'陈元扞' => '陈元扞',
 '陈公乾生' => '陈公乾生',
 '陳公乾生' => '陈公乾生',
-'陳遇乾' => '陈遇乾',
 '陈遇乾' => '陈遇乾',
+'陳遇乾' => '陈遇乾',
 '陳堵' => '陳堵',
 '陳禕' => '陳禕',
 '雍乾' => '雍乾',
@@ -13825,28 +13833,25 @@ $zh2Hans = array(
 '讎定' => '雠定',
 '讎校' => '雠校',
 '讎問' => '雠问',
-'音聲如鍾' => '音声如钟',
 '項鍊' => '项链',
 '飛昇' => '飞升',
 '飭令' => '飭令',
-'é¤\98å¹´ç\84¡å¤\9a' => 'é¦\80å¹´æ\97 å¤\9a',
+'飽è¨\97' => '饱讬',
 '餘慶' => '馀庆',
 '餘瀋' => '馀渖',
-'馬德鍾' => '马德钟',
-'高昇' => '高升',
+'馬鞌' => '马鞍',
 '高陞' => '高升',
+'高昇' => '高升',
 '鬱姓' => '鬱姓',
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
-'鳴鍾' => '鸣钟',
 '麽氏' => '麽氏',
 '麽麽' => '麽麽',
 '麼麼' => '麽麽',
 '黃麴毒素' => '黄曲毒素',
-'黄润乾' => '黄润乾',
 '黃潤乾' => '黄润乾',
-'é»\83é\8d¾' => 'é»\84é\92\9f',
+'é»\84润乾' => 'é»\84润乾',
 '龍鍾' => '龙钟',
 ',陞' => ',升',
 );
@@ -13870,22 +13875,23 @@ $zh2TW = array(
 '丙肝' => 'C肝',
 'IP地址' => 'IP位址',
 '乔戈里峰' => 'K2',
-'·威爾士' => '·威爾士',
 '·威尔士' => '·威爾士',
+'·威爾士' => '·威爾士',
 '一杆' => '一桿',
 '七杆' => '七桿',
 '三杆' => '三桿',
-'三极管' => '三極體',
 '三極管' => '三極體',
+'三极管' => '三極體',
 '达累斯萨拉姆' => '三蘭港',
 '上落客' => '上下客',
 '落車' => '下車',
-'不來梅' => '不萊梅',
 '不来梅' => '不萊梅',
+'不來梅' => '不萊梅',
 '以太网' => '乙太網',
 '九杆' => '九桿',
 '了結他' => '了結他',
 '二手煙' => '二手菸',
+'二手烟' => '二手菸',
 '二杆' => '二桿',
 '二极管' => '二極體',
 '二極管' => '二極體',
@@ -13895,18 +13901,18 @@ $zh2TW = array(
 '阿斯旺' => '亞斯文',
 '人工智能' => '人工智慧',
 '人机交互' => '人機互動',
-'石勒蘇益格' => '什勒斯維希',
 '石勒苏益格' => '什勒斯維希',
+'石勒蘇益格' => '什勒斯維希',
 '界面' => '介面',
 '伊利诺伊州' => '伊利諾州',
-'伊斯坦布爾' => '伊斯坦堡',
 '伊斯坦布尔' => '伊斯坦堡',
+'伊斯坦布爾' => '伊斯坦堡',
 '伊斯兰堡' => '伊斯蘭瑪巴德',
 '伊斯蘭堡' => '伊斯蘭瑪巴德',
 '埃博拉' => '伊波拉',
 '伊丽莎白' => '伊莉莎白',
-'掌上壓' => '伏地挺身',
 '俯卧撑' => '伏地挺身',
+'掌上壓' => '伏地挺身',
 '伯明翰' => '伯明罕',
 '服务器' => '伺服器',
 '字节' => '位元組',
@@ -13925,8 +13931,11 @@ $zh2TW = array(
 '八杆' => '八桿',
 '公共交通' => '公共運輸',
 '六杆' => '六桿',
-'凯瑟琳' => '凱薩琳',
 '嘉芙蓮' => '凱薩琳',
+'凯瑟琳' => '凱薩琳',
+'划着独木舟' => '划著獨木舟',
+'划着竹筏' => '划著竹筏',
+'划着船' => '划著船',
 '打印' => '列印',
 '列支敦士登' => '列支敦斯登',
 '前波美拉尼亚' => '前波莫瑞',
@@ -13944,16 +13953,18 @@ $zh2TW = array(
 '卡斯特罗' => '卡斯楚',
 '卡塔尔' => '卡達',
 '卡塔爾' => '卡達',
-'打印机' => '印表機',
+'铆足' => '卯足',
 '打印機' => '印表機',
+'打印机' => '印表機',
 '厄立特里亞' => '厄利垂亞',
-'厄立特里亚' => '厄利垂亞',
 '厄利垂亚' => '厄利垂亞',
+'厄立特里亚' => '厄利垂亞',
+'厄瓜多尔' => '厄瓜多',
 '厄瓜多爾' => '厄瓜多',
 '厄瓜多' => '厄瓜多',
-'厄瓜多尔' => '厄瓜多',
 '源代码' => '原始碼',
 '圆珠笔' => '原子筆',
+'反烟' => '反菸',
 '反煙' => '反菸',
 '可卡因' => '古柯鹼',
 '便携式' => '可攜式',
@@ -13966,64 +13977,61 @@ $zh2TW = array(
 '斯坦福' => '史丹福',
 '斯皮尔伯格' => '史匹柏',
 '斯特劳斯' => '史特勞斯',
-'斯威士兰' => '史瓦濟蘭',
 '斯威士蘭' => '史瓦濟蘭',
+'斯威士兰' => '史瓦濟蘭',
 '斯蒂芬' => '史蒂芬',
 '斯大林' => '史達林',
 '結他' => '吉他',
-'乞力馬札羅' => '吉力馬札羅',
 '乞力马扎罗' => '吉力馬札羅',
-'吉布堤' => '吉布地',
+'乞力馬札羅' => '吉力馬札羅',
 '吉布提' => '吉布地',
-'å\90\89å°\94å\90\89æ\96¯æ\96¯å\9d¦' => 'å\90\89ç\88¾å\90\89æ\96¯',
+'å\90\89å¸\83å ¤' => 'å\90\89å¸\83å\9c°',
 '基里巴斯' => '吉里巴斯',
 '圖瓦盧' => '吐瓦魯',
 '图瓦卢' => '吐瓦魯',
 '吸煙' => '吸菸',
+'吸烟' => '吸菸',
 '呂宋煙' => '呂宋菸',
-'å\93\88è\90¨å\85\8bæ\96¯å\9d¦' => 'å\93\88è\96©å\85\8b',
+'å\90\95å®\8bç\83\9f' => 'å\91\82å®\8bè\8f¸',
 '格丁根' => '哥廷根',
 '哥特式' => '哥德式',
 '哥斯達黎加' => '哥斯大黎加',
 '哥斯达黎加' => '哥斯大黎加',
 '卡拉奇' => '喀拉蚩',
 '乔治·奥威尔' => '喬治·歐威爾',
-'佐治亚' => '喬治亞',
-'佐治亞' => '喬治亞',
 '格魯吉亞' => '喬治亞',
+'佐治亞' => '喬治亞',
+'佐治亚' => '喬治亞',
 '格鲁吉亚' => '喬治亞',
-'单反相机' => '單眼相機',
 '單鏡反光機' => '單眼相機',
+'单反相机' => '單眼相機',
 '嘯咤' => '嘯吒',
 '四杆' => '四桿',
-'土库曼斯坦' => '土庫曼',
-'圖盧茲' => '土魯斯',
 '图卢兹' => '土魯斯',
-'IP' => '地址',
+'圖盧茲' => '土魯斯',
 '戛纳' => '坎城',
 '堪培拉' => '坎培拉',
 '坦桑尼亞' => '坦尚尼亞',
 '坦桑尼亚' => '坦尚尼亞',
 '端口' => '埠',
 '首席执行官' => '執行長',
-'塔吉克斯坦' => '塔吉克',
-'塞舌爾' => '塞席爾',
 '塞舌尔' => '塞席爾',
-'萨拉热窝' => '塞拉耶佛',
+'塞舌爾' => '塞席爾',
 '薩拉熱窩' => '塞拉耶佛',
-'塞爾維亞和黑山' => '塞爾維亞與蒙特內哥羅',
-'塞爾維亞與蒙特內哥羅' => '塞爾維亞與蒙特內哥羅',
+'萨拉热窝' => '塞拉耶佛',
 '塞尔维亚和黑山' => '塞爾維亞與蒙特內哥羅',
-'塞维利亚' => '塞維亞',
+'塞爾維亞與蒙特內哥羅' => '塞爾維亞與蒙特內哥羅',
+'塞爾維亞和黑山' => '塞爾維亞與蒙特內哥羅',
 '西維爾' => '塞維亞',
+'塞维利亚' => '塞維亞',
 '塞黑' => '塞蒙',
+'英聯邦' => '大英國協',
 '英联邦' => '大英國協',
 '共和联邦' => '大英國協',
-'英聯邦' => '大英國協',
-'宇航员' => '太空人',
 '太空飛行員' => '太空人',
-'航天飞机' => '太空梭',
+'宇航员' => '太空人',
 '穿梭機' => '太空梭',
+'航天飞机' => '太空梭',
 '宇航服' => '太空衣',
 '航天器' => '太空飛行器',
 '尼日利亞' => '奈及利亞',
@@ -14034,12 +14042,12 @@ $zh2TW = array(
 '威斯特法倫' => '威斯伐倫',
 '威斯特法伦' => '威斯伐倫',
 '威士顿康星' => '威斯康辛',
-'威爾士' => '威爾斯',
 '威尔士' => '威爾斯',
+'威爾士' => '威爾斯',
 '字库' => '字型檔',
 '存盘' => '存檔',
-'门德尔松' => '孟德爾頌',
 '孟德爾遜' => '孟德爾頌',
+'门德尔松' => '孟德爾頌',
 '安哈爾特' => '安哈特',
 '安哈尔特' => '安哈特',
 '安提瓜和巴布達' => '安地卡及巴布達',
@@ -14049,10 +14057,11 @@ $zh2TW = array(
 '宽带' => '寬頻',
 '老撾人民民主共和國' => '寮人民民主共和國',
 '老挝人民民主共和国' => '寮人民民主共和國',
-'老挝' => '寮國',
 '老撾' => '寮國',
-'老挝语' => '寮語',
+'老挝' => '寮國',
 '老撾語' => '寮語',
+'老挝语' => '寮語',
+'波里活' => '寶萊塢',
 '高峰时段' => '尖峰時段',
 '高峰时间' => '尖峰時間',
 '贊比亞' => '尚比亞',
@@ -14065,10 +14074,10 @@ $zh2TW = array(
 '機床' => '工具機',
 '珍寶客機' => '巨無霸客機',
 '发达国家' => '已開發國家',
-'巴塞隆拿' => '巴塞隆納',
 '巴塞罗那' => '巴塞隆納',
-'å·´å¸\83äº\9aæ\96°å\87 å\86\85äº\9a' => 'å·´å¸\83äº\9eç´\90å¹¾å\85§äº\9e',
+'å·´å¡\9eé\9a\86æ\8b¿' => 'å·´å¡\9eé\9a\86ç´\8d',
 '巴布亞新畿內亞' => '巴布亞紐幾內亞',
+'巴布亚新几内亚' => '巴布亞紐幾內亞',
 '巴士拉' => '巴斯拉',
 '巴巴多斯' => '巴貝多',
 '佈' => '布',
@@ -14076,8 +14085,8 @@ $zh2TW = array(
 '布基纳法索' => '布吉納法索',
 '布殊' => '布希',
 '布什' => '布希',
-'勃兰登堡' => '布蘭登堡',
 '勃蘭登堡' => '布蘭登堡',
+'勃兰登堡' => '布蘭登堡',
 '布里斯托尔' => '布里斯托',
 '布隆方丹' => '布隆泉',
 '希拉里' => '希拉蕊',
@@ -14089,22 +14098,25 @@ $zh2TW = array(
 '干着急' => '干著急',
 '干着' => '幹著',
 '畿內亞' => '幾內亞',
-'几内亚比绍' => '幾內亞比索',
 '幾內亞比紹' => '幾內亞比索',
+'几内亚比绍' => '幾內亞比索',
 '比利牛斯' => '庇里牛斯',
+'库尔德人' => '庫德人',
+'库尔德族' => '庫德族',
 '康涅狄格' => '康乃狄克',
 '约翰斯顿岛' => '強斯頓環礁',
-'形而上学' => '形上學',
+'汇编' => '彙編',
 '形而上學' => '形上學',
+'形而上学' => '形上學',
 '得克薩斯' => '德克薩斯',
 '得克萨斯' => '德克薩斯',
-'德累斯頓' => '德勒斯登',
 '德累斯顿' => '德勒斯登',
+'德累斯頓' => '德勒斯登',
 '德里达' => '德希達',
 '特拉华' => '德拉瓦',
 '特拉華' => '德拉瓦',
-'快闪存储器' => '快閃記憶體',
 '闪存' => '快閃記憶體',
+'快闪存储器' => '快閃記憶體',
 '想象' => '想像',
 '愛德文' => '愛德溫',
 '艾滋' => '愛滋',
@@ -14114,11 +14126,15 @@ $zh2TW = array(
 '戈爾巴喬夫' => '戈巴契夫',
 '戈尔巴乔夫' => '戈巴契夫',
 '戒煙' => '戒菸',
+'戒烟' => '戒菸',
 '戴克里先' => '戴克里先',
+'抽烟' => '抽菸',
 '抽煙' => '抽菸',
 '拉普兰' => '拉布蘭',
+'拒烟' => '拒菸',
 '拒煙' => '拒菸',
 '捲煙' => '捲菸',
+'卷烟' => '捲菸',
 '積架' => '捷豹',
 '控件' => '控制項',
 '推杆' => '推桿',
@@ -14131,30 +14147,31 @@ $zh2TW = array(
 '攻打印' => '攻打印',
 '数字技术' => '數位技術',
 '數碼技術' => '數位技術',
-'數碼相機' => '數位相機',
 '数码相机' => '數位相機',
-'æ\95°å­\97ä¿¡å\8f·' => 'æ\95¸ä½\8dè¨\8aè\99\9f',
+'æ\95¸ç¢¼ç\9b¸æ©\9f' => 'æ\95¸ä½\8dç\9b¸æ©\9f',
 '數碼訊號' => '數位訊號',
+'数字信号' => '數位訊號',
 '数字电视' => '數位電視',
 '數碼電視' => '數位電視',
-'调制解调器' => '數據機',
 '調制解調器' => '數據機',
-'斯洛文尼亚' => '斯洛維尼亞',
+'调制解调器' => '數據機',
 '斯洛文尼亞' => '斯洛維尼亞',
+'斯洛文尼亚' => '斯洛維尼亞',
 '新罕布什尔' => '新罕布夏',
 '施罗德' => '施洛德',
+'旱烟' => '旱菸',
 '旱煙' => '旱菸',
 '普利策' => '普利茲',
 '芯片' => '晶片',
 '智能卡' => '智慧卡',
-'智能手機' => '智慧型手機',
 '智能手机' => '智慧型手機',
-'智能电话' => '智慧型電話',
+'智能手機' => '智慧型手機',
 '智能電話' => '智慧型電話',
-'知识产权' => '智慧財產權',
+'智能电话' => '智慧型電話',
 '知識產權' => '智慧財產權',
-'萌島' => '曼島',
+'知识产权' => '智慧財產權',
 '马恩岛' => '曼島',
+'萌島' => '曼島',
 '木杆' => '木桿',
 '列奥纳多' => '李奧納多',
 '杜塞爾多夫' => '杜塞道夫',
@@ -14163,22 +14180,22 @@ $zh2TW = array(
 '亚细安' => '東協',
 '东盟' => '東協',
 '东南亚国家联盟' => '東南亞國協',
-'柏林墙' => '柏林圍牆',
 '柏林牆' => '柏林圍牆',
+'柏林墙' => '柏林圍牆',
 '乍得' => '查德',
 '查韦斯' => '查維茲',
 '克林顿' => '柯林頓',
 '克林頓' => '柯林頓',
 '撒切尔' => '柴契爾',
 '戴卓爾' => '柴契爾',
-'格林纳达' => '格瑞那達',
 '格林納達' => '格瑞那達',
-'乒乓球' => '桌球',
+'格林纳达' => '格瑞那達',
 '乒乓' => '桌球',
+'乒乓球' => '桌球',
 '杆弟' => '桿弟',
 '杆身' => '桿身',
-'杆頭' => '桿頭',
 '杆头' => '桿頭',
+'杆頭' => '桿頭',
 '梅尔·吉布森' => '梅爾·吉勃遜',
 '梵高' => '梵谷',
 '桑巴舞' => '森巴舞',
@@ -14187,16 +14204,16 @@ $zh2TW = array(
 '枪支' => '槍枝',
 '标准杆' => '標準桿',
 '標準杆' => '標準桿',
-'毛里求斯' => '模里西斯',
 '毛里裘斯' => '模里西斯',
-'æ©\9f械人' => 'æ©\9få\99¨äºº',
+'æ¯\9bé\87\8cæ±\82æ\96¯' => '模é\87\8c西æ\96¯',
 '机器人' => '機器人',
+'機械人' => '機器人',
 '概率' => '機率',
 '電單車' => '機車',
 '枱' => '檯',
 '字段' => '欄位',
-'奧巴馬' => '歐巴馬',
 '奥巴马' => '歐巴馬',
+'奧巴馬' => '歐巴馬',
 '正在叱咤' => '正在叱咤',
 '文莱' => '汶萊',
 '沙律' => '沙拉',
@@ -14205,23 +14222,26 @@ $zh2TW = array(
 '法属圭亚那' => '法屬蓋亞那',
 '波斯尼亚' => '波士尼亞',
 '波斯尼亞' => '波士尼亞',
-'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
 '波斯尼亚和黑塞哥维那' => '波士尼亞赫塞哥維納',
+'波斯尼亞黑塞哥維那' => '波士尼亞赫塞哥維納',
 '博茨瓦纳' => '波札那',
 '博茨瓦納' => '波札那',
 '波黑' => '波赫',
+'洋烟' => '洋菸',
 '洋煙' => '洋菸',
 '帕特里克' => '派屈克',
 '海洛英' => '海洛因',
 '侯赛因' => '海珊',
 '侯賽因' => '海珊',
 '鼠标' => '滑鼠',
-'漢诺威' => '漢諾瓦',
 '汉诺威' => '漢諾瓦',
-'乌兹别克斯坦' => '烏茲別克',
+'漢诺威' => '漢諾瓦',
+'烤烟' => '烤菸',
 '烤煙' => '烤菸',
 '無煙日' => '無菸日',
+'无烟日' => '無菸日',
 '無煙環境' => '無菸環境',
+'无烟环境' => '無菸環境',
 '烟熏' => '煙燻',
 '首席运营官' => '營運長',
 '熏烤' => '燻烤',
@@ -14229,24 +14249,24 @@ $zh2TW = array(
 '熏黑' => '燻黑',
 '版权信息' => '版權資訊',
 '疯牛症' => '狂牛症',
-'鐵托' => '狄托',
 '铁托' => '狄托',
+'鐵托' => '狄托',
 '塞拉利昂' => '獅子山',
 '独联体' => '獨立國協',
 '独立国家联合体' => '獨立國家國協',
-'波利尼西亚' => '玻里尼西亞',
 '波利尼西亞' => '玻里尼西亞',
-'æ\9c¬æ\9d°æ\98\8e' => 'ç\8f­å\82\91æ\98\8e',
+'æ³¢å\88©å°¼è¥¿äº\9a' => 'ç\8e»é\87\8c尼西äº\9e',
 '本傑明' => '班傑明',
+'本杰明' => '班傑明',
 '球杆' => '球桿',
 '理查德' => '理察',
 '卢塞恩' => '琉森',
 '危地馬拉' => '瓜地馬拉',
 '危地马拉' => '瓜地馬拉',
-'巴伦西亚' => '瓦倫西亞',
 '華倫西亞' => '瓦倫西亞',
-'å\86\88æ¯\94äº\9a' => 'ç\94\98æ¯\94亞',
+'巴伦西äº\9a' => 'ç\93¦å\80«è¥¿亞',
 '岡比亞' => '甘比亞',
+'冈比亚' => '甘比亞',
 '肯尼迪' => '甘迺迪',
 '留尼汪' => '留尼旺',
 '毕加索' => '畢卡索',
@@ -14258,8 +14278,8 @@ $zh2TW = array(
 '卢旺达' => '盧安達',
 '睾' => '睪',
 '知识产权局' => '知識產權局',
-'知識產權署' => '知識產權署',
 '知識產權局' => '知識產權署',
+'知識產權署' => '知識產權署',
 '知识产权署' => '知識產權署',
 '硅' => '矽',
 '硅藻' => '硅藻',
@@ -14269,32 +14289,35 @@ $zh2TW = array(
 '磁盘' => '磁碟',
 '磁道' => '磁軌',
 '禁煙' => '禁菸',
+'禁烟' => '禁菸',
 '福尔马林' => '福馬林',
 '福爾馬林' => '福馬林',
+'私烟' => '私菸',
 '私煙' => '私菸',
 '程序员' => '程式設計師',
 '编程语言' => '程式語言',
-'空氣質素' => '空氣品質',
 '空气质量' => '空氣品質',
+'空氣質素' => '空氣品質',
 '突尼斯' => '突尼西亞',
 '蹦极跳' => '笨豬跳',
 '绑紧跳' => '笨豬跳',
 '短信' => '簡訊',
 '纽黑文' => '紐哈芬',
-'新奥尔良' => '紐奧良',
 '新奧爾良' => '紐奧良',
+'新奥尔良' => '紐奧良',
 '新几内亚' => '紐幾內亞',
-'新西兰' => '紐西蘭',
 '新西蘭' => '紐西蘭',
+'新西兰' => '紐西蘭',
+'纸烟' => '紙菸',
 '紙煙' => '紙菸',
 '索贊尼辛' => '索忍尼辛',
 '索尔仁尼琴' => '索忍尼辛',
 '所羅門群島' => '索羅門群島',
 '所罗门群岛' => '索羅門群島',
-'索马里' => '索馬利亞',
 '索馬里' => '索馬利亞',
-'索马里兰' => '索馬利蘭',
+'索马里' => '索馬利亞',
 '索馬里蘭' => '索馬利蘭',
+'索马里兰' => '索馬利蘭',
 '維爾京群島' => '維京群島',
 '维尔京群岛' => '維京群島',
 '弗吉尼亚' => '維吉尼亞',
@@ -14302,25 +14325,25 @@ $zh2TW = array(
 '维特根斯坦' => '維根斯坦',
 '互联网络' => '網際網路',
 '因特网' => '網際網路',
-'互聯網' => '網際網路',
 '互联网' => '網際網路',
+'互聯網' => '網際網路',
 '系着' => '繫著',
 '卢瓦尔' => '羅亞爾',
 '盧瓦爾' => '羅亞爾',
 '卢浮宫' => '羅浮宮',
 '樂行童軍' => '羅浮童軍',
 '意大利' => '義大利',
-'昂山素姬' => '翁山蘇姬',
 '昂山素季' => '翁山蘇姬',
-'圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
+'昂山素姬' => '翁山蘇姬',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
+'圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '圣赫勒拿' => '聖赫倫那',
 '聖盧西亞' => '聖露西亞',
 '圣卢西亚' => '聖露西亞',
-'圣马力诺' => '聖馬利諾',
 '聖馬力諾' => '聖馬利諾',
+'圣马力诺' => '聖馬利諾',
 '肯尼亚' => '肯亞',
 '氨基酸' => '胺基酸',
 '卧' => '臥',
@@ -14328,8 +14351,8 @@ $zh2TW = array(
 '三藩市' => '舊金山',
 '艾森豪威尔' => '艾森豪',
 '埃菲尔' => '艾菲爾',
-'阿里埃勒·沙龙' => '艾里爾·夏隆',
 '阿里埃勒·沙龍' => '艾里爾·夏隆',
+'阿里埃勒·沙龙' => '艾里爾·夏隆',
 '帕塔亚' => '芭達亞',
 '黎克特制' => '芮氏',
 '里氏0' => '芮氏0',
@@ -14347,33 +14370,51 @@ $zh2TW = array(
 '里氏震级' => '芮氏規模',
 '当且仅当' => '若且唯若',
 '味美思' => '苦艾酒',
-'毛里塔尼亞' => '茅利塔尼亞',
 '毛里塔尼亚' => '茅利塔尼亞',
-'霍尔木兹' => '荷姆茲',
+'毛里塔尼亞' => '茅利塔尼亞',
 '霍爾木茲' => '荷姆茲',
+'霍尔木兹' => '荷姆茲',
 '荷李活道' => '荷李活道',
 '莫桑比克' => '莫三比克',
-'瓦文萨' => '華勒沙',
 '華里沙' => '華勒沙',
+'瓦文萨' => '華勒沙',
 '瓦格纳' => '華格納',
+'烟具' => '菸具',
 '煙具' => '菸具',
 '煙品' => '菸品',
+'烟品' => '菸品',
 '煙嘴' => '菸嘴',
+'烟嘴' => '菸嘴',
 '煙捲' => '菸捲',
+'烟卷' => '菸捲',
 '煙斗' => '菸斗',
+'烟斗' => '菸斗',
 '煙民' => '菸民',
+'烟民' => '菸民',
+'烟灰' => '菸灰',
 '煙灰' => '菸灰',
+'烟瘾' => '菸癮',
 '煙癮' => '菸癮',
+'烟丝' => '菸絲',
 '煙絲' => '菸絲',
 '煙草' => '菸草',
+'烟草' => '菸草',
+'烟叶' => '菸葉',
 '煙葉' => '菸葉',
 '煙蒂' => '菸蒂',
+'烟蒂' => '菸蒂',
+'烟袋' => '菸袋',
 '煙袋' => '菸袋',
+'烟农' => '菸農',
 '煙農' => '菸農',
+'烟酒' => '菸酒',
 '煙酒' => '菸酒',
+'烟头' => '菸頭',
 '煙頭' => '菸頭',
+'烟鬼' => '菸鬼',
 '煙鬼' => '菸鬼',
 '煙鹼' => '菸鹼',
+'烟碱' => '菸鹼',
 '万历朝鲜战争' => '萬曆朝鮮戰爭',
 '瓦努阿圖' => '萬那杜',
 '瓦努阿图' => '萬那杜',
@@ -14386,22 +14427,24 @@ $zh2TW = array(
 '着' => '著',
 '科摩罗' => '葛摩',
 '科摩羅' => '葛摩',
-'黑山共和國' => '蒙特內哥羅共和國',
+'格林美獎' => '葛萊美獎',
+'格莱美奖' => '葛萊美獎',
 '黑山共和国' => '蒙特內哥羅共和國',
+'黑山共和國' => '蒙特內哥羅共和國',
+'蒙特利尔' => '蒙特婁',
 '蒙特利爾' => '蒙特婁',
 '滿地可' => '蒙特婁',
-'蒙特利尔' => '蒙特婁',
 '普密蓬' => '蒲美蓬',
 '布隆迪' => '蒲隆地',
 '圭亚那' => '蓋亞那',
 '开曼群岛' => '蓋曼群島',
 '開曼群島' => '蓋曼群島',
-'蕭士達高維契' => '蕭士塔高維奇',
 '肖斯塔科维奇' => '蕭士塔高維奇',
+'蕭士達高維契' => '蕭士塔高維奇',
 '肖邦' => '蕭邦',
 '薛定谔' => '薛丁格',
-'扎伊爾' => '薩伊',
 '扎伊尔' => '薩伊',
+'扎伊爾' => '薩伊',
 '素檀' => '蘇丹',
 '苏里南' => '蘇利南',
 '浮罗交怡' => '蘭卡威',
@@ -14410,17 +14453,17 @@ $zh2TW = array(
 '荧光' => '螢光',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
-'流動網絡' => '行動網路',
 '移动网络' => '行動網路',
-'移动电话' => '行動電話',
+'流動網絡' => '行動網路',
 '流動電話' => '行動電話',
+'移动电话' => '行動電話',
 '冲着' => '衝著',
-'埃塞俄比亞' => '衣索比亞',
 '埃塞俄比亚' => '衣索比亞',
+'埃塞俄比亞' => '衣索比亞',
 '克隆人' => '複製人',
 '國際象棋' => '西洋棋',
-'囯际象棋' => '西洋棋',
 '国际象棋' => '西洋棋',
+'囯际象棋' => '西洋棋',
 '赫梯' => '西臺',
 '解像度' => '解析度',
 '分辨率' => '解析度',
@@ -14428,8 +14471,8 @@ $zh2TW = array(
 '出租车' => '計程車',
 '约翰逊' => '詹森',
 '诺曼底' => '諾曼第',
-'瑙鲁' => '諾魯',
 '瑙魯' => '諾魯',
+'瑙鲁' => '諾魯',
 '科特迪瓦' => '象牙海岸',
 '贝尔格莱德' => '貝爾格勒',
 '貝爾格萊德' => '貝爾格勒',
@@ -14437,14 +14480,15 @@ $zh2TW = array(
 '伯利茲' => '貝里斯',
 '首席财务官' => '財務長',
 '集装箱' => '貨櫃',
-'數據庫' => '資料庫',
 '数据库' => '資料庫',
+'數據庫' => '資料庫',
 '信息论' => '資訊理論',
+'乔布斯' => '賈伯斯',
 '宾西法尼亚' => '賓夕法尼亞',
 '利比里亞' => '賴比瑞亞',
 '利比里亚' => '賴比瑞亞',
-'莱索托' => '賴索托',
 '萊索托' => '賴索托',
+'莱索托' => '賴索托',
 '塞浦路斯' => '賽普勒斯',
 '碧咸' => '贝克漢',
 '赫丘勒·波洛' => '赫丘勒·白羅',
@@ -14453,8 +14497,8 @@ $zh2TW = array(
 '软驱' => '軟碟機',
 '軟件' => '軟體',
 '软件' => '軟體',
-'津巴布韦' => '辛巴威',
 '津巴布韋' => '辛巴威',
+'津巴布韦' => '辛巴威',
 '径入' => '逕入',
 '径到' => '逕到',
 '径取' => '逕取',
@@ -14474,13 +14518,12 @@ $zh2TW = array(
 '溫納圖萬' => '那杜',
 '丘吉尔' => '邱吉爾',
 '多普勒' => '都卜勒',
-'奥斯曼' => '鄂圖曼',
 '酰' => '醯',
 '里士满' => '里奇蒙',
-'金沙薩' => '金夏沙',
 '金沙萨' => '金夏沙',
-'健力士世界纪录' => '金氏世界紀錄',
+'金沙薩' => '金夏沙',
 '健力士世界紀錄' => '金氏世界紀錄',
+'健力士世界纪录' => '金氏世界紀錄',
 '吉尼斯世界纪录' => '金氏世界紀錄',
 '钚' => '鈽',
 '钩' => '鉤',
@@ -14503,22 +14546,24 @@ $zh2TW = array(
 '阿拉伯联合酋长国' => '阿拉伯聯合大公國',
 '阿拉伯聯合酋長國' => '阿拉伯聯合大公國',
 '亚拉巴马' => '阿拉巴馬',
-'阿联酋' => '阿聯',
 '阿聯酋' => '阿聯',
+'阿联酋' => '阿聯',
 '罗纳德·里根' => '隆納·雷根',
 '私隱' => '隱私',
 '耶加達' => '雅加達',
-'雅尔塔' => '雅爾達',
 '雅爾塔' => '雅爾達',
+'雅尔塔' => '雅爾達',
 '雅穆苏克雷' => '雅穆索戈',
 '雅穆蘇克雷' => '雅穆索戈',
 '悉尼' => '雪梨',
 '雪茄煙' => '雪茄菸',
+'雪茄烟' => '雪茄菸',
 '莱特湾' => '雷伊泰灣',
 '萊特灣' => '雷伊泰灣',
 '激光' => '雷射',
 '雷诺阿' => '雷諾瓦',
 '電子煙' => '電子菸',
+'电子烟' => '電子菸',
 '晶體管' => '電晶體',
 '晶体管' => '電晶體',
 '电杆' => '電桿',
@@ -14533,6 +14578,7 @@ $zh2TW = array(
 '导弹' => '飛彈',
 '糊口' => '餬口',
 '香煙' => '香菸',
+'香烟' => '香菸',
 '马里共和国' => '馬利共和國',
 '馬里共和國' => '馬利共和國',
 '马拉维' => '馬拉威',
@@ -14546,27 +14592,29 @@ $zh2TW = array(
 '斗着' => '鬥著',
 '魯賓斯·巴里切羅' => '魯本·巴瑞切羅',
 '咪高峰' => '麥克風',
-'迈克尔' => '麥可',
 '麦克尔' => '麥可',
+'迈克尔' => '麥可',
 '邁凱輪' => '麥拿輪',
 '迈凯轮' => '麥拿輪',
 '马萨诸塞' => '麻薩諸塞',
-'戴安娜' => '黛安娜',
 '狄安娜' => '黛安娜',
+'戴安娜' => '黛安娜',
+'点烟' => '點菸',
 '點煙' => '點菸',
 '霉素' => '黴素',
 );
 
 $zh2HK = array(
 'IP地址' => 'IP位址',
-'·威爾士' => '·威爾士',
 '·威尔士' => '·威爾士',
+'·威爾士' => '·威爾士',
 '一地里' => '一地裏',
 '一年里' => '一年裏',
 '三十六著' => '三十六着',
 '三極體' => '三極管',
 '旧金山' => '三藩市',
 '舊金山' => '三藩市',
+'上台面' => '上枱面',
 '下著' => '下着',
 '下著作' => '下著作',
 '下著名' => '下著名',
@@ -14575,8 +14623,8 @@ $zh2HK = array(
 '下著稱' => '下著稱',
 '下著者' => '下著者',
 '下著述' => '下著述',
-'下著录' => '下著錄',
 '下著錄' => '下著錄',
+'下著录' => '下著錄',
 '不占' => '不佔',
 '不萊梅' => '不來梅',
 '不著痕跡' => '不着痕跡',
@@ -14600,8 +14648,8 @@ $zh2HK = array(
 '葉門' => '也門',
 '事里' => '事裏',
 '二極體' => '二極管',
-'因特网' => '互聯網',
 '網際網路' => '互聯網',
+'因特网' => '互聯網',
 '井里' => '井裏',
 '亮著' => '亮着',
 '亮著作' => '亮著作',
@@ -14632,6 +14680,7 @@ $zh2HK = array(
 '伊斯坦堡' => '伊斯坦布爾',
 '伊斯蘭瑪巴德' => '伊斯蘭堡',
 '埃博拉' => '伊波拉',
+'伏著' => '伏着',
 '貝里斯' => '伯利茲',
 '伯明罕' => '伯明翰',
 '伴著' => '伴着',
@@ -14653,20 +14702,20 @@ $zh2HK = array(
 '布於' => '佈於',
 '布施' => '佈施',
 '布景' => '佈景',
-'布满' => '佈滿',
 '布滿' => '佈滿',
+'布满' => '佈滿',
 '布置' => '佈置',
-'布设' => '佈設',
 '布設' => '佈設',
+'布设' => '佈設',
 '布警' => '佈警',
 '布道' => '佈道',
 '布防' => '佈防',
-'布阵' => '佈陣',
 '布陣' => '佈陣',
+'布阵' => '佈陣',
 '布雷、' => '佈雷、',
 '布雷。' => '佈雷。',
-'布雷封锁' => '佈雷封鎖',
 '布雷封鎖' => '佈雷封鎖',
+'布雷封锁' => '佈雷封鎖',
 '布雷的' => '佈雷的',
 '布雷艇' => '佈雷艇',
 '布雷艦' => '佈雷艦',
@@ -14674,10 +14723,10 @@ $zh2HK = array(
 '布雷速度' => '佈雷速度',
 '布雷,' => '佈雷,',
 '布雷;' => '佈雷;',
-'布点' => '佈點',
 '布點' => '佈點',
-'å­\97ç¯\80' => 'ä½\8då\85\83çµ\84',
+'å¸\83ç\82¹' => 'ä½\88é»\9e',
 '字节' => '位元組',
+'字節' => '位元組',
 '低著' => '低着',
 '低著作' => '低著作',
 '低著名' => '低著名',
@@ -14734,11 +14783,11 @@ $zh2HK = array(
 '占一' => '佔一',
 '占七' => '佔七',
 '占三' => '佔三',
-'占上風' => '佔上風',
 '占上风' => '佔上風',
+'占上風' => '佔上風',
 '占下' => '佔下',
-'占下风' => '佔下風',
 '占下風' => '佔下風',
+'占下风' => '佔下風',
 '占不占' => '佔不佔',
 '占不足' => '佔不足',
 '占世界' => '佔世界',
@@ -14755,12 +14804,12 @@ $zh2HK = array(
 '占占' => '佔佔',
 '占便宜' => '佔便宜',
 '占俄' => '佔俄',
-'占个' => '佔個',
 '占個' => '佔個',
+'占个' => '佔個',
 '占个位' => '佔個位',
 '占個位' => '佔個位',
-'占億' => '佔億',
 '占亿' => '佔億',
+'占億' => '佔億',
 '占優' => '佔優',
 '占优' => '佔優',
 '占先' => '佔先',
@@ -14785,12 +14834,12 @@ $zh2HK = array(
 '占台' => '佔台',
 '占囁' => '佔囁',
 '占四' => '佔四',
-'占国' => '佔國',
 '占國' => '佔國',
+'占国' => '佔國',
 '占在' => '佔在',
 '占地' => '佔地',
-'占場' => '佔場',
 '占场' => '佔場',
+'占場' => '佔場',
 '占压' => '佔壓',
 '占壓' => '佔壓',
 '占多' => '佔多',
@@ -14816,8 +14865,8 @@ $zh2HK = array(
 '占整' => '佔整',
 '占新' => '佔新',
 '占有' => '佔有',
-'占东' => '佔東',
 '占東' => '佔東',
+'占东' => '佔東',
 '占查' => '佔查',
 '占次' => '佔次',
 '占比' => '佔比',
@@ -14825,19 +14874,19 @@ $zh2HK = array(
 '占满' => '佔滿',
 '占滿' => '佔滿',
 '占澳' => '佔澳',
-'占為' => '佔為',
 '占为' => '佔為',
+'占為' => '佔為',
 '占率' => '佔率',
 '占用' => '佔用',
-'占畢' => '佔畢',
 '占毕' => '佔畢',
+'占畢' => '佔畢',
 '占百' => '佔百',
 '占盡' => '佔盡',
 '占尽' => '佔盡',
 '占着' => '佔着',
 '占著' => '佔着',
-'占网' => '佔網',
 '占網' => '佔網',
+'占网' => '佔網',
 '占線' => '佔線',
 '占线' => '佔線',
 '占總' => '佔總',
@@ -14860,18 +14909,18 @@ $zh2HK = array(
 '占資' => '佔資',
 '占资' => '佔資',
 '占起' => '佔起',
-'占超过' => '佔超過',
 '占超過' => '佔超過',
-'占過' => '佔過',
+'占超过' => '佔超過',
 '占过' => '佔過',
+'占過' => '佔過',
 '占道' => '佔道',
 '占零' => '佔零',
 '占領' => '佔領',
 '占领' => '佔領',
-'占头' => '佔頭',
 '占頭' => '佔頭',
-'占头筹' => '佔頭籌',
+'占头' => '佔頭',
 '占頭籌' => '佔頭籌',
+'占头筹' => '佔頭籌',
 '占香' => '佔香',
 '占馬' => '佔馬',
 '占马' => '佔馬',
@@ -14931,8 +14980,8 @@ $zh2HK = array(
 '做著者' => '做著者',
 '做著述' => '做著述',
 '做著錄' => '做著錄',
-'金氏世界紀錄' => '健力士世界紀錄',
 '吉尼斯世界纪录' => '健力士世界紀錄',
+'金氏世界紀錄' => '健力士世界紀錄',
 '側著' => '側着',
 '側著作' => '側著作',
 '側著名' => '側著名',
@@ -15060,8 +15109,8 @@ $zh2HK = array(
 '南朝鲜' => '南韓',
 '波札那' => '博茨瓦納',
 '占卜' => '占卜',
-'占國橋' => '占國橋',
 '占国桥' => '占國橋',
+'占國橋' => '占國橋',
 '占有五不' => '占有五不',
 '占著作' => '占著作',
 '占著稱' => '占著稱',
@@ -15080,9 +15129,9 @@ $zh2HK = array(
 '印著述' => '印著述',
 '印著錄' => '印著錄',
 '瓜地馬拉' => '危地馬拉',
-'厄瓜多' => '厄瓜多爾',
 '厄瓜多爾' => '厄瓜多爾',
 '厄瓜多尔' => '厄瓜多爾',
+'厄瓜多' => '厄瓜多爾',
 '厄利垂亚' => '厄立特里亞',
 '厄利垂亞' => '厄立特里亞',
 '源代码' => '原始碼',
@@ -15117,6 +15166,7 @@ $zh2HK = array(
 '叫著錄' => '叫著錄',
 '古柯鹼' => '可卡因',
 '叱吒' => '叱咤',
+'斯坦福' => '史丹福',
 '斯皮尔伯格' => '史匹堡',
 '史匹柏' => '史匹堡',
 '史蒂芬·史匹柏' => '史提芬·史匹堡',
@@ -15127,7 +15177,6 @@ $zh2HK = array(
 '吃里扒外' => '吃裏扒外',
 '吃里爬外' => '吃裏爬外',
 '吉布地' => '吉布堤',
-'吉尔吉斯斯坦' => '吉爾吉斯',
 '吊著' => '吊着',
 '向著' => '向着',
 '向著作' => '向著作',
@@ -15166,8 +15215,8 @@ $zh2HK = array(
 '味著述' => '味著述',
 '味著錄' => '味著錄',
 '咖哩' => '咖喱',
-'麦克风' => '咪高峰',
 '麥克風' => '咪高峰',
+'麦克风' => '咪高峰',
 '哥特式' => '哥德式',
 '哥斯大黎加' => '哥斯達黎加',
 '哪里' => '哪裏',
@@ -15195,6 +15244,7 @@ $zh2HK = array(
 '喝著者' => '喝著者',
 '喝著述' => '喝著述',
 '喝著錄' => '喝著錄',
+'賈伯斯' => '喬布斯',
 '乔治·奥威尔' => '喬治·歐威爾',
 '單眼相機' => '單鏡反光機',
 '单反相机' => '單鏡反光機',
@@ -15262,7 +15312,6 @@ $zh2HK = array(
 '蓋亞那' => '圭亞那',
 '地占' => '地佔',
 '地图里' => '地圖裏',
-'IP' => '地址',
 '堪培拉' => '坎培拉',
 '坐台' => '坐枱',
 '坐著' => '坐着',
@@ -15283,10 +15332,11 @@ $zh2HK = array(
 '吉里巴斯' => '基里巴斯',
 '场里' => '場裏',
 '塗著' => '塗着',
-'塞普勒斯' => '塞浦路斯',
 '賽普勒斯' => '塞浦路斯',
+'塞普勒斯' => '塞浦路斯',
 '塞爾維亞與蒙特內哥羅' => '塞爾維亞和黑山',
 '塞席爾' => '塞舌爾',
+'境里' => '境裏',
 '壓著' => '壓着',
 '壓著作' => '壓著作',
 '壓著名' => '壓著名',
@@ -15320,8 +15370,8 @@ $zh2HK = array(
 '夾著者' => '夾著者',
 '夾著述' => '夾著述',
 '夾著錄' => '夾著錄',
-'奧占' => '奧佔',
 '奥占' => '奧佔',
+'奧占' => '奧佔',
 '歐巴馬' => '奧巴馬',
 '妆台' => '妝枱',
 '威斯伐倫' => '威斯特法倫',
@@ -15331,8 +15381,8 @@ $zh2HK = array(
 '字里行间' => '字裏行間',
 '存著' => '存着',
 '存著名' => '存著名',
-'孟德爾頌' => '孟德爾遜',
 '门德尔松' => '孟德爾遜',
+'孟德爾頌' => '孟德爾遜',
 '孤著' => '孤着',
 '孤著作' => '孤著作',
 '孤著名' => '孤著名',
@@ -15472,6 +15522,8 @@ $zh2HK = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著稱',
 '幾內亞比索' => '幾內亞比紹',
+'庫德人' => '库爾德人',
+'庫德族' => '库爾德族',
 '店里' => '店裏',
 '坎城' => '康城',
 '戛纳' => '康城',
@@ -15656,10 +15708,10 @@ $zh2HK = array(
 '戏彩娱亲' => '戲綵娛親',
 '戲彩娛親' => '戲綵娛親',
 '戏里' => '戲裏',
-'撒切尔' => '戴卓爾',
 '柴契爾' => '戴卓爾',
-'狄安娜' => '戴安娜',
+'撒切尔' => '戴卓爾',
 '黛安娜' => '戴安娜',
+'狄安娜' => '戴安娜',
 '戴著' => '戴着',
 '戴著作' => '戴著作',
 '戴著名' => '戴著名',
@@ -15786,8 +15838,8 @@ $zh2HK = array(
 '捆著者' => '捆著者',
 '捆著述' => '捆著述',
 '捆著錄' => '捆著錄',
-'俯卧撑' => '掌上壓',
 '伏地挺身' => '掌上壓',
+'俯卧撑' => '掌上壓',
 '掖著' => '掖着',
 '掖著作' => '掖著作',
 '掖著名' => '掖著名',
@@ -15834,8 +15886,8 @@ $zh2HK = array(
 '揮著述' => '揮著述',
 '揮著錄' => '揮著錄',
 '搜索引擎' => '搜尋引擎',
-'抢占' => '搶佔',
 '搶占' => '搶佔',
+'抢占' => '搶佔',
 '摟著' => '摟着',
 '摟著作' => '摟著作',
 '摟著名' => '摟著名',
@@ -15870,8 +15922,8 @@ $zh2HK = array(
 '據著述' => '據著述',
 '據著錄' => '據著錄',
 '擡著' => '擡着',
-'摆布' => '擺佈',
 '擺布' => '擺佈',
+'摆布' => '擺佈',
 '擺著' => '擺着',
 '擺著作' => '擺著作',
 '擺著名' => '擺著名',
@@ -15899,8 +15951,8 @@ $zh2HK = array(
 '數位相機' => '數碼相機',
 '數碼訊號' => '數碼訊號',
 '数字信号' => '數碼訊號',
-'數位電視' => '數碼電視',
 '数字电视' => '數碼電視',
+'數位電視' => '數碼電視',
 '數著作' => '數著作',
 '數著名' => '數著名',
 '數著稱' => '數著稱',
@@ -15966,10 +16018,10 @@ $zh2HK = array(
 '暗著述' => '暗著述',
 '暗著錄' => '暗著錄',
 '暗里' => '暗裏',
-'會占' => '會佔',
 '会占' => '會佔',
-'會占卜' => '會占卜',
+'會占' => '會佔',
 '会占卜' => '會占卜',
+'會占卜' => '會占卜',
 '会里' => '會裏',
 '有著' => '有着',
 '有著作' => '有著作',
@@ -16011,8 +16063,8 @@ $zh2HK = array(
 '村里' => '村裏',
 '杜塞道夫' => '杜塞爾多夫',
 '迪拜' => '杜拜',
-'亚细安' => '東盟',
 '東協' => '東盟',
+'亚细安' => '東盟',
 '板著臉' => '板着臉',
 '枕著' => '枕着',
 '枕著作' => '枕著作',
@@ -16026,17 +16078,21 @@ $zh2HK = array(
 '台历' => '枱曆',
 '台灯' => '枱燈',
 '台面上' => '枱面上',
+'台面化' => '枱面化',
 '柏林墙' => '柏林圍牆',
 '奧黛莉·朵杜' => '柯德莉·塔圖',
-'奥黛丽·赫本' => '柯德莉·夏萍',
 '奧黛麗·赫本' => '柯德莉·夏萍',
+'奥黛丽·赫本' => '柯德莉·夏萍',
 '哥廷根' => '格丁根',
 '格瑞那達' => '格林納達',
+'葛萊美獎' => '格林美獎',
+'格莱美奖' => '格林美獎',
 '格鲁吉亚' => '格魯吉亞',
+'框里' => '框裏',
 '撞球' => '桌球',
 '台球' => '桌球',
-'梅鐸' => '梅鐸',
 '默多克' => '梅鐸',
+'梅鐸' => '梅鐸',
 '梳著' => '梳着',
 '梳著作' => '梳著作',
 '梳著名' => '梳著名',
@@ -16048,8 +16104,8 @@ $zh2HK = array(
 '桑巴舞' => '森巴舞',
 '森林里' => '森林裏',
 '棺材里' => '棺材裏',
-'榴莲' => '榴槤',
 '榴蓮' => '榴槤',
+'榴莲' => '榴槤',
 '樂著' => '樂着',
 '樂著作' => '樂著作',
 '樂著名' => '樂著名',
@@ -16063,8 +16119,8 @@ $zh2HK = array(
 '標誌著' => '標誌着',
 '树林里' => '樹林裏',
 '工具機' => '機床',
-'機器人' => '機械人',
 '机器人' => '機械人',
+'機器人' => '機械人',
 '柜台' => '櫃枱',
 '历史里' => '歷史裏',
 '死里求生' => '死裏求生',
@@ -16079,8 +16135,8 @@ $zh2HK = array(
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
 '茅利塔尼亞' => '毛里塔尼亞',
-'模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
+'模里西斯' => '毛里裘斯',
 '公厘' => '毫米',
 '公釐' => '毫米',
 '水来汤里去' => '水來湯裏去',
@@ -16109,8 +16165,8 @@ $zh2HK = array(
 '沖著。' => '沖著。',
 '沖著《' => '沖著《',
 '沖著,' => '沖著,',
-'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙地阿拉伯' => '沙特阿拉伯',
+'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙里淘金' => '沙裏淘金',
 '河里' => '河裏',
 '沿著' => '沿着',
@@ -16126,6 +16182,8 @@ $zh2HK = array(
 '玻里尼西亞' => '波利尼西亞',
 '波士尼亞' => '波斯尼亞',
 '波士尼亞赫塞哥維納' => '波斯尼亞黑塞哥維那',
+'寶萊塢' => '波里活',
+'宝莱坞' => '波里活',
 '幫浦' => '泵',
 '洞里' => '洞裏',
 '辛巴威' => '津巴布韋',
@@ -16361,10 +16419,10 @@ $zh2HK = array(
 '畫著稱' => '畫著稱',
 '畫著者' => '畫著者',
 '當著' => '當着',
-'當著作' => '當著作',
 '過著作' => '當著作',
-'當著名' => '當著名',
+'當著作' => '當著作',
 '過著名' => '當著名',
+'當著名' => '當著名',
 '過著書' => '當著書',
 '當著書' => '當著書',
 '當著稱' => '當著稱',
@@ -16373,8 +16431,8 @@ $zh2HK = array(
 '過著者' => '當著者',
 '過著述' => '當著述',
 '當著述' => '當著述',
-'過著錄' => '當著錄',
 '當著錄' => '當著錄',
+'過著錄' => '當著錄',
 '几内亚' => '畿內亞',
 '幾內亞' => '畿內亞',
 '迭代' => '疊代',
@@ -16387,8 +16445,8 @@ $zh2HK = array(
 '疑著述' => '疑著述',
 '疑著錄' => '疑著錄',
 '狂牛症' => '瘋牛症',
-'發布' => '發佈',
 '发布' => '發佈',
+'發布' => '發佈',
 '發著' => '發着',
 '發著《' => '發著《',
 '發著作' => '發著作',
@@ -16517,15 +16575,16 @@ $zh2HK = array(
 '瞪著錄' => '瞪著錄',
 '智慧財產權' => '知識產權',
 '智財權' => '知識產權',
-'短信' => '短訊',
 '簡訊' => '短訊',
+'短信' => '短訊',
 '什勒斯維希' => '石勒蘇益格',
 '硅' => '矽',
 '硅藻' => '硅藻',
-'硬體' => '硬件',
 '硬件' => '硬件',
-'贝克汉姆' => '碧咸',
+'硬體' => '硬件',
+'碗里' => '碗裏',
 '贝克漢' => '碧咸',
+'贝克汉姆' => '碧咸',
 '社里' => '社裏',
 '福馬林' => '福爾馬林',
 '福著' => '福着',
@@ -16558,8 +16617,8 @@ $zh2HK = array(
 '空著者' => '空著者',
 '空著述' => '空著述',
 '空著錄' => '空著錄',
-'航天飞机' => '穿梭機',
 '太空梭' => '穿梭機',
+'航天飞机' => '穿梭機',
 '穿著' => '穿着',
 '穿著作' => '穿著作',
 '穿著名' => '穿著名',
@@ -16612,8 +16671,8 @@ $zh2HK = array(
 '紐賓士域' => '紐賓士域',
 '索忍尼辛' => '索贊尼辛',
 '索尔仁尼琴' => '索贊尼辛',
-'索馬利亞' => '索馬里',
 '索馬利里' => '索馬里',
+'索馬利亞' => '索馬里',
 '紮著' => '紮着',
 '紮著作' => '紮著作',
 '紮著名' => '紮著名',
@@ -16624,8 +16683,8 @@ $zh2HK = array(
 '紮著錄' => '紮著錄',
 '组里' => '組裏',
 '吉他' => '結他',
-'结彩' => '結綵',
 '結彩' => '結綵',
+'结彩' => '結綵',
 '綁著' => '綁着',
 '綁著作' => '綁著作',
 '綁著名' => '綁著名',
@@ -16634,6 +16693,7 @@ $zh2HK = array(
 '綁著者' => '綁著者',
 '綁著述' => '綁著述',
 '綁著錄' => '綁著錄',
+'网站里' => '網站裏',
 '網路' => '網絡',
 '网里' => '網裏',
 '彩带' => '綵帶',
@@ -16654,6 +16714,7 @@ $zh2HK = array(
 '緝凶' => '緝兇',
 '县里' => '縣裏',
 '缝里' => '縫裏',
+'縱著' => '縱着',
 '总数里' => '總數裏',
 '尖峰時段' => '繁忙時段',
 '尖峰時間' => '繁忙時間',
@@ -16722,8 +16783,8 @@ $zh2HK = array(
 '考著者' => '考著者',
 '考著述' => '考著述',
 '考著錄' => '考著錄',
-'圣基茨和尼维斯' => '聖吉斯納域斯',
 '聖克里斯多福及尼維斯' => '聖吉斯納域斯',
+'圣基茨和尼维斯' => '聖吉斯納域斯',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
@@ -16777,8 +16838,8 @@ $zh2HK = array(
 '與著述' => '與著述',
 '與著錄' => '與著錄',
 '舒马赫' => '舒麥加',
-'爱荷华' => '艾奧瓦',
 '愛荷華' => '艾奧瓦',
+'爱荷华' => '艾奧瓦',
 '埃菲尔' => '艾菲爾',
 '帕塔亚' => '芭達亞',
 '花盆里' => '花盆裏',
@@ -16794,12 +16855,12 @@ $zh2HK = array(
 '苦著錄' => '苦著錄',
 '苦里' => '苦裏',
 '英占' => '英佔',
-'大英國協' => '英聯邦',
 '共和联邦' => '英聯邦',
+'大英國協' => '英聯邦',
 '草丛里' => '草叢裏',
 '霍爾斯坦' => '荷爾斯泰因',
-'好萊塢' => '荷里活',
 '好莱坞' => '荷里活',
+'好萊塢' => '荷里活',
 '庄里' => '莊裏',
 '莫三比克' => '莫桑比克',
 '瓦倫西亞' => '華倫西亞',
@@ -16807,12 +16868,12 @@ $zh2HK = array(
 '巴倫西亞' => '華倫西亞',
 '瓦文萨' => '華里沙',
 '華勒沙' => '華里沙',
-'菲利普亲王' => '菲臘親王',
 '菲利普親王' => '菲臘親王',
+'菲利普亲王' => '菲臘親王',
 '賴索托' => '萊索托',
 '马恩岛' => '萌島',
-'马自达' => '萬事得',
 '馬自達' => '萬事得',
+'马自达' => '萬事得',
 '万历朝鲜战争' => '萬曆朝鮮戰爭',
 '落著' => '落着',
 '落著作' => '落著作',
@@ -16836,6 +16897,9 @@ $zh2HK = array(
 '蒙著述' => '蒙著述',
 '蒙著錄' => '蒙著錄',
 '蓋著' => '蓋着',
+'蓋著作' => '蓋著作',
+'蓋著名' => '蓋著名',
+'蓋著稱' => '蓋著稱',
 '肖斯塔科维奇' => '蕭士達高維契',
 '蕭士塔高維奇' => '蕭士達高維契',
 '肖邦' => '蕭邦',
@@ -16870,6 +16934,7 @@ $zh2HK = array(
 '蜜里调油' => '蜜裏調油',
 '荧屏' => '螢屏',
 '屏幕' => '螢幕',
+'行家里手' => '行家裏手',
 '首席执行官' => '行政總裁',
 '行著' => '行着',
 '行著作' => '行著作',
@@ -16903,7 +16968,6 @@ $zh2HK = array(
 '里带' => '裏帶',
 '里弦' => '裏弦',
 '里应外合' => '裏應外合',
-'里手' => '裏手',
 '里海' => '裏海',
 '里脊' => '裏脊',
 '里衣' => '裏衣',
@@ -16933,11 +16997,12 @@ $zh2HK = array(
 '裹著錄' => '裹著錄',
 '衬里' => '襯裏',
 '西占' => '西佔',
-'塞维利亚' => '西維爾',
 '塞維亞' => '西維爾',
+'塞维利亚' => '西維爾',
 '要占' => '要佔',
 '要占卜' => '要占卜',
 '覆著' => '覆着',
+'覆蓋著' => '覆蓋着',
 '見著' => '見着',
 '見著作' => '見著作',
 '見著名' => '見著名',
@@ -16946,9 +17011,12 @@ $zh2HK = array(
 '見著者' => '見著者',
 '見著述' => '見著述',
 '見著錄' => '見著錄',
+'視著' => '視着',
+'視著名' => '視著名',
 '角落里' => '角落裏',
-'分辨率' => '解像度',
 '解析度' => '解像度',
+'分辨率' => '解像度',
+'言里' => '言裏',
 '計畫' => '計劃',
 '記著' => '記着',
 '記著作' => '記著作',
@@ -17022,9 +17090,10 @@ $zh2HK = array(
 '貞著述' => '貞著述',
 '貞著錄' => '貞著錄',
 '負著' => '負着',
+'貢寮國' => '貢寮國',
 '買凶' => '買兇',
-'費占' => '費佔',
 '费占' => '費佔',
+'費占' => '費佔',
 '赌台' => '賭枱',
 '尚比亞' => '贊比亞',
 '西臺人' => '赫梯人',
@@ -17203,8 +17272,8 @@ $zh2HK = array(
 '連著者' => '連著者',
 '連著述' => '連著述',
 '連著錄' => '連著錄',
-'进占' => '進佔',
 '進占' => '進佔',
+'进占' => '進佔',
 '演化論' => '進化論',
 '逼著' => '逼着',
 '逼著作' => '逼著作',
@@ -17246,7 +17315,6 @@ $zh2HK = array(
 '还占' => '還佔',
 '邋里邋遢' => '邋裏邋遢',
 '那里' => '那裏',
-'奥斯曼' => '鄂圖曼',
 '配合著' => '配合着',
 '配合著名' => '配合著名',
 '配图里' => '配圖裏',
@@ -17271,8 +17339,8 @@ $zh2HK = array(
 '醯壶' => '醯壺',
 '醯醋' => '醯醋',
 '醯醢' => '醯醢',
-'醯酱' => '醯醬',
 '醯醬' => '醯醬',
+'醯酱' => '醯醬',
 '醯鸡' => '醯雞',
 '醯雞' => '醯雞',
 '釀著' => '釀着',
@@ -17315,8 +17383,8 @@ $zh2HK = array(
 '開著者' => '開著者',
 '開著述' => '開著述',
 '開著錄' => '開著錄',
-'开诚布公' => '開誠佈公',
 '開誠布公' => '開誠佈公',
+'开诚布公' => '開誠佈公',
 '閑著' => '閑着',
 '閑著作' => '閑著作',
 '閑著名' => '閑著名',
@@ -17387,8 +17455,8 @@ $zh2HK = array(
 '隨著者' => '隨著者',
 '隨著述' => '隨著述',
 '隨著錄' => '隨著錄',
-'隱占' => '隱佔',
 '隐占' => '隱佔',
+'隱占' => '隱佔',
 '雅爾達' => '雅爾塔',
 '雅著' => '雅着',
 '雅穆索戈' => '雅穆蘇克雷',
@@ -17410,13 +17478,14 @@ $zh2HK = array(
 '雜著述' => '雜著述',
 '雜著錄' => '雜著錄',
 '鸡蛋里挑骨头' => '雞蛋裏挑骨頭',
-'冰淇淋' => '雪糕',
 '冰激凌' => '雪糕',
+'冰淇淋' => '雪糕',
 '雪里' => '雪裏',
 '萊特灣' => '雷伊泰灣',
 '莱特湾' => '雷伊泰灣',
-'晶體管' => '電晶體',
 '晶体管' => '電晶體',
+'晶體管' => '電晶體',
+'电梯里' => '電梯裏',
 '电脑程序' => '電腦程式',
 '计算机程序' => '電腦程式',
 '霄裡' => '霄裡',
@@ -17427,8 +17496,8 @@ $zh2HK = array(
 '靠著' => '靠着',
 '靠著作' => '靠著作',
 '靠著名' => '靠著名',
-'靠著稱' => '靠著稱',
 '靠著称' => '靠著稱',
+'靠著稱' => '靠著稱',
 '靠著者' => '靠著者',
 '靠著述' => '靠著述',
 '靠著錄' => '靠著錄',
@@ -17533,8 +17602,8 @@ $zh2HK = array(
 '髭著者' => '髭著者',
 '髭著述' => '髭著述',
 '髭著錄' => '髭著錄',
-'斗着' => '鬥着',
 '鬥著' => '鬥着',
+'斗着' => '鬥着',
 '鬥著作' => '鬥著作',
 '鬥著名' => '鬥著名',
 '鬥著書' => '鬥著書',
@@ -17543,10 +17612,10 @@ $zh2HK = array(
 '鬥著述' => '鬥著述',
 '鬥著錄' => '鬥著錄',
 '鬧著' => '鬧着',
-'牛軋' => '鳥結',
 '牛轧' => '鳥結',
-'鸠占' => '鳩佔',
+'牛軋' => '鳥結',
 '鳩占' => '鳩佔',
+'鸠占' => '鳩佔',
 '麗著' => '麗着',
 '麗著作' => '麗著作',
 '麗著名' => '麗著名',
@@ -17556,26 +17625,26 @@ $zh2HK = array(
 '麗著述' => '麗著述',
 '麗著錄' => '麗著錄',
 '麼著' => '麼着',
-'芮氏0' => '黎克特制0',
 '里氏0' => '黎克特制0',
-'芮氏1' => '黎克特制1',
+'芮氏0' => '黎克特制0',
 '里氏1' => '黎克特制1',
-'芮氏2' => '黎克特制2',
+'芮氏1' => '黎克特制1',
 '里氏2' => '黎克特制2',
-'芮氏3' => '黎克特制3',
+'芮氏2' => '黎克特制2',
 '里氏3' => '黎克特制3',
-'芮氏4' => '黎克特制4',
+'芮氏3' => '黎克特制3',
 '里氏4' => '黎克特制4',
-'里氏5' => '黎克特制5',
+'芮氏4' => '黎克特制4',
 '芮氏5' => '黎克特制5',
-'里氏6' => '黎克特制6',
+'里氏5' => '黎克特制5',
 '芮氏6' => '黎克特制6',
-'里氏7' => '黎克特制7',
+'里氏6' => '黎克特制6',
 '芮氏7' => '黎克特制7',
-'里氏8' => '黎克特制8',
+'里氏7' => '黎克特制7',
 '芮氏8' => '黎克特制8',
-'芮氏9' => '黎克特制9',
+'里氏8' => '黎克特制8',
 '里氏9' => '黎克特制9',
+'芮氏9' => '黎克特制9',
 '芮氏地震規模' => '黎克特制地震震級',
 '里氏地震规模' => '黎克特制地震震級',
 '里氏震级' => '黎克特制震級',
@@ -17614,8 +17683,8 @@ $zh2CN = array(
 '下著' => '下着',
 '下著作' => '下著作',
 '下著名' => '下著名',
-'下著錄' => '下著录',
 '下著录' => '下著录',
+'下著錄' => '下著录',
 '下著有' => '下著有',
 '下著稱' => '下著称',
 '下著称' => '下著称',
@@ -17674,7 +17743,6 @@ $zh2CN = array(
 '麗著者' => '丽著者',
 '麗著述' => '丽著述',
 '麼著' => '么着',
-'烏茲別克' => '乌兹别克斯坦',
 '樂著' => '乐着',
 '樂著書' => '乐著书',
 '樂著作' => '乐著作',
@@ -17683,6 +17751,7 @@ $zh2CN = array(
 '樂著稱' => '乐著称',
 '樂著者' => '乐著者',
 '樂著述' => '乐著述',
+'賈伯斯' => '乔布斯',
 '喬治·歐威爾' => '乔治·奥威尔',
 '乘著' => '乘着',
 '乘著書' => '乘著书',
@@ -17709,8 +17778,8 @@ $zh2CN = array(
 '二極體' => '二极管',
 '二進位制' => '二进位制',
 '二進位' => '二进制',
-'網際網路' => '互联网',
 '網際網絡' => '互联网',
+'網際網路' => '互联网',
 '亞歷山卓' => '亚历山大',
 '雅穆索戈' => '亚穆苏克罗',
 '互動式' => '交互式',
@@ -17724,8 +17793,8 @@ $zh2CN = array(
 '亮著者' => '亮著者',
 '亮著述' => '亮著述',
 '人工智慧' => '人工智能',
-'甚麼' => '什么',
 '甚麽' => '什么',
+'甚麼' => '什么',
 '仗著' => '仗着',
 '仗著書' => '仗著书',
 '仗著作' => '仗著作',
@@ -17745,10 +17814,11 @@ $zh2CN = array(
 '代表著述' => '代表著述',
 '乙太網' => '以太网',
 '伊莉莎白' => '伊丽莎白',
-'伊利諾' => '伊利诺伊',
 '伊利諾伊' => '伊利诺伊',
+'伊利諾' => '伊利诺伊',
 '伊斯蘭瑪巴德' => '伊斯兰堡',
 '伊斯坦堡' => '伊斯坦布尔',
+'伏著' => '伏着',
 '優先順序' => '优先级',
 '傳著' => '传着',
 '傳著書' => '传著书',
@@ -17769,7 +17839,6 @@ $zh2CN = array(
 '伴著者' => '伴著者',
 '伴著述' => '伴著述',
 '點陣圖' => '位图',
-'IP' => '位址',
 '低著' => '低着',
 '低著書' => '低著书',
 '低著作' => '低著作',
@@ -17817,8 +17886,8 @@ $zh2CN = array(
 '信著稱' => '信著称',
 '信著者' => '信著者',
 '信著述' => '信著述',
-'掌上壓' => '俯卧撑',
 '伏地挺身' => '俯卧撑',
+'掌上壓' => '俯卧撑',
 '倒帳' => '倒账',
 '候著' => '候着',
 '候著書' => '候著书',
@@ -17828,8 +17897,8 @@ $zh2CN = array(
 '候著稱' => '候著称',
 '候著者' => '候著者',
 '候著述' => '候著述',
-'藉著' => '借着',
 '借著' => '借着',
+'藉著' => '借着',
 '借著書' => '借著书',
 '借著作' => '借著作',
 '借著名' => '借著名',
@@ -17922,8 +17991,8 @@ $zh2CN = array(
 '寫著稱' => '写著称',
 '寫著者' => '写著者',
 '寫著述' => '写著述',
-'沖著' => '冲着',
 '衝著' => '冲着',
+'沖著' => '冲着',
 '沖著。' => '冲著。',
 '沖著《' => '冲著《',
 '沖著,' => '冲著,',
@@ -17939,12 +18008,12 @@ $zh2CN = array(
 '湊合著' => '凑合着',
 '畿內亞' => '几内亚',
 '幾內亞比索' => '几内亚比绍',
-'凱薩琳' => '凯瑟琳',
 '嘉芙蓮' => '凯瑟琳',
+'凱薩琳' => '凯瑟琳',
 '份內' => '分内',
 '份外' => '分外',
-'解析度' => '分辨率',
 '解像度' => '分辨率',
+'解析度' => '分辨率',
 '份量' => '分量',
 '車諾比' => '切尔诺贝利',
 '劃著' => '划着',
@@ -17952,8 +18021,8 @@ $zh2CN = array(
 '列支敦斯登' => '列支敦士登',
 '賴比瑞亞' => '利比里亚',
 '別著' => '别着',
-'刮著' => '刮着',
 '颳著' => '刮着',
+'刮著' => '刮着',
 '到帳' => '到账',
 '制著' => '制着',
 '制著書' => '制著书',
@@ -18039,10 +18108,10 @@ $zh2CN = array(
 '印著述' => '印著述',
 '瓜地馬拉' => '危地马拉',
 '厄瓜多尔' => '厄瓜多尔',
-'厄瓜多爾' => '厄瓜多尔',
 '厄瓜多' => '厄瓜多尔',
-'å\8e\84ç«\8bç\89¹é\87\8cäº\9e' => 'å\8e\84ç«\8bç\89¹é\87\8cäº\9a',
+'å\8e\84ç\93\9cå¤\9aç\88¾' => 'å\8e\84ç\93\9cå¤\9aå°\94',
 '厄利垂亚' => '厄立特里亚',
+'厄立特里亞' => '厄立特里亚',
 '厄利垂亞' => '厄立特里亚',
 '壓著' => '压着',
 '壓著書' => '压著书',
@@ -18083,6 +18152,8 @@ $zh2CN = array(
 '變著稱' => '变著称',
 '變著者' => '变著者',
 '變著述' => '变著述',
+'隻字片語' => '只字片语',
+'隻言片語' => '只言片语',
 '唯讀' => '只读',
 '叫著' => '叫着',
 '叫著書' => '叫著书',
@@ -18146,7 +18217,6 @@ $zh2CN = array(
 '味著述' => '味著述',
 '咖哩' => '咖喱',
 '諮' => '咨',
-'哈薩克' => '哈萨克斯坦',
 '響著' => '响着',
 '響著書' => '响著书',
 '響著作' => '响著作',
@@ -18200,8 +18270,8 @@ $zh2CN = array(
 '因著書' => '因著书',
 '因著作' => '因著作',
 '因著名' => '因著名',
-'因著录' => '因著录',
 '因著錄' => '因著录',
+'因著录' => '因著录',
 '因著稱' => '因著称',
 '因著者' => '因著者',
 '因著述' => '因著述',
@@ -18226,7 +18296,6 @@ $zh2CN = array(
 '土魯斯' => '图卢兹',
 '吐瓦魯' => '图瓦卢',
 '原子筆' => '圆珠笔',
-'土庫曼' => '土库曼斯坦',
 '聖露西亞' => '圣卢西亚',
 '聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖克里斯多福及尼維斯' => '圣基茨和尼维斯',
@@ -18259,12 +18328,10 @@ $zh2CN = array(
 '吉里巴斯' => '基里巴斯',
 '堂姊' => '堂姐',
 '坎培拉' => '堪培拉',
-'塔吉克' => '塔吉克斯坦',
-'塔吉克斯坦' => '塔吉克斯坦',
 '塞爾維亞與蒙特內哥羅' => '塞尔维亚和黑山',
 '塞拉利昂' => '塞拉利昂',
-'塞普勒斯' => '塞浦路斯',
 '賽普勒斯' => '塞浦路斯',
+'塞普勒斯' => '塞浦路斯',
 '西維爾' => '塞维利亚',
 '塞維亞' => '塞维利亚',
 '塞席爾' => '塞舌尔',
@@ -18345,6 +18412,7 @@ $zh2CN = array(
 '定著稱' => '定著称',
 '定著者' => '定著者',
 '定著述' => '定著述',
+'波里活' => '宝莱坞',
 '寬頻' => '宽带',
 '密西根' => '密歇根',
 '密执安' => '密歇根',
@@ -18381,8 +18449,8 @@ $zh2CN = array(
 '展著述' => '展著述',
 '華倫西亞' => '巴伦西亚',
 '瓦倫西亞' => '巴伦西亚',
-'巴塞隆納' => '巴塞罗那',
 '巴塞隆拿' => '巴塞罗那',
+'巴塞隆納' => '巴塞罗那',
 '巴斯拉' => '巴士拉',
 '帕邁拉環礁' => '巴尔米拉环礁',
 '巴貝多' => '巴巴多斯',
@@ -18417,6 +18485,8 @@ $zh2CN = array(
 '幹著名' => '幹著名',
 '幹著稱' => '幹著称',
 '庇護著' => '庇护着',
+'庫德人' => '库尔德人',
+'庫德族' => '库尔德族',
 '應用程式' => '应用程序',
 '應著' => '应着',
 '應著書' => '应著书',
@@ -18663,8 +18733,8 @@ $zh2CN = array(
 '披著稱' => '披著称',
 '披著者' => '披著者',
 '披著述' => '披著述',
-'擡著' => '抬着',
 '抬著' => '抬着',
+'擡著' => '抬着',
 '抬著作' => '抬著作',
 '抬著名' => '抬著名',
 '抬著錄' => '抬著录',
@@ -18837,8 +18907,8 @@ $zh2CN = array(
 '放著' => '放着',
 '放著作' => '放著作',
 '放著名' => '放著名',
-'放著称' => '放著称',
 '放著稱' => '放著称',
+'放著称' => '放著称',
 '放帳' => '放账',
 '敞著' => '敞着',
 '敞著作' => '敞著作',
@@ -18847,10 +18917,10 @@ $zh2CN = array(
 '敞著稱' => '敞著称',
 '敞著者' => '敞著者',
 '敞著述' => '敞著述',
-'數碼訊號' => '数字信号',
 '數位訊號' => '数字信号',
-'數位技術' => '数字技术',
+'數碼訊號' => '数字信号',
 '數碼技術' => '数字技术',
+'數位技術' => '数字技术',
 '數位電視' => '数字电视',
 '數碼電視' => '数字电视',
 '資料庫' => '数据库',
@@ -18879,6 +18949,7 @@ $zh2CN = array(
 '斥著稱' => '斥著称',
 '斥著者' => '斥著者',
 '斥著述' => '斥著述',
+'史丹福' => '斯坦福',
 '史達林' => '斯大林',
 '史瓦濟蘭' => '斯威士兰',
 '斯洛維尼亞' => '斯洛文尼亚',
@@ -18888,8 +18959,8 @@ $zh2CN = array(
 '紐西蘭' => '新西兰',
 '舊帳' => '旧账',
 '三藩市' => '旧金山',
-'昂山素姬' => '昂山素季',
 '翁山蘇姬' => '昂山素季',
+'昂山素姬' => '昂山素季',
 '昂著' => '昂着',
 '昂著書' => '昂著书',
 '昂著作' => '昂著作',
@@ -19008,6 +19079,8 @@ $zh2CN = array(
 '查維茲' => '查韦斯',
 '標誌著' => '标志着',
 '格瑞那達' => '格林纳达',
+'格林美獎' => '格莱美奖',
+'葛萊美獎' => '格莱美奖',
 '森巴舞' => '桑巴舞',
 '梅赫西迪' => '梅赛德斯',
 '夢著' => '梦着',
@@ -19034,8 +19107,8 @@ $zh2CN = array(
 '茅利塔尼亞' => '毛里塔尼亚',
 '毛里裘斯' => '毛里求斯',
 '模里西斯' => '毛里求斯',
-'公厘' => '毫米',
 '公釐' => '毫米',
+'公厘' => '毫米',
 '胺基酸' => '氨基酸',
 '水份' => '水分',
 '水氣' => '水汽',
@@ -19048,8 +19121,8 @@ $zh2CN = array(
 '求著者' => '求著者',
 '求著述' => '求著述',
 '漢諾瓦' => '汉诺威',
-'沈著' => '沉着',
 '沉著' => '沉着',
+'沈著' => '沉着',
 '沉著書' => '沉著书',
 '沉著作' => '沉著作',
 '沉著名' => '沉著名',
@@ -19057,8 +19130,8 @@ $zh2CN = array(
 '沉著稱' => '沉著称',
 '沉著者' => '沉著者',
 '沉著述' => '沉著述',
-'沙烏地阿拉伯' => '沙特阿拉伯',
 '沙地阿拉伯' => '沙特阿拉伯',
+'沙烏地阿拉伯' => '沙特阿拉伯',
 '沿著' => '沿着',
 '沿著書' => '沿著书',
 '沿著作' => '沿著作',
@@ -19228,10 +19301,10 @@ $zh2CN = array(
 '猜著者' => '猜著者',
 '猜著述' => '猜著述',
 '玩著' => '玩着',
-'萬那杜' => '瓦努阿图',
 '溫納圖' => '瓦努阿图',
-'è\8f¯å\8b\92æ²\99' => 'ç\93¦æ\96\87è\90¨',
+'è\90¬é\82£æ\9d\9c' => 'ç\93¦å\8aªé\98¿å\9b¾',
 '華里沙' => '瓦文萨',
+'華勒沙' => '瓦文萨',
 '甜著' => '甜着',
 '甜著書' => '甜著书',
 '甜著作' => '甜著作',
@@ -19287,6 +19360,10 @@ $zh2CN = array(
 '皺著者' => '皱著者',
 '皺著述' => '皱著述',
 '鹽份' => '盐分',
+'蓋著' => '盖着',
+'蓋著作' => '盖著作',
+'蓋著名' => '盖著名',
+'蓋著稱' => '盖著称',
 '盛著' => '盛着',
 '盛著書' => '盛著书',
 '盛著作' => '盛著作',
@@ -19323,8 +19400,8 @@ $zh2CN = array(
 '著絲' => '着丝',
 '著麼' => '着么',
 '著人' => '着人',
-'著甚麽' => '着什么',
 '著什麼' => '着什么',
+'著甚麽' => '着什么',
 '著他' => '着他',
 '著令' => '着令',
 '著位' => '着位',
@@ -19457,11 +19534,11 @@ $zh2CN = array(
 '智慧財產權' => '知识产权',
 '知識份子' => '知识分子',
 '什勒斯維希' => '石勒苏益格',
-'矽塵' => '矽尘',
 '矽尘' => '矽尘',
+'矽塵' => '矽尘',
 '矽肺' => '矽肺',
-'矽鋼' => '矽钢',
 '矽钢' => '矽钢',
+'矽鋼' => '矽钢',
 '矽' => '硅',
 '矽片' => '硅片',
 '矽谷' => '硅谷',
@@ -19482,8 +19559,8 @@ $zh2CN = array(
 '葛摩' => '科摩罗',
 '象牙海岸' => '科特迪瓦',
 '積極份子' => '积极分子',
-'行動電話' => '移动电话',
 '流動電話' => '移动电话',
+'行動電話' => '移动电话',
 '行動網路' => '移动网络',
 '流動網絡' => '移动网络',
 '程式設計師' => '程序员',
@@ -19554,12 +19631,13 @@ $zh2CN = array(
 '動畫影集' => '系列动画片',
 '繫著' => '系着',
 '索贊尼辛' => '索尔仁尼琴',
-'索忍尼辛' => '索尔仁尼琴',
 '蘇辛尼津' => '索尔仁尼琴',
+'索忍尼辛' => '索尔仁尼琴',
 '索馬利亞' => '索马里',
 '索馬利蘭' => '索马里兰',
 '正體中文' => '繁体中文',
 '強斯頓環礁' => '约翰斯顿岛',
+'縱著' => '纵着',
 '組份' => '组分',
 '經常帳' => '经常账',
 '經濟帳' => '经济账',
@@ -19675,8 +19753,8 @@ $zh2CN = array(
 '苦著述' => '苦著述',
 '英吋' => '英寸',
 '英呎' => '英尺',
-'大英國協' => '英联邦',
 '共和联邦' => '英联邦',
+'大英國協' => '英联邦',
 '士多啤梨' => '草莓',
 '螢光棒' => '荧光棒',
 '螢屏' => '荧屏',
@@ -19684,8 +19762,8 @@ $zh2CN = array(
 '莫三比克' => '莫桑比克',
 '雷伊泰灣' => '莱特湾',
 '賴索托' => '莱索托',
-'穫著' => '获着',
 '獲著' => '获着',
+'穫著' => '获着',
 '獲著書' => '获著书',
 '獲著作' => '获著作',
 '獲著名' => '获著名',
@@ -19712,7 +19790,6 @@ $zh2CN = array(
 '蒙著稱' => '蒙著称',
 '蒙著者' => '蒙著者',
 '蒙著述' => '蒙著述',
-'蓋著' => '蓋着',
 '藍芽' => '蓝牙',
 '薛丁格' => '薛定谔',
 '藏著' => '藏着',
@@ -19765,6 +19842,7 @@ $zh2CN = array(
 '裹著者' => '裹著者',
 '裹著述' => '裹著述',
 '要帳' => '要账',
+'覆蓋著' => '覆盖着',
 '覆著' => '覆着',
 '見著' => '见着',
 '見著書' => '见著书',
@@ -19774,6 +19852,8 @@ $zh2CN = array(
 '見著稱' => '见著称',
 '見著者' => '见著者',
 '見著述' => '见著述',
+'視著' => '视着',
+'視著名' => '视著名',
 '占士邦' => '詹姆斯·邦德',
 '警戒著' => '警戒着',
 '計畫' => '计划',
@@ -19788,7 +19868,6 @@ $zh2CN = array(
 '記著者' => '记著者',
 '記著述' => '记著述',
 '記帳' => '记账',
-'辭彙' => '词汇',
 '片語' => '词组',
 '試著' => '试着',
 '試著書' => '试著书',
@@ -19834,6 +19913,7 @@ $zh2CN = array(
 '貞著者' => '贞著者',
 '貞著述' => '贞著述',
 '負著' => '负着',
+'貢寮國' => '贡寮国',
 '帳上' => '账上',
 '帳冊' => '账册',
 '帳務' => '账务',
@@ -20091,6 +20171,7 @@ $zh2CN = array(
 '鈽' => '钚',
 '鍅' => '钫',
 '狄托' => '铁托',
+'卯足' => '铆足',
 '鋪著' => '铺着',
 '鋪著書' => '铺著书',
 '鋪著作' => '铺著作',
@@ -20184,7 +20265,6 @@ $zh2CN = array(
 '雅著稱' => '雅著称',
 '雅著者' => '雅著者',
 '雅著述' => '雅著述',
-'山葉' => '雅马哈',
 '雷諾瓦' => '雷诺阿',
 '荷姆茲' => '霍尔木兹',
 '非份' => '非分',
@@ -20221,8 +20301,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 ef8957e..0dee147 100644 (file)
@@ -82,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
@@ -96,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();
@@ -331,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();
@@ -353,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;
@@ -475,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:
@@ -486,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 );
@@ -531,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 2978453..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()
         *
@@ -453,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 );
+               }
        }
 
        /**
@@ -750,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 );
                }
 
@@ -774,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' ) ) {
@@ -798,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
@@ -1190,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();
@@ -1265,6 +1318,7 @@ class ApiMain extends ApiBase {
                        }
                        $help[$k] = $v;
                }
+               $help['datatypes'] = '';
                $help['credits'] = '';
 
                // Fill 'permissions'
@@ -1297,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 b565dea..fc004cf 100644 (file)
@@ -127,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 ) ) {
@@ -137,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 ) ) {
@@ -228,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 );
@@ -271,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'] ) ) {
@@ -302,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() );
@@ -344,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';
                        }
                }
 
@@ -360,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'] ) ) {
@@ -372,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'] ) ) {
@@ -388,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'] ) {
@@ -405,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(
@@ -546,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;
                }
 
@@ -581,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;
                }
@@ -606,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;
                        }
                }
@@ -629,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;
                        }
                }
@@ -642,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;
                }
 
@@ -666,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;
                }
 
@@ -683,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;
                }
@@ -695,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 a9349b1..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[] = 'ofield=' . $params[$ofieldKey];
-                                               unset( $params[$ofieldKey] );
-                                       }
-                                       if ( isset( $params[$nfieldKey] ) ) {
-                                               $params[] = 'nfield=' . $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 269afb1..dd19bf2 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 d4f7e6a..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,7 +644,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        }
                }
 
-               $this->getResult()->setIndexedTagName( $data, 'ext' );
+               ApiResult::setIndexedTagName( $data, 'ext' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
        }
@@ -704,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 );
        }
@@ -721,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 );
        }
@@ -745,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 );
        }
@@ -763,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 );
        }
@@ -772,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 );
        }
@@ -787,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 ) {
@@ -812,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();
                        }
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 9d0663c..88eaf7c 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-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 d097477..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-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, 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 reporta un error en https://phabricator.wikimedia.org/."
+       "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 3940469..8d2d616 100644 (file)
@@ -19,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": "アカウントの作成を禁止します。",
        "apihelp-edit-param-sectiontitle": "新しい節の名前です。",
        "apihelp-edit-param-text": "ページの本文。",
        "apihelp-edit-param-minor": "細部の編集",
+       "apihelp-edit-param-notminor": "細部の編集ではない。",
        "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-text": "電子メールの本文。",
        "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-namespace": "この名前空間への投稿記録に絞り込む。",
+       "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-query": "2つの下位モジュールのヘルプ",
        "apihelp-imagerotate-example-simple": "<kbd>File:Example.png</kbd> を <kbd>90</kbd> 度回転させる。",
        "apihelp-imagerotate-example-generator": "<kbd>Category:Flip</kbd> 内のすべての画像を <kbd>180</kbd> 度回転させる。",
+       "apihelp-import-param-summary": "ページ取り込みの要約。",
        "apihelp-import-param-xml": "XMLファイルをアップロード",
        "apihelp-import-param-rootpage": "このページの下位ページとしてインポートする。",
        "apihelp-import-example-import": "[[meta:Help:Parserfunctions]] をすべての履歴とともに名前空間100 にインポートする。",
        "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-patrol-description": "ページまたは版を巡回済みにします。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-protect-description": "ページの保護レベルを変更します。",
-       "apihelp-protect-param-title": "保護(解除)するページ名です。$1pageid とは同時に指定できません。",
-       "apihelp-protect-param-pageid": "保護(解除)するページIDです。$1title とは同時に指定できません。",
+       "apihelp-protect-param-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+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-user": "この利用者による版のみを一覧表示する。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。",
        "apihelp-query+alldeletedrevisions-param-namespace": "この名前空間に含まれるページのみを一覧表示します。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "標準名前空間にある削除された最初の50版を一覧表示する。",
+       "apihelp-query+allimages-param-limit": "返す画像の総数。",
+       "apihelp-query+allimages-example-mimetypes": "MIMEタイプが <kbd>image/png</kbd> または <kbd>image/gif</kbd> であるファイルの一覧を表示する",
+       "apihelp-query+alllinks-description": "与えられた名前空間へのすべてのリンクを一覧表示します。",
+       "apihelp-query+alllinks-param-from": "列挙を開始するリンクのタイトル。",
+       "apihelp-query+alllinks-param-to": "列挙を終了するリンクのタイトル。",
+       "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-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+allusers-param-activeusers": "最近 $1 {{PLURAL:$1|日間}}のアクティブな利用者のみを一覧表示する。",
+       "apihelp-query+allusers-example-Y": "<kbd>Y</kbd> で始まる利用者を一覧表示する。",
+       "apihelp-query+backlinks-example-simple": "<kbd>Main page<kbd> へのリンクを表示する。",
+       "apihelp-query+backlinks-example-generator": "<kbd>Main page<kbd> にリンクしているページの情報を取得する。",
+       "apihelp-query+blocks-description": "ブロックされた利用者とIPアドレスを一覧表示します。",
+       "apihelp-query+blocks-param-ids": "一覧表示するブロックIDのリスト (任意)。",
+       "apihelp-query+blocks-param-limit": "一覧表示するブロックの最大数。",
+       "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
+       "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
+       "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-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-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-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+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+filearchive-example-simple": "削除されたファイルの一覧を表示する。",
+       "apihelp-query+fileusage-example-simple": "[[:File:Example.jpg]] を使用しているページの一覧を取得する。",
+       "apihelp-query+fileusage-example-generator": "[[:File:Example.jpg]] を使用しているページの情報を取得する。",
+       "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-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
+       "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+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+pageswithprop-description": "与えられたページプロパティが使用されているすべてのページを一覧表示します。",
+       "apihelp-query+pageswithprop-param-limit": "返すページの最大数。",
+       "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-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+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-example-simple": "最近の更新を一覧表示する。",
+       "apihelp-query+redirects-example-simple": "[[Main Page]] への転送の一覧を取得する。",
+       "apihelp-query+redirects-example-generator": "[[Main Page]] へのすべての転送ページに関する情報を取得する。",
+       "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-param-type": "リクエストするトークンの種類。",
+       "apihelp-query+tokens-example-simple": "csrfトークンを取得する (既定)。",
+       "apihelp-query+tokens-example-types": "ウォッチトークンおよび巡回トークンを取得する。",
+       "apihelp-query+transcludedin-description": "与えられたページをトランスクルードしているすべてのページを検索します。",
+       "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-example-simple": "利用者 <kbd>Example</kbd> の情報を返す。",
+       "apihelp-query+watchlist-description": "現在の利用者のウォッチリストにあるページへの最近の更新を取得します。",
+       "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-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-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-userrights-param-user": "利用者名。",
+       "apihelp-userrights-param-userid": "利用者ID。",
+       "apihelp-userrights-param-add": "利用者をこのグループに追加します。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
        "apihelp-dbg-description": "データを PHP の <code>var_export()</code> 形式で出力します。",
        "apihelp-dbgfm-description": "データを PHP の <code>var_export()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
index cdcca37..7d24c4a 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+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ä Sigg 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+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 1a5c897..8428b36 100644 (file)
@@ -63,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..c47d254
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "AntanO"
+               ]
+       },
+       "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..e548643 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-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 );
+       }
+}
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 0c0248d..0bef28a 100644 (file)
@@ -3525,7 +3525,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 );
@@ -4328,7 +4332,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 bc17911..624f46b 100644 (file)
@@ -358,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
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 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 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>";
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" );
        }
 
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 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 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 f808a32..9425423 100644 (file)
@@ -122,9 +122,11 @@ class JobRunner implements LoggerAwareInterface {
                $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
                $trxProfiler->setExpectation( 'maxAffected', 500, __METHOD__ );
 
-               // Bail out if there is too much DB lag
-               list( , $maxLag ) = wfGetLBFactory()->getMainLB( wfWikiID() )->getMaxLag();
-               if ( $maxLag >= 5 ) {
+               // 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;
                }
@@ -140,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 );
@@ -234,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 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..150a7ce 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 );
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 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 6242a54..752565d 100644 (file)
@@ -1142,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 );
+               }
        }
 
        /**
@@ -2075,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;
 
@@ -2200,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() ) {
@@ -2367,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] = '';
@@ -2608,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 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 3d5cc51..f8d8d2f 100644 (file)
@@ -1346,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
         */
@@ -1353,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 ac7a85b..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 '';
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 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 2c00175..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, 'recentchanges' );
-               $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 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 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 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 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 b2ffe50..2a65c71 100644 (file)
@@ -21,4 +21,6 @@
  * @file
  */
 
+define( 'MW_ENTRY_PHP5', true );
+
 require './index.php';
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 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",
index c535e51..2603d59 100644 (file)
        "editfont-monospace": "خط ثابت العرض",
        "editfont-sansserif": "خط بلا زوائد",
        "editfont-serif": "خط بزوائد",
-       "sunday": "ela7ad",
-       "monday": "elithnaine",
-       "tuesday": "etholatha",
-       "wednesday": "elirbi3a",
-       "thursday": "el5amis",
-       "friday": "eljom3a",
-       "saturday": "essibt",
-       "sun": "ela7ad",
+       "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": "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": "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": "Fivri",
+       "february-gen": "Fîvrî",
        "march-gen": "Mars",
        "april-gen": "Avril",
        "may-gen": "Mai",
        "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",
+       "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}}",
        "category_header": "صفحات تصنيف \"$1\"",
        "subcategories": "التصنيفات الفرعية",
        "mypage": "صفحتي",
        "mytalk": "نقاشي",
        "anontalk": "Tħaddeth mgħa ladrisa IP hadhi",
-       "navigation": "Ħawwes",
+       "navigation": "Ḩawwis",
        "and": "&#32;w",
        "qbfind": "Lawwej",
        "qbbrowse": "Navigi",
        "faq": "FAQ",
        "faqpage": "Project:FAQ",
        "actions": "Aksyonàt",
-       "namespaces": "Blàsʾàt làsàmi",
-       "variants": "Tanwigħà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": "Men {{SITENAME}}",
-       "help": "Mgħàwna",
-       "search": "Lawwej",
-       "searchbutton": "Lawwej",
+       "tagline": "Min {{SITENAME}}",
+       "help": "Mģâwne",
+       "search": "Lawwij",
+       "searchbutton": "Lawwij",
        "go": "Emchi",
-       "searcharticle": "Lawwej",
+       "searcharticle": "Imcî",
        "history": "Listorik mtagħ elpàj",
-       "history_short": "Listorik",
+       "history_short": "Il-istorîk",
        "updatedmarker": "tbaddlet melli jit àkher marra",
-       "printableversion": "Kopi bech tatʾbaħħa",
-       "permalink": "Rabtʾa għla tʾoul",
+       "printableversion": "Kopî bêc tiţbaģhê",
+       "permalink": "lieñ yoqģod dîme dîme",
        "print": "Atʾbagħ",
        "view": "Aqra",
-       "edit": "Baddel",
+       "edit": "Baddil",
        "create": "Agħmel",
        "editthispage": "Baddel f elpàj hadhi",
        "create-this-page": "Agħmel elpàj hadhi",
        "unprotectthispage": "Baddel elħimàya mtagħ elpàj hadhi",
        "newpage": "Pàj jdida",
        "talkpage": "Tħaddeth għal pàj hadhi",
-       "talkpagelinktext": "Ħdith",
+       "talkpagelinktext": "Ḩdîŧ",
        "specialpage": "Sʾafħa spesyàl",
-       "personaltools": "Magħounek",
+       "personaltools": "Mêģûnik",
        "articlepage": "Warri elpàj mtagħ elkontenu",
-       "talk": "Ħdith",
-       "views": "Mandhʾer",
-       "toolbox": "Magħoun",
+       "talk": "Ḩdiŧ",
+       "views": "Maner",
+       "toolbox": "Mêģûn",
        "userpage": "Chour elpàj mtagħ lutilizateur",
        "projectpage": "Chouf elpàj mtagħ leprojé",
        "imagepage": "Chouf elpàj mtagħ elfichyé",
        "viewhelppage": "Chouf elpàj mtagħ lemgħàwna",
        "categorypage": "Chouf elpàj mtagħ elkatégori",
        "viewtalkpage": "Chouf leħdith",
-       "otherlanguages": "B loughat okhra",
+       "otherlanguages": "B-lûğât okhrîne",
        "redirectedfrom": "(Tħawwelt men $1)",
        "redirectpagesub": "Pàj mtagħ taħwil",
-       "lastmodifiedat": "Elpàj hadhi tbaddlet àkher marra nhàr $1, mgħa $2.",
+       "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": "Emchi l:",
-       "jumptonavigation": "Ħawwes",
-       "jumptosearch": "Lawwej",
+       "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": "Fima ykhosʾ {{SITENAME}}",
-       "aboutpage": "Project:Fima ykhosʾ",
+       "aboutsite": "Fîme yxoş {{SITENAME}}",
+       "aboutpage": "Project:Fîme yxoş",
        "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",
+       "disclaimers": "Tambîhêt",
+       "disclaimerpage": "Project:Tambîhêt ģâmme",
        "edithelp": "Mgħàwna f elktiba",
-       "mainpage": "Elpàj Lawlàniya",
-       "mainpage-description": "Elpàj Lawlàniya",
+       "mainpage": "Il-pâj il-ewelêniye",
+       "mainpage-description": "Il-Pâj il-ewelêniye",
        "policy-url": "Project:Elpolitik",
-       "portal": "Dakhlet elmojtamagħ",
-       "portal-url": "Project:Mojtamagħ",
-       "privacy": "Elpolitik mtagħ elkonfidonsyalité",
-       "privacypage": "Project:Elpolitik mtagħ elkonfidonsyalité",
+       "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ê",
        "badaccess": "خطأ في السماح",
        "badaccess-group0": "ليس من المسموح لك تنفيذ الفعل الذي طلبته.",
        "badaccess-groups": "الفعل الذي طلبته مقصور على المستخدمين في {{PLURAL:$2||مجموعة|واحدة من مجموعتي|واحدة من مجموعات}}: $1.",
        "versionrequired": "تلزم نسخة $1 من ميدياويكي",
        "versionrequiredtext": "تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]",
        "ok": "ok",
-       "retrievedfrom": "Tekhdhet men \"$1\"",
+       "retrievedfrom": "Tixđêt min- \"$1\"",
        "youhavenewmessages": "توجد لديك $1 ($2).",
        "youhavenewmessagesmulti": "لديك رسائل جديدة على $1",
-       "editsection": "Baddel essʾafħa",
-       "editold": "Baddel",
+       "editsection": "Baddil iş-şafḩa",
+       "editold": "Baddil",
        "viewsourceold": "Warri essours",
-       "editlink": "baddel",
-       "viewsourcelink": "Warri essource",
-       "editsectionhint": "Baddel essection: $1",
+       "editlink": "baddil",
+       "viewsourcelink": "Warri is-sûrs",
+       "editsectionhint": "Baddil is-sêksyioñ: $1",
        "toc": "Contenu",
        "showtoc": "Warri",
        "hidetoc": "Khabbi",
        "feed-invalid": "نوع اشتراك التلقيم غير صحيح.",
        "feed-unavailable": "التلقيمات غير متوفرة",
        "site-rss-feed": "$1 تلقيم أر إس إس",
-       "site-atom-feed": "Flux Atom mtaε $1",
+       "site-atom-feed": "Flü Atom mtêģ $1",
        "page-rss-feed": "\"$1\" تلقيم أر إس إس",
        "page-atom-feed": "$1 تلقيم أتوم",
-       "red-link-title": "$1 (Essafħa mouch mawjouda)",
+       "red-link-title": "$1 (Iş-Şafḩa mûc mawjûde)",
        "sort-descending": "ترتيب تنازلي",
        "sort-ascending": "ترتيب تصاعدي",
-       "nstab-main": "Sʾafħa",
+       "nstab-main": "Şafḩa",
        "nstab-user": "صفحة مستخدم",
        "nstab-media": "صفحة وسيط",
-       "nstab-special": "Sʾafħa spesyàl",
+       "nstab-special": "Safḩa spêsyâl",
        "nstab-project": "صفحة مشروع",
        "nstab-image": "Fichier",
        "nstab-mediawiki": "Messàj",
        "login-abort-generic": "لم ينجح ولوجك - إجهاض",
        "loginlanguagelabel": "اللغة: $1",
        "suspicious-userlogout": "رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.",
+       "pt-login": "Odkul",
+       "pt-createaccount": "Aģmil koñt",
        "php-mail-error-unknown": "خطأ غير معروف في وظيفة البريد PHP's mail()",
        "user-mail-no-addy": "لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.",
        "resetpass_announce": "تم تسجيل دخولك بكلمة سر مؤقتة.\nللدخول بشكل نهائي، يجب عليك ضبط كلمة سر جديدة هنا:",
        "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": "Mefamme ḩatte têkst tawwe fiş-şafḩa hêđi.\nTnijjim [[Special:Search/{{PAGENAME}}|tfarkis ģal-tîtr mtêģ iş-şafħa]] fi safḩat okhrîne, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tfarkis fil-istorîk illi ģandhom ģalêqa], \nwallê [{{fullurl:{{FULLPAGENAME}}|action=edit}} tbaddil iş-şafħa hêđi]</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\" غير مسجل.",
        "difference-title": "«$1»: الفرق بين المراجعتين",
        "difference-title-multipage": "«$1» و«$2»: الفرق بين الصفحتين",
        "difference-multipage": "(الفرق بين الصفحتين)",
-       "lineno": "Star $1:",
+       "lineno": "Sţar $1:",
        "compareselectedversions": "قارن بين النسختين المختارتين",
        "showhideselectedversions": "أظهر/أخف المراجعات المختارة",
-       "editundo": "Rajjaε",
+       "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\"",
+       "searchresults": "Ir-rêzultâ mtêģ it-talwîj",
+       "searchresults-title": "Ir-rêzultâ mtêģ it-talwîj ģlâ \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} السابقة",
        "nextn": "{{PLURAL:$1|$1}} التالية",
        "prevn-title": "$1 {{PLURAL:$1|نتيجة|نتيجة}} سابقة",
        "newuserlogpage": "سجل إنشاء المستخدمين",
        "action-edit": "modifi hal page",
        "nchanges": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
-       "recentchanges": "Ajad tabdilet",
+       "recentchanges": "Ajadd tabdîlêt",
        "recentchanges-legend": "خيارات أحدث التغييرات",
        "recentchanges-summary": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "recentchanges-feed-description": "تابع أحدث التغييرات للويكي عبر هذه التلقيمة.",
        "rcshowhidemine": "$1 تعديلاتي",
        "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
        "diff": "Farq",
-       "hist": "Hist",
+       "hist": "Hîst",
        "hide": "أخف",
        "show": "اعرض",
        "minoreditletter": "thafif",
        "newpageletter": "jadid",
        "boteditletter": "bot",
+       "rc-change-size-new": "$1 {{PLURAL:$1|oktê}} baģd it-tabdîl",
        "rc-enhanced-expand": "عرض التفاصيل (يتطلب جافاسكريبت)",
        "rc-enhanced-hide": "أخفِ التفاصيل",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "license": "ترخيص:",
        "license-header": "licence",
        "file-anchor-link": "milaf (Fichier)",
-       "filehist": "teri5 el milaf",
+       "filehist": "Têrîx il-mîlaf",
        "filehist-help": "اضغط على وقت/زمن لرؤية الملف كما بدا في هذا الزمن.",
        "filehist-revert": "استرجع",
        "filehist-current": "حالي",
        "linkstoimage": "{{PLURAL:$1||الصفحة التالية تصل|الصفحتان التاليتان تصلان|ال$1 صفحات التالية تصل|ال$1 صفحة التالية تصل}} إلى هذا الملف:",
        "nolinkstoimage": "لا توجد صفحات تصل لهذا الملف.",
        "sharedupload-desc-here": "هذا الملف من $1 ويمكن استخدامه بواسطة المشاريع الأخرى.\nالوصف على [$2 صفحة وصف الملف] هناك معروض بالأسفل.",
-       "randompage": "Sʾafħa elli tji",
+       "randompage": "Şafħa kîmê tjî",
        "statistics": "إحصاءات",
        "nbytes": "{{PLURAL:Octet weħed|Zouz octets|$1 octets|$1 en octet}}",
        "nmembers": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}",
        "undeleteviewlink": "اعرض",
        "namespace": "النطاق",
        "invert": "اعكس الاختيار",
-       "blanknamespace": "(Principal)",
+       "blanknamespace": "(Ra'îsî)",
        "contributions": "مساهماتي",
        "contributions-title": "مساهمات المستخدم $1",
        "mycontris": "مساهماتي",
        "sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "sp-contributions-submit": "lawwej",
-       "whatlinkshere": "Chnowa elli ywassel elhouni",
+       "whatlinkshere": "Cnûwwe illi ywassil l-hûnî",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "ss'af7a:",
        "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
        "blocklink": "Bloqui",
        "unblocklink": "ارفع المنع",
        "change-blocklink": "تغيير المنع",
-       "contribslink": "Mousehmet",
+       "contribslink": "Mûsêhmêt",
        "blocklogpage": "سجل المنع",
        "blocklogentry": "منع \"[[$1]]\" لفترة زمنية مدتها $2 $3",
        "block-log-flags-nocreate": "إنشاء الحسابات ممنوع",
        "export": "تصدير صفحات",
        "allmessagesname": "الاسم",
        "allmessagesdefault": "النص الافتراضي",
-       "thumbnail-more": "Kabber",
+       "thumbnail-more": "Kabbir",
        "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-login": "Međebîne kên itkoññektî, eme mûc bis-sîf",
        "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-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-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-move": "علم هذه الصفحة",
        "tooltip-ca-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
        "tooltip-ca-unwatch": "أزل هذه الصفحة من قائمة مراقبتك",
-       "tooltip-search": "Lawwej fi {{SITENAME}}",
-       "tooltip-search-go": "اذÙ\87ب Ø¥Ù\84Ù\89 ØµÙ\81حة Ø¨Ø§Ù\84اسÙ\85 Ù\86Ù\81سÙ\87 Ø¥Ù\86 Ù\88جدت",
-       "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-search": "Lawwij fî- {{SITENAME}}",
+       "tooltip-search-go": "Imcî l-pâj b-nafs il-ism Ã®Ä\91ê 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": "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-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-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-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-ca-nstab-user": "اعرض صفحة المستخدم",
        "tooltip-diff": "اعرض التغييرات التي قمت بها للنص.",
        "tooltip-compareselectedversions": "شاهد الفروق بين النسختين المختارتين من هذه الصفحة.",
        "tooltip-watch": "أضف هذه الصفحة إلى قائمة مراقبتك",
-       "tooltip-rollback": "\"Rajjaε\" yrajjeε ettabdilet f'hassafħa el'ekher weħed baddel fi nazla waħda.",
+       "tooltip-rollback": "\"Rajjaģ\" yrajjiģ it-tabdîlêt 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": "أدخل ملخصا قصيرا",
+       "pageinfo-toolboxlink": "Maģlûmêt ģalâ hal-pâj",
        "previousdiff": "→ التعديل السابق",
        "nextdiff": "التعديل اللاحق ←",
        "file-info-size": "$1 × $2 بكسل حجم الملف: $3، نوع MIME: $4",
        "file-nohires": "لا توجد دقة أعلى متوفرة.",
        "svg-long-desc": "ملف SVG، أبعاده $1 × $2 بكسل، حجم الملف: $3",
-       "show-big-image": "دقة كاملة",
+       "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.",
        "metadata": "بيانات ميتا",
        "metadata-help": "هذا الملف يحتوي على معلومات إضافية، غالبا ما تكون أضيفت من قبل الكاميرا الرقمية أو الماسح الضوئي المستخدم في إنشاء الملف.\nإذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
-       "specialpages": "Safħat spéciales",
+       "specialpages": "Safḩât spêsyâl",
        "external_image_whitelist": " #<pre>اترك هذا السطر تماما كما هو\n#ضع منثورات التعبيرات المنتظمة (فقط الجزء الذي يذهب بين //) بالأسفل\n#هذه ستتم مطابقتها مع مسارات الصور الخرجية (الموصولة بشكل مباشر)\n#هذه التي تطابق سيتم عرضها كصور، غير ذلك فقط وصلة إلى الصورة سيتم عرضها\n#السطور التي تبدأ ب# تتم معاملتها كتعليقات\n#هذا لا يتأثر بحالة الحروف\n\n#ضع كل منثورات التعبيرات المنتظمة فوق هذا السطر. اترك هذا السطر تماما كما هو</pre>",
-       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:"
+       "tag-filter": "مرشح [[Special:Tags|الوسوم]]:",
+       "searchsuggest-search": "Lawwij"
 }
index e9547e9..291c936 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",
        "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 1b0c089..f6b68ae 100644 (file)
        "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",
        "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.",
        "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",
        "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",
        "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",
        "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)",
        "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.",
        "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.",
        "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...",
        "api-error-badaccess-groups": "Nun tienes permisu pa xubir ficheros a esta wiki.",
        "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-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»",
        "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..741e455 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**ढेर खोल जाय वाला पृष्ठ",
        "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 289cb66..997fed0 100644 (file)
        "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..6389670 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",
index e473177..637a2e5 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": "مارچ",
        "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": "تاکدیمی تاریخچه",
        "recentchangeslinked-feed": "مربوتین تغیراتان",
        "recentchangeslinked-toolbox": "مربوتین تغیراتان",
        "recentchangeslinked-title": "مربوتین تغیراتان گو $1",
+       "recentchangeslinked-summary": "بئ جهلگا یک لڑلیست ئی شه آخیرئین ٹگلان گیندیت که بئ تاکدیما لینک بوته انت (یا چَمّی چیهری شریکین تهر) ئانه گیندیت .\nآ تاکدیمان که [[Special:Watchlist|شمی پدگیری لیست]] ئی تا به ینت '''پررنگ''' نشان داته ئه به ینت.",
        "recentchangeslinked-page": "تاکدیم نام:",
        "recentchangeslinked-to": "نشان داتین تاکدیماني تغیرات که گۆ ای تاکدیما لینک دارنت",
        "upload": "فایلی بُرز کورتین",
        "undelete-show-file-submit": "هان",
        "namespace": "نامی فضا:",
        "invert": "انتخاب سرچپی بیئت",
+       "tooltip-invert": "ای جئبه ئا ئلامت بجنیت تا که پزای نام تا ئین انتخاب بوته ئین تاکدیمانی تغیرات (و دیگرین ئلامت جته بوته ئین پزای نام ئان) چیهر به ینت",
        "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "ای جئبه ئا ئلامت بجنیت تا که مربوتین موزو ئی پزای نامی گپ گۆ\nانتخاب بوته ئین پزای ناما شامل بیت",
        "blanknamespace": "(بُنیادی)",
        "contributions": "{{GENDER:$1|کار زوروک}} ئی شراکت ئان",
        "contributions-title": "$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",
index c79c723..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": "इ पन्ना पर अनुभाग सम्पादन समर्थित नइखे",
        "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..42acaf6 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": "সংক্ষেপচিত্র",
        "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 5a1911b..9c7f094 100644 (file)
@@ -47,7 +47,8 @@
                        "Loupeter",
                        "Macofe",
                        "Gerardduenas",
-                       "Medol"
+                       "Medol",
+                       "Xavier Dengra"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "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": "Diferència entre revisions de la pàgina «$1»",
        "difference-title-multipage": "$1 i $2: Diferència entre les pàgines",
        "difference-multipage": "(Diferència entre pàgines)",
        "lineno": "Línia $1:",
        "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",
        "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...",
        "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 a0ab89b..dc2ee15 100644 (file)
@@ -47,7 +47,7 @@
        "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.",
        "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш",
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
-       "tog-norollbackdiff": "Юха яккхиначул тӀаьхьа ма гайта версийн башхо",
+       "tog-norollbackdiff": "Юха яьккхиначул тӀаьхьа ма гайта версийн башхо",
        "tog-useeditwarning": "Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь",
        "tog-prefershttps": "Даима лела йе лардина системин чудалар",
        "underline-always": "Даимна",
        "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": "Дуккха юкъарвики хьажоргаш тӀе тоьхна йолу агӀонаш",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "allpages": "Массо агӀонаш",
-       "nextpage": "Тlаьхьа йогlу агlо ($1)",
-       "prevpage": "Хьалхалера агlо ($1)",
+       "nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
+       "prevpage": "Хьалха йоьду агӀо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "allpagesto": "Араяхар сацадé тӀе:",
        "allarticles": "Массо агӀонаш",
        "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 d959c98..1901c2f 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)",
        "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-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 f487f84..6513c61 100644 (file)
        "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": "Ятарлă страницă",
        "passwordreset-username": "Усă куракан ят:",
        "passwordreset-domain": "Домен:",
        "changeemail-none": "(çук)",
+       "resettokens": "Токенĕсене пăрах",
+       "resettokens-legend": "Токенĕсене пăрах",
        "bold_sample": "Çурмахулăм текст",
        "bold_tip": "Çурмахулăм текст",
        "italic_sample": "Тайлăк текст",
        "editing": "$1 тӳрлетни",
        "creating": "$1 туни",
        "editingsection": "$1 тӳрлетни (статья пайĕ)",
-       "editingcomment": "$1 тӳрлетни (кӗске анлантарӑвӗ)",
+       "editingcomment": "$1 тӳрлетни (çĕнĕ пай)",
        "editconflict": "Тӳрлетнĕ вăхăтра тавлашу тухрĕ: $1",
        "yourtext": "Сирĕн текст",
        "storedversion": "Астуса хăварнă верси",
        "protectedpagewarning": "'''АСĂРХАТТАРНИ: ку страницăна улшăнусем кĕртессинчен хӳтĕленĕ, ăна тӳрлетме администраторсем кăна пултараççĕ.'''",
        "titleprotectedwarning": "'''Асăрхаттару. Ку страницăпа ĕçлеме чарнă, ăна хăш-пĕр хутшăнакан кăна хатерлеме пултарать.'''",
        "templatesused": "Ку страницă çинче усă курнă {{PLURAL:$1|шаблон|шаблонсем}}:",
-       "templatesusedpreview": "Ð\9fÄ\83Ñ\85акан Ñ\81Ñ\82Ñ\80аниÑ\86а Ã§Ð¸Ð½Ñ\87е Ñ\83Ñ\81Ä\83 ÐºÑ\83Ñ\80нÄ\83 Ñ\88аблонÑ\81ем:",
-       "templatesusedsection": "Ку пайра усă курнă шаблонсем:",
+       "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": "Кунта эсир чылай ресурс ыйтакан функцисемпе нумай ĕçлекен страницăсене куратăр",
        "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": "Сăнав списокĕ",
        "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": "Статистика",
        "shortpages": "Кĕске статьясем",
        "longpages": "Вăрăм страницăсем",
        "deadendpages": "Ниăçта та урăх ертмен страницăсем",
-       "protectedpages": "хӳтĕленĕ страницăсем",
+       "protectedpages": "Хӳтĕленĕ страницăсем",
        "protectedtitles": "Юраман ятсем",
        "listusers": "Хутшăнакансен списокĕ",
        "newpages": "Çĕнĕ страницăсем",
        "nextpage": "Тепĕр страницă ($1)",
        "prevpage": "Унчченхи страницă ($1)",
        "allarticles": "Пĕтĕм статьясем",
-       "allinnamespace": "Пĕтĕм статьясем («$1» ят уçлăхĕ)",
+       "allinnamespace": "Пĕтĕм статьясем ($1 ят хушшинче)",
        "allpagessubmit": "Ту",
        "allpagesprefix": "Çак йĕрекесенчен пуçланакансен страницăсене шыра:",
        "allpagesbadtitle": "Страницăн ячĕ тĕрĕс мар. Ятĕнче е интервики, е чĕлхе префиксĕ е усă курма юраман символсем пур.",
        "contributions-title": "Усă куракан $1 хушни",
        "mycontris": "Ӳсĕм",
        "contribsub2": "{{GENDER:$3|$1}} валли ($2)",
-       "uctop": " (пуçламăш)",
+       "uctop": "(хальхи)",
        "month": "Уйăхран (тата маларах):",
        "year": "Çултан (тата маларах):",
        "sp-contributions-blocklog": "Чарса лартнисен журналĕ",
        "sp-contributions-logs": "логсем",
        "sp-contributions-talk": "сӳтсе яв",
        "sp-contributions-userrights": "Хутшăнакансен прависемпе ĕçлесси",
-       "sp-contributions-search": "Тӳпе Ñ\88Ñ\8bÑ\80авÄ\95",
+       "sp-contributions-search": "Ð¥Ñ\83Ñ\88нине Ñ\88Ñ\8bÑ\80амалли",
        "sp-contributions-username": "IP адрес е усă куракан ят:",
        "sp-contributions-submit": "Шыра",
        "whatlinkshere": "Кунта килекен каçăсем",
        "whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
        "whatlinkshere-links": "← каçăсем",
+       "whatlinkshere-hideredirs": "куçарнисене $1",
        "whatlinkshere-filters": "Аласем",
        "blockip": "Хăтшăнакана ĕçлеме чар",
        "ipaddressorusername": "IP адрес е усă куракан ят:",
        "creditspage": "Пархатарлăх",
        "spambot_username": "MediaWiki спамран тасатни",
        "pageinfo-title": "\"$1\" çинчен",
+       "pageinfo-language": "Страницин чĕлхи",
+       "pageinfo-templates": "{{PLURAL:$1|шаблон|шаблонсем}} ($1)",
        "pageinfo-toolboxlink": "Страници çинчен",
        "pageinfo-category-info": "Категори çинчен",
        "markaspatrolleddiff": "Тĕрĕсленĕ тесе палăрт",
        "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-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 98a8f55..c1991a3 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)",
        "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",
        "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 …",
        "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..81a622b 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",
        "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.",
        "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 1190c40..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)",
        "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]]\"",
        "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 3759bc8..f02869f 100644 (file)
        "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",
index 4f38639..95087cf 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 ha podido 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)",
        "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..cd7475f 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",
        "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..98f3bf2 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",
        "revdelete-uname-unhid": "lankide ezkutua erakutsi",
        "revdelete-restricted": "administratzaileentzako mugak ezarri dira",
        "revdelete-unrestricted": "administratzaileentzako mugak kendu dira",
+       "logentry-block-block": "administratzaileak $1 {{GENDER:$2|blocked}} {{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": "administratzaileak $1 {{GENDER:$2|blocked}} {{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..cc3107f 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",
        "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 8307d73..953d696 100644 (file)
        "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",
        "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)",
        "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-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..8f68f90 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",
        "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 abcda04..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.",
        "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..c13e35d 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",
index 113f209..83b38df 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.",
        "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",
        "revertmerge": "Desfacer a fusión",
        "mergelogpagetext": "A continuación hai unha lista coas fusións máis recentes do historial dunha páxina co doutra.",
        "history-title": "Historial de revisións de \"$1\"",
-       "difference-title": "Diferenzas entre revisións de \"$1\"",
-       "difference-title-multipage": "Diferenzas entre as páxinas \"$1\" e \"$2\"",
+       "difference-title": "Diferenzas entre revisións de «$1»",
+       "difference-title-multipage": "Diferenzas entre as páxinas «$1» e «$2»",
        "difference-multipage": "(Diferenzas entre páxinas)",
        "lineno": "Liña $1:",
        "compareselectedversions": "Comparar as versións seleccionadas",
        "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)",
        "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...",
        "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..535cec2 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": "પાનાનો ઇતિહાસ",
index f49313d..d468d32 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)",
        "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": "הוספת משוב לדף...",
        "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 b0ed3d2..7e86a58 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}} बार देखा गया है।",
index ea835c9..78103cf 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ć",
        "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 5611b47..59a7930 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",
index d5d575f..30d972b 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": "Էջի պատմություն",
        "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 515ac00..d8bb042 100644 (file)
@@ -13,7 +13,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Carlosedepaula",
-                       "Macofe"
+                       "Macofe",
+                       "Karmwiki"
                ]
        },
        "tog-underline": "Sublinear ligamines:",
        "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 de 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 de paginas non existente que ha redirectiones que liga verso illos, vide [[{{#special:BrokenRedirects}}]].",
+       "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]].",
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..044c4af 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-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 42b2234..cdaaeb1 100644 (file)
        "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.",
        "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.",
        "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",
        "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",
        "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ð",
index 12482b7..096a490 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):",
        "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: non sono in grado di postare il titolo del feedback desiderato.",
+       "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 bee8a3b..2be4063 100644 (file)
@@ -64,7 +64,8 @@
                        "SkyDaisy9",
                        "Los688",
                        "朝彦",
-                       "Otokoume"
+                       "Otokoume",
+                       "赤城。"
                ]
        },
        "tog-underline": "リンクの下線:",
        "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": "削除された履歴",
        "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": "ウォッチリスト",
        "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-reason": "理由:",
        "comparepages": "ページの比較",
        "compare-page1": "ページ 1",
        "compare-page2": "ページ 2",
index 06e5863..e509ee2 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|რეზულტატი|რეზულტატი}} გვერდზე",
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..8ff679e 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|жазба}} көрсету.",
        "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 7c18c02..04ac009 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": "비밀번호 재설정",
        "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",
        "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..ae07379 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ß",
        "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 c0536dd..3551085 100644 (file)
        "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.",
        "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..5b7c081 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",
        "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 df4b948..e2cb656 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": "چواشه کردن ویرایشتیا",
        "whatlinkshere-next": "{{جمی:$1|نهایی|نهایی $1}}",
        "whatlinkshere-links": "هوم پیوندیا",
        "whatlinkshere-hideredirs": "$1 واگردونیا",
-       "whatlinkshere-hidetrans": "$ا چن نتیجه یی",
+       "whatlinkshere-hidetrans": "$1 چن نتیجه یی",
        "whatlinkshere-hidelinks": "هوم پیوندیا $1",
        "whatlinkshere-hideimages": "فایل هوم پیوندیا $1",
        "whatlinkshere-filters": "فيلتريا",
        "ipb-otherblocks-header": "هنی{{PLURAL:$1|نهاگرتن|نهاگرتنیا}}",
        "unblock-hideuser": "‫سی یه که حساو کاریاری ای کاریار نهو بیه شما نمی تونیت ونه واز بکیت.‬",
        "ipb_cant_unblock": "خطا:نهاگری د نوم دیارکن $1 دیار نئ.شایت وه د ایسنی نهاگریش د بین رئته.",
-       "ipb_blocked_as_range": "خطا: تیرنشون آی‌ پی $1 سر راست نهاگری نبیه و نبوئه وازش بکیت.\nای تیرنشون واگرد پوشگر $ نهاگری بیه وا بیینی یه.",
+       "ipb_blocked_as_range": "خطا: تیرنشون آی‌ پی $1 سر راست نهاگری نبیه و نبوئه وازش بکیت.\nای تیرنشون واگرد پوشگر $ نهاگری بیه و بوئه وازش بکی.",
        "ip_range_invalid": "پوشگر نامعتور آی پی",
        "ip_range_toolarge": "نهاگری پوشینه یا گپتر $1/ مجاز نئ.",
        "proxyblocker": "قلف کننه پروکسی",
        "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-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-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": "خطا مینونه: د گاتی که شما د حال و بار تلاش سی سوارکرد جانیاتو بییت، یه گل اشتوا پیش اوما.",
        "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
-       "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد قر حرده",
+       "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد در حرده",
        "limitreport-title": "داده یا جانیاکار وااشکافت کار:",
        "limitreport-cputime": "گات وه کار گرتن سی پی یو",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "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|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
+       "expand_templates_preview_fail_html_anon": "<em>سی یه که{{SITENAME}} تا یه گل HTML خام کنشتیار و یه گل د دس رئتن دونسمنیا نشسجا هئ، پیش سیل وا داسون یه  احتیاطی ری وه ری چل کاریا جاوا نیسسه نهو بیه.</em>\n\n<strong>ار ای تلاش پیش سیل مشروعه، لطف بکیت د نو تلاش بکیت. ار هنی ئم کار نمی که، کوشایشت بکیت ری [[Special:UserLogout|اومائن وه در د سامونه]] بپورنیت و د نو روئیت وامین سامونه.",
        "pagelanguage": "بلگه انتخاو زون",
        "pagelang-name": "بلگه",
        "pagelang-language": "زون",
        "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 ('''ناکنشتگر بیه''')",
index a392ca1..f552593 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ą",
        "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 8f39d3d..f02af70 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",
index da7d2e9..3179cbe 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)",
        "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": "Го додавам искажаното мислење во страницата...",
        "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..be60e36 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": "ശ്രദ്ധിക്കുന്നവ",
        "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 31d47c4..696438b 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)",
        "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..",
        "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..2e761fc 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",
index f54cc78..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",
        "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 6e78ef2..b31b2aa 100644 (file)
        "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:बारेमा",
        "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*",
        "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": "फाइलनाम",
        "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": "आकारहरू",
        "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": "(डà¥\87à¤\9fाबà¥\87स à¤¸à¤°à¥\8dभर: $1 à¤¸à¤\81à¤\97 à¤¸à¤®à¥\8dपरà¥\8dà¤\95 à¤¸à¥\8dथापित à¤\97रà¥\8dन à¤¸à¤\95िà¤\8fन)",
        "dberr-info-hidden": "(डेटाबेसमा सम्पर्क स्थापना गर्न सकिएन)",
        "dberr-usegoogle": "तपाईले अहिले गुगलबाट खोज गर्न प्रयास गर्न सक्नुहुन्छ।",
        "dberr-outofdate": "कृपया स्मरणमा राख्नुहोस् हाम्रा लेखहरूको सूची जुन उनीहरूले राखेका छन् त्यो अद्यावधिक नहुन सक्छ ।",
        "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ले {{GENDER:$2|पुनर्स्थापित}} गरेको हो",
index 8cd9178..3d6735d 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",
        "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..6a6098b 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",
        "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 64a84f4..a630011 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",
        "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",
        "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 cade0ad..90a9efa 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": "مخونه جوړول",
        "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 ته ولېږدل شو.",
        "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..6fbc172 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}}]].",
        "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 3a0e736..2c28c8c 100644 (file)
        "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",
        "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)",
        "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...",
index 65792cd..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}}",
        "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}}",
        "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..0295c66 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",
        "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..71f0c18 100644 (file)
        "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..67e9d27 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": "Список наблюдения",
        "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..9cdc9f0 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 इति अनुवर्तमानः अस्ति ।",
        "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 ca59d02..9b286de 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": "Импортаа",
        "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": "Тирэх сирэй ыйыллыбыт аата алҕастаах.",
index 39bcc39..11d3f2f 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",
index 7fde9ab..6056a1d 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-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..cae219a 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",
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 56a2eed..1f7efc7 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)",
        "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 ...",
        "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 dfce20e..79b7d88 100644 (file)
        "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 a226dca..5d62903 100644 (file)
        "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..db56461 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-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..ab0b0da 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",
        "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..c4be101 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-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..2cfe460 100644 (file)
@@ -36,7 +36,8 @@
                        "아라",
                        "Kalyanasundar",
                        "தமிழ்த்தம்பி",
-                       "Macofe"
+                       "Macofe",
+                       "AntanO"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "upload_source_file": "(தங்களி்ன் கணினியிலிருந்து தங்களால் தேர்ந்தெடுக்கப்பட்ட கோப்பு)",
        "listfiles-summary": "இச்சிறப்புப் பக்கம் பதிவேற்றப்பட்ட கோப்புகளைப் பட்டியலிடுகிறது.",
        "listfiles_search_for": "பின்வரும் பெயருள்ள ஊடகக் கோப்பைத் தேடு:",
+       "listfiles-userdoesnotexist": "பயனர் கணக்கு \"$1\" பதியப்படவில்லை",
        "imgfile": "கோப்பு",
        "listfiles": "படிமங்களின் பட்டியல்",
        "listfiles_thumb": "நகம் அளவு சிறுபடம்",
index 9838a43..ebcdbfb 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": "పేజీ చరిత్ర",
index 44b6978..076825a 100644 (file)
        "revdelete-unsuppress": "Хотимаи маҳдудиятҳо дар мавриди нусхаҳои интихобшуда",
        "revdelete-log": "Сабаб:",
        "revdelete-submit": "Амалӣ кардан бар {{PLURAL:$1|нусхаи|нусхаҳои}} интихобшуда",
-       "revdelete-success": "<strong>Тағйири намоёнии нусха бо муваффақият анҷом шуд.</strong>",
+       "revdelete-success": "Тағйири намоёнии нусха бо муваффақият анҷом шуд.",
        "logdelete-success": "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
        "revdel-restore": "Тағйири падидорӣ",
        "pagehist": "Таърихи саҳифа",
index 33c7d5c..987b155 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": "รูปย่อ",
index fbe35b5..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",
        "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 1d209d9..e3d1e0e 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": "(запис журналу вилучений)",
        "right-upload": "завантаження файлів",
        "right-reupload": "перезаписування існуючих файлів",
        "right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
-       "right-reupload-shared": "Ð\9fідміна файлів зі спільного сховища локальними",
+       "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-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": "Ð\92илучення сторінок",
+       "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": "перегляд приватних журналів",
-       "right-block": "Ð\97аборона редагувань для інших дописувачів",
-       "right-blockemail": "Блокування користувачам надсилання електронної пошти",
-       "right-hideuser": "Ð\91локування імені користувача і приховування його",
-       "right-ipblock-exempt": "Уникнення блокування за IP-адресою, автоблокування і блокування діапазонів",
-       "right-proxyunbannable": "Уникнення автоматичного блокування проксі-серверів",
+       "right-block": "заборона редагувань для інших дописувачів",
+       "right-blockemail": "Блокувати користувача від надсилання електронної",
+       "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-editinterface": "редагування інтерфейсу користувача",
+       "right-editusercssjs": "редагування CSS- і JS-файлів інших користувачів",
+       "right-editusercss": "редагування CSS-файлів інших користувачів",
+       "right-edituserjs": "редагування JS-файлів інших користувачів",
        "right-editmyusercss": "редагування власних CSS-файлів користувача",
        "right-editmyuserjs": "редагування власних JavaScript-файлів користувача",
        "right-viewmywatchlist": "перегляд власного списку спостереження",
        "right-viewmyprivateinfo": "перегляд власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
        "right-editmyprivateinfo": "редагування власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
        "right-editmyoptions": "редагування власних налаштувань",
-       "right-rollback": "Швидкий відкіт редагувань останнього користувача, який редагував сторінку",
-       "right-markbotedits": "Ð\9fозначення відкинутих редагувань як редагування бота",
+       "right-rollback": "швидкий відкіт редагувань останнього користувача, який редагував сторінку",
+       "right-markbotedits": "позначення відкинутих редагувань як редагування бота",
        "right-noratelimit": "нема обмежень за швидкістю",
-       "right-import": "Імпорт сторінок з інших вікі",
+       "right-import": "імпорт сторінок з інших вікі",
        "right-importupload": "Імпорт сторінок через завантаження файлів",
-       "right-patrol": "Ð\9fозначення редагувань патрульованими",
+       "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": "Мініатюра",
        "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..629b9f5 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": "×\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:באניצער־מעלדונג",
index d1a9784..cb627d7 100644 (file)
        "emailccsubject": "你畀$1: $2封信嘅副本",
        "emailsent": "電郵已傳送",
        "emailsenttext": "你嘅電郵信息已傳送。",
-       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「電郵用戶」功能發出嘅。",
+       "emailuserfooter": "呢封電郵係由$1寄畀$2經{{SITENAME}}嘅「{{int:emailpage}}」功能發出嘅。",
        "usermessage-summary": "留低系統訊息。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視名單",
        "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": "由其它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儲存喺你部電腦度,然後再上載到呢度。",
        "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個修訂",
+       "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-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-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-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": "編輯原始監視清單",
        "version-hook-name": "鈎名",
        "version-hook-subscribedby": "利用於",
        "version-version": "($1)",
+       "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": "搵重覆",
        "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版",
        "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": "呢個特別頁係用於將一啲文字中嘅模展開,包括響個模度引用嘅模。\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 846c6ff..57fa7b1 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)",
        "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": "正在添加反馈至页面...",
        "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..8426fbe 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": "已刪除歷史",
        "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 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 98c2ba3..cb52c1a 100644 (file)
@@ -22,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             => 'کومک',
@@ -32,10 +32,16 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'تهر_ئی_گپ',
 );
 
+$namespaceAliases = array(
+       'میڈیا' => NS_MEDIA,
+       'اکس' => NS_FILE,
+       'اکس_ئی_گپ' => NS_FILE_TALK,
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'پئالین_کارمرزوکان' ),
        'Allmessages'               => array( 'موچین_پیامان' ),
-       'AllMyUploads'              => array( 'ني_موچین_ایرگیج_ئآن', 'ني_موچین_وّرک_ئآن' ),
+       'AllMyUploads'              => array( 'نی_موچین_ایرگیج_ئآن', 'نی_موچین_وّرک_ئآن' ),
        'Allpages'                  => array( 'موچین_تاکدیمان' ),
        'ApiHelp'                   => array( 'ای_پی_آی_کومک' ),
        'Ancientpages'              => array( 'کوهنگین_تاکدیمان' ),
@@ -55,4 +61,95 @@ $specialPageAliases = 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 ada5dc2..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(
@@ -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 a8dbd5f..f97f6dc 100644 (file)
@@ -1106,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 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..4a2d9fb 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
+私隱 隐私
+格林美獎   格莱美奖
+葛萊美獎   格莱美奖
+史丹福      斯坦福
+賈伯斯      乔布斯
+波里活      宝莱坞
+庫德族      库尔德族
+庫德人      库尔德人
\ No newline at end of file
index c31d232..a4e4901 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
+硅藻 硅藻
+格莱美奖   格林美獎
+葛萊美獎   格林美獎
+斯坦福      史丹福
+賈伯斯      喬布斯
+宝莱坞      波里活
+寶萊塢      波里活
+庫德族      库爾德族
+庫德人      库爾德人
\ 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..bcd8492 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
+硅藻 硅藻
+格林美獎   葛萊美獎
+格莱美奖   葛萊美獎
+乔布斯      賈伯斯
+波里活      寶萊塢
+库尔德族   庫德族
+库尔德人   庫德人
\ No newline at end of file
index 7fc60c7..9157e3f 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
+曲酒 麯酒
+泸州大曲   瀘州大麯  #商標名
+洋河大曲   洋河大麯
+沟大曲      溝大麯
+朱砂 硃砂
+银朱 銀硃
+喲喂 喲喂
+鳥栖 鳥栖
+澄江县      澂江縣 #以下為含異體字地名
+横峰县      橫峯縣
+鹤峰县      鶴峯縣
+五峰县      五峯縣
+兰溪市      蘭谿市
+金溪县      金谿縣
+竹溪县      竹谿縣
+辰溪县      辰谿縣
+松溪县      松谿縣
+慈溪 慈谿
+浚州 濬州
+浚县 濬縣
+穆棱 穆稜
+绥棱 綏稜
+丹棱 丹稜
+仙游 仙遊
+麟游 麟遊
+乐游原      樂遊原
+托克逊      託克遜
+托里县      託里縣
+沾化 霑化
+沾益 霑益
+岫岩 岫巖
+黄岩县      黃巖縣
+黄岩区      黃巖區
+北仑河      北崙河
+昆嵛 崑嵛
+昆承湖      崑承湖
+灵昆 靈崑
+龙岩 龍巖
+扑冬 撲鼕
+冬冬鼓      鼕鼕鼓
\ No newline at end of file
index f76a949..f202c9d 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,46 +769,24 @@ 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脖|
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 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 e56d557..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',
@@ -1268,6 +1269,7 @@ return array(
                'dependencies' => array(
                        'mediawiki.util',
                        'mediawiki.language',
+                       'dom-level2-shim',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1401,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',
        ),
@@ -1680,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 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..bf3cedf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-bell {
        background-image: url("themes/mediawiki/images/icons/bell.png");
index c6800f5..80de362 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-article {
        background-image: url("themes/mediawiki/images/icons/article-ltr.png");
index fd4c009..bacc878 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .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..654562c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-edit {
        background-image: url("themes/mediawiki/images/icons/edit-ltr.png");
index e9edf16..8f90358 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-indent {
        background-image: url("themes/mediawiki/images/icons/indent-ltr.png");
index 562701a..fa5a369 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .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..70c354d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-beta {
        background-image: url("themes/mediawiki/images/icons/beta.png");
index 97ff08b..4d7c676 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-stripeFlow {
        background-image: url("themes/mediawiki/images/icons/stripeFlow-ltr.png");
index ef4b991..bb4eed9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-map {
        background-image: url("themes/mediawiki/images/icons/map-ltr.png");
index 2c34631..d67a180 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-image {
        background-image: url("themes/mediawiki/images/icons/image-ltr.png");
index e80d325..d04cccd 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-block {
        background-image: url("themes/mediawiki/images/icons/block.png");
index c93ead8..0285d2e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-arrowNext {
        background-image: url("themes/mediawiki/images/icons/arrow-ltr.png");
index 096ae08..aa06d4b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-userActive {
        background-image: url("themes/mediawiki/images/icons/userActive-ltr.png");
index afbb610..b9d36bf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
 .oo-ui-icon-logoCC {
        background-image: url("themes/mediawiki/images/icons/logo-cc.png");
index afef7bf..41e2f88 100644 (file)
@@ -1,19 +1,13 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
-.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%;
index cfca47b..76093dd 100644 (file)
@@ -1,19 +1,13 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:13Z
  */
-.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%;
        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..1a8d8b6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:06Z
  */
 /**
  * @class
index ccedf60..f46dd07 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.7
+ * OOjs UI v0.9.8
  * 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-12T17:19:06Z
  */
 ( function ( OO ) {
 
@@ -3340,13 +3340,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 +3390,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 +3401,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 +3423,7 @@ OO.ui.Error.prototype.getMessage = function () {
 };
 
 /**
- * Get error message as text.
+ * Get the error message text.
  *
  * @return {string} Error message
  */
@@ -7520,7 +7543,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 );
  *     };
@@ -8596,9 +8619,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();
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/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 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 e526d47..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;
 }
 
index dffc6e8..f5aeb3f 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
+        *
+        * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.26.
         */
 
-       // 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] ) {
+       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 ) {
+       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, 'importScript', importScript, msg );
+       mw.log.deprecate( win, 'importScriptURI', importScriptURI, msg );
+       mw.log.deprecate( win, 'importStylesheet', importStylesheet, msg );
+       mw.log.deprecate( win, 'importStylesheetURI', importStylesheetURI, msg );
 
 }( 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 d940100..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:
         *
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 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 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 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' ) ),
+               );
+       }
 }
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 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 03aaf4a..3c44b55 100644 (file)
         * </code>
         */
        QUnit.newMwEnvironment = ( function () {
-               var warn, log, liveConfig, liveMessages;
+               var warn, log, liveConfig, liveMessages,
+                       ajaxRequests = [];
 
                liveConfig = mw.config.values;
                liveMessages = mw.messages.values;
                        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();
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';