From: jenkins-bot Date: Mon, 10 Apr 2017 18:59:12 +0000 (+0000) Subject: Merge "MediaSearchWidget: Listen to "change" event to reposition" X-Git-Tag: 1.31.0-rc.0~3548 X-Git-Url: http://git.cyclocoop.org/%28?a=commitdiff_plain;h=3b24efab270e0f8d768ee3d390e25ae5259da431;hp=1e9341d506a1ab1ac01de3a63017a884200c0bf6;p=lhc%2Fweb%2Fwiklou.git Merge "MediaSearchWidget: Listen to "change" event to reposition" --- diff --git a/.gitignore b/.gitignore index b2c4d45cb1..a82ae21209 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,4 @@ Thumbs.db /.htaccess /.htpasswd /tests/phan/issues +*.rej diff --git a/HISTORY b/HISTORY index 7f365ac095..c6ce06c698 100644 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,44 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.29. += MediaWiki 1.28 = + +== MediaWiki 1.28.1 == + +This is a security and maintenance release of the MediaWiki 1.28 branch. + +=== Changes since 1.28.0 === + +* $wgRunJobsAsync is now false by default (T142751). This change only affects + wikis with $wgJobRunRate > 0. +* Fix fatal from "WaitConditionLoop" not being found, experienced when a wiki has + more than one database server setup. +* (T152717) Better escaping for PHP mail() command, +* (T154670) A missing method causing the MySQL installer to fatal in rare + circumstances was restored. +* (T154672) Un-deprecate ArticleAfterFetchContentObject hook. +* (T158766) Avoid SQL error on MSSQL when using selectRowCount(). +* (T145635) Fix too long index error when installing with MSSQL. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T154872) Fix incorrect ar_usertext_timestamp index names in new 1.28 installs. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + == MediaWiki 1.28 == === Changes since 1.28.0-rc1 === @@ -326,6 +365,49 @@ There's usually someone online in #mediawiki on irc.freenode.net. = MediaWiki 1.27 = +== MediaWiki 1.27.2 == +This is a security and maintenance release of the MediaWiki 1.27 branch. + +ApiCreateAccount was removed in 1.27.0. It was incorrectly still marked as +deprecated (rather than already removed) in the RELEASE-NOTES at the point 1.27.0 +was released. + +=== Changes since 1.27.1 === + +* (T68404) CSS3 attr() function with url type argument is no longer allowed + in inline styles. +* $wgRunJobsAsync is now false by default (T142751). This change only affects + wikis with $wgJobRunRate > 0. +* (T152717) Better escaping for PHP mail() command +* Submitting the lgtoken and lgpassword parameters in the query string to + action=login is now deprecated and outputs a warning. They should be submitted + in the POST body instead. +* Submitting sensitive authentication request parameters to action=clientlogin, + action=createaccount, action=linkaccount, and action=changeauthenticationdata + in the query string is now deprecated and outputs a warning. They should be + submitted in the POST body instead. +* (T158766) Avoid SQL error on MSSQL when using selectRowCount() +* (T145635) Fix too long index error when installing with MSSQL. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + == MediaWiki 1.27.1 == This is a maintenance release of the MediaWiki 1.27 branch. @@ -2670,6 +2752,32 @@ of files that are no longer available follows. = MediaWiki 1.23 = +== MediaWiki 1.23.16 == +This is a security and maintenance release of the MediaWiki 1.23 branch. + +=== Changes since 1.23.15 === +* (T68404) CSS3 attr() function with url type is no longer allowed + in inline styles. +* (T156184) $wgRawHtml will no longer apply to internationalization messages. +* Submitting the lgtoken and lgpassword parameters in the query string to + action=login is now deprecated and outputs a warning. They should be submitted + in the POST body instead. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. + == MediaWiki 1.23.15 == This is a maintenance release of the MediaWiki 1.23 branch. diff --git a/RELEASE-NOTES-1.29 b/RELEASE-NOTES-1.29 index b1157fe52b..4b7de886a9 100644 --- a/RELEASE-NOTES-1.29 +++ b/RELEASE-NOTES-1.29 @@ -35,6 +35,8 @@ production. * (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs. * $wgDummyLanguageCodes is deprecated. Additional language code mappings may be added to $wgExtraLanguageCodes instead. +* (T161453) LocalisationCache will no longer use the temporary directory in it's + fallback chain when trying to work out where to write the cache. === New features in 1.29 === * (T5233) A cookie can now be set when a user is autoblocked, to track that user @@ -86,6 +88,23 @@ production. * (T157035) "new mw.Uri()" was ignoring options when using default URI. * Special:Allpages can no longer be filtered by redirect in miser mode. * (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed. +* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect + to interwiki links. +* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when + $wgAdvancedSearchHighlighting is true. +* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep + their values out of the logs. +* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF + token. +* (T156184) SECURITY: Escape content model/format url parameter in message. +* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD + declaration. +* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory + in it's fallback chain when trying to work out where to write the cache. +* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion + syntax's link parameter. +* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against + it. === Action API changes in 1.29 === * Submitting sensitive authentication request parameters to action=login, @@ -146,6 +165,8 @@ production. various methods now take a module path rather than a module name. * ApiMessageTrait::getApiCode() now strips 'apierror-' and 'apiwarn-' prefixes from the message key, and maps some message keys for backwards compatibility. +* API parameters may now be marked as "sensitive" to keep their values out of + the logs. === Languages updated in 1.29 === @@ -284,8 +305,8 @@ changes to languages because of Phabricator reports. rather than tags. The old class name, "selflink", was deprecated and will be removed in a future release. (T160480) * (T156184) $wgRawHtml will no longer apply to internationalization messages. -* Browser support for non-ES5 JavaScript browsers, including Android 2, Opera 12, - and Internet Explorer 9, was lowered from Grade A to Grade C. +* Browser support for non-ES5 JavaScript browsers, including Android 2, + Opera <12.10, and Internet Explorer 9, was lowered from Grade A to Grade C. == Compatibility == diff --git a/autoload.php b/autoload.php index 21f75d12cf..f79c47eb3c 100644 --- a/autoload.php +++ b/autoload.php @@ -427,6 +427,7 @@ $wgAutoloadLocalClasses = [ 'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/EnqueueableDataUpdate.php', 'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php', 'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php', + 'EtcdConfig' => __DIR__ . '/includes/config/EtcdConfig.php', 'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php', 'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php', 'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php', @@ -1340,6 +1341,7 @@ $wgAutoloadLocalClasses = [ 'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php', 'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php', 'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php', + 'SpecialGoToInterwiki' => __DIR__ . '/includes/specials/SpecialGoToInterwiki.php', 'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php', 'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php', 'SpecialLinkAccounts' => __DIR__ . '/includes/specials/SpecialLinkAccounts.php', diff --git a/docs/hooks.txt b/docs/hooks.txt index a38f9bb526..af0eb06152 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -736,7 +736,10 @@ $current: the reverted revision $create: Whether or not the restoration caused the page to be created (i.e. it didn't exist before). $comment: The comment associated with the undeletion. -$oldPageId: ID of page previously deleted (from archive table) +$oldPageId: ID of page previously deleted (from archive table). This ID will be used + for the restored page. +$restoredPages: Set of page IDs that have revisions restored for this undelete, + with keys being page IDs and values are 'true'. 'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved. $pageArchive: the PageArchive object @@ -3586,6 +3589,10 @@ $removed: Groups removed $performer: User who performed the change, false if via autopromotion $reason: The reason, if any, given by the user performing the change, false if via autopromotion. +$oldUGMs: An associative array (group name => UserGroupMembership object) of +the user's group memberships before the change. +$newUGMs: An associative array (group name => UserGroupMembership object) of +the user's current group memberships. 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for specific block exemptions). diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php index 31369b0187..0205d708ca 100644 --- a/includes/CategoryViewer.php +++ b/includes/CategoryViewer.php @@ -742,7 +742,13 @@ class CategoryViewer extends ContextSource { $totalcnt = $rescnt; $category = $this->cat; DeferredUpdates::addCallableUpdate( function () use ( $category ) { - $category->refreshCounts(); + # Avoid excess contention on the same category (T162121) + $dbw = wfGetDB( DB_MASTER ); + $name = __METHOD__ . ':' . md5( $this->mName ); + $scopedLock = $dbw->getScopedLockAndFlush( $name, __METHOD__, 1 ); + if ( $scopedLock ) { + $category->refreshCounts(); + } } ); } else { // Case 3: hopeless. Don't give a total count at all. diff --git a/includes/EditPage.php b/includes/EditPage.php index e4d217c979..7bdc3bc940 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1027,7 +1027,7 @@ class EditPage { throw new ErrorPageError( 'editpage-invalidcontentmodel-title', 'editpage-invalidcontentmodel-text', - [ $this->contentModel ] + [ wfEscapeWikiText( $this->contentModel ) ] ); } @@ -1035,7 +1035,10 @@ class EditPage { throw new ErrorPageError( 'editpage-notsupportedcontentformat-title', 'editpage-notsupportedcontentformat-text', - [ $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) ] + [ + wfEscapeWikiText( $this->contentFormat ), + wfEscapeWikiText( ContentHandler::getLocalizedName( $this->contentModel ) ) + ] ); } @@ -2630,7 +2633,7 @@ class EditPage { } // @todo add EditForm plugin interface and use it here! - // search for textarea1 and textares2, and allow EditForm to override all uses. + // search for textarea1 and textarea2, and allow EditForm to override all uses. $wgOut->addHTML( Html::openElement( 'form', [ diff --git a/includes/Linker.php b/includes/Linker.php index 816271f483..bed9957f00 100644 --- a/includes/Linker.php +++ b/includes/Linker.php @@ -1561,7 +1561,7 @@ class Linker { $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped(); return '
' - . '

' . $title . "

\n" + . '

' . $title . "

\n" . $toc . "\n
\n"; } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index d3e137330d..a25ea9cf2f 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -2370,6 +2370,11 @@ class OutputPage extends ContextSource { if ( $this->mArticleBodyOnly ) { echo $this->mBodytext; } else { + // Enable safe mode if requested + if ( $this->getRequest()->getBool( 'safemode' ) ) { + $this->disallowUserJs(); + } + $sk = $this->getSkin(); // add skin specific modules $modules = $sk->getDefaultModules(); @@ -2727,7 +2732,9 @@ class OutputPage extends ContextSource { } else { $titleObj = Title::newFromText( $returnto ); } - if ( !is_object( $titleObj ) ) { + // We don't want people to return to external interwiki. That + // might potentially be used as part of a phishing scheme + if ( !is_object( $titleObj ) || $titleObj->isExternal() ) { $titleObj = Title::newMainPage(); } diff --git a/includes/Title.php b/includes/Title.php index f16f0c5311..0db4094f7f 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -1683,6 +1683,33 @@ class Title implements LinkTarget { return $url; } + /** + * Get a url appropriate for making redirects based on an untrusted url arg + * + * This is basically the same as getFullUrl(), but in the case of external + * interwikis, we send the user to a landing page, to prevent possible + * phishing attacks and the like. + * + * @note Uses current protocol by default, since technically relative urls + * aren't allowed in redirects per HTTP spec, so this is not suitable for + * places where the url gets cached, as might pollute between + * https and non-https users. + * @see self::getLocalURL for the arguments. + * @param array|string $query + * @param string $proto Protocol type to use in URL + * @return String. A url suitable to use in an HTTP location header. + */ + public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) { + $target = $this; + if ( $this->isExternal() ) { + $target = SpecialPage::getTitleFor( + 'GoToInterwiki', + $this->getPrefixedDBKey() + ); + } + return $target->getFullUrl( $query, false, $proto ); + } + /** * Get a URL with no fragment or server name (relative URL) from a Title object. * If this page is generated with action=render, however, @@ -2289,6 +2316,17 @@ class Title implements LinkTarget { ) { $errors[] = [ 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ]; } + } elseif ( $action === 'undelete' ) { + if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $rigor, true ) ) ) { + // Undeleting implies editing + $errors[] = [ 'undelete-cantedit' ]; + } + if ( !$this->exists() + && count( $this->getUserPermissionsErrorsInternal( 'create', $user, $rigor, true ) ) + ) { + // Undeleting where nothing currently exists implies creating + $errors[] = [ 'undelete-cantcreate' ]; + } } return $errors; } diff --git a/includes/api/ApiAuthManagerHelper.php b/includes/api/ApiAuthManagerHelper.php index d037c365bd..8862cc7f9f 100644 --- a/includes/api/ApiAuthManagerHelper.php +++ b/includes/api/ApiAuthManagerHelper.php @@ -169,6 +169,7 @@ class ApiAuthManagerHelper { $this->module->getMain()->markParamsUsed( array_keys( $data ) ); if ( $sensitive ) { + $this->module->getMain()->markParamsSensitive( array_keys( $sensitive ) ); $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' ); } diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index fec4234cf0..b698ceffbc 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -188,6 +188,13 @@ abstract class ApiBase extends ContextSource { */ const PARAM_EXTRA_NAMESPACES = 18; + /* + * (boolean) Is the parameter sensitive? Note 'password'-type fields are + * always sensitive regardless of the value of this field. + * @since 1.29 + */ + const PARAM_SENSITIVE = 19; + /**@}*/ const ALL_DEFAULT_STRING = '*'; @@ -1025,6 +1032,10 @@ abstract class ApiBase extends ContextSource { } else { $type = 'NULL'; // allow everything } + + if ( $type == 'password' || !empty( $paramSettings[self::PARAM_SENSITIVE] ) ) { + $this->getMain()->markParamsSensitive( $encParamName ); + } } if ( $type == 'boolean' ) { @@ -2030,6 +2041,7 @@ abstract class ApiBase extends ContextSource { $params['token'] = [ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_SENSITIVE => true, ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', $this->needsToken(), diff --git a/includes/api/ApiCheckToken.php b/includes/api/ApiCheckToken.php index 3cc7a8a058..480915e60c 100644 --- a/includes/api/ApiCheckToken.php +++ b/includes/api/ApiCheckToken.php @@ -73,6 +73,7 @@ class ApiCheckToken extends ApiBase { 'token' => [ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true, + ApiBase::PARAM_SENSITIVE => true, ], 'maxtokenage' => [ ApiBase::PARAM_TYPE => 'integer', diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php index e3513da80d..41bec355a7 100644 --- a/includes/api/ApiLogin.php +++ b/includes/api/ApiLogin.php @@ -250,6 +250,7 @@ class ApiLogin extends ApiBase { 'token' => [ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => false, // for BC + ApiBase::PARAM_SENSITIVE => true, ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', 'login' ], ], ]; diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index a1fac0cc3d..b5eff7056e 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -161,6 +161,7 @@ class ApiMain extends ApiBase { private $mCacheMode = 'private'; private $mCacheControl = []; private $mParamsUsed = []; + private $mParamsSensitive = []; /** @var bool|null Cached return value from self::lacksSameOriginSecurity() */ private $lacksSameOriginSecurity = null; @@ -1602,13 +1603,17 @@ class ApiMain extends ApiBase { " {$logCtx['ip']} " . "T={$logCtx['timeSpentBackend']}ms"; + $sensitive = array_flip( $this->getSensitiveParams() ); foreach ( $this->getParamsUsed() as $name ) { $value = $request->getVal( $name ); if ( $value === null ) { continue; } - if ( strlen( $value ) > 256 ) { + if ( isset( $sensitive[$name] ) ) { + $value = '[redacted]'; + $encValue = '[redacted]'; + } elseif ( strlen( $value ) > 256 ) { $value = substr( $value, 0, 256 ); $encValue = $this->encodeRequestLogValue( $value ) . '[...]'; } else { @@ -1658,6 +1663,24 @@ class ApiMain extends ApiBase { $this->mParamsUsed += array_fill_keys( (array)$params, true ); } + /** + * Get the request parameters that should be considered sensitive + * @since 1.29 + * @return array + */ + protected function getSensitiveParams() { + return array_keys( $this->mParamsSensitive ); + } + + /** + * Mark parameters as sensitive + * @since 1.29 + * @param string|string[] $params + */ + public function markParamsSensitive( $params ) { + $this->mParamsSensitive += array_fill_keys( (array)$params, true ); + } + /** * Get a request value, and register the fact that it was used, for logging. * @param string $name diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index 85c6860e9e..a235532cf3 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -71,6 +71,7 @@ class ApiPageSet extends ApiBase { private $mInterwikiTitles = []; /** @var Title[] */ private $mPendingRedirectIDs = []; + private $mPendingRedirectSpecialPages = []; // [dbkey] => [ Title $from, Title $to ] private $mResolvedRedirectTitles = []; private $mConvertedTitles = []; private $mGoodRevIDs = []; @@ -813,6 +814,8 @@ class ApiPageSet extends ApiBase { // Get validated and normalized title objects $linkBatch = $this->processTitlesArray( $titles ); if ( $linkBatch->isEmpty() ) { + // There might be special-page redirects + $this->resolvePendingRedirects(); return; } @@ -1033,7 +1036,7 @@ class ApiPageSet extends ApiBase { // Repeat until all redirects have been resolved // The infinite loop is prevented by keeping all known pages in $this->mAllPages - while ( $this->mPendingRedirectIDs ) { + while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) { // Resolve redirects by querying the pagelinks table, and repeat the process // Create a new linkBatch object for the next pass $linkBatch = $this->getRedirectTargets(); @@ -1067,56 +1070,76 @@ class ApiPageSet extends ApiBase { $titlesToResolve = []; $db = $this->getDB(); - $res = $db->select( - 'redirect', - [ - 'rd_from', - 'rd_namespace', - 'rd_fragment', - 'rd_interwiki', - 'rd_title' - ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ], - __METHOD__ - ); - foreach ( $res as $row ) { - $rdfrom = intval( $row->rd_from ); - $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText(); - $to = Title::makeTitle( - $row->rd_namespace, - $row->rd_title, - $row->rd_fragment, - $row->rd_interwiki - ); - $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom]; - unset( $this->mPendingRedirectIDs[$rdfrom] ); - if ( $to->isExternal() ) { - $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); - } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { - $titlesToResolve[] = $to; + if ( $this->mPendingRedirectIDs ) { + $res = $db->select( + 'redirect', + [ + 'rd_from', + 'rd_namespace', + 'rd_fragment', + 'rd_interwiki', + 'rd_title' + ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ], + __METHOD__ + ); + foreach ( $res as $row ) { + $rdfrom = intval( $row->rd_from ); + $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText(); + $to = Title::makeTitle( + $row->rd_namespace, + $row->rd_title, + $row->rd_fragment, + $row->rd_interwiki + ); + $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom]; + unset( $this->mPendingRedirectIDs[$rdfrom] ); + if ( $to->isExternal() ) { + $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { + $titlesToResolve[] = $to; + } + $this->mRedirectTitles[$from] = $to; } - $this->mRedirectTitles[$from] = $to; - } - if ( $this->mPendingRedirectIDs ) { - // We found pages that aren't in the redirect table - // Add them - foreach ( $this->mPendingRedirectIDs as $id => $title ) { - $page = WikiPage::factory( $title ); - $rt = $page->insertRedirect(); - if ( !$rt ) { - // What the hell. Let's just ignore this - continue; + if ( $this->mPendingRedirectIDs ) { + // We found pages that aren't in the redirect table + // Add them + foreach ( $this->mPendingRedirectIDs as $id => $title ) { + $page = WikiPage::factory( $title ); + $rt = $page->insertRedirect(); + if ( !$rt ) { + // What the hell. Let's just ignore this + continue; + } + if ( $rt->isExternal() ) { + $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) { + $titlesToResolve[] = $rt; + } + $from = $title->getPrefixedText(); + $this->mResolvedRedirectTitles[$from] = $title; + $this->mRedirectTitles[$from] = $rt; + unset( $this->mPendingRedirectIDs[$id] ); } - if ( $rt->isExternal() ) { - $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki(); - } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) { - $titlesToResolve[] = $rt; + } + } + + if ( $this->mPendingRedirectSpecialPages ) { + foreach ( $this->mPendingRedirectSpecialPages as $key => list( $from, $to ) ) { + $fromKey = $from->getPrefixedText(); + $this->mResolvedRedirectTitles[$fromKey] = $from; + $this->mRedirectTitles[$fromKey] = $to; + if ( $to->isExternal() ) { + $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki(); + } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) { + $titlesToResolve[] = $to; } - $from = $title->getPrefixedText(); - $this->mResolvedRedirectTitles[$from] = $title; - $this->mRedirectTitles[$from] = $rt; - unset( $this->mPendingRedirectIDs[$id] ); } + $this->mPendingRedirectSpecialPages = []; + + // Set private caching since we don't know what criteria the + // special pages used to decide on these redirects. + $this->mCacheMode = 'private'; } return $this->processTitlesArray( $titlesToResolve ); @@ -1197,8 +1220,26 @@ class ApiPageSet extends ApiBase { $dbkey = $titleObj->getDBkey(); if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) { $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId; - $this->mSpecialTitles[$this->mFakePageId] = $titleObj; - $this->mFakePageId--; + $target = null; + if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) { + $special = SpecialPageFactory::getPage( $dbkey ); + if ( $special instanceof RedirectSpecialArticle ) { + // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of + // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle. + $context = new DerivativeContext( $this ); + $context->setTitle( $titleObj ); + $context->setRequest( new FauxRequest ); + $special->setContext( $context ); + list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey ); + $target = $special->getRedirect( $subpage ); + } + } + if ( $target ) { + $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ]; + } else { + $this->mSpecialTitles[$this->mFakePageId] = $titleObj; + $this->mFakePageId--; + } } } else { // Regular page diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php index 2bb4d03efa..b68a8682c5 100644 --- a/includes/api/ApiQueryDeletedrevs.php +++ b/includes/api/ApiQueryDeletedrevs.php @@ -250,7 +250,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase { $this->addOption( 'LIMIT', $limit + 1 ); $this->addOption( 'USE INDEX', - [ 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ] + [ 'archive' => ( $mode == 'user' ? 'ar_usertext_timestamp' : 'name_title_timestamp' ) ] ); if ( $mode == 'all' ) { if ( $params['unique'] ) { diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php index fee0b78c29..f8f6e7d8a1 100644 --- a/includes/api/ApiQueryWatchlist.php +++ b/includes/api/ApiQueryWatchlist.php @@ -475,7 +475,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => 'user' ], 'token' => [ - ApiBase::PARAM_TYPE => 'string' + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_SENSITIVE => true, ], 'continue' => [ ApiBase::PARAM_HELP_MSG => 'api-help-param-continue', diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php index 116f21928d..b0b1cde92b 100644 --- a/includes/api/ApiQueryWatchlistRaw.php +++ b/includes/api/ApiQueryWatchlistRaw.php @@ -170,7 +170,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { ApiBase::PARAM_TYPE => 'user' ], 'token' => [ - ApiBase::PARAM_TYPE => 'string' + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_SENSITIVE => true, ], 'dir' => [ ApiBase::PARAM_DFLT => 'ascending', diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php index 952e0087c8..3aa7b608dc 100644 --- a/includes/api/ApiUndelete.php +++ b/includes/api/ApiUndelete.php @@ -33,7 +33,6 @@ class ApiUndelete extends ApiBase { $this->useTransactionalTimeLimit(); $params = $this->extractRequestParams(); - $this->checkUserRightsAny( 'undelete' ); $user = $this->getUser(); if ( $user->isBlocked() ) { @@ -45,6 +44,10 @@ class ApiUndelete extends ApiBase { $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] ); } + if ( !$titleObj->userCan( 'undelete', $user, 'secure' ) ) { + $this->dieWithError( 'permdenied-undelete' ); + } + // Check if user can add tags if ( !is_null( $params['tags'] ) ) { $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user ); diff --git a/includes/api/i18n/cs.json b/includes/api/i18n/cs.json index ca1e85a2ee..a6f1a28cc4 100644 --- a/includes/api/i18n/cs.json +++ b/includes/api/i18n/cs.json @@ -13,10 +13,10 @@ "Dvorapa" ] }, - "apihelp-main-description": "
\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
\nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\nTestování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
\nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\nTestování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].", "apihelp-main-param-action": "Která akce se má provést.", "apihelp-main-param-format": "Formát výstupu.", - "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.
Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].", + "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.
Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].", "apihelp-main-param-smaxage": "Nastaví HTTP hlavičku pro řízení kešování s-maxage na uvedený počet sekund. Chyby se nekešují nikdy.", "apihelp-main-param-maxage": "Nastaví HTTP hlavičku pro řízení kešování max-age na uvedený počet sekund. Chyby se nekešují nikdy.", "apihelp-main-param-assert": "Pokud je nastaveno na „user“, ověří, že je uživatel přihlášen, pokud je nastaveno na „bot“, ověří, že má oprávnění „bot“.", @@ -32,7 +32,7 @@ "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.", "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)", "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění hideuser.)", - "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.", "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.", "apihelp-block-example-ip-simple": "Na tři dny zablokovat IP adresu 192.0.2.5 s odůvodněním First strike.", @@ -152,7 +152,7 @@ "apihelp-opensearch-param-search": "Hledaný řetězec.", "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků", "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.", - "apihelp-opensearch-param-suggest": "Pokud je [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vypnuto, nedělat nic.", + "apihelp-opensearch-param-suggest": "Pokud je [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vypnuto, nedělat nic.", "apihelp-opensearch-param-format": "Formát výstupu.", "apihelp-opensearch-example-te": "Najít stránky začínající na „Te“.", "apihelp-options-param-reset": "Vrátit nastavení na výchozí hodnoty.", @@ -244,8 +244,8 @@ "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.", "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).", "api-format-title": "Odpověď z MediaWiki API", - "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr format. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte format=$2.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].", - "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].", + "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr format. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte format=$2.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].", + "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].", "api-help-title": "Nápověda k MediaWiki API", "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API", "api-help-main-header": "Hlavní modul", diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index 14c9986370..074d69ebe4 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -21,10 +21,10 @@ "Zenith" ] }, - "apihelp-main-description": "
\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n
\nStatus: Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\nFehlerhafte Anfragen: Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].\n\nTesten: Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentation]]\n* [[mw:Special:MyLanguage/API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n
\nStatus: Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\nFehlerhafte Anfragen: Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Fehler und Warnungen]].\n\nTesten: Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].", "apihelp-main-param-action": "Auszuführende Aktion.", "apihelp-main-param-format": "Format der Ausgabe.", - "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode maxlag zurückgegeben mit einer Nachricht wie Waiting for $host: $lag seconds lagged.
Siehe [[mw:Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.", + "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode maxlag zurückgegeben mit einer Nachricht wie Waiting for $host: $lag seconds lagged.
Siehe [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.", "apihelp-main-param-smaxage": "Den s-maxage-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gepuffert.", "apihelp-main-param-maxage": "Den max-age-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.", "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf user gesetzt, oder Bot ist, wenn auf bot gesetzt.", @@ -47,7 +47,7 @@ "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.", "apihelp-block-param-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das blockemail-Recht).", "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das hideuser-Recht).", - "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.", "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.", "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.", @@ -265,7 +265,7 @@ "apihelp-opensearch-param-search": "Such-Zeichenfolge.", "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.", "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.", - "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] falsch ist.", + "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] falsch ist.", "apihelp-opensearch-param-redirects": "Wie mit Weiterleitungen umgegangen werden soll:\n;return:Gibt die Weiterleitung selbst zurück.\n;resolve:Gibt die Zielseite zurück. Kann weniger als $1limit Ergebnisse zurückgeben.\nAus Kompatibilitätsgründen ist für $1format=json die Vorgabe \"return\" und \"resolve\" für alle anderen Formate.", "apihelp-opensearch-param-format": "Das Format der Ausgabe.", "apihelp-opensearch-param-warningsaserror": "Wenn Warnungen mit format=json auftreten, gib einen API-Fehler zurück, anstatt ihn zu ignorieren.", @@ -822,7 +822,7 @@ "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.", "apihelp-query+search-example-simple": "Nach meaning suchen.", "apihelp-query+search-example-text": "Texte nach meaning durchsuchen.", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:Special:MyLanguage/LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.", "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen", "apihelp-query+stashimageinfo-param-sessionkey": "Alias für $1filekey, für die Rückwärtskompatibilität.", "apihelp-query+stashimageinfo-example-simple": "Gibt Informationen für eine gespeicherte Datei zurück.", @@ -892,7 +892,7 @@ "apihelp-rsd-example-simple": "Das RSD-Schema exportieren", "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.", "apihelp-setpagelanguage-description": "Ändert die Sprache einer Seite.", - "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], um diese Aktion zu verwenden.", + "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]], um diese Aktion zu verwenden.", "apihelp-setpagelanguage-param-title": "Titel der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit $1pageid verwendet werden.", "apihelp-setpagelanguage-param-pageid": "Kennung der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit $1title verwendet werden.", "apihelp-setpagelanguage-param-lang": "Code der Sprache, auf den die Seite geändert werden soll. Verwende default, um die Seite auf die Standardinhaltssprache des Wikis zurückzusetzen.", @@ -960,7 +960,7 @@ "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.", "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).", "api-format-title": "MediaWiki-API-Ergebnis", - "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter format an, um das Ausgabeformat zu ändern. Lege format=$2 fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.", + "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter format an, um das Ausgabeformat zu ändern. Lege format=$2 fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:Special:MyLanguage/API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.", "api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.", "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.", "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.", @@ -1003,7 +1003,7 @@ "api-help-param-default-empty": "Standard: (leer)", "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.", - "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].", + "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Special:MyLanguage/Manual:$wgMiserMode|Miser-Modus]].", "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.", "api-help-param-no-description": "(keine Beschreibung)", "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:", diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index 5b974e3ec0..3d47b9b0df 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -30,10 +30,10 @@ "The RedBurn" ] }, - "apihelp-main-description": "
\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
\nÉtat : 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\nRequêtes erronées : 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]].\n\nTest : Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/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
\nÉtat : 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\nRequêtes erronées : Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\nTest : Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].", "apihelp-main-param-action": "Quelle action effectuer.", "apihelp-main-param-format": "Le format de sortie.", - "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur maxlag est renvoyé avec un message tel que Attente de $host : $lag secondes de délai.
Voyez [[mw:Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.", + "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur maxlag est renvoyé avec un message tel que Attente de $host : $lag secondes de délai.
Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.", "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache s-maxage à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.", "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache max-age à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.", "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à user, ou s'il a le droit d'un utilisateur robot si positionné à bot.", @@ -57,7 +57,7 @@ "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.", "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le droit blockemail).", "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit hideuser).", - "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.", "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.", "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.", @@ -289,7 +289,7 @@ "apihelp-opensearch-param-search": "Chaîne de caractères cherchée.", "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.", "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.", - "apihelp-opensearch-param-suggest": "Ne rien faire si [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vaut faux.", + "apihelp-opensearch-param-suggest": "Ne rien faire si [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] vaut faux.", "apihelp-opensearch-param-redirects": "Comment gérer les redirections :\n;return:Renvoie la redirection elle-même.\n;resolve:Renvoie la page cible. Peut renvoyer moins de $1limit résultats.\nPour des raisons historiques, la valeur par défaut est « return » pour $1format=json et « resolve » pour les autres formats.", "apihelp-opensearch-param-format": "Le format de sortie.", "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec format=json, renvoyer une erreur d’API au lieu de les ignorer.", @@ -424,7 +424,7 @@ "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.", "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "REMARQUE : du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser $1user et $1namespace ensemble peut aboutir à moins de résultats renvoyés que $1limit avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "REMARQUE : du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser $1user et $1namespace ensemble peut aboutir à avoir moins de résultats renvoyés que $1limit avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.", "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.", @@ -743,7 +743,7 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.", "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés", "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.", - "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.", + "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.", "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.", "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.", "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :", @@ -1071,7 +1071,7 @@ "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.", "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.", "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.", + "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de données ayant la plus grande latence de réplication.", "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.", "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.", "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.", @@ -1079,22 +1079,22 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).", "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que MédiaWiki prend en charge (éventuellement localisée en utilisant $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant $1inlanguagecode, sinon dans la langue du contenu).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de [[mw:Manual:$wgHooks|$wgHooks]]).", - "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.", - "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste d'IDs de variable.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste de protocoles autorisés dans les liens externes.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.", "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.", "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.", "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.", "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.", "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.", - "apihelp-query+siteinfo-example-simple": "Extraire les informations du site", - "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux", - "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle", + "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.", + "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.", + "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.", "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.", "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.", "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.", @@ -1152,7 +1152,7 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Ajoute les marques de la modification.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications patrouillées.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Liste les balises de la modification.", - "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : $2show=!minor.\n\nSi $2show=patrolled ou $2show=!patrolled est positionné, les révisions plus anciennes que [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.", + "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : $2show=!minor.\n\nSi $2show=patrolled ou $2show=!patrolled est positionné, les révisions plus anciennes que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.", "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.", "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications de la dernière révision.", "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur Exemple.", @@ -1227,11 +1227,11 @@ "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.", "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.", "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.", - "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel", + "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlist-example-allrev": "Chercher les informations sur toutes les modifications récentes des pages de la liste de suivi de l’utilisateur actuel", "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel", + "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur Exemple.", "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.", "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.", @@ -1244,17 +1244,17 @@ "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.", "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", - "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel", - "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel", + "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel.", + "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel.", "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.", "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour FooAuthenticationRequest.", "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.", - "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] pour utiliser ce module.", + "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] pour utiliser ce module.", "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.", "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.", "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur Exemple.", "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec une adresse email user@example.com.", - "apihelp-revisiondelete-description": "Supprimer et annuler la suppression des révisions.", + "apihelp-revisiondelete-description": "Supprimer et rétablir des révisions.", "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.", "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.", "apihelp-revisiondelete-param-ids": "Identifiants pour les révisions à supprimer.", @@ -1287,7 +1287,7 @@ "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour Page principale afin que toutes les modifications depuis le 1 janvier 2012 soient non vues", "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms {{ns:user}}.", "apihelp-setpagelanguage-description": "Modifier la langue d’une page.", - "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] pour utiliser cette action.", + "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] pour utiliser cette action.", "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec $1pageid.", "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec $1title.", "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser defaut pour réinitialiser la page sur la langue par défaut du contenu du wiki.", @@ -1400,8 +1400,8 @@ "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.", "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).", "api-format-title": "Résultat de l’API de MediaWiki", - "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", - "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", + "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", + "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de débogage, et n’est pas approprié pour une utilisation applicative.\n\nVoir la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.", "api-format-prettyprint-status": "Cette réponse serait retournée avec l'état HTTP $1 $2.", "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.", "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.", @@ -1449,8 +1449,8 @@ "api-help-param-default-empty": "Par défaut : (vide)", "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Pour rester compatible, le jeton utilisé dans l’IHM web est aussi accepté.", - "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Manual:$wgMiserMode|mode minimal]].", - "api-help-param-limited-in-miser-mode": "NOTE : Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que $1limit renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", + "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]].", + "api-help-param-limited-in-miser-mode": "NOTE : Du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que $1limit renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.", "api-help-param-direction": "Dans quelle direction énumérer :\n;newer:Lister les plus anciens en premier. Note : $1start doit être avant $1end.\n;older:Lister les nouveaux en premier (par défaut). Note : $1start doit être postérieur à $1end.", "api-help-param-continue": "Quand plus de résultats sont disponibles, utiliser cela pour continuer.", "api-help-param-no-description": "(aucune description)", diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json index 392dc45be2..bfaef7a10e 100644 --- a/includes/api/i18n/gl.json +++ b/includes/api/i18n/gl.json @@ -14,10 +14,10 @@ "Hamilton Abreu" ] }, - "apihelp-main-description": "
\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n
\nEstado: Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\nSolicitudes incorrectas: Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].\n\nTest: Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n
\nEstado: Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\nSolicitudes incorrectas: Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\nTest: Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].", "apihelp-main-param-action": "Que acción se realizará.", "apihelp-main-param-format": "O formato de saída.", - "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro maxlag cunha mensaxe como esperando por $host: $lag segundos de retardo.
Para máis información, ver [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]].", + "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro maxlag cunha mensaxe como esperando por $host: $lag segundos de retardo.
Para máis información, ver [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]].", "apihelp-main-param-smaxage": "Fixar a cabeceira HTTP de control de caché s-maxage a esos segundos. Os erros nunca se gardan na caché.", "apihelp-main-param-maxage": "Fixar a cabeceira HTTP de control de caché max-age a esos segundos. Os erros nunca se gardan na caché.", "apihelp-main-param-assert": "Verificar se o usuario está conectado como usuario ou ten a marca de bot.", @@ -41,7 +41,7 @@ "apihelp-block-param-autoblock": "Bloquear automaticamente o último enderezo IP utilizado, e calquera outro enderezo desde o que intente conectarse.", "apihelp-block-param-noemail": "Impide que o usuario envíe correos electrónicos a través da wiki. (Require o permiso blockemail).", "apihelp-block-param-hidename": "Ocultar o nome de usuario do rexistro de bloqueos. (Precisa do permiso hideuser).", - "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.", "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario", "apihelp-block-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de bloqueos.", @@ -273,7 +273,7 @@ "apihelp-opensearch-param-search": "Buscar texto.", "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.", "apihelp-opensearch-param-namespace": "Espazo de nomes no que buscar.", - "apihelp-opensearch-param-suggest": "Non facer nada se [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] é falso.", + "apihelp-opensearch-param-suggest": "Non facer nada se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] é falso.", "apihelp-opensearch-param-redirects": "Como xestionar as redireccións:\n;return:Devolve a mesma redirección.\n;resolve:Devolve a páxina á que apunta. Pode devolver menos de $1limit resultados.\nPor razóns históricas, o valor por defecto para $1format=json é \"return\" e \"resolve\" para outros formatos.", "apihelp-opensearch-param-format": "O formato de saída.", "apihelp-opensearch-param-warningsaserror": "Se os avisos son recibidos con format=json, devolver un erro de API no canto de ignoralos.", @@ -407,7 +407,7 @@ "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.", "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.", "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez $1user e $1namespace pode devolver menos resultados de $1limit antes de continuar, en casos extremos, pode que non devolva resultados.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "Nota: Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], ó usar á vez $1user e $1namespace pode devolver menos resultados de $1limit antes de continuar, en casos extremos, pode que non devolva resultados.", "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.", "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.", @@ -726,7 +726,7 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.", "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.", "apihelp-query+filerepoinfo-description": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.", - "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de [[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.", + "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de [[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.", "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros", "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.", "apihelp-query+fileusage-param-prop": "Que propiedades obter:", @@ -1062,11 +1062,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.", "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.", "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando $1inlanguagecode, noutro caso no idioma do contido).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.", @@ -1135,7 +1135,7 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "Engade os indicadores da modificación.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marca as modificacións vixiadas.", "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da modificación.", - "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: $2show=!minor.\n\nSe está fixado $2show=patrolled ou $2show=!patrolled, as modificacións máis antigas que [[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.", + "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: $2show=!minor.\n\nSe está fixado $2show=patrolled ou $2show=!patrolled, as modificacións máis antigas que [[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]] ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.", "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.", "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.", "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario Exemplo.", @@ -1232,7 +1232,7 @@ "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.", "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para FooAuthenticationRequest.", "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.", - "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] para usar este módulo.", + "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] para usar este módulo.", "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.", "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.", "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario Exemplo.", @@ -1270,7 +1270,7 @@ "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a Main page 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 {{ns:user}}.", "apihelp-setpagelanguage-description": "Cambiar a lingua dunha páxina.", - "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", + "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] para utilizar esta acción.", "apihelp-setpagelanguage-param-title": "Título da páxina cuxa lingua quere cambiar. Non se pode usar xunto con $1pageid.", "apihelp-setpagelanguage-param-pageid": "Identificador da páxina cuxa lingua quere cambiar. Non se pode usar xunto con $1title.", "apihelp-setpagelanguage-param-lang": "Código da lingua á que se quere cambiar a páxina. Use default para restablecer a páxina á lingua por defecto do contido da wiki.", @@ -1383,8 +1383,8 @@ "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.", "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).", "api-format-title": "Resultado de API de MediaWiki", - "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro format para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe format=$2.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.", - "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.", + "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro format para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe format=$2.\n\n\nRevise a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.", + "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:Special:MyLanguage/API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.", "api-format-prettyprint-status": "Esta resposta será devolta co estado de HTTP $1 $2.", "api-pageset-param-titles": "Lista de títulos nos que traballar.", "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.", @@ -1432,8 +1432,8 @@ "api-help-param-default-empty": "Por defecto: (baleiro)", "api-help-param-token": "Un identificador \"$1\" recuperado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "Por compatibilidade, o identificador usado na web UI tamén é aceptado.", - "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Manual:$wgMiserMode|modo minimal]].", - "api-help-param-limited-in-miser-mode": "Nota: Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de $1limit resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.", + "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]].", + "api-help-param-limited-in-miser-mode": "Nota: Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de $1limit resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.", "api-help-param-direction": "En que dirección enumerar:\n;newer:Lista os máis antigos primeiro. Nota: $1start ten que estar antes que $1end.\n;older:Lista os máis novos primeiro (por defecto). Nota: $1start ten que estar despois que $1end.", "api-help-param-continue": "Cando estean dispoñibles máis resultados, use isto para continuar.", "api-help-param-no-description": "(sen descrición)", @@ -1479,6 +1479,7 @@ "apierror-badurl": "Valor \"$2\" non válido para o parámetro de URL $1.", "apierror-baduser": "Valor \"$2\" non válido para o parámetro de usuario $1.", "apierror-badvalue-notmultivalue": "O separador multivalor U+001F só pode utilizarse en parámetros multivalorados.", + "apierror-bad-watchlist-token": "Identificador de lista de vixilancia proporcionado incorrecto. Por favor, obteña un identificador correcto en [[Special:Preferences]].", "apierror-blockedfrommail": "Foi bloqueado para o envío de correos electrónicos.", "apierror-blocked": "Foi bloqueado fronte á edición.", "apierror-botsnotsupported": "Esta interface non está dispoñible para bots.", @@ -1644,11 +1645,17 @@ "apiwarn-deprecation-withreplacement": "$1 está obsoleto. No seu lugar, utilice $2.", "apiwarn-invalidcategory": "\"$1\" non é unha categoría.", "apiwarn-invalidtitle": "\"$1\" non é un título válido.", + "apiwarn-invalidxmlstylesheetext": "As follas de estilo deben ter a extensión .xsl.", + "apiwarn-invalidxmlstylesheet": "A folla de estilos especificada non é válida ou non existe.", + "apiwarn-invalidxmlstylesheetns": "A folla de estilos debería estar no espazo de nomes {{ns:MediaWiki}}.", + "apiwarn-moduleswithoutvars": "A propiedade modules está definida, pero non o está jsconfigvars nin encodedjsconfigvars. As variables de configuración son necesarias para o correcto uso do módulo.", "apiwarn-notfile": "\"$1\" non é un ficheiro.", "apiwarn-parse-nocontentmodel": "Non se proporcionou title nin contentmodel, asúmese $1.", "apiwarn-tokennotallowed": "A acción \"$1\" non está permitida para o usuario actual.", "apiwarn-toomanyvalues": "Demasiados valores para o parámetro $1. O límite é $2.", "apiwarn-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.", + "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor non recoñecido|Valores non recoñecidos}} para o parámetro $1: $2.", + "apiwarn-validationfailed-badchars": "caracteres non válidos na clave (só se admiten os caracteres a-z, A-Z, 0-9, _ e -).", "apiwarn-validationfailed-badpref": "non é unha preferencia válida.", "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.", "apiwarn-validationfailed-keytoolong": "clave demasiado longa (non pode ter máis de $1 bytes).", diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index f10334a226..a948c850c5 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -17,10 +17,10 @@ "שמזן" ] }, - "apihelp-main-description": "
\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
\nמצב: כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\nבקשות שגויות: כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\nבדיקה: לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|תיעוד]]\n* [[mw:Special:MyLanguage/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
\nמצב: כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\nבקשות שגויות: כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:Special:MyLanguage/API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\nבדיקה: לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].", "apihelp-main-param-action": "איזו פעולה לבצע.", "apihelp-main-param-format": "תסדיר הפלט.", - "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה maxlag מוחזר עם הודעה כמו Waiting for $host: $lag seconds lagged.
ר' [[mw:Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.", + "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה maxlag מוחזר עם הודעה כמו Waiting for $host: $lag seconds lagged.
ר' [[mw:Special:MyLanguage/Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.", "apihelp-main-param-smaxage": "הגדרת כותרת בקרת מטמון HTTP‏ s-maxage למספר כזה של שניות.", "apihelp-main-param-maxage": "הגדרת כותרת בקרת מטמון HTTP‏ max-age למספר כזה של שניות.", "apihelp-main-param-assert": "לוודא שהמשתמש נכנס אם זה מוגדר ל־user, או שיש לו הרשאת בוט אם זה bot.", @@ -44,7 +44,7 @@ "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.", "apihelp-block-param-noemail": "למנוע ממשתמש לשלוח דואר אלקטרוני דרך הוויקי. (דורש את ההרשאה blockemail).", "apihelp-block-param-hidename": "הסרת השם מיומן החסימות. (דורש את ההרשאה hideuser.)", - "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.", "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.", "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.", @@ -276,7 +276,7 @@ "apihelp-opensearch-param-search": "מחרוזת לחיפוש.", "apihelp-opensearch-param-limit": "המספר המרבי של התוצאות שתוחזרנה.", "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.", - "apihelp-opensearch-param-suggest": "לא לעשות דבר אם [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] הוא false.", + "apihelp-opensearch-param-suggest": "לא לעשות דבר אם [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] הוא false.", "apihelp-opensearch-param-redirects": "איך לטפל בהפניות:\n;return:להחזיר את ההפניה עצמה.\n;resolve:להחזיר את דף היעד. יכול להחזיר פחות מ־$1limit תוצאות.\nמסיבות היסטוריות, בררת המחדל היא \"return\" עבור $1format=json ו־\"resolve\" עבור תסדירים אחרים.", "apihelp-opensearch-param-format": "תסדיר הפלט.", "apihelp-opensearch-param-warningsaserror": "אם אזהרות מוּעלות עם format=json, להחזיר שגיאת API במקום להתעלם מהן.", @@ -331,6 +331,7 @@ "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר $1disablelimitreport.", "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר $1disablelimitreport.", "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן $1)", + "apihelp-parse-paramvalue-prop-parsewarnings": "נותן אזהרות שאירעו בזמן פענוח התוכן.", "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.", "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם $1text.", "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם $1prop=langlinks).", @@ -410,7 +411,7 @@ "apihelp-query+alldeletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.", "apihelp-query+alldeletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.", "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "לתשומת לבך: בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־$1user וב־$1namespace ביחד עלול להניב החזרה של פחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "לתשומת לבך: בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־$1user וב־$1namespace ביחד עלול להניב החזרה של פחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.", "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.", "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש Example.", "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.", @@ -729,7 +730,7 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.", "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.", "apihelp-query+filerepoinfo-description": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.", - "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]] ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.", + "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]] ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.", "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.", "apihelp-query+fileusage-description": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.", "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:", @@ -1065,11 +1066,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.", "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם $1inlanguagecode).", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.", "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות $1inlanguagecode, אחרת זה יהיה בשפת התוכן).", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של [[mw:Manual:$wgHooks|$wgHooks]]).", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של [[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]).", "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.", "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.", @@ -1138,7 +1139,7 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "הוספת הדגלים של העריכה.", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "מתייג עריכות בדוקות.", "apihelp-query+usercontribs-paramvalue-prop-tags": "רשימת תגים עבור עריכות.", - "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר $2show=patrolled או $2show=!patrolled, גרסאות ישנות מ־[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.", + "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר $2show=patrolled או $2show=!patrolled, גרסאות ישנות מ־[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.", "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.", "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.", "apihelp-query+usercontribs-example-user": "הצגת התרומות של המשתמש Example.", @@ -1235,7 +1236,7 @@ "apihelp-removeauthenticationdata-description": "הסרת נתוני אימות עבור המשתמש הנוכחי.", "apihelp-removeauthenticationdata-example-simple": "לנסות להסיר את נתוני המשתמש הנוכחי בשביל FooAuthenticationRequest.", "apihelp-resetpassword-description": "שליחת דוא\"ל איפוס סיסמה למשתמש.", - "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", + "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]].", "apihelp-resetpassword-param-user": "המשתמש שמאופס.", "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.", "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש Example.", @@ -1273,7 +1274,7 @@ "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־Main page כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.", "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם {{ns:user}}.", "apihelp-setpagelanguage-description": "שנה את השפה של דף", - "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את [[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] על מנת להשתמש בפעולה זו", + "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את [[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] על מנת להשתמש בפעולה זו", "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם $1pageid.", "apihelp-setpagelanguage-param-pageid": "מזהה הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם $1title.", "apihelp-setpagelanguage-param-lang": "קוד השפה של השפה שאליה צריך לשנות את הדף. יש להשתמש ב־default כדי לאתחל את הדף לשפת בררת המחדל של הוויקי.", @@ -1386,8 +1387,8 @@ "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.", "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).", "api-format-title": "תוצאה של API של מדיה־ויקי", - "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", - "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", + "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", + "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.", "api-format-prettyprint-status": "התשובה הזאת הייתה מוחזרת עם סטטוס ה־HTTP מס' $1 עם הטקסט $2.", "api-pageset-param-titles": "רשימת כותרות.", "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.", @@ -1435,8 +1436,8 @@ "api-help-param-default-empty": "ברירת מחדל: (ריק)", "api-help-param-token": "אסימון \"$1\" שאוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]", "api-help-param-token-webui": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.", - "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]].", - "api-help-param-limited-in-miser-mode": "לתשומת לבך: בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.", + "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]].", + "api-help-param-limited-in-miser-mode": "לתשומת לבך: בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־$1limit תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.", "api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.", "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.", "api-help-param-no-description": "(ללא תיאור)", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index d84775fbb1..22b23f03cf 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -19,7 +19,7 @@ "Margherita.mignanelli" ] }, - "apihelp-main-description": "
\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n
\nStato: tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\nIstruzioni sbagliate: quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\nTest: per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Documentazione]] (in inglese)\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n
\nStato: tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\nIstruzioni sbagliate: quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\nTest: per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].", "apihelp-main-param-action": "Azione da compiere.", "apihelp-main-param-format": "Formato dell'output.", "apihelp-main-param-assert": "Verifica che l'utente abbia effettuato l'accesso se si è impostato user, o che abbia i permessi di bot se si è impostato bot.", @@ -205,7 +205,7 @@ "apihelp-move-example-move": "Sposta Badtitle a Goodtitle senza lasciare redirect.", "apihelp-opensearch-param-search": "Stringa di ricerca.", "apihelp-opensearch-param-limit": "Numero massimo di risultati da restituire.", - "apihelp-opensearch-param-suggest": "Non fare nulla se [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] è falso.", + "apihelp-opensearch-param-suggest": "Non fare nulla se [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] è falso.", "apihelp-opensearch-param-format": "Il formato dell'output.", "apihelp-opensearch-example-te": "Trova le pagine che iniziano con Te.", "apihelp-options-param-optionvalue": "Il valore per l'opzione specificata da $1optionname.", @@ -530,6 +530,7 @@ "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.", "apihelp-query+siteinfo-paramvalue-prop-extensions": "Restituisci estensioni installate sul wiki.", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Restituisce un'elenco di codici lingua per cui [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] è attivo, e le varianti supportate per ognuno di essi.", "apihelp-query+siteinfo-example-simple": "Recupera informazioni sul sito.", "apihelp-query+tags-param-prop": "Quali proprietà ottenere:", "apihelp-query+templates-param-limit": "Quanti template restituire.", @@ -578,7 +579,7 @@ "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.", "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per FooAuthenticationRequest.", "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.", - "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] per usare questo modulo.", + "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in [[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]] per usare questo modulo.", "apihelp-resetpassword-param-user": "Utente in corso di ripristino.", "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.", "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente Example.", diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json index a803645fb8..262f903f01 100644 --- a/includes/api/i18n/lb.json +++ b/includes/api/i18n/lb.json @@ -159,6 +159,7 @@ "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.", "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren", "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren", + "apihelp-setpagelanguage-description-disabled": "Aschalten\n[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]] fir dëse Aktioun ze benotzen", "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.", "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der Main Page op baskesch.", "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.", diff --git a/includes/api/i18n/nl.json b/includes/api/i18n/nl.json index a305bc2170..a5291c7956 100644 --- a/includes/api/i18n/nl.json +++ b/includes/api/i18n/nl.json @@ -18,10 +18,10 @@ "Mainframe98" ] }, - "apihelp-main-description": "
\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n
\nStatus: Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\nFoutieve verzoeken: als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\nTesten: u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Documentatie]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n
\nStatus: Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\nFoutieve verzoeken: als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Foutmeldingen en waarschuwingen]] voor meer informatie.\n\nTesten: u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].", "apihelp-main-param-action": "Welke handeling uit te voeren.", "apihelp-main-param-format": "De opmaak van de uitvoer.", - "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode maxlag teruggegeven met een bericht als Waiting for $host: $lag seconds lagged.
Zie [[mw:Manual:Maxlag_parameter|Handboek: Maxlag parameter]] voor mee informatie.", + "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode maxlag teruggegeven met een bericht als Waiting for $host: $lag seconds lagged.
Zie [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handleiding:Maxlag parameter]] voor meer informatie.", "apihelp-main-param-smaxage": "Stelt de s-maxage HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.", "apihelp-main-param-maxage": "Stelt de max-age HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.", "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als user is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als bot is meegegeven.", @@ -42,7 +42,7 @@ "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.", "apihelp-block-param-noemail": "Gebruiker weerhouden van het sturen van e-mail. (Vereist het blockemail recht).", "apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het hideuser recht).", - "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.", "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.", "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.", @@ -134,6 +134,7 @@ "apihelp-feedrecentchanges-param-feedformat": "De indeling van de feed.", "apihelp-feedrecentchanges-param-namespace": "Naamruimte om de resultaten tot te beperken.", "apihelp-feedrecentchanges-param-invert": "Alle naamruimten behalve de geselecteerde.", + "apihelp-feedrecentchanges-param-days": "Aantal dagen om de resultaten tot te beperken.", "apihelp-feedrecentchanges-param-limit": "Het maximaal aantal weer te geven resultaten.", "apihelp-feedrecentchanges-param-hideminor": "Kleine wijzigingen verbergen.", "apihelp-feedrecentchanges-param-hidebots": "Wijzigingen gedaan door bots verbergen.", @@ -220,6 +221,7 @@ "apihelp-purge-param-forcelinkupdate": "Werk de koppelingstabellen bij.", "apihelp-purge-param-forcerecursivelinkupdate": "Werk de koppelingentabel bij, en werk de koppelingstabellen bij voor alle pagina's die gebruik maken van deze pagina als sjabloon.", "apihelp-query+allcategories-param-dir": "Richting om in te sorteren.", + "apihelp-query+allcategories-param-limit": "Hoeveel categorieën te tonen.", "apihelp-query+allcategories-paramvalue-prop-size": "Voegt het aantal pagina's in de categorie toe.", "apihelp-query+allcategories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met __HIDDENCAT__", "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.", diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json index 25e833095b..a339459249 100644 --- a/includes/api/i18n/pl.json +++ b/includes/api/i18n/pl.json @@ -37,7 +37,7 @@ "apihelp-block-param-autoblock": "Zablokuj ostatni adres IP tego użytkownika i automatycznie wszystkie kolejne, z których będzie się logował.", "apihelp-block-param-noemail": "Uniemożliwia użytkownikowi wysyłanie wiadomości e-mail za pośrednictwem interfejsu wiki. (Wymagane uprawnienie blockemail).", "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienia hideuser)", - "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Jeżeli ten użytkownik jest już zablokowany, nadpisz blokadę.", "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika i jego IP oraz ich strony dyskusji.", "apihelp-block-example-ip-simple": "Zablokuj IP 192.0.2.5 na 3 dni z powodem First strike.", @@ -221,7 +221,7 @@ "apihelp-opensearch-param-search": "Wyszukaj tekst.", "apihelp-opensearch-param-limit": "Maksymalna liczba zwracanych wyników.", "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania.", - "apihelp-opensearch-param-suggest": "Nie działa jeżeli [[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] ustawiono na false.", + "apihelp-opensearch-param-suggest": "Nic nie rób, jeżeli [[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]] ustawiono na false.", "apihelp-opensearch-param-redirects": "Jak obsługiwać przekierowania:\n;return:Zwróć samo przekierowanie.\n;resolve:Zwróć stronę docelową. Może zwrócić mniej niż wyników określonych w $1limit.\nZ powodów historycznych, domyślnie jest to \"return\" dla $1format=json, a \"resolve\" dla innych formatów.", "apihelp-opensearch-param-format": "Format danych wyjściowych.", "apihelp-opensearch-param-warningsaserror": "Jeżeli pojawią się ostrzeżenia związane z format=json, zwróć błąd API zamiast ignorowania ich.", diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json index 723839aa1d..671ac987fd 100644 --- a/includes/api/i18n/ru.json +++ b/includes/api/i18n/ru.json @@ -24,13 +24,14 @@ "Mailman", "Ping08", "Ivan-r", - "Redredsonia" + "Redredsonia", + "Alexey zakharenkov" ] }, - "apihelp-main-description": "
\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
\nСтатус: Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\nОшибочные запросы: Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\nТестирование: для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/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
\nСтатус: Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\nОшибочные запросы: Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\nТестирование: для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].", "apihelp-main-param-action": "Действие, которое следует выполнить.", "apihelp-main-param-format": "Формат вывода.", - "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki устанавливается на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «maxlag» с сообщением «Waiting for $host: $lag seconds lagged».
См. подробнее на странице с описанием [[mw:Manual:Maxlag_parameter|параметра maxlag]].", + "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki устанавливается на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «maxlag» с сообщением «Waiting for $host: $lag seconds lagged».
См. подробнее на странице с описанием [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: параметра Maxlag ]].", "apihelp-main-param-smaxage": "Устанавливает значение HTTP-заголовка Cache-Control s-maxage в заданное число секунд. Ошибки никогда не кэшируются.", "apihelp-main-param-maxage": "Устанавливает значение HTTP-заголовка Cache-Control s-maxage в заданное число секунд. Ошибки никогда не кэшируются.", "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано user, или что имеет права бота, если задано bot.", @@ -51,7 +52,7 @@ "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный IP-адрес и все последующие, с которых будут совершаться попытки авторизации.", "apihelp-block-param-noemail": "Запретить участнику отправлять электронную почту через интерфейс вики. (Требуется право blockemail).", "apihelp-block-param-hidename": "Скрыть имя участника из журнала блокировок. (Требуется право hideuser).", - "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от [[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.", "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.", "apihelp-block-example-ip-simple": "Заблокировать IP-адрес 192.0.2.5 в течение трех дней с причиной первого удара.", @@ -331,6 +332,7 @@ "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено", "apihelp-query+search-description": "Выполнить полнотекстовый поиск.", "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список кодов языков, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты,поддерживаемые для каждого языка.", "apihelp-query+tags-description": "Список изменерий тегов.", "apihelp-query+tags-example-simple": "Лист доступных тегов", "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен", diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json index 93af817ed1..152f1df264 100644 --- a/includes/api/i18n/zh-hans.json +++ b/includes/api/i18n/zh-hans.json @@ -25,10 +25,10 @@ "D41D8CD98F" ] }, - "apihelp-main-description": "
\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
\n状态信息:本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n错误请求:当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n测试中:测试API请求的易用性,请参见[[Special:ApiSandbox]]。", + "apihelp-main-description": "
\n* [[mw:Special:MyLanguage/API:Main_page|文档]]\n* [[mw:Special:MyLanguage/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
\n状态信息:本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n错误请求:当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API: 错误与警告]]。\n\n测试中:测试API请求的易用性,请参见[[Special:ApiSandbox]]。", "apihelp-main-param-action": "要执行的操作。", "apihelp-main-param-format": "输出的格式。", - "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码maxlag会返回消息,例如等待$host中:延迟$lag秒。
参见[[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。", + "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码maxlag会返回消息,例如等待$host中:延迟$lag秒。
参见[[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。", "apihelp-main-param-smaxage": "设置s-maxage HTTP缓存控制头至这些秒。错误不会缓存。", "apihelp-main-param-maxage": "设置max-age HTTP缓存控制头至这些秒。错误不会缓存。", "apihelp-main-param-assert": "如果设置为user就验证用户是否登录,或如果设置为bot就验证是否有机器人用户权限。", @@ -52,7 +52,7 @@ "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。", "apihelp-block-param-noemail": "阻止用户通过wiki发送电子邮件。(需要blockemail权限)。", "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要hideuser权限)。", - "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]])。", + "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]])。", "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。", "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。", "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。", @@ -284,7 +284,7 @@ "apihelp-opensearch-param-search": "搜索字符串。", "apihelp-opensearch-param-limit": "要返回的结果最大数。", "apihelp-opensearch-param-namespace": "搜索的名字空间。", - "apihelp-opensearch-param-suggest": "如果[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]设置为false则不做任何事情。", + "apihelp-opensearch-param-suggest": "如果[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]设置为false则不做任何事情。", "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"。", "apihelp-opensearch-param-format": "输出格式。", "apihelp-opensearch-param-warningsaserror": "如果警告通过format=json提升,返回一个API错误而不是忽略它们。", @@ -419,7 +419,7 @@ "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。", "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。", "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。", - "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意:由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用$1user和$1namespace将导致继续前返回少于$1limit个结果,在极端条件下可能不返回任何结果。", + "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "注意:由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],同时使用$1user和$1namespace将导致继续前返回少于$1limit个结果,在极端条件下可能不返回任何结果。", "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。", "apihelp-query+alldeletedrevisions-example-user": "列出由Example作出的最近50次已删除贡献。", "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。", @@ -738,7 +738,7 @@ "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。", "apihelp-query+filearchive-example-simple": "显示已删除文件列表。", "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。", - "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]],并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。", + "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]],并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。", "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。", "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。", "apihelp-query+fileusage-param-prop": "要获取的属性:", @@ -1074,11 +1074,11 @@ "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "当可用时返回wiki的版权(许可协议)信息。", "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。", "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用$1inlanguagecode本地化)。", - "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。", + "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:Special:MyLanguage/LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。", "apihelp-query+siteinfo-paramvalue-prop-skins": "返回所有启用的皮肤列表(可选择使用$1inlanguagecode本地化,否则是内容语言)。", "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "返回解析器扩展标签列表。", "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "返回解析器函数钩列表。", - "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表([[mw:Manual:$wgHooks|$wgHooks]]的内容)。", + "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表([[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]的内容)。", "apihelp-query+siteinfo-paramvalue-prop-variables": "返回变量ID列表。", "apihelp-query+siteinfo-paramvalue-prop-protocols": "返回外部链接中允许的协议列表。", "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "返回用户设置的默认值。", @@ -1147,7 +1147,7 @@ "apihelp-query+usercontribs-paramvalue-prop-flags": "添加编辑标记。", "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。", "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。", - "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:$2show=!minor。\n\n如果$2show=patrolled或$2show=!patrolled被设定,早于[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]($1秒)的修订不会被显示。", + "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:$2show=!minor。\n\n如果$2show=patrolled或$2show=!patrolled被设定,早于[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]($1秒)的修订不会被显示。", "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。", "apihelp-query+usercontribs-param-toponly": "只列举作为最新修订的更改。", "apihelp-query+usercontribs-example-user": "显示用户Example的贡献。", @@ -1157,6 +1157,7 @@ "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。", "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签messages。", "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。", + "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "列举明确分配给当前用户的用户组,包括每个用户组成员的过期时间。", "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。", "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。", "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "列举当前用户可以添加并移除的用户组。", @@ -1177,6 +1178,7 @@ "apihelp-query+users-param-prop": "要包含的信息束:", "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。", "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。", + "apihelp-query+users-paramvalue-prop-groupmemberships": "列举明确分配给每位用户的用户组,包括每个用户组成员的过期时间。", "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。", "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。", "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。", @@ -1242,7 +1244,7 @@ "apihelp-removeauthenticationdata-description": "从当前用户移除身份验证数据。", "apihelp-removeauthenticationdata-example-simple": "尝试移除当前用户的FooAuthenticationRequest数据。", "apihelp-resetpassword-description": "向用户发送密码重置邮件。", - "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]中启用路由以使用此模块。", + "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]中启用路由以使用此模块。", "apihelp-resetpassword-param-user": "正在重置的用户。", "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。", "apihelp-resetpassword-example-user": "向用户Example发送密码重置邮件。", @@ -1280,7 +1282,7 @@ "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置Main page的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。", "apihelp-setnotificationtimestamp-example-allpages": "重置在{{ns:user}}名字空间中的页面的通知状态。", "apihelp-setpagelanguage-description": "更改页面的语言。", - "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]以使用此操作。", + "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]以使用此操作。", "apihelp-setpagelanguage-param-title": "您希望更改语言的页面标题。不能与$1pageid一起使用。", "apihelp-setpagelanguage-param-pageid": "您希望更改语言的页面ID。不能与$1title一起使用。", "apihelp-setpagelanguage-param-lang": "更改页面的目标语言的语言代码。使用default以重置页面为wiki的默认内容语言。", @@ -1393,8 +1395,8 @@ "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。", "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。", "api-format-title": "MediaWiki API 结果", - "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定format参数以更改输出格式。要查看$1格式的非HTML表示,设置format=$2。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。", - "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", + "api-format-prettyprint-header": "这是$1格式的HTML实现。HTML对调试很有用,但不适合应用程序使用。\n\n指定format参数以更改输出格式。要查看$1格式的非HTML实现,设置format=$2。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", + "api-format-prettyprint-header-only-html": "这是用来调试的HTML实现,不适合实际使用。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。", "api-format-prettyprint-status": "此响应将会返回HTTP状态$1 $2。", "api-pageset-param-titles": "要工作的标题列表。", "api-pageset-param-pageids": "要工作的页面ID列表。", @@ -1442,8 +1444,8 @@ "api-help-param-default-empty": "默认:(空)", "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌", "api-help-param-token-webui": "出于兼容性考虑,web UI中使用的令牌也被接受。", - "api-help-param-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。", - "api-help-param-limited-in-miser-mode": "注意:由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于$1limit个结果;极端情况下可能不会返回任何结果。", + "api-help-param-disabled-in-miser-mode": "由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]]而禁用。", + "api-help-param-limited-in-miser-mode": "注意:由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于$1limit个结果;极端情况下可能不会返回任何结果。", "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。", "api-help-param-continue": "当更多结果可用时,使用这个继续。", "api-help-param-no-description": "(没有说明)", @@ -1636,6 +1638,7 @@ "apierror-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。", "apierror-systemblocked": "您已被MediaWiki自动封禁。", "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。", + "apierror-toofewexpiries": "提供了$1个逾期{{PLURAL:$1|时间戳}},实际则需要$2个。", "apierror-unknownaction": "指定的操作$1不被承认。", "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。", "apierror-unknownerror-nocode": "未知错误。", @@ -1676,6 +1679,7 @@ "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。", "apiwarn-parse-nocontentmodel": "title或contentmodel未提供,假设$1。", "apiwarn-parse-titlewithouttext": "title在没有text的情况下被使用,并且请求了已解析页面的属性。您是想用page而不是title么?", + "apiwarn-redirectsandrevids": "重定向解决方案不能与revids参数一起使用。任何revids所指向的重定向都未被解决。", "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。", "apiwarn-toomanyvalues": "参数$1指定了太多的值。上限为$2。", "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。", diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php index 70e1d9a75d..8a42a9a72d 100644 --- a/includes/cache/MessageCache.php +++ b/includes/cache/MessageCache.php @@ -485,7 +485,8 @@ class MessageCache { } else { # Effectively disallows use of '/' character in NS_MEDIAWIKI for uses # other than language code. - $conds[] = 'page_title NOT' . $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() ); + $conds[] = 'page_title NOT' . + $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() ); } # Conditions to fetch oversized pages to ignore them @@ -551,7 +552,7 @@ class MessageCache { /** * Updates cache as necessary when message page is changed * - * @param string $title Message cache key with initial uppercase letter. + * @param string $title Message cache key with initial uppercase letter * @param string|bool $text New contents of the page (false if deleted) */ public function replace( $title, $text ) { @@ -596,9 +597,8 @@ class MessageCache { $page->loadPageData( $page::READ_LATEST ); $text = $this->getMessageTextFromContent( $page->getContent() ); // Check if an individual cache key should exist and update cache accordingly - $titleKey = $this->wanCache->makeKey( - 'messages-big', $this->mCache[$code]['HASH'], $title ); if ( is_string( $text ) && strlen( $text ) > $wgMaxMsgCacheEntrySize ) { + $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title ); $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry ); } // Mark this cache as definitely being "latest" (non-volatile) so @@ -967,8 +967,8 @@ class MessageCache { * some callers require this behavior. LanguageConverter::parseCachedTable() * and self::get() are some examples in core. * - * @param string $title Message cache key with initial uppercase letter. - * @param string $code Code denoting the language to try. + * @param string $title Message cache key with initial uppercase letter + * @param string $code Code denoting the language to try * @return string|bool The message, or false if it does not exist or on error */ public function getMsgFromNamespace( $title, $code ) { @@ -995,8 +995,8 @@ class MessageCache { return false; } - // Try the individual message cache - $titleKey = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title ); + // Individual message cache key + $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title ); if ( $this->mCacheVolatile[$code] ) { $entry = false; @@ -1005,6 +1005,7 @@ class MessageCache { __METHOD__ . ': loading volatile key \'{titleKey}\'', [ 'titleKey' => $titleKey, 'code' => $code ] ); } else { + // Try the individual message cache $entry = $this->wanCache->get( $titleKey ); } @@ -1057,7 +1058,8 @@ class MessageCache { $message = false; // negative caching } - if ( $message === false ) { // negative caching + if ( $message === false ) { + // Negative caching in case a "too big" message is no longer available (deleted) $this->mCache[$code][$title] = '!NONEXISTENT'; $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts ); } @@ -1301,4 +1303,13 @@ class MessageCache { return $msgText; } + + /** + * @param string $hash Hash for this version of the entire key/value overrides map + * @param string $title Message cache key with initial uppercase letter + * @return string + */ + private function bigMessageCacheKey( $hash, $title ) { + return $this->wanCache->makeKey( 'messages-big', $hash, $title ); + } } diff --git a/includes/cache/localisation/LocalisationCache.php b/includes/cache/localisation/LocalisationCache.php index cbff113761..d499340d0e 100644 --- a/includes/cache/localisation/LocalisationCache.php +++ b/includes/cache/localisation/LocalisationCache.php @@ -212,19 +212,17 @@ class LocalisationCache { case 'detect': if ( !empty( $conf['storeDirectory'] ) ) { $storeClass = 'LCStoreCDB'; + } elseif ( $wgCacheDirectory ) { + $storeConf['directory'] = $wgCacheDirectory; + $storeClass = 'LCStoreCDB'; } else { - $cacheDir = $wgCacheDirectory ?: wfTempDir(); - if ( $cacheDir ) { - $storeConf['directory'] = $cacheDir; - $storeClass = 'LCStoreCDB'; - } else { - $storeClass = 'LCStoreDB'; - } + $storeClass = 'LCStoreDB'; } break; default: throw new MWException( - 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' ); + 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' + ); } } diff --git a/includes/config/EtcdConfig.php b/includes/config/EtcdConfig.php new file mode 100644 index 0000000000..0f2f64103a --- /dev/null +++ b/includes/config/EtcdConfig.php @@ -0,0 +1,275 @@ + 'http', + 'encoding' => 'JSON', + 'cacheTTL' => 10, + 'skewTTL' => 1, + 'timeout' => 10 + ]; + + $this->host = $params['host']; + $this->protocol = $params['protocol']; + $this->directory = trim( $params['directory'], '/' ); + $this->directoryHash = sha1( $this->directory ); + $this->encoding = $params['encoding']; + $this->skewCacheTTL = $params['skewTTL']; + $this->baseCacheTTL = max( $params['cacheTTL'] - $this->skewCacheTTL, 0 ); + $this->timeout = $params['timeout']; + + if ( !isset( $params['cache'] ) ) { + $this->srvCache = new HashBagOStuff( [] ); + } elseif ( $params['cache'] instanceof BagOStuff ) { + $this->srvCache = $params['cache']; + } else { + $this->srvCache = ObjectFactory::getObjectFromSpec( $params['cache'] ); + } + + $this->logger = new Psr\Log\NullLogger(); + $this->http = new MultiHttpClient( [ + 'connTimeout' => $this->timeout, + 'reqTimeout' => $this->timeout + ] ); + } + + public function setLogger( LoggerInterface $logger ) { + $this->logger = $logger; + } + + public function has( $name ) { + $this->load(); + + return array_key_exists( $name, $this->procCache['config'] ); + } + + public function get( $name ) { + $this->load(); + + if ( !array_key_exists( $name, $this->procCache['config'] ) ) { + throw new ConfigException( "No entry found for '$name'." ); + } + + return $this->procCache['config'][$name]; + } + + private function load() { + if ( $this->procCache !== null ) { + return; // already loaded + } + + $now = microtime( true ); + $key = $this->srvCache->makeKey( 'variable', $this->directoryHash ); + + // Get the cached value or block until it is regenerated (by this or another thread)... + $data = null; // latest config info + $error = null; // last error message + $loop = new WaitConditionLoop( + function () use ( $key, $now, &$data, &$error ) { + // Check if the values are in cache yet... + $data = $this->srvCache->get( $key ); + if ( is_array( $data ) && $data['expires'] > $now ) { + $this->logger->debug( "Found up-to-date etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } + + // Cache is either empty or stale; + // refresh the cache from etcd, using a mutex to reduce stampedes... + if ( $this->srvCache->lock( $key, 0, $this->baseCacheTTL ) ) { + try { + list( $config, $error, $retry ) = $this->fetchAllFromEtcd(); + if ( $config === null ) { + $this->logger->error( "Failed to fetch configuration: $error" ); + // Fail fast if the error is likely to just keep happening + return $retry + ? WaitConditionLoop::CONDITION_CONTINUE + : WaitConditionLoop::CONDITION_FAILED; + } + + // Avoid having all servers expire cache keys at the same time + $expiry = microtime( true ) + $this->baseCacheTTL; + $expiry += mt_rand( 0, 1e6 ) / 1e6 * $this->skewCacheTTL; + + $data = [ 'config' => $config, 'expires' => $expiry ]; + $this->srvCache->set( $key, $data, BagOStuff::TTL_INDEFINITE ); + + $this->logger->info( "Refreshed stale etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } finally { + $this->srvCache->unlock( $key ); // release mutex + } + } + + if ( is_array( $data ) ) { + $this->logger->info( "Using stale etcd configuration cache." ); + + return WaitConditionLoop::CONDITION_REACHED; + } + + return WaitConditionLoop::CONDITION_CONTINUE; + }, + $this->timeout + ); + + if ( $loop->invoke() !== WaitConditionLoop::CONDITION_REACHED ) { + // No cached value exists and etcd query failed; throw an error + throw new ConfigException( "Failed to load configuration from etcd: $error" ); + } + + $this->procCache = $data; + } + + /** + * @return array (config array or null, error string, allow retries) + */ + public function fetchAllFromEtcd() { + $dsd = new DnsSrvDiscoverer( $this->host ); + $servers = $dsd->getServers(); + if ( !$servers ) { + return $this->fetchAllFromEtcdServer( $this->host ); + } + + do { + // Pick a random etcd server from dns + $server = $dsd->pickServer( $servers ); + $host = IP::combineHostAndPort( $server['target'], $server['port'] ); + // Try to load the config from this particular server + list( $config, $error, $retry ) = $this->fetchAllFromEtcdServer( $host ); + if ( is_array( $config ) || !$retry ) { + break; + } + + // Avoid the server next time if that failed + $dsd->removeServer( $server, $servers ); + } while ( $servers ); + + return [ $config, $error, $retry ]; + } + + /** + * @param string $address Host and port + * @return array (config array or null, error string, whether to allow retries) + */ + protected function fetchAllFromEtcdServer( $address ) { + // Retrieve all the values under the MediaWiki config directory + list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->http->run( [ + 'method' => 'GET', + 'url' => "{$this->protocol}://{$address}/v2/keys/{$this->directory}/", + 'headers' => [ 'content-type' => 'application/json' ] + ] ); + + static $terminalCodes = [ 404 => true ]; + if ( $rcode < 200 || $rcode > 399 ) { + return [ + null, + strlen( $rerr ) ? $rerr : "HTTP $rcode ($rdesc)", + empty( $terminalCodes[$rcode] ) + ]; + } + + $info = json_decode( $rbody, true ); + if ( $info === null || !isset( $info['node']['nodes'] ) ) { + return [ null, $rcode, "Unexpected JSON response; missing 'nodes' list.", false ]; + } + + $config = []; + foreach ( $info['node']['nodes'] as $node ) { + if ( !empty( $node['dir'] ) ) { + continue; // skip directories + } + + $name = basename( $node['key'] ); + $value = $this->unserialize( $node['value'] ); + if ( !is_array( $value ) || !isset( $value['val'] ) ) { + return [ null, "Failed to parse value for '$name'.", false ]; + } + + $config[$name] = $value['val']; + } + + return [ $config, null, false ]; + } + + /** + * @param string $string + * @return mixed + */ + private function unserialize( $string ) { + if ( $this->encoding === 'YAML' ) { + return yaml_parse( $string ); + } else { // JSON + return json_decode( $string, true ); + } + } +} diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php index ff13196b6b..70e790c1a6 100644 --- a/includes/installer/MysqlUpdater.php +++ b/includes/installer/MysqlUpdater.php @@ -294,6 +294,7 @@ class MysqlUpdater extends DatabaseUpdater { [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ], [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ], [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ], + [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ], // 1.29 [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ], diff --git a/includes/installer/i18n/br.json b/includes/installer/i18n/br.json index 62a9267fb3..64f6197d19 100644 --- a/includes/installer/i18n/br.json +++ b/includes/installer/i18n/br.json @@ -142,6 +142,7 @@ "config-postgres-old": "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.", "config-mssql-old": "Stumm $1 Microsoft SQL Server, pe unan nevesoc'h, zo rekis. Ganeoc'h emañ ar stumm $2.", "config-sqlite-name-help": "Dibabit un anv dibar d'ho wiki.\nArabat ober gant esaouennoù pe barrennigoù-stagañ.\nImplijet e vo evit ar restr roadennoù SQLite.", + "config-sqlite-parent-unwritable-group": "N'haller ket krouiñ ar c'havlec'h roadennoù $1 peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar $2.\n\nKavet eo bet gant ar stalier an anv implijer m'eo oberiant ar servijer drezañ. Evit gallout kenderc'hel, lakait ar c'havlec'h $3 da vezañ tizhus evit ar skrivañ.\nWar ur reizhiad Unix/Linux system ober :\n\n
cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3
", "config-sqlite-mkdir-error": "Ur fazi zo bet e-ser krouiñ ar c'havlec'h roadennoù \"$1\".\nGwiriañ al lec'hiadur ha klask en-dro.", "config-sqlite-dir-unwritable": "Dibosupl skrivañ er c'havlec'h \"$1\".\nCheñchit ar aotreoù evit ma c'hallfe ar servijer web skrivañ ennañ ha klaskit en-dro.", "config-sqlite-connection-error": "$1.\n\nGwiriañ ar c'havlec'h roadennoù hag anv an diaz roadennoù a-is ha klaskit en-dro.", diff --git a/includes/interwiki/ClassicInterwikiLookup.php b/includes/interwiki/ClassicInterwikiLookup.php index 4ccca9785e..883b5fac46 100644 --- a/includes/interwiki/ClassicInterwikiLookup.php +++ b/includes/interwiki/ClassicInterwikiLookup.php @@ -288,7 +288,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { $row = $dbr->selectRow( 'interwiki', - ClassicInterwikiLookup::selectFields(), + self::selectFields(), [ 'iw_prefix' => $prefix ], __METHOD__ ); @@ -408,7 +408,7 @@ class ClassicInterwikiLookup implements InterwikiLookup { } $res = $db->select( 'interwiki', - $this->selectFields(), + self::selectFields(), $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ] ); diff --git a/includes/libs/DnsSrvDiscoverer.php b/includes/libs/DnsSrvDiscoverer.php index c33264db0d..ce8a2044f5 100644 --- a/includes/libs/DnsSrvDiscoverer.php +++ b/includes/libs/DnsSrvDiscoverer.php @@ -83,6 +83,22 @@ class DnsSrvDiscoverer { } } + /** + * @param array $server + * @param array $servers + * @return array[] + */ + public function removeServer( $server, array $servers ) { + foreach ( $servers as $i => $srv ) { + if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) { + unset( $servers[$i] ); + break; + } + } + + return array_values( $servers ); + } + /** * @return array[] */ diff --git a/includes/libs/mime/XmlTypeCheck.php b/includes/libs/mime/XmlTypeCheck.php index 7f2bf5e81b..e48cf62346 100644 --- a/includes/libs/mime/XmlTypeCheck.php +++ b/includes/libs/mime/XmlTypeCheck.php @@ -73,19 +73,36 @@ class XmlTypeCheck { */ private $parserOptions = [ 'processing_instruction_handler' => '', + 'external_dtd_handler' => '', + 'dtd_handler' => '', + 'require_safe_dtd' => true ]; /** + * Allow filtering an XML file. + * + * Filters should return either true or a string to indicate something + * is wrong with the file. $this->filterMatch will store if the + * file failed validation (true = failed validation). + * $this->filterMatchType will contain the validation error. + * $this->wellFormed will contain whether the xml file is well-formed. + * + * @note If multiple filters are hit, only one of them will have the + * result stored in $this->filterMatchType. + * * @param string $input a filename or string containing the XML element * @param callable $filterCallback (optional) * Function to call to do additional custom validity checks from the * SAX element handler event. This gives you access to the element * namespace, name, attributes, and text contents. - * Filter should return 'true' to toggle on $this->filterMatch + * Filter should return a truthy value describing the error. * @param bool $isFile (optional) indicates if the first parameter is a * filename (default, true) or if it is a string (false) * @param array $options list of additional parsing options: * processing_instruction_handler: Callback for xml_set_processing_instruction_handler + * external_dtd_handler: Callback for the url of external dtd subset + * dtd_handler: Callback given the full text of the filterCallback = $filterCallback; @@ -186,6 +203,9 @@ class XmlTypeCheck { if ( $reader->nodeType === XMLReader::PI ) { $this->processingInstructionHandler( $reader->name, $reader->value ); } + if ( $reader->nodeType === XMLReader::DOC_TYPE ) { + $this->DTDHandler( $reader ); + } } while ( $reader->nodeType != XMLReader::ELEMENT ); // Process the rest of the document @@ -234,8 +254,13 @@ class XmlTypeCheck { $reader->value ); break; + case XMLReader::DOC_TYPE: + // We should never see a doctype after first + // element. + $this->wellFormed = false; + break; default: - // One of DOC, DOC_TYPE, ENTITY, END_ENTITY, + // One of DOC, ENTITY, END_ENTITY, // NOTATION, or XML_DECLARATION // xml_parse didn't send these to the filter, so we won't. } @@ -339,4 +364,140 @@ class XmlTypeCheck { $this->filterMatchType = $callbackReturn; } } + /** + * Handle coming across a parserOptions['external_dtd_handler']; + $generalCallback = $this->parserOptions['dtd_handler']; + $checkIfSafe = $this->parserOptions['require_safe_dtd']; + if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) { + return; + } + $dtd = $reader->readOuterXML(); + $callbackReturn = false; + + if ( $generalCallback ) { + $callbackReturn = call_user_func( $generalCallback, $dtd ); + } + if ( $callbackReturn ) { + // Filter hit! + $this->filterMatch = true; + $this->filterMatchType = $callbackReturn; + $callbackReturn = false; + } + + $parsedDTD = $this->parseDTD( $dtd ); + if ( $externalCallback && isset( $parsedDTD['type'] ) ) { + $callbackReturn = call_user_func( + $externalCallback, + $parsedDTD['type'], + isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null, + isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null + ); + } + if ( $callbackReturn ) { + // Filter hit! + $this->filterMatch = true; + $this->filterMatchType = $callbackReturn; + $callbackReturn = false; + } + + if ( $checkIfSafe && isset( $parsedDTD['internal'] ) ) { + if ( !$this->checkDTDIsSafe( $parsedDTD['internal'] ) ) { + $this->wellFormed = false; + } + } + } + + /** + * Check if the internal subset of the DTD is safe. + * + * We whitelist an extremely restricted subset of DTD features. + * + * Safe is defined as: + * * Only contains entity defintions (e.g. No 255 bytes). + * * + * allowed if matched exactly for compatibility with graphviz + * * Comments. + * + * @param string $internalSubset The internal subset of the DTD + * @return bool true if safe. + */ + private function checkDTDIsSafe( $internalSubset ) { + $offset = 0; + $res = preg_match( + '/^(?:\s*' . + '|\s*' . + '|\s*)*\s*$/', + $internalSubset + ); + + return (bool)$res; + } + + /** + * Parse DTD into parts. + * + * If there is an error parsing the dtd, sets wellFormed to false. + * + * @param $dtd string + * @return array Possibly containing keys publicid, systemid, type and internal. + */ + private function parseDTD( $dtd ) { + $m = []; + $res = preg_match( + '/^PUBLIC)\s*' . + '(?:"(?P[^"]*)"|\'(?P[^\']*)\')' . // public identifer + '\s*"(?P[^"]*)"|\'(?P[^\']*)\'' . // system identifier + '|(?PSYSTEM)\s*' . + '(?:"(?P[^"]*)"|\'(?P[^\']*)\')' . + ')?\s*' . + '(?:\[\s*(?P.*)\])?\s*>$/s', + $dtd, + $m + ); + if ( !$res ) { + $this->wellFormed = false; + return []; + } + $parsed = []; + foreach ( $m as $field => $value ) { + if ( $value === '' || is_numeric( $field ) ) { + continue; + } + switch ( $field ) { + case 'typepublic': + case 'typesystem': + $parsed['type'] = $value; + break; + case 'pubquote': + case 'pubapos': + $parsed['publicid'] = $value; + break; + case 'pubsysquote': + case 'pubsysapos': + case 'sysquote': + case 'sysapos': + $parsed['systemid'] = $value; + break; + case 'internal': + $parsed['internal'] = $value; + break; + } + } + return $parsed; + } } diff --git a/includes/libs/objectcache/CachedBagOStuff.php b/includes/libs/objectcache/CachedBagOStuff.php index 74bf4b515f..c85a82ea01 100644 --- a/includes/libs/objectcache/CachedBagOStuff.php +++ b/includes/libs/objectcache/CachedBagOStuff.php @@ -81,6 +81,22 @@ class CachedBagOStuff extends HashBagOStuff { $this->backend->setDebug( $bool ); } + public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) { + parent::deleteObjectsExpiringBefore( $date, $progressCallback ); + return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback ); + } + + public function makeKey() { + return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() ); + } + + public function makeGlobalKey() { + return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() ); + } + + // These just call the backend (tested elsewhere) + // @codeCoverageIgnoreStart + public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) { return $this->backend->lock( $key, $timeout, $expiry, $rclass ); } @@ -89,21 +105,17 @@ class CachedBagOStuff extends HashBagOStuff { return $this->backend->unlock( $key ); } - public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) { - parent::deleteObjectsExpiringBefore( $date, $progressCallback ); - return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback ); - } - public function getLastError() { return $this->backend->getLastError(); } public function clearLastError() { - $this->backend->clearLastError(); + return $this->backend->clearLastError(); } public function modifySimpleRelayEvent( array $event ) { return $this->backend->modifySimpleRelayEvent( $event ); } + // @codeCoverageIgnoreEnd } diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php index 49ddd14ee8..40bcc1b02c 100644 --- a/includes/libs/rdbms/database/Database.php +++ b/includes/libs/rdbms/database/Database.php @@ -3295,26 +3295,37 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware return false; } - /** - * Lock specific tables - * - * @param array $read Array of tables to lock for read access - * @param array $write Array of tables to lock for write access - * @param string $method Name of caller - * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY - * @return bool - */ - public function lockTables( $read, $write, $method, $lowPriority = true ) { + public function tableLocksHaveTransactionScope() { return true; } - /** - * Unlock specific tables - * - * @param string $method The caller - * @return bool - */ - public function unlockTables( $method ) { + final public function lockTables( array $read, array $write, $method ) { + if ( $this->writesOrCallbacksPending() ) { + throw new DBUnexpectedError( $this, "Transaction writes or callbacks still pending." ); + } + + if ( $this->tableLocksHaveTransactionScope() ) { + $this->startAtomic( $method ); + } + + return $this->doLockTables( $read, $write, $method ); + } + + protected function doLockTables( array $read, array $write, $method ) { + return true; + } + + final public function unlockTables( $method ) { + if ( $this->tableLocksHaveTransactionScope() ) { + $this->endAtomic( $method ); + + return true; // locks released on COMMIT/ROLLBACK + } + + return $this->doUnlockTables( $method ); + } + + protected function doUnlockTables( $method ) { return true; } diff --git a/includes/libs/rdbms/database/DatabaseMysqlBase.php b/includes/libs/rdbms/database/DatabaseMysqlBase.php index 672509002d..e2b522610c 100644 --- a/includes/libs/rdbms/database/DatabaseMysqlBase.php +++ b/includes/libs/rdbms/database/DatabaseMysqlBase.php @@ -1054,36 +1054,26 @@ abstract class DatabaseMysqlBase extends Database { return true; } - /** - * @param array $read - * @param array $write - * @param string $method - * @param bool $lowPriority - * @return bool - */ - public function lockTables( $read, $write, $method, $lowPriority = true ) { - $items = []; + public function tableLocksHaveTransactionScope() { + return false; // tied to TCP connection + } + protected function doLockTables( array $read, array $write, $method ) { + $items = []; foreach ( $write as $table ) { - $tbl = $this->tableName( $table ) . - ( $lowPriority ? ' LOW_PRIORITY' : '' ) . - ' WRITE'; - $items[] = $tbl; + $items[] = $this->tableName( $table ) . ' WRITE'; } foreach ( $read as $table ) { $items[] = $this->tableName( $table ) . ' READ'; } + $sql = "LOCK TABLES " . implode( ',', $items ); $this->query( $sql, $method ); return true; } - /** - * @param string $method - * @return bool - */ - public function unlockTables( $method ) { + protected function doUnlockTables( $method ) { $this->query( "UNLOCK TABLES", $method ); return true; diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php index af9716d451..5bcd4a8e56 100644 --- a/includes/libs/rdbms/database/DatabasePostgres.php +++ b/includes/libs/rdbms/database/DatabasePostgres.php @@ -1305,6 +1305,33 @@ SQL; return parent::streamStatementEnd( $sql, $newLine ); } + public function doLockTables( array $read, array $write, $method ) { + $tablesWrite = []; + foreach ( $write as $table ) { + $tablesWrite[] = $this->tableName( $table ); + } + $tablesRead = []; + foreach ( $read as $table ) { + $tablesRead[] = $this->tableName( $table ); + } + + // Acquire locks for the duration of the current transaction... + if ( $tablesWrite ) { + $this->query( + 'LOCK TABLE ONLY ' . implode( ',', $tablesWrite ) . ' IN EXCLUSIVE MODE', + $method + ); + } + if ( $tablesRead ) { + $this->query( + 'LOCK TABLE ONLY ' . implode( ',', $tablesRead ) . ' IN SHARE MODE', + $method + ); + } + + return true; + } + public function lockIsFree( $lockName, $method ) { // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) ); diff --git a/includes/libs/rdbms/database/IMaintainableDatabase.php b/includes/libs/rdbms/database/IMaintainableDatabase.php index 138cf2de9e..b984c42544 100644 --- a/includes/libs/rdbms/database/IMaintainableDatabase.php +++ b/includes/libs/rdbms/database/IMaintainableDatabase.php @@ -210,6 +210,73 @@ interface IMaintainableDatabase extends IDatabase { public function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ); + + /** + * Checks if table locks acquired by lockTables() are transaction-bound in their scope + * + * Transaction-bound table locks will be released when the current transaction terminates. + * Table locks that are not bound to a transaction are not effected by BEGIN/COMMIT/ROLLBACK + * and will last until either lockTables()/unlockTables() is called or the TCP connection to + * the database is closed. + * + * @return bool + * @since 1.29 + */ + public function tableLocksHaveTransactionScope(); + + /** + * Lock specific tables + * + * Any pending transaction should be resolved before calling this method, since: + * a) Doing so resets any REPEATABLE-READ snapshot of the data to a fresh one. + * b) Previous row and table locks from the transaction or session may be released + * by LOCK TABLES, which may be unsafe for the changes in such a transaction. + * c) The main use case of lockTables() is to avoid deadlocks and timeouts by locking + * entire tables in order to do long-running, batched, and lag-aware, updates. Batching + * and replication lag checks do not work when all the updates happen in a transaction. + * + * Always get all relevant table locks up-front in one call, since LOCK TABLES might release + * any prior table locks on some RDBMes (e.g MySQL). + * + * For compatibility, callers should check tableLocksHaveTransactionScope() before using + * this method. If locks are scoped specifically to transactions then caller must either: + * - a) Start a new transaction and acquire table locks for the scope of that transaction, + * doing all row updates within that transaction. It will not be possible to update + * rows in batches; this might result in high replication lag. + * - b) Forgo table locks entirely and avoid calling this method. Careful use of hints like + * LOCK IN SHARE MODE and FOR UPDATE and the use of query batching may be preferrable + * to using table locks with a potentially large transaction. Use of MySQL and Postges + * style REPEATABLE-READ (Snapshot Isolation with or without First-Committer-Rule) can + * also be considered for certain tasks that require a consistent view of entire tables. + * + * If session scoped locks are not supported, then calling lockTables() will trigger + * startAtomic(), with unlockTables() triggering endAtomic(). This will automatically + * start a transaction if one is not already present and cause the locks to be released + * when the transaction finishes (normally during the unlockTables() call). + * + * In any case, avoid using begin()/commit() in code that runs while such table locks are + * acquired, as that breaks in case when a transaction is needed. The startAtomic() and + * endAtomic() methods are safe, however, since they will join any existing transaction. + * + * @param array $read Array of tables to lock for read access + * @param array $write Array of tables to lock for write access + * @param string $method Name of caller + * @return bool + * @since 1.29 + */ + public function lockTables( array $read, array $write, $method ); + + /** + * Unlock all tables locked via lockTables() + * + * If table locks are scoped to transactions, then locks might not be released until the + * transaction ends, which could happen after this method is called. + * + * @param string $method The caller + * @return bool + * @since 1.29 + */ + public function unlockTables( $method ); } class_alias( 'Wikimedia\Rdbms\IMaintainableDatabase', 'IMaintainableDatabase' ); diff --git a/includes/libs/rdbms/database/MaintainableDBConnRef.php b/includes/libs/rdbms/database/MaintainableDBConnRef.php index 30c62deb1f..8238f3edd3 100644 --- a/includes/libs/rdbms/database/MaintainableDBConnRef.php +++ b/includes/libs/rdbms/database/MaintainableDBConnRef.php @@ -68,6 +68,18 @@ class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase { ) { return $this->__call( __FUNCTION__, func_get_args() ); } + + public function tableLocksHaveTransactionScope() { + return $this->__call( __FUNCTION__, func_get_args() ); + } + + public function lockTables( array $read, array $write, $method ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } + + public function unlockTables( $method ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } } class_alias( 'Wikimedia\Rdbms\MaintainableDBConnRef', 'MaintainableDBConnRef' ); diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php index 05973df325..ceb00520bf 100644 --- a/includes/logging/DeleteLogFormatter.php +++ b/includes/logging/DeleteLogFormatter.php @@ -39,6 +39,12 @@ class DeleteLogFormatter extends LogFormatter { // logentry-suppress-event-legacy, logentry-suppress-revision-legacy return "$key-legacy"; } + } elseif ( $this->entry->getSubtype() === 'restore' ) { + $rawParams = $this->entry->getParameters(); + if ( !isset( $rawParams[':assoc:count'] ) ) { + // Message: logentry-delete-restore-nocount + return $key . '-nocount'; + } } return $key; @@ -97,6 +103,19 @@ class DeleteLogFormatter extends LogFormatter { $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 ); return $this->parsedParametersDeleteLog; } + } elseif ( $subtype === 'restore' ) { + $rawParams = $this->entry->getParameters(); + if ( isset( $rawParams[':assoc:count'] ) ) { + $countList = []; + foreach ( $rawParams[':assoc:count'] as $type => $count ) { + if ( $count ) { + // Messages: restore-count-revisions, restore-count-files + $countList[] = $this->context->msg( 'restore-count-' . $type ) + ->numParams( $count )->plain(); + } + } + $params[3] = $this->context->getLanguage()->listToText( $countList ); + } } $this->parsedParametersDeleteLog = $params; @@ -276,6 +295,11 @@ class DeleteLogFormatter extends LogFormatter { $params[':assoc:old'][$key] = (bool)( $old & $bit ); $params[':assoc:new'][$key] = (bool)( $new & $bit ); } + } elseif ( $subtype === 'restore' ) { + $rawParams = $entry->getParameters(); + if ( isset( $rawParams[':assoc:count'] ) ) { + $params[':assoc:count'] = $rawParams[':assoc:count']; + } } return $params; diff --git a/includes/page/PageArchive.php b/includes/page/PageArchive.php index c2bfb07c62..11e1a30db8 100644 --- a/includes/page/PageArchive.php +++ b/includes/page/PageArchive.php @@ -67,6 +67,56 @@ class PageArchive { return self::listPages( $dbr, '' ); } + /** + * List deleted pages recorded in the archive matching the + * given term, using search engine archive. + * Returns result wrapper with (ar_namespace, ar_title, count) fields. + * + * @param string $term Search term + * @return ResultWrapper + */ + public static function listPagesBySearch( $term ) { + $title = Title::newFromText( $term ); + if ( $title ) { + $ns = $title->getNamespace(); + $termMain = $title->getText(); + $termDb = $title->getDBkey(); + } else { + // Prolly won't work too good + // @todo handle bare namespace names cleanly? + $ns = 0; + $termMain = $termDb = $term; + } + + // Try search engine first + $engine = MediaWikiServices::getInstance()->newSearchEngine(); + $engine->setLimitOffset( 100 ); + $engine->setNamespaces( [ $ns ] ); + $results = $engine->searchArchiveTitle( $termMain ); + if ( !$results->isOK() ) { + $results = []; + } else { + $results = $results->getValue(); + } + + if ( !$results ) { + // Fall back to regular prefix search + return self::listPagesByPrefix( $term ); + } + + $dbr = wfGetDB( DB_REPLICA ); + $condTitles = array_unique( array_map( function ( Title $t ) { + return $t->getDBkey(); + }, $results ) ); + $conds = [ + 'ar_namespace' => $ns, + $dbr->makeList( [ 'ar_title' => $condTitles ], LIST_OR ) . " OR ar_title " . + $dbr->buildLike( $termDb, $dbr->anyString() ) + ]; + + return self::listPages( $dbr, $conds ); + } + /** * List deleted pages recorded in the archive table matching the * given title prefix. @@ -133,6 +183,7 @@ class PageArchive { $fields = [ 'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text', 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1', + 'ar_page_id' ]; if ( $this->config->get( 'ContentHandlerUseDB' ) ) { @@ -402,25 +453,12 @@ class PageArchive { // Touch the log! - if ( $textRestored && $filesRestored ) { - $reason = wfMessage( 'undeletedrevisions-files' ) - ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text(); - } elseif ( $textRestored ) { - $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored ) - ->inContentLanguage()->text(); - } elseif ( $filesRestored ) { - $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored ) - ->inContentLanguage()->text(); - } else { + if ( !$textRestored && !$filesRestored ) { wfDebug( "Undelete: nothing undeleted...\n" ); return false; } - if ( trim( $comment ) != '' ) { - $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment; - } - if ( $user === null ) { global $wgUser; $user = $wgUser; @@ -429,15 +467,21 @@ class PageArchive { $logEntry = new ManualLogEntry( 'delete', 'restore' ); $logEntry->setPerformer( $user ); $logEntry->setTarget( $this->title ); - $logEntry->setComment( $reason ); + $logEntry->setComment( $comment ); $logEntry->setTags( $tags ); + $logEntry->setParameters( [ + ':assoc:count' => [ + 'revisions' => $textRestored, + 'files' => $filesRestored, + ], + ] ); Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] ); $logid = $logEntry->insert(); $logEntry->publish( $logid ); - return [ $textRestored, $filesRestored, $reason ]; + return [ $textRestored, $filesRestored, $comment ]; } /** @@ -620,7 +664,7 @@ class PageArchive { $restored = 0; // number of revisions restored /** @var Revision $revision */ $revision = null; - + $restoredPages = []; // If there are no restorable revisions, we can skip most of the steps. if ( $latestRestorableRow === null ) { $failedRevisionCount = $rev_count; @@ -677,6 +721,7 @@ class PageArchive { Hooks::run( 'ArticleRevisionUndeleted', [ &$this->title, $revision, $row->ar_page_id ] ); + $restoredPages[$row->ar_page_id] = true; } // Now that it's safely stored, take it out of the archive @@ -717,7 +762,8 @@ class PageArchive { ); } - Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] ); + Hooks::run( 'ArticleUndelete', + [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] ); if ( $this->title->getNamespace() == NS_FILE ) { DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) ); } diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index be4557d6f9..953f021c2b 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -1610,9 +1610,7 @@ class Parser { true, 'free', $this->getExternalLinkAttribs( $url ), $this->mTitle ); # Register it in the output object... - # Replace unnecessary URL escape codes with their equivalent characters - $pasteurized = self::normalizeLinkUrl( $url ); - $this->mOutput->addExternalLink( $pasteurized ); + $this->mOutput->addExternalLink( $url ); } return $text . $trail; } @@ -1908,10 +1906,7 @@ class Parser { $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail; # Register link in the output object. - # Replace unnecessary URL escape codes with the referenced character - # This prevents spammers from hiding links from the filters - $pasteurized = self::normalizeLinkUrl( $url ); - $this->mOutput->addExternalLink( $pasteurized ); + $this->mOutput->addExternalLink( $url ); } return $s; @@ -5086,9 +5081,11 @@ class Parser { } if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) { $link = $linkValue; + $this->mOutput->addExternalLink( $link ); } else { $localLinkTitle = Title::newFromText( $linkValue ); if ( $localLinkTitle !== null ) { + $this->mOutput->addLink( $localLinkTitle ); $link = $localLinkTitle->getLinkURL(); } } diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index b2f99b3d3f..7de3b304f1 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -535,6 +535,10 @@ class ParserOutput extends CacheTime { # We don't register links pointing to our own server, unless... :-) global $wgServer, $wgRegisterInternalExternals; + # Replace unnecessary URL escape codes with the referenced character + # This prevents spammers from hiding links from the filters + $url = parser::normalizeLinkUrl( $url ); + $registerExternalLink = true; if ( !$wgRegisterInternalExternals ) { $registerExternalLink = !self::isLinkInternal( $wgServer, $url ); diff --git a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php index 44371bbee2..a0061e3531 100644 --- a/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php +++ b/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php @@ -93,6 +93,7 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule { 'special-characters-group-thai', 'special-characters-group-lao', 'special-characters-group-khmer', + 'special-characters-group-canadianaboriginal', 'special-characters-title-endash', 'special-characters-title-emdash', 'special-characters-title-minus' diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php index 9817b6cc99..6bb4e5aeba 100644 --- a/includes/search/SearchEngine.php +++ b/includes/search/SearchEngine.php @@ -72,6 +72,21 @@ abstract class SearchEngine { return null; } + /** + * Perform a title search in the article archive. + * NOTE: these results still should be filtered by + * matching against PageArchive, permissions checks etc + * The results returned by this methods are only sugegstions and + * may not end up being shown to the user. + * + * @param string $term Raw search term + * @return Status + * @since 1.29 + */ + function searchArchiveTitle( $term ) { + return Status::newGood( [] ); + } + /** * Perform a title-only search query and return a result set. * If title searches are not supported or disabled, return null. diff --git a/includes/search/SearchHighlighter.php b/includes/search/SearchHighlighter.php index d0e3a240d6..cebdb40dbb 100644 --- a/includes/search/SearchHighlighter.php +++ b/includes/search/SearchHighlighter.php @@ -29,6 +29,10 @@ class SearchHighlighter { protected $mCleanWikitext = true; + /** + * @warning If you pass false to this constructor, then + * the caller is responsible for HTML escaping. + */ function __construct( $cleanupWikitext = true ) { $this->mCleanWikitext = $cleanupWikitext; } @@ -456,6 +460,10 @@ class SearchHighlighter { $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text ); $text = preg_replace( "/''/", "", $text ); + // Note, the previous /<\/?[^>]+>/ is insufficient + // for XSS safety as the HTML tag can span multiple + // search results (T144845). + $text = Sanitizer::escapeHtmlAllowEntities( $text ); return $text; } diff --git a/includes/skins/BaseTemplate.php b/includes/skins/BaseTemplate.php index dc0a703853..5868904d20 100644 --- a/includes/skins/BaseTemplate.php +++ b/includes/skins/BaseTemplate.php @@ -699,7 +699,7 @@ abstract class BaseTemplate extends QuickTemplate { $html .= Html::closeElement( 'ul' ); } - $html .= $this->clear() . $footerEnd; + $html .= $this->getClear() . $footerEnd; return $html; } @@ -710,7 +710,7 @@ abstract class BaseTemplate extends QuickTemplate { * @return string html * @since 1.29 */ - protected function clear() { + protected function getClear() { return Html::element( 'div', [ 'class' => 'visualClear' ] ); } diff --git a/includes/specialpage/RedirectSpecialPage.php b/includes/specialpage/RedirectSpecialPage.php index b1ddacfb2f..9b5d5f463d 100644 --- a/includes/specialpage/RedirectSpecialPage.php +++ b/includes/specialpage/RedirectSpecialPage.php @@ -41,7 +41,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage { $query = $this->getRedirectQuery(); // Redirect to a page title with possible query parameters if ( $redirect instanceof Title ) { - $url = $redirect->getFullURL( $query ); + $url = $redirect->getFullUrlForRedirect( $query ); $this->getOutput()->redirect( $url ); return $redirect; diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 33e1cc30c8..ae010f6fc8 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -144,6 +144,7 @@ class SpecialPageFactory { 'RandomInCategory' => 'SpecialRandomInCategory', 'Randomredirect' => 'SpecialRandomredirect', 'Randomrootpage' => 'SpecialRandomrootpage', + 'GoToInterwiki' => 'SpecialGoToInterwiki', // High use pages 'Mostlinkedcategories' => 'MostlinkedCategoriesPage', diff --git a/includes/specials/SpecialChangeCredentials.php b/includes/specials/SpecialChangeCredentials.php index 47f8d2f436..970a2e29f2 100644 --- a/includes/specials/SpecialChangeCredentials.php +++ b/includes/specials/SpecialChangeCredentials.php @@ -258,7 +258,7 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage { } $title = Title::newFromText( $returnTo ); - return $title->getFullURL( $returnToQuery ); + return $title->getFullUrlForRedirect( $returnToQuery ); } protected function getRequestBlacklist() { diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php index 785447f7f9..eb98fe76a7 100644 --- a/includes/specials/SpecialChangeEmail.php +++ b/includes/specials/SpecialChangeEmail.php @@ -136,7 +136,7 @@ class SpecialChangeEmail extends FormSpecialPage { $query = $request->getVal( 'returntoquery' ); if ( $this->status->value === true ) { - $this->getOutput()->redirect( $titleObj->getFullURL( $query ) ); + $this->getOutput()->redirect( $titleObj->getFullUrlForRedirect( $query ) ); } elseif ( $this->status->value === 'eauth' ) { # Notify user that a confirmation email has been sent... $this->getOutput()->wrapWikiMsg( "
\n$1\n
", diff --git a/includes/specials/SpecialGoToInterwiki.php b/includes/specials/SpecialGoToInterwiki.php new file mode 100644 index 0000000000..809a14aac3 --- /dev/null +++ b/includes/specials/SpecialGoToInterwiki.php @@ -0,0 +1,79 @@ +setHeaders(); + $target = Title::newFromText( $par ); + // Disallow special pages as a precaution against + // possible redirect loops. + if ( !$target || $target->isSpecialPage() ) { + $this->getOutput()->setStatusCode( 404 ); + $this->getOutput()->addWikiMsg( 'gotointerwiki-invalid' ); + return; + } + + $url = $target->getFullURL(); + if ( !$target->isExternal() || $target->isLocal() ) { + // Either a normal page, or a local interwiki. + // just redirect. + $this->getOutput()->redirect( $url, '301' ); + } else { + $this->getOutput()->addWikiMsg( + 'gotointerwiki-external', + $url, + $target->getFullText() + ); + } + } + + /** + * @return bool + */ + public function requiresWrite() { + return false; + } + + /** + * @return String + */ + protected function getGroupName() { + return 'redirects'; + } +} diff --git a/includes/specials/SpecialPageLanguage.php b/includes/specials/SpecialPageLanguage.php index db05ebe587..2943fd4e3d 100644 --- a/includes/specials/SpecialPageLanguage.php +++ b/includes/specials/SpecialPageLanguage.php @@ -136,7 +136,7 @@ class SpecialPageLanguage extends FormSpecialPage { } // Url to redirect to after the operation - $this->goToUrl = $title->getFullURL( + $this->goToUrl = $title->getFullUrlForRedirect( $title->isRedirect() ? [ 'redirect' => 'no' ] : [] ); diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php index eee5b641a3..40b50ea5bf 100644 --- a/includes/specials/SpecialPreferences.php +++ b/includes/specials/SpecialPreferences.php @@ -148,7 +148,7 @@ class SpecialPreferences extends SpecialPage { // Set session data for the success message $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 ); - $url = $this->getPageTitle()->getFullURL(); + $url = $this->getPageTitle()->getFullUrlForRedirect(); $this->getOutput()->redirect( $url ); return true; diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index ae0887d28f..f88f09c60e 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -746,6 +746,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $user = $this->getUser(); $config = $this->getConfig(); if ( $options['from'] ) { + $resetLink = $this->makeOptionsLink( $this->msg( 'rclistfromreset' ), + [ 'from' => '' ], $nondefaults ); + $note .= $this->msg( 'rcnotefrom' ) ->numParams( $options['limit'] ) ->params( @@ -754,7 +757,13 @@ class SpecialRecentChanges extends ChangesListSpecialPage { $lang->userTime( $options['from'], $user ) ) ->numParams( $numRows ) - ->parse() . '
'; + ->parse() . ' ' . + Html::rawElement( + 'span', + [ 'class' => 'rcoptions-listfromreset' ], + $this->msg( 'parentheses' )->rawParams( $resetLink )->parse() + ) . + '
'; } # Sort data for display and make sure it's unique after we've added user data. diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 9cc0048aab..139e4f70c3 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -259,7 +259,7 @@ class SpecialSearch extends SpecialPage { return null; } - return $url === null ? $title->getFullURL() : $url; + return $url === null ? $title->getFullUrlForRedirect() : $url; } /** diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index dc5f877a4f..eb4f0cc077 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -21,6 +21,7 @@ * @ingroup SpecialPage */ +use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; /** @@ -45,6 +46,10 @@ class SpecialUndelete extends SpecialPage { /** @var Title */ private $mTargetObj; + /** + * @var string Search prefix + */ + private $mSearchPrefix; function __construct() { parent::__construct( 'Undelete', 'deletedhistory' ); @@ -235,6 +240,7 @@ class SpecialUndelete extends SpecialPage { Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) . Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) . Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) . + Html::hidden( 'fuzzy', $this->getRequest()->getVal( 'fuzzy' ) ) . Html::rawElement( 'label', [ 'for' => 'prefix' ], @@ -245,15 +251,25 @@ class SpecialUndelete extends SpecialPage { 20, $this->mSearchPrefix, [ 'id' => 'prefix', 'autofocus' => '' ] - ) . ' ' . - Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) . + ) . + ' ' . + Xml::submitButton( + $this->msg( 'undelete-search-submit' )->text(), + [ 'id' => 'searchUndelete' ] + ) . Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' ) ); # List undeletable articles if ( $this->mSearchPrefix ) { - $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix ); + // For now, we enable search engine match only when specifically asked to + // by using fuzzy=1 parameter. + if ( $this->getRequest()->getVal( "fuzzy", false ) ) { + $result = PageArchive::listPagesBySearch( $this->mSearchPrefix ); + } else { + $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix ); + } $this->showList( $result ); } } @@ -277,7 +293,7 @@ class SpecialUndelete extends SpecialPage { $linkRenderer = $this->getLinkRenderer(); $undelete = $this->getPageTitle(); - $out->addHTML( "
    \n" ); + $out->addHTML( "
      \n" ); foreach ( $result as $row ) { $title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title ); if ( $title !== null ) { @@ -300,7 +316,7 @@ class SpecialUndelete extends SpecialPage { ); } $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse(); - $out->addHTML( "
    • {$item} ({$revs})
    • \n" ); + $out->addHTML( "
    • {$item} ({$revs})
    • \n" ); } $result->free(); $out->addHTML( "
    \n" ); diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index b33aa7db32..127b530e0f 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -387,7 +387,8 @@ class UserrightsPage extends SpecialPage { $user->invalidateCache(); // update groups in external authentication database - Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), $reason ] ); + Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), + $reason, $oldUGMs, $newUGMs ] ); MediaWiki\Auth\AuthManager::callLegacyAuthPlugin( 'updateExternalDBGroups', [ $user, $add, $remove ] ); diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php index 365736f52d..c1c9ab0f27 100644 --- a/includes/specials/SpecialWatchlist.php +++ b/includes/specials/SpecialWatchlist.php @@ -81,6 +81,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) ) && $request->getVal( 'reset' ) && $request->wasPosted() + && $user->matchEditToken( $request->getVal( 'token' ) ) ) { $user->clearAllNotifications(); $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) ); @@ -660,6 +661,7 @@ class SpecialWatchlist extends ChangesListSpecialPage { 'id' => 'mw-watchlist-resetbutton' ] ) . "\n" . Xml::submitButton( $this->msg( 'enotif_reset' )->text(), [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" . + Html::hidden( 'token', $user->getEditToken() ) . "\n" . Html::hidden( 'reset', 'all' ) . "\n"; foreach ( $nondefaults as $key => $value ) { $form .= Html::hidden( $key, $value ) . "\n"; diff --git a/includes/specials/helpers/LoginHelper.php b/includes/specials/helpers/LoginHelper.php index f853f4173b..cfcbf652c0 100644 --- a/includes/specials/helpers/LoginHelper.php +++ b/includes/specials/helpers/LoginHelper.php @@ -89,7 +89,7 @@ class LoginHelper extends ContextSource { } if ( $type === 'successredirect' ) { - $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto ); + $redirectUrl = $returnToTitle->getFullUrlForRedirect( $returnToQuery, $proto ); $this->getOutput()->redirect( $redirectUrl ); } else { $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options ); diff --git a/includes/specials/pagers/DeletedContribsPager.php b/includes/specials/pagers/DeletedContribsPager.php index a1f6b84506..78e1092dc5 100644 --- a/includes/specials/pagers/DeletedContribsPager.php +++ b/includes/specials/pagers/DeletedContribsPager.php @@ -129,7 +129,7 @@ class DeletedContribsPager extends IndexPager { $condition = []; $condition['ar_user_text'] = $this->target; - $index = 'usertext_timestamp'; + $index = 'ar_usertext_timestamp'; return [ $index, $condition ]; } diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php index 733c4fff05..2c0afdf00f 100644 --- a/includes/upload/UploadBase.php +++ b/includes/upload/UploadBase.php @@ -1359,7 +1359,10 @@ abstract class UploadBase { $filename, [ $this, 'checkSvgScriptCallback' ], true, - [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ] + [ + 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback', + 'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD', + ] ); if ( $check->wellFormed !== true ) { // Invalid xml (T60553) @@ -1391,6 +1394,34 @@ abstract class UploadBase { return false; } + /** + * Verify that DTD urls referenced are only the standard dtds + * + * Browsers seem to ignore external dtds. However just to be on the + * safe side, only allow dtds from the svg standard. + * + * @param string $type PUBLIC or SYSTEM + * @param string $publicId The well-known public identifier for the dtd + * @param string $systemId The url for the external dtd + */ + public static function checkSvgExternalDTD( $type, $publicId, $systemId ) { + // This doesn't include the XHTML+MathML+SVG doctype since we don't + // allow XHTML anyways. + $allowedDTDs = [ + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd', + 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd', + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd', + 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd' + ]; + if ( $type !== 'PUBLIC' + || !in_array( $systemId, $allowedDTDs ) + || strpos( $publicId, "-//W3C//" ) !== 0 + ) { + return [ 'upload-scripted-dtd' ]; + } + return false; + } + /** * @todo Replace this with a whitelist filter! * @param string $element diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json index 3d3efd4af8..231ab2221e 100644 --- a/languages/i18n/ar.json +++ b/languages/i18n/ar.json @@ -1144,7 +1144,7 @@ "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}", "userrights-groupsmember": "عضو في:", "userrights-groupsmember-auto": "عضو ضمني في:", - "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.", + "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لعضوية هذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.", "userrights-reason": "السبب:", "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.", "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.", @@ -1158,7 +1158,7 @@ "userrights-expiry-options": "1 يوم:1 day,1 أسبوع:1 week,1 شهر:1 month,3 شهور:3 months,6 شهور:6 months,1 سنة:1 year", "userrights-invalid-expiry": "تاريخ انتهاء المجموعة \"$1\" غير صحيح.", "userrights-expiry-in-past": "تاريخ انتهاء المجموعة \"$1\" هو في الماضي.", - "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء للمجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.", + "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء لعضوية المجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.", "userrights-conflict": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.", "group": "المجموعة:", "group-user": "مستخدمون", @@ -1422,6 +1422,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة،\" لذا فهذا المرشح يتعارض مع مرشحات نوع التغيير التالية: $1", "rcfilters-typeofchange-conflicts-hideminor": "مرشح نوع التغيير هذا يتعارض مع مرشح \"التعديلات الطفيفة\". بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة.\"", "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ $2 (إلى $1 معروضة).", + "rclistfromreset": "إعادة ضبط خيار التاريخ", "rclistfrom": "أظهر التغييرات بدء من $3 $2", "rcshowhideminor": "$1 التعديلات الطفيفة", "rcshowhideminor-show": "أظهر", @@ -1542,6 +1543,7 @@ "php-uploaddisabledtext": "رفع ملفات PHP معطل. من فضلك تحقق من إعدادات رفع الملفات.", "uploadscripted": "هذا الملف يضم كود HTML أو كود آخر يمكن أن يفسره متصفح الوب بطريقة خاطئة.", "upload-scripted-pi-callback": "لا يمكن رفع ملف يحتوي على تعليمة معالجة XML-stylesheet", + "upload-scripted-dtd": "لا يمكن رفع ملفات SVG التي تحتوي على إعلان DTD غير قياسي.", "uploaded-script-svg": "تم العثور على عنصر سكريبت \"$1\" في ملف الSVG المرفوع.", "uploaded-hostile-svg": "تم العثور على CSS غير آمن في عنصر الشكل في ملف الSVG المرفوع.", "uploaded-event-handler-on-svg": "ضبط سمات معالج الأحداث $1=\"$2\" غير مسموح به في ملفات SVG.", @@ -2276,9 +2278,6 @@ "undeleteviewlink": "اعرض", "undeleteinvert": "اعكس الاختيار", "undeletecomment": "السبب:", - "undeletedrevisions": "تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}", - "undeletedrevisions-files": "أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}", - "undeletedfiles": "أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}", "cannotundelete": "بعض أو كل عملية الاسترجاع فشلت:\n$1", "undeletedpage": "'''تم استرجاع $1'''\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.", "undelete-header": "انظر الصفحات المحذوفة حديثا في [[Special:Log/delete|سجل الحذف]].", @@ -3857,6 +3856,7 @@ "special-characters-group-thai": "تايلندية", "special-characters-group-lao": "لاوية", "special-characters-group-khmer": "خميرية", + "special-characters-group-canadianaboriginal": "كندي أصلي", "special-characters-title-endash": "واصلة قصيرة", "special-characters-title-emdash": "واصلة طويلة", "special-characters-title-minus": "علامة الطرح", @@ -4001,5 +4001,10 @@ "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n
    0.0.0.0/0\n::/0
    ", "revid": "المراجعة $1", "pageid": "معرف الصفحة $1", - "rawhtml-notallowed": "لا يمكن استخدام وسوم <html> خارج الصفحات العادية." + "rawhtml-notallowed": "لا يمكن استخدام وسوم <html> خارج الصفحات العادية.", + "gotointerwiki": "ترك {{SITENAME}}", + "gotointerwiki-invalid": "العنوان المحدد كان غير صحيح.", + "gotointerwiki-external": "أنت على وشك ترك {{SITENAME}} لزيارة [[$2]] والذي هو موقع منفصل.\n\n[$1 اضغط هنا للاستمرار إلى $1].", + "undelete-cantedit": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا يمكنك تعديل هذه الصفحة.", + "undelete-cantcreate": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا توجد صفحة بهذا الاسم وأنت غير مسموح لك بإنشاء هذه الصفحة." } diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json index b46c1549c8..23d0b1df9a 100644 --- a/languages/i18n/ast.json +++ b/languages/i18n/ast.json @@ -754,6 +754,8 @@ "post-expand-template-argument-warning": "Avisu: Esta páxina contien polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.\nEstos parámetros s'omitieron.", "post-expand-template-argument-category": "Páxines con parámetros de plantía omitíos", "parser-template-loop-warning": "Deteutóse un bucle de plantíes: [[$1]]", + "template-loop-category": "Páxines con bucles de plantíes", + "template-loop-category-desc": "Esta páxina contien un bucle de plantía, esto ye, una plantía que se llama ella mesma de mou recursivu.", "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)", "language-converter-depth-warning": "Se pasó la llende de fondura del convertidor de llingües ($1)", "node-count-exceeded-category": "Páxines onde se pasó la cuenta de noyos", @@ -1085,7 +1087,7 @@ "saveusergroups": "Guardar los grupos {{GENDER:$1|del usuariu|de la usuaria}}", "userrights-groupsmember": "Miembru de:", "userrights-groupsmember-auto": "Miembru implícitu de:", - "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá d'esti grupu; nun puede adelantase.", + "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá de la pertenencia a esti grupu; nun puede adelantase.", "userrights-reason": "Motivu:", "userrights-no-interwiki": "Nun tienes permisu pa editar los derechos d'usuariu n'otres wikis.", "userrights-nodatabase": "La base de datos $1 nun esiste o nun ye llocal.", @@ -1099,7 +1101,7 @@ "userrights-expiry-options": "1 día:1 day,1 selmana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 añu:1 year", "userrights-invalid-expiry": "La hora de caducidá del grupu «$1» nun ye válida.", "userrights-expiry-in-past": "La hora de caducidá del grupu «$1» ta nel pasáu", - "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá del grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.", + "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá de la pertenencia al grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.", "userrights-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.", "group": "Grupu:", "group-user": "Usuarios", @@ -1364,6 +1366,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Dellos tipos de cambiu nun pueden designase como «menores», de manera qu'esti filtru fai conflictu colos siguientes filtros «Tipu de cambiu»: $1", "rcfilters-typeofchange-conflicts-hideminor": "Esti filtru de «Tipu de cambiu» fai conflictu col filtru «Ediciones menores». Dellos tipos de cambiu nun pueden designase como «menores».", "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l $3, a les $4 (s'amuesen un máximu de $1).", + "rclistfromreset": "Reaniciar la seleición de data", "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2", "rcshowhideminor": "$1 ediciones menores", "rcshowhideminor-show": "Amosar", @@ -2216,9 +2219,6 @@ "undeleteviewlink": "ver", "undeleteinvert": "Invertir seleición", "undeletecomment": "Motivu:", - "undeletedrevisions": "{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos", - "undeletedfiles": "{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}", "cannotundelete": "Falló total o parcialmente la restauración:\n$1", "undeletedpage": "'''Restauróse $1'''\n\nConsulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.", "undelete-header": "Mira nel [[Special:Log/delete|rexistru d'esborraos]] les páxines esborraes recién.", @@ -2777,6 +2777,7 @@ "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.", "newimages-legend": "Peñera", "newimages-label": "Nome d'archivu (o una parte d'él):", + "newimages-user": "Direición IP o nome d'usuariu", "newimages-showbots": "Ver les xubíes de los bots", "newimages-hidepatrolled": "Despintar les entraes patrullaes", "noimages": "Nun hai nada que ver.", @@ -3684,6 +3685,7 @@ "special-characters-group-thai": "Tailandés", "special-characters-group-lao": "Laosianu", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Aborixe canadiense", "special-characters-title-endash": "guión curtiu", "special-characters-title-emdash": "guión llargu", "special-characters-title-minus": "signu menos", @@ -3829,5 +3831,6 @@ "restrictionsfield-label": "Rangos d'IP permitíos:", "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:
    0.0.0.0/0\n::/0
    ", "revid": "revisión $1", - "pageid": "ID de páxina $1" + "pageid": "ID de páxina $1", + "rawhtml-notallowed": "Les etiquetes <html> nun pueden usase fuera de les páxines normales." } diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json index 9925369ff2..1e5d7940ff 100644 --- a/languages/i18n/ba.json +++ b/languages/i18n/ba.json @@ -2093,9 +2093,6 @@ "undeleteviewlink": "ҡарарға", "undeleteinvert": "Һайланғандарҙы әйләндерергә", "undeletecomment": "Сәбәп:", - "undeletedrevisions": "$1 {{PLURAL:$1|өлгө}} тергеҙелде", - "undeletedrevisions-files": "{{PLURAL:$1|1=өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде", - "undeletedfiles": "{{PLURAL:$1|файл}} тергеҙелде", "cannotundelete": "Юйыуҙы кире алып булманы:\n$1", "undeletedpage": "'''$1 бите тергеҙелде'''\n\nҺуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау өсөн, [[Special:Log/delete|юйыу яҙмалары журналын]] ҡарағыҙ.", "undelete-header": "Һуңғы юйылған биттәрҙе [[Special:Log/delete|юйыу яҙмалары журналында]] ҡарағыҙ.", diff --git a/languages/i18n/bar.json b/languages/i18n/bar.json index 5a2c295ce3..fd6f1e0858 100644 --- a/languages/i18n/bar.json +++ b/languages/i18n/bar.json @@ -892,7 +892,6 @@ "undeletebtn": "Wiederherstön", "undeletelink": "oschaugn / wiadaheastejn", "undeleteviewlink": "oschaugn", - "undeletedfiles": "$1 {{PLURAL:$1|Datei|Dateien}} san wieda hergstellt worn", "undelete-search-box": "Suach noch gleschde Artiken", "undelete-search-submit": "Suach", "undelete-show-file-submit": "Jo", diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json index 54569a2bee..2164c2e70d 100644 --- a/languages/i18n/be-tarask.json +++ b/languages/i18n/be-tarask.json @@ -868,8 +868,8 @@ "revdelete-reasonotherlist": "Іншая прычына", "revdelete-edit-reasonlist": "Рэдагаваць прычыны выдаленьня", "revdelete-offender": "Аўтар вэрсіі:", - "suppressionlog": "Журнал схаваньняў", - "suppressionlogtext": "Ніжэй пададзены сьпіс выдаленьняў і блякаваньняў, схаваных нават ад адміністратараў.\nГлядзіце [[Special:BlockList|сьпіс блякаваньняў]], каб паглядзець сьпіс цяперашніх блякаваньняў.", + "suppressionlog": "Журнал хаваньняў", + "suppressionlogtext": "Ніжэй пададзены сьпіс выдаленьняў і блякаваньняў, схаваных ад адміністратараў.\nГлядзіце [[Special:BlockList|сьпіс блякаваньняў]], каб убачыць сьпіс цяперашніх блякаваньняў.", "mergehistory": "Аб’яднаць гісторыі старонак", "mergehistory-header": "Гэтая старонка дазваляе аб'яднаць гісторыю рэдагаваньняў адной старонкі з гісторыяй іншай, новай старонкі.\nУпэўніцеся, што гэтыя зьмены не парушаць пасьлядоўнасьць гісторыі старонкі.", "mergehistory-box": "Аб’яднаць гісторыі рэдагаваньняў дзьвюх старонак:", @@ -1088,7 +1088,7 @@ "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}", "userrights-groupsmember": "Уваходзіць у:", "userrights-groupsmember-auto": "Няяўны чалец:", - "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня гэтай групы, вы ня можаце павялічыць яго.", + "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня сяброўства ў гэтай групе, вы ня можаце павялічыць яго.", "userrights-reason": "Прычына:", "userrights-no-interwiki": "Вы ня маеце дазволу зьмяняць правы ўдзельнікаў іншых вікаў.", "userrights-nodatabase": "Базы зьвестак $1 не існуе альбо яна не зьяўляецца лякальнай.", @@ -1102,7 +1102,7 @@ "userrights-expiry-options": "1 дзень:1 day,1 тыдзень:1 week,1 месяц:1 month,3 месяцы:3 months,6 месяцаў:6 months,1 год:1 year", "userrights-invalid-expiry": "Тэрмін заканчэньня для групы «$1» зьяўляецца няслушным.", "userrights-expiry-in-past": "Час заканчэньня для групы «$1» знаходзіцца ў мінулым.", - "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час дзеяньня групы «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час дзеяньня.", + "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час сяброўства ў групе «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час сяброўства.", "userrights-conflict": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.", "group": "Група:", "group-user": "Удзельнікі", @@ -1366,6 +1366,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя», таму гэты фільтар канфліктуе з наступнымі фільтрамі «Тыпаў зьменаў»: $1", "rcfilters-typeofchange-conflicts-hideminor": "Гэты фільтар тыпаў зьменаў канфліктуе зь фільтрам «Дробныя праўкі». Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя».", "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з $4 $3 (да $1 на старонку).", + "rclistfromreset": "Скінуць выбар даты", "rclistfrom": "Паказаць зьмены з $2 $3", "rcshowhideminor": "$1 дробныя праўкі", "rcshowhideminor-show": "Паказаць", @@ -1486,6 +1487,7 @@ "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».", "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.", "upload-scripted-pi-callback": "Немагчыма загрузіць файл, які ўтрымлівае інструкцыі апрацоўкі табліцы стыляў XML.", + "upload-scripted-dtd": "Немагчыма загрузіць SVG-файлы, якія ўтрымліваюць нестандартнае DTD-абвяшчэньне.", "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».", "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.", "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў $1=\"$2\" не дазволена для SVG-файлаў.", @@ -2218,9 +2220,6 @@ "undeleteviewlink": "паказаць", "undeleteinvert": "Адваротны выбар", "undeletecomment": "Прычына:", - "undeletedrevisions": "{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}", - "undeletedrevisions-files": "адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}", - "undeletedfiles": "{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}", "cannotundelete": "Некаторыя або ўсе аднаўленьні не былі выкананыя:\n$1", "undeletedpage": "'''Старонка $1 была адноўленая'''\n\nГлядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.", "undelete-header": "Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў.", @@ -3485,7 +3484,7 @@ "htmlform-user-not-valid": "$1 — некарэктнае імя карыстальніка.", "logentry-delete-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} старонку $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|выдаліў|выдаліла}} перанакіраваньне $3 шляхам перазапісу", - "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3", + "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3 ($4)", "logentry-delete-event": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3", @@ -3789,6 +3788,7 @@ "authmanager-realname-label": "Сапраўднае імя", "authmanager-realname-help": "Сапраўднае імя ўдзельніка", "authmanager-provider-password": "Аўтэнтыфікацыя на аснове паролю", + "authmanager-provider-password-domain": "Аўтэнтыфікацыя на аснове паролю і дамэну", "authmanager-provider-temporarypassword": "Часовы пароль", "changecredentials": "Зьмена ўліковых зьвестак", "removecredentials": "Выдаленьне ўліковых зьвестак", diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json index 1f57bb6950..3216686b8b 100644 --- a/languages/i18n/bg.json +++ b/languages/i18n/bg.json @@ -239,6 +239,8 @@ "talk": "Беседа", "views": "Прегледи", "toolbox": "Инструменти", + "tool-link-userrights": "Промяна на {{GENDER:$1|потребителските}} групи", + "tool-link-userrights-readonly": "Преглед на {{GENDER:$1|потребителските}} групи", "tool-link-emailuser": "Писмо до {{GENDER:$1|потребителя}}", "userpage": "Потребителска страница", "projectpage": "Проектна страница", @@ -720,6 +722,7 @@ "invalid-content-data": "Невалидни данни за съдържание", "content-not-allowed-here": "\nНа страницата [[$2]] не е позволено използването на $1", "editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто \"Редактиране\" в личните ви настройки.", + "editpage-invalidcontentmodel-title": "Форматът на съдържанието не се поддържа", "editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа", "content-model-wikitext": "уикитекст", "content-model-text": "обикновен текст", @@ -768,8 +771,8 @@ "page_first": "първа", "page_last": "последна", "histlegend": "Разлики: Изберете версиите, които желаете да сравните, чрез превключвателите срещу тях и натиснете <Enter> или бутона за сравнение.
    \nЛегенда: (тек) = разлика с текущата версия, (пред) = разлика с предишната версия, м = Ð¼Ð°Ð»ÐºÐ° промяна", - "history-fieldset-title": "Търсене в историята", - "history-show-deleted": "Само изтритите", + "history-fieldset-title": "Търсене на версии", + "history-show-deleted": "Само за изтриване на версии", "histfirst": "най-стари", "histlast": "най-нови", "historysize": "({{PLURAL:$1|1 байт|$1 байта}})", @@ -784,6 +787,7 @@ "rev-deleted-event": "(записът е изтрит)", "rev-deleted-user-contribs": "[потребителското име или IP адрес са премахнати - редакцията е скрита от приносите]", "rev-deleted-text-permission": "Тази версия на страницата е била '''изтрита'''.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].", + "rev-suppressed-text-permission": "Тази редация на страницата е била прикрита.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневника на прикриванията].", "rev-deleted-text-unhide": "Тази версия на страницата е била '''изтрита'''.\nДопълнителна информация може се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].\nКато администратор на сайта вие можете да [$1 прегледате тази редакция], ако желаете да продължите.", "rev-suppressed-text-unhide": "Тази версия на страницата е била '''прикрита'''.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на прикриванията].\nМожете да [$1 прегледате версията], ако желаете да продължите.", "rev-deleted-text-view": "Тази редация на страницата е била '''изтрита'''.\nКато администратор на сайта, вие можете да я прегледате.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].", @@ -803,6 +807,7 @@ "revdelete-show-file-confirm": "Необходимо е потвърждение, че желаете да прегледате изтритата версия на файла „$1“ от $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": "Изтритите файлови редакции ще продължат да се виждат в историята на страницата, но части от съдържанието им ще бъдат публично недостъпни.", @@ -927,6 +932,7 @@ "showingresultsinrange": "Показване на до {{PLURAL:$1|1 резултат|$1 резултата}} в диапазона от #$2 до #$3.", "search-showingresults": "{{PLURAL:$4|Резултат $1 от $3|Резултати $1 - $2 от $3}}", "search-nonefound": "Няма резултати, които да отговарят на заявката.", + "search-nonefound-thiswiki": "Няма резултати, които да отговарят на заявката на този сайт.", "powersearch-legend": "Разширено търсене", "powersearch-ns": "Търсене в именни пространства:", "powersearch-togglelabel": "Избор:", @@ -936,6 +942,7 @@ "search-external": "Външно търсене", "searchdisabled": "Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.", "search-error": "Възникна грешка при търсене: $1", + "search-warning": "По време на търсенето беше генерирано предупреждение: $1", "preferences": "Настройки", "mypreferences": "Настройки", "prefs-edits": "Брой редакции:", @@ -1041,11 +1048,12 @@ "prefs-tokenwatchlist": "Маркер", "prefs-diffs": "Разлики", "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.", - "userrights": "Управление на потребителските права", + "userrights": "Потребителски права", "userrights-lookup-user": "Изберете потребител", "userrights-user-editname": "Потребителско име:", "editusergroup": "Зареждане на потребителските групи", "editinguser": "Промяна на потребителските права на {{GENDER:$1|потребител }} [[User:$1|$1]] $2", + "viewinguserrights": "Преглед на потребителските права на {{GENDER:$1|потребител}} [[User:$1|$1]] $2", "userrights-editusergroup": "Редактиране на {{GENDER:$1|потребителските}} групи", "userrights-viewusergroup": "Преглед на {{GENDER:$1|потребителските}} групи", "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи", @@ -1059,6 +1067,7 @@ "userrights-unchangeable-col": "Групи, които не можете да променяте", "userrights-expiry-current": "Изтича на $1", "userrights-expiry": "Изтича на:", + "userrights-expiry-existing": "Оставащо време: $2, $3", "userrights-expiry-othertime": "Друго време:", "userrights-expiry-options": "1 ден:1 day,1 седмица:1 week,1 месец:1 month,3 месеца:3 months,6 месеца:6 months,1 година:1 year", "group": "Потребителска група:", @@ -1122,6 +1131,8 @@ "right-unblockself": "Собствено отблокиране", "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници", "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“", + "right-editsemiprotected": "Редактиране на страници защитени като „{{int:protect-level-autoconfirmed}}“", + "right-editcontentmodel": "Редактиране на модела на съдържанието на страница", "right-editinterface": "Редактиране на потребителския интерфейс", "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители", "right-editusercss": "Редактиране на CSS файловете на други потребители", @@ -1213,10 +1224,12 @@ "action-userrights-interwiki": "редактиране на потребителските права на потребители от други уикита", "action-siteadmin": "заключване и отключване на базата от данни", "action-sendemail": "изпращане на е-писма", + "action-editmyoptions": "редактиране на собствените настройки", "action-editmywatchlist": "редактиране на списъка ви за наблюдение", "action-viewmywatchlist": "преглед на списъка ви за наблюдение", "action-viewmyprivateinfo": "преглеждане на личните данни", "action-editmyprivateinfo": "редактиране на личната си информация", + "action-editcontentmodel": "редактиране на модела на съдържанието на страница", "action-managechangetags": "създаване и (де)активиране на етикети", "action-applychangetags": "прилагане на етикетите заедно с промените ви", "action-purge": "почисти кеша на тази страница", @@ -1239,9 +1252,11 @@ "rcfilters-restore-default-filters": "Възстановяване на филтри по подразбиране", "rcfilters-clear-all-filters": "Изчистване на всички филтри", "rcfilters-filterlist-title": "Филтри", + "rcfilters-filterlist-whatsthis": "Какво е това?", "rcfilters-highlightmenu-title": "Изберете цвят", "rcfilters-filterlist-noresults": "Не са намерени филтри", "rcfilters-filtergroup-registration": "Регистрация на потребители", + "rcfilters-filter-registered-label": "Регистрация", "rcfilters-filter-unregistered-label": "Нерегистрирани", "rcfilters-filter-editsbyself-label": "Ваши собствени редакции", "rcfilters-filter-editsbyself-description": "Ваши редакции.", @@ -1254,6 +1269,11 @@ "rcfilters-filter-humans-label": "Човек (не бот)", "rcfilters-filter-humans-description": "Редакции, направени от редактори.", "rcfilters-filtergroup-reviewstatus": "Проверка на статуса", + "rcfilters-filter-patrolled-label": "Патрулирано", + "rcfilters-filter-patrolled-description": "Редакции, отбелязани като патрулирани.", + "rcfilters-filter-unpatrolled-label": "Непатрулирано", + "rcfilters-filter-unpatrolled-description": "Редакции, неотбелязани като патрулирани.", + "rcfilters-filtergroup-significance": "Значимост", "rcfilters-filter-minor-label": "Малки промени", "rcfilters-filter-major-label": "Обикновени редакции", "rcfilters-filtergroup-changetype": "Вид на промяната", @@ -1388,6 +1408,7 @@ "upload-options": "Настройки за качване", "watchthisupload": "Наблюдаване на файла", "filewasdeleted": "Файл в този име е съществувал преди време, но е бил изтрит. Проверете $1 преди да го качите отново.", + "filename-thumb-name": "Заглавието на този файл изглежда като заглавие на миниатюра (thumbnail). Не качвайте миниатюри на файлове, които вече съществуват в това същото уки. Освен това, променете заглавието на файла с някое по-съдържателно и без представката, която е характерна за миниатюрите.", "filename-bad-prefix": "Името на файла, който качвате, започва с '''„$1“''', което е неописателно име, типично задавано по автоматичен начин от цифровите камери или апарати. Изберете по-описателно име на файла.", "upload-proto-error": "Неправилен протокол", "upload-proto-error-text": "Изисква се адрес започващ с http:// или ftp://.", @@ -1415,6 +1436,7 @@ "upload-form-label-infoform-date": "Дата", "upload-form-label-own-work-message-generic-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.", "upload-form-label-not-own-work-message-generic-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.", + "upload-form-label-not-own-work-message-generic-foreign": "Ако не можете да качите този файл в съответствие с правилата на споделеното хранилище, моля, затворете този прозорец и опитайте друг метод.", "backend-fail-notexists": "Файлът $1 не съществува.", "backend-fail-delete": "Файлът $1 не може да бъде изтрит.", "backend-fail-alreadyexists": "Файлът $1 вече съществува.", @@ -1510,6 +1532,7 @@ "sharedupload-desc-there": "Този файл е от $1 и може да се използва от други проекти.\nЗа повече информация вижте [$2 описателната му страница].", "sharedupload-desc-here": "Този файл е от $1 и може да се използва от други проекти.\nСледва информация за файла, достъпна през [$2 оригиналната му описателна страница].", "sharedupload-desc-edit": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].", + "sharedupload-desc-create": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].", "filepage-nofile": "Не съществува файл с това име.", "filepage-nofile-link": "Не съществува файл с това име, но можете [$1 да го качите].", "uploadnewversion-linktext": "Качване на нова версия на файла", @@ -1980,7 +2003,7 @@ "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.", "undelete-fieldset-title": "Възстановяване на версии", "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.", - "undeleterevisions": "{{PLURAL:$1|Една версия беше архивирана|$1 версии бяха архивирани}}", + "undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}", "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.", "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието й трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.", "undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването й. Конкретното съдържание на изтритите версии е достъпно само за администратори.", @@ -1992,9 +2015,6 @@ "undeleteviewlink": "преглеждане", "undeleteinvert": "Обръщане на избора", "undeletecomment": "Причина:", - "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}", - "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени", - "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}", "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1", "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].", "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.", @@ -2317,7 +2337,7 @@ "import-nonewrevisions": "Не са импортирани версии (всички вече съществуват или са пропуснати поради грешки).", "xml-error-string": "$1 на ред $2, колона $3 (байт $4): $5", "import-upload": "Качване на XML данни", - "import-token-mismatch": "Загубени са данните за сесията. Опитайте отново.", + "import-token-mismatch": "Загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. Моля, уверете се, че сте влезли в профила си и опитайте отново.\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.", "import-invalid-interwiki": "Не може да бъде извършено внасяне от посоченото уики.", "import-error-edit": "Страницата „$1“ не беше импортирана, тъй като нямате права да я редактирате.", "import-error-create": "Страницата „$1“ не беше импортирана, тъй като нямате права да я създадете.", @@ -2434,6 +2454,7 @@ "pageinfo-length": "Дължина на страницата (в байтове)", "pageinfo-article-id": "Номер на страницата", "pageinfo-language": "Език на съдържанието на страницата", + "pageinfo-language-change": "промяна", "pageinfo-content-model": "Модел на съдържанието на страницата", "pageinfo-content-model-change": "промяна", "pageinfo-robot-policy": "Индексиране от роботи", @@ -2523,6 +2544,7 @@ "newimages-summary": "Тази специална страница показва последно качените файлове.", "newimages-legend": "Име на файл", "newimages-label": "Име на файл (или част от него):", + "newimages-user": "IP-адрес или потребителско име", "newimages-showbots": "Показване на качвания от ботове", "newimages-hidepatrolled": "Скрий проверените качвания", "noimages": "Няма нищо.", @@ -3092,6 +3114,7 @@ "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-existing-tags": "Съществуващи етикети:", "tags-edit-existing-tags-none": "Няма", @@ -3141,6 +3164,7 @@ "htmlform-time-placeholder": "ЧЧ:ММ:СС", "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС", "htmlform-date-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД.", + "htmlform-datetime-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.", "htmlform-title-badnamespace": "[[:$1]] не е в именното пространство \"{{ns:$2}}\".", "htmlform-title-not-exists": "$1 не съществува.", "htmlform-user-not-exists": "$1 не съществува.", @@ -3177,6 +3201,7 @@ "logentry-rights-rights-legacy": "$1 {{GENDER:$2|промени}} потребителската група на $3", "logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5", "logentry-upload-upload": "$1 {{GENDER:$2|качи}} $3", + "logentry-upload-revert": "$1 {{GENDER:$2|качи}} $3", "log-name-managetags": "Дневник на управлението на етикети", "log-description-managetags": "На тази страница са изброени задачи, свързани с управлението на [[Special:Tags|етикети]]. Дневникът съдържа само действия, извършвани ръчно от администратор. Етикети могат да бъдат създавани или изтривани от уики софтуера без това да бъде отразено в този дневник.", "log-name-tag": "Дневник на етикетите", @@ -3239,6 +3264,7 @@ "pagelang-select-lang": "Избиране на език", "pagelang-reason": "Причина", "pagelang-submit": "Изпращане", + "pagelang-nonexistent-page": "Страницата $1 не съществува.", "right-pagelang": "Промяна езика на страница", "action-pagelang": "промяна езика на страницата", "log-name-pagelang": "Дневник на езиковите промени", @@ -3258,6 +3284,7 @@ "mediastatistics-header-audio": "Аудио", "mediastatistics-header-video": "Видео", "mediastatistics-header-multimedia": "Мултимедия", + "mediastatistics-header-office": "Офис", "mediastatistics-header-total": "Всички файлове", "json-error-syntax": "Синтактична грешка", "headline-anchor-title": "Препратка към този раздел", @@ -3286,8 +3313,11 @@ "mw-widgets-dateinput-no-date": "Нищо не е избрано", "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД", "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ", + "mw-widgets-mediasearch-input-placeholder": "Търсене на мултимедия", + "mw-widgets-mediasearch-noresults": "Не бяха открити резултати.", "mw-widgets-titleinput-description-new-page": "страницата все още не съществува", "mw-widgets-titleinput-description-redirect": "пренасочване към $1", + "mw-widgets-categoryselector-add-category-placeholder": "Добавяне на категория...", "randomrootpage": "Случайна основна страница", "log-action-filter-block": "Вид на блокирането:", "log-action-filter-delete": "Вид на изтриването:", @@ -3299,14 +3329,23 @@ "log-action-filter-block-block": "Блокиране", "log-action-filter-block-reblock": "Промяна на блокирането", "log-action-filter-block-unblock": "Отблокиране", + "log-action-filter-contentmodel-change": "Промяна на модела на съдържанието", "log-action-filter-delete-delete": "Изтриване на страница", "log-action-filter-delete-restore": "Възстановяване на страница", + "log-action-filter-managetags-create": "Създаване на етикети", "log-action-filter-managetags-delete": "Премахване на етикет", "log-action-filter-managetags-activate": "Активиране на етикет", "log-action-filter-managetags-deactivate": "Деактивиране на етикет", + "log-action-filter-newusers-autocreate": "Автоматично създаване", + "log-action-filter-protect-protect": "Защита", + "log-action-filter-protect-unprotect": "Сваляне на защитата", + "log-action-filter-rights-rights": "Ръчна промяна", + "log-action-filter-rights-autopromote": "Автоматична промяна", "log-action-filter-upload-upload": "Ново качване", "log-action-filter-upload-overwrite": "Повторно качване", + "authmanager-create-disabled": "Създаването на сметки е изключено.", "authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.", + "authmanager-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.", "authmanager-retype-help": "Парола (повторно) за потвърждение.", "authmanager-email-label": "Е-поща", "authmanager-email-help": "Електронна поща", @@ -3315,5 +3354,12 @@ "authmanager-provider-temporarypassword": "Временна парола", "authprovider-resetpass-skip-label": "Пропусни", "specialpage-securitylevel-not-allowed-title": "Не е позволено", - "cannotauth-not-allowed-title": "Достъпът е отказан" + "cannotauth-not-allowed-title": "Достъпът е отказан", + "cannotauth-not-allowed": "Не ви е позволено да използвате тази страница", + "credentialsform-account": "Име на сметка:", + "linkaccounts": "Свързване на сметки", + "linkaccounts-success-text": "Сметката беше свързана.", + "linkaccounts-submit": "Свързване на сметки", + "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1", + "revid": "версия $1" } diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json index 50bcd54925..01189ba856 100644 --- a/languages/i18n/bn.json +++ b/languages/i18n/bn.json @@ -1106,7 +1106,7 @@ "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো", "userrights-groupsmember": "সদস্য:", "userrights-groupsmember-auto": "শর্তহীন সদস্য", - "userrights-groups-help": "আপনি এই ব্যবহারকারীর বর্তমান দল পরিবর্তন করতে পারবেন:\n* টিক চিহ্ন দেওয়া ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত।\n* টিক চিহ্ন বিহীন ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত নন।\n* একটি তারকা চিহ্ন (*) দ্বারা বোঝানো হচ্ছে এই দলের অন্তর্ভুক্তির পর আপনি আর তা বাতিল করতে পারবেন না, বা তদ্বিপরীত।\n* একটি হ্যাশ চিহ্ন (#) দ্বারা বোঝানো হচ্ছে আপনি শুধুমাত্র এই দলের মেয়াদ শেষ হওয়ার সময় পিছনে নিতে পারবেন; কিন্তু সামনে নিতে পারবেন না।", + "userrights-groups-help": "আপনি এই ব্যবহারকারীর বর্তমান দল পরিবর্তন করতে পারবেন:\n* টিক চিহ্ন দেওয়া ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত।\n* টিক চিহ্ন বিহীন ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত নন।\n* একটি তারকা চিহ্ন (*) দ্বারা বোঝানো হচ্ছে এই দলের অন্তর্ভুক্তির পর আপনি আর তা বাতিল করতে পারবেন না, বা তদ্বিপরীত।\n* একটি হ্যাশ চিহ্ন (#) দ্বারা বোঝানো হচ্ছে আপনি শুধুমাত্র এই দলের সদস্যতার মেয়াদ শেষ হওয়ার সময় পিছনে নিতে পারবেন; কিন্তু সামনে নিতে পারবেন না।", "userrights-reason": "কারণ (বাংলায় লিখুন):", "userrights-no-interwiki": "আপনার অন্য উইকিতে ব্যবহারকারী অধিকার সম্পাদনা করার অনুমতি নেই।", "userrights-nodatabase": "$1 ডাটাবেজটির হয় কোন অস্তিত্ব নেই অথবা এটি স্থানীয় ডাটাবেজ নয়।", @@ -1120,7 +1120,7 @@ "userrights-expiry-options": "১ দিন:1 day,১ সপ্তাহ:1 week,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year", "userrights-invalid-expiry": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অবৈধ।", "userrights-expiry-in-past": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অতীতে।", - "userrights-cannot-shorten-expiry": "\"$1\" দলটির মেয়াদোত্তীর্ণ হবার সময় ও তারিখ আপনি পূর্ববর্তী কোন সময়ে এগিয়ে নিয়ে আসতে পারবেন না। যেসব ব্যবহারকারীর এই দলটি যোগ বা অপসারণ করার অনুমতি আছে, কেবল তারাই মেয়াদোত্তীর্ণ হবার সময় ও তারিখ এগিয়ে নিয়ে আসতে পারবেন।", + "userrights-cannot-shorten-expiry": "\"$1\" দলটির সদস্যতার মেয়াদোত্তীর্ণ হবার সময় ও তারিখ আপনি পূর্ববর্তী কোন সময়ে এগিয়ে নিয়ে আসতে পারবেন না। যেসব ব্যবহারকারীর এই দলটি যোগ বা অপসারণ করার অনুমতি আছে, কেবল তারাই মেয়াদোত্তীর্ণ হবার সময় ও তারিখ এগিয়ে নিয়ে আসতে পারবেন।", "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।", "group": "দল:", "group-user": "ব্যবহারকারীগণ", @@ -1385,6 +1385,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত পরিবর্তনের ধরন ছাঁকনিগুলির সংঘর্ষ আছে: $1", "rcfilters-typeofchange-conflicts-hideminor": "এই \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিটির সাথে \"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সংঘর্ষ আছে। কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়।", "rcnotefrom": "$2টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ $1টি দেখানো হয়েছে)।", + "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন", "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও", "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1", "rcshowhideminor-show": "দেখাও", @@ -2239,9 +2240,6 @@ "undeleteviewlink": "দেখাও", "undeleteinvert": "ব্যুত্ক্রমে নির্বাচন", "undeletecomment": "কারণ:", - "undeletedrevisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা হয়েছে", - "undeletedrevisions-files": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} এবং {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পুনরুদ্ধার করা হয়েছে", - "undeletedfiles": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পুনরুদ্ধার করা হয়েছে", "cannotundelete": "কিছু বা সব পুনরুদ্ধার করা যায়নি:\n$1", "undeletedpage": "'''$1 পুনরুদ্ধার করা হয়েছে'''\n\nসাম্প্রতিক মুছে ফেলা ও পুনরুদ্ধারের ঘটনাগুলির জন্য [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।", "undelete-header": "সাম্প্রতিক সময়ে মুছে ফেলা পাতাগুলি দেখতে [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।", @@ -3575,7 +3573,10 @@ "htmlform-user-not-valid": "$1 একটি বৈধ ব্যবহারকারীর নাম নয়।", "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে", "logentry-delete-delete_redir": "$1 পুনর্লিখনের দ্বারা $3 পুনর্নির্দেশ {{GENDER:$2|অপসারণ করেছেন}}", - "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে", + "logentry-delete-restore": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}} ($4)", + "logentry-delete-restore-nocount": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}}", + "restore-count-revisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}}", + "restore-count-files": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}}", "logentry-delete-event": "$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4", "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4", "logentry-delete-event-legacy": "$1 $3টায় লগ ইভেন্টসমূহের দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন", @@ -3782,6 +3783,7 @@ "special-characters-group-thai": "থাই", "special-characters-group-lao": "লাও", "special-characters-group-khmer": "খেমার", + "special-characters-group-canadianaboriginal": "কানাডীয় আদিবাসী", "special-characters-title-endash": "en ড্যাশ", "special-characters-title-emdash": "em ড্যাশ", "special-characters-title-minus": "বিয়োগ চিহ্ন", @@ -3928,5 +3930,8 @@ "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :
    0.0.0.0/0\n::/0
    ", "revid": "সংশোধন $1", "pageid": "পাতার আইডি $1", - "rawhtml-notallowed": "<html> ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।" + "rawhtml-notallowed": "<html> ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।", + "gotointerwiki": "{{SITENAME}} ছেড়ে যাচ্ছেন", + "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ ছিল।", + "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n[$1 $1-এ অবিরত থাকতে এখানে ক্লিক করুন]।" } diff --git a/languages/i18n/br.json b/languages/i18n/br.json index e0ab30110d..8d0ecf9c3a 100644 --- a/languages/i18n/br.json +++ b/languages/i18n/br.json @@ -2221,9 +2221,6 @@ "undeleteviewlink": "gwelet", "undeleteinvert": "Eilpennañ an diuzadenn", "undeletecomment": "Abeg :", - "undeletedrevisions": "Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}", - "undeletedrevisions-files": "Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}", - "undeletedfiles": "{{PLURAL:$1|1 restr|$1 restr}} adsavet", "cannotundelete": "Dibosupl eo bet nullañ diziverkadennoù zo pe an holl anezho :\n$1", "undeletedpage": "'''Diziverket eo bet $1'''\n\nSellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.", "undelete-header": "Gwelet [[Special:Log/delete|al log diverkañ]] evit ar pajennoù diverket nevez zo.", diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json index 9ac1030dbf..47d504d522 100644 --- a/languages/i18n/bs.json +++ b/languages/i18n/bs.json @@ -2140,9 +2140,6 @@ "undeleteviewlink": "pogledaj", "undeleteinvert": "Obrni izbor", "undeletecomment": "Razlog:", - "undeletedrevisions": "{{PLURAL:$1|vraćena $1 verzija|vraćene $1 verzije|vraćeno $1 verzija}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 verzija|$1 verzije|$1 verzija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno", - "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}", "cannotundelete": "Vraćanje jedne ili svih stavki nije uspjelo:\n$1", "undeletedpage": "Stranica $1 je vraćena\n\nProvjerite [[Special:Log/delete|zapisnik brisanja]] za zapise nedavnih brisanja i vraćanja.", "undelete-header": "Pogledajte [[Special:Log/delete|zapisnik brisanja]] za nedavno obrisane stranice.", @@ -3642,6 +3639,7 @@ "special-characters-group-thai": "tajlandski", "special-characters-group-lao": "laoski", "special-characters-group-khmer": "kmerski", + "special-characters-group-canadianaboriginal": "kanadski domorodni", "special-characters-title-endash": "crtica", "special-characters-title-emdash": "duga crta", "special-characters-title-minus": "minus", diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json index 0ccc4ed26c..f2602f350d 100644 --- a/languages/i18n/ca.json +++ b/languages/i18n/ca.json @@ -2247,9 +2247,6 @@ "undeleteviewlink": "veure", "undeleteinvert": "Invertir selecció", "undeletecomment": "Motiu:", - "undeletedrevisions": "{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}", - "undeletedrevisions-files": "{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats", - "undeletedfiles": "$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}", "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1", "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.", "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.", diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json index a5f7bc01a9..3819e5be99 100644 --- a/languages/i18n/ce.json +++ b/languages/i18n/ce.json @@ -1815,9 +1815,6 @@ "undeleteviewlink": "хьажа", "undeleteinvert": "Къастае массо", "undeletecomment": "Бахьана:", - "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}", - "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а", - "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}", "cannotundelete": "ГӀалат меттахӀоттайина:\n$1", "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].", "undelete-header": "Дукху хан йоцуш дӀаяхна агӀонаш хьажа мега [[Special:Log/delete|дӀадаьхьнарш долу тептар чохь]].", diff --git a/languages/i18n/crh-cyrl.json b/languages/i18n/crh-cyrl.json index 176b2b7ffc..34ab28bf89 100644 --- a/languages/i18n/crh-cyrl.json +++ b/languages/i18n/crh-cyrl.json @@ -1108,7 +1108,6 @@ "undeletebtn": "Кери кетир!", "undeletelink": "косьтер/кери кетир", "undeletecomment": "Себеп:", - "undeletedrevisions": "Топлам {{PLURAL:$1|1=1 къайд|$1 къайд}} кери кетирильди.", "undelete-header": "Кеченлерде ёкъ этильген саифелерни корьмек ичюн [[Special:Log/delete|ёкъ этюв журналына]] бакъынъыз.", "undelete-search-submit": "Къыдыр", "namespace": "Исим фезасы:", diff --git a/languages/i18n/crh-latn.json b/languages/i18n/crh-latn.json index 0f463ba628..4b1400da4c 100644 --- a/languages/i18n/crh-latn.json +++ b/languages/i18n/crh-latn.json @@ -1103,7 +1103,6 @@ "undeletebtn": "Keri ketir!", "undeletelink": "köster/keri ketir", "undeletecomment": "Sebep:", - "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.", "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.", "undelete-search-submit": "Qıdır", "namespace": "İsim fezası:", diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json index dec6dead0d..79e2bf7199 100644 --- a/languages/i18n/cs.json +++ b/languages/i18n/cs.json @@ -1109,7 +1109,7 @@ "saveusergroups": "Uložit {{GENDER:$1|uživatelské}} skupiny", "userrights-groupsmember": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:", "userrights-groupsmember-auto": "Automaticky {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupin}}:", - "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení dané skupiny můžete pouze prodloužit, ne zkrátit.", + "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení členství v dané skupině můžete pouze prodloužit, ne zkrátit.", "userrights-reason": "Důvod:", "userrights-no-interwiki": "Nemáte povoleno měnit uživatelská práva na jiných wiki.", "userrights-nodatabase": "Databáze $1 neexistuje nebo není místní.", @@ -1123,7 +1123,7 @@ "userrights-expiry-options": "1 den:1 day,1 týden:1 week,1 měsíc:1 month,3 měsíce:3 months,6 měsíců:6 months,1 rok:1 rok", "userrights-invalid-expiry": "Čas vypršení pro skupinu „$1“ je neplatný.", "userrights-expiry-in-past": "Čas vypršení pro skupinu „$1“ je v minulosti.", - "userrights-cannot-shorten-expiry": "Čas do vypršení skupiny „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.", + "userrights-cannot-shorten-expiry": "Čas do vypršení členství ve skupině „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.", "userrights-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.", "group": "Skupina:", "group-user": "Uživatelé", @@ -1361,9 +1361,9 @@ "rcfilters-filter-user-experience-level-experienced-label": "Zkušení uživatelé", "rcfilters-filter-user-experience-level-experienced-description": "Více než 30 dní činnosti a 500 editací.", "rcfilters-filtergroup-automated": "Automatizované příspěvky", - "rcfilters-filter-bots-label": "Bot", + "rcfilters-filter-bots-label": "Robot", "rcfilters-filter-bots-description": "Editace provedené pomocí automatizovaných nástrojů.", - "rcfilters-filter-humans-label": "Člověk (ne bot)", + "rcfilters-filter-humans-label": "Člověk (ne robot)", "rcfilters-filter-humans-description": "Editace provedené lidmi.", "rcfilters-filtergroup-reviewstatus": "Stav prověření", "rcfilters-filter-patrolled-label": "Prověřené", @@ -1388,6 +1388,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Určité typy změn nelze označit jako malé, tento filtr je proto v konfliktu s následujícími filtry podle typu změny: $1", "rcfilters-typeofchange-conflicts-hideminor": "Tento filtr podle typu změny je v konfliktu s filtrem „Malé editace“. Určité typy změn nelze označit jako malé.", "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od $3, $4 ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše $1).", + "rclistfromreset": "Obnovit výběr data", "rclistfrom": "Ukázat nové změny, počínaje od $2, $3", "rcshowhideminor": "$1 malé editace", "rcshowhideminor-show": "Zobrazit", @@ -2240,9 +2241,6 @@ "undeleteviewlink": "prohlédnout", "undeleteinvert": "Invertovat výběr", "undeletecomment": "Důvod:", - "undeletedrevisions": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}}", - "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.", - "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}", "cannotundelete": "Některá nebo všechna obnovení se nezdařila:\n$1", "undeletedpage": "Stránka „$1“ byla obnovena\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].", "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].", @@ -3557,7 +3555,10 @@ "htmlform-user-not-valid": "$1 není platné uživatelské jméno.", "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|smazal|smazala}} přesunem přesměrování $3", - "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3", + "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3", + "restore-count-revisions": "{{PLURAL:$1|jedna revize|$1 revize|$1 revizí}}", + "restore-count-files": "{{PLURAL:$1|jeden soubor|$1 soubory|$1 souborů}}", "logentry-delete-event": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3", @@ -3911,5 +3912,10 @@ "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:
    0.0.0.0/0\n::/0
    ", "revid": "revize $1", "pageid": "Stránka s ID $1", - "rawhtml-notallowed": "Značky <html> nelze používat mimo běžné stránky." + "rawhtml-notallowed": "Značky <html> nelze používat mimo běžné stránky.", + "gotointerwiki": "Opustit {{GENDER:4sg|{{SITENAME}}}}", + "gotointerwiki-invalid": "Zadaný název byl neplatný.", + "gotointerwiki-external": "Chystáte se opustit {{GRAMMAR:4sg|{{SITENAME}}}} a navštívit [[$2]], což je jiná webová stránka.\n\n[$1 Kliknutím zde budete pokračovat na $1].", + "undelete-cantedit": "Tuto stránku nemůžete obnovit, protože ji nejste oprávněni editovat.", + "undelete-cantcreate": "Tuto stránku nemůžete obnovit, protože stránka s tímto názvem neexistuje a vy ji nejste oprávněni vytvořit." } diff --git a/languages/i18n/de.json b/languages/i18n/de.json index d74b569377..e0d8e0880d 100644 --- a/languages/i18n/de.json +++ b/languages/i18n/de.json @@ -1165,7 +1165,7 @@ "userrights-groupsmember": "Mitglied von:", "userrights-groupsmember-auto": "Automatisch Mitglied von:", "userrights-groupsmember-type": "$2", - "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppe nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.", + "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppenmitgliedschaft nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.", "userrights-reason": "Grund:", "userrights-no-interwiki": "Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.", "userrights-nodatabase": "Die Datenbank $1 ist nicht vorhanden oder nicht lokal.", @@ -1179,7 +1179,7 @@ "userrights-expiry-options": "1 Tag:1 day,1 Woche:1 week,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year", "userrights-invalid-expiry": "Die Ablaufzeit für die Gruppe „$1“ ist ungültig.", "userrights-expiry-in-past": "Die Ablaufzeit für die Gruppe „$1“ liegt in der Vergangenheit.", - "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.", + "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Mitgliedschaft in der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.", "userrights-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.", "group": "Gruppe:", "group-user": "Benutzer", @@ -1444,6 +1444,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden, so dass dieser Filter mit den folgenden Änderungstypfiltern kollidiert: $1", "rcfilters-typeofchange-conflicts-hideminor": "Dieser Änderungstypfilter kollidiert mit dem Filter „Kleine Bearbeitungen“. Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden.", "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit $3, $4 (max. $1 Einträge).", + "rclistfromreset": "Datumsauswahl zurücksetzen", "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.", "rcshowhideminor": "Kleine Änderungen $1", "rcshowhideminor-show": "anzeigen", @@ -1565,6 +1566,7 @@ "php-uploaddisabledtext": "Das Hochladen von Dateien wurde in PHP deaktiviert.\nBitte überprüfe die file_uploads-Einstellung.", "uploadscripted": "Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.", "upload-scripted-pi-callback": "Es kann keine Datei hochgeladen werden, die XML-Stylesheet-Verarbeitungsbefehle enthält.", + "upload-scripted-dtd": "Es können keine SVG-Dateien hochgeladen werden, die keine Standard-DTD-Deklaration enthalten.", "uploaded-script-svg": "Skriptelement „$1“ in der hochgeladenen SVG-Datei gefunden.", "uploaded-hostile-svg": "Unsicheres CSS im Styleelement der hochgeladenen SVG-Datei gefunden.", "uploaded-event-handler-on-svg": "Das Festlegen von Ereignis-Handler-Attributen $1=\"$2\" ist in SVG-Dateien nicht erlaubt.", @@ -2298,9 +2300,6 @@ "undeleteviewlink": "ansehen", "undeleteinvert": "Auswahl umkehren", "undeletecomment": "Grund:", - "undeletedrevisions": "{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt", - "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt", - "undeletedfiles": "{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt", "cannotundelete": "Einige oder alle Wiederherstellungen sind fehlgeschlagen:\n$1", "undeletedpage": "'''„$1“''' wurde wiederhergestellt.\n\nIm [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.", "undelete-header": "Siehe das [[Special:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.", @@ -3586,7 +3585,10 @@ "htmlform-user-not-valid": "$1 ist kein gültiger Benutzername.", "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|löschte}} die Weiterleitung $3 durch Überschreiben", - "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seite $3 wieder her", + "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her", + "restore-count-revisions": "{{PLURAL:$1|Eine Version|$1 Versionen}}", + "restore-count-files": "{{PLURAL:$1|Eine Datei|$1 Dateien}}", "logentry-delete-event": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3", @@ -3797,6 +3799,7 @@ "special-characters-group-thai": "Thailändisch", "special-characters-group-lao": "Laotisch", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Kanadische Silbenschrift", "special-characters-title-endash": "Halbgeviertstrich", "special-characters-title-emdash": "Geviertstrich", "special-characters-title-minus": "Minus", @@ -3943,5 +3946,10 @@ "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n
    \n0.0.0.0/0\n::/0\n
    ", "revid": "Version $1", "pageid": "Seitenkennung $1", - "rawhtml-notallowed": "<html>-Tags können nicht außerhalb von normalen Seiten verwendet werden." + "rawhtml-notallowed": "<html>-Tags können nicht außerhalb von normalen Seiten verwendet werden.", + "gotointerwiki": "{{SITENAME}} verlassen", + "gotointerwiki-invalid": "Der angegebene Titel war ungültig.", + "gotointerwiki-external": "Du bist dabei, {{SITENAME}} zu verlassen, um [[$2]] zu besuchen, was eine externe Website ist.\n\n[$1 Hier klicken, um auf $1 fortzufahren].", + "undelete-cantedit": "Du kannst diese Seite nicht wiederherstellen, da du nicht berechtigt bist, diese Seite zu bearbeiten.", + "undelete-cantcreate": "Du kannst diese Seite nicht wiederherstellen, da es keine vorhandene Seite mit diesem Namen gibt und du nicht berechtigt bist, diese Seite zu erstellen." } diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json index 9d77f905b6..76a4a31063 100644 --- a/languages/i18n/diq.json +++ b/languages/i18n/diq.json @@ -435,7 +435,7 @@ "userlogin-joinproject": "Cıkewe {{SITENAME}}", "createaccount": "Hesab vıraze", "userlogin-resetpassword-link": "Parola xo kerda xo vira?", - "userlogin-helplink2": "Heqa qeydbiyayışi de peşti bıgêrên", + "userlogin-helplink2": "Qeydbiyayışi sero peşti bıgêrên", "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.", "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.", "userlogin-createanother": "Zewbi hesab vıraz", @@ -692,7 +692,7 @@ "permissionserrors": "İdari xeta", "permissionserrorstext": "Qey {{PLURAL:$1|sebeb|sebebê}} cêrini ra icazetê şıma çıniyo:", "permissionserrorstext-withaction": "{{PLURAL:$1|Sebebê|Sebebê}} cêri ra icazetê $2y çıniyo:", - "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:", + "recreate-moveddeleted-warn": "'''Hişyari: Şıma yew nuşteyo ke veri de esteriyao, ey vırazenê.'''\n\nHetê bınêni de qeydê esterıtışi u kırıştışi esto:", "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé esternayışi u wedarnayışi cér dé deya yo.", "log-fulllog": "Temamê rocaneyi bıvine", "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.", @@ -753,7 +753,7 @@ "page_first": "verên", "page_last": "peyên", "histlegend": "Ferqê weçinayışi: Qutiya versiyonan qandé têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.
    \nCetwel: ({{int:ferq}}) = ferqê versiyonê peyêni, ({{int:peyên}}) = ferqê versiyonê verêni, {{int:q}} = vırnayışo werdiyo.", - "history-fieldset-title": "Çımberz verori", + "history-fieldset-title": "Çım ra viyarnayışan cı geyre", "history-show-deleted": "Tenya esterıtey", "histfirst": "Verênêr", "histlast": "Peyênêr", @@ -875,7 +875,7 @@ "notextmatches": "tekê (zewcê) nuştey pele çıniyê", "prevn": "{{PLURAL:$1|$1}} verên", "nextn": "{{PLURAL:$1|$1}} peyên", - "prev-page": "Pela verên", + "prev-page": "Perra verêne", "next-page": "Pela peyên", "prevn-title": "$1o verên {{PLURAL:$1|netice|neticeyan}}", "nextn-title": "$1o ke yeno {{PLURAL:$1|netice|neticey}}", @@ -1208,7 +1208,7 @@ "action-mergehistory": "tarixê ena perre yew ke", "action-userrights": "heqqa karberanê hemî bivurne", "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne", - "action-siteadmin": "database kilit bike ya zi a bike", + "action-siteadmin": "Databasei kılit ke ya zi a ke", "action-sendemail": "e-posta bırşe", "action-editmyoptions": "Tercihanê xo bıvurne", "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê", @@ -1225,7 +1225,7 @@ "recentchanges": "Vırnayışê peyêni", "recentchanges-legend": "Tercihê vırnayışanê peyênan", "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.", - "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.", + "recentchanges-noresult": "Demê periyodi de vırnayış be enê kriteran çıniyo.", "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.", "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.", "recentchanges-label-minor": "No yew vırnayışo werdiyo", @@ -1987,9 +1987,6 @@ "undeleteviewlink": "bıvin", "undeleteinvert": "Weçinayışi dimlaşt ke", "undeletecomment": "Sebeb:", - "undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.", - "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni", - "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.", "cannotundelete": "Besternayışonhemembyana tayno nêbeno:\n$1", "undeletedpage": "'''$1 pel tepiya anciya'''\n\nqey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].", "undelete-header": "Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].", @@ -2061,7 +2058,7 @@ "block": "Karberi vındarne", "unblock": "Hesabê karberi akerê", "blockip": "{{GENDER:$1|Karberi}} kılit ke", - "blockip-legend": "Karber blok bike", + "blockip-legend": "Karberi blok ke", "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo)", "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:", "ipbexpiry": "Qedyayış:", @@ -2074,10 +2071,10 @@ "ipbsubmit": "Nê karberi kılit ke", "ipbother": "Waxtê bini:", "ipboptions": "2 saeti:2 hours,1 roce:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year,ebedi:infinite", - "ipbhidename": "Nameyê karberî listeyan u vurnayîşan ra binumne", - "ipbwatchuser": "Pela miniqaşe u pela ena karberî seyr bike", + "ipbhidename": "Namey karberi vırnayış u listan ra bınımne", + "ipbwatchuser": "Perra karberanê karberi u werênayışi cı ewne.", "ipb-disableusertalk": "No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı", - "ipb-change-block": "Pê ena ayaran, karberî reyna bloke bike", + "ipb-change-block": "Karberi be enê eyaran reyna piya bloke ke.", "ipb-confirm": "Bloke kerdışi tesdik ke", "badipaddress": "Adresê IPî raşt niyo", "blockipsuccesssub": "Blok biyo", @@ -2086,11 +2083,11 @@ "ipb-confirmhideuser": "Wexto ke \"karberi bınımnê\" nışandeyo se şıma ye kenê karberi bloke kerê. No, Namey karberi lista pêron dı u dekewtışê rocekan dı aktiv bo.Şıma qayıli ney bıkerê?", "ipb-edit-dropdown": "Sebebê blokî bivurne", "ipb-unblock-addr": "$1 a bik", - "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike", + "ipb-unblock": "Yew adresê IPy ya zi namey karberi bloke ke", "ipb-blocklist": "Blokî ke hama estê ey bivîne", "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i", "ipb-blocklist-duration-left": "$1 vet", - "unblockip": "Hesabê karberî a bike", + "unblockip": "Hesabê karberi a ke", "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.", "ipusubmit": "Enê kılit kerdışi wedarnê", "unblocked": "[[User:$1|$1]] blok biyo", @@ -2181,7 +2178,7 @@ "move-page": "$1 Bıkırış", "move-page-legend": "Pele bere", "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.", - "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.", + "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.", "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.", "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.", "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.", @@ -2982,7 +2979,7 @@ "unit-pixel": "px", "confirm_purge_button": "Temam", "confirm-purge-top": "Vervirê na pele bestere?", - "confirm-purge-bottom": "Purge kerdişê yew pel cacheyî estereno u revizyonê penîyî mucneno.", + "confirm-purge-bottom": "Pakkerdışê yew perre virê verêni estereno u çımraviyarnayışê peyêni gêno ver.", "confirm-watch-button": "TEMAM", "confirm-watch-top": "Ena pele lista xoya seyrkerdışi ke", "confirm-unwatch-button": "TEMAM", @@ -3256,7 +3253,7 @@ "htmlform-chosen-placeholder": "Opsiyon weçine", "htmlform-cloner-create": "Tayêna cı ke", "htmlform-cloner-delete": "Wedare", - "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}", + "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}", "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}", "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}", "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}", diff --git a/languages/i18n/dty.json b/languages/i18n/dty.json index b4faa3a2dd..30cc41caa0 100644 --- a/languages/i18n/dty.json +++ b/languages/i18n/dty.json @@ -1154,9 +1154,6 @@ "undeletehistory": "यदि कुनै पानालाई पुन: स्थापन गरायौ भण्या सम्पूर्ण संस्करणहरू इतिहासमी पुन:स्थापन हुन्याछन् ।\nयदि यै नामबठे नयाँ पानो निर्माण भैसक्याको छ भण्या पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमी स्थापित हुन्याछन् ।", "undeleterevdel": "यदि यो मल्लो पानो बणन्छ या फाइल संस्करणहरू आंशिक मेटियाका छन् भण्या मेट्न्या काम रद्द गरिन्या छैन।\nत्यै अवस्थामी तमीले छनौटमी अन्तिम मेटियाको नयाँ संस्करण नलुकाउन्यामी चिनो लगाउनु पडन्छ ।", "undelete-revision": "$3द्वारा $1को ($4को समय $5 मी) मेट्याका संशोधनहरू :", - "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो", - "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो", - "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमी ल्याइयो", "undelete-header": "भर्खरै मेटायाका पानाहरू हेद्दाकीलाई [[Special:Log/delete|मेटायाका लग]]मी जाओ।", "undelete-search-prefix": "सुरुवाती शब्द अनुसार पानाहरू खोज", "undelete-no-results": "मेटियाका पानाहरूको अभिलेखमी क्वै पन मिल्दा पानाहरू नाइभेटिया ।", diff --git a/languages/i18n/el.json b/languages/i18n/el.json index ff0286c892..1a94c80272 100644 --- a/languages/i18n/el.json +++ b/languages/i18n/el.json @@ -2175,9 +2175,6 @@ "undeleteviewlink": "προβολή", "undeleteinvert": "Ανατροπή επιλογής", "undeletecomment": "Αιτία:", - "undeletedrevisions": "{{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αποκαταστάθηκαν", - "undeletedrevisions-files": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} και $2 {{PLURAL:$2|αρχείο|αρχεία}} επαναφέρθηκαν", - "undeletedfiles": "$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν", "cannotundelete": "Μερικές ή όλες οι αναιρέσεις διαγραφής απέτυχαν: $1", "undeletedpage": "'''Η $1 έχει επαναφερθεί'''\n\nΣυμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.", "undelete-header": "Δείτε [[Special:Log/delete|το αρχείο καταγραφής διαγραφών]] για πρόσφατα διαγεγραμμένες σελίδες.", diff --git a/languages/i18n/en.json b/languages/i18n/en.json index abe7998833..e08a439820 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1429,6 +1429,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Certain types of change cannot be designated as \"minor,\" so this filter conflicts with the following Type of Change filters: $1", "rcfilters-typeofchange-conflicts-hideminor": "This Type of Change filter conflicts with the \"Minor Edits\" filter. Certain types of change cannot be designated as \"minor.\"", "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since $3, $4 (up to $1 shown).", + "rclistfromreset": "Reset date selection", "rclistfrom": "Show new changes starting from $2, $3", "rcshowhideminor": "$1 minor edits", "rcshowhideminor-show": "Show", @@ -1557,6 +1558,7 @@ "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.", "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.", "upload-scripted-pi-callback": "Cannot upload a file that contains XML-stylesheet processing instruction.", + "upload-scripted-dtd": "Cannot upload SVG files that contain a non-standard DTD declaration.", "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.", "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.", "uploaded-event-handler-on-svg": "Setting event-handler attributes $1=\"$2\" is not allowed in SVG files.", @@ -2349,9 +2351,6 @@ "undeleteviewlink": "view", "undeleteinvert": "Invert selection", "undeletecomment": "Reason:", - "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored", - "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored", - "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored", "cannotundelete": "Some or all of the undeletion failed:\n$1", "undeletedpage": "$1 has been restored\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.", "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.", @@ -3909,7 +3908,10 @@ "rawmessage": "$1", "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting", - "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3", + "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restored}} page $3", + "restore-count-revisions": "{{PLURAL:$1|1 revision|$1 revisions}}", + "restore-count-files": "{{PLURAL:$1|1 file|$1 files}}", "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3", @@ -4135,6 +4137,7 @@ "special-characters-group-thai": "Thai", "special-characters-group-lao": "Lao", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Canadian Aboriginal", "special-characters-title-endash": "en dash", "special-characters-title-emdash": "em dash", "special-characters-title-minus": "minus sign", @@ -4285,5 +4288,10 @@ "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:
    0.0.0.0/0\n::/0
    ", "revid": "revision $1", "pageid": "page ID $1", - "rawhtml-notallowed": "<html> tags cannot be used outside of normal pages." + "rawhtml-notallowed": "<html> tags cannot be used outside of normal pages.", + "gotointerwiki": "Leaving {{SITENAME}}", + "gotointerwiki-invalid": "The specified title was invalid.", + "gotointerwiki-external": "You are about to leave {{SITENAME}} to visit [[$2]] which is a separate website.\n\n[$1 Click here to continue on to $1].", + "undelete-cantedit": "You cannot undelete this page as you are not allowed to edit this page.", + "undelete-cantcreate": "You cannot undelete this page as there is no existing page with this name and you are not allowed to create this page." } diff --git a/languages/i18n/es.json b/languages/i18n/es.json index 2505433f28..7be3352277 100644 --- a/languages/i18n/es.json +++ b/languages/i18n/es.json @@ -1280,7 +1280,7 @@ "right-suppressredirect": "Trasladar páginas sin dejar redirección", "right-upload": "Subir archivos", "right-reupload": "Subir una nueva versión de un archivo existente", - "right-reupload-own": "Subir una nueva versión de un archivo creado por uno mismo", + "right-reupload-own": "Subir una nueva versión de un archivo propio", "right-reupload-shared": "Sobrescribir localmente archivos presentes en el repositorio multimedia compartido", "right-upload_by_url": "Subir un archivo a traves de un URL", "right-purge": "Purgar la caché en el servidor sin tener que dar confirmación", @@ -1315,10 +1315,10 @@ "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios", "right-editmyusercss": "Editar tus archivos CSS", "right-editmyuserjs": "Editar tus archivos JavaScript", - "right-viewmywatchlist": "Ver tu lista de seguimiento", - "right-editmywatchlist": "Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aun sin este permiso.", - "right-viewmyprivateinfo": "Ver tu información privada (ej. correo electrónico, nombre real)", - "right-editmyprivateinfo": "Editar tu información privada (ej: correo electrónico, nombre real)", + "right-viewmywatchlist": "Ver su propia lista de seguimiento", + "right-editmywatchlist": "Editar su propia lista de seguimiento (algunas acciones seguirán añadiendo páginas aun sin este permiso).", + "right-viewmyprivateinfo": "Ver su propia información privada (ej.: correo electrónico, nombre real)", + "right-editmyprivateinfo": "Editar su propia información privada (ej.: correo electrónico, nombre real)", "right-editmyoptions": "Editar tus preferencias", "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular", "right-markbotedits": "Marcar ediciones revertidas como ediciones de bot", @@ -2099,7 +2099,7 @@ "listgrouprights-addgroup-all": "Agregar todos los grupos", "listgrouprights-removegroup-all": "Eliminar todos los grupos", "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a tu propia cuenta: $1", - "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de tu propia cuenta: $1", + "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de su propia cuenta: $1", "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta", "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta", "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombres", @@ -2349,9 +2349,6 @@ "undeleteviewlink": "ver", "undeleteinvert": "Invertir selección", "undeletecomment": "Razón:", - "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados", - "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}", "cannotundelete": "Hubo un error en la totalidad o en parte del proceso de la restauración:\n$1", "undeletedpage": "Se ha restaurado $1\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.", "undelete-header": "En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.", diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json index 91a1790b15..5531d0c373 100644 --- a/languages/i18n/fa.json +++ b/languages/i18n/fa.json @@ -2261,9 +2261,6 @@ "undeleteviewlink": "نمایش", "undeleteinvert": "وارونه کردن انتخاب", "undeletecomment": "دلیل:", - "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}", - "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.", - "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.", "cannotundelete": "تمام یا بخشی از احیا ناموفق بود:\n$1", "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.", "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.", diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json index 5d3ca4f1e7..1f7cde014d 100644 --- a/languages/i18n/fi.json +++ b/languages/i18n/fi.json @@ -2215,9 +2215,6 @@ "undeleteviewlink": "näytä", "undeleteinvert": "Käänteinen valinta", "undeletecomment": "Syy:", - "undeletedrevisions": "{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin", - "undeletedrevisions-files": "{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin", - "undeletedfiles": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin", "cannotundelete": "Palauttaminen epäonnistui osittain tai kokonaan:\n$1", "undeletedpage": "'''$1 on palautettu.'''\n\n[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.", "undelete-header": "[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.", @@ -2778,6 +2775,7 @@ "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.", "newimages-legend": "Suodatin", "newimages-label": "Tiedostonimi (tai osa siitä)", + "newimages-user": "IP-osoite tai käyttäjänimi:", "newimages-showbots": "Näytä bottien tekemät tallennukset", "newimages-hidepatrolled": "Piilota tarkastetut tiedostotallennukset", "noimages": "Ei uusia tiedostoja.", diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json index 1f2a03406b..b240d346ea 100644 --- a/languages/i18n/fr.json +++ b/languages/i18n/fr.json @@ -1238,7 +1238,7 @@ "userrights-groupsmember": "Membre de :", "userrights-groupsmember-auto": "Membre implicite de :", "userrights-groupsmember-type": "$1", - "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d'expiration du groupe et non pas le raccourcir.", + "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que {{GENDER:$1|l’utilisateur|l’utilisatrice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d’expiration de l’appartenance au groupe et non pas le raccourcir.", "userrights-reason": "Motif :", "userrights-no-interwiki": "Vous n'avez pas la permission de modifier les droits utilisateur sur d'autres wikis.", "userrights-nodatabase": "La base de données « $1 » n'existe pas ou n'est pas locale.", @@ -1253,7 +1253,7 @@ "userrights-expiry-options": "1 jour:1 day,1 semaine:1 week,1 mois:1 month,3 mois:3 montghs,6 mois:6 month,1 an:1 year", "userrights-invalid-expiry": "La date d'expiration pour le groupe « $1 » n'est pas valide.", "userrights-expiry-in-past": "La date d'expiration pour le groupe « $1 » est dépassée.", - "userrights-cannot-shorten-expiry": "Vous ne pouvez pas raccourcir la durée d'expiration du groupe « $1 ». Seuls les utilisateurs disposant de l'autorisation d'ajouter et de supprimer ce groupe peuvent raccourcir les durées d'expiration.", + "userrights-cannot-shorten-expiry": "Vous ne pouvez pas raccourcir la durée d’expiration de l’appartenance au groupe « $1 ». Seuls les utilisateurs disposant de l’autorisation d’ajouter et de supprimer ce groupe peuvent raccourcir les durées d’expiration.", "userrights-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.", "group": "Groupe :", "group-user": "Utilisateurs", @@ -1518,6 +1518,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Certains types de modification ne peuvent pas être qualifiés de « mineurs », donc ce filtre est en conflit avec les filtres de Type de modification suivants : $1", "rcfilters-typeofchange-conflicts-hideminor": "Ce filtre de Type de modification est en conflit avec le filtre « Modifications mineures ». Certains type sde modification ne peuvent pas être indiqués comme « mineurs ».", "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le $3, $4 (affichées jusqu’à $1).", + "rclistfromreset": "Réinitialiser la sélection de la date", "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2", "rcshowhideminor": "$1 les modifications mineures", "rcshowhideminor-show": "Afficher", @@ -1640,6 +1641,7 @@ "php-uploaddisabledtext": "L'import de fichiers est désactivé en PHP. Vérifiez l'option de configuration file_uploads.", "uploadscripted": "Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.", "upload-scripted-pi-callback": "Impossible de charger un fichier qui contient des instructions de traitement de feuille de style XML.", + "upload-scripted-dtd": "Impossible de télécharger des fichiers SVG qui contiennent une déclaration de DTD non standard.", "uploaded-script-svg": "Élément scriptable « $1 » trouvé dans le fichier SVG téléchargé.", "uploaded-hostile-svg": "CSS non sûr trouvé dans l’élément style d’un fichier SVG téléversé.", "uploaded-event-handler-on-svg": "Fixer des attributs de gestionnaire d’événement $1=\"$2\" n’est pas autorisé dans les fichiers SVG.", @@ -2374,9 +2376,6 @@ "undeleteviewlink": "voir", "undeleteinvert": "Inverser la sélection", "undeletecomment": "Motif :", - "undeletedrevisions": "$1 {{PLURAL:$1|version restaurée|versions restaurées}}", - "undeletedrevisions-files": "$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}", - "undeletedfiles": "$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}", "cannotundelete": "Certaines ou toutes les restaurations ont échoué :\n$1", "undeletedpage": "La page $1 a été restaurée.\n\nConsultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.", "undelete-header": "Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.", @@ -3732,7 +3731,10 @@ "htmlform-user-not-valid": "$1 n’est pas un nom d’utilisateur valide.", "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3", "logentry-delete-delete_redir": "$1 a {{GENDER:$2|supprimé}} la redirection vers $3 par écrasement", - "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3", + "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|a restauré}} la page $3", + "restore-count-revisions": "{{PLURAL:$1|1 révision|$1 révisions}}", + "restore-count-files": "{{PLURAL:$1|1 fichier|$1 fichiers}}", "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3", @@ -3939,6 +3941,7 @@ "special-characters-group-thai": "thaï", "special-characters-group-lao": "laotien", "special-characters-group-khmer": "khmer", + "special-characters-group-canadianaboriginal": "Aborigène canadien", "special-characters-title-endash": "tiret demi-cadratin", "special-characters-title-emdash": "tiret cadratin", "special-characters-title-minus": "signe moins", @@ -4085,5 +4088,10 @@ "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser
    0.0.0.0/0\n::/0
    ", "revid": "version $1", "pageid": "ID de page $1", - "rawhtml-notallowed": "Les balises <html> ne peuvent pas être utilisées en dehors des pages normales." + "rawhtml-notallowed": "Les balises <html> ne peuvent pas être utilisées en dehors des pages normales.", + "gotointerwiki": "Quitter {{SITENAME}}", + "gotointerwiki-invalid": "Le titre spécifié n’est pas valide.", + "gotointerwiki-external": "Vous allez quitter {{SITENAME}} pour visiter [[$2]], qui est un site web distinct.\n\n[$1 Cliquer ici pour continuer vers $1].", + "undelete-cantedit": "Vous ne pouvez pas annuler la suppression de cette page car vous n’êtes pas autorisé à la modifier.", + "undelete-cantcreate": "Vous ne pouvez pas annuler la suppression de cette page car il n’existe pas de page avec ce nom, et vous n’êtes pas autorisé à la créer." } diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json index e79e83943d..7894932157 100644 --- a/languages/i18n/gl.json +++ b/languages/i18n/gl.json @@ -1097,7 +1097,7 @@ "saveusergroups": "Gardar os grupos {{GENDER:$1|do usuario|da usuaria}}", "userrights-groupsmember": "Membro de:", "userrights-groupsmember-auto": "Membro implícito de:", - "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade deste grupo; non se pode adiantar.", + "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade de pertenza a este grupo; non se pode adiantar.", "userrights-reason": "Motivo:", "userrights-no-interwiki": "Non ten os permisos necesarios para editar os dereitos de usuario noutros wikis.", "userrights-nodatabase": "A base de datos \"$1\" non existe ou non é local.", @@ -1111,7 +1111,7 @@ "userrights-expiry-options": "1 día:1 día,1 semana:1 semana,1 mes:1 mes,3 meses:3 meses,6 meses:6 meses,1 ano:1 ano", "userrights-invalid-expiry": "O tempo de caducidade para o grupo \"$1\" non é válido.", "userrights-expiry-in-past": "O tempo de caducidade para o grupo \"$1\" está no pasado.", - "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade do grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.", + "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade de pertenza ó grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.", "userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.", "group": "Grupo:", "group-user": "Usuarios", @@ -1372,6 +1372,7 @@ "rcfilters-filter-logactions-label": "Accións rexistradas", "rcfilters-filter-logactions-description": "Accións administrativas, creacións de conta, borrados de páxinas, subas de ficheiros....", "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o $3 ás $4 (móstranse $1 como máximo).", + "rclistfromreset": "Reinicializar a selección da data", "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2", "rcshowhideminor": "$1 as edicións pequenas", "rcshowhideminor-show": "Mostrar", @@ -2224,9 +2225,6 @@ "undeleteviewlink": "ver", "undeleteinvert": "Inverter a selección", "undeletecomment": "Motivo:", - "undeletedrevisions": "{{PLURAL:$1|Restaurouse $1 revisión|Restauráronse $1 revisións}}", - "undeletedrevisions-files": "Restauráronse $1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro|ficheiros}}", - "undeletedfiles": "{{PLURAL:$1|Restaurouse $1 ficheiro|Restauráronse $1 ficheiros}}", "cannotundelete": "Algunhas ou todas as restauracións fallaronː\n$1", "undeletedpage": "'''A páxina \"$1\" foi restaurada'''\n\nComprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.", "undelete-header": "Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.", @@ -3695,6 +3693,7 @@ "special-characters-group-thai": "Tailandés", "special-characters-group-lao": "Laosiano", "special-characters-group-khmer": "Camboxano", + "special-characters-group-canadianaboriginal": "Aborixe canadense", "special-characters-title-endash": "guión", "special-characters-title-emdash": "raia", "special-characters-title-minus": "signo menos", @@ -3840,5 +3839,8 @@ "restrictionsfield-label": "Rangos de IP permitidos:", "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n
    0.0.0.0/0\n::/0
    ", "revid": "revisión $1", - "pageid": "identificador de páxina $1" + "pageid": "identificador de páxina $1", + "rawhtml-notallowed": "As marcas <html> non poden usarse fóra das páxinas normais.", + "gotointerwiki": "Deixando {{SITENAME}}", + "gotointerwiki-invalid": "O título especificado non era válido." } diff --git a/languages/i18n/gsw.json b/languages/i18n/gsw.json index 0a398af3fa..e6d3e06433 100644 --- a/languages/i18n/gsw.json +++ b/languages/i18n/gsw.json @@ -46,7 +46,7 @@ "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige", "tog-previewonfirst": "Vorschou scho bim ersten Editieren azeige", "tog-enotifwatchlistpages": "Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due", - "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het g’änderet", + "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het gänderet", "tog-enotifminoredits": "Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke", "tog-enotifrevealaddr": "Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt", "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)", @@ -1030,7 +1030,7 @@ "prefs-tokenwatchlist": "Schlüssel für persönleche Webfeed", "prefs-diffs": "Versionsverglych", "prefs-help-prefershttps": "Die Ystellig würkt sech uus, we du di ds nächste Mal amäldisch.", - "prefswarning-warning": "Du hesch Ystellige g’änderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.", + "prefswarning-warning": "Du hesch Ystellige gänderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.", "prefs-tabs-navigation-hint": "Tipp: Mit der linggen u der rächte Pfyltaste chasch zwüsche de Tabs wächsle.", "userrights": "Benutzerrächtsverwaltig", "userrights-lookup-user": "Verwalt d Gruppezuegherigkeit", @@ -1808,7 +1808,7 @@ "notvisiblerev": "Version isch glescht wore", "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Syte wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).", "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.", - "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei g’änderet, sy fett dargstellt.", + "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy fett dargstellt.", "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste $1 Änderigen}} us {{PLURAL:$2|der letste Stund|de letste $2 Stunde}}. Stand: $3, $4 Uhr.", "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg", "watchlist-options": "Aazeigoptione", @@ -1876,13 +1876,13 @@ "changecontentmodel-title-label": "Sytetitel", "changecontentmodel-model-label": "Nöüs Inhaltsmodäll", "changecontentmodel-reason-label": "Grund:", - "changecontentmodel-success-title": "Ds Inhaltsmodäll het g’änderet", - "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het g’änderet.", + "changecontentmodel-success-title": "Ds Inhaltsmodäll het gänderet", + "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het gänderet.", "changecontentmodel-cannot-convert": "Der Inhalt vo [[:$1]] lat sech nid zum Typ $2 la konvertiere.", "changecontentmodel-nodirectediting": "Ds Inhaltsmodäll «$1» lat ds diräkte Bearbeite nid zue", "log-name-contentmodel": "Protokoll vo Inhaltsmodälländerige", "log-description-contentmodel": "Ereignis, wo mit em Inhaltsmodäll von ere Syte z tüe hei", - "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 g’änderet vo «$4» uf «$5»", + "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 gänderet vo «$4» uf «$5»", "logentry-contentmodel-change-revertlink": "zrüggsetze", "logentry-contentmodel-change-revert": "zrüggsetze", "protectlogpage": "Syteschutz-Logbuech", @@ -1959,9 +1959,6 @@ "undeleteviewlink": "aaluege", "undeleteinvert": "Uswahl umchehre", "undeletecomment": "Grund:", - "undeletedrevisions": "{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.", - "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore", - "undeletedfiles": "{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore", "cannotundelete": "D Widerhärstellig isch nit gange:\n\n$1", "undeletedpage": "'''„$1“''' isch widerhärgstellt wore.\n\nIm [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.", "undelete-header": "Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.", @@ -3176,7 +3173,7 @@ "logentry-block-unblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} entsperrt", "logentry-block-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6", "logentry-suppress-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6", - "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 g’änderet $6", + "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 gänderet $6", "logentry-import-upload": "{{GENDER:$2|Der $1|D $1|$1}} het $3 importiert per Datei-Ufelade", "logentry-import-interwiki": "{{GENDER:$2|Der $1|D $1|$1}} het $3 vomenen andere Wiki importiert", "logentry-merge-merge": "{{GENDER:$2|Der $1|D $1|$1}} het $3 i $4 zämegfüert (Versione bis $5)", @@ -3195,8 +3192,8 @@ "logentry-protect-unprotect": "{{GENDER:$2|Der $1|D $1|$1}} het der Schutz vor Syte $3 furtgnoh.", "logentry-protect-protect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4", "logentry-protect-protect-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4 [mit Kaskade]", - "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4", - "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 g’änderet $4 [mit Kaskade]", + "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4", + "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4 [mit Kaskade]", "logentry-rights-rights": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet", "logentry-rights-rights-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 gänderet", "logentry-rights-autopromote": "{{GENDER:$2|Der $1|D $1|$1}} isch automatisch vo $4 uf $5 beförderet worde", @@ -3296,8 +3293,8 @@ "log-name-pagelang": "Sprachänderigs-Logbuech", "log-description-pagelang": "Das isch es Logbuech für Änderige vo Sytesprache.", "logentry-pagelang-pagelang": "{{GENDER:$2|Der $1|D $1|$1}} het d Sytesprach vo $3 vo $4 uf $5 g’änderet.", - "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under $wgDefaultSkin als $1 – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d’se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis skins/ druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym git repository cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch ’bracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei LocalSettings.php kopiere:\n\n
    $3
    \n\n; Falls du grad d Datei LocalSettings.php hesch g’änderet:\n: Lueg genau nache, öb’s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.", - "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under $wgDefaultSkin als $1 – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand ’bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis skins/ druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym Git-Repository cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.", + "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under $wgDefaultSkin als $1 – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis skins/ druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym git Repositorium cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch bbracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei LocalSettings.php kopiere:\n\n
    $3
    \n\n; Falls du grad d Datei LocalSettings.php hesch gänderet:\n: Lueg genau nache, öb s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.", + "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under $wgDefaultSkin als $1 – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis skins/ druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym Git-Repositorium cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.", "default-skin-not-found-row-enabled": "* $1 / $2 (aktiviert)", "default-skin-not-found-row-disabled": "* $1 / $2 (deaktiviert)", "mediastatistics": "Statistike zu Dateitype", diff --git a/languages/i18n/he.json b/languages/i18n/he.json index 116863957b..7dff33cb51 100644 --- a/languages/i18n/he.json +++ b/languages/i18n/he.json @@ -1111,7 +1111,7 @@ "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}", "userrights-groupsmember": "{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:", "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:", - "userrights-groups-help": "באפשרותך לשנות את הקבוצות ש{{GENDER:$1|משתמש זה חבר|משתמשת זו חברה}} בהן:\n* תיבה מסומנת פירושה שה{{GENDER:$1|משתמש כבר חבר|משתמשת כבר חברה}} בקבוצה.\n* תיבה בלתי מסומנת פירושה שה{{GENDER:$1|משתמש אינו חבר|משתמשת אינה חברה}} בקבוצה.\n* סימון * פירושו שלא יהיה באפשרותך להסיר את ה{{GENDER:$1|משתמש|משתמשת}} מהקבוצה לאחר שהוספת {{GENDER:$1|אותו|אותה}} אליה, או להפך.\n* סימון # פירושו שבאפשרותך רק לאחר את זמן הפקיעה של קבוצה זו; אין באפשרותך להקדימו.", + "userrights-groups-help": "באפשרותך לשנות את הקבוצות ש{{GENDER:$1|משתמש זה חבר|משתמשת זו חברה}} בהן:\n* תיבה מסומנת פירושה שה{{GENDER:$1|משתמש כבר חבר|משתמשת כבר חברה}} בקבוצה.\n* תיבה בלתי מסומנת פירושה שה{{GENDER:$1|משתמש אינו חבר|משתמשת אינה חברה}} בקבוצה.\n* סימון * פירושו שלא יהיה באפשרותך להסיר את ה{{GENDER:$1|משתמש|משתמשת}} מהקבוצה לאחר שהוספת {{GENDER:$1|אותו|אותה}} אליה, או להפך.\n* סימון # פירושו שבאפשרותך רק לאחר את זמן הפקיעה של החברות בקבוצה זו; אין באפשרותך להקדימו.", "userrights-reason": "סיבה:", "userrights-no-interwiki": "אין לך הרשאה לערוך הרשאות משתמש באתרים אחרים.", "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.", @@ -1125,7 +1125,7 @@ "userrights-expiry-options": "יום:1 day,שבוע:1 week,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year", "userrights-invalid-expiry": "זמן הפקיעה לקבוצה \"$1\" אינו תקין.", "userrights-expiry-in-past": "זמן הפקיעה לקבוצה \"$1\" הוא בעבר.", - "userrights-cannot-shorten-expiry": "אין באפשרותך להקדים את זמן הפקיעה של הקבוצה \"$1\". רק משתמשים בעלי הרשאה להוסיף ולהסיר את הקבוצה יכולים להקדים את זמן הפקיעה.", + "userrights-cannot-shorten-expiry": "אין באפשרותך להקדים את זמן הפקיעה של החברות בקבוצה \"$1\". רק משתמשים בעלי הרשאה להוסיף ולהסיר את הקבוצה יכולים להקדים את זמן הפקיעה.", "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.", "group": "קבוצה:", "group-user": "משתמשים", @@ -1390,6 +1390,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "סוגים מסוימים של שינויים אינם יכולים להיות מסווגים כ\"משניים\", כך שמסנן זה מתנגש עם מסנן סוג השינויים הבא: $1", "rcfilters-typeofchange-conflicts-hideminor": "מסנן סוג השינויים הזה מתנגש עם מסנן \"עריכות משניות\". סוגים מסוימים של שינויים אינם יכולים מסווגים כ\"משניים\".", "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז $3, $4 (מוצגים עד $1).", + "rclistfromreset": "איפוס בחירת התאריך", "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3", "rcshowhideminor": "$1 עריכות משניות", "rcshowhideminor-show": "הצגת", @@ -1510,6 +1511,7 @@ "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.", "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על־ידי הדפדפן.", "upload-scripted-pi-callback": "לא ניתן להעלות קובץ שמכיל את הוראת העיבוד XML-stylesheet.", + "upload-scripted-dtd": "לא ניתן להעלות קבצי SVG שכוללים הכרזת DTD לא־סטנדרטית.", "uploaded-script-svg": "נמצא אלמנט שאפשר לכתוב בו תסריט \"$1\" בקובץ ה־SVG שהועלה.", "uploaded-hostile-svg": "נמצא CSS בלתי־מאובטח באלמנט style בקובץ ה־SVG שהועלה.", "uploaded-event-handler-on-svg": "אסור להגדיר מאפייני טיפול באירועים $1=\"$2\" בקובצי SVG.", @@ -2245,9 +2247,6 @@ "undeleteviewlink": "הצגה", "undeleteinvert": "הפיכת הבחירה", "undeletecomment": "סיבה:", - "undeletedrevisions": "{{PLURAL:$1|שוחזרה גרסה אחת|שוחזרו $1 גרסאות}}", - "undeletedrevisions-files": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו", - "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}", "cannotundelete": "השחזור (או חלק ממנו) נכשל:\n$1", "undeletedpage": "הדף $1 שוחזר\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.", "undelete-header": "{{GENDER:|ראה|ראי|ראו}} את [[Special:Log/delete|יומן המחיקות]] לרשימה של דפים שנמחקו לאחרונה.", @@ -3593,7 +3592,10 @@ "htmlform-user-not-valid": "$1 אינו שם משתמש תקין.", "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|מחק|מחקה}} את ההפניה $3 באמצעות דריסה", - "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3", + "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3", + "restore-count-revisions": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}", + "restore-count-files": "{{PLURAL:$1|קובץ אחד|$1 קבצים}}", "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3", @@ -3800,6 +3802,7 @@ "special-characters-group-thai": "תאית", "special-characters-group-lao": "לאו", "special-characters-group-khmer": "קמרית", + "special-characters-group-canadianaboriginal": "לשונות ילידיות קנדיות", "special-characters-title-endash": "קו מפריד", "special-characters-title-emdash": "קו מפריד ארוך", "special-characters-title-minus": "מינוס", @@ -3944,5 +3947,10 @@ "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:
    0.0.0.0/0\n::/0
    ", "revid": "גרסה $1", "pageid": "מזהה דף $1", - "rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים." + "rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים.", + "gotointerwiki": "עזיבת {{SITENAME}}", + "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.", + "gotointerwiki-external": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לעזוב את {{SITENAME}} כדי לבקר באתר הנפרד \"[[$2]]\".\n\n[$1 {{GENDER:|לחץ|לחצי|לחצו}} כאן כדי להמשיך לכתובת $1].", + "undelete-cantedit": "אין באפשרותך לשחזר דף זה, כי אין באפשרותך לערוך אותו.", + "undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו." } diff --git a/languages/i18n/hi.json b/languages/i18n/hi.json index 140645b3ad..a79376cb8c 100644 --- a/languages/i18n/hi.json +++ b/languages/i18n/hi.json @@ -2215,7 +2215,7 @@ "protect-summary-cascade": "सीढ़ी", "protect-expiring": "समाप्ती $1 (UTC)", "protect-expiring-local": "समाप्ती $1", - "protect-expiry-indefinite": "अनिश्चितकालीन", + "protect-expiry-indefinite": "हमेशा", "protect-cascade": "इस पृष्ठ से जुड़े हुए पृष्ठ सुरक्षित करें (सुरक्षा-सीढ़ी)", "protect-cantedit": "आप इस पृष्ठ का सुरक्षा-स्तर बदल नहीं सकते क्योंकि आपको ऐसा करने का अधिकार नहीं है।", "protect-othertime": "अन्य समय:", @@ -2258,9 +2258,6 @@ "undeleteviewlink": "देखें", "undeleteinvert": "चुनाव उलटें", "undeletecomment": "कारण:", - "undeletedrevisions": "{{PLURAL:$1|एक अवतरण पुनर्स्थापित किया|$1 अवतरण पुनर्स्थापित किये}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाइल|$2 फ़ाइलें}} पुनर्स्थापित कर दीं", - "undeletedfiles": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइलें}} पुनर्स्थापित", "cannotundelete": "पुनर्स्थापित नहीं कर सके:\n$1", "undeletedpage": "'''$1 को पुनर्स्थापित कर दिया गया है'''\n\nहाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।", "undelete-header": "हाल में हटाये गये पृष्ठ देखने के लिये [[Special:Log/delete|हटाने का लॉग]] देखें।", diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json index 85173c5c9f..20d15d556e 100644 --- a/languages/i18n/hr.json +++ b/languages/i18n/hr.json @@ -948,7 +948,7 @@ "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}", "prefs-watchlist-edits": "Broj uređivanja koji će se prikazati na proširenom popisu praćenja:", "prefs-watchlist-edits-max": "Maksimalni broj: 1000", - "prefs-watchlist-token": "Token popisa praćenja:", + "prefs-watchlist-token": "Tajni ključ popisa praćenja:", "prefs-misc": "Razno", "prefs-resetpass": "promijeni zaporku", "prefs-changeemail": "promijeni ili ukloni adresu e-pošte", @@ -1031,6 +1031,7 @@ "prefs-advancedwatchlist": "Napredne mogućnosti", "prefs-displayrc": "Mogućnosti prikaza", "prefs-displaywatchlist": "Mogućnosti prikaza", + "prefs-tokenwatchlist": "Tajni ključ", "prefs-diffs": "Razlike između inačica uređivanja", "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.", "prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.", @@ -1965,9 +1966,6 @@ "undeleteviewlink": "pregled", "undeleteinvert": "Obrni odabir", "undeletecomment": "Razlog:", - "undeletedrevisions": "{{PLURAL:$1|$1 inačica vraćena|$1 inačice vraćene|$1 inačica vraćeno}}", - "undeletedrevisions-files": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}", - "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}", "cannotundelete": "Vraćanje obrisane inačice nije uspjelo:\n$1", "undeletedpage": "'''$1 je vraćena'''\n\nPogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.", "undelete-header": "Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.", diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json index 78d16e33e0..6ccf0dda81 100644 --- a/languages/i18n/hu.json +++ b/languages/i18n/hu.json @@ -2230,9 +2230,6 @@ "undeleteviewlink": "megtekintés", "undeleteinvert": "Kijelölés megfordítása", "undeletecomment": "Ok:", - "undeletedrevisions": "$1 változat helyreállítva", - "undeletedrevisions-files": "{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva", - "undeletedfiles": "{{PLURAL:$1|egy|$1}} fájl visszaállítva", "cannotundelete": "Egy vagy több visszaállítás sikertelen:\n$1", "undeletedpage": "'''$1 helyreállítva'''\n\nLásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.", "undelete-header": "A legutoljára törölt lapokat lásd a [[Special:Log/delete|törlési naplóban]].", diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json index 28f44ed189..2fbb75646a 100644 --- a/languages/i18n/ia.json +++ b/languages/i18n/ia.json @@ -1089,7 +1089,7 @@ "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}", "userrights-groupsmember": "Membro de:", "userrights-groupsmember-auto": "Membro implicite de:", - "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente reducer le tempore de expiration del gruppo e non extender lo.", + "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente prolongar le pertinentia a iste gruppo e non accurtar lo.", "userrights-reason": "Motivo:", "userrights-no-interwiki": "Tu non ha le permission de modificar le derectos de usatores in altere wikis.", "userrights-nodatabase": "Le base de datos $1 non existe o non es local.", @@ -2219,9 +2219,6 @@ "undeleteviewlink": "vider", "undeleteinvert": "Inverter selection", "undeletecomment": "Motivo:", - "undeletedrevisions": "{{PLURAL:$1|1 version|$1 versiones}} restaurate", - "undeletedrevisions-files": "{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate", - "undeletedfiles": "$1 {{PLURAL:$1|file|files}} restaurate", "cannotundelete": "Le restauration ha partial- o totalmente fallite:\n$1", "undeletedpage": "'''$1 ha essite restaurate'''\n\nConsulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.", "undelete-header": "Vide [[Special:Log/delete|le registro de deletiones]] pro un lista de paginas recentemente delite.", diff --git a/languages/i18n/id.json b/languages/i18n/id.json index 2395d94345..9de536f95e 100644 --- a/languages/i18n/id.json +++ b/languages/i18n/id.json @@ -2235,9 +2235,6 @@ "undeleteviewlink": "lihat", "undeleteinvert": "Balikkan pilihan", "undeletecomment": "Alasan:", - "undeletedrevisions": "$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan", - "undeletedrevisions-files": "$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan", - "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dikembalikan", "cannotundelete": "Beberapa pembatalan penghapusan gagal:\n$1", "undeletedpage": "'''$1 berhasil dikembalikan'''\n\nLihat [[Special:Log/delete|log penghapusan]] untuk data penghapusan dan pengembalian.", "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk daftar halaman yang baru dihapus.", diff --git a/languages/i18n/is.json b/languages/i18n/is.json index d2487dd438..652f82eeaf 100644 --- a/languages/i18n/is.json +++ b/languages/i18n/is.json @@ -1972,9 +1972,6 @@ "undeleteviewlink": "skoða", "undeleteinvert": "Snúa vali við", "undeletecomment": "Ástæða:", - "undeletedrevisions": "$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}", - "undeletedrevisions-files": "$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar", - "undeletedfiles": "$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}", "cannotundelete": "Afturköllun eyðingar mistókst að hluta eða í heild: \n$1", "undeletedpage": "'''$1 var endurvakin'''\n\nSkoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.", "undelete-header": "Sjá [[Special:Log/delete|eyðingarskrá]] fyrir síður sem nýlega hefur verið eytt.", diff --git a/languages/i18n/it.json b/languages/i18n/it.json index 560074326f..e633fa9d40 100644 --- a/languages/i18n/it.json +++ b/languages/i18n/it.json @@ -105,7 +105,8 @@ "Tosky", "Selven", "Margherita.mignanelli", - "Redredsonia" + "Redredsonia", + "Luigi.delia" ] }, "tog-underline": "Sottolinea i collegamenti:", @@ -1178,7 +1179,7 @@ "saveusergroups": "Salva gruppi {{GENDER:$1|utente}}", "userrights-groupsmember": "Appartiene {{PLURAL:$1|al gruppo|ai gruppi}}:", "userrights-groupsmember-auto": "Membro implicito di:", - "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo.\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa).\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di questo gruppo; non è possibile portare avanti.", + "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa)\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di appartenenza a questo gruppo; non è possibile portarla avanti", "userrights-reason": "Motivo:", "userrights-no-interwiki": "Non si dispone dei permessi necessari per modificare i diritti degli utenti su altri siti.", "userrights-nodatabase": "Il database $1 non esiste o non è un database locale.", @@ -1192,7 +1193,7 @@ "userrights-expiry-options": "1 giorno:1 day,1 settimana:1 week,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year", "userrights-invalid-expiry": "La scadenza per il gruppo \"$1\" non è valida", "userrights-expiry-in-past": "La scadenza per il gruppo \"$1\" è già passata.", - "userrights-cannot-shorten-expiry": "Non puoi anticipare la scadenza del gruppo \"$1\". Soltanto gli utenti con il permesso di aggiungere e rimuovere questo gruppo possono anticiparne la scadenza.", + "userrights-cannot-shorten-expiry": "Non puoi anticipare la scadenza dell'appartenenza al gruppo \"$1\". Soltanto gli utenti con il permesso di aggiungere e rimuovere questo gruppo possono anticiparne la scadenza.", "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.", "group": "Gruppo:", "group-user": "Utenti", @@ -2271,9 +2272,6 @@ "undeleteviewlink": "visualizza", "undeleteinvert": "Inverti selezione", "undeletecomment": "Motivo:", - "undeletedrevisions": "{{PLURAL:$1|Una versione recuperata|$1 versioni recuperate}}", - "undeletedrevisions-files": "{{PLURAL:$1|Una versione|$1 versioni}} e $2 file recuperati", - "undeletedfiles": "{{PLURAL:$1|Un file recuperato|$1 file recuperati}}", "cannotundelete": "Alcuni o tutti i ripristini non riusciti:\n$1", "undeletedpage": "'''La pagina $1 è stata recuperata'''\n\nConsulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.", "undelete-header": "Consulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni più recenti.", @@ -3547,6 +3545,7 @@ "htmlform-user-not-valid": "$1 non è un nome utente valido.", "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3", "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina \"$3\"", + "restore-count-revisions": "{{PLURAL:$1|1 versione|$1 versioni}}", "logentry-delete-event": "$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di \"$3\": $4", "logentry-delete-revision": "$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3", diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json index bfa4829c50..1e8ee00fcb 100644 --- a/languages/i18n/ja.json +++ b/languages/i18n/ja.json @@ -1957,6 +1957,8 @@ "activeusers-intro": "これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。", "activeusers-count": "過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}", "activeusers-from": "最初に表示する利用者:", + "activeusers-groups": "選択した利用者グループに属する利用者を表示:", + "activeusers-excludegroups": "選択した利用者グループに属する利用者を非表示:", "activeusers-noresult": "利用者が見つかりませんでした。", "activeusers-submit": "活動中の利用者を表示", "listgrouprights": "利用者グループの権限", @@ -2223,9 +2225,6 @@ "undeleteviewlink": "閲覧", "undeleteinvert": "選択を反転", "undeletecomment": "理由:", - "undeletedrevisions": "{{PLURAL:$1|$1版}}を復元しました", - "undeletedrevisions-files": "{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました", - "undeletedfiles": "{{PLURAL:$1|$1ファイル}}を復元しました", "cannotundelete": "復元に一部またはすべて失敗しました:\n$1", "undeletedpage": "$1 を復元しました。\n\n最近の削除と復元は[[Special:Log/delete|削除記録]]で参照できます。", "undelete-header": "最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。", diff --git a/languages/i18n/jv.json b/languages/i18n/jv.json index e1472af557..be388484e9 100644 --- a/languages/i18n/jv.json +++ b/languages/i18n/jv.json @@ -595,7 +595,7 @@ "accmailtitle": "Tembung sandi wis kinirim", "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca [[Special:ChangePassword|salin tembung sandi]] sawisé mlebu log.", "newarticle": "(Anyar)", - "newarticletext": "Katonané panjenengan ngetutaké pranala artikel sing durung ana.\nManawa kersa manulis artikel iki, manggaa. (Mangga mirsani [$1 Pitulung] kanggo informasi sabanjuré).\nYèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjlajah wèb panjenengan.", + "newarticletext": "Panjenengan ngetuti pranala sing durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul balik ana ing pangluruné panjenengan.", "anontalkpagetext": "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:CreateAccount|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''", "noarticletext": "Kala saiki kaca iki durung ana tulisané.\nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] sajeroning kaca liya,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log sing magepokan],\nutawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki].", "noarticletext-nopermission": "Saiki ora ana tèks ing kaca iki. \nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki judhul kaca iki]] nèng kaca liya, \nutawa [{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan], nanging Sampéyan ora nduwèni idin nggawé kaca iki.", @@ -1845,9 +1845,6 @@ "undeleteviewlink": "pirsani", "undeleteinvert": "Walik pilihan", "undeletecomment": "Alesan:", - "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} wis dibalèkaké", - "undeletedrevisions-files": "$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké", - "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké", "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1", "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.", "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.", diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json index 3f7fd96bde..97b3e87251 100644 --- a/languages/i18n/ka.json +++ b/languages/i18n/ka.json @@ -644,7 +644,7 @@ "savearticle": "გვერდის შენახვა", "savechanges": "ცვლილებების შენახვა", "publishpage": "გვერდის გამოქვეყნება", - "publishchanges": "ცვლილებების გამოქვეყნება", + "publishchanges": "ცვლილებების შენახვა", "preview": "წინასწარი გადახედვა", "showpreview": "წინასწარი გადახედვის ჩვენება", "showdiff": "ცვლილებების ჩვენება", @@ -2134,9 +2134,6 @@ "undeleteviewlink": "იხილე", "undeleteinvert": "გააუქმეთ გამოყოფა", "undeletecomment": "მიზეზი:", - "undeletedrevisions": "$1 ვერსია აღდგენილია", - "undeletedrevisions-files": "$1 ვერსია და $2 ფაილი აღდგენილია", - "undeletedfiles": "$1 ფაილი აღდგენილია", "cannotundelete": "ზოგიერთი ან ყველა წაშლის გაუქმება ვერ განხორციელდა:\n$1", "undeletedpage": "'''$1 აღდგენილია'''\n\nუკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].", "undelete-header": "ბოლოს წაშლილი გვერდების სიის ნახვა შეიძლება [[Special:Log/delete|წაშლათა ჟურნალში]].", diff --git a/languages/i18n/km.json b/languages/i18n/km.json index 7cfa046859..96e839656a 100644 --- a/languages/i18n/km.json +++ b/languages/i18n/km.json @@ -1709,9 +1709,6 @@ "undeleteviewlink": "មើល", "undeleteinvert": "ក្រៅពីនោះ", "undeletecomment": "មូលហេតុ៖", - "undeletedrevisions": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}", - "undeletedrevisions-files": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}និង{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}", - "undeletedfiles": "{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ត្រូវបានស្ដារឡើងវិញ", "cannotundelete": "ឈប់លុបមិនសម្រេច៖​$1", "undeletedpage": "'''$1 ត្រូវបានស្តារឡើងវិញហើយ'''\n\nសូម​ចូល​ទៅ [[Special:Log/delete|កំណត់ហេតុ​នៃ​ការលុប]] ដើម្បី​ពិនិត្យ​មើល​កំណត់ត្រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។", "undelete-header": "មើលទំព័រដែលត្រូវបានលុបចោលថ្មីៗក្នុង[[Special:Log/delete|កំណត់ហេតុនៃការលុបចោល]]។", diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json index b62a93dbcc..1ddb003105 100644 --- a/languages/i18n/ko.json +++ b/languages/i18n/ko.json @@ -1409,6 +1409,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없으므로 이 필터는 다음 유형의 변경사항 필터와 충돌합니다: $1", "rcfilters-typeofchange-conflicts-hideminor": "이 유형의 변경사항 필터는 \"사소한 편집\" 필터와 충돌합니다. 특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없습니다.", "rcnotefrom": "아래는 $3, $4부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 $1개가 표시됨)", + "rclistfromreset": "날짜 선택 초기화", "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기", "rcshowhideminor": "사소한 편집 $1", "rcshowhideminor-show": "보이기", @@ -1529,6 +1530,7 @@ "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.", "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.", "upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.", + "upload-scripted-dtd": "비표준 DTD 선언이 포함된 SVG 파일을 업로드할 수 없습니다.", "uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.", "uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.", "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 $1=\"$2\" 설정은 SVG 파일에서 사용할 수 없습니다.", @@ -2264,9 +2266,6 @@ "undeleteviewlink": "보기", "undeleteinvert": "선택 반전", "undeletecomment": "이유:", - "undeletedrevisions": "{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다", - "undeletedrevisions-files": "{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다", - "undeletedfiles": "{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다", "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1", "undeletedpage": "$1 문서를 되살렸습니다.\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 되살리기 기록을 볼 수 있습니다.", "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.", @@ -3892,5 +3891,10 @@ "restrictionsfield-label": "허용된 IP 대역:", "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:
    0.0.0.0/0\n::/0
    ", "revid": "$1 판", - "pageid": "페이지 ID $1" + "pageid": "페이지 ID $1", + "gotointerwiki": "{{SITENAME}}을(를) 떠납니다", + "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.", + "gotointerwiki-external": "별개의 웹사이트인 [[$2]]의 방문을 위해 {{SITENAME}}을(를) 떠나려고 합니다.\n\n[$1 $1(으)로 계속 진행하려면 여기를 클릭하십시오].", + "undelete-cantedit": "이 문서를 편집할 권한이 없으므로 이 문서를 복구할 수 없습니다.", + "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다." } diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json index 3720b09d72..cbeb00ea44 100644 --- a/languages/i18n/lb.json +++ b/languages/i18n/lb.json @@ -1067,7 +1067,7 @@ "saveusergroups": "{{GENDER:$1|Benotzer}}gruppe späicheren", "userrights-groupsmember": "Member vun:", "userrights-groupsmember-auto": "Implizit Member vun:", - "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.", + "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit als Member vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.", "userrights-reason": "Grond:", "userrights-no-interwiki": "Dir hutt net déi néideg Rechter, fir d'Rechter vu Benoutzer op anere Wikien z'änneren.", "userrights-nodatabase": "D'Datebank $1 gëtt et net oder se ass net lokal.", @@ -2108,9 +2108,6 @@ "undeleteviewlink": "weisen", "undeleteinvert": "Auswiel ëmdréinen", "undeletecomment": "Grond:", - "undeletedrevisions": "$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert", - "undeletedrevisions-files": "{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert", - "undeletedfiles": "$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert", "cannotundelete": "E puer oder all d'Restauratiounen hunn net funktionéiert:\n$1", "undeletedpage": "'''$1''' gouf restauréiert.\n\nAm [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.", "undelete-header": "Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.", @@ -3314,7 +3311,10 @@ "htmlform-user-not-valid": "$1 ass kee valabele Benotzernumm.", "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht", "logentry-delete-delete_redir": "$1 huet d'Viruleedung $3 duerch Iwwerschreiwe {{GENDER:$2|geläscht}}.", - "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert", + "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 ($4) restauréiert", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert", + "restore-count-revisions": "{{PLURAL:$1|1 Versioun|$1 Versiounen}}", + "restore-count-files": "{{PLURAL: $1|1 Fichier|$1 Fichieren}}", "logentry-delete-event": "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}", "logentry-delete-revision": "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}", "logentry-delete-event-legacy": "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}", @@ -3478,6 +3478,7 @@ "special-characters-group-thai": "Thai", "special-characters-group-lao": "Lao", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Kanadesch Silbeschrëft", "special-characters-title-endash": "en dash", "special-characters-title-emdash": "em dash", "special-characters-title-minus": "Minus-Zeechen", @@ -3581,5 +3582,8 @@ "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.", "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1", "restrictionsfield-label": "Zougeloossen IP-Beräicher:", - "revid": "Versioun $1" + "revid": "Versioun $1", + "gotointerwiki": "{{SITENAME}} verloossen", + "gotointerwiki-invalid": "De spezifizéierten Titel war net valabel.", + "undelete-cantcreate": "Dir kënnt dës Säit net restauréieren well et elo keng Säit mat deem Numm gëtt a well Dir dës Säit net uleeën däerft." } diff --git a/languages/i18n/lt.json b/languages/i18n/lt.json index d8b344d5a7..08bff71f58 100644 --- a/languages/i18n/lt.json +++ b/languages/i18n/lt.json @@ -2173,9 +2173,6 @@ "undeleteviewlink": "žiūrėti", "undeleteinvert": "Žymėti priešingai", "undeletecomment": "Priežastis:", - "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}", - "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}", - "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}", "cannotundelete": "Visi arba kai kurie atkūrimai nepavyko:\n$1", "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.", "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].", @@ -2719,6 +2716,7 @@ "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.", "newimages-legend": "Filtras", "newimages-label": "Failo vardas (ar jo dalis):", + "newimages-user": "IP adresas ar vartotojo vardas", "newimages-showbots": "Rodyti robotų atliktus įkėlimus", "newimages-hidepatrolled": "Paslėpti patruliuotus įkeltus failus", "noimages": "Nėra ką parodyti.", @@ -3406,7 +3404,9 @@ "htmlform-user-not-valid": "$1 nėra tinkamas naudotojo vardas.", "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3", "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|ištrynė}} buvusį nukreipimą $3", - "logentry-delete-restore": "$1 {{GENDER:$2|atkūrė}} puslapį $3", + "logentry-delete-restore": "$1 atkūrė puslapį $3 ($4)", + "logentry-delete-restore-nocount": "$1 atkūrė puslapį $3", + "restore-count-files": "{{PLURAL:$1|1 failas|$1 failai}}", "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|pakeitė}} matomumą žurnalo renginiams $3", @@ -3707,5 +3707,8 @@ "unlinkaccounts": "Atsieti paskyras", "unlinkaccounts-success": "Paskyra buvo atsieta.", "revid": "apžvalga $1", - "pageid": "puslapio ID $1" + "pageid": "puslapio ID $1", + "rawhtml-notallowed": "<html> negali būti naudojamos ne normaliuose puslapiuose.", + "gotointerwiki": "Išeinama iš {{SITENAME}}", + "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas." } diff --git a/languages/i18n/mg.json b/languages/i18n/mg.json index 35762e54c4..31b5304c0e 100644 --- a/languages/i18n/mg.json +++ b/languages/i18n/mg.json @@ -2059,8 +2059,6 @@ "undeleteviewlink": "hijery", "undeleteinvert": "Hampifamaidika ny safidy", "undeletecomment": "Antony :", - "undeletedrevisions": "voaverina ny {{PLURAL:$1|fanovana|fanovana}} $1", - "undeletedfiles": "rakitra voaverina $1 {{PLURAL:$1}}", "cannotundelete": "Tsy nandeha soa aman-tsara ilay famerenana ;\nefa nisy mpikambana iray hafa angamba no namerina ilay pejy.", "undeletedpage": "'''Voaverina ny pejy $1.'''\n\nVakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy ny famerenana pejy.", "undelete-header": "Jereo ny [[Special:Log/delete|laogim-pamafana]] rehefa hanalisitra ny pejy vao voafafa.", @@ -3173,7 +3171,7 @@ "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.", "feedback-thanks-title": "Misaotra indrindra!", "feedback-useragent": "User agent:", - "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}", + "searchsuggest-search": "Hikaroka eto amin'i {{SITENAME}}", "searchsuggest-containing": "misy...", "api-error-badtoken": "Hadisoana anaty : \"token\" diso.", "api-error-emptypage": "Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.", diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json index 854d077f50..f8ff3fcbbe 100644 --- a/languages/i18n/mk.json +++ b/languages/i18n/mk.json @@ -1099,7 +1099,7 @@ "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи", "userrights-groupsmember": "Член на:", "userrights-groupsmember-auto": "Подразбран член на:", - "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на групава, но не можете да го поместите нанапред.", + "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на членството во групава, но не можете да го поместите нанапред.", "userrights-reason": "Причина:", "userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.", "userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.", @@ -1114,7 +1114,7 @@ "userrights-expiry-options": "1 ден:1 day,1 недела:1 week,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year", "userrights-invalid-expiry": "Истекот за групата „$1“ е неважечки.", "userrights-expiry-in-past": "Истекот за групата „$1“ е во минатото.", - "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.", + "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на членството во групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.", "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.", "group": "Група:", "group-user": "Корисници", @@ -2235,9 +2235,6 @@ "undeleteviewlink": "преглед", "undeleteinvert": "Обратен избор", "undeletecomment": "Причина:", - "undeletedrevisions": "{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени", - "undeletedfiles": "{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}", "cannotundelete": "Враќањето не успеа делумно или целосно:\n$1", "undeletedpage": "'''$1 беше обновена'''\n\nПогледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.", "undelete-header": "Списокот на неодамна избришани страници ќе го најдете на [[Special:Log/delete|дневникот на бришења]].", @@ -3847,6 +3844,7 @@ "special-characters-group-thai": "Тајландски", "special-characters-group-lao": "Лаошки", "special-characters-group-khmer": "Кмерски", + "special-characters-group-canadianaboriginal": "канадски домородни", "special-characters-title-endash": "цртичка", "special-characters-title-emdash": "тире", "special-characters-title-minus": "минус", diff --git a/languages/i18n/ms.json b/languages/i18n/ms.json index 865fa33204..f386599073 100644 --- a/languages/i18n/ms.json +++ b/languages/i18n/ms.json @@ -433,19 +433,12 @@ "login": "Log masuk", "login-security": "Mengesahkan identiti anda", "nav-login-createaccount": "Log masuk / buka akaun", - "userlogin": "Log masuk / buka akaun", - "userloginnocreate": "Log masuk", "logout": "Log keluar", "userlogout": "Log keluar", "notloggedin": "Belum log masuk", "userlogin-noaccount": "Tidak mempunyai akaun?", "userlogin-joinproject": "Sertai {{SITENAME}}", - "nologin": "Belum mempunyai akaun? '''$1'''.", - "nologinlink": "Buka akaun baru", "createaccount": "Buka akaun", - "gotaccount": "Sudah mempunyai akaun? '''$1'''.", - "gotaccountlink": "Log masuk", - "userlogin-resetlink": "Lupa nama pengguna/kata laluan anda?", "userlogin-resetpassword-link": "Lupa kata laluan anda?", "userlogin-helplink2": "Bantuan untuk log masuk", "userlogin-loggedin": "Anda sudah log masuk sebagai {{GENDER:$1|$1}}. Gunakan borang di bawah untuk log masuk sebagai pengguna lain.", @@ -458,7 +451,6 @@ "createaccountmail": "Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan", "createaccountmail-help": "Boleh digunakan untuk membuat akaun untuk orang lain tanpa mengetahui kata laluan.", "createacct-realname": "Nama sebenar (pilihan)", - "createaccountreason": "Sebab:", "createacct-reason": "Sebab", "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun", "createacct-reason-help": "Mesej yang ditunjukkan dalam log penciptaan akaun", @@ -555,6 +547,21 @@ "botpasswords-label-delete": "Hapuskan", "botpasswords-label-resetpassword": "Set semula kata laluan", "botpasswords-label-grants": "Pemberian berkenaan:", + "botpasswords-help-grants": "Membenarkan pemberian akses kepada hak-hak yang telah dipegang oleh akaun pengguna anda. Membolehkan pemberian di sini tidak menyediakan akses kepada mana-mana hak yang akaun pengguna anda tidak sepatutnya ada. Lihat [[Special:ListGrants|jadual pemberian]] untuk maklumat lanjut.", + "botpasswords-label-grants-column": "Diberikan", + "botpasswords-bad-appid": "Nama bot \"$1\" adalah tidak sah.", + "botpasswords-insert-failed": "Gagal untuk menambah nama bot \"$1\". Adakah ia telah digunakan?", + "botpasswords-update-failed": "Gagal untuk mengemas kini nama bot \"$1\". Adakah ia telah dipadam?", + "botpasswords-created-title": "Kata laluan bot telah dicipta", + "botpasswords-created-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dicipta.", + "botpasswords-updated-title": "Kata laluan bot telah dikemaskinikan", + "botpasswords-updated-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dikemaskini.", + "botpasswords-deleted-title": "Kata laluan bot telah dipadam", + "botpasswords-deleted-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dipadam.", + "botpasswords-newpassword": "Kata laluan baru untuk log masuk dengan $1 adalah $2. Sila catatkan ini untuk rujukan masa depan.
    (Untuk bots lama yang memerlukan nama log masuk untuk menjadi sama dengan nama pengguna akhirnya, anda juga boleh menggunakan $3 sebagai nama pengguna dan $4 sebagai kata laluan.)", + "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.", + "botpasswords-restriction-failed": "Bot sekatan kata laluan menghalang log masuk ini.", + "botpasswords-invalid-name": "Nama pengguna yang dinyatakan tidak mengandungi pemisah kata laluan bot (\"$1\").", "resetpass_forbidden": "Kata laluan tidak boleh ditukar", "resetpass-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.", "resetpass-submit-loggedin": "Tukar kata laluan", @@ -1991,9 +1998,6 @@ "undeleteviewlink": "papar", "undeleteinvert": "Kecualikan pilihan", "undeletecomment": "Sebab:", - "undeletedrevisions": "$1 semakan dipulihkan", - "undeletedrevisions-files": "$1 semakan dan $2 fail dipulihkan", - "undeletedfiles": "$1 fail dipulihkan", "cannotundelete": "Penyahhapusan gagal: $1", "undeletedpage": "'''$1 telah dipulihkan'''\n\nSila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.", "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk laman-laman yang baru dihapuskan.", @@ -3269,7 +3273,6 @@ "logentry-tag-update-revision": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada semakan $4 pada $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)", "logentry-tag-update-logentry": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada entri log $5 bagi laman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)", "rightsnone": "(tiada)", - "revdelete-summary": "ringkasan", "feedback-adding": "Maklum balas sedang diisikan ke dalam laman...", "feedback-back": "Kembali", "feedback-bugcheck": "Bagus! Cuma pastikan itu bukan salah satu [$1 pepijat] yang sedia diketahui.", diff --git a/languages/i18n/my.json b/languages/i18n/my.json index 80b9b12181..39bacff3ee 100644 --- a/languages/i18n/my.json +++ b/languages/i18n/my.json @@ -194,6 +194,7 @@ "view": "ကြည့်ရန်", "view-foreign": "$1 တွင် ကြည့်ရန်", "edit": "ပြင်ဆင်ရန်", + "edit-local": "ဒေသတွင်း ဖော်ပြချက် ပြင်ဆင်ရန်", "create": "စတင်ရေးသားရန်", "create-local": "ဒေသတွင်း ဖော်ပြချက် ထည့်ရန်", "editthispage": "ဤစာမျက်နှာကို ပြင်ရန်", @@ -336,6 +337,7 @@ "protectedpagetext": "ဤစာမျက်နှာအား တည်းဖြတ်ခြင်းနှင့် အခြားလုပ်ဆောင်မှုများ မလုပ်ဆောင်နိုင်အောင် ကာကွယ်ထားသည်။", "viewsourcetext": "ဤစာမျက်နှာ၏ ရင်းမြစ်ကို ကြည့်ရှု၍ ကူးယူနိုင်သည်။", "viewyourtext": "ဤစာမျက်နှာရှိ သင့်တည်းဖြတ်မှုများ၏ ရင်းမြစ်ကို ကြည့်ရှုပြီး ကူးယူနိုင်သည်။", + "editinginterface": "သတိပေးချက်။ သင်သည် ဆော့ဖ်ဝဲလ်၏ အသွင်အပြင်စာသားများကို အထောက်အကူပြုရာတွင် သုံးသော စာမျက်နှာအား တည်းဖြတ်နေသည်။\nဤစာမျက်နှာတွင် ပြောင်းလဲမှုများသည် ဤဝီကီရှိ အခြားအသုံးပြုသူများ၏ အသုံးပြုသူ အသွင်အပြင်များအပေါ် အကျိုးသက်ရောက်ပါလိမ့်မည်။", "namespaceprotected": "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို တည်းဖြတ်ရန် ခွင့်ပြုချက် မရှိပါ။", "mycustomcssprotected": "ဤ CSS စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။", "mycustomjsprotected": "ဤ JavaScript စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။", @@ -1288,7 +1290,6 @@ "undeleteviewlink": "ကြည့်ရန်", "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်", "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -", - "undeletedrevisions": "{{PLURAL:$1|မူတစ်ခု|မူ $1 ခု}} ကိုပြန်လည် ထိန်းသိမ်းပြီး", "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်", "undelete-search-submit": "ရှာဖွေရန်", "undelete-show-file-submit": "မှန်", diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json index 6cac1b2de6..46ecd0ebc7 100644 --- a/languages/i18n/nb.json +++ b/languages/i18n/nb.json @@ -663,7 +663,7 @@ "savearticle": "Lagre siden", "savechanges": "Lagre endringer", "publishpage": "Publiser siden", - "publishchanges": "Publiser endringer", + "publishchanges": "Publiser endringene", "preview": "Forhåndsvisning", "showpreview": "Forhåndsvisning", "showdiff": "Vis endringer", @@ -1124,7 +1124,7 @@ "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}", "userrights-groupsmember": "Medlem av:", "userrights-groupsmember-auto": "Implisitt medlem av:", - "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til denne gruppen, du kan ikke forlenge den.", + "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til dette gruppemedlemskapet, du kan ikke forlenge den.", "userrights-reason": "Årsak:", "userrights-no-interwiki": "Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.", "userrights-nodatabase": "Databasen $1 finnes ikke, eller er ikke lokal.", @@ -1139,7 +1139,7 @@ "userrights-expiry-options": "1 dag:1 day,1 uke:1 week,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year", "userrights-invalid-expiry": "Utløpstiden for gruppa «$1» er ugyldig.", "userrights-expiry-in-past": "Utløpstiden for gruppa «$1» har vært.", - "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppa «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.", + "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppemedlemskapet i «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.", "userrights-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.", "group": "Gruppe:", "group-user": "Brukere", @@ -1404,6 +1404,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Visse endringstyper kan ikke merkes som «mindre», så dette filteret konflikterer med følgende endringstypefiltre: $1", "rcfilters-typeofchange-conflicts-hideminor": "Dette endringstypefilteret konflikterer med filteret for «Mindre endringer». Visse endringstyper kan ikke merkes som «mindre».", "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden $3, $4 (frem til $1).", + "rclistfromreset": "Nullstill datovalg", "rclistfrom": "Vis nye endringer fra og med $3 $2", "rcshowhideminor": "$1 mindre endringer", "rcshowhideminor-show": "Vis", @@ -1524,6 +1525,7 @@ "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.", "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.", "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.", + "upload-scripted-dtd": "Kan ikke laste opp SVG-filer som har en ikke-standard DTD-erklæring.", "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.", "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil", "uploaded-event-handler-on-svg": "Å sette event-handler-attributtene $1=\"$2\" tillates ikke i SVG-filer.", @@ -2256,9 +2258,6 @@ "undeleteviewlink": "vis", "undeleteinvert": "Inverter valg", "undeletecomment": "Årsak:", - "undeletedrevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet", - "undeletedrevisions-files": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet", - "undeletedfiles": "{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet", "cannotundelete": "Deler av eller hele gjennopprettingen feilet:\n$1", "undeletedpage": "'''$1 ble gjenopprettet'''\n\nSjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.", "undelete-header": "Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.", @@ -3559,7 +3558,10 @@ "htmlform-user-not-valid": "$1 er ikke et gyldig brukernavn.", "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3", "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive", - "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3", + "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gjenopprettet}} siden $3", + "restore-count-revisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}}", + "restore-count-files": "{{PLURAL:$1|Én fil|$1 filer}}", "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3", @@ -3767,6 +3769,7 @@ "special-characters-group-thai": "Thai", "special-characters-group-lao": "Laotisk", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Kanadisk stavelsesskrift", "special-characters-title-endash": "tankestrek", "special-characters-title-emdash": "lang tankestrek", "special-characters-title-minus": "minustegn", @@ -3913,5 +3916,10 @@ "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk:
    0.0.0.0/0\n::/0
    ", "revid": "revisjon $1", "pageid": "side-ID $1", - "rawhtml-notallowed": "<html>-tagger kan ikke brukes utenfor normale sider." + "rawhtml-notallowed": "<html>-tagger kan ikke brukes utenfor normale sider.", + "gotointerwiki": "Forlater {{SITENAME}}", + "gotointerwiki-invalid": "Den gitte tittelen var ugyldig.", + "gotointerwiki-external": "Du er i ferd med å forlate {{SITENAME}} for å besøke [[$2]], som er et annet nettsted.\n\n[$1 Klikk her for å fortsette til $1].", + "undelete-cantedit": "Du kan ikke gjenopprette denne siden fordi du ikke har tillatelse til å redigere den.", + "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden." } diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json index 2ba8bb1b8d..624c2ef840 100644 --- a/languages/i18n/nl.json +++ b/languages/i18n/nl.json @@ -1156,7 +1156,7 @@ "saveusergroups": "{{GENDER:$1|Gebruikersgroepen}} opslaan", "userrights-groupsmember": "Lid van:", "userrights-groupsmember-auto": "Impliciet lid van:", - "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u de verlooptijd van deze groep alleen kunt verkorten. U kunt deze niet verlengen.", + "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u dit groepslidmaatschap alleen kunt verlengen. U kunt het niet verkorten.", "userrights-reason": "Reden:", "userrights-no-interwiki": "U hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.", "userrights-nodatabase": "De database $1 bestaat niet of is geen lokale database.", @@ -1170,7 +1170,7 @@ "userrights-expiry-options": "1 dag:1 day,1 week:1 week,1 maand:1 month,3 maanden:3 months,6 maanden:6 months,1 jaar:1 year", "userrights-invalid-expiry": "De vervaltijd voor de groep \"$1\" is ongeldig.", "userrights-expiry-in-past": "De vervaltijd voor de groep \"$1\" is in het verleden.", - "userrights-cannot-shorten-expiry": "Kunt de verlooptijd van de groep \"$1\" niet verkorten. Alleen gebruiker met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.", + "userrights-cannot-shorten-expiry": "U kunt de verlooptijd van het groepslidmaatschip van groep \"$1\" niet verkorten. Alleen gebruikers met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.", "userrights-conflict": "Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.", "group": "Groep:", "group-user": "gebruikers", @@ -1427,6 +1427,7 @@ "rcfilters-filter-logactions-label": "Geregistreerde acties", "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads....", "rcnotefrom": "Wijzigingen sinds $3 om $4 (maximaal $1 {{PLURAL:$1|wijziging|wijzigingen}}).", + "rclistfromreset": "Datum selectie opnieuw instellen", "rclistfrom": "Wijzigingen bekijken vanaf $3 $2", "rcshowhideminor": "Kleine bewerkingen $1", "rcshowhideminor-show": "weergeven", @@ -1547,6 +1548,7 @@ "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".", "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.", "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stylesheets is niet mogelijk.", + "upload-scripted-dtd": "Kan geen SVG bestanden uploaden die een DTD declaratie bevatten dat niet aan de standaard voldoet.", "uploaded-script-svg": "Scriptbaar element \"$1\" in het geüploade SVG-bestand gevonden.", "uploaded-hostile-svg": "Onveilige CSS in het \"style\"-element van het geüploade SVG-bestand gevonden.", "uploaded-event-handler-on-svg": "Het instellen van de event-handlereigenschappen $1=\"$2\" is niet toegestaan in SVG-bestanden.", @@ -2280,9 +2282,6 @@ "undeleteviewlink": "bekijken", "undeleteinvert": "Selectie omkeren", "undeletecomment": "Reden:", - "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} teruggeplaatst", - "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst", - "undeletedfiles": "{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst", "cannotundelete": "Het terugplaatsen is (gedeeltelijk) mislukt:\n$1", "undeletedpage": "'''$1 is teruggeplaatst'''\n\nIn het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.", "undelete-header": "Zie het [[Special:Log/delete|verwijderingslogboek]] voor recent verwijderde pagina's.", @@ -3764,6 +3763,7 @@ "special-characters-group-thai": "Thai", "special-characters-group-lao": "Laotiaans", "special-characters-group-khmer": "Khmer", + "special-characters-group-canadianaboriginal": "Canadees Aboriginal", "special-characters-title-endash": "liggend streepje", "special-characters-title-emdash": "gedachtenstreepje", "special-characters-title-minus": "minteken", @@ -3910,5 +3910,10 @@ "restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:
    0.0.0.0/0\n::/0
    ", "revid": "versie $1", "pageid": "Pagina-ID $1", - "rawhtml-notallowed": "<html> tags kunnen alleen op normale pagina's geplaatst worden." + "rawhtml-notallowed": "<html> tags kunnen alleen op normale pagina's geplaatst worden.", + "gotointerwiki": "{{SITENAME}} verlaten", + "gotointerwiki-invalid": "De opgegeven titel is ongeldig.", + "gotointerwiki-external": "U staat op het punt om {{SITENAME}} te verlaten en [[$2]] te bezoeken. [[$2]] is een aparte website.\n\n[$1 Klik hier om door te gaan naar $1].", + "undelete-cantedit": "U kunt deze pagina niet terug plaatsen omdat u niet het recht hebt om deze pagina te bewerken.", + "undelete-cantcreate": "U kunt deze pagina niet terugplaatsen omdat er geen bestaande pagina met deze naam is en u geen toestemming hebt om deze pagina aan te maken." } diff --git a/languages/i18n/or.json b/languages/i18n/or.json index 4e9ef1840d..5efeb94559 100644 --- a/languages/i18n/or.json +++ b/languages/i18n/or.json @@ -1879,9 +1879,6 @@ "undeleteviewlink": "ଦେଖଣା", "undeleteinvert": "ବଛାଯାଇଥିବା ଲେଖାକୁ ଓଲଟେଇଦେବେ", "undeletecomment": "କାରଣ:", - "undeletedrevisions": "{{PLURAL:$1|ଗୋଟିଏ ସଂକଳନ|$1 ଗୋଟି ସଂକଳନ}} ପୁନସ୍ଥାପନ କରାଗଲା", - "undeletedrevisions-files": "{{PLURAL:$1|ଗୋଟିଏ ସଂସ୍କରଣ|$1 ଗୋଟି ସଂସ୍କରଣ}} ଓ {{PLURAL:$2|ଗୋଟିଏ ଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା", - "undeletedfiles": "{{PLURAL:$1|ଗୋଟିଏ ଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା", "cannotundelete": "ଲିଭାଇବାରୁ ରୋକିବା ବିଫଳ ହେଲା;\n$1", "undeletedpage": "'''$1ର ପୁନସ୍ଥାପନ କରାଗଲା'''\n\nନଗଦ ଲିଭାଇବା ଓ ପୁନସ୍ଥାପନ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।", "undelete-header": "ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।", diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json index 6733566bdb..c41223d216 100644 --- a/languages/i18n/pl.json +++ b/languages/i18n/pl.json @@ -1390,7 +1390,7 @@ "rcfilters-filterlist-noresults": "Nie znaleziono filtrów", "rcfilters-noresults-conflict": "Nie znaleziono wyników z powodu konfliktu kryteriów wyszukiwania", "rcfilters-state-message-subset": "Ten filtr nie wywoła efektu, ponieważ pasujące do niego wyniki są zawarte w bardziej {{PLURAL:$2|szczegółowym filtrze|szczegółowych filtrach}} (spróbuj podświetlić, aby je rozróżnić): $1", - "rcfilters-state-message-fullcoverage": "Wybranie wszystkich filtrów w grupie działa tak samo jak niewybranie żadnego, więc ten filtr nie będzie miał efektu. W grupie zawarto też: $1", + "rcfilters-state-message-fullcoverage": "Wybranie wszystkich filtrów w grupie działa tak samo jak niewybranie żadnego, więc taki filtr nie da żadnego efektu. W grupie zawarto też: $1", "rcfilters-filtergroup-registration": "Rejestracja użytkownika", "rcfilters-filter-registered-label": "Zarejestrowani", "rcfilters-filter-registered-description": "Zalogowani edytorzy.", @@ -1403,7 +1403,7 @@ "rcfilters-filter-editsbyother-label": "Edycje inne niż Twoje", "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych (nie Twoje).", "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko o zarejestrowanych użytkownikach)", - "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtry doświadczenia wyszukują tylko edycje zarejestrowanych użytkowników, więc ten filtr koliduje z filtrem “Niezarejestrowani”.", + "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtry doświadczenia wyszukują tylko edycje zarejestrowanych użytkowników, więc ten filtr koliduje z filtrem „Niezarejestrowani”.", "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr \"Niezarejestrowani\" koliduje z jednym lub więcej filtrów z filtrów poziomu doświadczenia, które służą do wyszukiwania wkładu tylko zarejestrowanych użytkowników. Kolidujące filtry zostały odpowiednio oznaczone na pasku Aktywnych filtrów.", "rcfilters-filter-user-experience-level-newcomer-label": "Początkujący", "rcfilters-filter-user-experience-level-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.", @@ -1435,9 +1435,9 @@ "rcfilters-filter-categorization-description": "Dodanie lub usunięcie strony z kategorii", "rcfilters-filter-logactions-label": "Działania rejestrowane", "rcfilters-filter-logactions-description": "Działania administracyjne, tworzenie kont, usuwanie stron, przesyłanie plików...", - "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr \"Drobne zmiany\" koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za \"drobne\". Kolidujące filtry zostały odpowiednio zaznaczone na pasku aktywnych filtrów powyżej.", - "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za \"drobne\", więc ten filtr koliduje z następującymi filtrami rodzaju zmian: $1", - "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem \"Drobne zmiany\". Nie wszystkie zmiany mogą być uznawane za \"drobne\".", + "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Drobne zmiany” koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za „drobne”. Kolidujące filtry zostały powyżej odpowiednio zaznaczone na pasku aktywnych filtrów.", + "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za „drobne”, dlatego ten filtr koliduje z następującymi filtrami Rodzaju zmian: $1", + "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem „Drobne zmiany”. Nie wszystkie zmiany mogą być uznawane za „drobne”.", "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po $3, $4 (nie więcej niż '''$1''' pozycji).", "rclistfrom": "Pokaż nowe zmiany od $3 $2", "rcshowhideminor": "$1 drobne edycje", @@ -1559,6 +1559,7 @@ "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.", "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.", "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.", + "upload-scripted-dtd": "Nie można przesyłać plików SVG zawierających niestandardową deklarację DTD.", "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.", "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.", "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń $1=\"$2\" jest niedozwolone w plikach SVG.", @@ -2290,9 +2291,6 @@ "undeleteviewlink": "pokaż", "undeleteinvert": "Odwróć zaznaczenie", "undeletecomment": "Powód:", - "undeletedrevisions": "odtworzono {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}", - "undeletedrevisions-files": "odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}", - "undeletedfiles": "odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}", "cannotundelete": "Niektóre lub wszystkie odtworzenia nie powiodły się:\n$1", "undeletedpage": "'''Odtworzono stronę $1.'''\n\nZobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.", "undelete-header": "Zobacz [[Special:Log/delete|rejestr usunięć]], aby sprawdzić ostatnio usunięte strony.", diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json index 035d1ae7ee..029a5f1672 100644 --- a/languages/i18n/pt-br.json +++ b/languages/i18n/pt-br.json @@ -107,7 +107,8 @@ "Joao Xavier", "Nahime2015", "Alex Great", - "EVinente" + "EVinente", + "Felipe L. Ewald" ] }, "tog-underline": "Sublinhar links:", @@ -851,6 +852,7 @@ "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.\nEstes argumentos foram omitidos.", "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados", "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]", + "template-loop-category": "Páginas com loops de predefinição", "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)", "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)", "node-count-exceeded-category": "Páginas em que o total de nós é excedido", @@ -1408,6 +1410,7 @@ "rcfilters-highlightbutton-title": "Realçar os resultados", "rcfilters-highlightmenu-title": "Selecione uma cor", "rcfilters-filterlist-noresults": "Nenhum filtro encontrado", + "rcfilters-noresults-conflict": "Nenhum resultado encontrado porque os critérios de pesquisa estão em conflito", "rcfilters-filtergroup-registration": "Registro de usuário", "rcfilters-filter-registered-label": "Registrado", "rcfilters-filter-registered-description": "Editores conectados.", @@ -2299,9 +2302,6 @@ "undeleteviewlink": "visualizar", "undeleteinvert": "Inverter seleção", "undeletecomment": "Motivo:", - "undeletedrevisions": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}}", - "undeletedrevisions-files": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}", - "undeletedfiles": "{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}", "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1", "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.", "undelete-header": "Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index b16c01baba..64ca14fc1b 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -1616,6 +1616,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Tooltip shown when hovering over the Minor edits tag, when a Type of Change filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown. Parameters:\n* $1 - Comma-separated string of selected Type of Change filters, e.g. \"Category, Logged Actions\"\n* $2 - Count of selected User Experience Level filters, for PLURAL", "rcfilters-typeofchange-conflicts-hideminor": "Tooltip shown when hovering over a Type of change filter tag, when the Minor edits filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.", "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL", + "rclistfromreset": "Used on [[Special:RecentChanges]] to reset a selection of a certain date range.", "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.", "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}", "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}}", @@ -1744,6 +1745,7 @@ "php-uploaddisabledtext": "This means that file uploading is disabled in PHP, not upload of PHP-files.", "uploadscripted": "Used as error message when uploading a file.\n\nSee also:\n* {{msg-mw|zip-wrong-format}}\n* {{msg-mw|uploadjava}}\n* {{msg-mw|uploadvirus}}", "upload-scripted-pi-callback": "Used as error message when uploading an SVG file that contains xml-stylesheet processing instruction.", + "upload-scripted-dtd": "Used as an error message when uploading an svg file that contains a DTD declaration where the system identifier of the DTD is for something other than the standard SVG DTDS, or it is a SYSTEM DTD, or the public identifier does not start with -//W3C//. Note that errors related to the internal dtd subset do not use this error message.", "uploaded-script-svg": "Used as error message when uploading an SVG file that contains scriptable tags (script, handler, stylesheet, iframe).\n\nParameters:\n* $1 - The scriptable tag that blocked the SVG file from uploading.", "uploaded-hostile-svg": "Used as error message when uploading an SVG file that contains unsafe CSS.", "uploaded-event-handler-on-svg": "Used as error message when uploading an SVG file that contains event-handler attributes.\n\nParameters:\n* $1 - The event-handler attribute that is being modified in the SVG file.\n* $2 - The value that is given to the event-handler attribute.", @@ -2536,9 +2538,6 @@ "undeleteviewlink": "First part of {{msg-mw|undeletelink}}.\nDisplay name of link to view a deleted page used on [[Special:Log/delete]].\n{{Identical|View}}", "undeleteinvert": "{{Identical|Invert selection}}", "undeletecomment": "{{Identical|Reason}}", - "undeletedrevisions": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedfiles}}", - "undeletedrevisions-files": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\n* $2 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions}}\n* {{msg-mw|Undeletedfiles}}", - "undeletedfiles": "Used as reason in the log entry. Parameters:\n* $1 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedrevisions}}", "cannotundelete": "Message shown when undeletion failed for some reason. Parameters:\n* $1 - the combined wikitext of messages for all errors that caused the failure", "undeletedpage": "Used as success message. Parameters:\n* $1 - page title, with link", "undelete-header": "Used in [[Special:Undelete]].", @@ -4096,7 +4095,10 @@ "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array", "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}", "logentry-delete-delete_redir": "{{Logentry|[[Special:Log/delete]]}}", - "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}", + "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}\n* $4 - {{msg-mw|restore-count-revisions}} or/and {{msg-mw|restore-count-files}}", + "logentry-delete-restore-nocount": "{{Logentry|[[Special:Log/delete]]}}", + "restore-count-revisions": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|Revision}}", + "restore-count-files": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|File}}", "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events", "logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3", "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}", @@ -4322,6 +4324,7 @@ "special-characters-group-thai": "The name of the [[w:Thai alphabet|Thai]] character set (alphabet).", "special-characters-group-lao": "{{Identical|Lao}}", "special-characters-group-khmer": "{{Identical|Khmer}}", + "special-characters-group-canadianaboriginal": "The name of the [[w:Canadian Aboriginal syllabics|Canadian Aboriginal]] character set (alphabet).", "special-characters-title-endash": "Title tooltip for the en dash character (–); See https://en.wikipedia.org/wiki/Dash", "special-characters-title-emdash": "Title tooltip for the em dash character (—); See https://en.wikipedia.org/wiki/Dash", "special-characters-title-minus": "Title tooltip for the minus sign character (−), not to be confused with a hyphen", @@ -4472,5 +4475,10 @@ "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).", "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}", "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.", - "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an <html> tag in a system message or somewhere other than a normal page." + "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an <html> tag in a system message or somewhere other than a normal page.", + "gotointerwiki": "{{doc-special|GoToInterwiki}}\n\nSpecial:GoToInterwiki is a warning page displayed before redirecting users to external interwiki links. Its triggered by people going to something like [[Special:Search/google:foo]].", + "gotointerwiki-invalid": "Message shown on Special:GoToInterwiki if given an invalid title.", + "gotointerwiki-external": "Message shown on Special:GoToInterwiki if given a external interwiki link (e.g. [[Special:GoToInterwiki/Google:Foo]]). $1 is the full url the user is trying to get to. $2 is the text of the interwiki link (e.g. \"Google:foo\").", + "undelete-cantedit": "Shown if the user tries to undelete a page that they cannot edit", + "undelete-cantcreate": "Shown if the user tries to undelete a page which currently does not exist, and they are not allowed to create it. This could for example happen on a wiki with custom protection levels where the page name has been create-protected and the user has the right to undelete but not the right to edit protected pages." } diff --git a/languages/i18n/qu.json b/languages/i18n/qu.json index f6c2945ff3..e28b7230a6 100644 --- a/languages/i18n/qu.json +++ b/languages/i18n/qu.json @@ -1744,9 +1744,6 @@ "undeleteviewlink": "qhaway", "undeleteinvert": "Akllasqantinta t'ikrachiy", "undeletecomment": "Kayrayku:", - "undeletedrevisions": "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}", - "undeletedrevisions-files": "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam", - "undeletedfiles": "{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam", "cannotundelete": "Manam atinichu qullusqata paqarichiyta: $1", "undeletedpage": "'''$1 nisqaqa paqarichisqañam'''\n\n[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.", "undelete-header": "[[Special:Log/delete|Qulluy hallch'apiqa]] qullusqa p'anqakunap sutinkunatam rikunki.", diff --git a/languages/i18n/roa-tara.json b/languages/i18n/roa-tara.json index 91a53d61d3..3096123ebb 100644 --- a/languages/i18n/roa-tara.json +++ b/languages/i18n/roa-tara.json @@ -437,6 +437,8 @@ "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?", "createacct-submit": "Ccreje 'u cunde utende tune", "createacct-another-submit": "Ccreje 'nu cunde utende", + "createacct-continue-submit": "Condinue 'a ccrejazzione de l'utende", + "createacct-another-continue-submit": "Condinue 'a ccrejazzione de l'utende", "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.", "createacct-benefit-body1": "{{PLURAL:$1|cangiamende|cangiaminde}}", "createacct-benefit-body2": "{{PLURAL:$1|pàgene|pàggene}}", @@ -1931,9 +1933,6 @@ "undeleteviewlink": "vide", "undeleteinvert": "Selezione a smerse", "undeletecomment": "Mutive:", - "undeletedrevisions": "{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete", - "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete", - "undeletedfiles": "{{PLURAL:$1|1 file|$1 file}} ripristinete", "cannotundelete": "Repristine fallite:\n$1", "undeletedpage": "'''$1 ha state repristinate'''\n\nLigge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.", "undelete-header": "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.", diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json index a1be9ef647..7abd0f8407 100644 --- a/languages/i18n/ru.json +++ b/languages/i18n/ru.json @@ -103,7 +103,8 @@ "Ping08", "Yuryleb", "Redredsonia", - "Nitch" + "Nitch", + "Alexey zakharenkov" ] }, "tog-underline": "Подчёркивание ссылок:", @@ -148,7 +149,7 @@ "tog-showhiddencats": "Показывать скрытые категории", "tog-norollbackdiff": "Не показывать разницу версий после выполнения отката", "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями", - "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе", + "tog-prefershttps": "Всегда использовать защищённое соединение", "underline-always": "Всегда", "underline-never": "Никогда", "underline-default": "Использовать настройки браузера", @@ -324,7 +325,7 @@ "jumpto": "Перейти к:", "jumptonavigation": "навигация", "jumptosearch": "поиск", - "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1", + "view-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.\n\n$1", "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.", "pool-timeout": "Истекло время ожидания блокировки", "pool-queuefull": "Накопитель запросов полон", @@ -1164,7 +1165,7 @@ "prefs-help-prefershttps": "Эта настройка будет применена после следующего представления системе.", "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.", "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.", - "userrights": "Права пользователя", + "userrights": "Права участника", "userrights-lookup-user": "Выбор участника", "userrights-user-editname": "Введите имя учётной записи:", "editusergroup": "Загрузить группы участников", @@ -1175,7 +1176,7 @@ "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}", "userrights-groupsmember": "Состоит в группах:", "userrights-groupsmember-auto": "Неявно состоит в группах:", - "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения этой группы, вы не можете перенести его на более ранний срок.", + "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения членства в этой группы, вы не можете перенести его на более ранний срок.", "userrights-reason": "Причина:", "userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.", "userrights-nodatabase": "База данных $1 не существует или расположена не локально.", @@ -1189,7 +1190,7 @@ "userrights-expiry-options": "1 день:1 day,1 неделя:1 week,1 месяц:1 mopnth,3 месяца:3 months,6 месяцев:6 months,1 год:1 year", "userrights-invalid-expiry": "Время истечения для группы «$1» задано неверно.", "userrights-expiry-in-past": "Время истечения для группы «$1» задано в прошлом.", - "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения группы «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.", + "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения членства в группе «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.", "userrights-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.", "group": "Группа:", "group-user": "Участники", @@ -1380,7 +1381,7 @@ "recentchanges-legend": "Настройки свежих правок", "recentchanges-summary": "Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.", "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.", - "recentchanges-feed-description": "Отслеживать в этом потоке последние изменения в вики.", + "recentchanges-feed-description": "Отслеживание последних изменений в вики.", "recentchanges-label-newpage": "Этой правкой была создана новая страница.", "recentchanges-label-minor": "Это незначительное изменение", "recentchanges-label-bot": "Эта правка сделана ботом", @@ -2059,8 +2060,8 @@ "listgrants-summary": "Ниже приведён список разрешений с указанием на то, к каким связанным пользовательским правам они дают доступ. Участники могут разрешить приложениям использовать свою учётную запись, но с ограниченными правами на основе разрешений, которые участник предоставляет приложению. Однако, приложение, действующее от имени участника, на самом деле не сможет воспользоваться правами, отсутствующими у учётной записи.\nОб отдельных правах можно получить [[{{MediaWiki:Listgrouprights-helppage}}|дополнительную информацию]].", "listgrants-grant": "Разрешение", "listgrants-rights": "Права", - "trackingcategories": "Отслеживающие категории", - "trackingcategories-summary": "На этой странице перечислены отслеживающие категории, которые автоматически заполняются программным обеспечением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.", + "trackingcategories": "Отслеживание категорий", + "trackingcategories-summary": "На этой странице перечислены категории, заполняемые автоматически. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.", "trackingcategories-msg": "Отслеживающая категория", "trackingcategories-name": "Имя сообщения", "trackingcategories-desc": "Критерий включения в категорию", @@ -2299,9 +2300,6 @@ "undeleteviewlink": "просмотреть", "undeleteinvert": "Обратить выделение", "undeletecomment": "Причина:", - "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменения|изменений}}", - "undeletedrevisions-files": "восстановлены $1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}}", - "undeletedfiles": "{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файла|файлов}}", "cannotundelete": "Некоторые или все ваши восстановления не удались:\n$1", "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].", "undelete-header": "Список недавно удалённых страниц можно посмотреть в [[Special:Log/delete|журнале удалений]].", @@ -3640,7 +3638,8 @@ "htmlform-user-not-valid": "$1 — недопустимое имя учётной записи.", "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3", "logentry-delete-delete_redir": "$1 удалил{{GENDER:$2||а}} перенаправление $3 с помощью перезаписи", - "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3", + "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3 ($4)", + "logentry-delete-restore-nocount": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3", "logentry-delete-event": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4", "logentry-delete-revision": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4", "logentry-delete-event-legacy": "$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3", @@ -3847,6 +3846,7 @@ "special-characters-group-thai": "Тайские", "special-characters-group-lao": "Лаосские", "special-characters-group-khmer": "Кхмерские", + "special-characters-group-canadianaboriginal": "Канадское слоговое письмо", "special-characters-title-endash": "среднее тире", "special-characters-title-emdash": "длинное тире", "special-characters-title-minus": "знак минус", @@ -3994,5 +3994,9 @@ "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:", "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:
    0.0.0.0/0\n::/0
    ", "revid": "версия $1", - "pageid": "ID страницы $1" + "pageid": "ID страницы $1", + "gotointerwiki": "Покидаем {{SITENAME}}...", + "gotointerwiki-invalid": "Указан некорректный заголовок.", + "gotointerwiki-external": "Вы покидаете {{SITENAME}} для посещения сайта [[$2]].\n\n[$1 Нажмите здесь, чтобы перейти на $1].", + "undelete-cantedit": "Вы не можете восстановить эту страницу, поскольку у вас недостаточно прав для ее редактирования." } diff --git a/languages/i18n/sco.json b/languages/i18n/sco.json index a78e617a51..33f7fd3fcf 100644 --- a/languages/i18n/sco.json +++ b/languages/i18n/sco.json @@ -200,7 +200,7 @@ "view-foreign": "See oan $1", "edit": "Eedit", "edit-local": "Eedit the local descreeption", - "create": "Ceaut", + "create": "Creaut", "create-local": "Eik local descreeption", "editthispage": "Eedit this page", "create-this-page": "Creaut this page", @@ -345,7 +345,7 @@ "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".", "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".", "filedeleteerror": "Cuidna delyte file \"$1\".", - "directorycreateerror": "Couldna creat directerie \"$1\".", + "directorycreateerror": "Couldna creaut directerie \"$1\".", "directoryreadonlyerror": "Directerie \"$1\" is read-yinlie.", "directorynotreadableerror": "Directerie \"$1\" is no readable.", "filenotfound": "Coudna fynd file \"$1\".", @@ -358,7 +358,12 @@ "no-null-revision": "Coudna mak new null reveesion fer page \"$1\"", "badtitle": "Bad teetle", "badtitletext": "The requestit page teitle wis onvalid, tuim, or ae wranglie airtit inter-leid or inter-wiki teitle. It micht contain yin or mair chairacters that canna be uised in teitles.", + "title-invalid-interwiki": "The requestit page teetle conteens an interwiki airtin which canna be uised in teetles.", + "title-invalid-talk-namespace": "The requestit page teetle refers tae a talk page that canna exeest.", "title-invalid-characters": "The requestit page teetle conteens invalid chairacters: \"$1\".", + "title-invalid-magic-tilde": "The requestit page teetle conteens invalid magic tilde sequence (~~~).", + "title-invalid-too-long": "The requestit page teetle is too lang. It must be na langer nor $1 {{PLURAL:$1|byte|bytes}} in UTF-8 encodin.", + "title-invalid-leading-colon": "The requestit page teetle conteens an invalid colon at the beginnin.", "perfcached": "The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.", "perfcachedts": "The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.", "querypage-no-updates": "Updates fer this page ar disablit at the meenit. Data here will nae be refreshit at the meenit.", @@ -419,7 +424,7 @@ "externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.", "login": "Log in", "login-security": "Verify yer identity", - "nav-login-createaccount": "Log in / cræft aen accoont", + "nav-login-createaccount": "Log in / creaut accoont", "logout": "Log oot", "userlogout": "Log oot", "notloggedin": "Naw loggit in", @@ -480,7 +485,7 @@ "eauthentsent": "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.\nAfore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.", "throttled-mailpassword": "Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.\nTae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.", "mailerror": "Mistak sendin mail: $1", - "acct_creation_throttle_hit": "Veesiters tae this wiki uisin yer IP address hae creautit $1 {{PLURAL:$1|accoont|accoonts}} the day, this is the maist alloued in that lang.\nSae veesiters uisin this IP address canna creaut onie mair accoonts juist nou.", + "acct_creation_throttle_hit": "Veesitors tae this wiki uisin yer IP address hae creautit {{PLURAL:$1|1 accoont|$1 accoonts}} in the last $2, which is the maximum allaed in this time period.\nAs a result, veesitors uisin this IP address canna creaut ony mair accoonts at the moment.", "emailauthenticated": "Yer wab-mail address wis confirmed oan $2 at $3.", "emailnotauthenticated": "Yer wab-mail address isna yet confirmed.\nNae wab-mail will be sent fer oni o the follaein features.", "noemailprefs": "Specifie aen email address in yer preferances fer thir featurs tae wairk.", @@ -488,8 +493,8 @@ "invalidemailaddress": "The wab-mail address canna be acceptit sin it seems tae be formattit wrang.\nPlease enter ae weel-formattit address or mak that field tuim.", "cannotchangeemail": "Accoont wab-mail addresses canna be chynged oan this wiki.", "emaildisabled": "This site canna send wab-mails.", - "accountcreated": "Accoont cræftit", - "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.", + "accountcreated": "Accoont creautit", + "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been creautit.", "createaccount-title": "Accoont creaution fer {{SITENAME}}", "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.", "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.", @@ -515,7 +520,10 @@ "resetpass_submit": "Set passwaird n log in", "changepassword-success": "Yer passwaird chynge wis braw!", "changepassword-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.", + "botpasswords-createnew": "Creaut a new bot passwird", "botpasswords-label-create": "Creaut", + "botpasswords-created-title": "Bot passwird creautit", + "botpasswords-created-body": "The bot passwird for bot name \"$1\" o uiser \"$2\" wis creautit.", "resetpass_forbidden": "Passwairds canna be chynged", "resetpass-no-info": "Ye maun be loggit in tae access this page directly.", "resetpass-submit-loggedin": "Chynge passwaird", @@ -878,7 +886,7 @@ "searchprofile-advanced-tooltip": "Rake in custom namespaces", "search-result-size": "$1 ({{PLURAL:$2|1 waird|$2 wairds}})", "search-result-category-size": "{{PLURAL:$1|1 memmer|$1 memmers}} ({{PLURAL:$2|1 subcategerie|$2 subcategeries}}, {{PLURAL:$3|1 file|$3 files}})", - "search-redirect": "(reguide $1)", + "search-redirect": "(reguide frae $1)", "search-section": "(section $1)", "search-category": "(categerie $1)", "search-file-match": "(matches file content.)", @@ -1334,7 +1342,16 @@ "upload-too-many-redirects": "The URL contained oewr monie reguidals", "upload-http-error": "Aen HTTP mistake occurred: $1", "upload-copy-upload-invalid-domain": "Copie uplaids arna available fae this domain.", + "upload-dialog-title": "Uplaid file", + "upload-dialog-button-cancel": "Cancel", + "upload-dialog-button-back": "Back", + "upload-dialog-button-done": "Duin", + "upload-dialog-button-save": "Hain", + "upload-dialog-button-upload": "Uplaid", + "upload-form-label-infoform-title": "Details", + "upload-form-label-infoform-name": "Name", "upload-form-label-own-work": "This is ma awn wark", + "upload-form-label-own-work-message-generic-local": "A confirm that A am uplaidin this file follaein the terms o service an licensin policies on {{SITENAME}}.", "backend-fail-stream": "Coudna stream file \"$1\".", "backend-fail-backup": "Coudna backup file \"$1\".", "backend-fail-notexists": "The file $1 disna exeest.", @@ -1750,7 +1767,7 @@ "watchnologin": "Nae loggit in", "addwatch": "Eik til watchleet", "addedwatchtext": "The page \"[[:$1]]\" haes been added til yer [[Special:Watchlist|watchleet]].\nFutur chynges til this page n its associated tauk page will be leeted thaur.", - "addedwatchtext-short": "The page \"$1\" haes been eikit tae yer watchleet.", + "addedwatchtext-short": "The page \"$1\" haes been addit tae yer watchleet.", "removewatch": "Remuiv fae watchleet", "removedwatchtext": "The page \"[[:$1]]\" haes been remuied fae [[Special:Watchlist|yer watchleet]].", "removedwatchtext-short": "The page \"$1\" haes been remuived fae yer watchleet.", @@ -1903,9 +1920,6 @@ "undeleteviewlink": "see", "undeleteinvert": "Invert the selection", "undeletecomment": "Raison:", - "undeletedrevisions": "{{PLURAL:$1|1 reveesion|$1 reveesions}} restored", - "undeletedrevisions-files": "{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored", - "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored", "cannotundelete": "Ondelyte failed:\n$1", "undeletedpage": "$1 haes been restored\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recynt delytions n restorations.", "undelete-header": "See [[Special:Log/delete|the delytion log]] fer the recentlie delytit pages.", @@ -2348,6 +2362,7 @@ "pageinfo-robot-index": "Permitit", "pageinfo-robot-noindex": "Na permitit", "pageinfo-watchers": "Nummer o page watchers", + "pageinfo-visiting-watchers": "Nummer o page watchers wha veesitit recent eedits", "pageinfo-few-watchers": "Less than $1 {{PLURAL:$1|watcher|watchers}}", "pageinfo-redirects-name": "Nummer o reguidals til this page", "pageinfo-subpages-name": "Nummer o subpages o this page", @@ -2976,6 +2991,7 @@ "tags-active-no": "Naw", "tags-edit": "eedit", "tags-hitcount": "$1 {{PLURAL:$1|chynge|chynges}}", + "tags-create-submit": "Creaut", "tags-edit-logentry-selected": "{{PLURAL:$1|Selectit log event|Selectit log events}}:", "tags-edit-logentry-legend": "Add or remuive tags frae {{PLURAL:$1|this log entry|aw $1 log entries}}", "tags-edit-logentry-submit": "Apply chynges tae {{PLURAL:$1|this log entry|$1 log entries}}", diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json index 36d0d248f8..61c06bd214 100644 --- a/languages/i18n/sl.json +++ b/languages/i18n/sl.json @@ -1089,7 +1089,7 @@ "saveusergroups": "Shrani {{GENDER:$1|uporabnikove|uporabničine}} skupine", "userrights-groupsmember": "Član skupine:", "userrights-groupsmember-auto": "Posreden član:", - "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka te skupine postavite samo nazaj; ne morete ga postaviti naprej.", + "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka članstva v tej skupine postavite samo nazaj; ne morete ga postaviti naprej.", "userrights-reason": "Razlog:", "userrights-no-interwiki": "Za urejanje pravic uporabnikov na drugih wikijih nimate dovoljenja.", "userrights-nodatabase": "Podatkovna baza $1 ne obstaja ali ni lokalna.", @@ -1103,7 +1103,7 @@ "userrights-expiry-options": "1 dan:1 day,1 teden:1 week,1 mesec:1 month,3 mesece:3 months,6 mesecev:6 months,1 leto:1 year", "userrights-invalid-expiry": "Čas poteka skupine »$1« ni veljaven.", "userrights-expiry-in-past": "Čas poteka skupine »$1« je v preteklosti.", - "userrights-cannot-shorten-expiry": "Časa poteka skupine »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te supine lahko prestavijo čase poteka naprej.", + "userrights-cannot-shorten-expiry": "Časa poteka članstva v skupini »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te skupine lahko prestavijo čase poteka naprej.", "userrights-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.", "group": "Skupina:", "group-user": "Uporabniki", @@ -1367,6 +1367,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "Nekaterih vrst sprememb ni možno označiti kot »manjše«, zato je ta filter v sporu z naslednjimi filtri Vrsta spremembe: $1", "rcfilters-typeofchange-conflicts-hideminor": "Ta filter Vrsta spremembe je v sporu s filtrom »Manjše urejanje«. Nekaterih vrst sprememb ni možno označiti kot »manjše«.", "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od $3 $4 dalje (prikazujem jih do $1).", + "rclistfromreset": "Ponastavi izbiro datuma", "rclistfrom": "Prikaži spremembe od $3 $2 naprej", "rcshowhideminor": "$1 manjša urejanja", "rcshowhideminor-show": "Prikaži", @@ -1487,6 +1488,7 @@ "php-uploaddisabledtext": "Nalaganje datotek je onemogočeno v PHP.\nProsimo preverite file_uploads nastavitev.", "uploadscripted": "Datoteka vsebuje HTML- ali skriptno kodo, ki bi jo lahko brskalnik razlagal napačno.", "upload-scripted-pi-callback": "Ne moremo naložiti datoteke, ki vsebuje navodila za slogovno obdelavo XML.", + "upload-scripted-dtd": "Ne morete naložiti datotek SVG, ki vsebujejo nestandardno najavo DTD.", "uploaded-script-svg": "V naloženi datoteki SVG smo našli skriptni element »$1«.", "uploaded-hostile-svg": "V slogovnem elementu naložene datoteke SVG smo našli nevaren CSS.", "uploaded-event-handler-on-svg": "Določevanje atributov za dogodke $1=\"$2\" v datotekah SVG ni dovoljeno.", @@ -2219,9 +2221,6 @@ "undeleteviewlink": "ogled", "undeleteinvert": "Obrni izbor", "undeletecomment": "Razlog:", - "undeletedrevisions": "{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}", - "undeletedrevisions-files": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}", - "undeletedfiles": "{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}", "cannotundelete": "Nekatere ali vse obnove so spodletele:\n$1", "undeletedpage": "'''Obnovili ste stran $1.'''\n\nNedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].", "undelete-header": "Glej [[Special:Log/delete|dnevnik brisanja]] za nedavno izbrisane strani.", @@ -3477,7 +3476,10 @@ "htmlform-user-not-valid": "$1 ni veljavno uporabniško ime.", "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3", "logentry-delete-delete_redir": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} preusmeritev $3 s prepisom", - "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3", + "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3 ($4)", + "logentry-delete-restore-nocount": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3", + "restore-count-revisions": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}}", + "restore-count-files": "$1 {{PLURAL:$1|datoteka|datoteki|datoteke|datotek}}", "logentry-delete-event": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4", "logentry-delete-revision": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4", "logentry-delete-event-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3", @@ -3684,6 +3686,7 @@ "special-characters-group-thai": "Tajski", "special-characters-group-lao": "Laoški", "special-characters-group-khmer": "Kmerski", + "special-characters-group-canadianaboriginal": "Kanadsko aboridžinsko", "special-characters-title-endash": "navaden pomišljaj", "special-characters-title-emdash": "dolgi pomišljaj", "special-characters-title-minus": "znak za minus", @@ -3830,5 +3833,10 @@ "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n
    0.0.0.0/0\n::/0
    ", "revid": "redakcija $1", "pageid": "ID strani $1", - "rawhtml-notallowed": "Oznak <html> ni možno uporabljati izven normalnih strani." + "rawhtml-notallowed": "Oznak <html> ni možno uporabljati izven normalnih strani.", + "gotointerwiki": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}", + "gotointerwiki-invalid": "Naveden naslov je neveljaven.", + "gotointerwiki-external": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}, da obiščete [[$2]], ki je ločena spletna stran.\n\n[$1 Kliknite tukaj, da nadaljujete na $1].", + "undelete-cantedit": "Strani ne morete obnoviti, saj vam ni dovoljeno, da jo urejate.", + "undelete-cantcreate": "Strani ne morete obnoviti, saj stran s tem imenom ne obstaja in je nimate dovoljenja ustvariti." } diff --git a/languages/i18n/sq.json b/languages/i18n/sq.json index 9bde3ad886..08a1a82342 100644 --- a/languages/i18n/sq.json +++ b/languages/i18n/sq.json @@ -446,6 +446,8 @@ "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër", "createacct-submit": "Krijoni llogarinë tuaj", "createacct-another-submit": "Krijo një llogari", + "createacct-continue-submit": "Vazhdo krijimin e llogarisë", + "createacct-another-continue-submit": "Vazhdo krijimin e llogarisë", "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.", "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}", "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}", @@ -470,6 +472,7 @@ "wrongpasswordempty": "Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.", "passwordtooshort": "Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.", "passwordtoolong": "Fjalëkalimet nuk mund të jenë më të gjatë se {{PLURAL:$1|1 karakter|$1 karaktere}}.", + "passwordtoopopular": "Fjalëkalimet e zgjedhura rregullisht nuk mund të përdorën. Ju lutemi zgjedhni një fjalëkalim më unik.", "password-name-match": "Fjalëkalimi juaj duhet të jetë i ndryshëm nga emri juaj.", "password-login-forbidden": "Përdorimi i kësaj nofke dhe fjalëkalimi është i ndaluar.", "mailmypassword": "Ridergo fjalekalimin", @@ -523,8 +526,10 @@ "botpasswords-label-cancel": "Anulo", "botpasswords-label-delete": "Fshi", "botpasswords-label-resetpassword": "Rivendos fjalëkalimin", + "botpasswords-label-grants-column": "Lejuar", "botpasswords-update-failed": "Dështoi për të përditësuar emrin e bot \"$1\". Ishte fshirë?", "resetpass_forbidden": "Fjalëkalimet nuk mund të ndryshohen", + "resetpass_forbidden-reason": "Nuk mund të ndërrohet fjalëkalimi: $1", "resetpass-no-info": "Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.", "resetpass-submit-loggedin": "Ndrysho fjalëkalimin", "resetpass-submit-cancel": "Anulo", @@ -549,11 +554,15 @@ "passwordreset-emailtext-user": "Përdoruesi $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike: \n\n$2\n\n{{PLURAL:$3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL:$5 | një ditë | $5 ditë}}.\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.", "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2", "passwordreset-emailsentemail": "Nëse kjo është një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.", + "passwordreset-emailsentusername": "Nëse një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.", + "passwordreset-invalidemail": "Adresë e-mail-i e pavlefshme", + "passwordreset-nodata": "Nuk është dhënë as emri i përdoruesit e as adresa e emailit", "changeemail": "Ndrysho ose hiq postën elektronike", "changeemail-header": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Nëse do të donit për të hequr ndërlidhjen e ndonjë adrese email nga llogaria juaj, lëreni bosh adresën e re të email-it kur të dorëzoni formularin.", "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.", "changeemail-oldemail": "Adresa aktuale e emailit:", "changeemail-newemail": "Adresa e re e emailit:", + "changeemail-newemail-help": "Kjo fushë duhet të lihet bosh në qoftë se dëshironi të hiqni adresën tuaj të emailit. Nuk do të jeni në gjendje për të resetuar fjalëkalimin e harruar dhe nuk do të merrni email nga kjo wiki nëse adresa e postës elektronike është hequr.", "changeemail-none": "(asgjë)", "changeemail-password": "Fjalëkalimi juaj i {{SITENAME}}:", "changeemail-submit": "Ndrysho postën elektronike", @@ -601,6 +610,7 @@ "blockedtitle": "Përdoruesi është bllokuar", "blockedtext": "'''Llogaria juaj ose adresa e IP është bllokuar'''\n\nBllokimi u bë nga $1 dhe arsyeja e dhënë ishte '''$2'''.\n\n*Fillimi i bllokimit: $8\n*Skadimi i bllokimit: $6\n*I bllokuari i shënjestruar: $7\n\nMund të kontaktoni $1 ose një nga [[{{MediaWiki:Grouppage-sysop}}|administruesit]] e tjerë për të diskutuar bllokimin.\n\nVini re se nuk mund t'i dërgoni email përdoruesit nëse nuk keni një adresë të saktë të dhënë tek [[Special:Preferences|parapëlqimet e përdoruesit]] ose nëse kjo është një nga mundësitë që ju është bllokuar.\n\nAdresa e IP-së që keni është $3 dhe numri i identifikimit të bllokimit është #$5. Përfshini këto dy të dhëna në çdo ankesë.", "autoblockedtext": "IP adresa juaj është bllokuar automatikisht sepse ishte përdorur nga një përdorues tjetër i cili ishte bllokuar nga $1.\nArsyeja e dhënë për këtë është:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nJu mund të kontaktoni $1 ose një tjetër [[{{MediaWiki:Grouppage-sysop}}|administrues]] për ta diskutuar bllokimin.\n\nVini re : që nuk mund ta përdorni mundësinë \"dërgo porosi elektronike\" përveç nëse keni një postë elektronike të vlefshme të regjistruar në [[Special:Preferences|preferencat tuaja]] dhe nuk jeni bllokuar nga përdorimi i saj.\n\nIP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.", + "systemblockedtext": "Emri juaj i përdoruesit ose adresa e IP-së janë bllokuar automatikisht nga MediaWiki. \nArsyeja e dhënë është:\n\n:$2\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nAdresa juaj e IP-së është $3.\nJu lutemi jepni të gjitha këto detaje në çfarëdo pyetje që bëni.", "blockednoreason": "nuk është dhënë asnjë arsye", "whitelistedittext": "Ju duhet të $1 për të redaktuar faqet.", "confirmedittext": "Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj te [[Special:Preferences|parapëlqimet]] e juaja.", @@ -613,7 +623,7 @@ "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.", "newarticle": "(I ri)", "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.", - "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''", + "anontalkpagetext": "----\nKjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \nPrandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\nNë qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim.", "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të krijoni këtë faqe].", "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm], por ju nuk mundeni ta krijoni këtë faqe.", "missing-revision": "Inspektimi #$1 i faqes me emrin \"{{FULLPAGENAME}}\" nuk ekziston.\n\nKjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].", @@ -849,12 +859,12 @@ "searchprofile-advanced-tooltip": "Kërkimi në hapësina", "search-result-size": "$1 ({{PLURAL:$2|1 fjalë|$2 fjalë}})", "search-result-category-size": "{{PLURAL:$1|1 anëtar|$1 anëtarë}} ({{PLURAL:$2|1 nën-kategori|$2 nën-kategori}}, {{PLURAL:$3|1 skedë|$3 skeda}})", - "search-redirect": "(përcjellim $1)", + "search-redirect": "(përcjellim nga $1)", "search-section": "(seksioni $1)", "search-category": "(kategoria $1)", "search-suggest": "Mos kishit në mendje: $1", "search-interwiki-caption": "Projekte simotra", - "search-interwiki-default": "$1 përfundime:", + "search-interwiki-default": "Rezultatet nga $1:", "search-interwiki-more": "(më shumë)", "search-relatedarticle": "Të ngjashme", "searchrelated": "të ngjashme", @@ -889,15 +899,15 @@ "prefs-watchlist-token": "Lista mbikqyrëse shenjë:", "prefs-misc": "Të ndryshme", "prefs-resetpass": "Ndrysho fjalëkalimin", - "prefs-changeemail": "Ndrysho postën elektronike", + "prefs-changeemail": "Ndrysho ose hiq adresën e postës elektronike", "prefs-setemail": "Vendos adresën e postës elektronike", "prefs-email": "Opsionet e emailit", "prefs-rendering": "Pamja", "saveprefs": "Ruaj parapëlqimet", - "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme", + "restoreprefs": "Rikthe të gjitha të dhënat e parazgjedhura (në të gjitha pjesët)", "prefs-editing": "Redaktimi", "searchresultshead": "Kërkimi", - "stub-threshold": "Kufiri për formatin e lidhjeve cung (B):", + "stub-threshold": "Kufiri për formatimin e lidhjeve cung ($1):", "stub-threshold-sample-link": "shembull", "stub-threshold-disabled": "Çaktivizuar", "recentchangesdays": "Numri i ditëve të treguara në ndryshime së fundmi:", @@ -949,7 +959,7 @@ "gender-female": "Ajo redakton faqet wiki", "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.", "email": "Email", - "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.", + "prefs-help-realname": "Emri i vërtetë nuk është i domosdoshëm. \n\nNëse e jepni, mund të përmendeni si kontribuues për punën që keni bërë.", "prefs-help-email": "Dhënia e adresës së emailit është opsionale, por ju mundëson dërgimin e fjalëkalimit të ri të nëse e harroni atë.", "prefs-help-email-others": "Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin.", "prefs-help-email-required": "Nevojitet e-mail adresa .", @@ -958,7 +968,7 @@ "prefs-signature": "Firma", "prefs-dateformat": "Formati i datës", "prefs-timeoffset": "Diferenca kohore", - "prefs-advancedediting": "Opsionet e avancuar", + "prefs-advancedediting": "Opcionet e përgjithshme", "prefs-editor": "redaktor", "prefs-preview": "Parapamje", "prefs-advancedrc": "Opsione të avancuara", @@ -968,13 +978,13 @@ "prefs-displayrc": "Shfaq opsionet", "prefs-displaywatchlist": "Shfaq opsionet", "prefs-diffs": "Ndryshimet", - "userrights": "Ndrysho privilegjet e përdoruesve", - "userrights-lookup-user": "Ndrysho grupet e përdoruesit", + "userrights": "Privilegjet e përdoruesit", + "userrights-lookup-user": "Zgjedh një përdorues", "userrights-user-editname": "Fut emrin e përdoruesit:", - "editusergroup": "Redakto grupet e përdoruesve", + "editusergroup": "Ngarko grupet e përdoruesve", "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} [[User:$1|$1]] $2", - "userrights-editusergroup": "Anëtarësimi tek grupet", - "saveusergroups": "Ruaj Grupin e Përdoruesve", + "userrights-editusergroup": "Ndrysho grupet e {{GENDER:$1|përdoruesit}}", + "saveusergroups": "Ruaj grupet e përdoruesit", "userrights-groupsmember": "{{GENDER:$2|Anëtar i|Anëtare e}}:", "userrights-groupsmember-auto": "{{GENDER:$2|Anëtar i nënkuptuar i|Anëtare e nënkuptuar e}}:", "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).", @@ -983,6 +993,11 @@ "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.", "userrights-changeable-col": "Grupe që mund të ndryshoni", "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni", + "userrights-expiry-current": "Skadon $1", + "userrights-expiry-none": "Nuk skadon", + "userrights-expiry": "Skadon:", + "userrights-expiry-existing": "Koha ekzistuese e skadimit: $3, $2", + "userrights-expiry-othertime": "Kohë tjetër:", "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.", "group": "Grupi:", "group-user": "Përdorues", @@ -1081,6 +1096,7 @@ "grant-editmywatchlist": "Redaktoni listën tuaj mbikqyrëse", "grant-editpage": "Redaktoni faqet ekzistuese", "grant-editprotected": "Redakto faqet e mbrojtura", + "grant-sendemail": "Dërgo e-mail te përdoruesit tjerë", "newuserlogpage": "Regjistri i llogarive", "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur", "rightslog": "Regjistri i privilegjeve të përdoruesit", @@ -1140,6 +1156,43 @@ "recentchanges-legend-heading": "Legjenda:", "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])", "recentchanges-submit": "Shfaq", + "rcfilters-filtergroup-registration": "Regjistrimi i përdoruesit", + "rcfilters-filter-registered-label": "Regjistruar", + "rcfilters-filter-registered-description": "Redaktorët e kyçur", + "rcfilters-filter-unregistered-label": "Ç'regjistruar", + "rcfilters-filtergroup-authorship": "Ndrysho autorsinë", + "rcfilters-filter-editsbyself-label": "Redaktimet tuaja", + "rcfilters-filter-editsbyself-description": "Redaktimet nga ju.", + "rcfilters-filter-editsbyother-label": "Redaktimet nga të tjerët", + "rcfilters-filter-editsbyother-description": "Redaktimet e krijuara nga përdoruesit tjerë (jo ti).", + "rcfilters-filter-user-experience-level-newcomer-label": "Të rinjtë", + "rcfilters-filter-user-experience-level-newcomer-description": "Më pak se 10 redaktime dhe 4 ditë aktivitet.", + "rcfilters-filter-user-experience-level-learner-label": "Nxënës", + "rcfilters-filter-user-experience-level-experienced-label": "Përdorues me përvojë", + "rcfilters-filtergroup-automated": "Kontribute automatike", + "rcfilters-filter-bots-label": "Bot", + "rcfilters-filter-bots-description": "Redaktime të bëra nga vegla automatike.", + "rcfilters-filter-humans-label": "Njeri (jo bot)", + "rcfilters-filter-humans-description": "Redaktimet e bëra nga redaktorët njerëz.", + "rcfilters-filtergroup-reviewstatus": "Statusi i rishikimit", + "rcfilters-filter-patrolled-label": "Patrolluar", + "rcfilters-filter-patrolled-description": "Redaktimet të markuara si të patrolluara", + "rcfilters-filter-unpatrolled-label": "E papatrolluar", + "rcfilters-filter-unpatrolled-description": "Redaktimet e pashënuara si të patrolluara.", + "rcfilters-filtergroup-significance": "Rëndësia", + "rcfilters-filter-minor-label": "Redaktime të vogëla", + "rcfilters-filter-minor-description": "Redaktimet që autori i ka shënuar si të vogla", + "rcfilters-filter-major-label": "Redaktimet jo të vogla", + "rcfilters-filter-major-description": "Redaktimet jo të shënuara si të vogla.", + "rcfilters-filtergroup-changetype": "Lloji i ndryshimit", + "rcfilters-filter-pageedits-label": "Redaktimet e faqes", + "rcfilters-filter-pageedits-description": "Redaktimet e përmbajtjes wiki, diskutimeve, përshkrimit të kategorive...", + "rcfilters-filter-newpages-label": "Krijimet e faqeve", + "rcfilters-filter-newpages-description": "Redaktimet që krijojnë faqe të reja.", + "rcfilters-filter-categorization-label": "Ndryshimet e kategorive", + "rcfilters-filter-categorization-description": "Regjistri i faqeve të shtuara ose hequra nga kategoritë.", + "rcfilters-filter-logactions-label": "Veprimet e regjistruara", + "rcfilters-filter-logactions-description": "Veprimet administrative, krijimet e llogarive, fshirjet e faqeve, ngarkimet...", "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga $3, $4 (deri në $1).", "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2", "rcshowhideminor": "$1 redaktimet e vogla", @@ -1160,6 +1213,7 @@ "rcshowhidemine": "$1 redaktimet e mia", "rcshowhidemine-show": "Shfaq", "rcshowhidemine-hide": "Fshih", + "rcshowhidecategorization": "$1 kategorizim i faqes", "rcshowhidecategorization-show": "Shfaq", "rcshowhidecategorization-hide": "Fshih", "rclinks": "Trego $1 ndryshime gjatë $2 ditëve
    $3", @@ -1185,6 +1239,9 @@ "recentchangeslinked-summary": "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).\nFaqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.", "recentchangeslinked-page": "Emri i faqes:", "recentchangeslinked-to": "Trego ndryshimet e faqeve që lidhen tek faqja e dhënë", + "recentchanges-page-added-to-category": "[[:$1]] shtuar në kategori", + "recentchanges-page-removed-from-category": "[[:$1]] u hoq nga kategoria", + "autochange-username": "Ndryshim automatik i MediaWiki-t", "upload": "Ngarkoni skeda", "uploadbtn": "Ngarkoje", "reuploaddesc": "Kthehu tek formulari i dhënies.", @@ -1562,6 +1619,11 @@ "apisandbox-dynamic-parameters-add-label": "Shto parametër:", "apisandbox-dynamic-parameters-add-placeholder": "Emri i parametrit", "apisandbox-results": "Rezultatet", + "apisandbox-continue": "Vazhdo", + "apisandbox-continue-clear": "Pastro", + "apisandbox-param-limit": "Shkruaj max për të përdorur maksimumin e limitit", + "apisandbox-multivalue-all-namespaces": "$1 (të gjitha hapësirat)", + "apisandbox-multivalue-all-values": "$1 (të gjitha vlerat)", "booksources": "Burime librash", "booksources-search-legend": "Kërkim burimor librash", "booksources-search": "Kërko", @@ -1570,11 +1632,15 @@ "specialloguserlabel": "Performuesi:", "speciallogtitlelabel": "Objektivi (titulli ose përdoruesi):", "log": "Regjistrat", + "logeventslist-submit": "Shfaq", "all-logs-page": "Të gjitha regjistrat", "alllogstext": "Kjo faqe tregon të gjithë regjistrat e mundshëm të {{SITENAME}}.\nJu mund të kufizoni pamje sipas tipit të regjistrit, emrit të përdoruesit (shumë i ndjeshëm), dhe faqes në çështje (edhe rastet e ndjeshme)", "logempty": "Nuk ka asnjë përputhje në regjistër.", "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst", "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.", + "checkbox-all": "Të gjitha", + "checkbox-none": "Asnjë", + "checkbox-invert": "E kundërta", "allpages": "Të gjitha faqet", "nextpage": "Faqja tjetër ($1)", "prevpage": "Faqja e mëparshme ($1)", @@ -1591,6 +1657,7 @@ "cachedspecial-viewing-cached-ts": "Ju jeni duke e parë një version të ruajtur të kësaj faqe, që mund të mos jetë tërësisht e pranishme.", "cachedspecial-refresh-now": "Shikoni të fundit.", "categories": "Kategori", + "categories-submit": "Shfaq", "categoriespagetext": "{{PLURAL:$1|kategoria në vijim përmban|kategoritë në vikim përmbajnë}} faqe ose media.\n[[Special:UnusedCategories|Kategoritë e pa përdorura]] nuk janë të paraqitura këtu.\nShikoni edhe [[Special:WantedCategories|kategoritë e dëshiruara]].", "categoriesfrom": "Paraqit kategoritë duke filluar në:", "deletedcontributions": "Kontribute të grisura", @@ -1627,9 +1694,13 @@ "listgrouprights-removegroup-self": "Hiqni {{PLURAL:$2|grupin|grupet}} nga llogaria: $1", "listgrouprights-addgroup-self-all": "Shtoni të gjitha grupet tek llogaria", "listgrouprights-removegroup-self-all": "Hiq të gjitha grupet nga llogaria", + "trackingcategories-msg": "Kategoria përcjellëse", + "trackingcategories-name": "Emri i porosisë", + "trackingcategories-desc": "Kriteret për përfshirje në kategori", "mailnologin": "S'ka adresë dërgimi", "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.", "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}", + "emailuser-title-target": "Dërgo email te ky përdorues", "emailuser-title-notarget": "Email për përdoruesin", "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.", "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"", @@ -1659,30 +1730,49 @@ "mywatchlist": "Lista mbikqyrëse", "watchlistfor2": "Për $1 $2", "nowatchlist": "Nuk keni asnjë faqe në listën mbikqyrëse.", - "watchlistanontext": "Ju lutemi $1 për të parë redaktimet e artikujve në listë tuaj mbikqyrëse.", + "watchlistanontext": "Ju lutemi kyçuni për të parë ose redaktuar njësitë në listën tuaj mbikëqyrëse.", "watchnologin": "Nuk keni hyrë brënda", "addwatch": "Shto tek lista mbikqyrëse", - "addedwatchtext": "Faqja \"[[:$1]]\" i është shtuar [[Special:Watchlist|listës mbikqyrëse]] tuaj. Ndryshimet e ardhshme të kësaj faqeje dhe faqes së diskutimit të saj do të jepen më poshtë, dhe emri i faqes do të duket i '''trashë''' në [[Special:RecentChanges|listën e ndryshimeve së fundmi]] për t'i dalluar më kollaj.\n\nNë qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, shtypni \"çmbikqyre\" në tabelën e sipërme.", + "addedwatchtext": "\"[[:$1]]\" dhe faqja e saj e diskutimit i është shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].", + "addedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].", + "addedwatchtext-short": "Faqja \"$1\" i është shtuar listës tuaj të mbikëqyrjes.", "removewatch": "Largo nga lista mbikqyrëse", - "removedwatchtext": "Faqja \"[[:$1]]\" është hequr nga [[Special:Watchlist|lista mbikqyrëse e juaj]].", + "removedwatchtext": "\"[[:$1]]\" dhe faqja e saj e diskutimit janë hequr nga [[Special:Watchlist|lista juaj mbikëqyrëse]].", + "removedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë hequr nga [[Special:Watchlist|lista juaj e mbikëqyrjes]].", + "removedwatchtext-short": "Faqja \"$1\" janë hequr nga lista juaj e mbikëqyrjes.", "watch": "Mbikqyre", "watchthispage": "Mbikqyre këtë faqe", "unwatch": "Çmbikqyre", "unwatchthispage": "Mos e mbikqyr", "notanarticle": "Nuk është artikull", "notvisiblerev": "Revizioni është grisur", - "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.", - "wlheader-enotif": "Njoftimi me email është lejuar.", - "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''", - "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.", + "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikëqyrje duke mos numëruar faqet e diskutimit.", + "wlheader-enotif": "Është aktivizuar njoftimi me email.", + "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të trasha.", + "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë $1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|$2''' orët e fundit}}, që nga $3, $4.", "wlshowlast": "Trego $1 orët $2 ditët e fundit", + "watchlist-hide": "Fshih", + "watchlist-submit": "Shfaq", + "wlshowtime": "Periudha e kohës për ta treguar:", + "wlshowhideminor": "redaktime të vogla", + "wlshowhidebots": "botët", + "wlshowhideliu": "përdorues të regjistruar", + "wlshowhideanons": "përdorues anonim", + "wlshowhidepatr": "redaktime të patrulluara", + "wlshowhidemine": "redaktimet e mia", + "wlshowhidecategorization": "kategorizim i faqes", "watchlist-options": "Mundësitë e listës mbikqyrëse", "watching": "Duke mbikqyrur...", "unwatching": "Mos e mbikqyr më...", "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".", "enotif_reset": "Shëno të gjitha faqet e vizituara", "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}", + "enotif_subject_deleted": "{{SITENAME}} faqja $1 është fshirë nga $2", "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2", + "enotif_subject_moved": "{{SITENAME}} faqja $1 është lëvizuar nga $2", + "enotif_subject_restored": "{{SITENAME}} faqja $1 është rikthyer nga $2", + "enotif_subject_changed": "{{SITENAME}} faqja $1 është ndryshuar nga $2", + "enotif_body_intro_deleted": "{{SITENAME}} faqja $1 është fshirë në $PAGEEDITDATE nga $2, shiko $3.", "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.", "enotif_lastdiff": "Shikoni $1 për ndryshime.", "enotif_anon_editor": "përdorues anonim $1", @@ -1697,6 +1787,7 @@ "delete-confirm": "Grise \"$1\"", "delete-legend": "Grise", "historywarning": "'''Kujdes:''' Kjo faqe të cilën po e grisni ka histori me $1 \n{{PLURAL:$1|redaktim|redaktime}}:", + "historyaction-submit": "Shfaq", "confirmdeletetext": "Jeni duke grisur një faqe me tërë historinë e saj. Ju lutemi konfirmoni që po e bëni qëllimisht, që i kuptoni pasojat, dhe që po veproni në përputhje me [[{{MediaWiki:Policy-url}}]].", "actioncomplete": "Veprimi u krye", "actionfailed": "Veprimi dështoi", @@ -1727,6 +1818,7 @@ "sessionfailure": "Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.", "changecontentmodel-title-label": "Titulli i faqes", "changecontentmodel-reason-label": "Arsyeja:", + "changecontentmodel-submit": "Ndrysho", "protectlogpage": "Regjistri i mbrojtjeve", "protectlogtext": "Më poshtë është lista e kyçjeve dhe çkyçjeve të faqes.\nShih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbrojtjeve të faqeve tani në veprim.", "protectedarticle": "mbrojti [[$1]]", @@ -1798,9 +1890,6 @@ "undeleteviewlink": "Pamje", "undeleteinvert": "Selektim anasjelltas", "undeletecomment": "Arsyeja:", - "undeletedrevisions": "$1 {{PLURAL:$1|version u restaurua|versione u restauruan}}", - "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versione}} dhe $2 {{PLURAL:$2|skedë|skeda}} janë restauruar", - "undeletedfiles": "$1 {{PLURAL:$1|skedë u restaurua|skeda u restauruan}}", "cannotundelete": "Disa ose krejt çfshirjet dështuan:\n$1", "undeletedpage": "'''$1 është restauruar'''\n\nShikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurimet së fundmi.", "undelete-header": "Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për faqet e grisura së fundmi.", @@ -1848,6 +1937,7 @@ "sp-contributions-search": "Kërko tek kontributet", "sp-contributions-username": "IP Addresa ose Përdoruesi:", "sp-contributions-toponly": "Trego vetëm redaktimet që janë versionet më të fundit", + "sp-contributions-hideminor": "Fshih redaktimet e vogla", "sp-contributions-submit": "Kërko", "whatlinkshere": "Lidhjet këtu", "whatlinkshere-title": "Faqe që lidhen tek $1", @@ -1866,6 +1956,7 @@ "whatlinkshere-hidelinks": "$1 lidhjet", "whatlinkshere-hideimages": "$1 lidhjet me skedat", "whatlinkshere-filters": "Filtra", + "whatlinkshere-submit": "Shko", "autoblockid": "Autobllokim #$1", "block": "Blloko përdoruesin", "unblock": "Zhblloko përdoruesin", @@ -1898,6 +1989,7 @@ "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara", "ipb-blocklist": "Përdorues dhe IP adresa të bllokuara", "ipb-blocklist-contribs": "Kontributet për {{GENDER:$1|$1}}", + "ipb-blocklist-duration-left": "kanë mbetë $1", "unblockip": "Zhblloko përdoruesin", "unblockiptext": "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi\nnjë përdoruesi ose IP adreseje të bllokuar.", "ipusubmit": "Hiqni këtë bllokim", @@ -1952,6 +2044,7 @@ "block-log-flags-hiddenname": "emri i përdoruesit i fshehur", "range_block_disabled": "Mundësia e administruesve për të bllokuar me shtrirje është çaktivizuar.", "ipb_expiry_invalid": "Afati i kohës është gabim.", + "ipb_expiry_old": "Data e skadencës është në të shkuarën.", "ipb_expiry_temp": "Bllokimet e përdoruesve të fshehur duhet të jenë të përhershme.", "ipb_hide_invalid": "Nuk mund ta prishni këtë llogari; ka më shumë se {{PLURAL:$1|një redaktim|$1 redaktime}}.", "ipb_already_blocked": "\"$1\" është i bllokuar", @@ -1966,6 +2059,7 @@ "proxyblockreason": "IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.", "sorbsreason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.", "sorbs_create_account_reason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.", + "softblockrangesreason": "Kontributet anonime nuk lejohen nga adresa IP e juaj ($1)", "cant-see-hidden-user": "Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.\nPërderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.", "ipbblocked": "Ti nuk mund t'i bllokosh ose zhbllokosh përdoruesit e tjerë, sepse je vet i bllokuar", "ipbnounblockself": "Ju nuk mund të zhbllokoni veten tuaj", @@ -2236,6 +2330,7 @@ "pageinfo-category-pages": "Numri i faqeve", "pageinfo-category-subcats": "Numri i nënkategorive", "pageinfo-category-files": "Numri i skedave", + "pageinfo-user-id": "ID e përdoruesit", "markaspatrolleddiff": "Shënoje si të patrulluar", "markaspatrolledtext": "Shënoje këtë artikull të patrulluar", "markedaspatrolled": "Shënoje të patrulluar", @@ -2248,6 +2343,7 @@ "patrol-log-page": "Regjistri i patrollimeve", "patrol-log-header": "Këto janë të dhëna të revizioneve të patrulluara.", "log-show-hide-patrol": "$1 regjistri i patrollimeve", + "confirm-markpatrolled-button": "Në rregull", "deletedrevision": "Gris versionin e vjetër $1", "filedeleteerror-short": "Gabim gjatë grisjes së skedës: $1", "filedeleteerror-long": "U hasën gabime gjatë grisjes së skedës:\n\n$1", @@ -2679,12 +2775,15 @@ "confirm-watch-top": "Shto këtë faqe në listën mbikqyrëse tuajen?", "confirm-unwatch-button": "Në rregull", "confirm-unwatch-top": "Largo këtë faqe nga lista juaj mbikqyrëse ?", + "confirm-rollback-button": "Në rregull", + "confirm-rollback-top": "Rikthe redaktimet në këtë faqe?", "quotation-marks": "\"$1\"", "imgmultipageprev": "← faqja e mëparshme", "imgmultipagenext": "faqja tjetër →", "imgmultigo": "Shko!", "imgmultigoto": "Shko tek faqja $1", "img-lang-default": "(gjuha e parazgjedhur)", + "img-lang-go": "Shko", "ascending_abbrev": "ngritje", "descending_abbrev": "zbritje", "table_pager_next": "Faqja tjetër", @@ -2715,10 +2814,17 @@ "watchlistedit-raw-done": "Lista mbikëqyrëse u aktualizua.", "watchlistedit-raw-added": "{{PLURAL:$1|1 titull u shtua|$1 tituj u shtuan}}:", "watchlistedit-raw-removed": "{{PLURAL:$1|1 titull u largua|$1 tituj u larguan}}:", + "watchlistedit-clear-title": "Pastro listën e mbikëqyrjes", + "watchlistedit-clear-legend": "Pastro listën e mbikëqyrjes", + "watchlistedit-clear-explain": "Të gjithë titujt do të hiqen nga lista juaj e mbikëqyrjes", + "watchlistedit-clear-titles": "Titujt:", + "watchlistedit-clear-done": "Lista mbikëqyrëse u fshi.", + "watchlisttools-clear": "Pastro listën e mbikëqyrjes", "watchlisttools-view": "Shih ndryshimet e rëndësishme", "watchlisttools-edit": "Shih dhe redakto listën mbikqyrëse.", "watchlisttools-raw": "Redaktoje drejtpërdrejt listën", "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskutimet]])", + "timezone-local": "Lokal", "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".", "version": "Versioni", "version-extensions": "Zgjerime të instaluara", @@ -2736,13 +2842,40 @@ "version-hook-subscribedby": "Abonuar nga", "version-version": "($1)", "version-license": " Liçenca MediaWiki", + "version-ext-license": "Licenca", + "version-ext-colheader-name": "Shtojca", + "version-skin-colheader-name": "Pamja", + "version-ext-colheader-version": "Versioni", + "version-ext-colheader-license": "Licenca", + "version-ext-colheader-description": "Përshkrimi", + "version-ext-colheader-credits": "Autorët", + "version-license-title": "Licenca për $1", + "version-credits-title": "Atribuuimi për $1", "version-poweredby-credits": "Ky wiki është mundësuar nga '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.", "version-poweredby-others": "të tjerë", + "version-poweredby-translators": "përkthyesit e translatewiki.net", + "version-credits-summary": "Dëshirojmë t'i mirënjohim personat në vazhdim për kontributin e tyre [[Special:Version|MediaWiki]].", "version-license-info": "MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.\n\nMediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License për më shumë detaje.\n\nJu duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].", "version-software": "Softuerët e instaluar", "version-software-product": "Produkti", "version-software-version": "Versioni", + "version-entrypoints": "URL-të hyrëse", + "version-entrypoints-header-entrypoint": "Pika hyrëse", "version-entrypoints-header-url": "URL", + "version-libraries": "Libraritë e instaluara", + "version-libraries-library": "Librari", + "version-libraries-version": "Versioni", + "version-libraries-license": "Licenca", + "version-libraries-description": "Përshkrimi", + "version-libraries-authors": "Autorët", + "redirect-submit": "Shko", + "redirect-lookup": "Kërko:", + "redirect-value": "Vlera:", + "redirect-user": "ID e përdoruesit", + "redirect-page": "ID-ja e faqes", + "redirect-revision": "Versioni i faqes", + "redirect-file": "Emri i skedës", + "redirect-not-exists": "Vlera nuk u gjet", "fileduplicatesearch": "Kërkoni për skeda të dyfishta", "fileduplicatesearch-summary": "Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).", "fileduplicatesearch-filename": "Emri i skedës:", @@ -2752,6 +2885,7 @@ "fileduplicatesearch-result-n": "Skeda \"$1\" ka {{PLURAL:$2|1 dyfishim|$2 dyfishime}}.", "fileduplicatesearch-noresults": "Nuk u gjet asnjë skedë me emrin \"$1\".", "specialpages": "Faqet speciale", + "specialpages-note-top": "Legjenda", "specialpages-note": "* Faqet speciale normale.\n* Faqet speciale të kufizuara.", "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje", "specialpages-group-other": "Faqe speciale të tjera", @@ -2765,6 +2899,7 @@ "specialpages-group-wiki": "Të dhënat dhe veglat", "specialpages-group-redirects": "Përcjellime tek faqet speciale", "specialpages-group-spam": "Mjetet për spam", + "specialpages-group-developer": "Veglat e zhvilluesit", "blankpage": "Faqe e zbrazët", "intentionallyblankpage": "Kjo faqe me qëllim është lënë e zbrazët", "external_image_whitelist": "#Lëreni këtë rresht ashtu siç është
    \n#Vendosni shprehje fragmentesh të rregullta (vetëm pjesën që shkon ndërmjet //) poshtë\n#Këto do të krahasohen me URL-të  e figurave të jashtme\n#Ato që përputhen do të shfaqen si figura, të tjerat do të shfaqen vetëm si një lidhje\n#Rreshtat që fillojnë me # trajtohen si komente\n#Kjo është shumë e ndjeshme\n\n#Vendosini të fragmentet sipër këtij rreshti. Lëreni këtë rresht ashtu siç është
    ", @@ -2777,12 +2912,27 @@ "tags-tag": "Emri i etiketës", "tags-display-header": "Pamja në listat e ndryshimeve", "tags-description-header": "Përshkrimi i plotë i kuptimit", + "tags-source-header": "Burimi", + "tags-active-header": "Aktiv?", "tags-hitcount-header": "Ndrzshimet e etikuara", + "tags-actions-header": "Veprimet", + "tags-active-yes": "Po", + "tags-active-no": "Jo", + "tags-source-extension": "Definuar nga softueri", + "tags-source-none": "Nuk përdorët më", "tags-edit": "redakto", + "tags-delete": "fshi", + "tags-activate": "aktivizo", + "tags-deactivate": "ç'aktivizo", "tags-hitcount": "$1 {{PLURAL:$1|ndryshim|ndryshime}}", + "tags-create-heading": "Krijoni një etiketë të re", + "tags-create-tag-name": "Emri i etiketës:", "tags-create-reason": "Arsyeja:", + "tags-create-submit": "Krijoni", + "tags-delete-title": "Gris etiketën", "tags-delete-reason": "Arsyeja:", "tags-activate-reason": "Arsyeja:", + "tags-activate-submit": "Aktivizo", "tags-deactivate-reason": "Arsyeja:", "tags-edit-reason": "Arsyeja:", "comparepages": "Krahasoni faqet", @@ -2810,6 +2960,11 @@ "htmlform-submit": "Dërgo", "htmlform-reset": "Zhbëj ndryshimin", "htmlform-selectorother-other": "Gjitha", + "htmlform-date-placeholder": "VVVV-MM-DD", + "htmlform-time-placeholder": "OO:MM:SS", + "htmlform-datetime-placeholder": "VVVV-MM-DD OO:MM:SS", + "htmlform-title-not-exists": "$1 nuk ekziston.", + "htmlform-user-not-exists": "$1 nuk ekziston.", "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3", "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3", "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4", @@ -2854,11 +3009,13 @@ "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3", "rightsnone": "(asgjë)", "feedback-adding": "Duke shtuar përshtypjen te faqja...", + "feedback-back": "Prapa", "feedback-bugcheck": "Shumë mirë! Thjesht kontrolloni që nuk është një nga [$1 problemet e njohura].", "feedback-bugnew": "E kontrollova. Raporto një problem të ri", "feedback-bugornote": "Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].\nPërndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të shtohet te faqja \"[$3 $2]\"\", së bashku me emrin tuaj të përdoruesit dhe shfletuesin të cilin jeni duke përdorur.", "feedback-cancel": "Anulo", "feedback-close": "Përfunduar", + "feedback-dialog-title": "Dërgo përshtypjet", "feedback-error1": "Gabim: Rezultat i panjohur nga API", "feedback-error2": "Gabim: Redaktimi dështoi", "feedback-error3": "Gabim: Nuk ka përgjigje nga API", @@ -2888,24 +3045,91 @@ "expand_templates_title": "Titulli i faqes për rrethanën, si {{FULLPAGENAME}} etj.:", "expand_templates_input": "Teksti me stampa:", "expand_templates_output": "Parapamja", + "expand_templates_xml_output": "Rezultat XML", "expand_templates_ok": "Shko", "expand_templates_remove_comments": "Hiq komentet", + "expand_templates_preview": "Parapamje", + "pagelanguage": "Ndrysho gjuhën e faqës", + "pagelang-name": "Faqja", + "pagelang-language": "Gjuha", + "pagelang-use-default": "Përdor gjuhën e parazgjedhur", + "pagelang-select-lang": "Zgjedh gjuhën", + "pagelang-reason": "Arsyeja", + "pagelang-submit": "Dërgo", + "pagelang-nonexistent-page": "Faqja $1 nuk ekziston.", + "right-pagelang": "Ndrysho gjuhën e faqës", + "action-pagelang": "ndrysho gjuhën e faqës", + "mediastatistics-table-mimetype": "Lloji MIME", + "mediastatistics-table-extensions": "Shtojcat e mundshme", + "mediastatistics-table-count": "Numri i skedave", + "mediastatistics-table-totalbytes": "Madhësia e kombinuar", + "mediastatistics-header-unknown": "I panjohur", + "mediastatistics-header-bitmap": "Imazh bitmap", + "mediastatistics-header-drawing": "Vizatime (imazhe vektor)", + "mediastatistics-header-audio": "Zërim", + "mediastatistics-header-video": "Video", + "mediastatistics-header-multimedia": "Media e pasur", + "mediastatistics-header-office": "Zyrë", + "mediastatistics-header-text": "Tekstor", + "mediastatistics-header-executable": "Të ekzekutueshmet", + "mediastatistics-header-archive": "Formate të komprimuara", + "mediastatistics-header-total": "Të gjitha skedat", "special-characters-group-latin": "Latinisht", "special-characters-group-latinextended": "Latanisht, zgjeruar", "special-characters-group-ipa": "Alfabeti Fonetik Ndërkombëtar (IPA)", "special-characters-group-symbols": "Simbolet", "special-characters-group-greek": "Grezisht", + "special-characters-group-greekextended": "Greke e zgjeruar", "special-characters-group-cyrillic": "Cirilik", "special-characters-group-arabic": "Arabisht", + "special-characters-group-arabicextended": "Arabishte e zgjeruar", "special-characters-group-persian": "Persisht", "special-characters-group-hebrew": "Hebraisht", "special-characters-group-bangla": "Bengalisht", + "special-characters-group-tamil": "Tamil", "special-characters-group-telugu": "Telugu", "special-characters-group-sinhala": "Singhalisht", "special-characters-group-gujarati": "Guxharati", + "special-characters-group-devanagari": "Devanagari", "special-characters-group-thai": "Thai", "special-characters-group-lao": "Lao", "special-characters-group-khmer": "Khmer", + "special-characters-title-endash": "viza e gjatë", + "special-characters-title-emdash": "viza më e gjatë", + "special-characters-title-minus": "shenja minus", + "mw-widgets-dateinput-no-date": "Nuk u zgjedh data", "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD", - "mw-widgets-dateinput-placeholder-month": "VVVV-MM" + "mw-widgets-dateinput-placeholder-month": "VVVV-MM", + "mw-widgets-mediasearch-input-placeholder": "Kërko media", + "mw-widgets-mediasearch-noresults": "Nuk është gjetur asnjë rezultat.", + "log-action-filter-all": "Të gjitha", + "log-action-filter-block-block": "Blloko", + "authmanager-email-label": "Email", + "authmanager-email-help": "Adresa e emailit:", + "authmanager-realname-label": "Emri i vërtetë", + "authmanager-realname-help": "Emri i vërtetë i përdoruesit", + "authmanager-provider-temporarypassword": "Fjalëkalim i përkohshëm", + "authprovider-resetpass-skip-label": "Kapërce", + "changecredentials": "Ndërro kredencialet", + "changecredentials-submit": "Ndërro kredencialet", + "changecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.", + "changecredentials-success": "Kredencialet tuaja kanë ndryshuar.", + "removecredentials": "Hiq kredencialet", + "removecredentials-submit": "Hiq kredencialet", + "removecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.", + "removecredentials-success": "Kredencialet tuaja kanë ndryshuar.", + "credentialsform-provider": "Tipi i kredencialit:", + "credentialsform-account": "Emri i llogarisë:", + "cannotlink-no-provider-title": "Nuk ka llogari të lidhshme", + "cannotlink-no-provider": "Nuk ka llogari të lidhshme.", + "linkaccounts": "Lidh llogari", + "linkaccounts-success-text": "Llogaria është lidhur.", + "linkaccounts-submit": "Lidh llogari", + "unlinkaccounts": "Ndaj llogaritë", + "unlinkaccounts-success": "Llogaria është ndarë.", + "restrictionsfield-badip": "Adresë ose varg IP-je e parregulltë: $1", + "restrictionsfield-label": "Vargu i lejuar i IP-së:", + "revid": "versioni $1", + "pageid": "ID e faqes $1", + "rawhtml-notallowed": "<html> etiketat nuk mund të përdorën jashtë faqeve normale." } diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json index cba221ef36..9ea137fe5e 100644 --- a/languages/i18n/sr-ec.json +++ b/languages/i18n/sr-ec.json @@ -2022,9 +2022,6 @@ "undeleteviewlink": "погледај", "undeleteinvert": "Обрни избор", "undeletecomment": "Разлог:", - "undeletedrevisions": "{{PLURAL:$1|измена враћено}} $1", - "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}", - "undeletedfiles": "{{PLURAL:$1|датотека враћено}} $1", "cannotundelete": "Враћање једне или свих ставник није успјело:\n$1", "undeletedpage": "Страница $1 је враћена\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.", "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.", diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json index db5fb1619e..141dea8929 100644 --- a/languages/i18n/sr-el.json +++ b/languages/i18n/sr-el.json @@ -1948,9 +1948,6 @@ "undeleteviewlink": "pogledaj", "undeleteinvert": "Obrni izbor", "undeletecomment": "Razlog:", - "undeletedrevisions": "{{PLURAL:$1|izmena vraćeno}} $1", - "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}", - "undeletedfiles": "{{PLURAL:$1|datoteka vraćeno}} $1", "cannotundelete": "Vraćanje nije uspelo:\n$1", "undeletedpage": "Stranica $1 je vraćena\n\nPogledajte [[Special:Log/delete|dnevnik brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.", "undelete-header": "Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.", diff --git a/languages/i18n/su.json b/languages/i18n/su.json index 11d779a220..880beff1bd 100644 --- a/languages/i18n/su.json +++ b/languages/i18n/su.json @@ -11,11 +11,12 @@ "Urhixidur", "לערי ריינהארט", "아라", - "Macofe" + "Macofe", + "Uchup19" ] }, "tog-underline": "Gurat-handapan tutumbu", - "tog-hideminor": "Sumputkeun éditan minor dina nu anyar robah", + "tog-hideminor": "Sumputkeun éditan minor dina anyar robah", "tog-hidepatrolled": "Sumputkeun anu geus diroris ti béréndélan nu anyar robah", "tog-newpageshidepatrolled": "Sumputkeun nu geus diroris tina béréndélan kaca anyar", "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun", @@ -55,10 +56,10 @@ "tog-prefershttps": "Salawasna paké sambungan aman nalika asup log", "underline-always": "Salawasna", "underline-never": "Ulah", - "underline-default": "Buhunna kulit atawa panyungsi", - "editfont-style": "Gaya aksara dina kotak éditan:", - "editfont-default": "Luyu jeung buhunna panyungsi", - "editfont-monospace": "Aksara monospasi", + "underline-default": "Kalakop atawa panyungsi bawaan", + "editfont-style": "Gaya tulisan komputer dina kotak éditan:", + "editfont-default": "Bawaan panyungsi", + "editfont-monospace": "Tulisan monospasi", "editfont-sansserif": "Aksara Sans-serif", "editfont-serif": "Aksara Serif", "sunday": "Minggu", @@ -68,7 +69,7 @@ "thursday": "Kemis", "friday": "Jumaah", "saturday": "Saptu", - "sun": "Ming", + "sun": "Min", "mon": "Sen", "tue": "Sal", "wed": "Reb", @@ -159,15 +160,15 @@ "faq": "NLD", "faqpage": "Project:NLD", "actions": "Peta", - "namespaces": "Spasi ngaran", + "namespaces": "Ngaranspasi", "variants": "Varian", - "navigation-heading": "Ménu navigasi", + "navigation-heading": "Menu navigasi", "errorpagetitle": "Kasalahan", "returnto": "Balik deui ka $1.", "tagline": "Ti {{SITENAME}}", "help": "Pitulung", - "search": "Sungsi", - "searchbutton": "Sungsi", + "search": "Paluruh", + "searchbutton": "Paluruh", "go": "Jung", "searcharticle": "Jung", "history": "Jujutan kaca", @@ -220,7 +221,7 @@ "protectedpage": "Kaca nu dikonci", "jumpto": "Luncat ka:", "jumptonavigation": "pituduh", - "jumptosearch": "sungsi", + "jumptosearch": "paluruh", "view-pool-error": "Punten, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu kaca.\nMangga cobian sanés waktos.\n\n$1", "generic-pool-error": "Hampura, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu sumberdaya.\nAntosan sakedap, engké cobaan deui.", "pool-timeout": "Béakeun waktu nungguan konci", @@ -251,7 +252,7 @@ "versionrequired": "Butuh MediaWiki vérsi $1", "versionrequiredtext": "Butuh MediaWiki vérsi $1 pikeun migunakeun ieu kaca. Mangga tingal [[Special:Version|kaca vérsi]]", "ok": "Heug", - "retrievedfrom": "Disalin ti \"$1\"", + "retrievedfrom": "Dicomot ti \"$1\"", "youhavenewmessages": "Anjeun boga $1 ($2).", "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun boga}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).", "youhavenewmessagesmanyusers": "Anjeun boga $1 ti pamaké lian ($2).", @@ -340,7 +341,7 @@ "title-invalid-talk-namespace": "Judul kaca anu dipénta nujul ka kaca obrolan anu teu mungkin aya.", "title-invalid-characters": "Judul kaca anu dipénta ngandung karakter anu henteu sah: \"$1\".", "title-invalid-relative": "Judul ngandung jalur rélatip. Judul kaca rélatip (./, ../) henteu sah, kusabab bakal mindeng teu kahontal nalika dibuka maké browser pamaké.", - "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung sékuéns gelombang sulap (~~~).", + "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung tilda anu teu sah (~~~).", "title-invalid-too-long": "Judul kaca anu dipundut panjang teuing. Ulah leuwih ti $1 {{PLURAL:$1|bit}} dina panyandi UTF-8.", "title-invalid-leading-colon": "Judul kaca anu dipénta dimimitian ku kolon anu henteu sah.", "perfcached": "Data di handap ieu mangrupa 'cache' sahingga bisa jadi henteu mutahir. 'Cache' nyadiakeun paling loba {{PLURAL:$1|hiji hasil|$1 hasil}}.", @@ -822,7 +823,7 @@ "searchprofile-advanced-tooltip": "Paluruh di rohang ngaran anu tangtu", "search-result-size": "$1 ({{PLURAL:$2|1 kecap|$2 kecap}})", "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})", - "search-redirect": "(alihan $1)", + "search-redirect": "(dipindahkeun ti $1)", "search-section": "(bagean $1)", "search-category": "(kategori $1)", "search-file-match": "(cocog jeung eusi berkas)", @@ -848,7 +849,7 @@ "mypreferences": "Préferénsi", "prefs-edits": "Jumlah éditan:", "prefsnologintext2": "Mangga asup log pikeun ngarobah préferénsi anjeun.", - "prefs-skin": "Kulit", + "prefs-skin": "Kalakop", "skin-preview": "Pramidang", "datedefault": "Tanpa préferénsi", "prefs-labs": "Fitur Labs", @@ -988,11 +989,11 @@ "right-move-categorypages": "Pindahkeun kaca kategori", "right-movefile": "Mindahkeun berkas", "right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca", - "right-upload": "Muatkeun koropak", + "right-upload": "Unjal berkas", "right-reupload": "Nimpah koropak nu geus aya", "right-reupload-own": "Nimpah koropak nu geus aya nu dimuat ku sorangan", "right-reupload-shared": "Nampik gambar-gambar dina média lokal babarengan", - "right-upload_by_url": "Muatkeun koropak ti hiji alamat URL", + "right-upload_by_url": "Unjal berkas tina alamat URL", "right-purge": "Ngahapus sindangan tina kaca tanpa kaca konfirmasi", "right-autoconfirmed": "Ngédit kaca nu semi dikonci", "right-bot": "Anggap salaku prosés otomatis", @@ -1131,15 +1132,15 @@ "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.", "recentchangeslinked-page": "Ngaran kaca:", "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud", - "upload": "Muat berkas", - "uploadbtn": "Muatkeun koropak", + "upload": "Unjal berkas", + "uploadbtn": "Unjal berkas", "reuploaddesc": "Balik ka formulir muatan.", "uploadnologin": "Can asup log", "uploadnologintext": "Mangga $1 pikeun ngunggah berkas.", "upload_directory_read_only": "Diréktori muatan ($1) teu bisa ditulis ku server ramat.", "uploaderror": "Kasalahan muat", "upload-recreate-warning": "'''Awas: berkas nu ngaranna kitu geus kungsi dihapus atawa dipindahkeun.'''\n\nLog hahapus jeung pipindah pikeun ieu kaca dipidangkeun di handap:", - "uploadtext": "HEUP! Méméh anjeun ngamuat di dieu, pastikeun yén anjeun geus maca sarta tumut ka kawijakan maké gambar.\n\nMun geus aya koropak na wiki nu ngaranna sarua jeung nu disebutkeun ku anjeun, koropak nu geus lila bakal diganti otomatis. Mangka, iwal ti pikeun ngaropéa hiji koropak, tangtu leuwih hadé mun anjeun mariksa heula bisi koropak nu sarupa geus aya.\n\nPikeun némbongkeun atawa néang gambar-gambar nu pernah dimuat saméméhna, mangga lebet ka [[Special:FileList|daptar gambar nu dimuat]]. Muatan sarta hapusan kadaptar dina log [[Special:Log/upload|log muatan]].\n\nPaké formulir di handap pikeun ngamuat koropak gambar anyar pikeun ilustrasi kaca anjeun. Na kalolobaan panyungsi, anjeun bakal manggihan tombol \"Sungsi/''Browse''...\", nu bakal nganteur ka dialog muka-koropak nu baku na sistim operasi anjeun. Milih hiji koropak bakal ngeusian ngaran koropakna kana rohangan téks gigireun tombol nu tadi. Anjeun ogé kudu nyontréng kotak nu nandakeun yén anjeun teu ngarumpak hak cipta batur ku dimuatna ieu koropak. Pencét tombol \"Muatkeun/''Upload''\" pikeun ngeréngsékeun muatan. Prosés ieu bisa lila mun anjeun migunakeun sambungan internét nu lambat.\n\nFormat nu dianjurkeun nyéta JPEG pikeun gambar fotografik, PNG pikeun hasil ngagambar sarta gambar séjénna, sarta OGG pikeun sora. Pilih ngaran koropak nu déskriptif sangkan teu ngalieurkeun. Pikeun ngasupkeun gambarna na kaca séjén, pigunakeun tumbu dina wujud\n* '''[[{{ns:file}}:Gambar.jpg]]''' pikeun gambar dina ukuran aslina\n* '''[[{{ns:media}}:Berkas.ogg]]''' pikeun sora.\n\nCatet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anjeun mun maranéhna nganggap ieu saluyu jeung kapentingan proyék, sarta anjeun bisa waé dipeungpeuk ti ngamuat koropak mun anjeun ngaruksak/ngaganggu sistim.", + "uploadtext": "Gunakeun formulir di handap pikeun ngunjal berkas.\nPikeun midangkeun atawa maluruh berkas anu saméméhna diunjal, sorang [[Special:FileList|daptar berkas]]. Unjalan (ulang) ogé kacatet kana [[Special:Log/upload|log unjalan]], sedengkeun pamupusan mah kacatetna dina [[Special:Log/delete|log pamupusan]].\n\nPikeun midangkeun atawa nerapkeun berkas kana kaca mah migunakeun tutumbu salah sahiji format di handap:\n* '''[[{{ns:file}}:Berkas.jpg]]''' pikeun midangkeun berkas dina ukuran aslina\n* '''[[{{ns:file}}:Berkas.png|200px|thumb|left|téks alternatif]]''' pikeun midangkeun berkas nu rubakna 200px na jero kotak, nitih di kéncaeun kaca bari aya tulisan 'téks alternatif' minangka kamandang gambar\n* '''[[{{ns:media}}:Berkas.ogg]]''' minangka tutumbu langsung kana berkas anu dimaksud tanpa kudu midangkeun éta berkas liwat wiki", "upload-permitted": "Tipeu koropak nu diwidian: $1.", "upload-preferred": "Tipeu koropak nu dianjurkeun: $1.", "upload-prohibited": "Tipeu koropak nu dicaram: $1.", @@ -1178,7 +1179,7 @@ "fileexists": "Koropak nu ngaranna kieu geus aya, mangga parios [[:$1]] mun anjeun teu yakin rék ngaganti.\n[[$1|thumb]]", "fileexists-extension": "Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]\n* Ngaran berkas nu dimuat: [[:$1]]\n* Ngaran berkas nu geus aya: [[:$2]]\nPilih ngaran séjén.", "fileexists-forbidden": "Berkas nu ngaranna kitu geus aya sarta teu bisa ditimpah.\nMun anjeun keukeuh rék ngunggahkeun berkas anjeun, mangga balik deui sarta paké ngaran anyar.\n[[File:$1|thumb|center|$1]]", - "fileexists-shared-forbidden": "Koropak nu ngaranna ieu geus aya dina gudang koropak babagi (''shared file repository''); mangga balik deui sarta muatkeun koropak ieu maké ngaran nu béda. [[File:$1|thumb|center|$1]]", + "fileexists-shared-forbidden": "Gening berkas téh geus aya nu ngaranna sarua dina répositori berkas reujeung.\nMun anjeun keukeuh hayang ngunjal ieu berkas, sok ganti heula ngaranna ku ngaran nu béda. [[File:$1|thumb|center|$1]]", "file-exists-duplicate": "Gambar ieu duplikat ti {{PLURAL:$1|gambar|gambar}}:", "file-deleted-duplicate": "Berkas anu sarua jeung [[:$1]] geus kungsi dihapus.\nPariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.", "uploadwarning": "Pépéling ngamuat", @@ -1202,6 +1203,7 @@ "upload-file-error": "Kasalahan internal", "upload-misc-error": "Kasalahan muat anu teu kanyahoan", "upload-http-error": "Aya galat HTTP: $1", + "upload-dialog-title": "Unjal berkas", "backend-fail-backup": "Teu bisa nyadangkeun berkas \"$1\".", "backend-fail-notexists": "Berkas $1 euweuh.", "backend-fail-notsame": "Berkas anu teu-identik geus aya di $1.", @@ -1322,7 +1324,7 @@ "statistics-articles": "Halaman eusi", "statistics-pages": "Kaca", "statistics-pages-desc": "Sakabéh kaca di ieu wiki, kaasup kaca obrolan, alihan, jeung nu lianna.", - "statistics-files": "Koropak nu geus dimuat", + "statistics-files": "Berkas nu geus diunjal", "statistics-edits": "Ëditan kaca ti saprak {{SITENAME}} mimiti dibuka", "statistics-edits-average": "Rata-rata éditan unggal kaca", "statistics-users": "[[Special:ListUsers|Kontributor]] kadaptar", @@ -1603,7 +1605,7 @@ "restriction-edit": "Édit", "restriction-move": "Pindahkeun", "restriction-create": "Jieun", - "restriction-upload": "Muatkeun koropak", + "restriction-upload": "Unjal berkas", "restriction-level-sysop": "konci rékép", "restriction-level-autoconfirmed": "konci logor", "restriction-level-all": "sadaya hambalan", @@ -1621,9 +1623,6 @@ "undeletelink": "tempo/pulangkeun", "undeleteviewlink": "tempo", "undeletecomment": "Alesan:", - "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} disimpen deui", - "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 berkas|$2 berkas}} geus dibalikkeun", - "undeletedfiles": "{{PLURAL:$1|1 berkas|$1 berkas}} dibalikkeun", "cannotundelete": "Gagal ngabolaykeun hapusan; sigana kapiheulaan ngabolaykeun hapusan ku nu séjén.", "undeletedpage": "'''$1 hasil dibalikeun'''\n\nTempo [[Special:Log/delete|log hapusan]] keur data ngahapus jeung malikeun.", "undelete-header": "Tempo [[Special:Log/delete|log hapusan]] pikeun béréndélan kaca nu anyar dihapus.", @@ -1641,6 +1640,8 @@ "namespace": "Ngaranspasi:", "invert": "Balikkeun pilihan", "tooltip-invert": "Contang ieu kotak pikeun nyumputkeun parobahan kaca-kaca dina ruang nama anu dipilih (jeung ruang nama anu tumali, lamun dicontang)", + "namespace_association": "Ngaranspasi nu patali", + "tooltip-namespace_association": "Céklis ieu kotak pikeun ngaitkeun ngaranspasi atawa judul ngaranspasi jeung ngaranspasi nu dipilih", "blanknamespace": "(Utama)", "contributions": "Kontribusi {{GENDER:$1|pamaké}}", "contributions-title": "Sumbangan tulisan ti $1", @@ -1678,7 +1679,7 @@ "whatlinkshere-prev": "$1 {{PLURAL:$1|saméméhna}}", "whatlinkshere-next": "$1 {{PLURAL:$1|salajengna}}", "whatlinkshere-links": "← tutumbu", - "whatlinkshere-hideredirs": "$1 alihan", + "whatlinkshere-hideredirs": "$1 pangalihan", "whatlinkshere-hidetrans": "$1 transklusi", "whatlinkshere-hidelinks": "$1 tutumbu", "whatlinkshere-hideimages": "$1 tutumbu berkas", @@ -1888,7 +1889,7 @@ "tooltip-pt-preferences": "Préferénsi {{GENDER:|anjeun}}", "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.", "tooltip-pt-mycontris": "Béréndélan kontribusi {{GENDER:|anjeun}}", - "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib", + "tooltip-pt-login": "Leuwih hadé asup log, sok sanajan teu wajib", "tooltip-pt-logout": "Kaluar log", "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log", "tooltip-ca-talk": "Sawala ngeunaan eusi kaca", @@ -1902,16 +1903,16 @@ "tooltip-ca-move": "Pindahkeun kaca ieu", "tooltip-ca-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring", "tooltip-ca-unwatch": "Kaluarkeun kaca ieu tina awaskeuneun kuring", - "tooltip-search": "Sungsi di {{SITENAME}}", + "tooltip-search": "Paluruh di {{SITENAME}}", "tooltip-search-go": "Jugjug kaca nu ngaranna ciples kieu (mun aya)", - "tooltip-search-fulltext": "Sungsi kaca-kaca nu ngandung tulisan ieu", - "tooltip-p-logo": "Tepas", + "tooltip-search-fulltext": "Paluruh kaca-kaca nu ngandung ieu tulisan", + "tooltip-p-logo": "Jugjug tepas", "tooltip-n-mainpage": "Sindang ka Tepas", - "tooltip-n-mainpage-description": "Jugjug Tepas", + "tooltip-n-mainpage-description": "Jugjug tepas", "tooltip-n-portal": "Ngeunaan proyékna, naon nu bisa dipigawé, di mana néanganana", "tooltip-n-currentevents": "Panggihan iber ngeunaan naon baé nu keur lumangsung", "tooltip-n-recentchanges": "Béréndélan nu anyar robah dina wiki", - "tooltip-n-randompage": "Muatkeun kaca naon baé", + "tooltip-n-randompage": "Muatkeun kaca acak", "tooltip-n-help": "Tempat pikeun néangan pitulung", "tooltip-t-whatlinkshere": "Béréndélan sakabéh kaca wiki anu nutumbu ka dieu", "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu", @@ -1919,7 +1920,7 @@ "tooltip-feed-atom": "Asupan atom pikeun kaca ieu", "tooltip-t-contributions": "Béréndélan kontribusi ti {{GENDER:$1|ieu pamaké}}", "tooltip-t-emailuser": "Kirim surélék ka ieu kontributor", - "tooltip-t-upload": "Ngunggahkeun berkas", + "tooltip-t-upload": "Unjal berkas", "tooltip-t-specialpages": "Daptar sadaya kaca husus", "tooltip-t-print": "Vérsi citakeun ieu kaca", "tooltip-t-permalink": "Tutumbu permanén ka ieu ieu vérsi", @@ -1939,7 +1940,7 @@ "tooltip-diff": "Témbongkeun parobahan mana nu geus dijieun.", "tooltip-compareselectedversions": "Tempo béda antara dua vérsi kaca ieu nu dipilih.", "tooltip-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring", - "tooltip-upload": "Muatkeun", + "tooltip-upload": "Prung unjalkeun", "tooltip-rollback": "Mulangkeun éditan ka panulis panungtung dina sakali klik", "tooltip-undo": "\"Bolay\" malikkeun ieu éditan sarta muka kotak édit dina modeu pramidang.\nCara kieu bisa nambahkeun alesan dina ringkesanana.", "tooltip-preferences-save": "Simpen préferénsi", @@ -2253,7 +2254,7 @@ "monthsall": "kabéh", "confirmemail": "Konfirmasi alamat surélék", "confirmemail_noemail": "Alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]] anjeun teu sah.", - "confirmemail_text": "Ieu {{SITENAME}} butuh sangkan anjeun mastikeun alamat surélék saméméh migunakeun fitur surélék.\nAktipkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.", + "confirmemail_text": "{{SITENAME}} téh anjeun kudu ngonfirmasi alamat surélék sangkan bisa migunakeun fiturna.\nKlik tombol di handap pikeun ngirimkeun talatah nu eusina konfirmasieun kana alamat anjeun. Eusi talatahna ngandung tutumbu kodeu; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.", "confirmemail_pending": "Kecap sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun anyar nyieun akun, mangga antos sababaraha menit saméméh mundut kecap sandi anyar.", "confirmemail_send": "Kirimkeun surat konfirmasi sandi", "confirmemail_sent": "Surélék konfirmasi geus dikirim.", @@ -2338,7 +2339,7 @@ "specialpages-group-other": "Kaca husus lainna", "specialpages-group-login": "Asup log / jieun akun", "specialpages-group-changes": "Nuanyar robah sarta log", - "specialpages-group-media": "Laporan sarta muatkeun koropak", + "specialpages-group-media": "Laporan jeung unjalan berkas", "specialpages-group-users": "Pamaké sarta hak pamaké", "specialpages-group-highuse": "Pamakéan kaca nu badag", "specialpages-group-pages": "Daptar kaca", @@ -2377,13 +2378,13 @@ "revdelete-restricted": "akses geus dibatesan ukur keur kuncén", "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun", "logentry-move-move": "$1 {{GENDER:$2|mindahkeun}} kaca $3 ka $4", - "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}", + "logentry-newusers-create": "Akun pamaké $1 geus {{GENDER:$2|dijieun}}", "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3", "rightsnone": "(euweuh)", "feedback-cancel": "Bolay", "feedback-message": "Surat:", "feedback-subject": "Ngeunaan:", - "searchsuggest-search": "Sungsi", + "searchsuggest-search": "Sungsi di {{SITENAME}}", "searchsuggest-containing": "ngandung...", "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}", "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}", diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json index 29de95c174..9f560bbd49 100644 --- a/languages/i18n/sv.json +++ b/languages/i18n/sv.json @@ -2280,9 +2280,6 @@ "undeleteviewlink": "visa", "undeleteinvert": "Invertera urval", "undeletecomment": "Anledning:", - "undeletedrevisions": "{{PLURAL:$1|en version återställd|$1 versioner återställda}}", - "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda", - "undeletedfiles": "{{PLURAL:$1|en fil återställd|$1 filer återställda}}", "cannotundelete": "En del eller alla återställningar misslyckades:\n$1", "undeletedpage": "'''$1 har återställts'''\n\nSe [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.", "undelete-header": "Se [[Special:Log/delete|raderingsloggen]] för nyligen raderade sidor.", diff --git a/languages/i18n/tet.json b/languages/i18n/tet.json index 7b73c939b3..a2114dec56 100644 --- a/languages/i18n/tet.json +++ b/languages/i18n/tet.json @@ -270,6 +270,7 @@ "revdelete-radio-set": "Sin", "revdelete-radio-unset": "Lae", "revdelete-edit-reasonlist": "Edita lista motivu nian", + "history-title": "$1: Istória revisaun nian", "lineno": "Liña $1:", "searchresults": "Rezultadu sira", "searchresults-title": "Rezultadu sira ba buka \"$1\"", @@ -507,7 +508,6 @@ "undeletelink": "lee/restaurar", "undeleteviewlink": "haree", "undeletecomment": "Razaun:", - "undeletedrevisions": "restaurar {{PLURAL:$1|versaun|versaun}} $1", "undelete-search-submit": "Buka", "undelete-show-file-submit": "Sin", "namespace": "Espasu pájina nian:", diff --git a/languages/i18n/tl.json b/languages/i18n/tl.json index 8c16c16edd..fd8bd878f5 100644 --- a/languages/i18n/tl.json +++ b/languages/i18n/tl.json @@ -1736,9 +1736,6 @@ "undeleteviewlink": "tingnan", "undeleteinvert": "Baligtarin ang pagpili/pilian", "undeletecomment": "Dahilan:", - "undeletedrevisions": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabagong}} naibalik na", - "undeletedrevisions-files": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}} at {{PLURAL:$2|1 talaksang|$2 mga talaksang}} naibalik na", - "undeletedfiles": "{{PLURAL:$1|1 talaksang|$1 mga talaksang}} naibalik na", "cannotundelete": "Hindi matagumpay ang pagpapabalik mula sa pagkakabura; maaaring may isang nakauna na sa pagpapabalik ng pahina mula sa pagkakabura.", "undeletedpage": "'''Naibalik na ang $1'''\n\nTingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng mga kamakailan lamang na mga pagbubura at mga pagbabalik mula sa pagkakabura.", "undelete-header": "Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa kamakailan lamang na binura/naburang mga pahina.", diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json index 540bb8fa28..123a983428 100644 --- a/languages/i18n/tr.json +++ b/languages/i18n/tr.json @@ -340,7 +340,7 @@ "privacypage": "Project:Gizlilik Politikası", "badaccess": "İzin hatası", "badaccess-group0": "Bu işlemi yapma yetkiniz yok.", - "badaccess-groups": "Yapmak istediğiniz işlem, sadece {{PLURAL:$2|şu gruptaki|şu gruplardaki}} kullanıcılar tarafından yapılabilir: $1", + "badaccess-groups": "İstediğiniz işlem, $1 {{PLURAL:$2|grubundaki|gruplarındaki}} kullanıcılarla sınırlıdır.", "versionrequired": "MediaWiki'nin $1 sürümü gerekiyor", "versionrequiredtext": "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.", "ok": "Tamam", @@ -354,9 +354,9 @@ "newmessagesdifflinkplural": "son {{PLURAL:$1|değişiklik|değişiklik}}", "youhavenewmessagesmulti": "$1'de yeni mesajınız var", "editsection": "düzenle", - "editold": "değiştir", + "editold": "düzenle", "viewsourceold": "kaynağı gör", - "editlink": "değiştir", + "editlink": "düzenle", "viewsourcelink": "kaynağı gör", "editsectionhint": "Değiştirilen bölüm: $1", "toc": "İçindekiler", @@ -558,7 +558,7 @@ "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.", "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.", "mailmypassword": "Parolayı sıfırla", - "passwordremindertitle": "{{SITENAME}} için yeni geçici şifre", + "passwordremindertitle": "{{SITENAME}} için yeni geçici parola", "passwordremindertext": "Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.", "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.", "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız", @@ -605,11 +605,11 @@ "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.", "botpasswords": "Bot parolaları", "botpasswords-summary": "Bot şifreleri, hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.", - "botpasswords-disabled": "Bot şifreleri devre dışı.", - "botpasswords-no-central-id": "Bot şifresini kullanmak için, merkezi bir hesap ile giriş yapmalısınız.", - "botpasswords-existing": "Mevcut bot şifreleri", - "botpasswords-createnew": "Yeni bir bot şifresi oluştur", - "botpasswords-editexisting": "Mevcut bir bot şifresini düzenle", + "botpasswords-disabled": "Bot parolaları devre dışı.", + "botpasswords-no-central-id": "Bot parolaları kullanmak için, merkezi bir hesap ile oturum açmalısınız.", + "botpasswords-existing": "Mevcut bot parolaları", + "botpasswords-createnew": "Yeni bir bot parolası oluştur", + "botpasswords-editexisting": "Mevcut bir bot parolasını düzenle", "botpasswords-label-appid": "Bot ismi:", "botpasswords-label-create": "Oluştur", "botpasswords-label-update": "Güncelle", @@ -621,16 +621,16 @@ "botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.", "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?", "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?", - "botpasswords-created-title": "Bot şifresi oluşturuldu.", - "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.", - "botpasswords-updated-title": "Bot şifresi guncellendi", - "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.", - "botpasswords-deleted-title": "Bot şifresi silindi.", - "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.", + "botpasswords-created-title": "Bot parolası oluşturuldu", + "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" adlı botu için bot parolası oluşturuldu.", + "botpasswords-updated-title": "Bot parolası güncellendi", + "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası güncellendi.", + "botpasswords-deleted-title": "Bot parolası silindi", + "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası silindi.", "botpasswords-newpassword": "$1 ile oturum açmak için yeni şifre: $2. İlerde başvurmak için lütfen kaydedin.", "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.", - "botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.", - "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").", + "botpasswords-restriction-failed": "Bot parolası kısıtlamaları bu oturum açma işlemini önlemektedir.", + "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot parolası ayırıcısı içermiyor (\"$1\").", "resetpass_forbidden": "Parolalar değiştirilememektedir", "resetpass_forbidden-reason": "Şifre değiştirilemedi: $1", "resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.", @@ -758,7 +758,7 @@ "token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''", "edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''", "editing": "\"$1\" sayfasını değiştirmektesiniz", - "creating": "Oluşturuluyor $1", + "creating": "$1 sayfasını oluşturuyorsunuz", "editingsection": "\"$1\" sayfasında bölüm değiştirmektesiniz", "editingcomment": "$1 değiştiriliyor (yeni bölüm)", "editconflict": "Değişiklik çakışması: $1", @@ -966,7 +966,7 @@ "mergehistory-same-destination": "Kaynak ve hedef sayfaları aynı olamaz", "mergehistory-reason": "Sebep:", "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6", - "mergelog": "Birleştirme kaydı", + "mergelog": "Birleştirme günlüğü", "revertmerge": "Ayır", "mergelogpagetext": "Aşağıdaki liste, sayfaların geçmiş versiyonlarının birbirleriyle en son birleştirilmelerini içerir", "history-title": "\"$1\" sayfasının geçmişi", @@ -1186,7 +1186,7 @@ "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar", "grouppage-suppress": "{{ns:project}}:Gözetmen", "right-read": "Sayfaları oku", - "right-edit": "Sayfaları değiştir", + "right-edit": "Sayfaları düzenle", "right-createpage": "Sayfa oluştur (tartışma sayfası olmayan)", "right-createtalk": "Tartışma sayfaları oluştur", "right-createaccount": "Yeni kullanıcı hesapları yarat", @@ -1685,12 +1685,12 @@ "filerevert-submit": "Eski haline döndür", "filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.", "filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.", - "filedelete": "Sil $1", + "filedelete": "$1 adlı dosyayı sil", "filedelete-legend": "Dosya sil", "filedelete-intro": "'''[[Media:$1|$1]]''' dosyasını tüm geçmişiyle birlikte silmek üzeresiniz.", "filedelete-intro-old": "'''[[Media:$1|$1]]''' dosyasının [$4 $3, $2] tarihli sürümünü siliyorsunuz.", "filedelete-comment": "Neden:", - "filedelete-submit": "sil", + "filedelete-submit": "Sil", "filedelete-success": "'''$1''' silindi.", "filedelete-success-old": "'''[[Media:$1|$1]]''' dosyasının $3, $2 tarihli sürümü silindi.", "filedelete-nofile": "'''$1''' mevcut değildir.", @@ -1751,7 +1751,7 @@ "double-redirect-fixer": "Yönlendirme tamircisi", "brokenredirects": "Boş yönlendirmeler", "brokenredirectstext": "Aşağıdaki yönlendirmeler varolmayan sayfalara bağlantı veriyor:", - "brokenredirects-edit": "değiştir", + "brokenredirects-edit": "düzenle", "brokenredirects-delete": "sil", "withoutinterwiki": "Diğer dillere bağlantısı olmayan sayfalar", "withoutinterwiki-summary": "Aşağıda listelenen sayfalar diğer dillere bağlantı içermemektedir:", @@ -1969,12 +1969,12 @@ "emailfrom": "Kimden:", "emailto": "Kime:", "emailsubject": "Konu:", - "emailmessage": "E-posta:", + "emailmessage": "İleti:", "emailsend": "Gönder", "emailccme": "Mesajın bir kopyasını da bana gönder.", "emailccsubject": "$1'e gönderdiğiniz mesajın kopyası: $2", "emailsent": "E-posta gönderildi", - "emailsenttext": "E-postanız gönderildi.", + "emailsenttext": "E-posta iletiniz gönderildi.", "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailuser}}\") fonksiyonu ile gönderilmiştir.", "usermessage-summary": "Sistem mesajı bırakın.", "usermessage-editor": "Sistem habercisi", @@ -2039,7 +2039,7 @@ "excontentauthor": "eski içerik: '$1' ('[[Special:Contributions/$2|$2]]' katkıda bulunmuş olan tek kullanıcı)", "exbeforeblank": "Silinmeden önceki içerik: '$1'", "delete-confirm": "\"$1\" sayfasını sil", - "delete-legend": "sil", + "delete-legend": "Sil", "historywarning": "Uyarı: Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:", "historyaction-submit": "Göster", "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.", @@ -2047,7 +2047,7 @@ "actionfailed": "İşlem başarısız oldu", "deletedtext": "\"$1\" silindi.\nYakın zamanda silinenleri görmek için: $2.", "dellogpage": "Silme günlüğü", - "dellogpagetext": "Aşağıdaki liste son silme kayıtlarıdır.", + "dellogpagetext": "Aşağıda en son silme işlemlerinin bir listesi bulunmaktadır.", "deletionlog": "silme günlüğü", "reverted": "Önceki sürüm geri getirildi", "deletecomment": "Neden:", @@ -2066,12 +2066,13 @@ "rollbackfailed": "geri alma işlemi başarısız", "cantrollback": "Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.", "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geri döndürülemiyor;\nbaşka birisi sayfada değişiklik yaptı ya da sayfayı geri döndürdü.\n\nSon değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).", - "editcomment": "Değişiklik özeti: $1 idi.", + "editcomment": "Düzenleme özeti şöyleydi: $1.", "revertpage": "[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.", "revertpage-nouser": "Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi", "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.", "sessionfailure-title": "Oturum başarısızlığı", "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.", + "changecontentmodel": "Bir sayfanın içerik modelini değiştir", "changecontentmodel-title-label": "Sayfa başlığı", "changecontentmodel-model-label": "Yeni içerik modeli", "changecontentmodel-reason-label": "Gerekçe:", @@ -2130,7 +2131,7 @@ "minimum-size": "En küçük boyut", "maximum-size": "En büyük boyut:", "pagesize": "(bayt)", - "restriction-edit": "değiştir", + "restriction-edit": "Düzenle", "restriction-move": "Taşı", "restriction-create": "Oluştur", "restriction-upload": "Yükle", @@ -2156,9 +2157,6 @@ "undeleteviewlink": "görüntüle", "undeleteinvert": "Seçimi ters çevir", "undeletecomment": "Neden:", - "undeletedrevisions": "Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.", - "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi", - "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.", "cannotundelete": "Silme başarısız oldu:\n$1", "undeletedpage": "'''$1 sayfası geri getirildi'''\n\nÖnceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.", "undelete-header": "Yakın zamanda silinen sayfaları görmek için [[Special:Log/delete|silme günlüğü]]ne bakın.", @@ -2196,7 +2194,7 @@ "sp-contributions-newbies": "Sadece yeni kullanıcıların katkılarını göster", "sp-contributions-newbies-sub": "Yeni kullanıcılar için", "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları", - "sp-contributions-blocklog": "Engel kaydı", + "sp-contributions-blocklog": "engel günlüğü", "sp-contributions-suppresslog": "kullanıcının silinen katkıları", "sp-contributions-deleted": "kullanıcının silinen katkıları", "sp-contributions-uploads": "yüklenenler", @@ -2235,7 +2233,7 @@ "blockip": "{{GENDER:$1|Kullanıcıyı}} engelle", "blockip-legend": "Kullanıcıyı engelle", "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).", - "ipaddressorusername": "IP adresi veya kullanıcı adı", + "ipaddressorusername": "IP adresi veya kullanıcı adı:", "ipbexpiry": "Bitiş süresi", "ipbreason": "Neden:", "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı", @@ -2259,14 +2257,14 @@ "ipb-confirmaction": "Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki \"{{int:ipb-confirm}}\" alanını işaretleyin.", "ipb-edit-dropdown": "Engelleme nedenleri düzenle", "ipb-unblock-addr": "$1 için engellemeyi kaldır", - "ipb-unblock": "Engellemeyi kaldır", + "ipb-unblock": "Bir kullanıcı adı veya IP adresinin engellemesini kaldır", "ipb-blocklist": "Mevcut olan engellemeleri göster", "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar", "unblockip": "Kullanıcının engellemesini kaldır", "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.", "ipusubmit": "Bu engellemeyi kaldır", "unblocked": "[[User:$1|$1]] - engelleme kaldırıldı", - "unblocked-range": "$1 engeli kaldırıldı", + "unblocked-range": "$1 adlı kullanıcının engeli kaldırıldı.", "unblocked-id": "$1 engeli çıkarıldı", "unblocked-ip": "[[Special:Contributions/$1|$1]] engellenmiştir.", "blocklist": "Engellenmiş kullanıcılar", @@ -2295,18 +2293,18 @@ "ipblocklist-empty": "Engelleme listesi boş.", "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.", "blocklink": "engelle", - "unblocklink": "engeli kaldır", + "unblocklink": "engellemeyi kaldır", "change-blocklink": "engeli değiştir", "contribslink": "katkılar", "emaillink": "e-posta gönder", "autoblocker": "Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz \"[[User:$1|$1]]\" kullanıcısı tarafından kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: \"'''$2'''\"", - "blocklogpage": "Engel kaydı", + "blocklogpage": "Engel günlüğü", "blocklog-showlog": "Bu kullanıcı daha önceden engellenmiş.\nEngelleme günlüğü referans için aşağıda sağlanmıştır:", "blocklog-showsuppresslog": "Bu kullanıcı daha önceden engellenmiş ve gizlenmiş.\nGizleme günlüğü referans için aşağıda sağlanmıştır:", - "blocklogentry": ", [[$1]] kullanıcısını engelledi, engelleme süresi: $2 $3", - "reblock-logentry": "[[$1]] için bitiş tarihi $2 $3 olmak üzere engelleme ayarlarını değiştirdi", + "blocklogentry": ", [[$1]] adlı kullanıcıyı $2 süreyle ve $3 gerekçesiyle engelledi.", + "reblock-logentry": ", [[$1]] adlı kullanıcı için engelleme ayarlarını değiştirdi ve bitiş süresini $2 olarak belirledi $3", "blocklogtext": "Bu, kullanıcı engelleme ve engel kaldırma işlemlerinin bir günlüğüdür.\nOtomatik olarak engellenen IP adresleri listelenmemiştir.\nŞu anda geçerli yasaklama ve engellemelerin listesi için [[Special:BlockList|engelleme listesi]]ne bakın.", - "unblocklogentry": "$1 kullanıcının engellemesi kaldırıldı", + "unblocklogentry": ", $1 adlı kullanıcının engellemesini kaldırdı", "block-log-flags-anononly": "sadece anonim kullanıcılar", "block-log-flags-nocreate": "hesap yaratımı engellendi", "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi", @@ -2366,7 +2364,7 @@ "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.", "newtitle": "Yeni başlık:", "move-watch": "Bu sayfayı izle", - "movepagebtn": "İsmi değiştir", + "movepagebtn": "Sayfayı taşı", "pagemovedsub": "İsim değişikliği tamamlandı.", "movepage-moved": "'''\"$1\", \"$2\" sayfasına taşındı'''", "movepage-moved-redirect": "Bir yönlendirme oluşturuldu.", @@ -2380,7 +2378,7 @@ "movepage-page-moved": "$1 sayfası $2 sayfasına taşındı.", "movepage-page-unmoved": "$1 sayfası $2 başlığına taşınamıyor.", "movepage-max-pages": "En fazla $1 {{PLURAL:$1|sayfa|sayfa}} taşındı ve daha fazlası otomatik olarak taşınamaz.", - "movelogpage": "Taşıma kaydı", + "movelogpage": "Taşıma günlüğü", "movelogpagetext": "Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.", "movesubpage": "{{PLURAL:$1|Alt sayfa|Alt sayfalar}}", "movesubpagetext": "Bu sayfanın aşağıda gösterilen $1 {{PLURAL:$1|altsayfası|altsayfası}} vardır.", @@ -2425,7 +2423,7 @@ "allmessagesname": "Ad", "allmessagesdefault": "Varsayılan ileti metni", "allmessagescurrent": "Kullanımdaki metin", - "allmessagestext": "Bu liste MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.", + "allmessagestext": "Bu liste, MediaWiki ad alanında bulunan sistem iletilerinin listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.", "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' kapalı olduğu için '''{{ns:special}}:Allmessages''' kullanıma açık değil.", "allmessages-filter-legend": "Filtre", "allmessages-filter": "Özelleştirme durumuna göre filtrele:", @@ -2451,7 +2449,7 @@ "thumbnail_gd-library": "Eksik GD kütüphanesi yapılandırması: kayıp fonksiyon $1", "thumbnail_image-missing": "Dosya kayıp gibi görünüyor: $1", "thumbnail_image-failure-limit": "Yakın zamanda bu küçük resmin oluşturulması için çok fazla başarısız girişim oldu ($1 ya da daha fazla). Lütfen daha sonra yeniden deneyin.", - "import": "Sayfaları aktar", + "import": "Sayfaları içe aktar", "importinterwiki": "Başka bir vikiden içe aktar", "import-interwiki-text": "İçe aktarmak için bir viki ve sayfa başlığı seçin.\nRevizyon tarihleri ve yazarların isimleri korunacaktır.\nBütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım günlüğünde]] kaydedilmektedir.", "import-interwiki-sourcewiki": "Kaynak viki:", @@ -2654,7 +2652,7 @@ "patrol-log-page": "Devriye günlüğü", "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.", "log-show-hide-patrol": "Gözetim günlüğünü $1", - "log-show-hide-tag": "$1 Etiket günlüğü", + "log-show-hide-tag": "Etiket günlüğünü $1", "deletedrevision": "$1 sayılı eski sürüm silindi.", "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu", "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1", @@ -3411,9 +3409,9 @@ "revdelete-uname-unhid": "kullanıcı adı gösterildi", "revdelete-restricted": "hizmetliler için uygulanmış kısıtlamalar", "revdelete-unrestricted": "hizmetliler için kaldırılmış kısıtlamalar", - "logentry-block-block": "$1 {{GENDER:$2|engelledi}} {{GENDER:$4|$3}} engelleme süresi: $5 $6", - "logentry-block-unblock": "$1 kullanıcısının {{GENDER:$2|engeli kaldırıldı}} {{GENDER:$4|$3}}", - "logentry-block-reblock": "$1, {{GENDER:$4|$3}} kullanıcısının engellenme süresini $5 $6 olarak {{GENDER:$2|değiştirdi}}", + "logentry-block-block": "$1, {{GENDER:$4|$3}} adlı kullanıcıyı $5 süreyle {{GENDER:$2|engelledi}} $6", + "logentry-block-unblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının {{GENDER:$2|engelini kaldırdı}}", + "logentry-block-reblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının engellenme süresini $5 olarak {{GENDER:$2|değiştirdi}} $6", "logentry-suppress-block": "{{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6", "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6", "logentry-import-upload": "$1 dosya yükleme ile {{GENDER:$2|içe aktardı}}: $3", @@ -3481,7 +3479,7 @@ "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.", "api-error-unknown-warning": "Bilinmeyen uyarı: $1", "api-error-unknownerror": "Bilinmeyen hata: \"$1\".", - "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}", + "duration-seconds": "$1 saniye", "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}", "duration-hours": "$1 {{PLURAL:$1|saat|saat}}", "duration-days": "$1 {{PLURAL:$1|gün|gün}}", @@ -3562,7 +3560,7 @@ "headline-anchor-title": "Bu bölüme bağlantı", "special-characters-group-latin": "Latin", "special-characters-group-latinextended": "Genişletilmiş Latince", - "special-characters-group-ipa": "UFA", + "special-characters-group-ipa": "IPA", "special-characters-group-symbols": "Simgeler", "special-characters-group-greek": "Yunan", "special-characters-group-greekextended": "Genişletilmiş Yunanca", diff --git a/languages/i18n/tt-cyrl.json b/languages/i18n/tt-cyrl.json index 26462101b5..b7a3ed0257 100644 --- a/languages/i18n/tt-cyrl.json +++ b/languages/i18n/tt-cyrl.json @@ -1502,7 +1502,6 @@ "undeleteviewlink": "карау", "undeleteinvert": "Киресен сайлау", "undeletecomment": "Сәбәп:", - "undeletedrevisions": "$1 {{PLURAL:$1|үзгәреш}} яңадан {{PLURAL:$1|торгызылды}}", "undelete-search-submit": "Эзләү", "undelete-error-long": "Файлны торгызу вакытында хаталар чыкты:\n\n$1", "undelete-show-file-submit": "Әйе", diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json index 656d81a7ae..b4e4c9353b 100644 --- a/languages/i18n/uk.json +++ b/languages/i18n/uk.json @@ -2289,9 +2289,6 @@ "undeleteviewlink": "переглянути", "undeleteinvert": "Інвертувати виділення", "undeletecomment": "Причина:", - "undeletedrevisions": "$1 {{PLURAL:$1|редагування|редагування|редагувань}} відновлено", - "undeletedrevisions-files": "$1 {{PLURAL:$1|версія|версії|версій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено", - "undeletedfiles": "$1 {{PLURAL:$1|файл|файли|файлів}} відновлено", "cannotundelete": "Частина або вся процедура відновлення зазнала невдачі:\n$1", "undeletedpage": "'''Сторінка «$1» відновлена'''\n\nДив. [[Special:Log/delete|список вилучень]], щоб дізнатися про останні вилучення та відновлення.", "undelete-header": "Список нещодавно вилучених сторінок можна переглянути в [[Special:Log/delete|журналі вилучень]].", diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json index 4250b0c8f3..5bc1cbe855 100644 --- a/languages/i18n/vi.json +++ b/languages/i18n/vi.json @@ -2219,9 +2219,6 @@ "undeleteviewlink": "xem", "undeleteinvert": "Đảo sự lựa chọn", "undeletecomment": "Lý do:", - "undeletedrevisions": "$1 phiên bản được phục hồi", - "undeletedrevisions-files": "$1 phiên bản và $2 tập tin đã được phục hồi", - "undeletedfiles": "$1 tập tin đã được phục hồi", "cannotundelete": "Phục hồi bị thất bại một phần hoặc hoàn toàn:\n$1", "undeletedpage": "'''$1 đã được khôi phục'''\n\nXem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].", "undelete-header": "Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].", diff --git a/languages/i18n/yue.json b/languages/i18n/yue.json index 6486ad3100..031e9d5b28 100644 --- a/languages/i18n/yue.json +++ b/languages/i18n/yue.json @@ -535,6 +535,8 @@ "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。", "botpasswords": "機械人密碼", "botpasswords-disabled": "唔俾用機械人密碼。", + "botpasswords-existing": "而家已經有嘅機械人密碼", + "botpasswords-createnew": "整一個新嘅機械人密碼", "botpasswords-label-create": "創造", "botpasswords-label-update": "上載", "botpasswords-label-cancel": "取消", @@ -1045,8 +1047,8 @@ "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。", "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。", "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁", - "userrights": "用戶權限管理", - "userrights-lookup-user": "管理用戶組", + "userrights": "用戶嘅權限", + "userrights-lookup-user": "揀一個用戶", "userrights-user-editname": "輸入一個用戶名:", "editusergroup": "編輯用戶組", "editinguser": "改緊[[User:$1|$1]]嘅用戶權限 $2", @@ -1065,6 +1067,7 @@ "userrights-expiry": "到期:", "userrights-expiry-existing": "現時到期嘅時間: $2 $3", "userrights-expiry-othertime": "其它時間:", + "userrights-invalid-expiry": "組\"$1\"嘅過期時間冇效", "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。", "group": "組:", "group-user": "用戶", @@ -1940,9 +1943,6 @@ "undeleteviewlink": "睇", "undeleteinvert": "反選", "undeletecomment": "原因:", - "undeletedrevisions": "$1個修訂已經救返", - "undeletedrevisions-files": "$1個修訂同$2個檔案已經救返", - "undeletedfiles": "$1個檔案已經救返", "cannotundelete": "救唔到:\n$1", "undeletedpage": "'''$1已經成功救返'''\n\n最近嘅刪除同恢復記錄請睇[[Special:Log/delete]]。", "undelete-header": "睇吓[[Special:Log/delete|刪除日誌]]去睇之前刪除嘅頁頁。", diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json index 909a0bb3db..2946523d0c 100644 --- a/languages/i18n/zh-hans.json +++ b/languages/i18n/zh-hans.json @@ -1169,7 +1169,7 @@ "saveusergroups": "保存{{GENDER:$1|用户}}组", "userrights-groupsmember": "用户组:", "userrights-groupsmember-auto": "自动用户组:", - "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组的过期时间;您不能将其提前。", + "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组成员的过期时间;您不能将其提前。", "userrights-reason": "原因:", "userrights-no-interwiki": "您并没有权限去编辑在其它wiki上的用户权限。", "userrights-nodatabase": "数据库$1不存在或并非为本地的。", @@ -1183,7 +1183,7 @@ "userrights-expiry-options": "1天:1 day,1周:1 week,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year", "userrights-invalid-expiry": "组“$1”的终止时间无效。", "userrights-expiry-in-past": "组“$1”的终止时间是在过去。", - "userrights-cannot-shorten-expiry": "您不能将用户组“$1”的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。", + "userrights-cannot-shorten-expiry": "您不能将用户组“$1”成员的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。", "userrights-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。", "group": "用户组:", "group-user": "用户", @@ -1448,6 +1448,7 @@ "rcfilters-hideminor-conflicts-typeofchange": "某种更改类型不可指定为“小编辑”,因此该过滤器与以下更改类型过滤器相冲突:$1", "rcfilters-typeofchange-conflicts-hideminor": "这种更改类型过滤器与“小编辑”过滤器相冲突。某种更改类型不可指定为“小编辑”。", "rcnotefrom": "下面{{PLURAL:$5|是}}$3 $4之后的更改(最多显示$1个)。", + "rclistfromreset": "重置时间选择", "rclistfrom": "显示$3 $2之后的新更改", "rcshowhideminor": "$1小编辑", "rcshowhideminor-show": "显示", @@ -1568,6 +1569,7 @@ "php-uploaddisabledtext": "PHP文件上传停用。请检查file_uploads设置。", "uploadscripted": "该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。", "upload-scripted-pi-callback": "不能上传包含XML-stylesheet处理命令的文件。", + "upload-scripted-dtd": "不能上传包含非标准DTD声明的SVG文件。", "uploaded-script-svg": "在上传的SVG文件中找到可编写脚本的元素“$1”。", "uploaded-hostile-svg": "在上传的SVG文件中的样式元素中找到不安全CSS。", "uploaded-event-handler-on-svg": "在SVG文件中不允许设置event-handler属性$1=\"$2\"。", @@ -2303,9 +2305,6 @@ "undeleteviewlink": "查看", "undeleteinvert": "反向选择", "undeletecomment": "原因:", - "undeletedrevisions": "还原{{PLURAL:$1|$1个版本}}", - "undeletedrevisions-files": "还原{{PLURAL:$1|$1个版本}}和{{PLURAL:$2|$2个文件}}", - "undeletedfiles": "还原{{PLURAL:$1|$1个文件}}", "cannotundelete": "部分或全部还原删除失败:$1", "undeletedpage": "$1已经被还原\n\n最近的删除和还原记录请见[[Special:Log/delete|删除日志]]。", "undelete-header": "如要查询最近的记录请参阅[[Special:Log/delete|删除日志]]。", @@ -3591,7 +3590,10 @@ "htmlform-user-not-valid": "$1不是一个有效的用户名。", "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3", "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}重定向$3", - "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3", + "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3($4)", + "logentry-delete-restore-nocount": "$1{{GENDER:$2|还原}}页面$3", + "restore-count-revisions": "{{PLURAL:$1|$1个修订版本}}", + "restore-count-files": "{{PLURAL:$1|$1个文件}}", "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4", "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4", "logentry-delete-event-legacy": "$1{{GENDER:$2|更改}}$3的日志事件的可见性", @@ -3798,6 +3800,7 @@ "special-characters-group-thai": "泰语", "special-characters-group-lao": "老挝语", "special-characters-group-khmer": "高棉语字母", + "special-characters-group-canadianaboriginal": "加拿大原住民音节文字", "special-characters-title-endash": "短划线", "special-characters-title-emdash": "长划线", "special-characters-title-minus": "减号", @@ -3942,5 +3945,10 @@ "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:
    0.0.0.0/0\n::/0
    ", "revid": "修订版本$1", "pageid": "页面ID$1", - "rawhtml-notallowed": "<html>标签不能在一般页面以外使用。" + "rawhtml-notallowed": "<html>标签不能在一般页面以外使用。", + "gotointerwiki": "离开{{SITENAME}}", + "gotointerwiki-invalid": "指定的标题无效。", + "gotointerwiki-external": "您将要离开{{SITENAME}}来访问[[$2]],这是一个独立网站。\n\n[$1 点此继续访问$1]。", + "undelete-cantedit": "您不能还原该页面,因为您未被允许编辑该页面。", + "undelete-cantcreate": "您不能还原该页面,因为没有使用该页面名称的现有页面,并且您未被允许编辑该页面。" } diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json index eda13dbee1..5cbf913df7 100644 --- a/languages/i18n/zh-hant.json +++ b/languages/i18n/zh-hant.json @@ -299,7 +299,7 @@ "redirectpagesub": "重新導向頁面", "redirectto": "重新導向至:", "lastmodifiedat": "此頁面最後修改於 $1 $2。", - "viewcount": "此頁面已被檢視過 {{PLURAL:$1|$1 次}}。", + "viewcount": "此頁面已被存取過 {{PLURAL:$1|$1 次}}。", "protectedpage": "受保護頁面", "jumpto": "前往:", "jumptonavigation": "導覽", @@ -439,7 +439,7 @@ "viewsourcetext": "您可以檢視並複製此頁面的原始碼。", "viewyourtext": "您可以檢視並複製此頁面中您編輯的原始碼。", "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。", - "editinginterface": "警告:您正在編輯的頁面文字是用來作為軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。", + "editinginterface": "警告:您正在編輯的頁面文字是用來提供軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。", "translateinterface": "如欲修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。", "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2", "namespaceprotected": "您沒有權限編輯 $1 命名空間的頁面。", @@ -479,7 +479,7 @@ "userlogin-remembermypassword": "記住我的登入狀態", "userlogin-signwithsecure": "使用安全連線", "cannotlogin-title": "無法登入", - "cannotlogin-text": "無法登入", + "cannotlogin-text": "無法登入。", "cannotloginnow-title": "現在無法登入", "cannotloginnow-text": "使用 $1 時無法登入。", "cannotcreateaccount-title": "無法建立帳號", @@ -559,7 +559,7 @@ "noemailprefs": "在您的偏好設定中設定電子郵件地址,讓您可以使用這些功能。", "emailconfirmlink": "確認您的電子郵件地址", "invalidemailaddress": "無法接受格式不正確的電子郵件地址,請輸入正確的電子郵件地址格式或略過填寫該欄位。", - "cannotchangeemail": "此 Wiki 禁止變更帳號的電子郵件地址。", + "cannotchangeemail": "此 Wiki 禁止更改帳號的電子郵件地址。", "emaildisabled": "此網站不能傳送電子郵件。", "accountcreated": "已建立帳號", "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。", @@ -1156,7 +1156,7 @@ "saveusergroups": "儲存{{GENDER:$1|使用者}}群組", "userrights-groupsmember": "所屬群組:", "userrights-groupsmember-auto": "所屬隱含群組:", - "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。\n* 有 # 號標示代表您只能延後此群組的期限,您無法將其提前。", + "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。\n* 有 # 號標示代表您只能延後此群組成員的期限,您無法將其提前。", "userrights-reason": "原因:", "userrights-no-interwiki": "您沒有權限去編輯其他 Wiki 上的使用者權限。", "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。", @@ -1170,7 +1170,7 @@ "userrights-expiry-options": "1 天:1 day,1 週:1 week,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year", "userrights-invalid-expiry": "群組 \"$1\" 的期限無效。", "userrights-expiry-in-past": "群組 \"$1\" 的期限已過。", - "userrights-cannot-shorten-expiry": "您無法提前群組 \"$1\" 的期限。只有擁有新增與移除此群組權限的使用者可以將期限提前。", + "userrights-cannot-shorten-expiry": "您無法提前群組 \"$1\" 中成員的期限。只有擁有新增與移除此群組權限的使用者可以將期限提前。", "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。", "group": "群組:", "group-user": "使用者", @@ -1323,7 +1323,7 @@ "action-writeapi": "使用寫入 API", "action-delete": "刪除此頁面", "action-deleterevision": "刪除修訂", - "action-deletelogentry": "删除日誌記錄", + "action-deletelogentry": "刪除日誌項目", "action-deletedhistory": "檢視頁面的刪除歷史", "action-deletedtext": "查看已刪除的修訂版本文字", "action-browsearchive": "搜尋已刪除頁面", @@ -1661,7 +1661,7 @@ "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人尚無法查看。", "uploadstash-clear": "清除儲藏庫檔案", "uploadstash-nofiles": "您沒有儲藏的檔案。", - "uploadstash-badtoken": "執行動作失敗。您的編輯資訊可能已經過期,請重新再試。", + "uploadstash-badtoken": "執行動作失敗。您的編輯憑証可能已經過期,請重新再試。", "uploadstash-errclear": "清除檔案失敗。", "uploadstash-refresh": "更新檔案清單", "uploadstash-thumbnail": "檢視縮圖", @@ -2288,9 +2288,6 @@ "undeleteviewlink": "檢視", "undeleteinvert": "反向選擇", "undeletecomment": "原因:", - "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原", - "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原", - "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原", "cannotundelete": "部份或全部的取消刪除失敗:\n$1", "undeletedpage": "$1 已還原\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。", "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。", @@ -2594,7 +2591,7 @@ "import": "匯入頁面", "importinterwiki": "從其他 wiki 匯入", "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。", - "import-interwiki-sourcewiki": "來源 wiki:", + "import-interwiki-sourcewiki": "來源 Wiki:", "import-interwiki-sourcepage": "來源頁面:", "import-interwiki-history": "複製此頁面的所有歷史修訂", "import-interwiki-templates": "包含所有模板", @@ -3575,7 +3572,7 @@ "logentry-suppress-event-legacy": "$1 {{GENDER:$2|已暗中變更}} $3 中日誌的可見性", "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|已暗中更改}}頁面 $3 中修訂的可見性", "revdelete-content-hid": "已隱藏內容", - "revdelete-summary-hid": "已隱藏摘要", + "revdelete-summary-hid": "已隱藏編輯摘要", "revdelete-uname-hid": "隱藏使用者名稱", "revdelete-content-unhid": "取消隱藏內容", "revdelete-summary-unhid": "取消隱藏編輯摘要", @@ -3841,7 +3838,7 @@ "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。", "authmanager-authn-no-local-user-link": "提供的憑證有效但沒有與任何在此 wiki 上的使用者相關聯。請採用其他方式登入,或建立新使用者,您將會有選項可以連結您先前的憑證到新帳號。", "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1", - "authmanager-change-not-supported": "提供的認證無法變更,因為尚無法使用。", + "authmanager-change-not-supported": "提供的憑証無法變更,因為尚無法使用。", "authmanager-create-disabled": "已關閉帳號自動建立。", "authmanager-create-from-login": "要建立您的帳號,請先填寫此欄位。", "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。", @@ -3890,15 +3887,15 @@ "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。", "cannotauth-not-allowed-title": "權限不足", "cannotauth-not-allowed": "您不被允許使用此頁面", - "changecredentials": "變更認證", + "changecredentials": "變更憑証", "changecredentials-submit": "變更認證", "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。", "changecredentials-success": "已變更您的認證。", - "removecredentials": "移除認證", + "removecredentials": "移除憑証", "removecredentials-submit": "移除認證", "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。", "removecredentials-success": "已移除您的憑證。", - "credentialsform-provider": "認證類型:", + "credentialsform-provider": "憑証類型:", "credentialsform-account": "帳號名稱:", "cannotlink-no-provider-title": "沒有可連結的帳號", "cannotlink-no-provider": "沒有可連結的帳號。", @@ -3908,8 +3905,8 @@ "unlinkaccounts": "取消連結帳號", "unlinkaccounts-success": "已取消連結帳號。", "authenticationdatachange-ignored": "認証資料變更未被處理,可能未設定提供者?", - "userjsispublic": "請注意:JavaScript 子頁面可被其他使用者檢視,不應包含憑証資料。", - "usercssispublic": "請注意:CSS 子頁面可被其他使用者檢視,不應包含憑証資料。", + "userjsispublic": "請注意:JavaScript 子頁面可被其他使用者檢視,不應包含機密資料。", + "usercssispublic": "請注意:CSS 子頁面可被其他使用者檢視,不應包含機密資料。", "restrictionsfield-badip": "無效的 IP 位址或範圍:$1", "restrictionsfield-label": "允許的 IP 範圍:", "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:
    0.0.0.0/0\n::/0
    ", diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index b9280ea096..c52ec0e081 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -427,6 +427,7 @@ $specialPageAliases = [ 'Fewestrevisions' => [ 'FewestRevisions' ], 'FileDuplicateSearch' => [ 'FileDuplicateSearch' ], 'Filepath' => [ 'FilePath' ], + 'GoToInterwiki' => [ 'GoToInterwiki' ], 'Import' => [ 'Import' ], 'Invalidateemail' => [ 'InvalidateEmail' ], 'JavaScriptTest' => [ 'JavaScriptTest' ], diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php index a8080c50be..e5ba411a34 100644 --- a/maintenance/Maintenance.php +++ b/maintenance/Maintenance.php @@ -40,6 +40,7 @@ use Wikimedia\Rdbms\IDatabase; use MediaWiki\Logger\LoggerFactory; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\LBFactory; +use Wikimedia\Rdbms\IMaintainableDatabase; /** * Abstract maintenance class for quickly writing and churning out @@ -106,7 +107,7 @@ abstract class Maintenance { /** * Used by getDB() / setDB() - * @var Database + * @var IMaintainableDatabase */ private $mDb = null; @@ -206,7 +207,7 @@ abstract class Maintenance { * @param string $description The description of the param to show on --help * @param bool $required Is the param required? * @param bool $withArg Is an argument required with this option? - * @param string $shortName Character to use as short name + * @param string|bool $shortName Character to use as short name * @param bool $multiOccurrence Can this option be passed multiple times? */ protected function addOption( $name, $description, $required = false, @@ -1243,7 +1244,7 @@ abstract class Maintenance { * @param integer $db DB index (DB_REPLICA/DB_MASTER) * @param array $groups; default: empty array * @param string|bool $wiki; default: current wiki - * @return Database + * @return IMaintainableDatabase */ protected function getDB( $db, $groups = [], $wiki = false ) { if ( is_null( $this->mDb ) ) { @@ -1256,7 +1257,7 @@ abstract class Maintenance { /** * Sets database object to be returned by getDB(). * - * @param IDatabase $db Database object to be used + * @param IDatabase $db */ public function setDB( IDatabase $db ) { $this->mDb = $db; @@ -1318,7 +1319,7 @@ abstract class Maintenance { /** * Lock the search index - * @param Database &$db + * @param IMaintainableDatabase &$db */ private function lockSearchindex( $db ) { $write = [ 'searchindex' ]; @@ -1336,7 +1337,7 @@ abstract class Maintenance { /** * Unlock the tables - * @param Database &$db + * @param IMaintainableDatabase &$db */ private function unlockSearchindex( $db ) { $db->unlockTables( __CLASS__ . '::' . __METHOD__ ); @@ -1345,7 +1346,7 @@ abstract class Maintenance { /** * Unlock and lock again * Since the lock is low-priority, queued reads will be able to complete - * @param Database &$db + * @param IMaintainableDatabase &$db */ private function relockSearchindex( $db ) { $this->unlockSearchindex( $db ); @@ -1356,7 +1357,7 @@ abstract class Maintenance { * Perform a search index update with locking * @param int $maxLockTime The maximum time to keep the search index locked. * @param string $callback The function that will update the function. - * @param Database $dbw + * @param IMaintainableDatabase $dbw * @param array $results */ public function updateSearchIndex( $maxLockTime, $callback, $dbw, $results ) { @@ -1392,7 +1393,7 @@ abstract class Maintenance { /** * Update the searchindex table for a given pageid - * @param Database $dbw A database write handle + * @param IDatabase $dbw A database write handle * @param int $pageId The page ID to update. * @return null|string */ diff --git a/maintenance/archives/patch-rename-ar_usertext_timestamp.sql b/maintenance/archives/patch-rename-ar_usertext_timestamp.sql new file mode 100644 index 0000000000..658c179a47 --- /dev/null +++ b/maintenance/archives/patch-rename-ar_usertext_timestamp.sql @@ -0,0 +1,7 @@ +-- Rename the archive.ar_usertext_timestamp index to usertext_timestamp. +-- This is for MySQL only and is only necessary on wikis freshly installed on +-- 1.28.0 when bug T154872 was present. The patch will probably be removed in +-- 1.29 since we plan on renaming the index properly to ar_usertext_timestamp. +ALTER TABLE /*$wgDBprefix*/archive + DROP INDEX ar_usertext_timestamp, + ADD INDEX usertext_timestamp (ar_user_text,ar_timestamp); diff --git a/maintenance/archives/upgradeLogging.php b/maintenance/archives/upgradeLogging.php index 0beff7caec..13362e09ae 100644 --- a/maintenance/archives/upgradeLogging.php +++ b/maintenance/archives/upgradeLogging.php @@ -23,6 +23,8 @@ require __DIR__ . '/../commandLine.inc'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script that upgrade for log_id/log_deleted fields in a * replication-safe way. @@ -32,7 +34,7 @@ require __DIR__ . '/../commandLine.inc'; class UpdateLogging { /** - * @var Database + * @var IMaintainableDatabase */ public $dbw; public $batchSize = 1000; diff --git a/maintenance/benchmarks/bench_delete_truncate.php b/maintenance/benchmarks/bench_delete_truncate.php index 2a8d79a944..2369d993ea 100644 --- a/maintenance/benchmarks/bench_delete_truncate.php +++ b/maintenance/benchmarks/bench_delete_truncate.php @@ -23,6 +23,9 @@ require_once __DIR__ . '/Benchmarker.php'; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE. * @@ -69,7 +72,7 @@ class BenchmarkDeleteTruncate extends Benchmarker { } /** - * @param Database $dbw + * @param IDatabase $dbw * @return void */ private function insertData( $dbw ) { @@ -82,7 +85,7 @@ class BenchmarkDeleteTruncate extends Benchmarker { } /** - * @param Database $dbw + * @param IDatabase $dbw * @return void */ private function delete( $dbw ) { @@ -90,7 +93,7 @@ class BenchmarkDeleteTruncate extends Benchmarker { } /** - * @param Database $dbw + * @param IMaintainableDatabase $dbw * @return void */ private function truncate( $dbw ) { diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php index 70f365485d..675d0695d9 100644 --- a/maintenance/convertUserOptions.php +++ b/maintenance/convertUserOptions.php @@ -24,6 +24,7 @@ require_once __DIR__ . '/Maintenance.php'; use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; /** * Maintenance script to convert user options to the new `user_properties` table. @@ -76,7 +77,7 @@ class ConvertUserOptions extends Maintenance { /** * @param ResultWrapper $res - * @param Database $dbw + * @param IDatabase $dbw * @return null|int */ function convertOptionBatch( $res, $dbw ) { diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php index df496d435b..e99f2b0d5b 100644 --- a/maintenance/deleteOrphanedRevisions.php +++ b/maintenance/deleteOrphanedRevisions.php @@ -26,6 +26,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script that deletes revisions which refer to a nonexisting page. * @@ -83,7 +85,7 @@ class DeleteOrphanedRevisions extends Maintenance { * Do this inside a transaction * * @param array $id Array of revision id values - * @param Database $dbw Database class (needs to be a master) + * @param IDatabase $dbw Master DB handle */ private function deleteRevs( $id, &$dbw ) { if ( !is_array( $id ) ) { diff --git a/maintenance/deleteRevision.php b/maintenance/deleteRevision.php index 0111ac578a..3abbdab99b 100644 --- a/maintenance/deleteRevision.php +++ b/maintenance/deleteRevision.php @@ -86,7 +86,6 @@ class DeleteRevision extends Maintenance { ); $dbw->delete( 'revision', [ 'rev_id' => $revID ] ); if ( $pageLatest == $revID ) { - // Database integrity $newLatest = $dbw->selectField( 'revision', 'rev_id', diff --git a/maintenance/dumpIterator.php b/maintenance/dumpIterator.php index 9f983c1a04..6dbad94956 100644 --- a/maintenance/dumpIterator.php +++ b/maintenance/dumpIterator.php @@ -117,7 +117,7 @@ abstract class DumpIterator extends Maintenance { /** * Callback function for each revision, child classes should override * processRevision instead. - * @param Database $rev + * @param WikiRevision $rev */ public function handleRevision( $rev ) { $title = $rev->getTitle(); diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php index 5d92eec2ae..581f0d7b4d 100644 --- a/maintenance/dumpTextPass.php +++ b/maintenance/dumpTextPass.php @@ -27,7 +27,7 @@ require_once __DIR__ . '/backup.inc'; require_once __DIR__ . '/../includes/export/WikiExporter.php'; -use Wikimedia\Rdbms\LoadBalancer; +use Wikimedia\Rdbms\IMaintainableDatabase; /** * @ingroup Maintenance @@ -88,7 +88,7 @@ class TextPassDumper extends BackupDumper { protected $checkpointFiles = []; /** - * @var Database + * @var IMaintainableDatabase */ protected $db; diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php index 9dee6e530d..9c5a375154 100644 --- a/maintenance/fetchText.php +++ b/maintenance/fetchText.php @@ -24,6 +24,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script used to fetch page text in a subprocess. * @@ -71,7 +73,7 @@ class FetchText extends Maintenance { /** * May throw a database error if, say, the server dies during query. - * @param Database $db + * @param IDatabase $db * @param int $id The old_id * @return string */ diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php index 80e8011f40..0bd627ff1a 100644 --- a/maintenance/namespaceDupes.php +++ b/maintenance/namespaceDupes.php @@ -24,11 +24,12 @@ * @ingroup Maintenance */ +require_once __DIR__ . '/Maintenance.php'; + use MediaWiki\Linker\LinkTarget; use MediaWiki\MediaWikiServices; use Wikimedia\Rdbms\ResultWrapper; - -require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; /** * Maintenance script that checks for articles to fix after @@ -39,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php'; class NamespaceConflictChecker extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $db; diff --git a/maintenance/orphans.php b/maintenance/orphans.php index 2da8830643..e36c5b67dd 100644 --- a/maintenance/orphans.php +++ b/maintenance/orphans.php @@ -30,6 +30,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script that looks for 'orphan' revisions hooked to pages which * don't exist and 'childless' pages with no revisions. @@ -56,7 +58,7 @@ class Orphans extends Maintenance { /** * Lock the appropriate tables for the script - * @param Database $db + * @param IMaintainableDatabase $db * @param string[] $extraTable The name of any extra tables to lock (eg: text) */ private function lockTables( $db, $extraTable = [] ) { diff --git a/maintenance/populateContentModel.php b/maintenance/populateContentModel.php index b41e0e0d6e..7d83180eed 100644 --- a/maintenance/populateContentModel.php +++ b/maintenance/populateContentModel.php @@ -23,13 +23,15 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Usage: * populateContentModel.php --ns=1 --table=page */ class PopulateContentModel extends Maintenance { protected $wikiId; - + /** @var WANObjectCache */ protected $wanCache; public function __construct() { @@ -78,7 +80,7 @@ class PopulateContentModel extends Maintenance { $this->wanCache->delete( $revisionKey ); } - private function updatePageRows( Database $dbw, $pageIds, $model ) { + private function updatePageRows( IDatabase $dbw, $pageIds, $model ) { $count = count( $pageIds ); $this->output( "Setting $count rows to $model..." ); $dbw->update( @@ -91,7 +93,7 @@ class PopulateContentModel extends Maintenance { $this->output( "done.\n" ); } - protected function populatePage( Database $dbw, $ns ) { + protected function populatePage( IDatabase $dbw, $ns ) { $toSave = []; $lastId = 0; $nsCondition = $ns === 'all' ? [] : [ 'page_namespace' => $ns ]; @@ -123,7 +125,7 @@ class PopulateContentModel extends Maintenance { } } - private function updateRevisionOrArchiveRows( Database $dbw, $ids, $model, $table ) { + private function updateRevisionOrArchiveRows( IDatabase $dbw, $ids, $model, $table ) { $prefix = $table === 'archive' ? 'ar' : 'rev'; $model_column = "{$prefix}_content_model"; $format_column = "{$prefix}_content_format"; @@ -142,7 +144,7 @@ class PopulateContentModel extends Maintenance { $this->output( "done.\n" ); } - protected function populateRevisionOrArchive( Database $dbw, $table, $ns ) { + protected function populateRevisionOrArchive( IDatabase $dbw, $table, $ns ) { $prefix = $table === 'archive' ? 'ar' : 'rev'; $model_column = "{$prefix}_content_model"; $format_column = "{$prefix}_content_format"; diff --git a/maintenance/populateRecentChangesSource.php b/maintenance/populateRecentChangesSource.php index ac87cf3ecb..5d5da89a8c 100644 --- a/maintenance/populateRecentChangesSource.php +++ b/maintenance/populateRecentChangesSource.php @@ -23,6 +23,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script to populate the rc_source field. * @@ -83,7 +85,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance { return __CLASS__; } - protected function buildUpdateCondition( Database $dbw ) { + protected function buildUpdateCondition( IDatabase $dbw ) { $rcNew = $dbw->addQuotes( RC_NEW ); $rcSrcNew = $dbw->addQuotes( RecentChange::SRC_NEW ); $rcEdit = $dbw->addQuotes( RC_EDIT ); diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php index 6aa1f37a8c..966864e62d 100644 --- a/maintenance/rebuildImages.php +++ b/maintenance/rebuildImages.php @@ -32,6 +32,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to update image metadata records. * @@ -40,7 +42,7 @@ require_once __DIR__ . '/Maintenance.php'; class ImageBuilder extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $dbw; diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php index b7f07629ec..e4bb60e932 100644 --- a/maintenance/rebuildtextindex.php +++ b/maintenance/rebuildtextindex.php @@ -27,6 +27,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script that rebuilds search index table from scratch. * @@ -36,7 +38,7 @@ class RebuildTextIndex extends Maintenance { const RTI_CHUNK_SIZE = 500; /** - * @var Database + * @var IMaintainableDatabase */ private $db; diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php index 372c352846..b557f3d3df 100644 --- a/maintenance/refreshImageMetadata.php +++ b/maintenance/refreshImageMetadata.php @@ -29,6 +29,9 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to refresh image metadata fields. * @@ -37,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php'; class RefreshImageMetadata extends Maintenance { /** - * @var Database + * @var IMaintainableDatabase */ protected $dbw; @@ -205,7 +208,7 @@ class RefreshImageMetadata extends Maintenance { } /** - * @param Database $dbw + * @param IDatabase $dbw * @return array */ function getConditions( $dbw ) { diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php index 67f778062b..a6cd54853e 100644 --- a/maintenance/refreshLinks.php +++ b/maintenance/refreshLinks.php @@ -390,7 +390,7 @@ class RefreshLinks extends Maintenance { * By specifying a null $start or $end, it is also possible to create * half-bounded or unbounded intervals using this function. * - * @param IDatabase $db Database connection + * @param IDatabase $db * @param string $var Field name * @param mixed $start First value to include or null * @param mixed $end Last value to include or null diff --git a/maintenance/sql.php b/maintenance/sql.php index b03620dd6a..70f9aaad47 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -77,7 +77,7 @@ class MwSql extends Maintenance { $index = DB_MASTER; } - /** @var Database $db DB handle for the appropriate cluster/wiki */ + /** @var IDatabase $db DB handle for the appropriate cluster/wiki */ $db = $lb->getConnection( $index, [], $wiki ); if ( $replicaDB != '' && $db->getLBInfo( 'master' ) !== null ) { $this->error( "The server selected ({$db->getServer()}) is not a replica DB.", 1 ); diff --git a/maintenance/update.php b/maintenance/update.php index d96cecd6be..5f705ba371 100755 --- a/maintenance/update.php +++ b/maintenance/update.php @@ -27,6 +27,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + /** * Maintenance script to run database schema updates. * @@ -145,7 +147,7 @@ class UpdateMediaWiki extends Maintenance { $this->output( "Going to run database updates for " . wfWikiID() . "\n" ); if ( $db->getType() === 'sqlite' ) { - /** @var Database|DatabaseSqlite $db */ + /** @var IMaintainableDatabase|DatabaseSqlite $db */ $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" ); } $this->output( "Depending on the size of your database this may take a while!\n" ); diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php index e70a176909..84fc2d208e 100644 --- a/maintenance/updateCollation.php +++ b/maintenance/updateCollation.php @@ -26,6 +26,8 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IDatabase; + /** * Maintenance script that will find all rows in the categorylinks table * whose collation is out-of-date. @@ -242,7 +244,7 @@ TEXT * Return an SQL expression selecting rows which sort above the given row, * assuming an ordering of cl_collation, cl_to, cl_type, cl_from * @param stdClass $row - * @param Database $dbw + * @param IDatabase $dbw * @return string */ function getBatchCondition( $row, $dbw ) { diff --git a/resources/src/mediawiki.language/specialcharacters.json b/resources/src/mediawiki.language/specialcharacters.json index 0dffd7dd05..293382792b 100644 --- a/resources/src/mediawiki.language/specialcharacters.json +++ b/resources/src/mediawiki.language/specialcharacters.json @@ -444,5 +444,47 @@ ], "khmer": [ "ក", "ខ", "គ", "ឃ", "ង", "ច", "ឆ", "ជ", "ឈ", "ញ", "ដ", "ឋ", "ឌ", "ឍ", "ណ", "ត", "ថ", "ទ", "ធ", "ន", "ប", "ផ", "ព", "ភ", "ម", "យ", "រ", "ល", "វ", "ស", "ហ", "ឡ", "អ", "ឣ", "ឤ", "ឥ", "ឦ", "ឧ", "ឨ", "ឩ", "ឪ", "ឫ", "ឬ", "ឭ", "ឮ", "ឯ", "ឰ", "ឱ", "ឲ", "ឳ", "្", "឴", "឵", "ា", "ិ", "ី", "ឹ", "ឺ", "ុ", "ូ", "ួ", "ើ", "ឿ", "ៀ", "េ", "ែ", "ៃ", "ោ", "ៅ", "ំ", "ះ", "ៈ", "៉", "៊", "់", "៌", "៍", "៎", "៏", "័", "៑", "៓", "៝", "ៜ", "០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩", "៛", "។", "៕", "៖", "ៗ", "៘", "៙", "៚", "៰", "៱", "៲", "៳", "៴", "៵", "៶", "៷", "៸", "៹", "᧠", "᧡", "᧢", "᧣", "᧤", "᧥", "᧦", "᧧", "᧨", "᧩", "᧪", "᧫", "᧬", "᧭", "᧮", "᧯", "᧰", "᧱", "᧲", "᧳", "᧴", "᧵", "᧶", "᧷", "᧸", "᧹", "᧺", "᧻", "᧼", "᧽", "᧾", "᧿" + ], + "canadianaboriginal": [ + "ᐁ", "ᐂ", "ᐃ", "ᐄ", "ᐅ", "ᐆ", "ᐇ", "ᐈ", "ᐉ", "ᐊ", "ᐋ", "ᐌ", "ᐍ", "ᐎ", "ᐏ", "ᐐ", + "ᐑ", "ᐒ", "ᐓ", "ᐔ", "ᐕ", "ᐖ", "ᐗ", "ᐘ", "ᐙ", "ᐚ", "ᐛ", "ᐜ", "ᐝ", "ᐞ", "ᐟ", "ᐠ", + "ᐡ", "ᐢ", "ᐣ", "ᐤ", "ᐥ", "ᐦ", "ᐧ", "ᐨ", "ᐩ", "ᐪ", "ᐫ", "ᐬ", "ᐭ", "ᐮ", "ᐯ", "ᐰ", + "ᐱ", "ᐲ", "ᐳ", "ᐴ", "ᐵ", "ᐶ", "ᐷ", "ᐸ", "ᐹ", "ᐺ", "ᐻ", "ᐼ", "ᐽ", "ᐾ", "ᐿ", "ᑀ", + "ᑁ", "ᑂ", "ᑃ", "ᑄ", "ᑅ", "ᑆ", "ᑇ", "ᑈ", "ᑉ", "ᑊ", "ᑋ", "ᑌ", "ᑍ", "ᑎ", "ᑏ", "ᑐ", + "ᑑ", "ᑒ", "ᑓ", "ᑔ", "ᑕ", "ᑖ", "ᑗ", "ᑘ", "ᑙ", "ᑚ", "ᑛ", "ᑜ", "ᑝ", "ᑞ", "ᑟ", "ᑠ", + "ᑡ", "ᑢ", "ᑣ", "ᑤ", "ᑥ", "ᑦ", "ᑧ", "ᑨ", "ᑩ", "ᑪ", "ᑫ", "ᑬ", "ᑭ", "ᑮ", "ᑯ", "ᑰ", + "ᑱ", "ᑲ", "ᑳ", "ᑴ", "ᑵ", "ᑶ", "ᑷ", "ᑸ", "ᑹ", "ᑺ", "ᑻ", "ᑼ", "ᑽ", "ᑾ", "ᑿ", "ᒀ", + "ᒁ", "ᒂ", "ᒃ", "ᒄ", "ᒅ", "ᒆ", "ᒇ", "ᒈ", "ᒉ", "ᒊ", "ᒋ", "ᒌ", "ᒍ", "ᒎ", "ᒏ", "ᒐ", + "ᒑ", "ᒒ", "ᒓ", "ᒔ", "ᒕ", "ᒖ", "ᒗ", "ᒘ", "ᒙ", "ᒚ", "ᒛ", "ᒜ", "ᒝ", "ᒞ", "ᒟ", "ᒠ", + "ᒡ", "ᒢ", "ᒣ", "ᒤ", "ᒥ", "ᒦ", "ᒧ", "ᒨ", "ᒩ", "ᒪ", "ᒫ", "ᒬ", "ᒭ", "ᒮ", "ᒯ", "ᒰ", + "ᒱ", "ᒲ", "ᒳ", "ᒴ", "ᒵ", "ᒶ", "ᒷ", "ᒸ", "ᒹ", "ᒺ", "ᒻ", "ᒼ", "ᒽ", "ᒾ", "ᒿ", "ᓀ", + "ᓁ", "ᓂ", "ᓃ", "ᓄ", "ᓅ", "ᓆ", "ᓇ", "ᓈ", "ᓉ", "ᓊ", "ᓋ", "ᓌ", "ᓍ", "ᓎ", "ᓏ", "ᓐ", + "ᓑ", "ᓒ", "ᓓ", "ᓔ", "ᓕ", "ᓖ", "ᓗ", "ᓘ", "ᓙ", "ᓚ", "ᓛ", "ᓜ", "ᓝ", "ᓞ", "ᓟ", "ᓠ", + "ᓡ", "ᓢ", "ᓣ", "ᓤ", "ᓥ", "ᓦ", "ᓧ", "ᓨ", "ᓩ", "ᓪ", "ᓫ", "ᓬ", "ᓭ", "ᓮ", "ᓯ", "ᓰ", + "ᓱ", "ᓲ", "ᓳ", "ᓴ", "ᓵ", "ᓶ", "ᓷ", "ᓸ", "ᓹ", "ᓺ", "ᓻ", "ᓼ", "ᓽ", "ᓾ", "ᓿ", "ᔀ", + "ᔁ", "ᔂ", "ᔃ", "ᔄ", "ᔅ", "ᔆ", "ᔇ", "ᔈ", "ᔉ", "ᔊ", "ᔋ", "ᔌ", "ᔍ", "ᔎ", "ᔏ", "ᔐ", + "ᔑ", "ᔒ", "ᔓ", "ᔔ", "ᔕ", "ᔖ", "ᔗ", "ᔘ", "ᔙ", "ᔚ", "ᔛ", "ᔜ", "ᔝ", "ᔞ", "ᔟ", "ᔠ", + "ᔡ", "ᔢ", "ᔣ", "ᔤ", "ᔥ", "ᔦ", "ᔧ", "ᔨ", "ᔩ", "ᔪ", "ᔫ", "ᔬ", "ᔭ", "ᔮ", "ᔯ", "ᔰ", + "ᔱ", "ᔲ", "ᔳ", "ᔴ", "ᔵ", "ᔶ", "ᔷ", "ᔸ", "ᔹ", "ᔺ", "ᔻ", "ᔼ", "ᔽ", "ᔾ", "ᔿ", "ᕀ", + "ᕁ", "ᕂ", "ᕃ", "ᕄ", "ᕅ", "ᕆ", "ᕇ", "ᕈ", "ᕉ", "ᕊ", "ᕋ", "ᕌ", "ᕍ", "ᕎ", "ᕏ", "ᕐ", + "ᕑ", "ᕒ", "ᕓ", "ᕔ", "ᕕ", "ᕖ", "ᕗ", "ᕘ", "ᕙ", "ᕚ", "ᕛ", "ᕜ", "ᕝ", "ᕞ", "ᕟ", "ᕠ", + "ᕡ", "ᕢ", "ᕣ", "ᕤ", "ᕥ", "ᕦ", "ᕧ", "ᕨ", "ᕩ", "ᕪ", "ᕫ", "ᕬ", "ᕭ", "ᕮ", "ᕯ", "ᕰ", + "ᕱ", "ᕲ", "ᕳ", "ᕴ", "ᕵ", "ᕶ", "ᕷ", "ᕸ", "ᕹ", "ᕺ", "ᕻ", "ᕼ", "ᕽ", "ᕾ", "ᕿ", "ᖀ", + "ᖁ", "ᖂ", "ᖃ", "ᖄ", "ᖅ", "ᖆ", "ᖇ", "ᖈ", "ᖉ", "ᖊ", "ᖋ", "ᖌ", "ᖍ", "ᖎ", "ᖏ", "ᖐ", + "ᖑ", "ᖒ", "ᖓ", "ᖔ", "ᖕ", "ᖖ", "ᖗ", "ᖘ", "ᖙ", "ᖚ", "ᖛ", "ᖜ", "ᖝ", "ᖞ", "ᖟ", "ᖠ", + "ᖡ", "ᖢ", "ᖣ", "ᖤ", "ᖥ", "ᖦ", "ᖧ", "ᖨ", "ᖩ", "ᖪ", "ᖫ", "ᖬ", "ᖭ", "ᖮ", "ᖯ", "ᖰ", + "ᖱ", "ᖲ", "ᖳ", "ᖴ", "ᖵ", "ᖶ", "ᖷ", "ᖸ", "ᖹ", "ᖺ", "ᖻ", "ᖼ", "ᖽ", "ᖾ", "ᖿ", "ᗀ", + "ᗁ", "ᗂ", "ᗃ", "ᗄ", "ᗅ", "ᗆ", "ᗇ", "ᗈ", "ᗉ", "ᗊ", "ᗋ", "ᗌ", "ᗍ", "ᗎ", "ᗏ", "ᗐ", + "ᗑ", "ᗒ", "ᗓ", "ᗔ", "ᗕ", "ᗖ", "ᗗ", "ᗘ", "ᗙ", "ᗚ", "ᗛ", "ᗜ", "ᗝ", "ᗞ", "ᗟ", "ᗠ", + "ᗡ", "ᗢ", "ᗣ", "ᗤ", "ᗥ", "ᗦ", "ᗧ", "ᗨ", "ᗩ", "ᗪ", "ᗫ", "ᗬ", "ᗭ", "ᗮ", "ᗯ", "ᗰ", + "ᗱ", "ᗲ", "ᗳ", "ᗴ", "ᗵ", "ᗶ", "ᗷ", "ᗸ", "ᗹ", "ᗺ", "ᗻ", "ᗼ", "ᗽ", "ᗾ", "ᗿ", "ᘀ", + "ᘁ", "ᘂ", "ᘃ", "ᘄ", "ᘅ", "ᘆ", "ᘇ", "ᘈ", "ᘉ", "ᘊ", "ᘋ", "ᘌ", "ᘍ", "ᘎ", "ᘏ", "ᘐ", + "ᘑ", "ᘒ", "ᘓ", "ᘔ", "ᘕ", "ᘖ", "ᘗ", "ᘘ", "ᘙ", "ᘚ", "ᘛ", "ᘜ", "ᘝ", "ᘞ", "ᘟ", "ᘠ", + "ᘡ", "ᘢ", "ᘣ", "ᘤ", "ᘥ", "ᘦ", "ᘧ", "ᘨ", "ᘩ", "ᘪ", "ᘫ", "ᘬ", "ᘭ", "ᘮ", "ᘯ", "ᘰ", + "ᘱ", "ᘲ", "ᘳ", "ᘴ", "ᘵ", "ᘶ", "ᘷ", "ᘸ", "ᘹ", "ᘺ", "ᘻ", "ᘼ", "ᘽ", "ᘾ", "ᘿ", "ᙀ", + "ᙁ", "ᙂ", "ᙃ", "ᙄ", "ᙅ", "ᙆ", "ᙇ", "ᙈ", "ᙉ", "ᙊ", "ᙋ", "ᙌ", "ᙍ", "ᙎ", "ᙏ", "ᙐ", + "ᙑ", "ᙒ", "ᙓ", "ᙔ", "ᙕ", "ᙖ", "ᙗ", "ᙘ", "ᙙ", "ᙚ", "ᙛ", "ᙜ", "ᙝ", "ᙞ", "ᙟ", "ᙠ", + "ᙡ", "ᙢ", "ᙣ", "ᙤ", "ᙥ", "ᙦ", "ᙧ", "ᙨ", "ᙩ", "ᙪ", "ᙫ", "ᙬ", "᙭", "᙮", "ᙯ", "ᙰ", + "ᙱ", "ᙲ", "ᙳ", "ᙴ", "ᙵ", "ᙶ" ] } diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js index f04cc856e4..8fd15531ae 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js @@ -192,7 +192,7 @@ * @param {Array} filters Filter group definition */ mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) { - var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult, subsetNames, + var i, filterItem, filterConflictResult, groupConflictResult, subsetNames, model = this, items = [], supersetMap = {}, @@ -283,7 +283,6 @@ groupConflictMap[ group ] = data.conflicts; } - selectedFilterNames = []; for ( i = 0; i < data.filters.length; i++ ) { data.filters[ i ].subset = data.filters[ i ].subset || []; data.filters[ i ].subset = data.filters[ i ].subset.map( function ( el ) { @@ -330,22 +329,20 @@ // Store the default parameter state // For this group type, parameter values are direct model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default ); - } else if ( - data.type === 'string_options' && - data.filters[ i ].default - ) { - selectedFilterNames.push( data.filters[ i ].name ); } model.groups[ group ].addItems( filterItem ); items.push( filterItem ); } - if ( data.type === 'string_options' ) { + if ( data.type === 'string_options' && data.default ) { // Store the default parameter group state // For this group, the parameter is group name and value is the names // of selected items - model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() ); + model.defaultParams[ group ] = model.sanitizeStringOptionGroup( + group, + data.default.split( model.groups[ group ].getSeparator() ) + ).join( model.groups[ group ].getSeparator() ); } } ); @@ -655,8 +652,8 @@ paramValues.length === model.groups[ group ].getItemCount() ) ? // All true (either because all values are written or the term 'all' is written) - // is the same as all filters set to false - false : + // is the same as all filters set to true + true : // Otherwise, the filter is selected only if it appears in the parameter values paramValues.indexOf( filterItem.getParamName() ) > -1; } diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js index b5b768f222..669420caf9 100644 --- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js +++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js @@ -111,6 +111,11 @@ mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) { var filterItem = this.filtersModel.getItemByName( filterName ); + if ( !filterItem ) { + // If no filter was found, break + return; + } + isSelected = isSelected === undefined ? !filterItem.isSelected() : isSelected; if ( filterItem.isSelected() !== isSelected ) { diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less index 1ef49e2102..3060f255cd 100644 --- a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less +++ b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less @@ -11,9 +11,9 @@ // Result list circle indicators // Defined and used in mw.rcfilters.ui.ChangesListWrapperWidget.less -@result-circle-margin: 0.1em; +@result-circle-margin: 3px; @result-circle-general-margin: 0.5em; // In these small sizes, 'em' appears // squished and inconsistent. // Pixels are better for this use case: -@result-circle-diameter: 5px; +@result-circle-diameter: 6px; diff --git a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js index 761fc6500b..e17d028ab7 100644 --- a/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js +++ b/resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js @@ -71,7 +71,10 @@ enter: 'onTextInputEnter' } ); this.capsule.connect( this, { capsuleItemClick: 'onCapsuleItemClick' } ); - this.capsule.popup.connect( this, { toggle: 'onCapsulePopupToggle' } ); + this.capsule.popup.connect( this, { + toggle: 'onCapsulePopupToggle', + ready: 'onCapsulePopupReady' + } ); // Initialize this.$element @@ -102,26 +105,29 @@ this.scrollToTop( filterWidget.$element ); }; + /** + * Respond to capsule popup ready event, fired after the popup is visible, positioned and clipped + */ + mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupReady = function () { + mw.hook( 'RcFilters.popup.open' ).fire( this.filterPopup.getSelectedFilter() ); + + this.scrollToTop( this.capsule.$element, 10 ); + if ( !this.filterPopup.getSelectedFilter() ) { + // No selection, scroll the popup list to top + setTimeout( function () { this.capsule.popup.$body.scrollTop( 0 ); }.bind( this ), 0 ); + } + }; + /** * Respond to popup toggle event. Reset selection in the list when the popup is closed. * * @param {boolean} isVisible Popup is visible */ mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupToggle = function ( isVisible ) { - if ( !isVisible ) { - if ( !this.textInput.getValue() ) { - // Only reset selection if we are not filtering - this.filterPopup.resetSelection(); - this.capsule.resetSelection(); - } - } else { - mw.hook( 'RcFilters.popup.open' ).fire( this.filterPopup.getSelectedFilter() ); - - this.scrollToTop( this.capsule.$element, 10 ); - if ( !this.filterPopup.getSelectedFilter() ) { - // No selection, scroll the popup list to top - setTimeout( function () { this.capsule.popup.$body.scrollTop( 0 ); }.bind( this ), 0 ); - } + if ( !isVisible && !this.textInput.getValue() ) { + // Only reset selection if we are not filtering + this.filterPopup.resetSelection(); + this.capsule.resetSelection(); } }; @@ -152,7 +158,9 @@ var filter = this.filterPopup.getSelectedFilter(); // Toggle the filter - this.controller.toggleFilterSelect( filter ); + if ( filter ) { + this.controller.toggleFilterSelect( filter ); + } }; /** diff --git a/resources/src/mediawiki.skinning/content.parsoid.less b/resources/src/mediawiki.skinning/content.parsoid.less index ee18979029..b09986f278 100644 --- a/resources/src/mediawiki.skinning/content.parsoid.less +++ b/resources/src/mediawiki.skinning/content.parsoid.less @@ -46,7 +46,9 @@ sub { /** * Block media items */ -figure[typeof*='mw:Image'] { +figure[typeof*='mw:Image'], +figure[typeof*='mw:Video'], +figure[typeof*='mw:Audio'] { margin: 0; a { @@ -109,7 +111,11 @@ figure[typeof*='mw:Image'] { } figure[typeof~='mw:Image/Thumb'], -figure[typeof~='mw:Image/Frame'] { +figure[typeof~='mw:Video/Thumb'], +figure[typeof~='mw:Audio/Thumb'], +figure[typeof~='mw:Image/Frame'], +figure[typeof~='mw:Video/Frame'], +figure[typeof~='mw:Audio/Frame'] { display: table; overflow: auto; text-align: center; @@ -125,19 +131,28 @@ figure[typeof~='mw:Image/Frame'] { } figure[typeof~='mw:Image/Thumb'] > *:first-child > img, -figure[typeof~='mw:Image/Frame'] > *:first-child > img { +figure[typeof~='mw:Video/Thumb'] > *:first-child > video, +figure[typeof~='mw:Audio/Thumb'] > *:first-child > video, +figure[typeof~='mw:Image/Frame'] > *:first-child > img, +figure[typeof~='mw:Video/Frame'] > *:first-child > video, +figure[typeof~='mw:Audio/Frame'] > *:first-child > video { border: 1px solid #c8ccd1; margin: 3px; background: #fff; } /* Same as img.thumbborder in content.css */ -.mw-image-border > *:first-child > img { +.mw-image-border > *:first-child > img, +.mw-image-border > *:first-child > video { border: 1px solid #eaecf0; } /* Hide the caption for frameless and plain floated images */ figure[typeof~='mw:Image/Frameless'] > figcaption, -figure[typeof~='mw:Image'] > figcaption { +figure[typeof~='mw:Video/Frameless'] > figcaption, +figure[typeof~='mw:Audio/Frameless'] > figcaption, +figure[typeof~='mw:Image'] > figcaption, +figure[typeof~='mw:Video'] > figcaption, +figure[typeof~='mw:Audio'] > figcaption { display: none; } diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css index bc752b5719..2a47fa2d37 100644 --- a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css +++ b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css @@ -22,11 +22,9 @@ .mw-widget-mediaResultWidget-thumbnail { opacity: 0; display: inline-block; - /* stylelint-disable no-unsupported-browser-features */ -webkit-transition: opacity 400ms; -moz-transition: opacity 400ms; transition: opacity 400ms; - /* stylelint-enable no-unsupported-browser-features */ } .mw-widget-mediaResultWidget-done .mw-widget-mediaResultWidget-thumbnail, @@ -35,7 +33,7 @@ } .mw-widget-mediaResultWidget-crop { - background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */ + background-size: cover; background-position: center center; } @@ -56,7 +54,7 @@ .mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail { /* @embed */ background-image: url( broken-image.png ); - background-size: auto; /* stylelint-disable-line no-unsupported-browser-features */ + background-size: auto; background-position: center center; background-repeat: no-repeat; } @@ -69,7 +67,7 @@ overflow: hidden; padding: 0.5em; color: #fff; - text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */ + text-shadow: 1px 1px #000; line-height: 1.125em; background-color: rgba( 0, 0, 0, 0.5 ); text-overflow: ellipsis; diff --git a/resources/src/mediawiki/mediawiki.notification.css b/resources/src/mediawiki/mediawiki.notification.css index 147de92f7e..633798d9c9 100644 --- a/resources/src/mediawiki/mediawiki.notification.css +++ b/resources/src/mediawiki/mediawiki.notification.css @@ -1,7 +1,8 @@ .mw-notification-area { top: 0; right: 0; - padding: 1em 1em 0 0; + /* Padding on all sides so drop shadows aren't cut by overflow: hidden */ + padding: 1em; width: 20em; line-height: 1.35; z-index: 10000; diff --git a/resources/src/mediawiki/mediawiki.notification.js b/resources/src/mediawiki/mediawiki.notification.js index 4849f5a08b..d36c4a06b9 100644 --- a/resources/src/mediawiki/mediawiki.notification.js +++ b/resources/src/mediawiki/mediawiki.notification.js @@ -396,9 +396,9 @@ defaults: { autoHide: true, autoHideSeconds: 'short', - tag: false, - title: undefined, - type: false + tag: null, + title: null, + type: null }, /** diff --git a/resources/src/mediawiki/mediawiki.toc.js b/resources/src/mediawiki/mediawiki.toc.js index 0955c23f06..9ef6c4384a 100644 --- a/resources/src/mediawiki/mediawiki.toc.js +++ b/resources/src/mediawiki/mediawiki.toc.js @@ -3,56 +3,60 @@ // Table of contents toggle mw.hook( 'wikipage.content' ).add( function ( $content ) { - var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc; - $toc = $content.find( '#toc' ); - $tocTitle = $content.find( '#toctitle' ); - $tocToggleLink = $content.find( '#togglelink' ); - $tocList = $toc.find( 'ul' ).eq( 0 ); + $content.find( '.toc' ).addBack( '.toc' ).each( function () { + var hideToc, + $this = $( this ), + // .toctitle is new so may not exist in HTML caches for a few weeks, + // so keep checking for #toctitle for now + $tocTitle = $this.find( '.toctitle, #toctitle' ), + $tocToggleLink = $this.find( '.togglelink' ), + $tocList = $this.find( 'ul' ).eq( 0 ); - // Hide/show the table of contents element - function toggleToc() { - if ( $tocList.is( ':hidden' ) ) { - $tocList.slideDown( 'fast' ); - $tocToggleLink.text( mw.msg( 'hidetoc' ) ); - $toc.removeClass( 'tochidden' ); - mw.cookie.set( 'hidetoc', null ); - } else { - $tocList.slideUp( 'fast' ); - $tocToggleLink.text( mw.msg( 'showtoc' ) ); - $toc.addClass( 'tochidden' ); - mw.cookie.set( 'hidetoc', '1' ); + // Hide/show the table of contents element + function toggleToc() { + if ( $tocList.is( ':hidden' ) ) { + $tocList.slideDown( 'fast' ); + $tocToggleLink.text( mw.msg( 'hidetoc' ) ); + $this.removeClass( 'tochidden' ); + mw.cookie.set( 'hidetoc', null ); + } else { + $tocList.slideUp( 'fast' ); + $tocToggleLink.text( mw.msg( 'showtoc' ) ); + $this.addClass( 'tochidden' ); + mw.cookie.set( 'hidetoc', '1' ); + } } - } - // Only add it if there is a complete TOC and it doesn't - // have a toggle added already - if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) { - hideToc = mw.cookie.get( 'hidetoc' ) === '1'; + // Only add it if there is a complete TOC and it doesn't + // have a toggle added already + if ( $tocTitle.length && $tocList.length && !$tocToggleLink.length ) { + hideToc = mw.cookie.get( 'hidetoc' ) === '1'; - $tocToggleLink = $( '' ) - .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) ) - .on( 'click keypress', function ( e ) { - if ( - e.type === 'click' || - e.type === 'keypress' && e.which === 13 - ) { - toggleToc(); - } - } ); + $tocToggleLink = $( '' ) + .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) ) + .on( 'click keypress', function ( e ) { + if ( + e.type === 'click' || + e.type === 'keypress' && e.which === 13 + ) { + toggleToc(); + } + } ); - $tocTitle.append( - $tocToggleLink - .wrap( '' ) - .parent() - .prepend( ' [' ) - .append( '] ' ) - ); + $tocTitle.append( + $tocToggleLink + .wrap( '' ) + .parent() + .prepend( ' [' ) + .append( '] ' ) + ); - if ( hideToc ) { - $tocList.hide(); - $toc.addClass( 'tochidden' ); + if ( hideToc ) { + $tocList.hide(); + $this.addClass( 'tochidden' ); + } } - } + } ); } ); }( mediaWiki, jQuery ) ); diff --git a/resources/src/startup.js b/resources/src/startup.js index e8ccba0c8b..ad06b34876 100644 --- a/resources/src/startup.js +++ b/resources/src/startup.js @@ -36,7 +36,7 @@ mwPerformance.mark( 'mwLoadStart' ); * - IE 10+ * - Firefox 4+ * - Safari 5+ - * - Opera 15+ + * - Opera 12.10+ * - Mobile Safari 5.1+ (iOS 5+) * - Android 4.1+ * diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt index 7bf2ce2199..ee0d30f694 100644 --- a/tests/parser/parserTests.txt +++ b/tests/parser/parserTests.txt @@ -15458,7 +15458,7 @@ Section headings with TOC Some text ===Another headline=== !! html -

    Contents

    +

    Contents

    • 1 Headline 1
        @@ -15501,7 +15501,7 @@ __FORCETOC__ == Headline 2 == == Headline == !! html/php -

        Contents

        +

        Contents

        • 1 Headline 2
        • 2 Headline
        • @@ -15532,7 +15532,7 @@ Handling of sections up to level 6 and beyond ========= Level 9 Heading========= ========== Level 10 Heading========== !! html -

          Contents

          +

          Contents

          • 1 Level 1 Heading
              @@ -15585,7 +15585,7 @@ TOC regression (T11764) == title 2 == === title 2.1 === !! html -

              Contents

              +

              Contents

              • 1 title 1
                  @@ -15620,7 +15620,7 @@ TOC for heading containing (T96153) __FORCETOC__ ==New title== !! html/php -

                  Contents

                  +

                  Contents

                  @@ -15642,7 +15642,7 @@ wgMaxTocLevel=3 == title 2 == === title 2.1 === !! html -

                  Contents

                  +

                  Contents

                  • 1 title 1
                      @@ -15678,7 +15678,7 @@ wgMaxTocLevel=3 ====Section 1.1.1.1==== ==Section 2== !! html -

                      Contents

                      +

                      Contents

                      • 1 Section 1
                          @@ -15771,7 +15771,7 @@ __TOC__ === title 1.1 === == title 2 == !! html -

                          Contents

                          +

                          Contents

                          • 1 title 1
                              @@ -15838,7 +15838,7 @@ section 5 !! html

                              The tooltips shall not show entities to the user (ie. be double escaped)

                              -

                              Contents

                              +

                              Contents

                              • 1 text > text
                              • 2 text < text
                              • @@ -15897,7 +15897,7 @@ section 6 !! html

                                Id should not contain + for spaces

                                -

                                Contents

                                +

                                Contents

                                • 1 Space between Text
                                • 2 Space-Entity between Text
                                • @@ -15943,7 +15943,7 @@ Headers with excess '=' characters =''italic'' heading== ==''italic'' heading= !! html -

                                  Contents

                                  +

                                  Contents

                                  • 1 foo=
                                  • 2 =foo
                                  • @@ -15973,7 +15973,7 @@ HTML headers vs TOC (T25393) == Header 2.2 == __NOEDITSECTION__ !! html -

                                    Contents

                                    +

                                    Contents

                                    • 1 Header 1
                                        @@ -17751,7 +17751,7 @@ Fuzz testing: Parser14 http://__TOC__ !! html

                                        onmouseover=[edit]

                                        -http://

                                        Contents

                                        +http://

                                        Contents

                                        @@ -17762,7 +17762,7 @@ http://

                                        Contents

                                        onmouseover=[edit]

                                        http://

                                        -
                                        +

                                        Contents

                                          @@ -20216,7 +20216,7 @@ Out-of-order TOC heading levels =====5===== ==2== !! html -

                                          Contents

                                          +

                                          Contents

                                          • 1 2
                                              @@ -22198,7 +22198,7 @@ title=[[Main Page]] __TOC__ == ''Lost'' episodes == !! html -

                                              Contents

                                              +

                                              Contents

                                              @@ -22216,7 +22216,7 @@ title=[[Main Page]] __TOC__ == '''should be bold''' then normal text == !! html -

                                              Contents

                                              +

                                              Contents

                                              @@ -22234,7 +22234,7 @@ title=[[Main Page]] __TOC__ == Image [[Image:foobar.jpg]] == !! html -

                                              Contents

                                              +

                                              Contents

                                              @@ -22252,7 +22252,7 @@ title=[[Main Page]] __TOC__ ==
                                              Quote
                                              == !! html -

                                              Contents

                                              +

                                              Contents

                                              @@ -22263,7 +22263,7 @@ __TOC__ !! html+tidy

                                              -
                                              +

                                              Contents

                                                @@ -22288,7 +22288,7 @@ __TOC__ Hanc marginis exiguitas non caperet. QED !! html -

                                                Contents

                                                +

                                                Contents

                                                @@ -22308,7 +22308,7 @@ __TOC__ == Foo
                                                Bar
                                                == !! html -

                                                Contents

                                                +

                                                Contents

                                                • 1 Foo Bar
                                                • 2 Foo Bar
                                                • @@ -22321,7 +22321,7 @@ __TOC__ !! html+tidy

                                                  -
                                                  +

                                                  Contents

                                                    @@ -22350,7 +22350,7 @@ __TOC__ == Evilbye == !! html/php -

                                                    Contents

                                                    +

                                                    Contents

                                                    • 1 Hello
                                                    • 2 b">Evilbye
                                                    • @@ -22381,7 +22381,7 @@ __TOC__ == Attributes after dir on these span tags must be deleted from the TOC == !! html -

                                                      Contents

                                                      +

                                                      Contents

                                                      • 1 C++
                                                      • 2 זבנג!
                                                      • @@ -22405,7 +22405,7 @@ T74884: bdi element in ToC __TOC__ == test == !! html -

                                                        Contents

                                                        +

                                                        Contents

                                                        @@ -22421,7 +22421,7 @@ T35715: s/strike element in ToC __TOC__ == test test test == !! html -

                                                        Contents

                                                        +

                                                        Contents

                                                        @@ -22440,7 +22440,7 @@ Empty

                                                        tag in TOC, removed by Sanitizer (T92892) __TOC__ == x == !! html -

                                                        Contents

                                                        +

                                                        Contents

                                                        @@ -22451,7 +22451,7 @@ __TOC__ !! html+tidy

                                                        -
                                                        +

                                                        Contents

                                                          diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php index bb7267a612..29da00d50e 100644 --- a/tests/phpunit/MediaWikiTestCase.php +++ b/tests/phpunit/MediaWikiTestCase.php @@ -1298,7 +1298,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase { */ public function __call( $func, $args ) { static $compatibility = [ - 'assertEmpty' => 'assertEmpty2', // assertEmpty was added in phpunit 3.7.32 + 'createMock' => 'createMock2', ]; if ( isset( $compatibility[$func] ) ) { @@ -1309,12 +1309,20 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase { } /** - * Used as a compatibility method for phpunit < 3.7.32 - * @param string $value - * @param string $msg + * Return a test double for the specified class. + * + * @param string $originalClassName + * @return PHPUnit_Framework_MockObject_MockObject + * @throws Exception */ - private function assertEmpty2( $value, $msg ) { - $this->assertTrue( $value == '', $msg ); + private function createMock2( $originalClassName ) { + return $this->getMockBuilder( $originalClassName ) + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + // New in phpunit-mock-objects 3.2 (phpunit 5.4.0) + // ->disallowMockingUnknownTypes() + ->getMock(); } private static function unprefixTable( &$tableName, $ind, $prefix ) { diff --git a/tests/phpunit/includes/MWTimestampTest.php b/tests/phpunit/includes/MWTimestampTest.php index 4bca4788ac..c1a46fed5b 100644 --- a/tests/phpunit/includes/MWTimestampTest.php +++ b/tests/phpunit/includes/MWTimestampTest.php @@ -23,7 +23,7 @@ class MWTimestampTest extends MediaWikiLangTestCase { $expectedOutput, // The expected output $desc // Description ) { - $user = $this->getMock( 'User' ); + $user = $this->createMock( 'User' ); $user->expects( $this->any() ) ->method( 'getOption' ) ->with( 'timecorrection' ) @@ -156,7 +156,7 @@ class MWTimestampTest extends MediaWikiLangTestCase { $expectedOutput, // The expected output $desc // Description ) { - $user = $this->getMock( 'User' ); + $user = $this->createMock( 'User' ); $user->expects( $this->any() ) ->method( 'getOption' ) ->with( 'timecorrection' ) diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php index cc95e383dd..a72662f483 100644 --- a/tests/phpunit/includes/MediaWikiServicesTest.php +++ b/tests/phpunit/includes/MediaWikiServicesTest.php @@ -71,7 +71,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { $newServices = $this->newMediaWikiServices(); $oldServices = MediaWikiServices::forceGlobalInstance( $newServices ); - $service1 = $this->getMock( SalvageableService::class ); + $service1 = $this->createMock( SalvageableService::class ); $service1->expects( $this->never() ) ->method( 'salvage' ); @@ -104,11 +104,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase { $newServices = $this->newMediaWikiServices(); $oldServices = MediaWikiServices::forceGlobalInstance( $newServices ); - $service1 = $this->getMock( SalvageableService::class ); + $service1 = $this->createMock( SalvageableService::class ); $service1->expects( $this->never() ) ->method( 'salvage' ); - $service2 = $this->getMock( SalvageableService::class ); + $service2 = $this->createMock( SalvageableService::class ); $service2->expects( $this->once() ) ->method( 'salvage' ) ->with( $service1 ); @@ -178,11 +178,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase { $newServices = $this->newMediaWikiServices(); $oldServices = MediaWikiServices::forceGlobalInstance( $newServices ); - $service1 = $this->getMock( DestructibleService::class ); + $service1 = $this->createMock( DestructibleService::class ); $service1->expects( $this->once() ) ->method( 'destroy' ); - $service2 = $this->getMock( DestructibleService::class ); + $service2 = $this->createMock( DestructibleService::class ); $service2->expects( $this->never() ) ->method( 'destroy' ); @@ -219,7 +219,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { 'Test', function() use ( &$serviceCounter ) { $serviceCounter++; - $service = $this->getMock( 'MediaWiki\Services\DestructibleService' ); + $service = $this->createMock( 'MediaWiki\Services\DestructibleService' ); $service->expects( $this->once() )->method( 'destroy' ); return $service; } @@ -248,7 +248,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase { $services->defineService( 'Test', function() { - $service = $this->getMock( 'MediaWiki\Services\DestructibleService' ); + $service = $this->createMock( 'MediaWiki\Services\DestructibleService' ); $service->expects( $this->never() )->method( 'destroy' ); return $service; } diff --git a/tests/phpunit/includes/Services/ServiceContainerTest.php b/tests/phpunit/includes/Services/ServiceContainerTest.php index f22e123856..617e39cf9d 100644 --- a/tests/phpunit/includes/Services/ServiceContainerTest.php +++ b/tests/phpunit/includes/Services/ServiceContainerTest.php @@ -326,7 +326,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase { public function testDisableService() { $services = $this->newServiceContainer( [ 'Foo' ] ); - $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' ); + $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' ) + ->getMock(); $destructible->expects( $this->once() ) ->method( 'destroy' ); @@ -384,7 +385,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase { public function testDestroy() { $services = $this->newServiceContainer(); - $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' ); + $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' ) + ->getMock(); $destructible->expects( $this->once() ) ->method( 'destroy' ); diff --git a/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php b/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php index bdec0a50d9..76d1cb9401 100644 --- a/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php +++ b/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php @@ -66,7 +66,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase { * @return PHPUnit_Framework_MockObject_MockObject|User */ private function getMockNonAnonUserWithId( $id ) { - $mock = $this->getMock( User::class ); + $mock = $this->getMockBuilder( User::class )->getMock(); $mock->expects( $this->any() ) ->method( 'isAnon' ) ->will( $this->returnValue( false ) ); @@ -142,7 +142,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase { } private function getMockAnonUser() { - $mock = $this->getMock( User::class ); + $mock = $this->getMockBuilder( User::class )->getMock(); $mock->expects( $this->any() ) ->method( 'isAnon' ) ->will( $this->returnValue( true ) ); diff --git a/tests/phpunit/includes/WatchedItemStoreUnitTest.php b/tests/phpunit/includes/WatchedItemStoreUnitTest.php index 0bd0bccbf4..b71e8f4d5c 100644 --- a/tests/phpunit/includes/WatchedItemStoreUnitTest.php +++ b/tests/phpunit/includes/WatchedItemStoreUnitTest.php @@ -13,7 +13,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { * @return PHPUnit_Framework_MockObject_MockObject|IDatabase */ private function getMockDb() { - return $this->getMock( IDatabase::class ); + return $this->createMock( IDatabase::class ); } /** @@ -63,7 +63,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { * @return PHPUnit_Framework_MockObject_MockObject|User */ private function getMockNonAnonUserWithId( $id ) { - $mock = $this->getMock( User::class ); + $mock = $this->createMock( User::class ); $mock->expects( $this->any() ) ->method( 'isAnon' ) ->will( $this->returnValue( false ) ); @@ -1978,7 +1978,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase { * @return PHPUnit_Framework_MockObject_MockObject|Title */ private function getMockTitle( $text, $ns = 0 ) { - $title = $this->getMock( Title::class ); + $title = $this->createMock( Title::class ); $title->expects( $this->any() ) ->method( 'getText' ) ->will( $this->returnValue( str_replace( '_', ' ', $text ) ) ); diff --git a/tests/phpunit/includes/WatchedItemUnitTest.php b/tests/phpunit/includes/WatchedItemUnitTest.php index 7e1ff3d7a9..8897645479 100644 --- a/tests/phpunit/includes/WatchedItemUnitTest.php +++ b/tests/phpunit/includes/WatchedItemUnitTest.php @@ -14,7 +14,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase { * @return PHPUnit_Framework_MockObject_MockObject|User */ private function getMockUser( $id ) { - $user = $this->getMock( User::class ); + $user = $this->createMock( User::class ); $user->expects( $this->any() ) ->method( 'getId' ) ->will( $this->returnValue( $id ) ); @@ -84,7 +84,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase { $checkRights = 0; /** @var User|PHPUnit_Framework_MockObject_MockObject $user */ - $user = $this->getMock( User::class ); + $user = $this->createMock( User::class ); $user->expects( $this->once() ) ->method( 'addWatch' ) ->with( $title, $checkRights ); @@ -99,7 +99,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase { $checkRights = 0; /** @var User|PHPUnit_Framework_MockObject_MockObject $user */ - $user = $this->getMock( User::class ); + $user = $this->createMock( User::class ); $user->expects( $this->once() ) ->method( 'removeWatch' ) ->with( $title, $checkRights ); @@ -124,7 +124,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase { $checkRights = 0; /** @var User|PHPUnit_Framework_MockObject_MockObject $user */ - $user = $this->getMock( User::class ); + $user = $this->createMock( User::class ); $user->expects( $this->once() ) ->method( 'isWatched' ) ->with( $title, $checkRights ) diff --git a/tests/phpunit/includes/api/ApiMainTest.php b/tests/phpunit/includes/api/ApiMainTest.php index 922f7f147c..a1b7a87041 100644 --- a/tests/phpunit/includes/api/ApiMainTest.php +++ b/tests/phpunit/includes/api/ApiMainTest.php @@ -472,7 +472,7 @@ class ApiMainTest extends ApiTestCase { ); } - // Not static so $this->getMock() can be used + // Not static so $this can be used public function provideExceptionErrors() { $reqId = WebRequest::getRequestId(); $doclink = wfExpandUrl( wfScript( 'api' ) ); @@ -485,7 +485,9 @@ class ApiMainTest extends ApiTestCase { MWExceptionHandler::getRedactedTraceAsString( $ex ) )->inLanguage( 'en' )->useDatabase( false )->text(); - $dbex = new DBQueryError( $this->getMock( 'IDatabase' ), 'error', 1234, 'SELECT 1', __METHOD__ ); + $dbex = new DBQueryError( + $this->createMock( 'IDatabase' ), + 'error', 1234, 'SELECT 1', __METHOD__ ); $dbtrace = wfMessage( 'api-exception-trace', get_class( $dbex ), $dbex->getFile(), diff --git a/tests/phpunit/includes/api/ApiPageSetTest.php b/tests/phpunit/includes/api/ApiPageSetTest.php index ad1deee5ce..8a2146a15b 100644 --- a/tests/phpunit/includes/api/ApiPageSetTest.php +++ b/tests/phpunit/includes/api/ApiPageSetTest.php @@ -96,4 +96,83 @@ class ApiPageSetTest extends ApiTestCase { $pageSet->getNormalizedTitlesAsResult() ); } + + public function testSpecialRedirects() { + $id1 = self::editPage( 'UTApiPageSet', 'UTApiPageSet in the default language' ) + ->value['revision']->getTitle()->getArticleID(); + $id2 = self::editPage( 'UTApiPageSet/de', 'UTApiPageSet in German' ) + ->value['revision']->getTitle()->getArticleID(); + + $user = $this->getTestUser()->getUser(); + $userName = $user->getName(); + $userDbkey = str_replace( ' ', '_', $userName ); + $request = new FauxRequest( [ + 'titles' => join( '|', [ + 'Special:MyContributions', + 'Special:MyPage', + 'Special:MyTalk/subpage', + 'Special:MyLanguage/UTApiPageSet', + ] ), + ] ); + $context = new RequestContext(); + $context->setRequest( $request ); + $context->setUser( $user ); + + $main = new ApiMain( $context ); + $pageSet = new ApiPageSet( $main ); + $pageSet->execute(); + + $this->assertEquals( [ + ], $pageSet->getRedirectTitlesAsResult() ); + $this->assertEquals( [ + [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ], + [ 'ns' => -1, 'title' => 'Special:MyPage', 'special' => true ], + [ 'ns' => -1, 'title' => 'Special:MyTalk/subpage', 'special' => true ], + [ 'ns' => -1, 'title' => 'Special:MyLanguage/UTApiPageSet', 'special' => true ], + ], $pageSet->getInvalidTitlesAndRevisions() ); + $this->assertEquals( [ + ], $pageSet->getAllTitlesByNamespace() ); + + $request->setVal( 'redirects', 1 ); + $main = new ApiMain( $context ); + $pageSet = new ApiPageSet( $main ); + $pageSet->execute(); + + $this->assertEquals( [ + [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ], + [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ], + [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet' ], + ], $pageSet->getRedirectTitlesAsResult() ); + $this->assertEquals( [ + [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ], + [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ], + [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ], + ], $pageSet->getInvalidTitlesAndRevisions() ); + $this->assertEquals( [ + 0 => [ 'UTApiPageSet' => $id1 ], + 2 => [ $userDbkey => -2 ], + 3 => [ "$userDbkey/subpage" => -3 ], + ], $pageSet->getAllTitlesByNamespace() ); + + $context->setLanguage( 'de' ); + $main = new ApiMain( $context ); + $pageSet = new ApiPageSet( $main ); + $pageSet->execute(); + + $this->assertEquals( [ + [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ], + [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ], + [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet/de' ], + ], $pageSet->getRedirectTitlesAsResult() ); + $this->assertEquals( [ + [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ], + [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ], + [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ], + ], $pageSet->getInvalidTitlesAndRevisions() ); + $this->assertEquals( [ + 0 => [ 'UTApiPageSet/de' => $id2 ], + 2 => [ $userDbkey => -2 ], + 3 => [ "$userDbkey/subpage" => -3 ], + ], $pageSet->getAllTitlesByNamespace() ); + } } diff --git a/tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php index d8588d51d1..8d84f4ca15 100644 --- a/tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php @@ -60,7 +60,7 @@ class AbstractPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testProviderRevokeAccessForUser() { $reqs = []; for ( $i = 0; $i < 3; $i++ ) { - $reqs[$i] = $this->getMock( AuthenticationRequest::class ); + $reqs[$i] = $this->createMock( AuthenticationRequest::class ); $reqs[$i]->done = false; } diff --git a/tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php index bb90dd9837..41cf62eaa2 100644 --- a/tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php @@ -55,7 +55,7 @@ class AbstractSecondaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testProviderRevokeAccessForUser() { $reqs = []; for ( $i = 0; $i < 3; $i++ ) { - $reqs[$i] = $this->getMock( AuthenticationRequest::class ); + $reqs[$i] = $this->createMock( AuthenticationRequest::class ); $reqs[$i]->done = false; } diff --git a/tests/phpunit/includes/auth/AuthManagerTest.php b/tests/phpunit/includes/auth/AuthManagerTest.php index f7be8019b9..5c268f84cf 100644 --- a/tests/phpunit/includes/auth/AuthManagerTest.php +++ b/tests/phpunit/includes/auth/AuthManagerTest.php @@ -45,7 +45,9 @@ class AuthManagerTest extends \MediaWikiTestCase { */ protected function hook( $hook, $expect ) { global $wgHooks; - $mock = $this->getMock( __CLASS__, [ "on$hook" ] ); + $mock = $this->getMockBuilder( __CLASS__ ) + ->setMethods( [ "on$hook" ] ) + ->getMock(); $wgHooks[$hook] = [ $mock ]; return $mock->expects( $expect )->method( "on$hook" ); } @@ -762,9 +764,9 @@ class AuthManagerTest extends \MediaWikiTestCase { public function testCreateFromLogin() { $user = \User::newFromName( 'UTSysop' ); - $req1 = $this->getMock( AuthenticationRequest::class ); - $req2 = $this->getMock( AuthenticationRequest::class ); - $req3 = $this->getMock( AuthenticationRequest::class ); + $req1 = $this->createMock( AuthenticationRequest::class ); + $req2 = $this->createMock( AuthenticationRequest::class ); + $req3 = $this->createMock( AuthenticationRequest::class ); $userReq = new UsernameAuthenticationRequest; $userReq->username = 'UTDummy'; @@ -2661,7 +2663,8 @@ class AuthManagerTest extends \MediaWikiTestCase { // Test addToDatabase fails $session->clear(); - $user = $this->getMock( 'User', [ 'addToDatabase' ] ); + $user = $this->getMockBuilder( 'User' ) + ->setMethods( [ 'addToDatabase' ] )->getMock(); $user->expects( $this->once() )->method( 'addToDatabase' ) ->will( $this->returnValue( \Status::newFatal( 'because' ) ) ); $user->setName( $username ); @@ -2682,7 +2685,8 @@ class AuthManagerTest extends \MediaWikiTestCase { $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) ); $this->assertFalse( $cache->get( $backoffKey ), 'sanity check' ); $session->clear(); - $user = $this->getMock( 'User', [ 'addToDatabase' ] ); + $user = $this->getMockBuilder( 'User' ) + ->setMethods( [ 'addToDatabase' ] )->getMock(); $user->expects( $this->once() )->method( 'addToDatabase' ) ->will( $this->throwException( new \Exception( 'Excepted' ) ) ); $user->setName( $username ); @@ -2705,7 +2709,8 @@ class AuthManagerTest extends \MediaWikiTestCase { // Test addToDatabase fails because the user already exists. $session->clear(); - $user = $this->getMock( 'User', [ 'addToDatabase' ] ); + $user = $this->getMockBuilder( 'User' ) + ->setMethods( [ 'addToDatabase' ] )->getMock(); $user->expects( $this->once() )->method( 'addToDatabase' ) ->will( $this->returnCallback( function () use ( $username, &$user ) { $oldUser = \User::newFromName( $username ); @@ -2813,7 +2818,7 @@ class AuthManagerTest extends \MediaWikiTestCase { */ public function testGetAuthenticationRequests( $action, $expect, $state = [] ) { $makeReq = function ( $key ) use ( $action ) { - $req = $this->getMock( AuthenticationRequest::class ); + $req = $this->createMock( AuthenticationRequest::class ); $req->expects( $this->any() )->method( 'getUniqueId' ) ->will( $this->returnValue( $key ) ); $req->action = $action === AuthManager::ACTION_UNLINK ? AuthManager::ACTION_REMOVE : $action; @@ -3016,7 +3021,7 @@ class AuthManagerTest extends \MediaWikiTestCase { public function testGetAuthenticationRequestsRequired() { $makeReq = function ( $key, $required ) { - $req = $this->getMock( AuthenticationRequest::class ); + $req = $this->createMock( AuthenticationRequest::class ); $req->expects( $this->any() )->method( 'getUniqueId' ) ->will( $this->returnValue( $key ) ); $req->action = AuthManager::ACTION_LOGIN; @@ -3146,7 +3151,7 @@ class AuthManagerTest extends \MediaWikiTestCase { public function testAutoCreateOnLogin() { $username = self::usernameForCreation(); - $req = $this->getMock( AuthenticationRequest::class ); + $req = $this->createMock( AuthenticationRequest::class ); $mock = $this->getMockForAbstractClass( PrimaryAuthenticationProvider::class ); $mock->expects( $this->any() )->method( 'getUniqueId' )->will( $this->returnValue( 'primary' ) ); diff --git a/tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php index 96e50e07ac..6970313498 100644 --- a/tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php @@ -20,7 +20,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { ); } - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); @@ -29,14 +29,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] ) ); - $req = $this->getMock( PasswordAuthenticationRequest::class ); + $req = $this->createMock( PasswordAuthenticationRequest::class ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, get_class( $req ) ); $this->assertEquals( [ $req ], $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] ) ); - $reqType = get_class( $this->getMock( AuthenticationRequest::class ) ); + $reqType = get_class( $this->createMock( AuthenticationRequest::class ) ); try { $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, $reqType ); $this->fail( 'Expected exception not thrown' ); @@ -51,7 +51,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testOnUserSaveSettings() { $user = \User::newFromName( 'UTSysop' ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'updateExternalDB' ) ->with( $this->identicalTo( $user ) ); @@ -63,7 +63,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testOnUserGroupsChanged() { $user = \User::newFromName( 'UTSysop' ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'updateExternalDBGroups' ) ->with( @@ -79,14 +79,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testOnUserLoggedIn() { $user = \User::newFromName( 'UTSysop' ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' ) ->with( $this->identicalTo( $user ) ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); \Hooks::run( 'UserLoggedIn', [ $user ] ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'updateUser' ) ->will( $this->returnCallback( function ( &$user ) { @@ -107,14 +107,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testOnLocalUserCreated() { $user = \User::newFromName( 'UTSysop' ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->exactly( 2 ) )->method( 'initUser' ) ->with( $this->identicalTo( $user ), $this->identicalTo( false ) ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); \Hooks::run( 'LocalUserCreated', [ $user, false ] ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'initUser' ) ->will( $this->returnCallback( function ( &$user ) { @@ -133,7 +133,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { } public function testGetUniqueId() { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); $this->assertSame( @@ -149,7 +149,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { * @param bool $allowPasswordChange */ public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'allowPasswordChange' ) ->will( $this->returnValue( $allowPasswordChange ) ); @@ -321,7 +321,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { } public function testTestUserExists() { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'userExists' ) ->with( $this->equalTo( 'Foo' ) ) @@ -330,7 +330,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $this->assertTrue( $provider->testUserExists( 'foo' ) ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'userExists' ) ->with( $this->equalTo( 'Foo' ) ) @@ -341,7 +341,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { } public function testTestUserCanAuthenticate() { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'userExists' ) ->with( $this->equalTo( 'Foo' ) ) @@ -355,7 +355,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { ->getMock(); $pluginUser->expects( $this->once() )->method( 'isLocked' ) ->will( $this->returnValue( true ) ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'userExists' ) ->with( $this->equalTo( 'Foo' ) ) @@ -375,7 +375,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { ->getMock(); $pluginUser->expects( $this->once() )->method( 'isLocked' ) ->will( $this->returnValue( false ) ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'userExists' ) ->with( $this->equalTo( 'Foo' ) ) @@ -433,7 +433,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { } public function testProviderAllowsPropertyChange() { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'allowPropChange' ) ->will( $this->returnCallback( function ( $prop ) { @@ -453,7 +453,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { */ public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) { $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : []; - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains ); $plugin->expects( $allow === null ? $this->never() : $this->once() ) ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) ); @@ -466,7 +466,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { if ( is_object( $type ) ) { $req = $type; } else { - $req = $this->getMock( $type ); + $req = $this->createMock( $type ); } $req->action = AuthManager::ACTION_CHANGE; $req->username = 'UTSysop'; @@ -502,12 +502,12 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { } public function testProviderChangeAuthenticationData() { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->never() )->method( 'setPassword' ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); $provider->providerChangeAuthenticationData( - $this->getMock( AuthenticationRequest::class ) + $this->createMock( AuthenticationRequest::class ) ); $req = new PasswordAuthenticationRequest(); @@ -515,7 +515,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $req->username = 'foo'; $req->password = 'bar'; - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'setPassword' ) ->with( $this->callback( function ( $u ) { @@ -525,7 +525,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); $provider->providerChangeAuthenticationData( $req ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() )->method( 'setPassword' ) ->with( $this->callback( function ( $u ) { @@ -541,7 +541,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg ); } - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' ) ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) ); $plugin->expects( $this->any() )->method( 'validDomain' ) @@ -569,7 +569,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { * @param string $expect */ public function testAccountCreationType( $can, $expect ) { - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->once() ) ->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) ); @@ -588,7 +588,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { public function testTestForAccountCreation() { $user = \User::newFromName( 'foo' ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin ); $this->assertEquals( @@ -606,7 +606,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $req->action = AuthManager::ACTION_CREATE; $reqs = [ PasswordAuthenticationRequest::class => $req ]; - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'canCreateAccounts' ) ->will( $this->returnValue( false ) ); @@ -621,7 +621,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { ); } - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'canCreateAccounts' ) ->will( $this->returnValue( true ) ); @@ -650,7 +650,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $req->username = 'foo'; $req->password = 'bar'; - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'canCreateAccounts' ) ->will( $this->returnValue( true ) ); @@ -670,7 +670,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $provider->beginPrimaryAccountCreation( $user, $user, $reqs ) ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] ); $plugin->expects( $this->any() )->method( 'canCreateAccounts' ) ->will( $this->returnValue( true ) ); @@ -689,7 +689,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase { $this->assertSame( AuthenticationResponse::FAIL, $ret->status ); $this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() ); - $plugin = $this->getMock( 'AuthPlugin' ); + $plugin = $this->createMock( 'AuthPlugin' ); $plugin->expects( $this->any() )->method( 'canCreateAccounts' ) ->will( $this->returnValue( true ) ); $plugin->expects( $this->any() )->method( 'domainList' ) diff --git a/tests/phpunit/includes/auth/AuthenticationRequestTest.php b/tests/phpunit/includes/auth/AuthenticationRequestTest.php index 7d2ba8d749..0e549a5ca6 100644 --- a/tests/phpunit/includes/auth/AuthenticationRequestTest.php +++ b/tests/phpunit/includes/auth/AuthenticationRequestTest.php @@ -138,7 +138,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase { public function testMergeFieldInfo() { $msg = wfMessage( 'foo' ); - $req1 = $this->getMock( AuthenticationRequest::class ); + $req1 = $this->createMock( AuthenticationRequest::class ); $req1->required = AuthenticationRequest::REQUIRED; $req1->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [ 'string1' => [ @@ -165,7 +165,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase { ], ] ) ); - $req2 = $this->getMock( AuthenticationRequest::class ); + $req2 = $this->createMock( AuthenticationRequest::class ); $req2->required = AuthenticationRequest::REQUIRED; $req2->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [ 'string1' => [ @@ -187,7 +187,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase { ], ] ) ); - $req3 = $this->getMock( AuthenticationRequest::class ); + $req3 = $this->createMock( AuthenticationRequest::class ); $req3->required = AuthenticationRequest::REQUIRED; $req3->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [ 'string1' => [ @@ -197,7 +197,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase { ], ] ) ); - $req4 = $this->getMock( AuthenticationRequest::class ); + $req4 = $this->createMock( AuthenticationRequest::class ); $req4->required = AuthenticationRequest::REQUIRED; $req4->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [] ) ); diff --git a/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php index ec4bea11a1..ca6689a9ca 100644 --- a/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php @@ -57,24 +57,24 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram public function testBeginSecondaryAccountCreation() { $authManager = new AuthManager( new \FauxRequest(), new \HashConfig() ); - $creator = $this->getMock( 'User' ); - $userWithoutEmail = $this->getMock( 'User' ); + $creator = $this->getMockBuilder( 'User' )->getMock(); + $userWithoutEmail = $this->getMockBuilder( 'User' )->getMock(); $userWithoutEmail->expects( $this->any() )->method( 'getEmail' )->willReturn( '' ); $userWithoutEmail->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf(); $userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' ); - $userWithEmailError = $this->getMock( 'User' ); + $userWithEmailError = $this->getMockBuilder( 'User' )->getMock(); $userWithEmailError->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' ); $userWithEmailError->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf(); $userWithEmailError->expects( $this->any() )->method( 'sendConfirmationMail' ) ->willReturn( \Status::newFatal( 'fail' ) ); - $userExpectsConfirmation = $this->getMock( 'User' ); + $userExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock(); $userExpectsConfirmation->expects( $this->any() )->method( 'getEmail' ) ->willReturn( 'foo@bar.baz' ); $userExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' ) ->willReturnSelf(); $userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' ) ->willReturn( \Status::newGood() ); - $userNotExpectsConfirmation = $this->getMock( 'User' ); + $userNotExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock(); $userNotExpectsConfirmation->expects( $this->any() )->method( 'getEmail' ) ->willReturn( 'foo@bar.baz' ); $userNotExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' ) diff --git a/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php b/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php index b96455e091..3b0019499d 100644 --- a/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php @@ -15,7 +15,8 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase { * @return LegacyHookPreAuthenticationProvider */ protected function getProvider() { - $request = $this->getMock( 'FauxRequest', [ 'getIP' ] ); + $request = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'getIP' ] )->getMock(); $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) ); $manager = new AuthManager( @@ -39,7 +40,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase { * @return object $mock->expects( $expect )->method( ... ). */ protected function hook( $hook, $expect ) { - $mock = $this->getMock( __CLASS__, [ "on$hook" ] ); + $mock = $this->getMockBuilder( __CLASS__ )->setMethods( [ "on$hook" ] )->getMock(); $this->mergeMwGlobalArrayValue( 'wgHooks', [ $hook => [ $mock ], ] ); diff --git a/tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php index 72a03c311a..6e2058c485 100644 --- a/tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php @@ -38,11 +38,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase } $this->validity = \Status::newGood(); - $provider = $this->getMock( - LocalPasswordPrimaryAuthenticationProvider::class, - [ 'checkPasswordValidity' ], - [ [ 'loginOnly' => $loginOnly ] ] - ); + $provider = $this->getMockBuilder( LocalPasswordPrimaryAuthenticationProvider::class ) + ->setMethods( [ 'checkPasswordValidity' ] ) + ->setConstructorArgs( [ [ 'loginOnly' => $loginOnly ] ] ) + ->getMock(); $provider->expects( $this->any() )->method( 'checkPasswordValidity' ) ->will( $this->returnCallback( function () { return $this->validity; @@ -348,7 +347,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase } elseif ( $type === PasswordDomainAuthenticationRequest::class ) { $req = new $type( [] ); } else { - $req = $this->getMock( $type ); + $req = $this->createMock( $type ); } $req->action = AuthManager::ACTION_CHANGE; $req->username = $user; @@ -444,7 +443,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase if ( $type === PasswordAuthenticationRequest::class ) { $changeReq = new $type(); } else { - $changeReq = $this->getMock( $type ); + $changeReq = $this->createMock( $type ); } $changeReq->action = AuthManager::ACTION_CHANGE; $changeReq->username = $user; diff --git a/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php b/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php index bc7d65e81d..8d9509e9a1 100644 --- a/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php @@ -42,11 +42,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC $this->validity = \Status::newGood(); $mockedMethods[] = 'checkPasswordValidity'; - $provider = $this->getMock( - TemporaryPasswordPrimaryAuthenticationProvider::class, - $mockedMethods, - [ $params ] - ); + $provider = $this->getMockBuilder( TemporaryPasswordPrimaryAuthenticationProvider::class ) + ->setMethods( $mockedMethods ) + ->setConstructorArgs( [ $params ] ) + ->getMock(); $provider->expects( $this->any() )->method( 'checkPasswordValidity' ) ->will( $this->returnCallback( function () { return $this->validity; @@ -366,7 +365,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC ) { $req = new $type(); } else { - $req = $this->getMock( $type ); + $req = $this->createMock( $type ); } $req->action = AuthManager::ACTION_CHANGE; $req->username = $user; @@ -446,7 +445,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC ) { $changeReq = new $type(); } else { - $changeReq = $this->getMock( $type ); + $changeReq = $this->createMock( $type ); } $changeReq->action = AuthManager::ACTION_CHANGE; $changeReq->username = $user; diff --git a/tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php b/tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php index 2f3e27c6fe..ee8283288a 100644 --- a/tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php +++ b/tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php @@ -119,7 +119,9 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase { $user = \User::newFromName( 'RandomUser' ); $creator = \User::newFromName( $creatorname ); if ( $hook ) { - $mock = $this->getMock( 'stdClass', [ 'onExemptFromAccountCreationThrottle' ] ); + $mock = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'onExemptFromAccountCreationThrottle' ] ) + ->getMock(); $mock->expects( $this->any() )->method( 'onExemptFromAccountCreationThrottle' ) ->will( $this->returnValue( false ) ); $this->mergeMwGlobalArrayValue( 'wgHooks', [ diff --git a/tests/phpunit/includes/auth/ThrottlerTest.php b/tests/phpunit/includes/auth/ThrottlerTest.php index c945885c76..33c8ce6e10 100644 --- a/tests/phpunit/includes/auth/ThrottlerTest.php +++ b/tests/phpunit/includes/auth/ThrottlerTest.php @@ -163,7 +163,8 @@ class ThrottlerTest extends \MediaWikiTestCase { } public function testExpiration() { - $cache = $this->getMock( HashBagOStuff::class, [ 'add' ] ); + $cache = $this->getMockBuilder( HashBagOStuff::class ) + ->setMethods( [ 'add' ] )->getMock(); $throttler = new Throttler( [ [ 'count' => 3, 'seconds' => 10 ] ], [ 'cache' => $cache ] ); $throttler->setLogger( new NullLogger() ); diff --git a/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php b/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php index dc868a89b6..0f556b8ff1 100644 --- a/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php +++ b/tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php @@ -183,8 +183,8 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase { * @dataProvider provideModifyQuery */ protected function modifyQueryHelper( $groupDefinition, $input ) { - $ctx = $this->getMock( 'IContextSource' ); - $dbr = $this->getMock( 'IDatabase' ); + $ctx = $this->createMock( 'IContextSource' ); + $dbr = $this->createMock( 'IDatabase' ); $tables = $fields = $conds = $query_options = $join_conds = []; $group = new ChangesListStringOptionsFilterGroup( $groupDefinition ); diff --git a/tests/phpunit/includes/content/ContentHandlerTest.php b/tests/phpunit/includes/content/ContentHandlerTest.php index a3d1ddac31..403bee17b1 100644 --- a/tests/phpunit/includes/content/ContentHandlerTest.php +++ b/tests/phpunit/includes/content/ContentHandlerTest.php @@ -429,7 +429,7 @@ class ContentHandlerTest extends MediaWikiTestCase { * @covers ContentHandler::getDataForSearchIndex */ public function testDataIndexFields() { - $mockEngine = $this->getMock( 'SearchEngine' ); + $mockEngine = $this->createMock( 'SearchEngine' ); $title = Title::newFromText( 'Not_Main_Page', NS_MAIN ); $page = new WikiPage( $title ); diff --git a/tests/phpunit/includes/content/FileContentHandlerTest.php b/tests/phpunit/includes/content/FileContentHandlerTest.php index 276a86ee5e..65efcc9e80 100644 --- a/tests/phpunit/includes/content/FileContentHandlerTest.php +++ b/tests/phpunit/includes/content/FileContentHandlerTest.php @@ -16,7 +16,7 @@ class FileContentHandlerTest extends MediaWikiLangTestCase { } public function testIndexMapping() { - $mockEngine = $this->getMock( 'SearchEngine' ); + $mockEngine = $this->createMock( 'SearchEngine' ); $mockEngine->expects( $this->atLeastOnce() ) ->method( 'makeSearchFieldMapping' ) diff --git a/tests/phpunit/includes/content/TextContentHandlerTest.php b/tests/phpunit/includes/content/TextContentHandlerTest.php index 918815ca05..7d9f74eca0 100644 --- a/tests/phpunit/includes/content/TextContentHandlerTest.php +++ b/tests/phpunit/includes/content/TextContentHandlerTest.php @@ -16,7 +16,7 @@ class TextContentHandlerTest extends MediaWikiLangTestCase { public function testFieldsForIndex() { $handler = new TextContentHandler(); - $mockEngine = $this->getMock( 'SearchEngine' ); + $mockEngine = $this->createMock( 'SearchEngine' ); $mockEngine->expects( $this->atLeastOnce() ) ->method( 'makeSearchFieldMapping' ) diff --git a/tests/phpunit/includes/content/WikitextContentHandlerTest.php b/tests/phpunit/includes/content/WikitextContentHandlerTest.php index ec97d76371..290b11ab00 100644 --- a/tests/phpunit/includes/content/WikitextContentHandlerTest.php +++ b/tests/phpunit/includes/content/WikitextContentHandlerTest.php @@ -245,7 +245,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase { */ public function testDataIndexFieldsFile() { - $mockEngine = $this->getMock( 'SearchEngine' ); + $mockEngine = $this->createMock( 'SearchEngine' ); $title = Title::newFromText( 'Somefile.jpg', NS_FILE ); $page = new WikiPage( $title ); diff --git a/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php b/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php index d6249bba46..ce21412000 100644 --- a/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php +++ b/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php @@ -160,7 +160,7 @@ class KafkaHandlerTest extends MediaWikiTestCase { [ $this->anything(), $this->anything(), [ 'lines' ] ] ] ); - $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' ); + $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' ); $formatter->expects( $this->any() ) ->method( 'format' ) ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) ); @@ -191,7 +191,7 @@ class KafkaHandlerTest extends MediaWikiTestCase { ->method( 'send' ) ->will( $this->returnValue( true ) ); - $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' ); + $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' ); $formatter->expects( $this->any() ) ->method( 'format' ) ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) ); diff --git a/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php b/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php index 6c93c79a4a..0d00fbc284 100644 --- a/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php +++ b/tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php @@ -117,20 +117,21 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase { ->disableOriginalConstructor() ->getMock(); - $backendMock = $this->getMock( 'FSFileBackend', - [], - [ [ - 'name' => $this->backendName, - 'wikiId' => wfWikiID() - ] ] ); - - $wrapperMock = $this->getMock( 'FileBackendDBRepoWrapper', - [ 'getDB' ], - [ [ - 'backend' => $backendMock, - 'repoName' => $this->repoName, - 'dbHandleFactory' => null - ] ] ); + $backendMock = $this->getMockBuilder( 'FSFileBackend' ) + ->setConstructorArgs( [ [ + 'name' => $this->backendName, + 'wikiId' => wfWikiID() + ] ] ) + ->getMock(); + + $wrapperMock = $this->getMockBuilder( 'FileBackendDBRepoWrapper' ) + ->setMethods( [ 'getDB' ] ) + ->setConstructorArgs( [ [ + 'backend' => $backendMock, + 'repoName' => $this->repoName, + 'dbHandleFactory' => null + ] ] ) + ->getMock(); $wrapperMock->expects( $this->any() )->method( 'getDB' )->will( $this->returnValue( $dbMock ) ); diff --git a/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php index d3f9374c53..800c2fc76e 100644 --- a/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php +++ b/tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php @@ -41,19 +41,21 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase { new FakeResultWrapper( [] ) // filearchive ) ); - $repoMock = $this->getMock( 'LocalRepo', - [ 'getMasterDB' ], - [ [ - 'name' => 'migratefilerepolayouttest', - 'backend' => $backend - ] ] ); + $repoMock = $this->getMockBuilder( 'LocalRepo' ) + ->setMethods( [ 'getMasterDB' ] ) + ->setConstructorArgs( [ [ + 'name' => 'migratefilerepolayouttest', + 'backend' => $backend + ] ] ) + ->getMock(); $repoMock ->expects( $this->any() ) ->method( 'getMasterDB' ) ->will( $this->returnValue( $dbMock ) ); - $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', [ 'getRepo' ] ); + $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' ) + ->setMethods( [ 'getRepo' ] )->getMock(); $this->migratorMock ->expects( $this->any() ) ->method( 'getRepo' ) diff --git a/tests/phpunit/includes/filerepo/RepoGroupTest.php b/tests/phpunit/includes/filerepo/RepoGroupTest.php index 25c6e9520d..82ff12e3e3 100644 --- a/tests/phpunit/includes/filerepo/RepoGroupTest.php +++ b/tests/phpunit/includes/filerepo/RepoGroupTest.php @@ -15,7 +15,7 @@ class RepoGroupTest extends MediaWikiTestCase { function testForEachForeignRepo() { $this->setUpForeignRepo(); - $fakeCallback = $this->getMock( 'RepoGroupTestHelper' ); + $fakeCallback = $this->createMock( 'RepoGroupTestHelper' ); $fakeCallback->expects( $this->once() )->method( 'callback' ); RepoGroup::singleton()->forEachForeignRepo( [ $fakeCallback, 'callback' ], [ [] ] ); @@ -25,7 +25,7 @@ class RepoGroupTest extends MediaWikiTestCase { $this->setMwGlobals( 'wgForeignFileRepos', [] ); RepoGroup::destroySingleton(); FileBackendGroup::destroySingleton(); - $fakeCallback = $this->getMock( 'RepoGroupTestHelper' ); + $fakeCallback = $this->createMock( 'RepoGroupTestHelper' ); $fakeCallback->expects( $this->never() )->method( 'callback' ); RepoGroup::singleton()->forEachForeignRepo( [ $fakeCallback, 'callback' ], [ [] ] ); diff --git a/tests/phpunit/includes/filerepo/file/FileTest.php b/tests/phpunit/includes/filerepo/file/FileTest.php index 6520610786..5b5f1b09fe 100644 --- a/tests/phpunit/includes/filerepo/file/FileTest.php +++ b/tests/phpunit/includes/filerepo/file/FileTest.php @@ -155,7 +155,8 @@ class FileTest extends MediaWikiMediaTestCase { ->method( 'getLocalReference' ) ->will( $this->returnValue( $fsFile ) ); - $handlerMock = $this->getMock( 'BitmapHandler', [ 'supportsBucketing' ] ); + $handlerMock = $this->getMockBuilder( 'BitmapHandler' ) + ->setMethods( [ 'supportsBucketing' ] )->getMock(); $handlerMock->expects( $this->any() ) ->method( 'supportsBucketing' ) ->will( $this->returnValue( $data['supportsBucketing'] ) ); @@ -261,7 +262,8 @@ class FileTest extends MediaWikiMediaTestCase { 'generateAndSaveThumb', 'getHandler' ] ) ->getMockForAbstractClass(); - $handlerMock = $this->getMock( 'JpegHandler', [ 'supportsBucketing' ] ); + $handlerMock = $this->getMockBuilder( 'JpegHandler' ) + ->setMethods( [ 'supportsBucketing' ] )->getMock(); $handlerMock->expects( $this->any() ) ->method( 'supportsBucketing' ) ->will( $this->returnValue( true ) ); diff --git a/tests/phpunit/includes/jobqueue/JobTest.php b/tests/phpunit/includes/jobqueue/JobTest.php index 600a36ffe4..1deb7aa35d 100644 --- a/tests/phpunit/includes/jobqueue/JobTest.php +++ b/tests/phpunit/includes/jobqueue/JobTest.php @@ -18,7 +18,8 @@ class JobTest extends MediaWikiTestCase { } public function provideTestToString() { - $mockToStringObj = $this->getMock( 'stdClass', [ '__toString' ] ); + $mockToStringObj = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ '__toString' ] )->getMock(); $mockToStringObj->expects( $this->any() ) ->method( '__toString' ) ->will( $this->returnValue( '{STRING_OBJ_VAL}' ) ); diff --git a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php index f768d06aa2..cfd4d76823 100644 --- a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php +++ b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php @@ -85,4 +85,56 @@ class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase { ], ]; } + + public function testRemoveServer() { + $dsd = new DnsSrvDiscoverer( 'localhost' ); + + $servers = [ + [ + 'target' => 'conf1001.eqiad.wmnet', + 'port' => 35, + 'pri' => 2, + 'weight' => 1, + ], + [ + 'target' => 'conf1004.eqiad.wmnet', + 'port' => 74, + 'pri' => 2, + 'weight' => 1, + ], + [ + 'target' => 'conf1005.eqiad.wmnet', + 'port' => 77, + 'pri' => 3, + 'weight' => 1, + ], + ]; + $server = $servers[1]; + + $expected = [ + [ + 'target' => 'conf1001.eqiad.wmnet', + 'port' => 35, + 'pri' => 2, + 'weight' => 1, + ], + [ + 'target' => 'conf1005.eqiad.wmnet', + 'port' => 77, + 'pri' => 3, + 'weight' => 1, + ], + ]; + + $this->assertEquals( + $expected, + $dsd->removeServer( $server, $servers ), + "Correct server removed" + ); + $this->assertEquals( + $expected, + $dsd->removeServer( $server, $servers ), + "Nothing to remove" + ); + } } diff --git a/tests/phpunit/includes/libs/MemoizedCallableTest.php b/tests/phpunit/includes/libs/MemoizedCallableTest.php index 881f5e1167..d99c58781c 100644 --- a/tests/phpunit/includes/libs/MemoizedCallableTest.php +++ b/tests/phpunit/includes/libs/MemoizedCallableTest.php @@ -31,7 +31,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase { * way as the original underlying callable. */ public function testReturnValuePassedThrough() { - $mock = $this->getMock( 'stdClass', [ 'reverse' ] ); + $mock = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'reverse' ] )->getMock(); $mock->expects( $this->any() ) ->method( 'reverse' ) ->will( $this->returnCallback( 'strrev' ) ); @@ -47,7 +48,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase { * @requires function apc_store/apcu_store */ public function testCallableMemoized() { - $observer = $this->getMock( 'stdClass', [ 'computeSomething' ] ); + $observer = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'computeSomething' ] )->getMock(); $observer->expects( $this->once() ) ->method( 'computeSomething' ) ->will( $this->returnValue( 'ok' ) ); diff --git a/tests/phpunit/includes/libs/SamplingStatsdClientTest.php b/tests/phpunit/includes/libs/SamplingStatsdClientTest.php index 9a489303a7..c5bc03ea5d 100644 --- a/tests/phpunit/includes/libs/SamplingStatsdClientTest.php +++ b/tests/phpunit/includes/libs/SamplingStatsdClientTest.php @@ -1,13 +1,14 @@ getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' ); + $sender = $this->getMockBuilder( SenderInterface::class )->getMock(); $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) ); if ( $expectWrite ) { $sender->expects( $this->once() )->method( 'write' ) @@ -50,7 +51,7 @@ class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase { $nonMatching->setKey( 'oof.bar' ); $nonMatching->setValue( 1 ); - $sender = $this->getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' ); + $sender = $this->getMockBuilder( SenderInterface::class )->getMock(); $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) ); $sender->expects( $this->once() )->method( 'write' )->with( $this->anything(), $this->equalTo( $nonMatching ) ); diff --git a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php index a1afa77726..f2fe07de40 100644 --- a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php @@ -275,7 +275,7 @@ class BagOStuffTest extends MediaWikiTestCase { * @covers BagOStuff::trackDuplicateKeys */ public function testReportDupes() { - $logger = $this->getMock( 'Psr\Log\NullLogger' ); + $logger = $this->createMock( Psr\Log\NullLogger::class ); $logger->expects( $this->once() ) ->method( 'warning' ) ->with( 'Duplicate get(): "{key}" fetched {count} times', [ diff --git a/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php index a01cc6b7b8..5fbbdec3c8 100644 --- a/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php +++ b/tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php @@ -82,4 +82,73 @@ class CachedBagOStuffTest extends PHPUnit_Framework_TestCase { $backend->set( 'bar', true ); $this->assertEquals( true, $cache->get( 'bar' ) ); } + + /** + * @covers CachedBagOStuff::setDebug + */ + public function testSetDebug() { + $backend = new HashBagOStuff(); + $cache = new CachedBagOStuff( $backend ); + // Access private property 'debugMode' + $backend = TestingAccessWrapper::newFromObject( $backend ); + $cache = TestingAccessWrapper::newFromObject( $cache ); + $this->assertFalse( $backend->debugMode ); + $this->assertFalse( $cache->debugMode ); + + $cache->setDebug( true ); + // Should have set both + $this->assertTrue( $backend->debugMode, 'sets backend' ); + $this->assertTrue( $cache->debugMode, 'sets self' ); + } + + /** + * @covers CachedBagOStuff::deleteObjectsExpiringBefore + */ + public function testExpire() { + $backend = $this->getMockBuilder( HashBagOStuff::class ) + ->setMethods( [ 'deleteObjectsExpiringBefore' ] ) + ->getMock(); + $backend->expects( $this->once() ) + ->method( 'deleteObjectsExpiringBefore' ) + ->willReturn( false ); + + $cache = new CachedBagOStuff( $backend ); + $cache->deleteObjectsExpiringBefore( '20110401000000' ); + } + + /** + * @covers CachedBagOStuff::makeKey + */ + public function testMakeKey() { + $backend = $this->getMockBuilder( HashBagOStuff::class ) + ->setMethods( [ 'makeKey' ] ) + ->getMock(); + $backend->method( 'makeKey' ) + ->willReturn( 'special/logic' ); + + // CachedBagOStuff wraps any backend with a process cache + // using HashBagOStuff. Hash has no special key limitations, + // but backends often do. Make sure it uses the backend's + // makeKey() logic, not the one inherited from HashBagOStuff + $cache = new CachedBagOStuff( $backend ); + + $this->assertEquals( 'special/logic', $backend->makeKey( 'special', 'logic' ) ); + $this->assertEquals( 'special/logic', $cache->makeKey( 'special', 'logic' ) ); + } + + /** + * @covers CachedBagOStuff::makeGlobalKey + */ + public function testMakeGlobalKey() { + $backend = $this->getMockBuilder( HashBagOStuff::class ) + ->setMethods( [ 'makeGlobalKey' ] ) + ->getMock(); + $backend->method( 'makeGlobalKey' ) + ->willReturn( 'special/logic' ); + + $cache = new CachedBagOStuff( $backend ); + + $this->assertEquals( 'special/logic', $backend->makeGlobalKey( 'special', 'logic' ) ); + $this->assertEquals( 'special/logic', $cache->makeGlobalKey( 'special', 'logic' ) ); + } } diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php index d7ed4bd9ce..18729f0723 100644 --- a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php +++ b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php @@ -963,7 +963,8 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase { } public function testMcRouterSupport() { - $localBag = $this->getMock( 'EmptyBagOStuff', [ 'set', 'delete' ] ); + $localBag = $this->getMockBuilder( 'EmptyBagOStuff' ) + ->setMethods( [ 'set', 'delete' ] )->getMock(); $localBag->expects( $this->never() )->method( 'set' ); $localBag->expects( $this->never() )->method( 'delete' ); $wanCache = new WANObjectCache( [ diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php index cd350e5ccf..a3f3981037 100644 --- a/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php +++ b/tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php @@ -19,7 +19,8 @@ class ConnectionManagerTest extends \PHPUnit_Framework_TestCase { * @return IDatabase|PHPUnit_Framework_MockObject_MockObject */ private function getIDatabaseMock() { - return $this->getMock( IDatabase::class ); + return $this->getMockBuilder( IDatabase::class ) + ->getMock(); } /** diff --git a/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php b/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php index 3b26d6f90a..4e76f2a839 100644 --- a/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php +++ b/tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php @@ -19,7 +19,8 @@ class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase * @return IDatabase|PHPUnit_Framework_MockObject_MockObject */ private function getIDatabaseMock() { - return $this->getMock( IDatabase::class ); + return $this->getMockBuilder( IDatabase::class ) + ->getMock(); } /** diff --git a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php index bf12f80f0a..27e5a657ed 100644 --- a/tests/phpunit/includes/linker/LinkRendererFactoryTest.php +++ b/tests/phpunit/includes/linker/LinkRendererFactoryTest.php @@ -69,7 +69,8 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase { public function testCreateForUser() { /** @var PHPUnit_Framework_MockObject_MockObject|User $user */ - $user = $this->getMock( User::class, [ 'getStubThreshold' ] ); + $user = $this->getMockBuilder( User::class ) + ->setMethods( [ 'getStubThreshold' ] )->getMock(); $user->expects( $this->once() ) ->method( 'getStubThreshold' ) ->willReturn( 15 ); diff --git a/tests/phpunit/includes/logging/DeleteLogFormatterTest.php b/tests/phpunit/includes/logging/DeleteLogFormatterTest.php index 3fb4eabff1..2337899976 100644 --- a/tests/phpunit/includes/logging/DeleteLogFormatterTest.php +++ b/tests/phpunit/includes/logging/DeleteLogFormatterTest.php @@ -59,6 +59,32 @@ class DeleteLogFormatterTest extends LogFormatterTestCase { public static function provideRestoreLogDatabaseRows() { return [ // Current format + [ + [ + 'type' => 'delete', + 'action' => 'restore', + 'comment' => 'delete comment', + 'namespace' => NS_MAIN, + 'title' => 'Page', + 'params' => [ + ':assoc:count' => [ + 'revisions' => 2, + 'files' => 1, + ], + ], + ], + [ + 'text' => 'User restored page Page (2 revisions and 1 file)', + 'api' => [ + 'count' => [ + 'revisions' => 2, + 'files' => 1, + ], + ], + ], + ], + + // Legacy format without counts [ [ 'type' => 'delete', diff --git a/tests/phpunit/includes/mail/MailAddressTest.php b/tests/phpunit/includes/mail/MailAddressTest.php index 39b6f9f8f4..c837d26f5b 100644 --- a/tests/phpunit/includes/mail/MailAddressTest.php +++ b/tests/phpunit/includes/mail/MailAddressTest.php @@ -17,7 +17,7 @@ class MailAddressTest extends MediaWikiTestCase { if ( wfIsWindows() ) { $this->markTestSkipped( 'This test only works on non-Windows platforms' ); } - $user = $this->getMock( 'User' ); + $user = $this->createMock( 'User' ); $user->expects( $this->any() )->method( 'getName' )->will( $this->returnValue( 'UserName' ) ); diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php index 1b756be629..1e09e92a10 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php @@ -8,7 +8,7 @@ class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase { ] ); } - public static function provideGetModuleRegistrations() { + public function provideGetModuleRegistrations() { return [ [ [ 'msg' => 'Empty registry', @@ -33,6 +33,88 @@ mw.loader.register( [ "test.blank", "{blankVer}" ] +] );', + ] ], + [ [ + 'msg' => 'Omit raw modules from registry', + 'modules' => [ + 'test.raw' => new ResourceLoaderTestModule( [ 'isRaw' => true ] ), + 'test.blank' => new ResourceLoaderTestModule(), + ], + 'out' => ' +mw.loader.addSource( { + "local": "/w/load.php" +} ); +mw.loader.register( [ + [ + "test.blank", + "{blankVer}" + ] +] );', + ] ], + [ [ + 'msg' => 'Version falls back gracefully if getVersionHash throws', + 'modules' => [ + 'test.fail' => ( + ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' ) + ->setMethods( [ 'getVersionHash' ] )->getMock() ) + && $mock->method( 'getVersionHash' )->will( + $this->throwException( new Exception ) + ) + ) ? $mock : $mock + ], + 'out' => ' +mw.loader.addSource( { + "local": "/w/load.php" +} ); +mw.loader.register( [ + [ + "test.fail", + "" + ] +] ); +mw.loader.state( { + "test.fail": "error" +} );', + ] ], + [ [ + 'msg' => 'Use version from getVersionHash', + 'modules' => [ + 'test.version' => ( + ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' ) + ->setMethods( [ 'getVersionHash' ] )->getMock() ) + && $mock->method( 'getVersionHash' )->willReturn( '1234567' ) + ) ? $mock : $mock + ], + 'out' => ' +mw.loader.addSource( { + "local": "/w/load.php" +} ); +mw.loader.register( [ + [ + "test.version", + "1234567" + ] +] );', + ] ], + [ [ + 'msg' => 'Re-hash version from getVersionHash if too long', + 'modules' => [ + 'test.version' => ( + ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' ) + ->setMethods( [ 'getVersionHash' ] )->getMock() ) + && $mock->method( 'getVersionHash' )->willReturn( '12345678' ) + ) ? $mock : $mock + ], + 'out' => ' +mw.loader.addSource( { + "local": "/w/load.php" +} ); +mw.loader.register( [ + [ + "test.version", + "016es8l" + ] ] );', ] ], [ [ @@ -303,8 +385,8 @@ mw.loader.register( [ /** * @dataProvider provideGetModuleRegistrations - * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies * @covers ResourceLoaderStartUpModule::getModuleRegistrations + * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies * @covers ResourceLoader::makeLoaderRegisterScript */ public function testGetModuleRegistrations( $case ) { @@ -344,6 +426,7 @@ mw.loader.register( [ ]; } /** + * @covers ResourceLoaderStartUpModule::getModuleRegistrations * @dataProvider provideRegistrations */ public function testRegistrationsMinified( $modules ) { @@ -368,6 +451,7 @@ mw.loader.register( [ } /** + * @covers ResourceLoaderStartUpModule::getModuleRegistrations * @dataProvider provideRegistrations */ public function testRegistrationsUnminified( $modules ) { diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php index e0a82d06af..2618e781a1 100644 --- a/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderTest.php @@ -49,13 +49,26 @@ class ResourceLoaderTest extends ResourceLoaderTestCase { * @covers ResourceLoader::register * @covers ResourceLoader::getModule */ - public function testRegisterValid() { + public function testRegisterValidObject() { $module = new ResourceLoaderTestModule(); $resourceLoader = new EmptyResourceLoader(); $resourceLoader->register( 'test', $module ); $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) ); } + /** + * @covers ResourceLoader::register + * @covers ResourceLoader::getModule + */ + public function testRegisterValidArray() { + $module = new ResourceLoaderTestModule(); + $resourceLoader = new EmptyResourceLoader(); + // Covers case of register() setting $rl->moduleInfos, + // but $rl->modules lazy-populated by getModule() + $resourceLoader->register( 'test', [ 'object' => $module ] ); + $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) ); + } + /** * @covers ResourceLoader::register */ @@ -384,6 +397,33 @@ mw.example(); ); } + /** + * @covers ResourceLoader::makeLoaderRegisterScript + */ + public function testMakeLoaderRegisterScript() { + $this->assertEquals( + 'mw.loader.register( [ + [ + "test.name", + "1234567" + ] +] );', + ResourceLoader::makeLoaderRegisterScript( [ + [ 'test.name', '1234567' ], + ] ), + 'Nested array parameter' + ); + + $this->assertEquals( + 'mw.loader.register( "test.name", "1234567" );', + ResourceLoader::makeLoaderRegisterScript( + 'test.name', + '1234567' + ), + 'Variadic parameters' + ); + } + /** * @covers ResourceLoader::makeLoaderSourcesScript */ diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php index 3fb4bbbb1f..c74c893901 100644 --- a/tests/phpunit/includes/search/SearchEngineTest.php +++ b/tests/phpunit/includes/search/SearchEngineTest.php @@ -164,7 +164,8 @@ class SearchEngineTest extends MediaWikiLangTestCase { /** * @var $mockEngine SearchEngine */ - $mockEngine = $this->getMock( 'SearchEngine', [ 'makeSearchFieldMapping' ] ); + $mockEngine = $this->getMockBuilder( 'SearchEngine' ) + ->setMethods( [ 'makeSearchFieldMapping' ] )->getMock(); $mockFieldBuilder = function ( $name, $type ) { $mockField = @@ -230,7 +231,7 @@ class SearchEngineTest extends MediaWikiLangTestCase { } public function addAugmentors( &$setAugmentors, &$rowAugmentors ) { - $setAugmentor = $this->getMock( 'ResultSetAugmentor' ); + $setAugmentor = $this->createMock( 'ResultSetAugmentor' ); $setAugmentor->expects( $this->once() ) ->method( 'augmentAll' ) ->willReturnCallback( function ( SearchResultSet $resultSet ) { @@ -244,7 +245,7 @@ class SearchEngineTest extends MediaWikiLangTestCase { } ); $setAugmentors['testSet'] = $setAugmentor; - $rowAugmentor = $this->getMock( 'ResultAugmentor' ); + $rowAugmentor = $this->createMock( 'ResultAugmentor' ); $rowAugmentor->expects( $this->exactly( 2 ) ) ->method( 'augment' ) ->willReturnCallback( function ( SearchResult $result ) { diff --git a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php index c1eef2e809..1ea27f3f8e 100644 --- a/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php +++ b/tests/phpunit/includes/session/BotPasswordSessionProviderTest.php @@ -183,7 +183,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { public function testNewSessionInfoForRequest() { $provider = $this->getProvider(); $user = static::getTestSysop()->getUser(); - $request = $this->getMock( 'FauxRequest', [ 'getIP' ] ); + $request = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'getIP' ] )->getMock(); $request->expects( $this->any() )->method( 'getIP' ) ->will( $this->returnValue( '127.0.0.1' ) ); $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' ); @@ -210,7 +211,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { $provider->setLogger( $logger ); $user = static::getTestSysop()->getUser(); - $request = $this->getMock( 'FauxRequest', [ 'getIP' ] ); + $request = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'getIP' ] )->getMock(); $request->expects( $this->any() )->method( 'getIP' ) ->will( $this->returnValue( '127.0.0.1' ) ); $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' ); @@ -261,7 +263,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase { ], $logger->getBuffer() ); $logger->clearBuffer(); - $request2 = $this->getMock( 'FauxRequest', [ 'getIP' ] ); + $request2 = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'getIP' ] )->getMock(); $request2->expects( $this->any() )->method( 'getIP' ) ->will( $this->returnValue( '10.0.0.1' ) ); $data['metadata'] = $dataMD; diff --git a/tests/phpunit/includes/session/CookieSessionProviderTest.php b/tests/phpunit/includes/session/CookieSessionProviderTest.php index da4b06ec83..73485c828c 100644 --- a/tests/phpunit/includes/session/CookieSessionProviderTest.php +++ b/tests/phpunit/includes/session/CookieSessionProviderTest.php @@ -414,7 +414,9 @@ class CookieSessionProviderTest extends MediaWikiTestCase { ); \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false; - $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] ); + $mock = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'onUserSetCookies' ] ) + ->getMock(); $mock->expects( $this->never() )->method( 'onUserSetCookies' ); $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] ); @@ -560,13 +562,15 @@ class CookieSessionProviderTest extends MediaWikiTestCase { } protected function getSentRequest() { - $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] ); + $sentResponse = $this->getMockBuilder( 'FauxResponse' ) + ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )->getMock(); $sentResponse->expects( $this->any() )->method( 'headersSent' ) ->will( $this->returnValue( true ) ); $sentResponse->expects( $this->never() )->method( 'setCookie' ); $sentResponse->expects( $this->never() )->method( 'header' ); - $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] ); + $sentRequest = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'response' ] )->getMock(); $sentRequest->expects( $this->any() )->method( 'response' ) ->will( $this->returnValue( $sentResponse ) ); return $sentRequest; @@ -603,7 +607,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase { \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false; // Anonymous user - $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] ); + $mock = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'onUserSetCookies' ] )->getMock(); $mock->expects( $this->never() )->method( 'onUserSetCookies' ); $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] ); $backend->setUser( $anon ); @@ -621,7 +626,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase { $provider->persistSession( $backend, $this->getSentRequest() ); // Logged-in user, no remember - $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] ); + $mock = $this->getMockBuilder( __CLASS__ ) + ->setMethods( [ 'onUserSetCookies' ] )->getMock(); $mock->expects( $this->once() )->method( 'onUserSetCookies' ) ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) { $this->assertSame( $user, $u ); @@ -664,7 +670,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase { $provider->persistSession( $backend, $this->getSentRequest() ); // Logged-in user, remember - $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] ); + $mock = $this->getMockBuilder( __CLASS__ ) + ->setMethods( [ 'onUserSetCookies' ] )->getMock(); $mock->expects( $this->once() )->method( 'onUserSetCookies' ) ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) { $this->assertSame( $user, $u ); diff --git a/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php b/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php index 78edb7671e..7ef230e269 100644 --- a/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php +++ b/tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php @@ -157,13 +157,16 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase { } protected function getSentRequest() { - $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] ); + $sentResponse = $this->getMockBuilder( 'FauxResponse' ) + ->setMethods( [ 'headersSent', 'setCookie', 'header' ] ) + ->getMock(); $sentResponse->expects( $this->any() )->method( 'headersSent' ) ->will( $this->returnValue( true ) ); $sentResponse->expects( $this->never() )->method( 'setCookie' ); $sentResponse->expects( $this->never() )->method( 'header' ); - $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] ); + $sentRequest = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'response' ] )->getMock(); $sentRequest->expects( $this->any() )->method( 'response' ) ->will( $this->returnValue( $sentResponse ) ); return $sentRequest; diff --git a/tests/phpunit/includes/session/SessionBackendTest.php b/tests/phpunit/includes/session/SessionBackendTest.php index 8a0adbad76..4a28f7ae1d 100644 --- a/tests/phpunit/includes/session/SessionBackendTest.php +++ b/tests/phpunit/includes/session/SessionBackendTest.php @@ -293,7 +293,8 @@ class SessionBackendTest extends MediaWikiTestCase { } public function testPersist() { - $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'persistSession' ] )->getMock(); $this->provider->expects( $this->once() )->method( 'persistSession' ); $backend = $this->getBackend(); $this->assertFalse( $backend->isPersistent(), 'sanity check' ); @@ -312,7 +313,8 @@ class SessionBackendTest extends MediaWikiTestCase { } public function testUnpersist() { - $this->provider = $this->getMock( 'DummySessionProvider', [ 'unpersistSession' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'unpersistSession' ] )->getMock(); $this->provider->expects( $this->once() )->method( 'unpersistSession' ); $backend = $this->getBackend(); $wrap = \TestingAccessWrapper::newFromObject( $backend ); @@ -362,7 +364,8 @@ class SessionBackendTest extends MediaWikiTestCase { public function testSetUser() { $user = static::getTestSysop()->getUser(); - $this->provider = $this->getMock( 'DummySessionProvider', [ 'canChangeUser' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'canChangeUser' ] )->getMock(); $this->provider->expects( $this->any() )->method( 'canChangeUser' ) ->will( $this->returnValue( false ) ); $backend = $this->getBackend(); @@ -488,7 +491,8 @@ class SessionBackendTest extends MediaWikiTestCase { $this->store = new TestBagOStuff(); $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ]; - $neverHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] ); + $neverHook = $this->getMockBuilder( __CLASS__ ) + ->setMethods( [ 'onSessionMetadata' ] )->getMock(); $neverHook->expects( $this->never() )->method( 'onSessionMetadata' ); $builder = $this->getMockBuilder( 'DummySessionProvider' ) @@ -694,7 +698,8 @@ class SessionBackendTest extends MediaWikiTestCase { // Bad hook $this->provider = null; - $mockHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] ); + $mockHook = $this->getMockBuilder( __CLASS__ ) + ->setMethods( [ 'onSessionMetadata' ] )->getMock(); $mockHook->expects( $this->any() )->method( 'onSessionMetadata' ) ->will( $this->returnCallback( function ( SessionBackend $backend, array &$metadata, array $requests ) { @@ -738,7 +743,8 @@ class SessionBackendTest extends MediaWikiTestCase { $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ]; // Not persistent - $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'persistSession' ] )->getMock(); $this->provider->expects( $this->never() )->method( 'persistSession' ); $this->onSessionMetadataCalled = false; $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] ); @@ -763,7 +769,8 @@ class SessionBackendTest extends MediaWikiTestCase { $this->assertNotEquals( 0, $wrap->expires ); // Persistent - $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'persistSession' ] )->getMock(); $this->provider->expects( $this->atLeastOnce() )->method( 'persistSession' ); $this->onSessionMetadataCalled = false; $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] ); @@ -789,7 +796,8 @@ class SessionBackendTest extends MediaWikiTestCase { $this->assertNotEquals( 0, $wrap->expires ); // Not persistent, not expiring - $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] ); + $this->provider = $this->getMockBuilder( 'DummySessionProvider' ) + ->setMethods( [ 'persistSession' ] )->getMock(); $this->provider->expects( $this->never() )->method( 'persistSession' ); $this->onSessionMetadataCalled = false; $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] ); diff --git a/tests/phpunit/includes/session/SessionManagerTest.php b/tests/phpunit/includes/session/SessionManagerTest.php index 48a72d3415..c4b1072cda 100644 --- a/tests/phpunit/includes/session/SessionManagerTest.php +++ b/tests/phpunit/includes/session/SessionManagerTest.php @@ -779,7 +779,8 @@ class SessionManagerTest extends MediaWikiTestCase { $manager = \TestingAccessWrapper::newFromObject( $this->getManager() ); $manager->setLogger( new \Psr\Log\NullLogger() ); - $mock = $this->getMock( 'stdClass', [ 'shutdown' ] ); + $mock = $this->getMockBuilder( 'stdClass' ) + ->setMethods( [ 'shutdown' ] )->getMock(); $mock->expects( $this->once() )->method( 'shutdown' ); $manager->allSessionBackends = [ $mock ]; diff --git a/tests/phpunit/includes/session/SessionTest.php b/tests/phpunit/includes/session/SessionTest.php index e6a6ad351f..f6c88ecf08 100644 --- a/tests/phpunit/includes/session/SessionTest.php +++ b/tests/phpunit/includes/session/SessionTest.php @@ -37,8 +37,9 @@ class SessionTest extends MediaWikiTestCase { * @param bool $ret Whether the method returns a value */ public function testMethods( $m, $args, $index, $ret ) { - $mock = $this->getMock( DummySessionBackend::class, - [ $m, 'deregisterSession' ] ); + $mock = $this->getMockBuilder( DummySessionBackend::class ) + ->setMethods( [ $m, 'deregisterSession' ] ) + ->getMock(); $mock->expects( $this->once() )->method( 'deregisterSession' ) ->with( $this->identicalTo( 42 ) ); @@ -223,9 +224,9 @@ class SessionTest extends MediaWikiTestCase { $session = TestUtils::getDummySession(); $priv = \TestingAccessWrapper::newFromObject( $session ); - $backend = $this->getMock( - DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] - ); + $backend = $this->getMockBuilder( DummySessionBackend::class ) + ->setMethods( [ 'canSetUser', 'setUser', 'save' ] ) + ->getMock(); $backend->expects( $this->once() )->method( 'canSetUser' ) ->will( $this->returnValue( true ) ); $backend->expects( $this->once() )->method( 'setUser' ) @@ -238,9 +239,9 @@ class SessionTest extends MediaWikiTestCase { $this->assertSame( [], $backend->data ); $this->assertTrue( $backend->dirty ); - $backend = $this->getMock( - DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] - ); + $backend = $this->getMockBuilder( DummySessionBackend::class ) + ->setMethods( [ 'canSetUser', 'setUser', 'save' ] ) + ->getMock(); $backend->data = []; $backend->expects( $this->once() )->method( 'canSetUser' ) ->will( $this->returnValue( true ) ); @@ -253,9 +254,9 @@ class SessionTest extends MediaWikiTestCase { $session->clear(); $this->assertFalse( $backend->dirty ); - $backend = $this->getMock( - DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ] - ); + $backend = $this->getMockBuilder( DummySessionBackend::class ) + ->setMethods( [ 'canSetUser', 'setUser', 'save' ] ) + ->getMock(); $backend->expects( $this->once() )->method( 'canSetUser' ) ->will( $this->returnValue( false ) ); $backend->expects( $this->never() )->method( 'setUser' ); diff --git a/tests/phpunit/includes/site/SiteExporterTest.php b/tests/phpunit/includes/site/SiteExporterTest.php index cb4b6976f4..c0d8c00147 100644 --- a/tests/phpunit/includes/site/SiteExporterTest.php +++ b/tests/phpunit/includes/site/SiteExporterTest.php @@ -75,7 +75,7 @@ class SiteExporterTest extends PHPUnit_Framework_TestCase { } private function newSiteStore( SiteList $sites ) { - $store = $this->getMock( 'SiteStore' ); + $store = $this->getMockBuilder( 'SiteStore' )->getMock(); $store->expects( $this->once() ) ->method( 'saveSites' ) diff --git a/tests/phpunit/includes/site/SiteImporterTest.php b/tests/phpunit/includes/site/SiteImporterTest.php index 45241c5941..ea49429c3b 100644 --- a/tests/phpunit/includes/site/SiteImporterTest.php +++ b/tests/phpunit/includes/site/SiteImporterTest.php @@ -32,7 +32,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase { private function newSiteImporter( array $expectedSites, $errorCount ) { - $store = $this->getMock( 'SiteStore' ); + $store = $this->getMockBuilder( 'SiteStore' )->getMock(); $store->expects( $this->once() ) ->method( 'saveSites' ) @@ -44,7 +44,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase { ->method( 'getSites' ) ->will( $this->returnValue( new SiteList() ) ); - $errorHandler = $this->getMock( 'Psr\Log\LoggerInterface' ); + $errorHandler = $this->getMockBuilder( 'Psr\Log\LoggerInterface' )->getMock(); $errorHandler->expects( $this->exactly( $errorCount ) ) ->method( 'error' ); @@ -148,7 +148,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase { public function testImportFromXML_malformed() { $this->setExpectedException( 'Exception' ); - $store = $this->getMock( 'SiteStore' ); + $store = $this->getMockBuilder( 'SiteStore' )->getMock(); $importer = new SiteImporter( $store ); $importer->importFromXML( 'THIS IS NOT XML' ); } diff --git a/tests/phpunit/includes/specials/SpecialPreferencesTest.php b/tests/phpunit/includes/specials/SpecialPreferencesTest.php index 4a46464d71..fd587bfa0c 100644 --- a/tests/phpunit/includes/specials/SpecialPreferencesTest.php +++ b/tests/phpunit/includes/specials/SpecialPreferencesTest.php @@ -25,7 +25,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase { // Set a low limit $this->setMwGlobals( 'wgMaxSigChars', 2 ); - $user = $this->getMock( 'User' ); + $user = $this->createMock( 'User' ); $user->expects( $this->any() ) ->method( 'isAnon' ) ->will( $this->returnValue( false ) ); diff --git a/tests/phpunit/includes/upload/UploadBaseTest.php b/tests/phpunit/includes/upload/UploadBaseTest.php index a42c86c3a6..dd68cdcab7 100644 --- a/tests/phpunit/includes/upload/UploadBaseTest.php +++ b/tests/phpunit/includes/upload/UploadBaseTest.php @@ -130,8 +130,8 @@ class UploadBaseTest extends MediaWikiTestCase { */ public function testCheckSvgScriptCallback( $svg, $wellFormed, $filterMatch, $message ) { list( $formed, $match ) = $this->upload->checkSvgString( $svg ); - $this->assertSame( $wellFormed, $formed, $message ); - $this->assertSame( $filterMatch, $match, $message ); + $this->assertSame( $wellFormed, $formed, $message . " (well-formed)" ); + $this->assertSame( $filterMatch, $match, $message . " (filter match)" ); } public static function provideCheckSvgScriptCallback() { @@ -254,10 +254,16 @@ class UploadBaseTest extends MediaWikiTestCase { ], [ ' ]> ', - true, + false, true, 'SVG with embedded stylesheet (http://html5sec.org/#125)' ], + [ + ' ', + true, + true, + 'SVG with embedded stylesheet no doctype' + ], [ ' alert(1) ', true, @@ -364,7 +370,7 @@ class UploadBaseTest extends MediaWikiTestCase { ], [ ' ]> &lol2; ', - true, + false, true, 'SVG with encoded script tag in internal entity (reported by Beyond Security)' ], @@ -374,6 +380,16 @@ class UploadBaseTest extends MediaWikiTestCase { false, 'SVG with external entity' ], + [ + // The base64 = . If for some reason + // entities actually do get loaded, this should trigger + // filterMatch to be true. So this test verifies that we + // are not loading external entities. + ' ]> &foo; ', + false, + false, /* False verifies entities aren't getting loaded */ + 'SVG with data: uri external entity' + ], [ " ", true, @@ -393,6 +409,104 @@ class UploadBaseTest extends MediaWikiTestCase { false, 'SVG with local urls, including filter: in style' ], + [ + ' ]> ', + false, + false, + 'SVG with evil default attribute values' + ], + [ + ' ', + true, + true, + 'SVG with an evil external dtd' + ], + [ + '', + true, + true, + 'SVG with random public doctype' + ], + [ + '', + true, + true, + 'SVG with random SYSTEM doctype' + ], + [ + '] >', + false, + false, + 'SVG with parameter entity' + ], + [ + '', + false, + false, + 'SVG with entity referencing parameter entity' + ], + [ + ' ] >', + false, + false, + 'SVG with long entity' + ], + [ + ' ] >&foo;', + true, + false, + 'SVG with apostrophe quote entity' + ], + [ + ' ] >&foo;', + false, + false, + 'SVG with recursive entity', + ], + [ + ' ]> ', + true, /* well-formed */ + false, /* filter-hit */ + 'GraphViz-esque svg with #FIXED xlink ns (Should be allowed)' + ], + [ + ' ]> ', + false, + false, + 'GraphViz ATLIST exception should match exactly' + ], + [ + ' ]>', + true, + false, + 'DTD with comments (Should be allowed)' + ], + [ + ' ]>', + false, + false, + 'DTD with invalid comment' + ], + [ + ' ]>', + false, + false, + 'DTD with invalid comment 2' + ], + [ + ' ]>', + true, + false, + 'DTD with aliased entities (Should be allowed)' + ], + [ + ' ]>', + true, + false, + 'DTD with aliased entities apos (Should be allowed)' + ] ]; // @codingStandardsIgnoreEnd } @@ -478,7 +592,10 @@ class UploadTestHandler extends UploadBase { $svg, [ $this, 'checkSvgScriptCallback' ], false, - [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ] + [ + 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback', + 'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD' + ] ); return [ $check->wellFormed, $check->filterMatch ]; } diff --git a/tests/phpunit/includes/user/BotPasswordTest.php b/tests/phpunit/includes/user/BotPasswordTest.php index 81c84e8306..594540f7a2 100644 --- a/tests/phpunit/includes/user/BotPasswordTest.php +++ b/tests/phpunit/includes/user/BotPasswordTest.php @@ -311,7 +311,9 @@ class BotPasswordTest extends MediaWikiTestCase { ); // Failed restriction - $request = $this->getMock( 'FauxRequest', [ 'getIP' ] ); + $request = $this->getMockBuilder( 'FauxRequest' ) + ->setMethods( [ 'getIP' ] ) + ->getMock(); $request->expects( $this->any() )->method( 'getIP' ) ->will( $this->returnValue( '10.0.0.1' ) ); $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request ); diff --git a/tests/phpunit/includes/user/PasswordResetTest.php b/tests/phpunit/includes/user/PasswordResetTest.php index 7ff882a5ad..3363bca524 100644 --- a/tests/phpunit/includes/user/PasswordResetTest.php +++ b/tests/phpunit/includes/user/PasswordResetTest.php @@ -23,7 +23,7 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase { $authManager->expects( $this->any() )->method( 'allowsAuthenticationDataChange' ) ->willReturn( $allowsAuthenticationDataChange ? Status::newGood() : Status::newFatal( 'foo' ) ); - $user = $this->getMock( User::class ); + $user = $this->getMockBuilder( User::class )->getMock(); $user->expects( $this->any() )->method( 'getName' )->willReturn( 'Foo' ); $user->expects( $this->any() )->method( 'isBlocked' )->willReturn( $userIsBlocked ); $user->expects( $this->any() )->method( 'isAllowed' ) @@ -124,12 +124,12 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase { $request = new FauxRequest(); $request->setIP( '1.2.3.4' ); - $performingUser = $this->getMock( User::class ); + $performingUser = $this->getMockBuilder( User::class )->getMock(); $performingUser->expects( $this->any() )->method( 'getRequest' )->willReturn( $request ); $performingUser->expects( $this->any() )->method( 'isAllowed' )->willReturn( true ); - $targetUser1 = $this->getMock( User::class ); - $targetUser2 = $this->getMock( User::class ); + $targetUser1 = $this->getMockBuilder( User::class )->getMock(); + $targetUser2 = $this->getMockBuilder( User::class )->getMock(); $targetUser1->expects( $this->any() )->method( 'getName' )->willReturn( 'User1' ); $targetUser2->expects( $this->any() )->method( 'getName' )->willReturn( 'User2' ); $targetUser1->expects( $this->any() )->method( 'getId' )->willReturn( 1 ); diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php index cb3d227203..6b0e3443c1 100644 --- a/tests/phpunit/maintenance/MaintenanceTest.php +++ b/tests/phpunit/maintenance/MaintenanceTest.php @@ -835,7 +835,7 @@ class MaintenanceTest extends MediaWikiTestCase { * @covers Maintenance::setConfig */ public function testSetConfig() { - $conf = $this->getMock( 'Config' ); + $conf = $this->createMock( 'Config' ); $this->m->setConfig( $conf ); $this->assertSame( $conf, $this->m->getConfig() ); } diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php index d7e72bb023..d460401a86 100644 --- a/tests/phpunit/maintenance/backupTextPassTest.php +++ b/tests/phpunit/maintenance/backupTextPassTest.php @@ -169,7 +169,10 @@ class TextPassDumperDatabaseTest extends DumpTestCase { ]; // The mock itself - $prefetchMock = $this->getMock( 'BaseDump', [ 'prefetch' ], [], '', false ); + $prefetchMock = $this->getMockBuilder( 'BaseDump' ) + ->setMethods( [ 'prefetch' ] ) + ->disableOriginalConstructor() + ->getMock(); $prefetchMock->expects( $this->exactly( 6 ) ) ->method( 'prefetch' ) ->will( $this->returnValueMap( $prefetchMap ) ); diff --git a/tests/phpunit/tests/MediaWikiTestCaseTest.php b/tests/phpunit/tests/MediaWikiTestCaseTest.php index edc81ff925..7d75ffe648 100644 --- a/tests/phpunit/tests/MediaWikiTestCaseTest.php +++ b/tests/phpunit/tests/MediaWikiTestCaseTest.php @@ -142,7 +142,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase { */ public function testLoggersAreRestoredOnTearDown_replacingExistingLogger() { $logger1 = LoggerFactory::getInstance( 'foo' ); - $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) ); + $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) ); $logger2 = LoggerFactory::getInstance( 'foo' ); $this->tearDown(); $logger3 = LoggerFactory::getInstance( 'foo' ); @@ -156,7 +156,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase { * @covers MediaWikiTestCase::restoreLoggers */ public function testLoggersAreRestoredOnTearDown_replacingNonExistingLogger() { - $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) ); + $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) ); $logger1 = LoggerFactory::getInstance( 'foo' ); $this->tearDown(); $logger2 = LoggerFactory::getInstance( 'foo' ); @@ -171,8 +171,8 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase { */ public function testLoggersAreRestoredOnTearDown_replacingSameLoggerTwice() { $logger1 = LoggerFactory::getInstance( 'baz' ); - $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) ); - $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) ); + $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) ); + $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) ); $this->tearDown(); $logger2 = LoggerFactory::getInstance( 'baz' ); diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js index 405fdcf1de..27d38258ef 100644 --- a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js @@ -485,6 +485,7 @@ title: 'Group 3', type: 'string_options', separator: ',', + default: 'filter8', filters: [ { name: 'filter7', @@ -494,8 +495,7 @@ { name: 'filter8', label: 'Group 3: Filter 2', - description: 'Description of Filter 2 in Group 3', - default: true + description: 'Description of Filter 2 in Group 3' }, { name: 'filter9', @@ -647,11 +647,11 @@ assert.deepEqual( model.getSelectedState(), $.extend( {}, defaultFilterRepresentation, { - group3__filter7: false, - group3__filter8: false, - group3__filter9: false + group3__filter7: true, + group3__filter8: true, + group3__filter9: true } ), - 'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.' + 'A \'string_options\' parameter containing all values, results in all filters of the group as checked.' ); model.toggleFiltersSelected( @@ -662,11 +662,11 @@ assert.deepEqual( model.getSelectedState(), $.extend( {}, defaultFilterRepresentation, { - group3__filter7: false, - group3__filter8: false, - group3__filter9: false + group3__filter7: true, + group3__filter8: true, + group3__filter9: true } ), - 'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.' + 'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as checked.' ); model.toggleFiltersSelected( diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js index 297f0fdb65..70a7e35e52 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js @@ -12,7 +12,7 @@ assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' ); tocHtml = '
                                                          ' + - '
                                                          ' + + '
                                                          ' + '

                                                          Contents

                                                          ' + '
                                                          ' + '
                                                          ' + @@ -21,7 +21,7 @@ mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) ); $tocList = $( '#toc ul:first' ); - $toggleLink = $( '#togglelink' ); + $toggleLink = $( '#toc .togglelink' ); assert.strictEqual( $toggleLink.length, 1, 'Toggle link is added to the table of contents' );