aboutsummaryrefslogtreecommitdiffstats
path: root/includes/api
diff options
context:
space:
mode:
Diffstat (limited to 'includes/api')
-rw-r--r--includes/api/ApiBase.php51
-rw-r--r--includes/api/ApiBlock.php20
-rw-r--r--includes/api/ApiBlockInfoHelper.php123
-rw-r--r--includes/api/ApiBlockInfoTrait.php60
-rw-r--r--includes/api/ApiEditPage.php5
-rw-r--r--includes/api/ApiMain.php3
-rw-r--r--includes/api/ApiMessageTrait.php8
-rw-r--r--includes/api/ApiOptionsBase.php5
-rw-r--r--includes/api/ApiQuery.php3
-rw-r--r--includes/api/ApiQueryCategories.php43
-rw-r--r--includes/api/ApiQueryCategoryMembers.php15
-rw-r--r--includes/api/ApiQueryInfo.php12
-rw-r--r--includes/api/ApiQuerySiteinfo.php39
-rw-r--r--includes/api/ApiUnblock.php22
-rw-r--r--includes/api/Hook/ApiOptionsHook.php2
-rw-r--r--includes/api/i18n/ar.json1
-rw-r--r--includes/api/i18n/be-tarask.json4
-rw-r--r--includes/api/i18n/br.json8
-rw-r--r--includes/api/i18n/de.json1
-rw-r--r--includes/api/i18n/en.json1
-rw-r--r--includes/api/i18n/es.json4
-rw-r--r--includes/api/i18n/fa.json1
-rw-r--r--includes/api/i18n/fr.json1
-rw-r--r--includes/api/i18n/gl.json1
-rw-r--r--includes/api/i18n/he.json3
-rw-r--r--includes/api/i18n/ia.json1
-rw-r--r--includes/api/i18n/ja.json2
-rw-r--r--includes/api/i18n/lij.json1
-rw-r--r--includes/api/i18n/nb.json1
-rw-r--r--includes/api/i18n/nl.json1
-rw-r--r--includes/api/i18n/pa.json2
-rw-r--r--includes/api/i18n/pl.json1
-rw-r--r--includes/api/i18n/ps.json3
-rw-r--r--includes/api/i18n/pt-br.json1
-rw-r--r--includes/api/i18n/pt.json1
-rw-r--r--includes/api/i18n/qqq.json1
-rw-r--r--includes/api/i18n/ru.json1
-rw-r--r--includes/api/i18n/sl.json5
-rw-r--r--includes/api/i18n/tr.json1
-rw-r--r--includes/api/i18n/udm.json3
-rw-r--r--includes/api/i18n/uk.json1
-rw-r--r--includes/api/i18n/zh-hans.json1
-rw-r--r--includes/api/i18n/zh-hant.json1
43 files changed, 241 insertions, 223 deletions
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 6ef7f8741bbe..6980b2d2023b 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -35,7 +35,6 @@ use MediaWiki\MediaWikiServices;
use MediaWiki\Message\Message;
use MediaWiki\Page\PageIdentity;
use MediaWiki\ParamValidator\TypeDef\NamespaceDef;
-use MediaWiki\Permissions\Authority;
use MediaWiki\Permissions\PermissionManager;
use MediaWiki\Permissions\PermissionStatus;
use MediaWiki\Registration\ExtensionRegistry;
@@ -75,8 +74,6 @@ use WikiPage;
*/
abstract class ApiBase extends ContextSource {
- use ApiBlockInfoTrait;
-
/** @var HookContainer */
private $hookContainer;
@@ -267,17 +264,6 @@ abstract class ApiBase extends ContextSource {
/** @var stdClass[][] Cache for self::filterIDs() */
private static $filterIDsCache = [];
- /** @var array Map of web UI block messages which magically gain machine-readable block info */
- private const BLOCK_CODE_MAP = [
- 'blockedtext' => true,
- 'blockedtext-partial' => true,
- 'autoblockedtext' => true,
- 'systemblockedtext' => true,
- 'blockedtext-composite' => true,
- 'blockedtext-tempuser' => true,
- 'autoblockedtext-tempuser' => true,
- ];
-
/** @var array Map of web UI block messages to corresponding API messages and codes */
private const MESSAGE_CODE_MAP = [
'actionthrottled' => [ 'apierror-ratelimited', 'ratelimited' ],
@@ -1377,35 +1363,6 @@ abstract class ApiBase extends ContextSource {
}
/**
- * Add block info to block messages in a Status
- * @since 1.33
- * @internal since 1.37, should become protected in the future.
- * @param StatusValue $status
- * @param Authority|null $user
- */
- public function addBlockInfoToStatus( StatusValue $status, ?Authority $user = null ) {
- if ( $status instanceof PermissionStatus ) {
- $block = $status->getBlock();
- } else {
- $user = $user ?: $this->getAuthority();
- $block = $user->getBlock();
- }
-
- if ( !$block ) {
- return;
- }
- foreach ( $status->getMessages() as $msg ) {
- if ( isset( self::BLOCK_CODE_MAP[$msg->getKey()] ) ) {
- $status->replaceMessage( $msg->getKey(), ApiMessage::create(
- Message::newFromSpecifier( $msg ),
- $this->getBlockCode( $block ),
- [ 'blockinfo' => $this->getBlockDetails( $block ) ]
- ) );
- }
- }
- }
-
- /**
* Call wfTransactionalTimeLimit() if this request was POSTed.
*
* @since 1.26
@@ -1601,11 +1558,7 @@ abstract class ApiBase extends ContextSource {
$this->getRequest()->getIP()
);
- $this->dieWithError(
- $msg,
- $this->getBlockCode( $block ),
- [ 'blockinfo' => $this->getBlockDetails( $block ) ]
- );
+ $this->dieWithError( $msg );
}
/**
@@ -1650,8 +1603,6 @@ abstract class ApiBase extends ContextSource {
$status = $newStatus;
}
- $this->addBlockInfoToStatus( $status );
-
throw new ApiUsageException( $this, $status );
}
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index c37b57cb5d5e..f1ac59a79574 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -25,9 +25,10 @@ namespace MediaWiki\Api;
use MediaWiki\Block\AbstractBlock;
use MediaWiki\Block\BlockActionInfo;
use MediaWiki\Block\BlockPermissionCheckerFactory;
+use MediaWiki\Block\BlockTarget;
+use MediaWiki\Block\BlockTargetFactory;
use MediaWiki\Block\BlockUser;
use MediaWiki\Block\BlockUserFactory;
-use MediaWiki\Block\BlockUtils;
use MediaWiki\Block\DatabaseBlock;
use MediaWiki\Block\DatabaseBlockStore;
use MediaWiki\Block\Restriction\ActionRestriction;
@@ -41,7 +42,6 @@ use MediaWiki\Status\Status;
use MediaWiki\Title\Title;
use MediaWiki\Title\TitleFactory;
use MediaWiki\User\Options\UserOptionsLookup;
-use MediaWiki\User\UserIdentity;
use MediaWiki\User\UserIdentityLookup;
use MediaWiki\Watchlist\WatchedItemStoreInterface;
use MediaWiki\Watchlist\WatchlistManager;
@@ -64,9 +64,9 @@ class ApiBlock extends ApiBase {
private TitleFactory $titleFactory;
private UserIdentityLookup $userIdentityLookup;
private WatchedItemStoreInterface $watchedItemStore;
- private BlockUtils $blockUtils;
private BlockActionInfo $blockActionInfo;
private DatabaseBlockStore $blockStore;
+ private BlockTargetFactory $blockTargetFactory;
public function __construct(
ApiMain $main,
@@ -76,7 +76,7 @@ class ApiBlock extends ApiBase {
TitleFactory $titleFactory,
UserIdentityLookup $userIdentityLookup,
WatchedItemStoreInterface $watchedItemStore,
- BlockUtils $blockUtils,
+ BlockTargetFactory $blockTargetFactory,
BlockActionInfo $blockActionInfo,
DatabaseBlockStore $blockStore,
WatchlistManager $watchlistManager,
@@ -89,7 +89,7 @@ class ApiBlock extends ApiBase {
$this->titleFactory = $titleFactory;
$this->userIdentityLookup = $userIdentityLookup;
$this->watchedItemStore = $watchedItemStore;
- $this->blockUtils = $blockUtils;
+ $this->blockTargetFactory = $blockTargetFactory;
$this->blockActionInfo = $blockActionInfo;
$this->blockStore = $blockStore;
@@ -127,12 +127,13 @@ class ApiBlock extends ApiBase {
$status = $this->updateBlock( $block, $params );
} else {
if ( $params['user'] !== null ) {
- $target = $params['user'];
+ $target = $this->blockTargetFactory->newFromUser( $params['user'] );
} else {
- $target = $this->userIdentityLookup->getUserIdentityByUserId( $params['userid'] );
- if ( !$target ) {
+ $targetUser = $this->userIdentityLookup->getUserIdentityByUserId( $params['userid'] );
+ if ( !$targetUser ) {
$this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
}
+ $target = $this->blockTargetFactory->newUserBlockTarget( $targetUser );
}
if ( $params['newblock'] ) {
$status = $this->insertBlock( $target, $params );
@@ -289,7 +290,7 @@ class ApiBlock extends ApiBase {
/**
* Insert a block
*
- * @param UserIdentity|string $target
+ * @param BlockTarget $target
* @param array $params
* @return Status
*/
@@ -320,6 +321,7 @@ class ApiBlock extends ApiBase {
'user' => [
ParamValidator::PARAM_TYPE => 'user',
UserDef::PARAM_ALLOWED_USER_TYPES => [ 'name', 'ip', 'temp', 'cidr', 'id' ],
+ UserDef::PARAM_RETURN_OBJECT => true,
],
'userid' => [
ParamValidator::PARAM_TYPE => 'integer',
diff --git a/includes/api/ApiBlockInfoHelper.php b/includes/api/ApiBlockInfoHelper.php
new file mode 100644
index 000000000000..ad0fcf8814f7
--- /dev/null
+++ b/includes/api/ApiBlockInfoHelper.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+namespace MediaWiki\Api;
+
+use MediaWiki\Block\AbstractBlock;
+use MediaWiki\Block\Block;
+use MediaWiki\Block\CompositeBlock;
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Block\SystemBlock;
+use MediaWiki\Language\Language;
+use MediaWiki\User\UserIdentity;
+use MediaWiki\Utils\MWTimestamp;
+
+/**
+ * Helper class for API modules that display block information. Intended for use via
+ * composition.
+ *
+ * @ingroup API
+ * @since 1.44
+ */
+class ApiBlockInfoHelper {
+
+ /**
+ * Get basic info about a given block
+ *
+ * @return array Array containing several keys:
+ * - blockid - ID of the block
+ * - blockedby - username of the blocker
+ * - blockedbyid - user ID of the blocker
+ * - blockreason - reason provided for the block
+ * - blockedtimestamp - timestamp for when the block was placed/modified
+ * - blockedtimestampformatted - blockedtimestamp, formatted for the current locale
+ * - blockexpiry - expiry time of the block
+ * - blockexpiryformatted - blockexpiry formatted for the current locale, omitted if infinite
+ * - blockexpiryrelative - relative time to blockexpiry (e.g. 'in 5 days'), omitted if infinite
+ * - blockpartial - block only applies to certain pages, namespaces and/or actions
+ * - systemblocktype - system block type, if any
+ * - blockcomponents - If the block is a composite block, this will be an array of block
+ * info arrays
+ */
+ public function getBlockDetails(
+ Block $block,
+ Language $language,
+ UserIdentity $user
+ ) {
+ $blocker = $block->getBlocker();
+
+ $vals = [];
+ $vals['blockid'] = $block->getId();
+ $vals['blockedby'] = $blocker ? $blocker->getName() : '';
+ $vals['blockedbyid'] = $blocker ? $blocker->getId() : 0;
+ $vals['blockreason'] = $block->getReasonComment()
+ ->message->inLanguage( $language )->plain();
+ $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->getTimestamp() );
+ $expiry = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
+ $vals['blockexpiry'] = $expiry;
+ $vals['blockpartial'] = !$block->isSitewide();
+ $vals['blocknocreate'] = $block->isCreateAccountBlocked();
+ $vals['blockanononly'] = !$block->isHardblock();
+ if ( $block instanceof AbstractBlock ) {
+ $vals['blockemail'] = $block->isEmailBlocked();
+ $vals['blockowntalk'] = !$block->isUsertalkEditAllowed();
+ }
+
+ // Formatted timestamps
+ $vals['blockedtimestampformatted'] = $language->formatExpiry(
+ $block->getTimestamp(), true, 'infinity', $user
+ );
+ if ( $expiry !== 'infinite' ) {
+ $vals['blockexpiryformatted'] = $language->formatExpiry(
+ $expiry, true, 'infinity', $user
+ );
+ $vals['blockexpiryrelative'] = $language->getHumanTimestamp(
+ new MWTimestamp( $expiry ), new MWTimestamp(), $user
+ );
+ }
+
+ if ( $block instanceof SystemBlock ) {
+ $vals['systemblocktype'] = $block->getSystemBlockType();
+ }
+
+ if ( $block instanceof CompositeBlock ) {
+ $components = [];
+ foreach ( $block->getOriginalBlocks() as $singleBlock ) {
+ $components[] = $this->getBlockDetails( $singleBlock, $language, $user );
+ }
+ $vals['blockcomponents'] = $components;
+ }
+
+ return $vals;
+ }
+
+ /**
+ * Get the API error code, to be used in ApiMessage::create or ApiBase::dieWithError
+ * @param Block $block
+ * @return string
+ */
+ public function getBlockCode( Block $block ): string {
+ if ( $block instanceof DatabaseBlock && $block->getType() === Block::TYPE_AUTO ) {
+ return 'autoblocked';
+ }
+ return 'blocked';
+ }
+
+}
diff --git a/includes/api/ApiBlockInfoTrait.php b/includes/api/ApiBlockInfoTrait.php
index 86e1c32753eb..467622d4f88b 100644
--- a/includes/api/ApiBlockInfoTrait.php
+++ b/includes/api/ApiBlockInfoTrait.php
@@ -20,14 +20,9 @@
namespace MediaWiki\Api;
-use MediaWiki\Block\AbstractBlock;
use MediaWiki\Block\Block;
-use MediaWiki\Block\CompositeBlock;
-use MediaWiki\Block\DatabaseBlock;
-use MediaWiki\Block\SystemBlock;
use MediaWiki\Language\Language;
use MediaWiki\User\UserIdentity;
-use MediaWiki\Utils\MWTimestamp;
/**
* @ingroup API
@@ -57,54 +52,8 @@ trait ApiBlockInfoTrait {
Block $block,
$language = null
) {
- $language ??= $this->getLanguage();
-
- $blocker = $block->getBlocker();
-
- $vals = [];
- $vals['blockid'] = $block->getId();
- $vals['blockedby'] = $blocker ? $blocker->getName() : '';
- $vals['blockedbyid'] = $blocker ? $blocker->getId() : 0;
- $vals['blockreason'] = $block->getReasonComment()
- ->message->inLanguage( $language )->plain();
- $vals['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $block->getTimestamp() );
- $expiry = ApiResult::formatExpiry( $block->getExpiry(), 'infinite' );
- $vals['blockexpiry'] = $expiry;
- $vals['blockpartial'] = !$block->isSitewide();
- $vals['blocknocreate'] = $block->isCreateAccountBlocked();
- $vals['blockanononly'] = !$block->isHardblock();
- if ( $block instanceof AbstractBlock ) {
- $vals['blockemail'] = $block->isEmailBlocked();
- $vals['blockowntalk'] = !$block->isUsertalkEditAllowed();
- }
-
- $user = $this->getUser();
- // Formatted timestamps
- $vals['blockedtimestampformatted'] = $language->formatExpiry(
- $block->getTimestamp(), true, 'infinity', $user
- );
- if ( $expiry !== 'infinite' ) {
- $vals['blockexpiryformatted'] = $language->formatExpiry(
- $expiry, true, 'infinity', $user
- );
- $vals['blockexpiryrelative'] = $language->getHumanTimestamp(
- new MWTimestamp( $expiry ), new MWTimestamp(), $user
- );
- }
-
- if ( $block instanceof SystemBlock ) {
- $vals['systemblocktype'] = $block->getSystemBlockType();
- }
-
- if ( $block instanceof CompositeBlock ) {
- $components = [];
- foreach ( $block->getOriginalBlocks() as $singleBlock ) {
- $components[] = $this->getBlockDetails( $singleBlock, $language );
- }
- $vals['blockcomponents'] = $components;
- }
-
- return $vals;
+ return ( new ApiBlockInfoHelper )->getBlockDetails(
+ $block, $language ?? $this->getLanguage(), $this->getUser() );
}
/**
@@ -113,10 +62,7 @@ trait ApiBlockInfoTrait {
* @return string
*/
private function getBlockCode( Block $block ): string {
- if ( $block instanceof DatabaseBlock && $block->getType() === Block::TYPE_AUTO ) {
- return 'autoblocked';
- }
- return 'blocked';
+ return ( new ApiBlockInfoHelper )->getBlockCode( $block );
}
// region Methods required from ApiBase
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index 3ed3cba5958c..cf4ce46b32de 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -641,11 +641,6 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_IMAGE_REDIRECT_LOGGED:
$status->fatal( 'apierror-noimageredirect' );
break;
- case EditPage::AS_CONTENT_TOO_BIG:
- case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
- $status->fatal( 'apierror-contenttoobig',
- $this->getConfig()->get( MainConfigNames::MaxArticleSize ) );
- break;
case EditPage::AS_READ_ONLY_PAGE_ANON:
$status->fatal( 'apierror-noedit-anon' );
break;
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index dbb2bfa0082b..e28a7c94317f 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -333,7 +333,7 @@ class ApiMain extends ApiBase {
'TitleFactory',
'UserIdentityLookup',
'WatchedItemStore',
- 'BlockUtils',
+ 'BlockTargetFactory',
'BlockActionInfo',
'DatabaseBlockStore',
'WatchlistManager',
@@ -350,6 +350,7 @@ class ApiMain extends ApiBase {
'WatchlistManager',
'UserOptionsLookup',
'DatabaseBlockStore',
+ 'BlockTargetFactory',
]
],
'move' => [
diff --git a/includes/api/ApiMessageTrait.php b/includes/api/ApiMessageTrait.php
index 3cc2a6720dc5..8f796101ce2b 100644
--- a/includes/api/ApiMessageTrait.php
+++ b/includes/api/ApiMessageTrait.php
@@ -35,6 +35,7 @@ trait ApiMessageTrait {
* Compatibility code mappings for various MW messages.
* @todo Ideally anything relying on this should be changed to use ApiMessage.
* @var string[]
+ * @phpcs-require-sorted-array
*/
protected static $messageMap = [
'actionthrottledtext' => 'ratelimited',
@@ -54,14 +55,14 @@ trait ApiMessageTrait {
'cantrollback' => 'onlyauthor',
'confirmedittext' => 'confirmemail',
'content-not-allowed-here' => 'contentnotallowedhere',
- 'deleteprotected' => 'cantedit',
'delete-toobig' => 'bigdelete',
+ 'deleteprotected' => 'cantedit',
'edit-conflict' => 'editconflict',
'imagenocrossnamespace' => 'nonfilenamespace',
'imagetypemismatch' => 'filetypemismatch',
+ 'import-noarticle' => 'badinterwiki',
'importbadinterwiki' => 'badinterwiki',
'importcantopen' => 'cantopenfile',
- 'import-noarticle' => 'badinterwiki',
'importnofile' => 'nofile',
'importuploaderrorpartial' => 'partialupload',
'importuploaderrorsize' => 'filetoobig',
@@ -71,6 +72,7 @@ trait ApiMessageTrait {
'ipb_cant_unblock' => 'cantunblock',
'ipb_expiry_invalid' => 'invalidexpiry',
'ip_range_invalid' => 'invalidrange',
+ 'longpageerror' => 'contenttoobig',
'mailnologin' => 'cantsend',
'markedaspatrollederror-noautopatrol' => 'noautopatrol',
'movenologintext' => 'cantmove-anon',
@@ -94,8 +96,8 @@ trait ApiMessageTrait {
'systemblockedtext' => 'blocked',
'titleprotected' => 'protectedtitle',
'undo-failure' => 'undofailure',
- 'userrights-nodatabase' => 'nosuchdatabase',
'userrights-no-interwiki' => 'nointerwikiuserrights',
+ 'userrights-nodatabase' => 'nosuchdatabase',
];
/** @var string|null */
diff --git a/includes/api/ApiOptionsBase.php b/includes/api/ApiOptionsBase.php
index 0d49050ec423..d967e0c5ccc5 100644
--- a/includes/api/ApiOptionsBase.php
+++ b/includes/api/ApiOptionsBase.php
@@ -53,9 +53,6 @@ abstract class ApiOptionsBase extends ApiBase {
/** @var string[]|null */
private $prefsKinds;
- /** @var array */
- private $params;
-
public function __construct(
ApiMain $main,
string $action,
@@ -304,7 +301,7 @@ abstract class ApiOptionsBase extends ApiBase {
/**
* Reset preferences of the specified kinds
*
- * @param string[] $kinds One or more types returned by UserOptionsManager::listOptionKinds() or 'all'
+ * @param string[] $kinds One or more types returned by PreferencesFactory::listResetKinds() or 'all'
*/
abstract protected function resetPreferences( array $kinds );
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 63362c947965..236df4f14f14 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -545,7 +545,8 @@ class ApiQuery extends ApiBase {
'DBLoadBalancer',
'ReadOnlyMode',
'UrlUtils',
- 'TempUserConfig'
+ 'TempUserConfig',
+ 'GroupPermissionsLookup',
]
],
'userinfo' => [
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index 9fa49b1b96f7..f983370b1597 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -22,6 +22,7 @@
namespace MediaWiki\Api;
+use MediaWiki\MainConfigNames;
use MediaWiki\Title\Title;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\ParamValidator\TypeDef\IntegerDef;
@@ -33,8 +34,13 @@ use Wikimedia\ParamValidator\TypeDef\IntegerDef;
*/
class ApiQueryCategories extends ApiQueryGeneratorBase {
+ private int $migrationStage;
+
public function __construct( ApiQuery $query, string $moduleName ) {
parent::__construct( $query, $moduleName, 'cl' );
+ $this->migrationStage = $query->getConfig()->get(
+ MainConfigNames::CategoryLinksSchemaMigrationStage
+ );
}
public function execute() {
@@ -62,15 +68,22 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
$prop = array_fill_keys( (array)$params['prop'], true );
$show = array_fill_keys( (array)$params['show'], true );
- $this->addFields( [
- 'cl_from',
- 'cl_to'
- ] );
-
$this->addFieldsIf( [ 'cl_sortkey', 'cl_sortkey_prefix' ], isset( $prop['sortkey'] ) );
$this->addFieldsIf( 'cl_timestamp', isset( $prop['timestamp'] ) );
$this->addTables( 'categorylinks' );
+ if ( $this->migrationStage & SCHEMA_COMPAT_READ_OLD ) {
+ $titleField = 'cl_to';
+ } else {
+ $this->addTables( 'linktarget' );
+ $this->addJoinConds( [ 'linktarget' => [ 'JOIN', 'cl_target_id = lt_id ' ] ] );
+ $this->addWhere( [ 'lt_namespace' => NS_CATEGORY ] );
+ $titleField = 'lt_title';
+ }
+ $this->addFields( [
+ 'cl_from',
+ $titleField
+ ] );
$this->addWhereFld( 'cl_from', array_keys( $pages ) );
if ( $params['categories'] ) {
$cats = [];
@@ -86,7 +99,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
// No titles so no results
return;
}
- $this->addWhereFld( 'cl_to', $cats );
+ $this->addWhereFld( $titleField, $cats );
}
if ( $params['continue'] !== null ) {
@@ -95,7 +108,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
$op = $params['dir'] == 'descending' ? '<=' : '>=';
$this->addWhere( $db->buildComparison( $op, [
'cl_from' => $cont[0],
- 'cl_to' => $cont[1],
+ $titleField => $cont[1],
] ) );
}
@@ -109,7 +122,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
$this->addJoinConds( [
'page' => [ 'LEFT JOIN', [
'page_namespace' => NS_CATEGORY,
- 'page_title = cl_to' ] ],
+ 'page_title = ' . $titleField ] ],
'page_props' => [ 'LEFT JOIN', [
'pp_page=page_id',
'pp_propname' => 'hiddencat' ] ]
@@ -124,11 +137,11 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
// Don't order by cl_from if it's constant in the WHERE clause
if ( count( $pages ) === 1 ) {
- $this->addOption( 'ORDER BY', 'cl_to' . $sort );
+ $this->addOption( 'ORDER BY', $titleField . $sort );
} else {
$this->addOption( 'ORDER BY', [
'cl_from' . $sort,
- 'cl_to' . $sort
+ $titleField . $sort
] );
}
$this->addOption( 'LIMIT', $params['limit'] + 1 );
@@ -141,11 +154,11 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
- $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
+ $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->$titleField );
break;
}
- $title = Title::makeTitle( NS_CATEGORY, $row->cl_to );
+ $title = Title::makeTitle( NS_CATEGORY, $row->$titleField );
$vals = [];
ApiQueryBase::addTitleInfo( $vals, $title );
if ( isset( $prop['sortkey'] ) ) {
@@ -161,7 +174,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
$fit = $this->addPageSubItem( $row->cl_from, $vals );
if ( !$fit ) {
- $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
+ $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->$titleField );
break;
}
}
@@ -171,11 +184,11 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
if ( ++$count > $params['limit'] ) {
// We've reached the one extra which shows that
// there are additional pages to be had. Stop here...
- $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->cl_to );
+ $this->setContinueEnumParameter( 'continue', $row->cl_from . '|' . $row->$titleField );
break;
}
- $titles[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
+ $titles[] = Title::makeTitle( NS_CATEGORY, $row->$titleField );
}
$resultPageSet->populateFromTitles( $titles );
}
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index f0314e686a97..18b86e6c8737 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -37,6 +37,7 @@ use Wikimedia\ParamValidator\TypeDef\IntegerDef;
class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
private Collation $collation;
+ private int $migrationStage;
public function __construct(
ApiQuery $query,
@@ -45,6 +46,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
) {
parent::__construct( $query, $moduleName, 'cm' );
$this->collation = $collationFactory->getCategoryCollation();
+ $this->migrationStage = $query->getConfig()->get(
+ MainConfigNames::CategoryLinksSchemaMigrationStage
+ );
}
public function execute() {
@@ -100,8 +104,17 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
$this->addFieldsIf( 'cl_timestamp', $fld_timestamp || $params['sort'] == 'timestamp' );
$this->addTables( [ 'page', 'categorylinks' ] ); // must be in this order for 'USE INDEX'
+ if ( $this->migrationStage & SCHEMA_COMPAT_READ_OLD ) {
+ $this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
+ } else {
+ $this->addTables( 'linktarget' );
+ $this->addJoinConds( [ 'linktarget' => [ 'JOIN', 'cl_target_id = lt_id ' ] ] );
+ $this->addWhere( [
+ 'lt_namespace' => NS_CATEGORY,
+ 'lt_title' => $categoryTitle->getDBkey(),
+ ] );
+ }
- $this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
$queryTypes = $params['type'];
$contWhere = false;
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index 530f77a8b709..9382d43652c7 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -22,7 +22,6 @@
namespace MediaWiki\Api;
-use MediaWiki\Block\Block;
use MediaWiki\Cache\LinkBatchFactory;
use MediaWiki\EditPage\IntroMessageBuilder;
use MediaWiki\EditPage\PreloadedContentBuilder;
@@ -598,17 +597,6 @@ class ApiQueryInfo extends ApiQueryBase {
$authority->definitelyCan( $action, $page, $status );
}
- if ( $shouldAutoCreate ) {
- // Additionally check for blocks on the session user, since checking the
- // placeholder temp user won't find blocks against the IP address or other
- // parts of the request: T357063
- $block = $this->getAuthority()->getBlock();
- if ( $block instanceof Block ) {
- $status->setBlock( $block );
- }
- }
- $this->addBlockInfoToStatus( $status );
-
$pageInfo['actions'][$action] = $errorFormatter->arrayFromStatus( $status );
}
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 4fe733a09ffe..3b09bf9ad2e0 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -33,6 +33,7 @@ use MediaWiki\Languages\LanguageNameUtils;
use MediaWiki\MainConfigNames;
use MediaWiki\Parser\MagicWordFactory;
use MediaWiki\Parser\ParserFactory;
+use MediaWiki\Permissions\GroupPermissionsLookup;
use MediaWiki\Registration\ExtensionRegistry;
use MediaWiki\ResourceLoader\SkinModule;
use MediaWiki\SiteStats\SiteStats;
@@ -80,6 +81,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
private ReadOnlyMode $readOnlyMode;
private UrlUtils $urlUtils;
private TempUserConfig $tempUserConfig;
+ private GroupPermissionsLookup $groupPermissionsLookup;
public function __construct(
ApiQuery $query,
@@ -100,7 +102,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
ILoadBalancer $loadBalancer,
ReadOnlyMode $readOnlyMode,
UrlUtils $urlUtils,
- TempUserConfig $tempUserConfig
+ TempUserConfig $tempUserConfig,
+ GroupPermissionsLookup $groupPermissionsLookup
) {
parent::__construct( $query, $moduleName, 'si' );
$this->userOptionsLookup = $userOptionsLookup;
@@ -120,6 +123,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$this->readOnlyMode = $readOnlyMode;
$this->urlUtils = $urlUtils;
$this->tempUserConfig = $tempUserConfig;
+ $this->groupPermissionsLookup = $groupPermissionsLookup;
}
public function execute() {
@@ -596,11 +600,13 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data = [];
$result = $this->getResult();
- $allGroups = array_values( $this->userGroupManager->listAllGroups() );
- foreach ( $config->get( MainConfigNames::GroupPermissions ) as $group => $permissions ) {
+ $allGroups = $this->userGroupManager->listAllGroups();
+ $allImplicitGroups = $this->userGroupManager->listAllImplicitGroups();
+ foreach ( array_merge( $allImplicitGroups, $allGroups ) as $group ) {
$arr = [
'name' => $group,
- 'rights' => array_keys( $permissions, true ),
+ 'rights' => $this->groupPermissionsLookup->getGrantedPermissions( $group ),
+ // TODO: Also expose the list of revoked permissions somehow.
];
if ( $numberInGroup ) {
@@ -614,25 +620,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
}
- $groupArr = [
- 'add' => $config->get( MainConfigNames::AddGroups ),
- 'remove' => $config->get( MainConfigNames::RemoveGroups ),
- 'add-self' => $config->get( MainConfigNames::GroupsAddToSelf ),
- 'remove-self' => $config->get( MainConfigNames::GroupsRemoveFromSelf )
- ];
+ $groupArr = $this->userGroupManager->getGroupsChangeableByGroup( $group );
- foreach ( $groupArr as $type => $rights ) {
- if ( isset( $rights[$group] ) ) {
- if ( $rights[$group] === true ) {
- $groups = $allGroups;
- } else {
- $groups = array_intersect( $rights[$group], $allGroups );
- }
- if ( $groups ) {
- $arr[$type] = $groups;
- ApiResult::setArrayType( $arr[$type], 'BCarray' );
- ApiResult::setIndexedTagName( $arr[$type], 'group' );
- }
+ foreach ( $groupArr as $type => $groups ) {
+ $groups = array_values( array_intersect( $groups, $allGroups ) );
+ if ( $groups ) {
+ $arr[$type] = $groups;
+ ApiResult::setArrayType( $arr[$type], 'BCarray' );
+ ApiResult::setIndexedTagName( $arr[$type], 'group' );
}
}
diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php
index 0fe7bbea6d3a..53da553bb205 100644
--- a/includes/api/ApiUnblock.php
+++ b/includes/api/ApiUnblock.php
@@ -22,9 +22,9 @@
namespace MediaWiki\Api;
-use MediaWiki\Block\AbstractBlock;
use MediaWiki\Block\Block;
use MediaWiki\Block\BlockPermissionCheckerFactory;
+use MediaWiki\Block\BlockTargetFactory;
use MediaWiki\Block\DatabaseBlockStore;
use MediaWiki\Block\UnblockUserFactory;
use MediaWiki\MainConfigNames;
@@ -34,6 +34,7 @@ use MediaWiki\User\Options\UserOptionsLookup;
use MediaWiki\User\UserIdentityLookup;
use MediaWiki\Watchlist\WatchedItemStoreInterface;
use MediaWiki\Watchlist\WatchlistManager;
+use RuntimeException;
use Wikimedia\ParamValidator\ParamValidator;
use Wikimedia\ParamValidator\TypeDef\ExpiryDef;
@@ -53,6 +54,7 @@ class ApiUnblock extends ApiBase {
private UserIdentityLookup $userIdentityLookup;
private WatchedItemStoreInterface $watchedItemStore;
private DatabaseBlockStore $blockStore;
+ private BlockTargetFactory $blockTargetFactory;
public function __construct(
ApiMain $main,
@@ -63,7 +65,8 @@ class ApiUnblock extends ApiBase {
WatchedItemStoreInterface $watchedItemStore,
WatchlistManager $watchlistManager,
UserOptionsLookup $userOptionsLookup,
- DatabaseBlockStore $blockStore
+ DatabaseBlockStore $blockStore,
+ BlockTargetFactory $blockTargetFactory
) {
parent::__construct( $main, $action );
@@ -79,6 +82,7 @@ class ApiUnblock extends ApiBase {
$this->watchlistManager = $watchlistManager;
$this->userOptionsLookup = $userOptionsLookup;
$this->blockStore = $blockStore;
+ $this->blockTargetFactory = $blockTargetFactory;
}
/**
@@ -99,7 +103,7 @@ class ApiUnblock extends ApiBase {
if ( !$identity ) {
$this->dieWithError( [ 'apierror-nosuchuserid', $params['userid'] ], 'nosuchuserid' );
}
- $params['user'] = $identity->getName();
+ $params['user'] = $identity;
}
$blockToRemove = null;
@@ -110,15 +114,12 @@ class ApiUnblock extends ApiBase {
[ 'apierror-nosuchblockid', $params['id'] ],
'nosuchblockid' );
}
-
- if ( $blockToRemove->getType() === AbstractBlock::TYPE_AUTO ) {
- $target = '#' . $params['id'];
- } else {
- $target = $blockToRemove->getTargetUserIdentity()
- ?? $blockToRemove->getTargetName();
+ $target = $blockToRemove->getRedactedTarget();
+ if ( !$target ) {
+ throw new RuntimeException( 'Block has no target' );
}
} else {
- $target = $params['user'];
+ $target = $this->blockTargetFactory->newFromUser( $params['user'] );
}
# T17810: blocked admins should have limited access here
@@ -206,6 +207,7 @@ class ApiUnblock extends ApiBase {
'user' => [
ParamValidator::PARAM_TYPE => 'user',
UserDef::PARAM_ALLOWED_USER_TYPES => [ 'name', 'ip', 'temp', 'cidr', 'id' ],
+ UserDef::PARAM_RETURN_OBJECT => true,
],
'userid' => [
ParamValidator::PARAM_TYPE => 'integer',
diff --git a/includes/api/Hook/ApiOptionsHook.php b/includes/api/Hook/ApiOptionsHook.php
index 2294a85165f3..7215bbd3bbe7 100644
--- a/includes/api/Hook/ApiOptionsHook.php
+++ b/includes/api/Hook/ApiOptionsHook.php
@@ -23,7 +23,7 @@ interface ApiOptionsHook {
* @param User $user User object whose preferences are being changed
* @param array $changes Associative array of preference name => value
* @param string[] $resetKinds Array of strings specifying which options kinds to reset
- * See User::resetOptions() and User::getOptionKinds() for possible values.
+ * See PreferencesFactory::listResetKinds() for possible values.
* @return bool|void True or no return value to continue or false to abort
*/
public function onApiOptions( $apiModule, $user, $changes, $resetKinds );
diff --git a/includes/api/i18n/ar.json b/includes/api/i18n/ar.json
index 3b146f609cd7..35c59dce08fd 100644
--- a/includes/api/i18n/ar.json
+++ b/includes/api/i18n/ar.json
@@ -1672,7 +1672,6 @@
"apierror-compare-relative-to-deleted": "لا يمكن استخدام <kbd>torelative=$1</kbd> بالنسبة لمراجعة محذوفة.",
"apierror-compare-relative-to-nothing": "لا توجد مراجعة 'من' لـ<var>torelative</var> لتكون نسبة.",
"apierror-contentserializationexception": "فشل تسلسل المحتوى: $1",
- "apierror-contenttoobig": "المحتوى الذي قمت بتقديمه يتجاوز الحد الأقصى لحجم الصفحة وهو $1 {{PLURAL:$1| kibibyte|kibibytes}}.",
"apierror-copyuploadbaddomain": "لا يُسمَح بالمرفوعات بواسطة مسار من هذا النطاق.",
"apierror-copyuploadbadurl": "لا يُسمَح بالرفع من هذا المسار.",
"apierror-create-titleexists": "لا يمكن حماية العناوين الموجودة باستخدام <kbd>create</kbd>.",
diff --git a/includes/api/i18n/be-tarask.json b/includes/api/i18n/be-tarask.json
index af0285f289d0..c036f025ca00 100644
--- a/includes/api/i18n/be-tarask.json
+++ b/includes/api/i18n/be-tarask.json
@@ -20,11 +20,13 @@
"apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу.",
"apihelp-main-param-responselanginfo": "Уключыць мовы, выкарыстаныя для <var>uselang</var> і <var>errorlang</var>, у вынік.",
"apihelp-main-param-origin": "Пры звароце да API з дапамогай міждамэннага AJAX-запыту (CORS), выстаўце парамэтру значэньне зыходнага дамэну. Ён мусіць быць уключаны ў кожны папярэдні запыт і такім чынам мусіць быць часткай URI-запыту (ня цела POST).\n\nДля аўтэнтыфікаваных запытаў ён мусіць супадаць з адной з крыніц у загалоўку <code>Origin</code>, павінна быць зададзена нешта кшталту <kbd>https://en.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Калі парамэтар не супадае з загалоўкам <code>Origin</code>, будзе вернуты адказ з кодам памылкі 403. Калі парамэтар супадае з загалоўкам <code>Origin</code> і крыніца дазволеная, будуць выстаўленыя загалоўкі <code>Access-Control-Allow-Origin</code> і <code>Access-Control-Allow-Credentials</code>.\n\nДля неаўтэнтыфікаваных запытаў выстаўце значэньне <kbd>*</kbd>. Гэта прывядзе да выстаўленьня загалоўку <code>Access-Control-Allow-Origin</code>, але <code>Access-Control-Allow-Credentials</code> будзе мець значэньне <code>false</code> і ўсе зьвесткі пра карыстальніка будуць абмежаваныя.",
+ "apihelp-main-param-crossorigin": "Пры доступе да API з дапамогай кросдамэнавых запытаў AJAX request (CORS) і сэсійнага пастаўніка, абароненага ад кросбачынавых атакаў падробкі запытаў (CSRF, прыкладам, OAuth), дзеля аўтэнтыфікацыі запыту (т. б. бяз выхаду з сыстэмы) карыстайцеся гэтым замест <code>origin=*</code>. Гэта трэба ўключаць у любыя перадпалётныя запыты, а значыць, у склад запыту URI (ня ў цела POST).\n\nЗьвярніце ўвагу, што большасьць сэсійных пастаўнікоў, у тым ліку стандартныя сэсіі на базе маркёраў, не падтрымліваюць аўтэнтыфікаваныя CORS і ня могуць выкарыстоўвацца з гэтым парамэтрам.",
"apihelp-main-param-uselang": "Мова для выкарыстаньня ў перакладах паведамленьняў. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў мовы. Вы можаце пазначыць <kbd>user</kbd>, каб ужываць налады мовы цяперашняга карыстальніка, або пазначыць <kbd>content</kbd>, каб ужываць мову зьместу гэтай вікі.",
"apihelp-main-param-variant": "Варыянт мовы. Працуе толькі ў выпадку, калі базавая мова падтрымлівае пераўтварэньне варыянтаў.",
"apihelp-main-param-errorformat": "Фармат для вываду тэксту папярэджаньняў і памылак",
"apihelp-main-paramvalue-errorformat-plaintext": "Вікітэкст з выдаленымі HTML-цэтлікамі і замененымі існасьцямі.",
"apihelp-main-paramvalue-errorformat-wikitext": "Неразабраны вікітэкст.",
+ "apihelp-main-paramvalue-errorformat-raw": "Ключ паведамленьня і парамэтры.",
"apihelp-main-param-errorlang": "Мова для выкарыстаньня ў папярэджаньнях і памылках. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]]</kbd> з <kbd>siprop=languages</kbd> вяртае сьпіс кодаў моваў. Пазначце <kbd>content</kbd> для выкарыстаньня мовы зьместу гэтай вікі, ці пазначце <kbd>uselang</kbd> для выкарыстаньня таго ж значэньня, што і ў парамэтры <var>uselang</var>.",
"apihelp-main-param-errorsuselocal": "Калі зададзена, тэксты памылак будуць выкарыстоўваць лякальна-наладжаныя паведамленьні з прасторы назваў {{ns:MediaWiki}}.",
"apihelp-block-summary": "Блякаваньне ўдзельніка.",
@@ -38,7 +40,7 @@
"apihelp-block-param-noemail": "Забараняе ўдзельніку дасылаць лісты электроннай пошты празь вікі (трэба мець права <code>blockemail</code>).",
"apihelp-block-param-hidename": "Схаваць імя ўдзельніка з журналу блякаваньняў (патрабуе права <code>hideuser</code>).",
"apihelp-block-param-allowusertalk": "Дазволіць удзельніку рэдагаваць уласную старонку гутарак (залежыць ад <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
- "apihelp-block-param-reblock": "Калі ўдзельнік ужо заблякаваны, перапісаць дзейнае блякаваньне.",
+ "apihelp-block-param-reblock": "Калі ўдзельнік ужо заблякаваны, перапісаць дзейнае блякаваньне. Калі ўдзельнік заблякаваны больш аднаго разу, гэта не спрацуе — тады скарыстайцеся парамэтрам <var>id</var>, каб задачыць блякаваньне, якое трэба перапісаць.",
"apihelp-block-param-watchuser": "Назіраць за старонкай удзельніка або старонкай IP-адрасу, а таксама старонкай гутарак.",
"apihelp-block-param-tags": "Зьмяніць меткі запісу ў журнале блякаваньняў.",
"apihelp-block-param-partial": "Блякуе ўдзельніку магчымасьць рэдагаваць асобныя старонкі ці прасторы назваў замест усяго сайту.",
diff --git a/includes/api/i18n/br.json b/includes/api/i18n/br.json
index 629e91943ce7..d743b377e19c 100644
--- a/includes/api/i18n/br.json
+++ b/includes/api/i18n/br.json
@@ -17,7 +17,7 @@
"apihelp-block-param-reason": "Abeg evit stankañ.",
"apihelp-block-param-nocreate": "Mirout a grouiñ kontoù.",
"apihelp-block-param-hidename": "Kuzhat a ra anv implijer e marilh ar stankadennoù. (Rekis eo kaout ar gwir <code>hideuser</code> right).",
- "apihelp-block-param-reblock": "Mard eo stanket an implijer c'hoazh, frikañ ar stankadenn zo.",
+ "apihelp-block-param-reblock": "Mard eo stanket an implijer ur wech hepken, frikañ ar stankadenn zo. Ne vo ket posubl mard eo stanket an implijer meur a wech — grit neuze gant an arventenn <var>id</var> da spisaat pe stankadenn a vo friket.",
"apihelp-block-param-watchuser": "Evezhiañ pajennoù implijer ha kaozeal an den pe e chomlec'h IP.",
"apihelp-block-param-tags": "Kemmañ an tikedennoù da lakaat e talvoud en enmont marilh ar stankadennoù.",
"apihelp-block-example-ip-simple": "Stankañ ar chomlec'h IP <kbd>192.0.2.5</kbd> tri devezh-pad gant un abeg.",
@@ -101,7 +101,7 @@
"apihelp-parse-example-text": "Dielfennañ ar wikitestenn.",
"apihelp-protect-param-reason": "Abeg evit gwareziñ/diwareziñ.",
"apihelp-protect-example-protect": "Gwareziñ ur bajenn.",
- "apihelp-purge-param-forcelinkupdate": "Hizivaat taolennoù al liammoù.",
+ "apihelp-purge-param-forcelinkupdate": "Hizivaat taolennoù al liammoù hag ober hivizadurioù roadennoù eilrenk all.",
"apihelp-query+filearchive-paramvalue-prop-dimensions": "Alias evit ar vent.",
"apihelp-query+imageinfo-paramvalue-prop-dimensions": "Alias evit ar vent.",
"apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Roll an aliasoù evit an esaouennoù anv enrollet.",
@@ -109,8 +109,8 @@
"apihelp-query+stashimageinfo-param-sessionkey": "Alias evit $1filekey, evit ar c'henglotañ war-gil.",
"apihelp-rollback-param-tags": "Tikedennoù da lakaat e talvoud war an distroioù.",
"apihelp-watch-param-expiry": "Eurdeiziañ termen da vezañ lakaet ouzh an holl bajennoù pourchaset. Na ober gan an arventenn-mañ evit lezel an holl dermenoù evel m'emaint bremañ.",
- "apihelp-watch-example-watch-expiry": "Evezhiañ ar pajennoù <kbd>Main Page</kbd>, <kbd>Foo</kbd>, ha <kbd>Bar</kbd> e-pad miz.",
- "api-help-datatype-expiry": "Talvoudoù termen relativel (da sk. <kbd>5 months</kbd> pe <kbd>2 weeks</kbd>) pe absolut (da sk. <kbd>2014-09-18T12:34:56Z</kbd>). Kuit da gaout termen ebet, ober gant <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> pe <kbd>never</kbd>.",
+ "apihelp-watch-example-watch-expiry": "Evezhiañ ar pajennoù [[{{MediaWiki:Mainpage}}]], <kbd>Foo</kbd>, ha <kbd>Bar</kbd> e-pad miz.",
+ "api-help-datatype-expiry": "Talvoudoù termen a c’hall bezañ relativel (da sk. <kbd>5 months</kbd> pe <kbd>2 weeks</kbd>) pe absolut (da sk. <kbd>2014-09-18T12:34:56Z</kbd>). Kuit da gaout termen ebet, ober gant <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd> pe <kbd>never</kbd>.",
"api-help-param-type-expiry": "Seurt : {{PLURAL:$1|1=aet d'e dermen|2=roll aet d'e dermen}} ([[Special:ApiHelp/main#main/datatype/expiry|munudoù]])",
"apierror-concurrency-limit": "Tizhet ez eus bet ur vevenn kensturiegezh. Gortozit ma vo distro pep reked a-raok kas an hini war-lerc'h."
}
diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json
index 6cd22bc817f0..4e811a569fe3 100644
--- a/includes/api/i18n/de.json
+++ b/includes/api/i18n/de.json
@@ -1486,7 +1486,6 @@
"apierror-compare-notext": "Der Parameter <var>$1</var> kann nicht ohne <var>$2</var> verwendet werden.",
"apierror-compare-notorevision": "Keine Version „to“. <var>torev</var>, <var>totitle</var> oder <var>toid</var> angeben.",
"apierror-compare-relative-to-deleted": "<kbd>torelative=$1</kbd> kann nicht relativ zu einer gelöschten Version verwendet werden.",
- "apierror-contenttoobig": "Der gelieferte Inhalt überschreitet die Seitengrößenbegrenzung von $1 {{PLURAL:$1|Kibibyte}}.",
"apierror-contentmodel-mismatch": "Der von dir angegebene Inhalt hat das Inhaltsmodell <kbd>$1</kbd>, das sich vom aktuellen Inhaltsmodell der Seite <kbd>$2</kbd> unterscheidet.",
"apierror-emptypage": "Das Erstellen neuer leerer Seiten ist nicht erlaubt.",
"apierror-filedoesnotexist": "Die Datei ist nicht vorhanden.",
diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json
index 8c14eab90bb2..6136df868f07 100644
--- a/includes/api/i18n/en.json
+++ b/includes/api/i18n/en.json
@@ -1846,7 +1846,6 @@
"apierror-compare-relative-to-deleted": "Cannot use <kbd>torelative=$1</kbd> relative to a deleted revision.",
"apierror-compare-relative-to-nothing": "No 'from' revision for <var>torelative</var> to be relative to.",
"apierror-contentserializationexception": "Content serialization failed: $1",
- "apierror-contenttoobig": "The content you supplied exceeds the page size limit of $1 {{PLURAL:$1|kibibyte|kibibytes}}.",
"apierror-contentmodel-mismatch": "The content you supplied has <kbd>$1</kbd> content model, which differs from the current content model of the page <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Uploads by URL are not allowed from this domain.",
"apierror-copyuploadbadurl": "Upload not allowed from this URL.",
diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json
index 531ea15591b0..a04a0e18fc97 100644
--- a/includes/api/i18n/es.json
+++ b/includes/api/i18n/es.json
@@ -47,6 +47,7 @@
"Ncontinanza",
"No se",
"Pierpao",
+ "PoLuX124",
"Poco a poco",
"Pompilos",
"Rodney Araujo",
@@ -200,6 +201,7 @@
"apihelp-edit-param-redirect": "Resolver redirecciones automáticamente.",
"apihelp-edit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.",
"apihelp-edit-param-contentmodel": "Modelo de contenido del nuevo contenido.",
+ "apihelp-edit-param-returnto": "Título de la página. Si al guardar la edición se creó una cuenta temporal, la API puede responder con una URL que el cliente debe visitar para completar el inicio de sesión. Si se proporciona este parámetro, la URL redirigirá a la página indicada, en lugar de a la página que se editó.",
"apihelp-edit-param-token": "La clave debe enviarse siempre como el último parámetro o, al menos, después del parámetro $1text.",
"apihelp-edit-example-edit": "Editar una página",
"apihelp-edit-example-prepend": "Anteponer <kbd>_&#95;NOTOC_&#95;</kbd> a una página.",
@@ -1574,7 +1576,6 @@
"apierror-compare-nosuchtosection": "No existe una sección $1 en el contenido 'to'.",
"apierror-compare-notext": "No se puede usar el parámetro <var>$1</var> sin <var>$2</var>.",
"apierror-contentserializationexception": "La serialización de contenido falló: $1",
- "apierror-contenttoobig": "El contenido proporcionado supera el límite de tamaño del artículo de $1 {{PLURAL:$1|kibibyte|kibibytes}}.",
"apierror-copyuploadbaddomain": "No se permite realizar cargas a partir de este dominio.",
"apierror-copyuploadbadurl": "No se permite realizar cargas a partir de este URL.",
"apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
@@ -1686,6 +1687,7 @@
"apierror-stashwrongowner": "Propietario incorrecto: $1",
"apierror-stashzerolength": "El archivo mide cero bytes y no puede guardarse en el almacén provisional: $1.",
"apierror-systemblocked": "Has sido bloqueado automáticamente por el software MediaWiki.",
+ "apierror-tempuseracquirefailed": "No se puede adquirir un nombre de usuario de cuenta temporal.",
"apierror-templateexpansion-notwikitext": "La expansión de plantillas solo es compatible con el contenido en wikitexto. $1 usa el modelo de contenido $2.",
"apierror-toomanyvalues": "Se proporcionaron demasiados valores al parámetro <var>$1</var>. El límite es de $2.",
"apierror-unknownaction": "La acción especificada, <kbd>$1</kbd>, no está reconocida.",
diff --git a/includes/api/i18n/fa.json b/includes/api/i18n/fa.json
index 19884535b471..f350a6de8526 100644
--- a/includes/api/i18n/fa.json
+++ b/includes/api/i18n/fa.json
@@ -498,7 +498,6 @@
"apierror-changecontentmodel-nodirectediting": "مدل محتوای $1 از ویرایش مستقیم پشتیبانی نمی‌کند",
"apierror-changecontentmodel-cannotbeused": "مدل محتوای $1 در $2 قابل استفاده نیست",
"apierror-changecontentmodel-cannot-convert": "ناتوان در تبدیل مدل محتوای $1 به $2",
- "apierror-contenttoobig": "حجم محتوای ارائه‌شده از سوی شما از محدودیت اندازهٔ مقاله برابر با $1 {{PLURAL:$1|کیبی‌بایت}} گذر کرده است.",
"apierror-contentmodel-mismatch": "محتوایی که وارد کرده‌اید دارای مدل محتوایی <kbd>$1</kbd> است که با مدل محتوای کنونی صفحه <kbd>$2</kbd> متفاوت است.",
"apierror-nosuchrcid": "تغییر اخیری با شناسهٔ $1 موجود نیست.",
"api-credits-header": "اعتبار"
diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json
index 13dba3268e88..66bbe93302fd 100644
--- a/includes/api/i18n/fr.json
+++ b/includes/api/i18n/fr.json
@@ -1768,7 +1768,6 @@
"apierror-compare-relative-to-deleted": "Impossible d’utiliser <kbd>torelative=$1</kbd> par rapport à une révision supprimée.",
"apierror-compare-relative-to-nothing": "Pas de révision 'depuis' pour <var>torelative</var> à laquelle se rapporter.",
"apierror-contentserializationexception": "Échec de sérialisation du contenu : $1",
- "apierror-contenttoobig": "Le contenu que vous avez fourni dépasse la taille maximale autorisée pour une page ($1 {{PLURAL:$1|kibioctet|kibioctets}}).",
"apierror-contentmodel-mismatch": "Le contenu que vous avez fourni utilise le modèle de contenu <kbd>$1</kbd>, alors que le modèle de contenu actuel de la page est <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Les téléversements par URL ne sont pas autorisés depuis ce domaine.",
"apierror-copyuploadbadurl": "Les téléversements ne sont pas autorisés depuis cette URL.",
diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json
index 6f7494ba851d..3707b55e3c92 100644
--- a/includes/api/i18n/gl.json
+++ b/includes/api/i18n/gl.json
@@ -1741,7 +1741,6 @@
"apierror-compare-relative-to-deleted": "Non se pode usar <kbd>torelative=$1</kbd> en relación a unha revisión eliminada.",
"apierror-compare-relative-to-nothing": "Non hai ningunha revisión \"from\" en relación á cal <var>torelative</var> sexa relativa.",
"apierror-contentserializationexception": "Erro de serialización do contidoː $1",
- "apierror-contenttoobig": "O contido que achegaches excede o límite de tamaño dunha páxina, que é de $1 {{PLURAL:$1|kibibyte|kibibytes}}.",
"apierror-contentmodel-mismatch": "O contido que achegaches ten o modelo de contido <kbd>$1</kbd>, que difire do modelo de contido actual da páxina: <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "As subas por URL non están permitidas para este dominio.",
"apierror-copyuploadbadurl": "As subas non están permitidas para este enderezo URL.",
diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json
index 5061308b70d8..5f7574af1868 100644
--- a/includes/api/i18n/he.json
+++ b/includes/api/i18n/he.json
@@ -249,7 +249,7 @@
"apihelp-feedrecentchanges-param-hidecategorization": "להסתיר שינויים בחברות בקטגוריה.",
"apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תג.",
"apihelp-feedrecentchanges-param-inverttags": "כל העריכות מלבד אלה שתויגו עם אלה שנבחרו.",
- "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים מהדף זה בלבד.",
+ "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים מהדף הזה בלבד.",
"apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
"apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.",
"apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.",
@@ -1745,7 +1745,6 @@
"apierror-compare-relative-to-deleted": "לא ניתן להשתמש ב־<kbd>torelative=$1</kbd> יחסית לגרסה מחוקה.",
"apierror-compare-relative-to-nothing": "אין גרסת \"from\" עבור <var>torelative</var> שתהיה יחסית.",
"apierror-contentserializationexception": "הסדרת התוכן נכשלה: $1",
- "apierror-contenttoobig": "התוכן שסיפקת חורג ממגבלת גודל הדף של {{PLURAL:$1|קיביבייט אחד|$1 קיביבייטים}}.",
"apierror-contentmodel-mismatch": "התוכן שסיפקת משתייך למודל התוכן <kbd>$1</kbd>, ששונה ממודל התוכן הנוכחי של הדף שהוא <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "העלאות לפי URL אינם מורשות מהתחום הזה.",
"apierror-copyuploadbadurl": "העלאה אינה מותרת מה־URL הזה.",
diff --git a/includes/api/i18n/ia.json b/includes/api/i18n/ia.json
index 97955e679725..3ee25236bc32 100644
--- a/includes/api/i18n/ia.json
+++ b/includes/api/i18n/ia.json
@@ -1724,7 +1724,6 @@
"apierror-compare-relative-to-deleted": "Non pote usar <kbd>torelative=$1</kbd> relative a un version delite.",
"apierror-compare-relative-to-nothing": "Necun version 'from' pro <var>torelative</var> al qual esser relative.",
"apierror-contentserializationexception": "Serialisation de contento fallite: $1",
- "apierror-contenttoobig": "Le contento fornite excede le limite de grandor de paginas de $1 kibibyte{{PLURAL:$1||s}}.",
"apierror-contentmodel-mismatch": "Le contento que tu forniva ha le modello de contento <kbd>$1</kbd>, que es differente del modello de contento actual del pagina, <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Le incargamentos per URL ab iste dominio non es autorisate.",
"apierror-copyuploadbadurl": "Le incargamentos ab iste URL non es autorisate.",
diff --git a/includes/api/i18n/ja.json b/includes/api/i18n/ja.json
index c6e2e1d232bf..7a7b7cca92f3 100644
--- a/includes/api/i18n/ja.json
+++ b/includes/api/i18n/ja.json
@@ -23,6 +23,7 @@
"Sujiniku",
"Suyama",
"Whym",
+ "Yaakiyu.jp",
"Yamagata Yusuke",
"Yusuke1109",
"Yuukin0248",
@@ -351,6 +352,7 @@
"apihelp-parse-param-disablepp": "<var>$1disablelimitreport</var> を代わりに使用してください。",
"apihelp-parse-param-disableeditsection": "構文解析の出力で節リンクを省略する。",
"apihelp-parse-param-preview": "プレビューモードでのパース",
+ "apihelp-parse-param-useskin": "選択したスキンをパーサー出力に適用します。次のプロパティに影響する可能性があります: <kbd>text</kbd> 、 <kbd>langlinks</kbd> 、 <kbd>headitems</kbd> 、 <kbd>modules</kbd> 、 <kbd>jsconfigvars</kbd> 、 <kbd>indicators</kbd> 。",
"apihelp-parse-example-page": "ページを構文解析する。",
"apihelp-parse-example-text": "ウィキテキストを構文解析",
"apihelp-parse-example-summary": "要約を構文解析します。",
diff --git a/includes/api/i18n/lij.json b/includes/api/i18n/lij.json
index a68ae91b4219..0902326759fc 100644
--- a/includes/api/i18n/lij.json
+++ b/includes/api/i18n/lij.json
@@ -1726,7 +1726,6 @@
"apierror-compare-relative-to-deleted": "O no peu dêuviâ <kbd>torelative=$1</kbd> relatîvo a 'na versción scancelâ.",
"apierror-compare-relative-to-nothing": "Nisciùnn-a versción 'from' pe <var>torelative</var> relatîvo a lê.",
"apierror-contentserializationexception": "Serializaçión do contegnûo falîaː $1",
- "apierror-contenttoobig": "O contegnûo fornîo o sùpera o lìmite de dimensción da pàgina de $1 {{PLURAL:$1|kibibyte}}.",
"apierror-contentmodel-mismatch": "O contegnûo fornîo o l'à o modèllo de contegnûo <kbd>$1</kbd>, ch'o diferìsce da-o modèllo de contegnûo corénte da pàgina <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "I caregaménti da URL no són consentîi da sto domìnnio chi.",
"apierror-copyuploadbadurl": "I caregaménti no són consentîi da sto URL chi.",
diff --git a/includes/api/i18n/nb.json b/includes/api/i18n/nb.json
index 286d1a0c9e22..80434a8ac360 100644
--- a/includes/api/i18n/nb.json
+++ b/includes/api/i18n/nb.json
@@ -1723,7 +1723,6 @@
"apierror-compare-relative-to-deleted": "Kan ikke bruke <kbd>torelative=$1</kbd> relativt til en slettet sideversjon.",
"apierror-compare-relative-to-nothing": "Ingen «from»-sideversjon som <var>torelative</var> kan være relativ til.",
"apierror-contentserializationexception": "Innholdsserialisering feliet: $1",
- "apierror-contenttoobig": "Innholdet du oppga overskrider sidestørrelsesgrensen på $1 {{PLURAL:$1|kibibyte}}.",
"apierror-contentmodel-mismatch": "Innholdet du oppga har innholdsmodellen <kbd>$1</kbd>, som er forskjellig fra sidens gjeldende innholdsmodell, <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Opplasting via URL tillates ikke fra dette domenet.",
"apierror-copyuploadbadurl": "Opplasting tillates ikke fra denne URL-en.",
diff --git a/includes/api/i18n/nl.json b/includes/api/i18n/nl.json
index 04e605afe5d2..6e1da13d1f40 100644
--- a/includes/api/i18n/nl.json
+++ b/includes/api/i18n/nl.json
@@ -1750,7 +1750,6 @@
"apierror-compare-relative-to-deleted": "<kbd>torelative=$1</kbd> kan niet ten opzichte van een verwijderde versie worden gebruikt.",
"apierror-compare-relative-to-nothing": "Er is geen ‘from’-versie waaraan <var>torelative</var> relatief kan zijn.",
"apierror-contentserializationexception": "Inhoudsserialisatie mislukt: $1",
- "apierror-contenttoobig": "De opgegeven inhoud overschrijdt de limiet op de paginagrootte van $1 {{PLURAL:$1|kibibyte|kibibytes}}.",
"apierror-contentmodel-mismatch": "De door u aangeleverde inhoud is van het inhoudsmodel <kbd>$1</kbd>, wat verschilt van het huidige inhoudsmodel van de pagina, <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Uploads via URL zijn niet toegestaan vanaf dit domein.",
"apierror-copyuploadbadurl": "Uploaden vanaf deze URL is niet toegestaan.",
diff --git a/includes/api/i18n/pa.json b/includes/api/i18n/pa.json
index ee081d8276f8..151f6f0c2332 100644
--- a/includes/api/i18n/pa.json
+++ b/includes/api/i18n/pa.json
@@ -48,7 +48,7 @@
"apihelp-feedrecentchanges-example-30days": "30 ਦਿਨਾਂ ਲਈ ਹਾਲੀਆ ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ।",
"apihelp-feedwatchlist-example-all6hrs": "ਪਿਛਲੇ 6 ਘੰਟਿਆਂ ਵਿੱਚ ਵੇਖੇ ਗਏ ਸਫ਼ਿਆਂ ਵਿੱਚ ਸਾਰੀਆਂ ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ।",
"apihelp-help-example-recursive": "ਇੱਕੋ ਸਫ਼ੇ 'ਤੇ ਸਾਰੀ ਮਦਦ",
- "apihelp-import-param-interwikipage": "ਅੰਤਰ-ਵਿਕੀ ਆਯਾਤ ਵਾਸਤੇ: ਆਯਾਤ ਕਰਨ ਲਈ ਸਫ਼ਾ।",
+ "apihelp-import-param-interwikipage": "ਅੰਤਰ-ਵਿਕੀ ਦਰਾਮਦ ਲਈ: ਦਰਾਮਦ ਕਰਨ ਲਈ ਸਫ਼ਾ।",
"apihelp-login-param-name": "ਵਰਤੋਂਕਾਰ ਨਾਂ।",
"apihelp-login-param-password": "ਪਾਰਸ਼ਬਦ।",
"apihelp-login-param-domain": "ਡੋਮੇਨ (ਇਖਤਿਆਰੀ)",
diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json
index 2132a5b1094d..b6249054fb5c 100644
--- a/includes/api/i18n/pl.json
+++ b/includes/api/i18n/pl.json
@@ -876,7 +876,6 @@
"apierror-cantview-deleted-description": "Nie masz uprawnień do podglądu opisów usuniętych plików.",
"apierror-cantview-deleted-metadata": "Nie masz uprawnień do podglądu metadanych usuniętych plików.",
"apierror-cantview-deleted-revision-content": "Nie masz uprawnień do podglądu treści usuniętych wersji.",
- "apierror-contenttoobig": "Podana treść przekracza limit rozmiaru strony wynoszący $1 {{PLURAL:$1|kibibajt|kibibajty|kibibajtów}}.",
"apierror-contentmodel-mismatch": "Dostarczona treść posiada model zawartości <kbd>$1</kbd>, który różni się od obecnego modelu zawartości strony – <kbd>$2</kbd>.",
"apierror-exceptioncaught": "[$1] Stwierdzono wyjątek: $2",
"apierror-filedoesnotexist": "Plik nie istnieje.",
diff --git a/includes/api/i18n/ps.json b/includes/api/i18n/ps.json
index e3f67879851b..e8183f05efbf 100644
--- a/includes/api/i18n/ps.json
+++ b/includes/api/i18n/ps.json
@@ -3,7 +3,8 @@
"authors": [
"1233qwer1234qwer4",
"Ahmed-Najib-Biabani-Ibrahimkhel",
- "Macofe"
+ "Macofe",
+ "شاه زمان پټان"
]
},
"apihelp-main-param-action": "کومه کړنه ترسره کړم.",
diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json
index 381c7388b3cb..9dba97e178e7 100644
--- a/includes/api/i18n/pt-br.json
+++ b/includes/api/i18n/pt-br.json
@@ -1660,7 +1660,6 @@
"apierror-compare-relative-to-deleted": "Não pode usar <kbd>torelative=$1</kbd> com relação a uma revisão eliminada.",
"apierror-compare-relative-to-nothing": "Nenhuma revisão 'from' para <var>torelative</var> para ser relativa à.",
"apierror-contentserializationexception": "Falha na serialização de conteúdo: $1",
- "apierror-contenttoobig": "O conteúdo fornecido excede o limite de tamanho do artigo de $1 {{PLURAL: $1|kibibyte|kibibytes}}.",
"apierror-contentmodel-mismatch": "O conteúdo que forneceu tem o modelo de conteúdo <kbd>$1</kbd>, que é diferente do modelo de conteúdo atual da página, <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Os uploads por URL não são permitidos deste domínio.",
"apierror-copyuploadbadurl": "Envio não permitido a partir deste URL.",
diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json
index 459be75d98af..017ef9a42921 100644
--- a/includes/api/i18n/pt.json
+++ b/includes/api/i18n/pt.json
@@ -1729,7 +1729,6 @@
"apierror-compare-relative-to-deleted": "Não pode usar <kbd>torelative=$1</kbd> com relação a uma revisão eliminada.",
"apierror-compare-relative-to-nothing": "Não existe uma revisão 'from' em relação à qual <var>torelative</var> possa ser relativo.",
"apierror-contentserializationexception": "A seriação do conteúdo falhou: $1",
- "apierror-contenttoobig": "O conteúdo fornecido excede o limite de tamanho de página de $1 {{PLURAL:$1| kibibyte|kibibytes}}.",
"apierror-contentmodel-mismatch": "O conteúdo que forneceu tem o modelo de conteúdo <kbd>$1</kbd>, que é diferente do modelo de conteúdo atual da página, <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Não são permitidos carregamentos por URL a partir deste domínio.",
"apierror-copyuploadbadurl": "Não são permitidos carregamentos a partir deste URL.",
diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json
index 99bcd16295e7..c433ab7db557 100644
--- a/includes/api/i18n/qqq.json
+++ b/includes/api/i18n/qqq.json
@@ -1750,7 +1750,6 @@
"apierror-compare-relative-to-deleted": "{{doc-apierror}}",
"apierror-compare-relative-to-nothing": "{{doc-apierror}}",
"apierror-contentserializationexception": "{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, may end with punctuation. Currently this is probably English, hopefully we'll fix that in the future.",
- "apierror-contenttoobig": "{{doc-apierror}}\n\nParameters:\n* $1 - Maximum article size in kibibytes.",
"apierror-contentmodel-mismatch": "{{doc-apierror}}\n\nParameters:\n* $1 content model of the old revision\n* $2 - content model of the current revision.",
"apierror-copyuploadbaddomain": "{{doc-apierror}}",
"apierror-copyuploadbadurl": "{{doc-apierror}}",
diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json
index 5c6b23bf709a..9367c39d039a 100644
--- a/includes/api/i18n/ru.json
+++ b/includes/api/i18n/ru.json
@@ -1695,7 +1695,6 @@
"apierror-compare-notext": "Параметр <var>$1</var> нельзя использовать без <var>$2</var>.",
"apierror-compare-relative-to-nothing": "Нет версии 'from', к которой относится <var>torelative</var>.",
"apierror-contentserializationexception": "Сериализация содержимого провалилась: $1",
- "apierror-contenttoobig": "Предоставленное вами содержимое превышает максимальный размер страницы в $1 {{PLURAL:$1|килобайт|килобайта|килобайтов}}.",
"apierror-copyuploadbaddomain": "Загрузка по ссылке недоступна с этого домена.",
"apierror-copyuploadbadurl": "Загрузка по этой ссылке недоступна.",
"apierror-create-titleexists": "Существующие названия не могут быть защищены с помощью <kbd>create</kbd>.",
diff --git a/includes/api/i18n/sl.json b/includes/api/i18n/sl.json
index cf515766161a..61238d93e2af 100644
--- a/includes/api/i18n/sl.json
+++ b/includes/api/i18n/sl.json
@@ -65,7 +65,9 @@
"apihelp-expandtemplates-param-generatexml": "Ustvari drevo razčlembe XML (zamenjano z $1prop=parsetree).",
"apihelp-expandtemplates-param-showstrategykeys": "Ali naj bodo v jsconfigvars vključene informacije o interni strategiji združevanja.",
"apihelp-expandtemplates-example-simple": "Razširi vikibesedilo <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
+ "apihelp-feedcontributions-summary": "Vrnitev vira prispevkov uporabnika.",
"apihelp-feedcontributions-param-feedformat": "Format vira.",
+ "apihelp-feedcontributions-param-deletedonly": "Prikaži samo izbrisane prispevke.",
"apihelp-feedcontributions-param-showsizediff": "Prikaže razliko v velikosti med redakcijami.",
"apihelp-feedrecentchanges-summary": "Vrne vir zadnjih sprememb",
"apihelp-feedrecentchanges-param-feedformat": "Format vira.",
@@ -340,6 +342,7 @@
"apihelp-setpagelanguage-example-language": "Sprememba jezika strani [[{{MediaWiki:Mainpage}}]] v baskovščino.",
"apihelp-stashedit-param-title": "Naslov urejane strani.",
"apihelp-tag-param-remove": "Oznake za odstranitev. Odstraniti je mogoče samo oznake, ki so opredeljene ročno ali popolnoma neopredeljene.",
+ "apihelp-unblock-param-tags": "Sprememba oznak za uporabo v vnosu v dnevniku blokiranja.",
"apihelp-unblock-param-watchuser": "Opazovanje uporabniške in pogovorne strani uporabnika ali IP-naslova.",
"apihelp-unblock-param-watchlistexpiry": "Časovni žig preteka spiska nadzorov. Da ostane trenutni pretek nespremenjen, ta parameter v celoti izpustite.",
"apihelp-undelete-summary": "Odizbris redakcij izbrisane strani.",
@@ -393,11 +396,11 @@
"apierror-botsnotsupported": "Ta uporabniški vmesnik ni podprt za bote.",
"apierror-cannotreauthenticate": "To dejanje ni na voljo, ker ni mogoče preveriti vaše identitete.",
"apierror-cantchangecontentmodel": "Za spreminjanje vsebinskega modela strani nimate dovoljenja.",
+ "apierror-canthide": "Nimate dovoljenja za skrivanje uporabniških imen v dnevniku blokiranja.",
"apierror-cantimport": "Za uvažanje strani nimate dovoljenja.",
"apierror-cantundelete": "Ni bilo mogoče odizbrisati: Zahtevane redakcije morda ne obstajajo ali pa so že odizbrisane.",
"apierror-compare-maintextrequired": "Če <var>$1slots</var> vsebuje <kbd>main</kbd>, je potreben parameter <var>$1text-main</var> (glavne reže ni mogoče izbrisati).",
"apierror-contentserializationexception": "Serializacija vsebine je spodletela: $1",
- "apierror-contenttoobig": "Vsebina, ki ste jo posredovali, presega omejitev velikosti strani $1 {{PLURAL:$1|one=kibizlog|two=kibizloga|few=kibizlige|kibizlogov}}.",
"apierror-copyuploadbaddomain": "Nalaganje po URL-ju s te domene ni dovoljeno.",
"apierror-copyuploadbadurl": "Nalaganje s tega URL-ja ni dovoljeno.",
"apierror-emptynewsection": "Ustvarjanje praznih novih razdelkov ni mogoče.",
diff --git a/includes/api/i18n/tr.json b/includes/api/i18n/tr.json
index d6f2adfde7d4..aa40079afbdb 100644
--- a/includes/api/i18n/tr.json
+++ b/includes/api/i18n/tr.json
@@ -1674,7 +1674,6 @@
"apierror-compare-relative-to-deleted": "Silinmiş bir düzeltmeye göre <kbd>torelative=$1</kbd> kullanılamaz.",
"apierror-compare-relative-to-nothing": "<var>torelative</var> göreli olması için 'from' revizyonu yok.",
"apierror-contentserializationexception": "İçerik serileştirme başarısız oldu: $1",
- "apierror-contenttoobig": "Sağladığınız içerik, $1 {{PLURAL:$1|kibibit}} ürün boyutu sınırını aşıyor.",
"apierror-contentmodel-mismatch": "Sağladığınız içerik, <kbd>$2</kbd> sayfasının mevcut içerik modelinden farklı olan <kbd>$1</kbd> içerik modeline sahip.",
"apierror-copyuploadbaddomain": "URL ile yüklemelere bu alan adından izin verilmiyor.",
"apierror-copyuploadbadurl": "Bu URL'den yüklemeye izin verilmiyor.",
diff --git a/includes/api/i18n/udm.json b/includes/api/i18n/udm.json
index 2bd16217aa20..52e6ad5aa5ba 100644
--- a/includes/api/i18n/udm.json
+++ b/includes/api/i18n/udm.json
@@ -8,6 +8,5 @@
},
"apihelp-block-summary": "Блокировка пыриськисьёс.",
"apihelp-edit-example-edit": "Бамез тупатъяно.",
- "apihelp-login-example-login": "Пырыны.",
- "apierror-contenttoobig": "Сётэм пуштросты ортче статья быдӟалалэсь $1 {{PLURAL:$1|кибибайтъем}} висгожзэ."
+ "apihelp-login-example-login": "Пырыны."
}
diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json
index d543fa359829..de5de89da87b 100644
--- a/includes/api/i18n/uk.json
+++ b/includes/api/i18n/uk.json
@@ -1700,7 +1700,6 @@
"apierror-compare-relative-to-deleted": "Неможливо використати <kbd>torelative=$1</kbd> стосовно вилученої версії.",
"apierror-compare-relative-to-nothing": "Відсутня версія 'from', якої б стосувалося <var>torelative</var>.",
"apierror-contentserializationexception": "Невдача серіалізації вмісту: $1",
- "apierror-contenttoobig": "Наданий вами вміст перевищує ліміт у $1 {{PLURAL:$1|кібібайт|кібібайти|кібібайтів}} розміру сторінки.",
"apierror-contentmodel-mismatch": "Наданий вами вміст має <kbd>$1</kbd> модель вмісту, яка відрізняється від поточної моделі вмісту сторінки <kbd>$2</kbd>.",
"apierror-copyuploadbaddomain": "Завантаження за URL-адресою недозволені з цього домену.",
"apierror-copyuploadbadurl": "Завантаження з цієї URL-адреси недозволені.",
diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json
index 5806fa23d36d..99088bcb15a9 100644
--- a/includes/api/i18n/zh-hans.json
+++ b/includes/api/i18n/zh-hans.json
@@ -1783,7 +1783,6 @@
"apierror-compare-relative-to-deleted": "不能相对于已删除的修订版本使用<kbd>torelative=$1</kbd>。",
"apierror-compare-relative-to-nothing": "没有与<var>torelative</var>的“from”修订版本相对的版本。",
"apierror-contentserializationexception": "内容序列化失败:$1",
- "apierror-contenttoobig": "您提供的内容超过了$1{{PLURAL:$1|千字节}}的页面大小限制。",
"apierror-contentmodel-mismatch": "您提供的内容具有<kbd>$1</kbd>内容模型,它不同于页面<kbd>$2</kbd>的当前内容模型。",
"apierror-copyuploadbaddomain": "不允许从此域名通过URL上传。",
"apierror-copyuploadbadurl": "不允许从此URL上传。",
diff --git a/includes/api/i18n/zh-hant.json b/includes/api/i18n/zh-hant.json
index 09e6103d3870..37b4ae10d6d9 100644
--- a/includes/api/i18n/zh-hant.json
+++ b/includes/api/i18n/zh-hant.json
@@ -1748,7 +1748,6 @@
"apierror-compare-relative-to-deleted": "相關已刪除修訂時不能使用 <kbd>torelative=$1</kbd>。",
"apierror-compare-relative-to-nothing": "沒有相關 <var>torelative</var> 的 'from' 修訂。",
"apierror-contentserializationexception": "內容序列化失敗:$1",
- "apierror-contenttoobig": "您提供的內容超過了$1{{PLURAL:$1|千位元組}}的頁面大小限制。",
"apierror-contentmodel-mismatch": "您提供的內容具有 <kbd>$1</kbd> 內容模組,該模組與頁面 <kbd>$2</kbd> 目前的內容模組不同。",
"apierror-copyuploadbaddomain": "不允許從此網域來透過 URL 上傳。",
"apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",