From: jenkins-bot
Date: Wed, 13 Sep 2017 10:15:54 +0000 (+0000)
Subject: Merge "Linker: Accept LinkTargets in makeCommentLink()"
X-Git-Tag: 1.31.0-rc.0~2124
X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/password.php?a=commitdiff_plain;h=f1c7c0f03da1607dc955dc8db879a16fc0575657;hp=1fd75c78dbd3ba2d7a66d9e35c6716b94ad2d8f3;p=lhc%2Fweb%2Fwiklou.git
Merge "Linker: Accept LinkTargets in makeCommentLink()"
---
diff --git a/autoload.php b/autoload.php
index 4448204a5e..61fd192f0d 100644
--- a/autoload.php
+++ b/autoload.php
@@ -421,8 +421,8 @@ $wgAutoloadLocalClasses = [
'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
'EditCLI' => __DIR__ . '/maintenance/edit.php',
'EditPage' => __DIR__ . '/includes/EditPage.php',
- 'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
- 'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+ 'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php',
+ 'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/forms/EditWatchlistNormalHTMLForm.php',
'EmailConfirmation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialEmailInvalidate.php',
'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
@@ -633,7 +633,7 @@ $wgAutoloadLocalClasses = [
'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
'ImportImages' => __DIR__ . '/maintenance/importImages.php',
'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php',
- 'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
+ 'ImportReporter' => __DIR__ . '/includes/specials/helpers/ImportReporter.php',
'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
'ImportSites' => __DIR__ . '/maintenance/importSites.php',
'ImportSource' => __DIR__ . '/includes/import/ImportSource.php',
@@ -746,8 +746,8 @@ $wgAutoloadLocalClasses = [
'Languages' => __DIR__ . '/maintenance/language/languages.inc',
'LayeredParameterizedPassword' => __DIR__ . '/includes/password/LayeredParameterizedPassword.php',
'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
- 'License' => __DIR__ . '/includes/Licenses.php',
- 'Licenses' => __DIR__ . '/includes/Licenses.php',
+ 'License' => __DIR__ . '/includes/specials/helpers/License.php',
+ 'Licenses' => __DIR__ . '/includes/specials/formfields/Licenses.php',
'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
@@ -1135,7 +1135,7 @@ $wgAutoloadLocalClasses = [
'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
'Preferences' => __DIR__ . '/includes/Preferences.php',
- 'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
+ 'PreferencesForm' => __DIR__ . '/includes/specials/forms/PreferencesForm.php',
'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php',
'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php',
@@ -1532,14 +1532,14 @@ $wgAutoloadLocalClasses = [
'UploadChunkVerificationException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
'UploadChunkZeroLengthFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
'UploadDumper' => __DIR__ . '/maintenance/dumpUploads.php',
- 'UploadForm' => __DIR__ . '/includes/specials/SpecialUpload.php',
+ 'UploadForm' => __DIR__ . '/includes/specials/forms/UploadForm.php',
'UploadFromChunks' => __DIR__ . '/includes/upload/UploadFromChunks.php',
'UploadFromFile' => __DIR__ . '/includes/upload/UploadFromFile.php',
'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
'UploadLogFormatter' => __DIR__ . '/includes/logging/UploadLogFormatter.php',
'UploadSourceAdapter' => __DIR__ . '/includes/import/UploadSourceAdapter.php',
- 'UploadSourceField' => __DIR__ . '/includes/specials/SpecialUpload.php',
+ 'UploadSourceField' => __DIR__ . '/includes/specials/formfields/UploadSourceField.php',
'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
'UploadStashBadPathException' => __DIR__ . '/includes/upload/UploadStash.php',
'UploadStashCleanup' => __DIR__ . '/maintenance/cleanupUploadStash.php',
diff --git a/composer.json b/composer.json
index dd7567c93c..70d2e8f310 100644
--- a/composer.json
+++ b/composer.json
@@ -54,7 +54,7 @@
"jakub-onderka/php-parallel-lint": "0.9.2",
"jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
"justinrainbow/json-schema": "~5.2",
- "mediawiki/mediawiki-codesniffer": "0.11.0",
+ "mediawiki/mediawiki-codesniffer": "0.12.0",
"monolog/monolog": "~1.22.1",
"nikic/php-parser": "2.1.0",
"nmred/kafka-php": "0.1.5",
diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php
index 2adbc80f3b..75fcff3654 100644
--- a/includes/AjaxDispatcher.php
+++ b/includes/AjaxDispatcher.php
@@ -56,6 +56,7 @@ class AjaxDispatcher {
/**
* Load up our object with user supplied data
+ * @param Config $config
*/
function __construct( Config $config ) {
$this->config = $config;
diff --git a/includes/Block.php b/includes/Block.php
index 40095f18b8..5a4c43e6ae 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -1329,7 +1329,7 @@ class Block {
* which in turn gives User::getName().
*
* @param string|int|User|null $target
- * @return array( User|String|null, Block::TYPE_ constant|null )
+ * @return array [ User|String|null, Block::TYPE_ constant|null ]
*/
public static function parseTarget( $target ) {
# We may have been through this before
@@ -1396,7 +1396,7 @@ class Block {
* Get the target and target type for this particular Block. Note that for autoblocks,
* this returns the unredacted name; frontend functions need to call $block->getRedactedName()
* in this situation.
- * @return array( User|String, Block::TYPE_ constant )
+ * @return array [ User|String, Block::TYPE_ constant ]
* @todo FIXME: This should be an integral part of the Block member variables
*/
public function getTargetAndType() {
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index cf8e089bee..5b77d16c4e 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -3394,8 +3394,8 @@ $wgExperimentalHtmlIds = false;
/**
* How should section IDs be encoded?
* This array can contain 1 or 2 elements, each of them can be one of:
- * - 'html5' is modern HTML5 style encoding with minimal escaping. Allows to
- * display Unicode characters in many browsers' address bars.
+ * - 'html5' is modern HTML5 style encoding with minimal escaping. Displays Unicode
+ * characters in most browsers' address bars.
* - 'legacy' is old MediaWiki-style encoding, e.g. å¤é
turns into .E5.95.A4.E9.85.92
* - 'html5-legacy' corresponds to DEPRECATED $wgExperimentalHtmlIds mode. DO NOT use
* it for anything but migration off that mode (see below).
@@ -4920,6 +4920,7 @@ $wgDefaultUserOptions = [
'previewontop' => 1,
'rcdays' => 7,
'rcenhancedfilters' => 0,
+ 'rcenhancedfilters-disable' => 0,
'rclimit' => 50,
'rows' => 25, // @deprecated since 1.29 No longer used in core
'showhiddencats' => 0,
@@ -6829,19 +6830,37 @@ $wgRCWatchCategoryMembership = false;
*/
$wgUseRCPatrol = true;
+/**
+ * Whether a preference is displayed for structured change filters.
+ * If false, no preference is displayed and structured change filters are disabled.
+ * If true, structured change filters are *enabled* by default, and a preference is displayed
+ * that lets users disable them.
+ *
+ * Temporary variable during development and will be removed.
+ *
+ * @since 1.30
+ */
+$wgStructuredChangeFiltersShowPreference = false;
+
/**
* Whether to show the new experimental views (like namespaces, tags, and users) in
* RecentChanges filters
+ *
+ * Temporary variable during development and will be removed.
*/
$wgStructuredChangeFiltersEnableExperimentalViews = false;
/**
* Whether to allow users to use the experimental live update feature in the new RecentChanges UI
+ *
+ * Temporary variable during development and will be removed.
*/
$wgStructuredChangeFiltersEnableLiveUpdate = false;
/**
* Whether to enable RCFilters app on Special:Watchlist
+ *
+ * Temporary variable during development and will be removed.
*/
$wgStructuredChangeFiltersOnWatchlist = false;
diff --git a/includes/EditPage.php b/includes/EditPage.php
index 06a5cc3b62..9f3f586748 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -2915,7 +2915,7 @@ class EditPage {
}
}
- $buttonLabel = $this->context->msg( $this->getSaveButtonLabel() )->text();
+ $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
if ( $this->missingComment ) {
$out->wrapWikiMsg( "", 'missingcommenttext' );
@@ -3794,7 +3794,7 @@ class EditPage {
* @return string
*/
public function getPreviewText() {
- global $wgRawHtml, $wgLang;
+ global $wgRawHtml;
global $wgAllowUserCss, $wgAllowUserJs;
$out = $this->context->getOutput();
@@ -3830,7 +3830,8 @@ class EditPage {
# provide a anchor link to the editform
$continueEditing = '' .
- '[[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' .
+ '[[#' . self::EDITFORM_ID . '|' .
+ $this->context->getLanguage()->getArrow() . ' ' .
$this->context->msg( 'continue-editing' )->text() . ']] ';
if ( $this->mTriedSave && !$this->mTokenOk ) {
if ( $this->mTokenOkExceptSuffix ) {
@@ -4333,9 +4334,9 @@ class EditPage {
*
* @return string
*/
- private function getSaveButtonLabel() {
+ protected function getSubmitButtonLabel() {
$labelAsPublish =
- $this->mArticle->getContext()->getConfig()->get( 'EditSubmitButtonLabelPublish' );
+ $this->context->getConfig()->get( 'EditSubmitButtonLabelPublish' );
// Can't use $this->isNew as that's also true if we're adding a new section to an extant page
$newPage = !$this->mTitle->exists();
@@ -4360,7 +4361,7 @@ class EditPage {
public function getEditButtons( &$tabindex ) {
$buttons = [];
- $buttonLabel = $this->context->msg( $this->getSaveButtonLabel() )->text();
+ $buttonLabel = $this->context->msg( $this->getSubmitButtonLabel() )->text();
$attribs = [
'name' => 'wpSave',
@@ -4448,11 +4449,10 @@ class EditPage {
* @param string|array|bool $match Text (or array of texts) which triggered one or more filters
*/
public function spamPageWithContent( $match = false ) {
- global $wgLang;
$this->textbox2 = $this->textbox1;
if ( is_array( $match ) ) {
- $match = $wgLang->listToText( $match );
+ $match = $this->context->getLanguage()->listToText( $match );
}
$out = $this->context->getOutput();
$out->prepareErrorPage( $this->context->msg( 'spamprotectiontitle' ) );
@@ -4640,19 +4640,20 @@ class EditPage {
* @since 1.29
*/
protected function addLongPageWarningHeader() {
- global $wgMaxArticleSize, $wgLang;
+ global $wgMaxArticleSize;
if ( $this->contentLength === false ) {
$this->contentLength = strlen( $this->textbox1 );
}
$out = $this->context->getOutput();
+ $lang = $this->context->getLanguage();
if ( $this->tooBig || $this->contentLength > $wgMaxArticleSize * 1024 ) {
$out->wrapWikiMsg( "\n$1\n
",
[
'longpageerror',
- $wgLang->formatNum( round( $this->contentLength / 1024, 3 ) ),
- $wgLang->formatNum( $wgMaxArticleSize )
+ $lang->formatNum( round( $this->contentLength / 1024, 3 ) ),
+ $lang->formatNum( $wgMaxArticleSize )
]
);
} else {
@@ -4660,7 +4661,7 @@ class EditPage {
$out->wrapWikiMsg( "\n$1\n
",
[
'longpage-hint',
- $wgLang->formatSize( strlen( $this->textbox1 ) ),
+ $lang->formatSize( strlen( $this->textbox1 ) ),
strlen( $this->textbox1 )
]
);
@@ -4717,7 +4718,7 @@ class EditPage {
protected function addExplainConflictHeader( OutputPage $out ) {
$out->wrapWikiMsg(
"\n$1\n
",
- [ 'explainconflict', $this->context->msg( $this->getSaveButtonLabel() )->text() ]
+ [ 'explainconflict', $this->context->msg( $this->getSubmitButtonLabel() )->text() ]
);
}
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index 725a512980..53c8d3bf7c 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -246,6 +246,9 @@ class FormOptions implements ArrayAccess {
/**
* @see validateBounds()
+ * @param string $name
+ * @param int $min
+ * @param int $max
*/
public function validateIntBounds( $name, $min, $max ) {
$this->validateBounds( $name, $min, $max );
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index fa97515297..e80ecf1c46 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -3160,6 +3160,7 @@ function wfShorthandToInteger( $string = '', $default = -1 ) {
/**
* Get the normalised IETF language tag
* See unit test for examples.
+ * See mediawiki.language.bcp47 for the JavaScript implementation.
*
* @param string $code The language code.
* @return string The language code which complying with BCP 47 standards.
diff --git a/includes/Licenses.php b/includes/Licenses.php
deleted file mode 100644
index 6467777bff..0000000000
--- a/includes/Licenses.php
+++ /dev/null
@@ -1,210 +0,0 @@
-
- * @copyright Copyright © 2005, Ãvar Arnfjörð Bjarmason
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-
-/**
- * A License class for use on Special:Upload
- */
-class Licenses extends HTMLFormField {
- /** @var string */
- protected $msg;
-
- /** @var array */
- protected $licenses = [];
-
- /** @var string */
- protected $html;
- /**#@-*/
-
- /**
- * @param array $params
- */
- public function __construct( $params ) {
- parent::__construct( $params );
-
- $this->msg = empty( $params['licenses'] )
- ? wfMessage( 'licenses' )->inContentLanguage()->plain()
- : $params['licenses'];
- $this->selected = null;
-
- $this->makeLicenses();
- }
-
- /**
- * @private
- */
- protected function makeLicenses() {
- $levels = [];
- $lines = explode( "\n", $this->msg );
-
- foreach ( $lines as $line ) {
- if ( strpos( $line, '*' ) !== 0 ) {
- continue;
- } else {
- list( $level, $line ) = $this->trimStars( $line );
-
- if ( strpos( $line, '|' ) !== false ) {
- $obj = new License( $line );
- $this->stackItem( $this->licenses, $levels, $obj );
- } else {
- if ( $level < count( $levels ) ) {
- $levels = array_slice( $levels, 0, $level );
- }
- if ( $level == count( $levels ) ) {
- $levels[$level - 1] = $line;
- } elseif ( $level > count( $levels ) ) {
- $levels[] = $line;
- }
- }
- }
- }
- }
-
- /**
- * @param string $str
- * @return array
- */
- protected function trimStars( $str ) {
- $numStars = strspn( $str, '*' );
- return [ $numStars, ltrim( substr( $str, $numStars ), ' ' ) ];
- }
-
- /**
- * @param array &$list
- * @param array $path
- * @param mixed $item
- */
- protected function stackItem( &$list, $path, $item ) {
- $position =& $list;
- if ( $path ) {
- foreach ( $path as $key ) {
- $position =& $position[$key];
- }
- }
- $position[] = $item;
- }
-
- /**
- * @param array $tagset
- * @param int $depth
- */
- protected function makeHtml( $tagset, $depth = 0 ) {
- foreach ( $tagset as $key => $val ) {
- if ( is_array( $val ) ) {
- $this->html .= $this->outputOption(
- $key, '',
- [
- 'disabled' => 'disabled',
- 'style' => 'color: GrayText', // for MSIE
- ],
- $depth
- );
- $this->makeHtml( $val, $depth + 1 );
- } else {
- $this->html .= $this->outputOption(
- $val->text, $val->template,
- [ 'title' => '{{' . $val->template . '}}' ],
- $depth
- );
- }
- }
- }
-
- /**
- * @param string $message
- * @param string $value
- * @param null|array $attribs
- * @param int $depth
- * @return string
- */
- protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
- $msgObj = $this->msg( $message );
- $text = $msgObj->exists() ? $msgObj->text() : $message;
- $attribs['value'] = $value;
- if ( $value === $this->selected ) {
- $attribs['selected'] = 'selected';
- }
-
- $val = str_repeat( /*   */ "\xc2\xa0", $depth * 2 ) . $text;
- return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
- }
-
- /**#@-*/
-
- /**
- * Accessor for $this->licenses
- *
- * @return array
- */
- public function getLicenses() {
- return $this->licenses;
- }
-
- /**
- * Accessor for $this->html
- *
- * @param bool $value
- *
- * @return string
- */
- public function getInputHTML( $value ) {
- $this->selected = $value;
-
- $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '',
- (bool)$this->selected ? null : [ 'selected' => 'selected' ] );
- $this->makeHtml( $this->getLicenses() );
-
- $attribs = [
- 'name' => $this->mName,
- 'id' => $this->mID
- ];
- if ( !empty( $this->mParams['disabled'] ) ) {
- $attibs['disabled'] = 'disabled';
- }
-
- return Html::rawElement( 'select', $attribs, $this->html );
- }
-}
-
-/**
- * A License class for use on Special:Upload (represents a single type of license).
- */
-class License {
- /** @var string */
- public $template;
-
- /** @var string */
- public $text;
-
- /**
- * @param string $str License name??
- */
- function __construct( $str ) {
- list( $text, $template ) = explode( '|', strrev( $str ), 2 );
-
- $this->template = strrev( $template );
- $this->text = strrev( $text );
- }
-}
diff --git a/includes/Linker.php b/includes/Linker.php
index a55067d8cd..c24ae417f1 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -1537,10 +1537,16 @@ class Linker {
if ( $sectionIndex !== false ) {
$classes .= " tocsection-$sectionIndex";
}
- return "\n' .
- $tocnumber . ' ' .
- $tocline . ' ';
+
+ // \n
+ // $tocnumber $tocline
+ return "\n" . Html::openElement( 'li', [ 'class' => $classes ] )
+ . Html::rawElement( 'a',
+ [ 'href' => "#$anchor" ],
+ Html::element( 'span', [ 'class' => 'tocnumber' ], $tocnumber )
+ . ' '
+ . Html::rawElement( 'span', [ 'class' => 'toctext' ], $tocline )
+ );
}
/**
diff --git a/includes/OrderedStreamingForkController.php b/includes/OrderedStreamingForkController.php
index 1436c1c960..ff29cb510d 100644
--- a/includes/OrderedStreamingForkController.php
+++ b/includes/OrderedStreamingForkController.php
@@ -56,7 +56,7 @@ class OrderedStreamingForkController extends ForkController {
}
/**
- * {@inheritDoc}
+ * @inheritDoc
*/
public function start() {
if ( $this->procsToStart > 0 ) {
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index dd21194bdb..52161466a6 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -139,6 +139,9 @@ class OutputPage extends ContextSource {
/** @var array Array of elements in "". Parser might add its own headers! */
protected $mHeadItems = [];
+ /** @var array Additional classes; there are also classes from other sources */
+ protected $mAdditionalBodyClasses = [];
+
/** @var array */
protected $mModules = [];
@@ -705,6 +708,16 @@ class OutputPage extends ContextSource {
return isset( $this->mHeadItems[$name] );
}
+ /**
+ * Add a class to the element
+ *
+ * @since 1.30
+ * @param string|string[] $classes One or more classes to add
+ */
+ public function addBodyClasses( $classes ) {
+ $this->mAdditionalBodyClasses = array_merge( $this->mAdditionalBodyClasses, (array)$classes );
+ }
+
/**
* @deprecated since 1.28 Obsolete - wgUseETag experiment was removed.
* @param string $tag
@@ -2013,7 +2026,7 @@ class OutputPage extends ContextSource {
}
$age = time() - wfTimestamp( TS_UNIX, $mtime );
- $adaptiveTTL = max( .9 * $age, $minTTL );
+ $adaptiveTTL = max( 0.9 * $age, $minTTL );
$adaptiveTTL = min( $adaptiveTTL, $maxTTL );
$this->lowerCdnMaxage( (int)$adaptiveTTL );
@@ -2923,7 +2936,7 @@ class OutputPage extends ContextSource {
$pieces[] = Html::closeElement( 'head' );
- $bodyClasses = [];
+ $bodyClasses = $this->mAdditionalBodyClasses;
$bodyClasses[] = 'mediawiki';
# Classes for LTR/RTL directionality support
diff --git a/includes/Pingback.php b/includes/Pingback.php
index bd1b2a25b4..c3393bcc1c 100644
--- a/includes/Pingback.php
+++ b/includes/Pingback.php
@@ -228,6 +228,7 @@ class Pingback {
*
* The schema for the data is located at:
*
+ * @return bool
*/
public function sendPingback() {
if ( !$this->acquireLock() ) {
diff --git a/includes/Preferences.php b/includes/Preferences.php
index c64e8a8ae1..0bb1d28af3 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -1,7 +1,5 @@
'tog-shownumberswatching',
];
}
+
+ if ( $config->get( 'StructuredChangeFiltersShowPreference' ) ) {
+ $defaultPreferences['rcenhancedfilters-disable'] = [
+ 'type' => 'toggle',
+ 'section' => 'rc/advancedrc',
+ 'label-message' => 'rcfilters-preference-label',
+ 'help-message' => 'rcfilters-preference-help',
+ ];
+ }
}
/**
@@ -1626,123 +1633,3 @@ class Preferences {
return $timeZoneList;
}
}
-
-/** Some tweaks to allow js prefs to work */
-class PreferencesForm extends HTMLForm {
- // Override default value from HTMLForm
- protected $mSubSectionBeforeFields = false;
-
- private $modifiedUser;
-
- /**
- * @param User $user
- */
- public function setModifiedUser( $user ) {
- $this->modifiedUser = $user;
- }
-
- /**
- * @return User
- */
- public function getModifiedUser() {
- if ( $this->modifiedUser === null ) {
- return $this->getUser();
- } else {
- return $this->modifiedUser;
- }
- }
-
- /**
- * Get extra parameters for the query string when redirecting after
- * successful save.
- *
- * @return array
- */
- public function getExtraSuccessRedirectParameters() {
- return [];
- }
-
- /**
- * @param string $html
- * @return string
- */
- function wrapForm( $html ) {
- $html = Xml::tags( 'div', [ 'id' => 'preferences' ], $html );
-
- return parent::wrapForm( $html );
- }
-
- /**
- * @return string
- */
- function getButtons() {
- $attrs = [ 'id' => 'mw-prefs-restoreprefs' ];
-
- if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
- return '';
- }
-
- $html = parent::getButtons();
-
- if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
- $t = $this->getTitle()->getSubpage( 'reset' );
-
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
- $html .= "\n" . $linkRenderer->makeLink( $t, $this->msg( 'restoreprefs' )->text(),
- Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ) );
-
- $html = Xml::tags( 'div', [ 'class' => 'mw-prefs-buttons' ], $html );
- }
-
- return $html;
- }
-
- /**
- * Separate multi-option preferences into multiple preferences, since we
- * have to store them separately
- * @param array $data
- * @return array
- */
- function filterDataForSubmit( $data ) {
- foreach ( $this->mFlatFields as $fieldname => $field ) {
- if ( $field instanceof HTMLNestedFilterable ) {
- $info = $field->mParams;
- $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
- foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
- $data["$prefix$key"] = $value;
- }
- unset( $data[$fieldname] );
- }
- }
-
- return $data;
- }
-
- /**
- * Get the whole body of the form.
- * @return string
- */
- function getBody() {
- return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
- }
-
- /**
- * Get the "" for a given section key. Normally this is the
- * prefs-$key message but we'll allow extensions to override it.
- * @param string $key
- * @return string
- */
- function getLegend( $key ) {
- $legend = parent::getLegend( $key );
- Hooks::run( 'PreferencesGetLegend', [ $this, $key, &$legend ] );
- return $legend;
- }
-
- /**
- * Get the keys of each top level preference section.
- * @return array of section keys
- */
- function getPreferenceSections() {
- return array_keys( array_filter( $this->mFieldTree, 'is_array' ) );
- }
-}
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index ed09701d4b..7d17cd1065 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -1284,7 +1284,6 @@ class Sanitizer {
$mode = $wgFragmentMode[self::ID_PRIMARY];
$id = self::escapeIdInternal( $id, $mode );
- $id = self::urlEscapeId( $id, $mode );
return $id;
}
@@ -1302,23 +1301,6 @@ class Sanitizer {
global $wgExternalInterwikiFragmentMode;
$id = self::escapeIdInternal( $id, $wgExternalInterwikiFragmentMode );
- $id = self::urlEscapeId( $id, $wgExternalInterwikiFragmentMode );
-
- return $id;
- }
-
- /**
- * Helper for escapeIdFor*() functions. URL-escapes the ID if needed.
- *
- * @param string $id String to escape
- * @param string $mode One of modes from $wgFragmentMode
- * @return string
- */
- private static function urlEscapeId( $id, $mode ) {
- if ( $mode === 'html5' ) {
- $id = urlencode( $id );
- $id = str_replace( '%3A', ':', $id );
- }
return $id;
}
diff --git a/includes/TemplateParser.php b/includes/TemplateParser.php
index 2759ff9baa..2293dabbd9 100644
--- a/includes/TemplateParser.php
+++ b/includes/TemplateParser.php
@@ -38,6 +38,13 @@ class TemplateParser {
*/
protected $forceRecompile = false;
+ /**
+ * @var int Compilation flags passed to LightnCandy
+ */
+ // Do not add more flags here without discussion.
+ // If you do add more flags, be sure to update unit tests as well.
+ protected $compileFlags = LightnCandy::FLAG_ERROR_EXCEPTION;
+
/**
* @param string $templateDir
* @param bool $forceRecompile
@@ -47,6 +54,18 @@ class TemplateParser {
$this->forceRecompile = $forceRecompile;
}
+ /**
+ * Enable/disable the use of recursive partials.
+ * @param bool $enable
+ */
+ public function enableRecursivePartials( $enable ) {
+ if ( $enable ) {
+ $this->compileFlags = $this->compileFlags | LightnCandy::FLAG_RUNTIMEPARTIAL;
+ } else {
+ $this->compileFlags = $this->compileFlags & ~LightnCandy::FLAG_RUNTIMEPARTIAL;
+ }
+ }
+
/**
* Constructs the location of the the source Mustache template
* @param string $templateName The name of the template
@@ -73,11 +92,13 @@ class TemplateParser {
* @throws RuntimeException
*/
protected function getTemplate( $templateName ) {
+ $templateKey = $templateName . '|' . $this->compileFlags;
+
// If a renderer has already been defined for this template, reuse it
- if ( isset( $this->renderers[$templateName] ) &&
- is_callable( $this->renderers[$templateName] )
+ if ( isset( $this->renderers[$templateKey] ) &&
+ is_callable( $this->renderers[$templateKey] )
) {
- return $this->renderers[$templateName];
+ return $this->renderers[$templateKey];
}
$filename = $this->getTemplateFilename( $templateName );
@@ -90,7 +111,7 @@ class TemplateParser {
$fileContents = file_get_contents( $filename );
// Generate a quick hash for cache invalidation
- $fastHash = md5( $fileContents );
+ $fastHash = md5( $this->compileFlags . '|' . $fileContents );
// Fetch a secret key for building a keyed hash of the PHP code
$config = MediaWikiServices::getInstance()->getMainConfig();
@@ -127,7 +148,7 @@ class TemplateParser {
if ( !is_callable( $renderer ) ) {
throw new RuntimeException( "Requested template, {$templateName}, is not callable" );
}
- $this->renderers[$templateName] = $renderer;
+ $this->renderers[$templateKey] = $renderer;
return $renderer;
}
@@ -168,9 +189,7 @@ class TemplateParser {
return LightnCandy::compile(
$code,
[
- // Do not add more flags here without discussion.
- // If you do add more flags, be sure to update unit tests as well.
- 'flags' => LightnCandy::FLAG_ERROR_EXCEPTION,
+ 'flags' => $this->compileFlags,
'basedir' => $this->templateDir,
'fileext' => '.mustache',
]
diff --git a/includes/Title.php b/includes/Title.php
index 8cfeb882a0..3da6ab9552 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -1797,7 +1797,7 @@ class Title implements LinkTarget {
* @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.
+ * @return string A url suitable to use in an HTTP location header.
*/
public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) {
$target = $this;
@@ -1975,6 +1975,8 @@ class Title implements LinkTarget {
* NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
*
* @see self::getLocalURL for the arguments.
+ * @param string $query
+ * @param string|bool $query2
* @return string The URL
* @since 1.18
*/
diff --git a/includes/Xml.php b/includes/Xml.php
index 16a5a9ddec..0091513125 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -493,7 +493,8 @@ class Xml {
}
/**
- * Build a drop-down box from a textual list.
+ * Build a drop-down box from a textual list. This is a wrapper
+ * for Xml::listDropDownOptions() plus the XmlSelect class.
*
* @param string $name Name and id for the drop-down
* @param string $list Correctly formatted text (newline delimited) to be
@@ -507,60 +508,91 @@ class Xml {
public static function listDropDown( $name = '', $list = '', $other = '',
$selected = '', $class = '', $tabindex = null
) {
- $optgroup = false;
+ $options = self::listDropDownOptions( $list, [ 'other' => $other ] );
+
+ $xmlSelect = new XmlSelect( $name, $name, $selected );
+ $xmlSelect->addOptions( $options );
+
+ if ( $class ) {
+ $xmlSelect->setAttribute( 'class', $class );
+ }
+ if ( $tabindex ) {
+ $xmlSelect->setAttribute( 'tabindex', $tabindex );
+ }
- $options = self::option( $other, 'other', $selected === 'other' );
+ return $xmlSelect->getHTML();
+ }
+ /**
+ * Build options for a drop-down box from a textual list.
+ *
+ * The result of this function can be passed to XmlSelect::addOptions()
+ * (to render a plain `` dropdown box) or to Xml::listDropDownOptionsOoui()
+ * and then OOUI\DropdownInputWidget() (to render a pretty one).
+ *
+ * @param string $list Correctly formatted text (newline delimited) to be
+ * used to generate the options.
+ * @param array $params Extra parameters
+ * @param string $params['other'] If set, add an option with this as text and a value of 'other'
+ * @return array Array keys are textual labels, values are internal values
+ */
+ public static function listDropDownOptions( $list, $params = [] ) {
+ $options = [];
+
+ if ( isset( $params['other'] ) ) {
+ $options[ $params['other'] ] = 'other';
+ }
+
+ $optgroup = false;
foreach ( explode( "\n", $list ) as $option ) {
$value = trim( $option );
if ( $value == '' ) {
continue;
} elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
- // A new group is starting ...
+ # A new group is starting...
$value = trim( substr( $value, 1 ) );
- if ( $optgroup ) {
- $options .= self::closeElement( 'optgroup' );
- }
- $options .= self::openElement( 'optgroup', [ 'label' => $value ] );
- $optgroup = true;
+ $optgroup = $value;
} elseif ( substr( $value, 0, 2 ) == '**' ) {
- // groupmember
- $value = trim( substr( $value, 2 ) );
- $options .= self::option( $value, $value, $selected === $value );
- } else {
- // groupless reason list
- if ( $optgroup ) {
- $options .= self::closeElement( 'optgroup' );
+ # groupmember
+ $opt = trim( substr( $value, 2 ) );
+ if ( $optgroup === false ) {
+ $options[$opt] = $opt;
+ } else {
+ $options[$optgroup][$opt] = $opt;
}
- $options .= self::option( $value, $value, $selected === $value );
+ } else {
+ # groupless reason list
$optgroup = false;
+ $options[$option] = $option;
}
}
- if ( $optgroup ) {
- $options .= self::closeElement( 'optgroup' );
- }
-
- $attribs = [];
-
- if ( $name ) {
- $attribs['id'] = $name;
- $attribs['name'] = $name;
- }
+ return $options;
+ }
- if ( $class ) {
- $attribs['class'] = $class;
- }
+ /**
+ * Convert options for a drop-down box into a format accepted by OOUI\DropdownInputWidget etc.
+ *
+ * TODO Find a better home for this function.
+ *
+ * @param array $options Options, as returned e.g. by Xml::listDropDownOptions()
+ * @return array
+ */
+ public static function listDropDownOptionsOoui( $options ) {
+ $optionsOoui = [];
- if ( $tabindex ) {
- $attribs['tabindex'] = $tabindex;
+ foreach ( $options as $text => $value ) {
+ if ( is_array( $value ) ) {
+ $optionsOoui[] = [ 'optgroup' => (string)$text ];
+ foreach ( $value as $text2 => $value2 ) {
+ $optionsOoui[] = [ 'data' => (string)$value2, 'label' => (string)$text2 ];
+ }
+ } else {
+ $optionsOoui[] = [ 'data' => (string)$value, 'label' => (string)$text ];
+ }
}
- return self::openElement( 'select', $attribs )
- . "\n"
- . $options
- . "\n"
- . self::closeElement( 'select' );
+ return $optionsOoui;
}
/**
diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php
index d3ba0aa49c..c5cd89f14b 100644
--- a/includes/actions/InfoAction.php
+++ b/includes/actions/InfoAction.php
@@ -153,6 +153,7 @@ class InfoAction extends FormlessAction {
* Creates a header that can be added to the output.
*
* @param string $header The header text.
+ * @param string $canonicalId
* @return string The HTML.
*/
protected function makeHeader( $header, $canonicalId ) {
diff --git a/includes/actions/MarkpatrolledAction.php b/includes/actions/MarkpatrolledAction.php
index 611e6837f5..66bedb2bdf 100644
--- a/includes/actions/MarkpatrolledAction.php
+++ b/includes/actions/MarkpatrolledAction.php
@@ -85,6 +85,7 @@ class MarkpatrolledAction extends FormAction {
}
/**
+ * @param array $data
* @return bool|array True for success, false for didn't-try, array of errors on failure
*/
public function onSubmit( $data ) {
diff --git a/includes/api/ApiCSPReport.php b/includes/api/ApiCSPReport.php
index a4631d6f34..0df0ca97d1 100644
--- a/includes/api/ApiCSPReport.php
+++ b/includes/api/ApiCSPReport.php
@@ -216,6 +216,7 @@ class ApiCSPReport extends ApiBase {
/**
* Mark as internal. This isn't meant to be used by normal api users
+ * @return bool
*/
public function isInternal() {
return true;
@@ -223,6 +224,7 @@ class ApiCSPReport extends ApiBase {
/**
* Even if you don't have read rights, we still want your report.
+ * @return bool
*/
public function isReadMode() {
return false;
@@ -232,6 +234,7 @@ class ApiCSPReport extends ApiBase {
* Doesn't touch db, so max lag should be rather irrelavent.
*
* Also, this makes sure that reports aren't lost during lag events.
+ * @return bool
*/
public function shouldCheckMaxLag() {
return false;
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index 36247dd981..06eaa19ca4 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -132,6 +132,7 @@ abstract class ApiFormatBase extends ApiBase {
/**
* Overridden to honor $this->forceDefaultParams(), if applicable
+ * @inheritDoc
* @since 1.26
*/
protected function getParameterFromSettings( $paramName, $paramSettings, $parseLimit ) {
diff --git a/includes/api/ApiFormatFeedWrapper.php b/includes/api/ApiFormatFeedWrapper.php
index d2bfd48d33..3ab5ab9e61 100644
--- a/includes/api/ApiFormatFeedWrapper.php
+++ b/includes/api/ApiFormatFeedWrapper.php
@@ -72,6 +72,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
* This class expects the result data to be in a custom format set by self::setResult()
* $result['_feed'] - an instance of one of the $wgFeedClasses classes
* $result['_feeditems'] - an array of FeedItem instances
+ * @param bool $unused
*/
public function initPrinter( $unused = false ) {
parent::initPrinter( $unused );
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index e69300bb3b..1415640fc2 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -1870,7 +1870,7 @@ class ApiMain extends ApiBase {
];
}
- /** @see ApiBase::getExamplesMessages() */
+ /** @inheritDoc */
protected function getExamplesMessages() {
return [
'action=help'
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 987bb99289..44a46b8d16 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -169,7 +169,7 @@ class ApiQuery extends ApiBase {
* as the first, regardless of the values of $db and $groups
* @param string $name Name to assign to the database connection
* @param int $db One of the DB_* constants
- * @param array $groups Query groups
+ * @param string|string[] $groups Query groups
* @return IDatabase
*/
public function getNamedDB( $name, $db, $groups ) {
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index fe16134c7b..6987dfb13f 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -97,9 +97,7 @@ abstract class ApiQueryBase extends ApiBase {
return $this->mQueryModule;
}
- /**
- * @see ApiBase::getParent()
- */
+ /** @inheritDoc */
public function getParent() {
return $this->getQuery();
}
@@ -121,7 +119,7 @@ abstract class ApiQueryBase extends ApiBase {
* See ApiQuery::getNamedDB() for more information
* @param string $name Name to assign to the database connection
* @param int $db One of the DB_* constants
- * @param array $groups Query groups
+ * @param string|string[] $groups Query groups
* @return IDatabase
*/
public function selectNamedDB( $name, $db, $groups ) {
diff --git a/includes/api/ApiQueryGeneratorBase.php b/includes/api/ApiQueryGeneratorBase.php
index f7b94c7c01..5acd75f7ef 100644
--- a/includes/api/ApiQueryGeneratorBase.php
+++ b/includes/api/ApiQueryGeneratorBase.php
@@ -93,12 +93,9 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
}
}
- /**
- * @see ApiBase::getHelpFlags()
- *
- * Corresponding messages: api-help-flag-generator
- */
+ /** @inheritDoc */
protected function getHelpFlags() {
+ // Corresponding messages: api-help-flag-generator
$flags = parent::getHelpFlags();
$flags[] = 'generator';
return $flags;
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index 2ab85240d8..1e3b2c7398 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -34,6 +34,7 @@ use MediaWiki\MediaWikiServices;
*/
class ApiQueryWatchlist extends ApiQueryGeneratorBase {
+ /** @var CommentStore */
private $commentStore;
public function __construct( ApiQuery $query, $moduleName ) {
@@ -260,10 +261,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
private function extractOutputData( WatchedItem $watchedItem, array $recentChangeInfo ) {
/* Determine the title of the page that has been changed. */
- $title = Title::makeTitle(
- $watchedItem->getLinkTarget()->getNamespace(),
- $watchedItem->getLinkTarget()->getDBkey()
- );
+ $title = Title::newFromLinkTarget( $watchedItem->getLinkTarget() );
$user = $this->getUser();
/* Our output data. */
diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php
index d03fca87a0..8a9de064fd 100644
--- a/includes/api/ApiStashEdit.php
+++ b/includes/api/ApiStashEdit.php
@@ -74,6 +74,9 @@ class ApiStashEdit extends ApiBase {
if ( strlen( $params['stashedtexthash'] ) ) {
// Load from cache since the client indicates the text is the same as last stash
$textHash = $params['stashedtexthash'];
+ if ( !preg_match( '/^[0-9a-f]{40}$/', $textHash ) ) {
+ $this->dieWithError( 'apierror-stashedit-missingtext', 'missingtext' );
+ }
$textKey = $cache->makeKey( 'stashedit', 'text', $textHash );
$text = $cache->get( $textKey );
if ( !is_string( $text ) ) {
diff --git a/includes/api/ApiUsageException.php b/includes/api/ApiUsageException.php
index 17655ec1c3..47902a75b0 100644
--- a/includes/api/ApiUsageException.php
+++ b/includes/api/ApiUsageException.php
@@ -152,7 +152,7 @@ class ApiUsageException extends UsageException implements ILocalizedException {
}
/**
- * @returns ApiMessage
+ * @return ApiMessage
*/
private function getApiMessage() {
$errors = $this->status->getErrorsByType( 'error' );
diff --git a/includes/changes/ChangesListFilter.php b/includes/changes/ChangesListFilter.php
index 0b34a5d969..2fc1006ed7 100644
--- a/includes/changes/ChangesListFilter.php
+++ b/includes/changes/ChangesListFilter.php
@@ -309,6 +309,7 @@ abstract class ChangesListFilter {
* structured UI.
*
* This can either be the exact filter, or a new filter that replaces it.
+ * @return bool
*/
public function isFeatureAvailableOnStructuredUi() {
return $this->displaysOnStructuredUi();
diff --git a/includes/collation/IcuCollation.php b/includes/collation/IcuCollation.php
index 54b04eead8..efda596335 100644
--- a/includes/collation/IcuCollation.php
+++ b/includes/collation/IcuCollation.php
@@ -474,6 +474,8 @@ class IcuCollation extends Collation {
}
/**
+ * @param string $index
+ * @return string
* @since 1.16.3
*/
public function getLetterByIndex( $index ) {
@@ -481,6 +483,8 @@ class IcuCollation extends Collation {
}
/**
+ * @param string $index
+ * @return string
* @since 1.16.3
*/
public function getSortKeyByLetterIndex( $index ) {
@@ -488,6 +492,8 @@ class IcuCollation extends Collation {
}
/**
+ * @param string $index
+ * @return string
* @since 1.16.3
*/
public function getFirstLetterCount() {
@@ -496,6 +502,8 @@ class IcuCollation extends Collation {
/**
* Test if a code point is a CJK (Chinese, Japanese, Korean) character
+ * @param int $codepoint
+ * @return bool
* @since 1.16.3
*/
public static function isCjk( $codepoint ) {
diff --git a/includes/compat/normal/UtfNormalUtil.php b/includes/compat/normal/UtfNormalUtil.php
index 8791e4c371..d60c8e33ce 100644
--- a/includes/compat/normal/UtfNormalUtil.php
+++ b/includes/compat/normal/UtfNormalUtil.php
@@ -90,7 +90,7 @@ function utf8ToCodepoint( $char ) {
* Escape a string for inclusion in a PHP single-quoted string literal.
*
* @param string $string string to be escaped.
- * @return String: escaped string.
+ * @return string escaped string.
* @public
* @deprecated since 1.25, use UtfNormal\Utils directly
*/
diff --git a/includes/config/GlobalVarConfig.php b/includes/config/GlobalVarConfig.php
index 589f7d3548..6295371984 100644
--- a/includes/config/GlobalVarConfig.php
+++ b/includes/config/GlobalVarConfig.php
@@ -46,7 +46,7 @@ class GlobalVarConfig implements Config {
}
/**
- * @see Config::get
+ * @inheritDoc
*/
public function get( $name ) {
if ( !$this->has( $name ) ) {
@@ -56,7 +56,7 @@ class GlobalVarConfig implements Config {
}
/**
- * @see Config::has
+ * @inheritDoc
*/
public function has( $name ) {
return $this->hasWithPrefix( $this->prefix, $name );
diff --git a/includes/config/HashConfig.php b/includes/config/HashConfig.php
index 4d6c68ca8b..d020d20fe0 100644
--- a/includes/config/HashConfig.php
+++ b/includes/config/HashConfig.php
@@ -49,7 +49,7 @@ class HashConfig implements Config, MutableConfig {
}
/**
- * @see Config::get
+ * @inheritDoc
*/
public function get( $name ) {
if ( !$this->has( $name ) ) {
@@ -60,7 +60,8 @@ class HashConfig implements Config, MutableConfig {
}
/**
- * @see Config::has
+ * @inheritDoc
+ * @since 1.24
*/
public function has( $name ) {
return array_key_exists( $name, $this->settings );
@@ -68,6 +69,8 @@ class HashConfig implements Config, MutableConfig {
/**
* @see MutableConfig::set
+ * @param string $name
+ * @param mixed $value
*/
public function set( $name, $value ) {
$this->settings[$name] = $value;
diff --git a/includes/config/MultiConfig.php b/includes/config/MultiConfig.php
index cbb65aa609..2bbc84c99a 100644
--- a/includes/config/MultiConfig.php
+++ b/includes/config/MultiConfig.php
@@ -45,7 +45,7 @@ class MultiConfig implements Config {
}
/**
- * @see Config::get
+ * @inheritDoc
*/
public function get( $name ) {
foreach ( $this->configs as $config ) {
@@ -58,7 +58,7 @@ class MultiConfig implements Config {
}
/**
- * @see Config::has
+ * @inheritDoc
*/
public function has( $name ) {
foreach ( $this->configs as $config ) {
diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php
index 1d472e0509..c12d28d9bc 100644
--- a/includes/content/AbstractContent.php
+++ b/includes/content/AbstractContent.php
@@ -55,6 +55,7 @@ abstract class AbstractContent implements Content {
* @since 1.21
*
* @see Content::getModel
+ * @return string
*/
public function getModel() {
return $this->model_id;
@@ -82,6 +83,7 @@ abstract class AbstractContent implements Content {
* @since 1.21
*
* @see Content::getContentHandler
+ * @return ContentHandler
*/
public function getContentHandler() {
return ContentHandler::getForContent( $this );
@@ -91,6 +93,7 @@ abstract class AbstractContent implements Content {
* @since 1.21
*
* @see Content::getDefaultFormat
+ * @return string
*/
public function getDefaultFormat() {
return $this->getContentHandler()->getDefaultFormat();
@@ -100,6 +103,7 @@ abstract class AbstractContent implements Content {
* @since 1.21
*
* @see Content::getSupportedFormats
+ * @return string[]
*/
public function getSupportedFormats() {
return $this->getContentHandler()->getSupportedFormats();
@@ -334,6 +338,7 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param string|int $sectionId
* @return null
*
* @see Content::getSection
@@ -345,6 +350,9 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param string|int|null|bool $sectionId
+ * @param Content $with
+ * @param string $sectionTitle
* @return null
*
* @see Content::replaceSection
@@ -356,6 +364,9 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param Title $title
+ * @param User $user
+ * @param ParserOptions $popts
* @return Content $this
*
* @see Content::preSaveTransform
@@ -367,6 +378,7 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param string $header
* @return Content $this
*
* @see Content::addSectionHeader
@@ -378,6 +390,9 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param Title $title
+ * @param ParserOptions $popts
+ * @param array $params
* @return Content $this
*
* @see Content::preloadTransform
@@ -389,6 +404,10 @@ abstract class AbstractContent implements Content {
/**
* @since 1.21
*
+ * @param WikiPage $page
+ * @param int $flags
+ * @param int $parentRevId
+ * @param User $user
* @return Status
*
* @see Content::prepareSave
@@ -405,7 +424,7 @@ abstract class AbstractContent implements Content {
* @since 1.21
*
* @param WikiPage $page
- * @param ParserOutput $parserOutput
+ * @param ParserOutput|null $parserOutput
*
* @return LinksDeletionUpdate[]
*
diff --git a/includes/debug/logger/monolog/AvroFormatter.php b/includes/debug/logger/monolog/AvroFormatter.php
index 2a50566912..a395e0d092 100644
--- a/includes/debug/logger/monolog/AvroFormatter.php
+++ b/includes/debug/logger/monolog/AvroFormatter.php
@@ -61,7 +61,7 @@ class AvroFormatter implements FormatterInterface {
protected $writer;
/**
- * @var array $schemas Map from Monolog channel to Avro schema.
+ * @param array $schemas Map from Monolog channel to Avro schema.
* Each schema can be either the JSON string or decoded into PHP
* arrays.
*/
@@ -120,7 +120,7 @@ class AvroFormatter implements FormatterInterface {
/**
* Get the writer for the named channel
*
- * @var string $channel Name of the schema to fetch
+ * @param string $channel Name of the schema to fetch
* @return \AvroSchema|null
*/
protected function getSchema( $channel ) {
@@ -147,7 +147,7 @@ class AvroFormatter implements FormatterInterface {
/**
* Get the writer for the named channel
*
- * @var string $channel Name of the schema
+ * @param string $channel Name of the schema
* @return int|null
*/
public function getSchemaRevisionId( $channel ) {
diff --git a/includes/deferred/WANCacheReapUpdate.php b/includes/deferred/WANCacheReapUpdate.php
index cbeb1fc77c..2e5298cc97 100644
--- a/includes/deferred/WANCacheReapUpdate.php
+++ b/includes/deferred/WANCacheReapUpdate.php
@@ -98,7 +98,7 @@ class WANCacheReapUpdate implements DeferrableUpdate {
* @see WANObjectCacheRepear
* @param WANObjectCache $cache
* @param TitleValue $t
- * @returns string[]
+ * @return string[]
*/
public function getEventAffectedKeys( WANObjectCache $cache, TitleValue $t ) {
/** @var WikiPage[]|LocalFile[]|User[] $entities */
diff --git a/includes/externalstore/ExternalStoreHttp.php b/includes/externalstore/ExternalStoreHttp.php
index c1f065122f..8e1e49fa60 100644
--- a/includes/externalstore/ExternalStoreHttp.php
+++ b/includes/externalstore/ExternalStoreHttp.php
@@ -29,6 +29,9 @@
class ExternalStoreHttp extends ExternalStoreMedium {
/**
* @see ExternalStoreMedium::fetchFromURL()
+ * @param string $url
+ * @return string|bool
+ * @throws MWException
*/
public function fetchFromURL( $url ) {
return Http::get( $url, [], __METHOD__ );
@@ -36,6 +39,10 @@ class ExternalStoreHttp extends ExternalStoreMedium {
/**
* @see ExternalStoreMedium::store()
+ * @param string $cluster
+ * @param string $data
+ * @return string|bool
+ * @throws MWException
*/
public function store( $cluster, $data ) {
throw new MWException( "ExternalStoreHttp is read-only and does not support store()." );
diff --git a/includes/externalstore/ExternalStoreMwstore.php b/includes/externalstore/ExternalStoreMwstore.php
index b05843c4c8..5395f56274 100644
--- a/includes/externalstore/ExternalStoreMwstore.php
+++ b/includes/externalstore/ExternalStoreMwstore.php
@@ -35,6 +35,8 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
* The URL returned is of the form of the form mwstore://backend/container/wiki/id
*
* @see ExternalStoreMedium::fetchFromURL()
+ * @param string $url
+ * @return bool
*/
public function fetchFromURL( $url ) {
$be = FileBackendGroup::singleton()->backendFromPath( $url );
@@ -73,6 +75,10 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
/**
* @see ExternalStoreMedium::store()
+ * @param string $backend
+ * @param string $data
+ * @return string|bool
+ * @throws MWException
*/
public function store( $backend, $data ) {
$be = FileBackendGroup::singleton()->get( $backend );
diff --git a/includes/filerepo/FileBackendDBRepoWrapper.php b/includes/filerepo/FileBackendDBRepoWrapper.php
index 0d5a15d2f0..21b7ac2fae 100644
--- a/includes/filerepo/FileBackendDBRepoWrapper.php
+++ b/includes/filerepo/FileBackendDBRepoWrapper.php
@@ -298,6 +298,7 @@ class FileBackendDBRepoWrapper extends FileBackend {
*
* @param string $function
* @param array $params
+ * @return mixed
*/
protected function translateSrcParams( $function, array $params ) {
$latest = !empty( $params['latest'] );
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index 55a19e8327..45a5c8247f 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -257,7 +257,7 @@ class ForeignAPIRepo extends FileRepo {
* @param string $name
* @param int $width
* @param int $height
- * @param array $result Out parameter that will be changed by the function.
+ * @param array &$result
* @param string $otherParams
*
* @return bool
diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php
index 6d003d64bf..8aea7abade 100644
--- a/includes/filerepo/file/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -538,7 +538,8 @@ class LocalFile extends File {
$this->extraDataLoaded = true;
$this->description = CommentStore::newKey( "{$prefix}description" )
- ->getComment( $row )->text;
+ // $row is probably using getFields() from self::getCacheFields()
+ ->getCommentLegacy( wfGetDB( DB_REPLICA ), $row )->text;
$array = $this->decodeRow( $row, $prefix );
diff --git a/includes/filerepo/file/OldLocalFile.php b/includes/filerepo/file/OldLocalFile.php
index b46e1e466f..ee172e1143 100644
--- a/includes/filerepo/file/OldLocalFile.php
+++ b/includes/filerepo/file/OldLocalFile.php
@@ -396,6 +396,7 @@ class OldLocalFile extends LocalFile {
*
* This is the case for a couple files on Wikimedia servers where
* the old version is "lost".
+ * @return bool
*/
public function exists() {
$archiveName = $this->getArchiveName();
diff --git a/includes/htmlform/HTMLFormField.php b/includes/htmlform/HTMLFormField.php
index 3f1c590908..e642c2cdd0 100644
--- a/includes/htmlform/HTMLFormField.php
+++ b/includes/htmlform/HTMLFormField.php
@@ -660,6 +660,8 @@ abstract class HTMLFormField {
/**
* Get a FieldLayout (or subclass thereof) to wrap this field in when using OOUI output.
+ * @param string $inputField
+ * @param array $config
* @return OOUI\FieldLayout|OOUI\ActionFieldLayout
*/
protected function getFieldLayoutOOUI( $inputField, $config ) {
@@ -1074,33 +1076,8 @@ abstract class HTMLFormField {
$this->mOptionsLabelsNotFromMessage = true;
$this->mOptions = self::forceToStringRecursive( $this->mParams['options'] );
} elseif ( array_key_exists( 'options-message', $this->mParams ) ) {
- /** @todo This is copied from Xml::listDropDown(), deprecate/avoid duplication? */
$message = $this->getMessage( $this->mParams['options-message'] )->inContentLanguage()->plain();
-
- $optgroup = false;
- $this->mOptions = [];
- foreach ( explode( "\n", $message ) as $option ) {
- $value = trim( $option );
- if ( $value == '' ) {
- continue;
- } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
- # A new group is starting...
- $value = trim( substr( $value, 1 ) );
- $optgroup = $value;
- } elseif ( substr( $value, 0, 2 ) == '**' ) {
- # groupmember
- $opt = trim( substr( $value, 2 ) );
- if ( $optgroup === false ) {
- $this->mOptions[$opt] = $opt;
- } else {
- $this->mOptions[$optgroup][$opt] = $opt;
- }
- } else {
- # groupless reason list
- $optgroup = false;
- $this->mOptions[$option] = $option;
- }
- }
+ $this->mOptions = Xml::listDropDownOptions( $message );
} else {
$this->mOptions = null;
}
@@ -1120,16 +1097,7 @@ abstract class HTMLFormField {
return null;
}
- $options = [];
-
- foreach ( $oldoptions as $text => $data ) {
- $options[] = [
- 'data' => (string)$data,
- 'label' => (string)$text,
- ];
- }
-
- return $options;
+ return Xml::listDropDownOptionsOoui( $oldoptions );
}
/**
diff --git a/includes/http/Http.php b/includes/http/Http.php
index c10b312f31..6eff6c9cbd 100644
--- a/includes/http/Http.php
+++ b/includes/http/Http.php
@@ -168,6 +168,7 @@ class Http {
/**
* Get a configured MultiHttpClient
* @param array $options
+ * @return MultiHttpClient
*/
public static function createMultiClient( $options = [] ) {
global $wgHTTPConnectTimeout, $wgHTTPTimeout, $wgHTTPProxy;
diff --git a/includes/http/PhpHttpRequest.php b/includes/http/PhpHttpRequest.php
index 3f3803b41c..0c5d162345 100644
--- a/includes/http/PhpHttpRequest.php
+++ b/includes/http/PhpHttpRequest.php
@@ -88,6 +88,8 @@ class PhpHttpRequest extends MWHttpRequest {
* so normal methods of handling errors programmatically
* like get_last_error() don't work.
* @internal
+ * @param int $errno
+ * @param string $errstr
*/
public function errorHandler( $errno, $errstr ) {
$n = count( $this->fopenErrors ) + 1;
diff --git a/includes/installer/InstallerSessionProvider.php b/includes/installer/InstallerSessionProvider.php
index bfb1a69f30..568ef516ef 100644
--- a/includes/installer/InstallerSessionProvider.php
+++ b/includes/installer/InstallerSessionProvider.php
@@ -30,6 +30,8 @@ use MediaWiki\Session\SessionInfo;
class InstallerSessionProvider extends SessionProvider {
/**
* Pretend there is a session, to avoid MWCryptRand overhead
+ * @param WebRequest $request
+ * @return SessionInfo
*/
public function provideSessionInfo( WebRequest $request ) {
return new SessionInfo( 1, [
@@ -40,6 +42,7 @@ class InstallerSessionProvider extends SessionProvider {
/**
* Yes we will treat your data with great care!
+ * @return bool
*/
public function persistsSessionId() {
return true;
@@ -47,6 +50,7 @@ class InstallerSessionProvider extends SessionProvider {
/**
* Sure, you can be whoever you want, as long as you have ID 0
+ * @return bool
*/
public function canChangeUser() {
return true;
diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php
index b4de44dcfb..a2aa8c0f1a 100644
--- a/includes/installer/MssqlUpdater.php
+++ b/includes/installer/MssqlUpdater.php
@@ -125,6 +125,7 @@ class MssqlUpdater extends DatabaseUpdater {
* @param string $updatekey
* @param string $patch
* @param bool $fullpath
+ * @return bool
*/
protected function updateSchema( $table, $updatekey, $patch, $fullpath = false ) {
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
index dc638998e5..c5dd4dcbc9 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -223,6 +223,7 @@ class MysqlInstaller extends DatabaseInstaller {
/**
* @param string $s
+ * @param string $escapeChar
* @return string
*/
protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
@@ -342,6 +343,8 @@ class MysqlInstaller extends DatabaseInstaller {
/**
* Convert a wildcard (as used in LIKE) to a regex
* Slashes are escaped, slash terminators included
+ * @param string $wildcard
+ * @return string
*/
protected function likeToRegex( $wildcard ) {
$r = preg_quote( $wildcard, '/' );
diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php
index e5a5c9445c..07aeb13d1d 100644
--- a/includes/installer/PostgresUpdater.php
+++ b/includes/installer/PostgresUpdater.php
@@ -783,7 +783,8 @@ END;
$info = $this->db->fieldInfo( $table, $field );
if ( $info->defaultValue() !== $default ) {
$this->output( "Changing '$table.$field' default value\n" );
- $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT " . $default );
+ $this->db->query( "ALTER TABLE $table ALTER $field SET DEFAULT "
+ . $this->db->addQuotes( $default ) );
}
}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
index 27300f3530..e0e54c845b 100644
--- a/includes/installer/WebInstaller.php
+++ b/includes/installer/WebInstaller.php
@@ -1005,6 +1005,7 @@ class WebInstaller extends Installer {
*
* @see getRadioSet
*
+ * @param mixed[] $params
* @return array
*/
public function getRadioElements( $params ) {
diff --git a/includes/jobqueue/JobQueueSecondTestQueue.php b/includes/jobqueue/JobQueueSecondTestQueue.php
index a1935dfa0d..4e3409af73 100644
--- a/includes/jobqueue/JobQueueSecondTestQueue.php
+++ b/includes/jobqueue/JobQueueSecondTestQueue.php
@@ -138,6 +138,7 @@ class JobQueueSecondTestQueue extends JobQueue {
/**
* @see JobQueue::ack()
* @param Job $job
+ * @return Job|bool
*/
protected function doAck( Job $job ) {
return $this->mainQueue->doAck( $job );
@@ -172,6 +173,7 @@ class JobQueueSecondTestQueue extends JobQueue {
/**
* @see JobQueue::delete()
+ * @return bool
* @throws MWException
*/
protected function doDelete() {
diff --git a/includes/jobqueue/aggregator/JobQueueAggregator.php b/includes/jobqueue/aggregator/JobQueueAggregator.php
index 7ce2c74fc2..f26beee4bd 100644
--- a/includes/jobqueue/aggregator/JobQueueAggregator.php
+++ b/includes/jobqueue/aggregator/JobQueueAggregator.php
@@ -79,6 +79,9 @@ abstract class JobQueueAggregator {
/**
* @see JobQueueAggregator::notifyQueueEmpty()
+ * @param string $wiki
+ * @param string $type
+ * @return bool
*/
abstract protected function doNotifyQueueEmpty( $wiki, $type );
@@ -97,6 +100,9 @@ abstract class JobQueueAggregator {
/**
* @see JobQueueAggregator::notifyQueueNonEmpty()
+ * @param string $wiki
+ * @param string $type
+ * @return bool
*/
abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
diff --git a/includes/libs/IP.php b/includes/libs/IP.php
index 3bfb531f5e..1c48f49d6b 100644
--- a/includes/libs/IP.php
+++ b/includes/libs/IP.php
@@ -510,7 +510,7 @@ class IP {
* 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
* 2001:0db8:85a3::7344 Single IP
* @param string $range IP range
- * @return array(string, string)
+ * @return array [ string, string ]
*/
public static function parseRange( $range ) {
// CIDR notation
diff --git a/includes/libs/MemoizedCallable.php b/includes/libs/MemoizedCallable.php
index 90c7a644c5..14462f1d9f 100644
--- a/includes/libs/MemoizedCallable.php
+++ b/includes/libs/MemoizedCallable.php
@@ -75,6 +75,7 @@ class MemoizedCallable {
*
* @param string $key
* @param bool &$success
+ * @return bool
*/
protected function fetchResult( $key, &$success ) {
$success = false;
@@ -148,6 +149,7 @@ class MemoizedCallable {
* @param callable $callable
* @param array $args
* @param int $ttl
+ * @return mixed
*/
public static function call( $callable, array $args = [], $ttl = 3600 ) {
$instance = new self( $callable, $ttl );
diff --git a/includes/libs/Xhprof.php b/includes/libs/Xhprof.php
index 016c9b1574..e58d98fcc3 100644
--- a/includes/libs/Xhprof.php
+++ b/includes/libs/Xhprof.php
@@ -37,6 +37,7 @@ class Xhprof {
/**
* Start xhprof profiler
+ * @return bool
*/
public static function isEnabled() {
return self::$enabled;
@@ -44,6 +45,9 @@ class Xhprof {
/**
* Start xhprof profiler
+ * @param int $flags
+ * @param array $options
+ * @throws Exception
*/
public static function enable( $flags = 0, $options = [] ) {
if ( self::isEnabled() ) {
diff --git a/includes/libs/XhprofData.php b/includes/libs/XhprofData.php
index 2383d2adc4..0be4ff6ad8 100644
--- a/includes/libs/XhprofData.php
+++ b/includes/libs/XhprofData.php
@@ -107,6 +107,7 @@ class XhprofData {
* The resulting array is left padded with nulls, so a key
* with no parent (eg 'main()') will return [null, 'function'].
*
+ * @param string $key
* @return array
*/
public static function splitKey( $key ) {
diff --git a/includes/libs/filebackend/FileBackendStore.php b/includes/libs/filebackend/FileBackendStore.php
index 77473d139c..b8eec3f01d 100644
--- a/includes/libs/filebackend/FileBackendStore.php
+++ b/includes/libs/filebackend/FileBackendStore.php
@@ -1714,7 +1714,7 @@ abstract class FileBackendStore extends FileBackend {
return; // invalid storage path
}
$mtime = ConvertibleTimestamp::convert( TS_UNIX, $val['mtime'] );
- $ttl = $this->memCache->adaptiveTTL( $mtime, 7 * 86400, 300, .1 );
+ $ttl = $this->memCache->adaptiveTTL( $mtime, 7 * 86400, 300, 0.1 );
$key = $this->fileCacheKey( $path );
// Set the cache unless it is currently salted.
$this->memCache->set( $key, $val, $ttl );
diff --git a/includes/libs/mime/IEContentAnalyzer.php b/includes/libs/mime/IEContentAnalyzer.php
index dfc7c4b431..e9fb11f7a8 100644
--- a/includes/libs/mime/IEContentAnalyzer.php
+++ b/includes/libs/mime/IEContentAnalyzer.php
@@ -333,7 +333,7 @@ class IEContentAnalyzer {
* @param string $chunk the first 256 bytes of the file
* @param string $proposed the MIME type proposed by the server
*
- * @return Array: map of IE version to detected MIME type
+ * @return array map of IE version to detected MIME type
*/
public function getRealMimesFromData( $fileName, $chunk, $proposed ) {
$types = $this->getMimesFromData( $fileName, $chunk, $proposed );
@@ -371,7 +371,7 @@ class IEContentAnalyzer {
* @param string $chunk the first 256 bytes of the file
* @param string $proposed the MIME type proposed by the server
*
- * @return Array: map of IE version to detected MIME type
+ * @return array map of IE version to detected MIME type
*/
public function getMimesFromData( $fileName, $chunk, $proposed ) {
$types = [];
diff --git a/includes/libs/objectcache/BagOStuff.php b/includes/libs/objectcache/BagOStuff.php
index f834ccf937..8a23db515b 100644
--- a/includes/libs/objectcache/BagOStuff.php
+++ b/includes/libs/objectcache/BagOStuff.php
@@ -476,7 +476,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
$lSince = microtime( true ); // lock timestamp
return new ScopedCallback( function () use ( $key, $lSince, $expiry ) {
- $latency = .050; // latency skew (err towards keeping lock present)
+ $latency = 0.050; // latency skew (err towards keeping lock present)
$age = ( microtime( true ) - $lSince + $latency );
if ( ( $age + $latency ) >= $expiry ) {
$this->logger->warning( "Lock for $key held too long ($age sec)." );
diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php
index 5128d824b2..0188991aa0 100644
--- a/includes/libs/objectcache/MemcachedBagOStuff.php
+++ b/includes/libs/objectcache/MemcachedBagOStuff.php
@@ -45,7 +45,7 @@ class MemcachedBagOStuff extends BagOStuff {
protected function applyDefaultParams( $params ) {
return $params + [
'compress_threshold' => 1500,
- 'connect_timeout' => .5,
+ 'connect_timeout' => 0.5,
'debug' => false
];
}
diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php
index c1c9cc1a8a..1f757a41e9 100644
--- a/includes/libs/objectcache/WANObjectCache.php
+++ b/includes/libs/objectcache/WANObjectCache.php
@@ -1424,7 +1424,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
* @return int Adaptive TTL
* @since 1.28
*/
- public function adaptiveTTL( $mtime, $maxTTL, $minTTL = 30, $factor = .2 ) {
+ public function adaptiveTTL( $mtime, $maxTTL, $minTTL = 30, $factor = 0.2 ) {
if ( is_float( $mtime ) || ctype_digit( $mtime ) ) {
$mtime = (int)$mtime; // handle fractional seconds and string integers
}
diff --git a/includes/libs/rdbms/TransactionProfiler.php b/includes/libs/rdbms/TransactionProfiler.php
index af431a6787..57a12a4463 100644
--- a/includes/libs/rdbms/TransactionProfiler.php
+++ b/includes/libs/rdbms/TransactionProfiler.php
@@ -39,7 +39,7 @@ class TransactionProfiler implements LoggerAwareInterface {
/** @var float Seconds */
protected $dbLockThreshold = 3.0;
/** @var float Seconds */
- protected $eventThreshold = .25;
+ protected $eventThreshold = 0.25;
/** @var bool */
protected $silenced = false;
diff --git a/includes/libs/rdbms/database/Database.php b/includes/libs/rdbms/database/Database.php
index 64fbea37f6..c9040928b0 100644
--- a/includes/libs/rdbms/database/Database.php
+++ b/includes/libs/rdbms/database/Database.php
@@ -54,8 +54,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
const PING_TTL = 1.0;
const PING_QUERY = 'SELECT 1 AS ping';
- const TINY_WRITE_SEC = .010;
- const SLOW_WRITE_SEC = .500;
+ const TINY_WRITE_SEC = 0.010;
+ const SLOW_WRITE_SEC = 0.500;
const SMALL_WRITE_ROWS = 100;
/** @var string SQL query */
@@ -2106,6 +2106,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
/**
* @param string $s
+ * @param string $escapeChar
* @return string
*/
protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
@@ -2416,6 +2417,15 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
* we don't want to select everything into memory
*
* @see IDatabase::insertSelect()
+ * @param string $destTable
+ * @param string|array $srcTable
+ * @param array $varMap
+ * @param array $conds
+ * @param string $fname
+ * @param array $insertOptions
+ * @param array $selectOptions
+ * @param array $selectJoinConds
+ * @return bool
*/
protected function nativeInsertSelect( $destTable, $srcTable, $varMap, $conds,
$fname = __METHOD__,
diff --git a/includes/libs/rdbms/database/DatabaseMssql.php b/includes/libs/rdbms/database/DatabaseMssql.php
index 8f3cab8314..4ebc6233ed 100644
--- a/includes/libs/rdbms/database/DatabaseMssql.php
+++ b/includes/libs/rdbms/database/DatabaseMssql.php
@@ -1110,6 +1110,7 @@ class DatabaseMssql extends Database {
* MS SQL supports more pattern operators than other databases (ex: [,],^)
*
* @param string $s
+ * @param string $escapeChar
* @return string
*/
protected function escapeLikeInternal( $s, $escapeChar = '`' ) {
diff --git a/includes/libs/rdbms/database/DatabasePostgres.php b/includes/libs/rdbms/database/DatabasePostgres.php
index ac59bd6171..672b3458ca 100644
--- a/includes/libs/rdbms/database/DatabasePostgres.php
+++ b/includes/libs/rdbms/database/DatabasePostgres.php
@@ -1158,8 +1158,8 @@ SQL;
}
/**
- * @var string $table
- * @var string $field
+ * @param string $table
+ * @param string $field
* @return PostgresField|null
*/
public function fieldInfo( $table, $field ) {
diff --git a/includes/libs/rdbms/loadmonitor/LoadMonitor.php b/includes/libs/rdbms/loadmonitor/LoadMonitor.php
index fdc5ac8146..8292c0369b 100644
--- a/includes/libs/rdbms/loadmonitor/LoadMonitor.php
+++ b/includes/libs/rdbms/loadmonitor/LoadMonitor.php
@@ -157,7 +157,7 @@ class LoadMonitor implements ILoadMonitor {
$newWeight = $movAveRatio * $coefficient + ( 1 - $movAveRatio ) * $lastWeight;
// Scale from 10% to 100% of nominal weight
- $weightScales[$i] = max( $newWeight, .10 );
+ $weightScales[$i] = max( $newWeight, 0.10 );
if ( !$conn ) {
$lagTimes[$i] = false;
diff --git a/includes/libs/stats/NullStatsdDataFactory.php b/includes/libs/stats/NullStatsdDataFactory.php
index 73697514e5..d346f651f8 100644
--- a/includes/libs/stats/NullStatsdDataFactory.php
+++ b/includes/libs/stats/NullStatsdDataFactory.php
@@ -40,8 +40,8 @@ class NullStatsdDataFactory implements IBufferingStatsdDataFactory {
* and logged in users by sending the current userId of a user
* with each request with a key of "uniques" (or similar).
*
- * @param string|array $key The metric(s) to set.
- * @param float $value The value for the stats.
+ * @param string|array $key The metric(s) to set.
+ * @param float $value The value for the stats.
*
* @return array
*/
diff --git a/includes/libs/virtualrest/ParsoidVirtualRESTService.php b/includes/libs/virtualrest/ParsoidVirtualRESTService.php
index b03a64783f..37a967fff6 100644
--- a/includes/libs/virtualrest/ParsoidVirtualRESTService.php
+++ b/includes/libs/virtualrest/ParsoidVirtualRESTService.php
@@ -146,6 +146,10 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
* Visual Editor "pretends" the V1 API is like. A previous version of
* ParsoidVirtualRESTService translated these to the "real" Parsoid v1
* API. We now translate these to the "real" Parsoid v3 API.
+ * @param array $req
+ * @param Closure $idGeneratorFunc
+ * @return array
+ * @throws Exception
*/
public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
$parts = explode( '/', $req['url'] );
diff --git a/includes/libs/virtualrest/RestbaseVirtualRESTService.php b/includes/libs/virtualrest/RestbaseVirtualRESTService.php
index 90865ffcf1..192b4bd43d 100644
--- a/includes/libs/virtualrest/RestbaseVirtualRESTService.php
+++ b/includes/libs/virtualrest/RestbaseVirtualRESTService.php
@@ -112,6 +112,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
/**
* Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
+ * @param array $reqs
+ * @param Closure $idGeneratorFunc
+ * @return array
+ * @throws Exception
*/
public function onParsoidRequests( array $reqs, Closure $idGeneratorFunc ) {
$result = [];
@@ -145,6 +149,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
* NOTE: the POST APIs aren't "real" Parsoid v1 APIs, they are just what
* Visual Editor "pretends" the V1 API is like. (See
* ParsoidVirtualRESTService.)
+ * @param array $req
+ * @param Closure $idGeneratorFunc
+ * @return array
+ * @throws Exception
*/
public function onParsoid1Request( array $req, Closure $idGeneratorFunc ) {
$parts = explode( '/', $req['url'] );
@@ -233,6 +241,10 @@ class RestbaseVirtualRESTService extends VirtualRESTService {
* * body: array( 'wikitext' => ... ) or array( 'wikitext' => ..., 'body_only' => true/false )
* * $title is optional
* * $revision is optional
+ * @param array $req
+ * @param Closure $idGeneratorFunc
+ * @return array
+ * @throws Exception
*/
public function onParsoid3Request( array $req, Closure $idGeneratorFunc ) {
$parts = explode( '/', $req['url'] );
diff --git a/includes/libs/xmp/XMP.php b/includes/libs/xmp/XMP.php
index e12766a2ad..c46acc691c 100644
--- a/includes/libs/xmp/XMP.php
+++ b/includes/libs/xmp/XMP.php
@@ -131,6 +131,7 @@ class XMPReader implements LoggerAwareInterface {
/**
* Primary job is to initialize the XMLParser
+ * @param LoggerInterface|null $logger
*/
function __construct( LoggerInterface $logger = null ) {
if ( !function_exists( 'xml_parser_create_ns' ) ) {
@@ -189,6 +190,7 @@ class XMPReader implements LoggerAwareInterface {
/**
* Check if this instance supports using this class
+ * @return bool
*/
public static function isSupported() {
return function_exists( 'xml_parser_create_ns' ) && class_exists( 'XMLReader' );
diff --git a/includes/media/WebP.php b/includes/media/WebP.php
index 3e4731ae08..e23989dfa8 100644
--- a/includes/media/WebP.php
+++ b/includes/media/WebP.php
@@ -299,6 +299,8 @@ class WebPHandler extends BitmapHandler {
/**
* Must use "im" for XCF
*
+ * @param string $dstPath
+ * @param bool $checkDstPath
* @return string
*/
protected function getScalerType( $dstPath, $checkDstPath = true ) {
diff --git a/includes/page/Article.php b/includes/page/Article.php
index 5b03a22a2f..b91bd9a88a 100644
--- a/includes/page/Article.php
+++ b/includes/page/Article.php
@@ -1695,24 +1695,11 @@ class Article implements Page {
$outputPage->enableOOUI();
- $options = [];
- $options[] = [
- 'data' => 'other',
- 'label' => $ctx->msg( 'deletereasonotherlist' )->inContentLanguage()->text(),
- ];
- $list = $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->text();
- foreach ( explode( "\n", $list ) as $option ) {
- $value = trim( $option );
- if ( $value == '' ) {
- continue;
- } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
- $options[] = [ 'optgroup' => trim( substr( $value, 1 ) ) ];
- } elseif ( substr( $value, 0, 2 ) == '**' ) {
- $options[] = [ 'data' => trim( substr( $value, 2 ) ) ];
- } else {
- $options[] = [ 'data' => trim( $value ) ];
- }
- }
+ $options = Xml::listDropDownOptions(
+ $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->text(),
+ [ 'other' => $ctx->msg( 'deletereasonotherlist' )->inContentLanguage()->text() ]
+ );
+ $options = Xml::listDropDownOptionsOoui( $options );
$fields[] = new OOUI\FieldLayout(
new OOUI\DropdownInputWidget( [
diff --git a/includes/page/ImageHistoryPseudoPager.php b/includes/page/ImageHistoryPseudoPager.php
index 4785ef1ad4..20bc614b51 100644
--- a/includes/page/ImageHistoryPseudoPager.php
+++ b/includes/page/ImageHistoryPseudoPager.php
@@ -55,8 +55,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
public function __construct( $imagePage ) {
parent::__construct( $imagePage->getContext() );
$this->mImagePage = $imagePage;
- $this->mTitle = clone $imagePage->getTitle();
- $this->mTitle->setFragment( '#filehistory' );
+ $this->mTitle = $imagePage->getTitle()->createFragmentTarget( 'filehistory' );
$this->mImg = null;
$this->mHist = [];
$this->mRange = [ 0, 0 ]; // display range
diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php
index 312edbd25e..6fc36f6858 100644
--- a/includes/page/WikiPage.php
+++ b/includes/page/WikiPage.php
@@ -213,6 +213,7 @@ class WikiPage implements Page, IDBAccessObject {
* @todo Move this UI stuff somewhere else
*
* @see ContentHandler::getActionOverrides
+ * @return array
*/
public function getActionOverrides() {
return $this->getContentHandler()->getActionOverrides();
@@ -2733,6 +2734,7 @@ class WikiPage implements Page, IDBAccessObject {
* @param array|string &$error Array of errors to append to
* @param User $user The deleting user
* @param array $tags Tags to apply to the deletion action
+ * @param string $logsubtype
* @return Status Status object; if successful, $status->value is the log_id of the
* deletion log entry. If the page couldn't be deleted because it wasn't
* found, $status is a non-fatal 'cannotdelete' error
diff --git a/includes/parser/BlockLevelPass.php b/includes/parser/BlockLevelPass.php
index 599fbf61de..fab9ab7fb1 100644
--- a/includes/parser/BlockLevelPass.php
+++ b/includes/parser/BlockLevelPass.php
@@ -257,12 +257,17 @@ class BlockLevelPass {
$output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
}
+ # Close an open if we have a (":") starting on this line
+ if ( $this->DTopen && $commonPrefixLength > 0 && $prefix[$commonPrefixLength - 1] === ':' ) {
+ $output .= $this->nextItem( ':' );
+ }
+
# Open prefixes where appropriate.
if ( $lastPrefix && $prefixLength > $commonPrefixLength ) {
$output .= "\n";
}
while ( $prefixLength > $commonPrefixLength ) {
- $char = substr( $prefix, $commonPrefixLength, 1 );
+ $char = $prefix[$commonPrefixLength];
$output .= $this->openList( $char );
if ( ';' === $char ) {
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 988e2488d8..ff4936d035 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -3231,6 +3231,8 @@ class Parser {
. wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
. '';
$this->addTrackingCategory( 'template-loop-category' );
+ $this->mOutput->addWarning( wfMessage( 'template-loop-warning',
+ wfEscapeWikiText( $titleText ) )->text() );
wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
}
}
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index 2dd4085e94..06319e5575 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -223,7 +223,7 @@ class ParserOutput extends CacheTime {
// finalizeAdaptiveCacheExpiry() uses TTL = MAX( m * PARSE_TIME + b, MIN_AR_TTL)
// Current values imply that m=3933.333333 and b=-333.333333
// See https://www.nngroup.com/articles/website-response-times/
- const PARSE_FAST_SEC = .100; // perceived "fast" page parse
+ const PARSE_FAST_SEC = 0.100; // perceived "fast" page parse
const PARSE_SLOW_SEC = 1.0; // perceived "slow" page parse
const FAST_AR_TTL = 60; // adaptive TTL for "fast" pages
const SLOW_AR_TTL = 3600; // adaptive TTL for "slow" pages
@@ -243,6 +243,7 @@ class ParserOutput extends CacheTime {
* return value is suitable for writing back via setText() but is not valid
* for display to the user.
*
+ * @return string
* @since 1.27
*/
public function getRawText() {
@@ -298,7 +299,10 @@ class ParserOutput extends CacheTime {
$this->mSpeculativeRevId = $id;
}
- /** @since 1.28 */
+ /**
+ * @return int|null
+ * @since 1.28
+ */
public function getSpeculativeRevIdUsed() {
return $this->mSpeculativeRevId;
}
@@ -320,6 +324,7 @@ class ParserOutput extends CacheTime {
}
/**
+ * @return array
* @since 1.25
*/
public function getIndicators() {
@@ -382,7 +387,10 @@ class ParserOutput extends CacheTime {
return $this->mModuleStyles;
}
- /** @since 1.23 */
+ /**
+ * @return array
+ * @since 1.23
+ */
public function getJsConfigVars() {
return $this->mJsConfigVars;
}
@@ -471,6 +479,8 @@ class ParserOutput extends CacheTime {
}
/**
+ * @param string $id
+ * @param string $content
* @since 1.25
*/
public function setIndicator( $id, $content ) {
@@ -836,6 +846,8 @@ class ParserOutput extends CacheTime {
* @code
* $parser->getOutput()->my_ext_foo = '...';
* @endcode
+ * @param string $name
+ * @param mixed $value
*/
public function setProperty( $name, $value ) {
$this->mProperties[$name] = $value;
diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php
index 24474d5795..627d112021 100644
--- a/includes/parser/Preprocessor.php
+++ b/includes/parser/Preprocessor.php
@@ -62,6 +62,7 @@ abstract class Preprocessor {
*
* @param string $text
* @param int $flags
+ * @param string $tree
*/
protected function cacheSetTree( $text, $flags, $tree ) {
$config = RequestContext::getMain()->getConfig();
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index 8e84cb2c82..332f8e9fa7 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -1869,6 +1869,8 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Like splitArg() but for a raw child array. For internal use only.
+ * @param array $children
+ * @return array
*/
public static function splitRawArg( array $children ) {
$bits = [];
@@ -1910,6 +1912,8 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Like splitExt() but for a raw child array. For internal use only.
+ * @param array $children
+ * @return array
*/
public static function splitRawExt( array $children ) {
$bits = [];
@@ -1953,6 +1957,8 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Like splitHeading() but for a raw child array. For internal use only.
+ * @param array $children
+ * @return array
*/
public static function splitRawHeading( array $children ) {
$bits = [];
@@ -1984,6 +1990,8 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Like splitTemplate() but for a raw child array. For internal use only.
+ * @param array $children
+ * @return array
*/
public static function splitRawTemplate( array $children ) {
$parts = [];
diff --git a/includes/rcfeed/IRCColourfulRCFeedFormatter.php b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
index 10ba83fc19..531a3eb203 100644
--- a/includes/rcfeed/IRCColourfulRCFeedFormatter.php
+++ b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
@@ -28,6 +28,10 @@
class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
/**
* @see RCFeedFormatter::getLine
+ * @param array $feed
+ * @param RecentChange $rc
+ * @param string|null $actionComment
+ * @return string|null
*/
public function getLine( array $feed, RecentChange $rc, $actionComment ) {
global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwikis,
diff --git a/includes/rcfeed/MachineReadableRCFeedFormatter.php b/includes/rcfeed/MachineReadableRCFeedFormatter.php
index 20f88bd97c..a90d648eb3 100644
--- a/includes/rcfeed/MachineReadableRCFeedFormatter.php
+++ b/includes/rcfeed/MachineReadableRCFeedFormatter.php
@@ -36,6 +36,10 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
/**
* Generates a notification that can be easily interpreted by a machine.
* @see RCFeedFormatter::getLine
+ * @param array $feed
+ * @param RecentChange $rc
+ * @param string|null $actionComment
+ * @return string|null
*/
public function getLine( array $feed, RecentChange $rc, $actionComment ) {
global $wgCanonicalServer, $wgServerName, $wgScriptPath;
diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php
index f0fcd7da74..3abc9c1d4b 100644
--- a/includes/rcfeed/RedisPubSubFeedEngine.php
+++ b/includes/rcfeed/RedisPubSubFeedEngine.php
@@ -41,6 +41,9 @@ class RedisPubSubFeedEngine extends RCFeedEngine {
/**
* @see FormattedRCFeed::send
+ * @param array $feed
+ * @param string $line
+ * @return bool
*/
public function send( array $feed, $line ) {
$parsed = wfParseUrl( $feed['uri'] );
diff --git a/includes/rcfeed/UDPRCFeedEngine.php b/includes/rcfeed/UDPRCFeedEngine.php
index 61ced5f440..f76d771ef4 100644
--- a/includes/rcfeed/UDPRCFeedEngine.php
+++ b/includes/rcfeed/UDPRCFeedEngine.php
@@ -25,6 +25,9 @@
class UDPRCFeedEngine extends RCFeedEngine {
/**
* @see RCFeedEngine::send
+ * @param array $feed
+ * @param string $line
+ * @return bool
*/
public function send( array $feed, $line ) {
$transport = UDPTransport::newFromString( $feed['uri'] );
diff --git a/includes/resourceloader/ResourceLoaderImageModule.php b/includes/resourceloader/ResourceLoaderImageModule.php
index d26c96181c..cbcf5a0d62 100644
--- a/includes/resourceloader/ResourceLoaderImageModule.php
+++ b/includes/resourceloader/ResourceLoaderImageModule.php
@@ -427,6 +427,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
/**
* Helper method for getDefinitionSummary.
+ * @param ResourceLoaderContext $context
+ * @return array
*/
protected function getFileHashes( ResourceLoaderContext $context ) {
$this->loadFromDefinition();
diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php
index 08641b0c30..236112ea2f 100644
--- a/includes/resourceloader/ResourceLoaderSiteModule.php
+++ b/includes/resourceloader/ResourceLoaderSiteModule.php
@@ -43,6 +43,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
}
/**
+ * @param ResourceLoaderContext|null $context
* @return array
*/
public function getDependencies( ResourceLoaderContext $context = null ) {
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
index d535ffcd3a..8b9feeb8f0 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -297,6 +297,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
}
/**
+ * @param ResourceLoaderContext $context
* @return array
*/
public function getPreloadLinks( ResourceLoaderContext $context ) {
diff --git a/includes/resourceloader/ResourceLoaderUploadDialogModule.php b/includes/resourceloader/ResourceLoaderUploadDialogModule.php
index 9377ed6e26..1a390cf1d6 100644
--- a/includes/resourceloader/ResourceLoaderUploadDialogModule.php
+++ b/includes/resourceloader/ResourceLoaderUploadDialogModule.php
@@ -30,6 +30,7 @@ class ResourceLoaderUploadDialogModule extends ResourceLoaderModule {
protected $targets = [ 'desktop', 'mobile' ];
/**
+ * @param ResourceLoaderContext $context
* @return string JavaScript code
*/
public function getScript( ResourceLoaderContext $context ) {
diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php
index 8f58040a8c..8e213819f6 100644
--- a/includes/resourceloader/ResourceLoaderUserModule.php
+++ b/includes/resourceloader/ResourceLoaderUserModule.php
@@ -78,6 +78,7 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
}
/**
+ * @param ResourceLoaderContext|null $context
* @return array
*/
public function getDependencies( ResourceLoaderContext $context = null ) {
diff --git a/includes/search/ParserOutputSearchDataExtractor.php b/includes/search/ParserOutputSearchDataExtractor.php
index df653f1240..4b60a0c533 100644
--- a/includes/search/ParserOutputSearchDataExtractor.php
+++ b/includes/search/ParserOutputSearchDataExtractor.php
@@ -31,6 +31,7 @@ class ParserOutputSearchDataExtractor {
/**
* Get a list of categories, as an array with title text strings.
*
+ * @param ParserOutput $parserOutput
* @return string[]
*/
public function getCategories( ParserOutput $parserOutput ) {
@@ -46,6 +47,7 @@ class ParserOutputSearchDataExtractor {
/**
* Get a list of external links from ParserOutput, as an array of strings.
*
+ * @param ParserOutput $parserOutput
* @return string[]
*/
public function getExternalLinks( ParserOutput $parserOutput ) {
@@ -56,6 +58,7 @@ class ParserOutputSearchDataExtractor {
* Get a list of outgoing wiki links (including interwiki links), as
* an array of prefixed title strings.
*
+ * @param ParserOutput $parserOutput
* @return string[]
*/
public function getOutgoingLinks( ParserOutput $parserOutput ) {
@@ -74,6 +77,7 @@ class ParserOutputSearchDataExtractor {
/**
* Get a list of templates used in the ParserOutput content, as prefixed title strings
*
+ * @param ParserOutput $parserOutput
* @return string[]
*/
public function getTemplates( ParserOutput $parserOutput ) {
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index 7c2f0f25ca..3c8fe608b4 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -269,7 +269,7 @@ abstract class SearchEngine {
* might support more. The default in all implementations should be 'relevance.'
*
* @since 1.25
- * @return array(string) the valid sort directions for setSort
+ * @return string[] the valid sort directions for setSort
*/
public function getValidSorts() {
return [ 'relevance' ];
diff --git a/includes/search/SearchResultSet.php b/includes/search/SearchResultSet.php
index 89d2299b1b..f25c7283eb 100644
--- a/includes/search/SearchResultSet.php
+++ b/includes/search/SearchResultSet.php
@@ -152,6 +152,7 @@ class SearchResultSet {
/**
* Return a result set of hits on other (multiple) wikis associated with this one
*
+ * @param int $type
* @return SearchResultSet[]
*/
function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
@@ -161,6 +162,7 @@ class SearchResultSet {
/**
* Check if there are results on other wikis
*
+ * @param int $type
* @return bool
*/
function hasInterwikiResults( $type = self::SECONDARY_RESULTS ) {
diff --git a/includes/search/SearchSuggestionSet.php b/includes/search/SearchSuggestionSet.php
index 6d54dada4e..aced5e18af 100644
--- a/includes/search/SearchSuggestionSet.php
+++ b/includes/search/SearchSuggestionSet.php
@@ -106,6 +106,7 @@ class SearchSuggestionSet {
/**
* Move the suggestion at index $key to the first position
+ * @param string $key
*/
public function rescore( $key ) {
$removed = array_splice( $this->suggestions, $key, 1 );
diff --git a/includes/session/BotPasswordSessionProvider.php b/includes/session/BotPasswordSessionProvider.php
index 5831b098fa..a588aeea53 100644
--- a/includes/session/BotPasswordSessionProvider.php
+++ b/includes/session/BotPasswordSessionProvider.php
@@ -167,6 +167,7 @@ class BotPasswordSessionProvider extends ImmutableSessionProviderWithCookie {
/**
* @codeCoverageIgnore
+ * @inheritDoc
*/
public function preventSessionsForUser( $username ) {
BotPassword::removeAllPasswordsForUser( $username );
diff --git a/includes/session/Session.php b/includes/session/Session.php
index 12f16b662e..23d9ab3838 100644
--- a/includes/session/Session.php
+++ b/includes/session/Session.php
@@ -654,6 +654,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
/**
* @note Despite the name, this seems to be intended to implement isset()
* rather than array_key_exists(). So do that.
+ * @inheritDoc
*/
public function offsetExists( $offset ) {
$data = &$this->backend->getData();
@@ -666,6 +667,7 @@ final class Session implements \Countable, \Iterator, \ArrayAccess {
* data to detect such changes.
* @note Accessing a nonexistent key via this mechanism causes that key to
* be created with a null value, and does not raise a PHP warning.
+ * @inheritDoc
*/
public function &offsetGet( $offset ) {
$data = &$this->backend->getData();
diff --git a/includes/site/HashSiteStore.php b/includes/site/HashSiteStore.php
index 2c7965c902..6d98e72530 100644
--- a/includes/site/HashSiteStore.php
+++ b/includes/site/HashSiteStore.php
@@ -113,6 +113,7 @@ class HashSiteStore implements SiteStore {
/**
* Deletes all sites from the database. After calling clear(), getSites() will return an empty
* list and getSite() will return null until saveSite() or saveSites() is called.
+ * @return bool
*/
public function clear() {
$this->sites = [];
diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php
index 180a6df9c4..4fcc8657b0 100644
--- a/includes/skins/SkinTemplate.php
+++ b/includes/skins/SkinTemplate.php
@@ -811,6 +811,9 @@ class SkinTemplate extends Skin {
/**
* @todo is this even used?
+ * @param string $name
+ * @param string $urlaction
+ * @return array
*/
function makeArticleUrlDetails( $name, $urlaction = '' ) {
$title = Title::newFromText( $name );
diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php
index 04d03f5200..0762bf7f8d 100644
--- a/includes/specialpage/ChangesListSpecialPage.php
+++ b/includes/specialpage/ChangesListSpecialPage.php
@@ -573,10 +573,12 @@ abstract class ChangesListSpecialPage extends SpecialPage {
/**
* Include the modules and configuration for the RCFilters app.
* Conditional on the user having the feature enabled.
+ *
+ * If it is disabled, add a class marking that
*/
protected function includeRcFiltersApp() {
+ $out = $this->getOutput();
if ( $this->isStructuredFilterUiEnabled() ) {
- $out = $this->getOutput();
$jsData = $this->getStructuredFilterJsData();
$messages = [];
@@ -584,6 +586,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
$messages[$key] = $this->msg( $key )->plain();
}
+ $out->addBodyClasses( 'mw-rcfilters-enabled' );
+
$out->addHTML(
ResourceLoader::makeInlineScript(
ResourceLoader::makeMessageSetScript( $messages )
@@ -616,6 +620,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
'daysDefault' => $this->getDefaultDays(),
]
);
+ } else {
+ $out->addBodyClasses( 'mw-rcfilters-disabled' );
}
}
@@ -808,6 +814,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
* ChangesListFilterGroup constructors.
*
* There is light processing to simplify core maintenance.
+ * @param array $definition
*/
protected function registerFiltersFromDefinitions( array $definition ) {
$autoFillPriority = -1;
@@ -1550,7 +1557,29 @@ abstract class ChangesListSpecialPage extends SpecialPage {
* @return bool
*/
public function isStructuredFilterUiEnabled() {
- return $this->getUser()->getOption( 'rcenhancedfilters' );
+ if ( $this->getRequest()->getBool( 'rcfilters' ) ) {
+ return true;
+ }
+
+ if ( $this->getConfig()->get( 'StructuredChangeFiltersShowPreference' ) ) {
+ return !$this->getUser()->getOption( 'rcenhancedfilters-disable' );
+ } else {
+ return $this->getUser()->getOption( 'rcenhancedfilters' );
+ }
+ }
+
+ /**
+ * Check whether the structured filter UI is enabled by default (regardless of
+ * this particular user's setting)
+ *
+ * @return bool
+ */
+ public function isStructuredFilterUiEnabledByDefault() {
+ if ( $this->getConfig()->get( 'StructuredChangeFiltersShowPreference' ) ) {
+ return !$this->getUser()->getDefaultOption( 'rcenhancedfilters-disable' );
+ } else {
+ return $this->getUser()->getDefaultOption( 'rcenhancedfilters' );
+ }
}
abstract function getDefaultLimit();
diff --git a/includes/specialpage/RedirectSpecialPage.php b/includes/specialpage/RedirectSpecialPage.php
index d3e22a0f62..8d39c996af 100644
--- a/includes/specialpage/RedirectSpecialPage.php
+++ b/includes/specialpage/RedirectSpecialPage.php
@@ -35,6 +35,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
/**
* @param string|null $subpage
+ * @return Title|bool
*/
public function execute( $subpage ) {
$redirect = $this->getRedirect( $subpage );
diff --git a/includes/specialpage/WantedQueryPage.php b/includes/specialpage/WantedQueryPage.php
index 5318895f04..8b60387efa 100644
--- a/includes/specialpage/WantedQueryPage.php
+++ b/includes/specialpage/WantedQueryPage.php
@@ -102,6 +102,7 @@ abstract class WantedQueryPage extends QueryPage {
* @note This will only be run if the page is cached (ie $wgMiserMode = true)
* unless forceExistenceCheck() is true.
* @since 1.24
+ * @param Title $title
* @return bool
*/
protected function existenceCheck( Title $title ) {
diff --git a/includes/specials/SpecialAllPages.php b/includes/specials/SpecialAllPages.php
index 4d84e316ce..f9c917d35e 100644
--- a/includes/specials/SpecialAllPages.php
+++ b/includes/specials/SpecialAllPages.php
@@ -341,7 +341,7 @@ class SpecialAllPages extends IncludableSpecialPage {
/**
* @param int $ns The namespace of the article
* @param string $text The name of the article
- * @return array( int namespace, string dbkey, string pagename ) or null on error
+ * @return array|null [ int namespace, string dbkey, string pagename ] or null on error
*/
protected function getNamespaceKeyAndText( $ns, $text ) {
if ( $text == '' ) {
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php
index 252dc68c3b..cd3c0289c8 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -484,7 +484,7 @@ class SpecialBlock extends FormSpecialPage {
* @param string $par Subpage parameter passed to setup, or data value from
* the HTMLForm
* @param WebRequest $request Optionally try and get data from a request too
- * @return array( User|string|null, Block::TYPE_ constant|null )
+ * @return array [ User|string|null, Block::TYPE_ constant|null ]
*/
public static function getTargetAndType( $par, WebRequest $request = null ) {
$i = 0;
diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php
index e1ecfe8cd5..d2940e4a02 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -770,38 +770,3 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
);
}
}
-
-/**
- * Extend HTMLForm purely so we can have a more sane way of getting the section headers
- */
-class EditWatchlistNormalHTMLForm extends HTMLForm {
- public function getLegend( $namespace ) {
- $namespace = substr( $namespace, 2 );
-
- return $namespace == NS_MAIN
- ? $this->msg( 'blanknamespace' )->escaped()
- : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
- }
-
- public function getBody() {
- return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
- }
-}
-
-class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
- /**
- * HTMLMultiSelectField throws validation errors if we get input data
- * that doesn't match the data set in the form setup. This causes
- * problems if something gets removed from the watchlist while the
- * form is open (T34126), but we know that invalid items will
- * be harmless so we can override it here.
- *
- * @param string $value The value the field was submitted with
- * @param array $alldata The data collected from the form
- * @return bool|string Bool true on success, or String error to display.
- */
- function validate( $value, $alldata ) {
- // Need to call into grandparent to be a good citizen. :)
- return HTMLFormField::validate( $value, $alldata );
- }
-}
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index beb454d669..9ce52ef013 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -24,8 +24,6 @@
* @ingroup SpecialPage
*/
-use MediaWiki\MediaWikiServices;
-
/**
* MediaWiki page data importer
*
@@ -524,172 +522,3 @@ class SpecialImport extends SpecialPage {
return 'pagetools';
}
}
-
-/**
- * Reporting callback
- * @ingroup SpecialPage
- */
-class ImportReporter extends ContextSource {
- private $reason = false;
- private $logTags = [];
- private $mOriginalLogCallback = null;
- private $mOriginalPageOutCallback = null;
- private $mLogItemCount = 0;
-
- /**
- * @param WikiImporter $importer
- * @param bool $upload
- * @param string $interwiki
- * @param string|bool $reason
- */
- function __construct( $importer, $upload, $interwiki, $reason = false ) {
- $this->mOriginalPageOutCallback =
- $importer->setPageOutCallback( [ $this, 'reportPage' ] );
- $this->mOriginalLogCallback =
- $importer->setLogItemCallback( [ $this, 'reportLogItem' ] );
- $importer->setNoticeCallback( [ $this, 'reportNotice' ] );
- $this->mPageCount = 0;
- $this->mIsUpload = $upload;
- $this->mInterwiki = $interwiki;
- $this->reason = $reason;
- }
-
- /**
- * Sets change tags to apply to the import log entry and null revision.
- *
- * @param array $tags
- * @since 1.29
- */
- public function setChangeTags( array $tags ) {
- $this->logTags = $tags;
- }
-
- function open() {
- $this->getOutput()->addHTML( "\n" );
- }
-
- function reportNotice( $msg, array $params ) {
- $this->getOutput()->addHTML(
- Html::element( 'li', [], $this->msg( $msg, $params )->text() )
- );
- }
-
- function reportLogItem( /* ... */ ) {
- $this->mLogItemCount++;
- if ( is_callable( $this->mOriginalLogCallback ) ) {
- call_user_func_array( $this->mOriginalLogCallback, func_get_args() );
- }
- }
-
- /**
- * @param Title $title
- * @param ForeignTitle $foreignTitle
- * @param int $revisionCount
- * @param int $successCount
- * @param array $pageInfo
- * @return void
- */
- public function reportPage( $title, $foreignTitle, $revisionCount,
- $successCount, $pageInfo ) {
- $args = func_get_args();
- call_user_func_array( $this->mOriginalPageOutCallback, $args );
-
- if ( $title === null ) {
- # Invalid or non-importable title; a notice is already displayed
- return;
- }
-
- $this->mPageCount++;
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
- if ( $successCount > 0 ) {
- // prevents jumbling of the versions count
- // in RTL wikis in case the page title is LTR
- $this->getOutput()->addHTML(
- "" . $linkRenderer->makeLink( $title ) . " " .
- "" .
- $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
- " " .
- " \n"
- );
-
- $logParams = [ '4:number:count' => $successCount ];
- if ( $this->mIsUpload ) {
- $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
- $successCount )->inContentLanguage()->text();
- $action = 'upload';
- } else {
- $pageTitle = $foreignTitle->getFullText();
- $fullInterwikiPrefix = $this->mInterwiki;
- Hooks::run( 'ImportLogInterwikiLink', [ &$fullInterwikiPrefix, &$pageTitle ] );
-
- $interwikiTitleStr = $fullInterwikiPrefix . ':' . $pageTitle;
- $interwiki = '[[:' . $interwikiTitleStr . ']]';
- $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
- $successCount )->params( $interwiki )->inContentLanguage()->text();
- $action = 'interwiki';
- $logParams['5:title-link:interwiki'] = $interwikiTitleStr;
- }
- if ( $this->reason ) {
- $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
- . $this->reason;
- }
-
- $comment = $detail; // quick
- $dbw = wfGetDB( DB_MASTER );
- $latest = $title->getLatestRevID();
- $nullRevision = Revision::newNullRevision(
- $dbw,
- $title->getArticleID(),
- $comment,
- true,
- $this->getUser()
- );
-
- $nullRevId = null;
- if ( !is_null( $nullRevision ) ) {
- $nullRevId = $nullRevision->insertOn( $dbw );
- $page = WikiPage::factory( $title );
- # Update page record
- $page->updateRevisionOn( $dbw, $nullRevision );
- Hooks::run(
- 'NewRevisionFromEditComplete',
- [ $page, $nullRevision, $latest, $this->getUser() ]
- );
- }
-
- // Create the import log entry
- $logEntry = new ManualLogEntry( 'import', $action );
- $logEntry->setTarget( $title );
- $logEntry->setComment( $this->reason );
- $logEntry->setPerformer( $this->getUser() );
- $logEntry->setParameters( $logParams );
- $logid = $logEntry->insert();
- if ( count( $this->logTags ) ) {
- $logEntry->setTags( $this->logTags );
- }
- // Make sure the null revision will be tagged as well
- $logEntry->setAssociatedRevId( $nullRevId );
-
- $logEntry->publish( $logid );
-
- } else {
- $this->getOutput()->addHTML( "" . $linkRenderer->makeKnownLink( $title ) . " " .
- $this->msg( 'import-nonewrevisions' )->escaped() . " \n" );
- }
- }
-
- function close() {
- $out = $this->getOutput();
- if ( $this->mLogItemCount > 0 ) {
- $msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
- $out->addHTML( Xml::tags( 'li', null, $msg ) );
- } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
- $out->addHTML( " \n" );
-
- return Status::newFatal( 'importnopages' );
- }
- $out->addHTML( "\n" );
-
- return Status::newGood( $this->mPageCount );
- }
-}
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index dae60744dc..cda0854d4b 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -266,6 +266,7 @@ class LinkSearchPage extends QueryPage {
*
* @see T130058
* @todo FIXME This special page should not use LIMIT for paging
+ * @return int
*/
protected function getMaxResults() {
return max( parent::getMaxResults(), 60000 );
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index 61590d7567..edfaa7c2f8 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -294,7 +294,7 @@ class SpecialNewpages extends IncludableSpecialPage {
}
/**
- * @param stdClass $row Result row from recent changes
+ * @param stdClass $result Result row from recent changes
* @return Revision|bool
*/
protected function revisionFromRcResult( stdClass $result ) {
diff --git a/includes/specials/SpecialUnlinkAccounts.php b/includes/specials/SpecialUnlinkAccounts.php
index 86bc7ed30f..b159fff1bd 100644
--- a/includes/specials/SpecialUnlinkAccounts.php
+++ b/includes/specials/SpecialUnlinkAccounts.php
@@ -21,6 +21,7 @@ class SpecialUnlinkAccounts extends AuthManagerSpecialPage {
/**
* Under which header this special page is listed in Special:SpecialPages.
+ * @return string
*/
protected function getGroupName() {
return 'users';
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index d0eb8e3742..59f97960bf 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -22,7 +22,6 @@
* @ingroup Upload
*/
-use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
/**
@@ -839,482 +838,10 @@ class SpecialUpload extends SpecialPage {
* This controls js: mw.config.get( 'wgFileCanRotate' )
*
* @todo What about non-BitmapHandler handled files?
+ * @return bool
*/
public static function rotationEnabled() {
$bitmapHandler = new BitmapHandler();
return $bitmapHandler->autoRotateEnabled();
}
}
-
-/**
- * Sub class of HTMLForm that provides the form section of SpecialUpload
- */
-class UploadForm extends HTMLForm {
- protected $mWatch;
- protected $mForReUpload;
- protected $mSessionKey;
- protected $mHideIgnoreWarning;
- protected $mDestWarningAck;
- protected $mDestFile;
-
- protected $mComment;
- protected $mTextTop;
- protected $mTextAfterSummary;
-
- protected $mSourceIds;
-
- protected $mMaxFileSize = [];
-
- protected $mMaxUploadSize = [];
-
- public function __construct( array $options = [], IContextSource $context = null,
- LinkRenderer $linkRenderer = null
- ) {
- if ( $context instanceof IContextSource ) {
- $this->setContext( $context );
- }
-
- if ( !$linkRenderer ) {
- $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
- }
-
- $this->mWatch = !empty( $options['watch'] );
- $this->mForReUpload = !empty( $options['forreupload'] );
- $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
- $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
- $this->mDestWarningAck = !empty( $options['destwarningack'] );
- $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
-
- $this->mComment = isset( $options['description'] ) ?
- $options['description'] : '';
-
- $this->mTextTop = isset( $options['texttop'] )
- ? $options['texttop'] : '';
-
- $this->mTextAfterSummary = isset( $options['textaftersummary'] )
- ? $options['textaftersummary'] : '';
-
- $sourceDescriptor = $this->getSourceSection();
- $descriptor = $sourceDescriptor
- + $this->getDescriptionSection()
- + $this->getOptionsSection();
-
- Hooks::run( 'UploadFormInitDescriptor', [ &$descriptor ] );
- parent::__construct( $descriptor, $context, 'upload' );
-
- # Add a link to edit MediaWiki:Licenses
- if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
- $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
- $licensesLink = $linkRenderer->makeKnownLink(
- $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
- $this->msg( 'licenses-edit' )->text(),
- [],
- [ 'action' => 'edit' ]
- );
- $editLicenses = '' . $licensesLink . '
';
- $this->addFooterText( $editLicenses, 'description' );
- }
-
- # Set some form properties
- $this->setSubmitText( $this->msg( 'uploadbtn' )->text() );
- $this->setSubmitName( 'wpUpload' );
- # Used message keys: 'accesskey-upload', 'tooltip-upload'
- $this->setSubmitTooltip( 'upload' );
- $this->setId( 'mw-upload-form' );
-
- # Build a list of IDs for javascript insertion
- $this->mSourceIds = [];
- foreach ( $sourceDescriptor as $field ) {
- if ( !empty( $field['id'] ) ) {
- $this->mSourceIds[] = $field['id'];
- }
- }
- }
-
- /**
- * Get the descriptor of the fieldset that contains the file source
- * selection. The section is 'source'
- *
- * @return array Descriptor array
- */
- protected function getSourceSection() {
- if ( $this->mSessionKey ) {
- return [
- 'SessionKey' => [
- 'type' => 'hidden',
- 'default' => $this->mSessionKey,
- ],
- 'SourceType' => [
- 'type' => 'hidden',
- 'default' => 'Stash',
- ],
- ];
- }
-
- $canUploadByUrl = UploadFromUrl::isEnabled()
- && ( UploadFromUrl::isAllowed( $this->getUser() ) === true )
- && $this->getConfig()->get( 'CopyUploadsFromSpecialUpload' );
- $radio = $canUploadByUrl;
- $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
-
- $descriptor = [];
- if ( $this->mTextTop ) {
- $descriptor['UploadFormTextTop'] = [
- 'type' => 'info',
- 'section' => 'source',
- 'default' => $this->mTextTop,
- 'raw' => true,
- ];
- }
-
- $this->mMaxUploadSize['file'] = min(
- UploadBase::getMaxUploadSize( 'file' ),
- UploadBase::getMaxPhpUploadSize()
- );
-
- $help = $this->msg( 'upload-maxfilesize',
- $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
- )->parse();
-
- // If the user can also upload by URL, there are 2 different file size limits.
- // This extra message helps stress which limit corresponds to what.
- if ( $canUploadByUrl ) {
- $help .= $this->msg( 'word-separator' )->escaped();
- $help .= $this->msg( 'upload_source_file' )->parse();
- }
-
- $descriptor['UploadFile'] = [
- 'class' => 'UploadSourceField',
- 'section' => 'source',
- 'type' => 'file',
- 'id' => 'wpUploadFile',
- 'radio-id' => 'wpSourceTypeFile',
- 'label-message' => 'sourcefilename',
- 'upload-type' => 'File',
- 'radio' => &$radio,
- 'help' => $help,
- 'checked' => $selectedSourceType == 'file',
- ];
-
- if ( $canUploadByUrl ) {
- $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
- $descriptor['UploadFileURL'] = [
- 'class' => 'UploadSourceField',
- 'section' => 'source',
- 'id' => 'wpUploadFileURL',
- 'radio-id' => 'wpSourceTypeurl',
- 'label-message' => 'sourceurl',
- 'upload-type' => 'url',
- 'radio' => &$radio,
- 'help' => $this->msg( 'upload-maxfilesize',
- $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
- )->parse() .
- $this->msg( 'word-separator' )->escaped() .
- $this->msg( 'upload_source_url' )->parse(),
- 'checked' => $selectedSourceType == 'url',
- ];
- }
- Hooks::run( 'UploadFormSourceDescriptors', [ &$descriptor, &$radio, $selectedSourceType ] );
-
- $descriptor['Extensions'] = [
- 'type' => 'info',
- 'section' => 'source',
- 'default' => $this->getExtensionsMessage(),
- 'raw' => true,
- ];
-
- return $descriptor;
- }
-
- /**
- * Get the messages indicating which extensions are preferred and prohibitted.
- *
- * @return string HTML string containing the message
- */
- protected function getExtensionsMessage() {
- # Print a list of allowed file extensions, if so configured. We ignore
- # MIME type here, it's incomprehensible to most people and too long.
- $config = $this->getConfig();
-
- if ( $config->get( 'CheckFileExtensions' ) ) {
- $fileExtensions = array_unique( $config->get( 'FileExtensions' ) );
- if ( $config->get( 'StrictFileExtensions' ) ) {
- # Everything not permitted is banned
- $extensionsList =
- '' .
- $this->msg( 'upload-permitted' )
- ->params( $this->getLanguage()->commaList( $fileExtensions ) )
- ->numParams( count( $fileExtensions ) )
- ->parseAsBlock() .
- "
\n";
- } else {
- # We have to list both preferred and prohibited
- $fileBlacklist = array_unique( $config->get( 'FileBlacklist' ) );
- $extensionsList =
- '' .
- $this->msg( 'upload-preferred' )
- ->params( $this->getLanguage()->commaList( $fileExtensions ) )
- ->numParams( count( $fileExtensions ) )
- ->parseAsBlock() .
- "
\n" .
- '' .
- $this->msg( 'upload-prohibited' )
- ->params( $this->getLanguage()->commaList( $fileBlacklist ) )
- ->numParams( count( $fileBlacklist ) )
- ->parseAsBlock() .
- "
\n";
- }
- } else {
- # Everything is permitted.
- $extensionsList = '';
- }
-
- return $extensionsList;
- }
-
- /**
- * Get the descriptor of the fieldset that contains the file description
- * input. The section is 'description'
- *
- * @return array Descriptor array
- */
- protected function getDescriptionSection() {
- $config = $this->getConfig();
- if ( $this->mSessionKey ) {
- $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
- try {
- $file = $stash->getFile( $this->mSessionKey );
- } catch ( Exception $e ) {
- $file = null;
- }
- if ( $file ) {
- global $wgContLang;
-
- $mto = $file->transform( [ 'width' => 120 ] );
- if ( $mto ) {
- $this->addHeaderText(
- '' .
- Html::element( 'img', [
- 'src' => $mto->getUrl(),
- 'class' => 'thumbimage',
- ] ) . '
', 'description' );
- }
- }
- }
-
- $descriptor = [
- 'DestFile' => [
- 'type' => 'text',
- 'section' => 'description',
- 'id' => 'wpDestFile',
- 'label-message' => 'destfilename',
- 'size' => 60,
- 'default' => $this->mDestFile,
- # @todo FIXME: Hack to work around poor handling of the 'default' option in HTMLForm
- 'nodata' => strval( $this->mDestFile ) !== '',
- ],
- 'UploadDescription' => [
- 'type' => 'textarea',
- 'section' => 'description',
- 'id' => 'wpUploadDescription',
- 'label-message' => $this->mForReUpload
- ? 'filereuploadsummary'
- : 'fileuploadsummary',
- 'default' => $this->mComment,
- 'cols' => 80,
- 'rows' => 8,
- ]
- ];
- if ( $this->mTextAfterSummary ) {
- $descriptor['UploadFormTextAfterSummary'] = [
- 'type' => 'info',
- 'section' => 'description',
- 'default' => $this->mTextAfterSummary,
- 'raw' => true,
- ];
- }
-
- $descriptor += [
- 'EditTools' => [
- 'type' => 'edittools',
- 'section' => 'description',
- 'message' => 'edittools-upload',
- ]
- ];
-
- if ( $this->mForReUpload ) {
- $descriptor['DestFile']['readonly'] = true;
- } else {
- $descriptor['License'] = [
- 'type' => 'select',
- 'class' => 'Licenses',
- 'section' => 'description',
- 'id' => 'wpLicense',
- 'label-message' => 'license',
- ];
- }
-
- if ( $config->get( 'UseCopyrightUpload' ) ) {
- $descriptor['UploadCopyStatus'] = [
- 'type' => 'text',
- 'section' => 'description',
- 'id' => 'wpUploadCopyStatus',
- 'label-message' => 'filestatus',
- ];
- $descriptor['UploadSource'] = [
- 'type' => 'text',
- 'section' => 'description',
- 'id' => 'wpUploadSource',
- 'label-message' => 'filesource',
- ];
- }
-
- return $descriptor;
- }
-
- /**
- * Get the descriptor of the fieldset that contains the upload options,
- * such as "watch this file". The section is 'options'
- *
- * @return array Descriptor array
- */
- protected function getOptionsSection() {
- $user = $this->getUser();
- if ( $user->isLoggedIn() ) {
- $descriptor = [
- 'Watchthis' => [
- 'type' => 'check',
- 'id' => 'wpWatchthis',
- 'label-message' => 'watchthisupload',
- 'section' => 'options',
- 'default' => $this->mWatch,
- ]
- ];
- }
- if ( !$this->mHideIgnoreWarning ) {
- $descriptor['IgnoreWarning'] = [
- 'type' => 'check',
- 'id' => 'wpIgnoreWarning',
- 'label-message' => 'ignorewarnings',
- 'section' => 'options',
- ];
- }
-
- $descriptor['DestFileWarningAck'] = [
- 'type' => 'hidden',
- 'id' => 'wpDestFileWarningAck',
- 'default' => $this->mDestWarningAck ? '1' : '',
- ];
-
- if ( $this->mForReUpload ) {
- $descriptor['ForReUpload'] = [
- 'type' => 'hidden',
- 'id' => 'wpForReUpload',
- 'default' => '1',
- ];
- }
-
- return $descriptor;
- }
-
- /**
- * Add the upload JS and show the form.
- */
- public function show() {
- $this->addUploadJS();
- parent::show();
- }
-
- /**
- * Add upload JS to the OutputPage
- */
- protected function addUploadJS() {
- $config = $this->getConfig();
-
- $useAjaxDestCheck = $config->get( 'UseAjax' ) && $config->get( 'AjaxUploadDestCheck' );
- $useAjaxLicensePreview = $config->get( 'UseAjax' ) &&
- $config->get( 'AjaxLicensePreview' ) && $config->get( 'EnableAPI' );
- $this->mMaxUploadSize['*'] = UploadBase::getMaxUploadSize();
-
- $scriptVars = [
- 'wgAjaxUploadDestCheck' => $useAjaxDestCheck,
- 'wgAjaxLicensePreview' => $useAjaxLicensePreview,
- 'wgUploadAutoFill' => !$this->mForReUpload &&
- // If we received mDestFile from the request, don't autofill
- // the wpDestFile textbox
- $this->mDestFile === '',
- 'wgUploadSourceIds' => $this->mSourceIds,
- 'wgCheckFileExtensions' => $config->get( 'CheckFileExtensions' ),
- 'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
- 'wgFileExtensions' => array_values( array_unique( $config->get( 'FileExtensions' ) ) ),
- 'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
- 'wgMaxUploadSize' => $this->mMaxUploadSize,
- 'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
- ];
-
- $out = $this->getOutput();
- $out->addJsConfigVars( $scriptVars );
-
- $out->addModules( [
- 'mediawiki.special.upload', // Extras for thumbnail and license preview.
- ] );
- }
-
- /**
- * Empty function; submission is handled elsewhere.
- *
- * @return bool False
- */
- function trySubmit() {
- return false;
- }
-}
-
-/**
- * A form field that contains a radio box in the label
- */
-class UploadSourceField extends HTMLTextField {
-
- /**
- * @param array $cellAttributes
- * @return string
- */
- function getLabelHtml( $cellAttributes = [] ) {
- $id = $this->mParams['id'];
- $label = Html::rawElement( 'label', [ 'for' => $id ], $this->mLabel );
-
- if ( !empty( $this->mParams['radio'] ) ) {
- if ( isset( $this->mParams['radio-id'] ) ) {
- $radioId = $this->mParams['radio-id'];
- } else {
- // Old way. For the benefit of extensions that do not define
- // the 'radio-id' key.
- $radioId = 'wpSourceType' . $this->mParams['upload-type'];
- }
-
- $attribs = [
- 'name' => 'wpSourceType',
- 'type' => 'radio',
- 'id' => $radioId,
- 'value' => $this->mParams['upload-type'],
- ];
-
- if ( !empty( $this->mParams['checked'] ) ) {
- $attribs['checked'] = 'checked';
- }
-
- $label .= Html::element( 'input', $attribs );
- }
-
- return Html::rawElement( 'td', [ 'class' => 'mw-label' ] + $cellAttributes, $label );
- }
-
- /**
- * @return int
- */
- function getSize() {
- return isset( $this->mParams['size'] )
- ? $this->mParams['size']
- : 60;
- }
-}
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index 3ea1d03aeb..f176b40755 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -203,6 +203,7 @@ class SpecialVersion extends SpecialPage {
'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', 'Brad Jorsch',
+ 'Bartosz DziewoÅski', 'Ed Sanders', 'Moriel Schottlender',
$othersLink, $translatorsLink
];
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index 6d481f8fdc..2ebbc2d86c 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -74,6 +74,7 @@ class WantedFilesPage extends WantedQueryPage {
* In its own function to allow subclasses to override.
* @see SpecialWantedFilesGUOverride in GlobalUsage extension.
* @since 1.24
+ * @return bool
*/
protected function likelyToHaveFalsePositives() {
return RepoGroup::singleton()->hasForeignRepos();
@@ -99,6 +100,7 @@ class WantedFilesPage extends WantedQueryPage {
* Use wfFindFile so we still think file namespace pages without
* files are missing, but valid file redirects and foreign files are ok.
*
+ * @param Title $title
* @return bool
*/
protected function existenceCheck( Title $title ) {
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index 7049744224..ec648690f4 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -112,9 +112,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
}
public function isStructuredFilterUiEnabled() {
- return parent::isStructuredFilterUiEnabled()
- && ( $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' )
- || $this->getRequest()->getBool( 'rcfilters' ) );
+ return $this->getRequest()->getBool( 'rcfilters' ) || (
+ $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' ) &&
+ $this->getUser()->getOption( 'rcenhancedfilters' )
+ );
+ }
+
+ public function isStructuredFilterUiEnabledByDefault() {
+ return $this->getConfig()->get( 'StructuredChangeFiltersOnWatchlist' ) &&
+ $this->getUser()->getDefaultOption( 'rcenhancedfilters' );
}
/**
diff --git a/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php b/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php
new file mode 100644
index 0000000000..cb93bb2cee
--- /dev/null
+++ b/includes/specials/formfields/EditWatchlistCheckboxSeriesField.php
@@ -0,0 +1,37 @@
+
+ * @copyright Copyright © 2005, Ãvar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+/**
+ * A License class for use on Special:Upload
+ */
+class Licenses extends HTMLFormField {
+ /** @var string */
+ protected $msg;
+
+ /** @var array */
+ protected $licenses = [];
+
+ /** @var string */
+ protected $html;
+ /**#@-*/
+
+ /**
+ * @param array $params
+ */
+ public function __construct( $params ) {
+ parent::__construct( $params );
+
+ $this->msg = empty( $params['licenses'] )
+ ? wfMessage( 'licenses' )->inContentLanguage()->plain()
+ : $params['licenses'];
+ $this->selected = null;
+
+ $this->makeLicenses();
+ }
+
+ /**
+ * @private
+ */
+ protected function makeLicenses() {
+ $levels = [];
+ $lines = explode( "\n", $this->msg );
+
+ foreach ( $lines as $line ) {
+ if ( strpos( $line, '*' ) !== 0 ) {
+ continue;
+ } else {
+ list( $level, $line ) = $this->trimStars( $line );
+
+ if ( strpos( $line, '|' ) !== false ) {
+ $obj = new License( $line );
+ $this->stackItem( $this->licenses, $levels, $obj );
+ } else {
+ if ( $level < count( $levels ) ) {
+ $levels = array_slice( $levels, 0, $level );
+ }
+ if ( $level == count( $levels ) ) {
+ $levels[$level - 1] = $line;
+ } elseif ( $level > count( $levels ) ) {
+ $levels[] = $line;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param string $str
+ * @return array
+ */
+ protected function trimStars( $str ) {
+ $numStars = strspn( $str, '*' );
+ return [ $numStars, ltrim( substr( $str, $numStars ), ' ' ) ];
+ }
+
+ /**
+ * @param array &$list
+ * @param array $path
+ * @param mixed $item
+ */
+ protected function stackItem( &$list, $path, $item ) {
+ $position =& $list;
+ if ( $path ) {
+ foreach ( $path as $key ) {
+ $position =& $position[$key];
+ }
+ }
+ $position[] = $item;
+ }
+
+ /**
+ * @param array $tagset
+ * @param int $depth
+ */
+ protected function makeHtml( $tagset, $depth = 0 ) {
+ foreach ( $tagset as $key => $val ) {
+ if ( is_array( $val ) ) {
+ $this->html .= $this->outputOption(
+ $key, '',
+ [
+ 'disabled' => 'disabled',
+ 'style' => 'color: GrayText', // for MSIE
+ ],
+ $depth
+ );
+ $this->makeHtml( $val, $depth + 1 );
+ } else {
+ $this->html .= $this->outputOption(
+ $val->text, $val->template,
+ [ 'title' => '{{' . $val->template . '}}' ],
+ $depth
+ );
+ }
+ }
+ }
+
+ /**
+ * @param string $message
+ * @param string $value
+ * @param null|array $attribs
+ * @param int $depth
+ * @return string
+ */
+ protected function outputOption( $message, $value, $attribs = null, $depth = 0 ) {
+ $msgObj = $this->msg( $message );
+ $text = $msgObj->exists() ? $msgObj->text() : $message;
+ $attribs['value'] = $value;
+ if ( $value === $this->selected ) {
+ $attribs['selected'] = 'selected';
+ }
+
+ $val = str_repeat( /*   */ "\xc2\xa0", $depth * 2 ) . $text;
+ return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
+ }
+
+ /**#@-*/
+
+ /**
+ * Accessor for $this->licenses
+ *
+ * @return array
+ */
+ public function getLicenses() {
+ return $this->licenses;
+ }
+
+ /**
+ * Accessor for $this->html
+ *
+ * @param bool $value
+ *
+ * @return string
+ */
+ public function getInputHTML( $value ) {
+ $this->selected = $value;
+
+ $this->html = $this->outputOption( wfMessage( 'nolicense' )->text(), '',
+ (bool)$this->selected ? null : [ 'selected' => 'selected' ] );
+ $this->makeHtml( $this->getLicenses() );
+
+ $attribs = [
+ 'name' => $this->mName,
+ 'id' => $this->mID
+ ];
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $attibs['disabled'] = 'disabled';
+ }
+
+ return Html::rawElement( 'select', $attribs, $this->html );
+ }
+}
diff --git a/includes/specials/formfields/UploadSourceField.php b/includes/specials/formfields/UploadSourceField.php
new file mode 100644
index 0000000000..251a28667a
--- /dev/null
+++ b/includes/specials/formfields/UploadSourceField.php
@@ -0,0 +1,68 @@
+mParams['id'];
+ $label = Html::rawElement( 'label', [ 'for' => $id ], $this->mLabel );
+
+ if ( !empty( $this->mParams['radio'] ) ) {
+ if ( isset( $this->mParams['radio-id'] ) ) {
+ $radioId = $this->mParams['radio-id'];
+ } else {
+ // Old way. For the benefit of extensions that do not define
+ // the 'radio-id' key.
+ $radioId = 'wpSourceType' . $this->mParams['upload-type'];
+ }
+
+ $attribs = [
+ 'name' => 'wpSourceType',
+ 'type' => 'radio',
+ 'id' => $radioId,
+ 'value' => $this->mParams['upload-type'],
+ ];
+
+ if ( !empty( $this->mParams['checked'] ) ) {
+ $attribs['checked'] = 'checked';
+ }
+
+ $label .= Html::element( 'input', $attribs );
+ }
+
+ return Html::rawElement( 'td', [ 'class' => 'mw-label' ] + $cellAttributes, $label );
+ }
+
+ /**
+ * @return int
+ */
+ function getSize() {
+ return isset( $this->mParams['size'] )
+ ? $this->mParams['size']
+ : 60;
+ }
+}
diff --git a/includes/specials/forms/EditWatchlistNormalHTMLForm.php b/includes/specials/forms/EditWatchlistNormalHTMLForm.php
new file mode 100644
index 0000000000..723093a772
--- /dev/null
+++ b/includes/specials/forms/EditWatchlistNormalHTMLForm.php
@@ -0,0 +1,36 @@
+msg( 'blanknamespace' )->escaped()
+ : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
+ }
+
+ public function getBody() {
+ return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
+ }
+}
diff --git a/includes/specials/forms/PreferencesForm.php b/includes/specials/forms/PreferencesForm.php
new file mode 100644
index 0000000000..d4e5ef4fdd
--- /dev/null
+++ b/includes/specials/forms/PreferencesForm.php
@@ -0,0 +1,143 @@
+modifiedUser = $user;
+ }
+
+ /**
+ * @return User
+ */
+ public function getModifiedUser() {
+ if ( $this->modifiedUser === null ) {
+ return $this->getUser();
+ } else {
+ return $this->modifiedUser;
+ }
+ }
+
+ /**
+ * Get extra parameters for the query string when redirecting after
+ * successful save.
+ *
+ * @return array
+ */
+ public function getExtraSuccessRedirectParameters() {
+ return [];
+ }
+
+ /**
+ * @param string $html
+ * @return string
+ */
+ function wrapForm( $html ) {
+ $html = Xml::tags( 'div', [ 'id' => 'preferences' ], $html );
+
+ return parent::wrapForm( $html );
+ }
+
+ /**
+ * @return string
+ */
+ function getButtons() {
+ $attrs = [ 'id' => 'mw-prefs-restoreprefs' ];
+
+ if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+ return '';
+ }
+
+ $html = parent::getButtons();
+
+ if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+ $t = $this->getTitle()->getSubpage( 'reset' );
+
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ $html .= "\n" . $linkRenderer->makeLink( $t, $this->msg( 'restoreprefs' )->text(),
+ Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ) );
+
+ $html = Xml::tags( 'div', [ 'class' => 'mw-prefs-buttons' ], $html );
+ }
+
+ return $html;
+ }
+
+ /**
+ * Separate multi-option preferences into multiple preferences, since we
+ * have to store them separately
+ * @param array $data
+ * @return array
+ */
+ function filterDataForSubmit( $data ) {
+ foreach ( $this->mFlatFields as $fieldname => $field ) {
+ if ( $field instanceof HTMLNestedFilterable ) {
+ $info = $field->mParams;
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+ foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+ $data["$prefix$key"] = $value;
+ }
+ unset( $data[$fieldname] );
+ }
+ }
+
+ return $data;
+ }
+
+ /**
+ * Get the whole body of the form.
+ * @return string
+ */
+ function getBody() {
+ return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
+ }
+
+ /**
+ * Get the "" for a given section key. Normally this is the
+ * prefs-$key message but we'll allow extensions to override it.
+ * @param string $key
+ * @return string
+ */
+ function getLegend( $key ) {
+ $legend = parent::getLegend( $key );
+ Hooks::run( 'PreferencesGetLegend', [ $this, $key, &$legend ] );
+ return $legend;
+ }
+
+ /**
+ * Get the keys of each top level preference section.
+ * @return array of section keys
+ */
+ function getPreferenceSections() {
+ return array_keys( array_filter( $this->mFieldTree, 'is_array' ) );
+ }
+}
diff --git a/includes/specials/forms/UploadForm.php b/includes/specials/forms/UploadForm.php
new file mode 100644
index 0000000000..44d91a8a26
--- /dev/null
+++ b/includes/specials/forms/UploadForm.php
@@ -0,0 +1,446 @@
+setContext( $context );
+ }
+
+ if ( !$linkRenderer ) {
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ }
+
+ $this->mWatch = !empty( $options['watch'] );
+ $this->mForReUpload = !empty( $options['forreupload'] );
+ $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
+ $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
+ $this->mDestWarningAck = !empty( $options['destwarningack'] );
+ $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
+
+ $this->mComment = isset( $options['description'] ) ?
+ $options['description'] : '';
+
+ $this->mTextTop = isset( $options['texttop'] )
+ ? $options['texttop'] : '';
+
+ $this->mTextAfterSummary = isset( $options['textaftersummary'] )
+ ? $options['textaftersummary'] : '';
+
+ $sourceDescriptor = $this->getSourceSection();
+ $descriptor = $sourceDescriptor
+ + $this->getDescriptionSection()
+ + $this->getOptionsSection();
+
+ Hooks::run( 'UploadFormInitDescriptor', [ &$descriptor ] );
+ parent::__construct( $descriptor, $context, 'upload' );
+
+ # Add a link to edit MediaWiki:Licenses
+ if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+ $this->getOutput()->addModuleStyles( 'mediawiki.special.upload.styles' );
+ $licensesLink = $linkRenderer->makeKnownLink(
+ $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
+ $this->msg( 'licenses-edit' )->text(),
+ [],
+ [ 'action' => 'edit' ]
+ );
+ $editLicenses = '' . $licensesLink . '
';
+ $this->addFooterText( $editLicenses, 'description' );
+ }
+
+ # Set some form properties
+ $this->setSubmitText( $this->msg( 'uploadbtn' )->text() );
+ $this->setSubmitName( 'wpUpload' );
+ # Used message keys: 'accesskey-upload', 'tooltip-upload'
+ $this->setSubmitTooltip( 'upload' );
+ $this->setId( 'mw-upload-form' );
+
+ # Build a list of IDs for javascript insertion
+ $this->mSourceIds = [];
+ foreach ( $sourceDescriptor as $field ) {
+ if ( !empty( $field['id'] ) ) {
+ $this->mSourceIds[] = $field['id'];
+ }
+ }
+ }
+
+ /**
+ * Get the descriptor of the fieldset that contains the file source
+ * selection. The section is 'source'
+ *
+ * @return array Descriptor array
+ */
+ protected function getSourceSection() {
+ if ( $this->mSessionKey ) {
+ return [
+ 'SessionKey' => [
+ 'type' => 'hidden',
+ 'default' => $this->mSessionKey,
+ ],
+ 'SourceType' => [
+ 'type' => 'hidden',
+ 'default' => 'Stash',
+ ],
+ ];
+ }
+
+ $canUploadByUrl = UploadFromUrl::isEnabled()
+ && ( UploadFromUrl::isAllowed( $this->getUser() ) === true )
+ && $this->getConfig()->get( 'CopyUploadsFromSpecialUpload' );
+ $radio = $canUploadByUrl;
+ $selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
+
+ $descriptor = [];
+ if ( $this->mTextTop ) {
+ $descriptor['UploadFormTextTop'] = [
+ 'type' => 'info',
+ 'section' => 'source',
+ 'default' => $this->mTextTop,
+ 'raw' => true,
+ ];
+ }
+
+ $this->mMaxUploadSize['file'] = min(
+ UploadBase::getMaxUploadSize( 'file' ),
+ UploadBase::getMaxPhpUploadSize()
+ );
+
+ $help = $this->msg( 'upload-maxfilesize',
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
+ )->parse();
+
+ // If the user can also upload by URL, there are 2 different file size limits.
+ // This extra message helps stress which limit corresponds to what.
+ if ( $canUploadByUrl ) {
+ $help .= $this->msg( 'word-separator' )->escaped();
+ $help .= $this->msg( 'upload_source_file' )->parse();
+ }
+
+ $descriptor['UploadFile'] = [
+ 'class' => 'UploadSourceField',
+ 'section' => 'source',
+ 'type' => 'file',
+ 'id' => 'wpUploadFile',
+ 'radio-id' => 'wpSourceTypeFile',
+ 'label-message' => 'sourcefilename',
+ 'upload-type' => 'File',
+ 'radio' => &$radio,
+ 'help' => $help,
+ 'checked' => $selectedSourceType == 'file',
+ ];
+
+ if ( $canUploadByUrl ) {
+ $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
+ $descriptor['UploadFileURL'] = [
+ 'class' => 'UploadSourceField',
+ 'section' => 'source',
+ 'id' => 'wpUploadFileURL',
+ 'radio-id' => 'wpSourceTypeurl',
+ 'label-message' => 'sourceurl',
+ 'upload-type' => 'url',
+ 'radio' => &$radio,
+ 'help' => $this->msg( 'upload-maxfilesize',
+ $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
+ )->parse() .
+ $this->msg( 'word-separator' )->escaped() .
+ $this->msg( 'upload_source_url' )->parse(),
+ 'checked' => $selectedSourceType == 'url',
+ ];
+ }
+ Hooks::run( 'UploadFormSourceDescriptors', [ &$descriptor, &$radio, $selectedSourceType ] );
+
+ $descriptor['Extensions'] = [
+ 'type' => 'info',
+ 'section' => 'source',
+ 'default' => $this->getExtensionsMessage(),
+ 'raw' => true,
+ ];
+
+ return $descriptor;
+ }
+
+ /**
+ * Get the messages indicating which extensions are preferred and prohibitted.
+ *
+ * @return string HTML string containing the message
+ */
+ protected function getExtensionsMessage() {
+ # Print a list of allowed file extensions, if so configured. We ignore
+ # MIME type here, it's incomprehensible to most people and too long.
+ $config = $this->getConfig();
+
+ if ( $config->get( 'CheckFileExtensions' ) ) {
+ $fileExtensions = array_unique( $config->get( 'FileExtensions' ) );
+ if ( $config->get( 'StrictFileExtensions' ) ) {
+ # Everything not permitted is banned
+ $extensionsList =
+ '' .
+ $this->msg( 'upload-permitted' )
+ ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+ ->numParams( count( $fileExtensions ) )
+ ->parseAsBlock() .
+ "
\n";
+ } else {
+ # We have to list both preferred and prohibited
+ $fileBlacklist = array_unique( $config->get( 'FileBlacklist' ) );
+ $extensionsList =
+ '' .
+ $this->msg( 'upload-preferred' )
+ ->params( $this->getLanguage()->commaList( $fileExtensions ) )
+ ->numParams( count( $fileExtensions ) )
+ ->parseAsBlock() .
+ "
\n" .
+ '' .
+ $this->msg( 'upload-prohibited' )
+ ->params( $this->getLanguage()->commaList( $fileBlacklist ) )
+ ->numParams( count( $fileBlacklist ) )
+ ->parseAsBlock() .
+ "
\n";
+ }
+ } else {
+ # Everything is permitted.
+ $extensionsList = '';
+ }
+
+ return $extensionsList;
+ }
+
+ /**
+ * Get the descriptor of the fieldset that contains the file description
+ * input. The section is 'description'
+ *
+ * @return array Descriptor array
+ */
+ protected function getDescriptionSection() {
+ $config = $this->getConfig();
+ if ( $this->mSessionKey ) {
+ $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $this->getUser() );
+ try {
+ $file = $stash->getFile( $this->mSessionKey );
+ } catch ( Exception $e ) {
+ $file = null;
+ }
+ if ( $file ) {
+ global $wgContLang;
+
+ $mto = $file->transform( [ 'width' => 120 ] );
+ if ( $mto ) {
+ $this->addHeaderText(
+ '' .
+ Html::element( 'img', [
+ 'src' => $mto->getUrl(),
+ 'class' => 'thumbimage',
+ ] ) . '
', 'description' );
+ }
+ }
+ }
+
+ $descriptor = [
+ 'DestFile' => [
+ 'type' => 'text',
+ 'section' => 'description',
+ 'id' => 'wpDestFile',
+ 'label-message' => 'destfilename',
+ 'size' => 60,
+ 'default' => $this->mDestFile,
+ # @todo FIXME: Hack to work around poor handling of the 'default' option in HTMLForm
+ 'nodata' => strval( $this->mDestFile ) !== '',
+ ],
+ 'UploadDescription' => [
+ 'type' => 'textarea',
+ 'section' => 'description',
+ 'id' => 'wpUploadDescription',
+ 'label-message' => $this->mForReUpload
+ ? 'filereuploadsummary'
+ : 'fileuploadsummary',
+ 'default' => $this->mComment,
+ 'cols' => 80,
+ 'rows' => 8,
+ ]
+ ];
+ if ( $this->mTextAfterSummary ) {
+ $descriptor['UploadFormTextAfterSummary'] = [
+ 'type' => 'info',
+ 'section' => 'description',
+ 'default' => $this->mTextAfterSummary,
+ 'raw' => true,
+ ];
+ }
+
+ $descriptor += [
+ 'EditTools' => [
+ 'type' => 'edittools',
+ 'section' => 'description',
+ 'message' => 'edittools-upload',
+ ]
+ ];
+
+ if ( $this->mForReUpload ) {
+ $descriptor['DestFile']['readonly'] = true;
+ } else {
+ $descriptor['License'] = [
+ 'type' => 'select',
+ 'class' => 'Licenses',
+ 'section' => 'description',
+ 'id' => 'wpLicense',
+ 'label-message' => 'license',
+ ];
+ }
+
+ if ( $config->get( 'UseCopyrightUpload' ) ) {
+ $descriptor['UploadCopyStatus'] = [
+ 'type' => 'text',
+ 'section' => 'description',
+ 'id' => 'wpUploadCopyStatus',
+ 'label-message' => 'filestatus',
+ ];
+ $descriptor['UploadSource'] = [
+ 'type' => 'text',
+ 'section' => 'description',
+ 'id' => 'wpUploadSource',
+ 'label-message' => 'filesource',
+ ];
+ }
+
+ return $descriptor;
+ }
+
+ /**
+ * Get the descriptor of the fieldset that contains the upload options,
+ * such as "watch this file". The section is 'options'
+ *
+ * @return array Descriptor array
+ */
+ protected function getOptionsSection() {
+ $user = $this->getUser();
+ if ( $user->isLoggedIn() ) {
+ $descriptor = [
+ 'Watchthis' => [
+ 'type' => 'check',
+ 'id' => 'wpWatchthis',
+ 'label-message' => 'watchthisupload',
+ 'section' => 'options',
+ 'default' => $this->mWatch,
+ ]
+ ];
+ }
+ if ( !$this->mHideIgnoreWarning ) {
+ $descriptor['IgnoreWarning'] = [
+ 'type' => 'check',
+ 'id' => 'wpIgnoreWarning',
+ 'label-message' => 'ignorewarnings',
+ 'section' => 'options',
+ ];
+ }
+
+ $descriptor['DestFileWarningAck'] = [
+ 'type' => 'hidden',
+ 'id' => 'wpDestFileWarningAck',
+ 'default' => $this->mDestWarningAck ? '1' : '',
+ ];
+
+ if ( $this->mForReUpload ) {
+ $descriptor['ForReUpload'] = [
+ 'type' => 'hidden',
+ 'id' => 'wpForReUpload',
+ 'default' => '1',
+ ];
+ }
+
+ return $descriptor;
+ }
+
+ /**
+ * Add the upload JS and show the form.
+ */
+ public function show() {
+ $this->addUploadJS();
+ parent::show();
+ }
+
+ /**
+ * Add upload JS to the OutputPage
+ */
+ protected function addUploadJS() {
+ $config = $this->getConfig();
+
+ $useAjaxDestCheck = $config->get( 'UseAjax' ) && $config->get( 'AjaxUploadDestCheck' );
+ $useAjaxLicensePreview = $config->get( 'UseAjax' ) &&
+ $config->get( 'AjaxLicensePreview' ) && $config->get( 'EnableAPI' );
+ $this->mMaxUploadSize['*'] = UploadBase::getMaxUploadSize();
+
+ $scriptVars = [
+ 'wgAjaxUploadDestCheck' => $useAjaxDestCheck,
+ 'wgAjaxLicensePreview' => $useAjaxLicensePreview,
+ 'wgUploadAutoFill' => !$this->mForReUpload &&
+ // If we received mDestFile from the request, don't autofill
+ // the wpDestFile textbox
+ $this->mDestFile === '',
+ 'wgUploadSourceIds' => $this->mSourceIds,
+ 'wgCheckFileExtensions' => $config->get( 'CheckFileExtensions' ),
+ 'wgStrictFileExtensions' => $config->get( 'StrictFileExtensions' ),
+ 'wgFileExtensions' => array_values( array_unique( $config->get( 'FileExtensions' ) ) ),
+ 'wgCapitalizeUploads' => MWNamespace::isCapitalized( NS_FILE ),
+ 'wgMaxUploadSize' => $this->mMaxUploadSize,
+ 'wgFileCanRotate' => SpecialUpload::rotationEnabled(),
+ ];
+
+ $out = $this->getOutput();
+ $out->addJsConfigVars( $scriptVars );
+
+ $out->addModules( [
+ 'mediawiki.special.upload', // Extras for thumbnail and license preview.
+ ] );
+ }
+
+ /**
+ * Empty function; submission is handled elsewhere.
+ *
+ * @return bool False
+ */
+ function trySubmit() {
+ return false;
+ }
+}
diff --git a/includes/specials/helpers/ImportReporter.php b/includes/specials/helpers/ImportReporter.php
new file mode 100644
index 0000000000..63addb8772
--- /dev/null
+++ b/includes/specials/helpers/ImportReporter.php
@@ -0,0 +1,190 @@
+mOriginalPageOutCallback =
+ $importer->setPageOutCallback( [ $this, 'reportPage' ] );
+ $this->mOriginalLogCallback =
+ $importer->setLogItemCallback( [ $this, 'reportLogItem' ] );
+ $importer->setNoticeCallback( [ $this, 'reportNotice' ] );
+ $this->mPageCount = 0;
+ $this->mIsUpload = $upload;
+ $this->mInterwiki = $interwiki;
+ $this->reason = $reason;
+ }
+
+ /**
+ * Sets change tags to apply to the import log entry and null revision.
+ *
+ * @param array $tags
+ * @since 1.29
+ */
+ public function setChangeTags( array $tags ) {
+ $this->logTags = $tags;
+ }
+
+ function open() {
+ $this->getOutput()->addHTML( "\n" );
+ }
+
+ function reportNotice( $msg, array $params ) {
+ $this->getOutput()->addHTML(
+ Html::element( 'li', [], $this->msg( $msg, $params )->text() )
+ );
+ }
+
+ function reportLogItem( /* ... */ ) {
+ $this->mLogItemCount++;
+ if ( is_callable( $this->mOriginalLogCallback ) ) {
+ call_user_func_array( $this->mOriginalLogCallback, func_get_args() );
+ }
+ }
+
+ /**
+ * @param Title $title
+ * @param ForeignTitle $foreignTitle
+ * @param int $revisionCount
+ * @param int $successCount
+ * @param array $pageInfo
+ * @return void
+ */
+ public function reportPage( $title, $foreignTitle, $revisionCount,
+ $successCount, $pageInfo ) {
+ $args = func_get_args();
+ call_user_func_array( $this->mOriginalPageOutCallback, $args );
+
+ if ( $title === null ) {
+ # Invalid or non-importable title; a notice is already displayed
+ return;
+ }
+
+ $this->mPageCount++;
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+ if ( $successCount > 0 ) {
+ // prevents jumbling of the versions count
+ // in RTL wikis in case the page title is LTR
+ $this->getOutput()->addHTML(
+ "" . $linkRenderer->makeLink( $title ) . " " .
+ "" .
+ $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
+ " " .
+ " \n"
+ );
+
+ $logParams = [ '4:number:count' => $successCount ];
+ if ( $this->mIsUpload ) {
+ $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
+ $successCount )->inContentLanguage()->text();
+ $action = 'upload';
+ } else {
+ $pageTitle = $foreignTitle->getFullText();
+ $fullInterwikiPrefix = $this->mInterwiki;
+ Hooks::run( 'ImportLogInterwikiLink', [ &$fullInterwikiPrefix, &$pageTitle ] );
+
+ $interwikiTitleStr = $fullInterwikiPrefix . ':' . $pageTitle;
+ $interwiki = '[[:' . $interwikiTitleStr . ']]';
+ $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
+ $successCount )->params( $interwiki )->inContentLanguage()->text();
+ $action = 'interwiki';
+ $logParams['5:title-link:interwiki'] = $interwikiTitleStr;
+ }
+ if ( $this->reason ) {
+ $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+ . $this->reason;
+ }
+
+ $comment = $detail; // quick
+ $dbw = wfGetDB( DB_MASTER );
+ $latest = $title->getLatestRevID();
+ $nullRevision = Revision::newNullRevision(
+ $dbw,
+ $title->getArticleID(),
+ $comment,
+ true,
+ $this->getUser()
+ );
+
+ $nullRevId = null;
+ if ( !is_null( $nullRevision ) ) {
+ $nullRevId = $nullRevision->insertOn( $dbw );
+ $page = WikiPage::factory( $title );
+ # Update page record
+ $page->updateRevisionOn( $dbw, $nullRevision );
+ Hooks::run(
+ 'NewRevisionFromEditComplete',
+ [ $page, $nullRevision, $latest, $this->getUser() ]
+ );
+ }
+
+ // Create the import log entry
+ $logEntry = new ManualLogEntry( 'import', $action );
+ $logEntry->setTarget( $title );
+ $logEntry->setComment( $this->reason );
+ $logEntry->setPerformer( $this->getUser() );
+ $logEntry->setParameters( $logParams );
+ $logid = $logEntry->insert();
+ if ( count( $this->logTags ) ) {
+ $logEntry->setTags( $this->logTags );
+ }
+ // Make sure the null revision will be tagged as well
+ $logEntry->setAssociatedRevId( $nullRevId );
+
+ $logEntry->publish( $logid );
+
+ } else {
+ $this->getOutput()->addHTML( "" . $linkRenderer->makeKnownLink( $title ) . " " .
+ $this->msg( 'import-nonewrevisions' )->escaped() . " \n" );
+ }
+ }
+
+ function close() {
+ $out = $this->getOutput();
+ if ( $this->mLogItemCount > 0 ) {
+ $msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
+ $out->addHTML( Xml::tags( 'li', null, $msg ) );
+ } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
+ $out->addHTML( " \n" );
+
+ return Status::newFatal( 'importnopages' );
+ }
+ $out->addHTML( "\n" );
+
+ return Status::newGood( $this->mPageCount );
+ }
+}
diff --git a/includes/specials/helpers/License.php b/includes/specials/helpers/License.php
new file mode 100644
index 0000000000..4f94b4d232
--- /dev/null
+++ b/includes/specials/helpers/License.php
@@ -0,0 +1,46 @@
+
+ * @copyright Copyright © 2005, Ãvar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+/**
+ * A License class for use on Special:Upload (represents a single type of license).
+ */
+class License {
+ /** @var string */
+ public $template;
+
+ /** @var string */
+ public $text;
+
+ /**
+ * @param string $str License name??
+ */
+ function __construct( $str ) {
+ list( $text, $template ) = explode( '|', strrev( $str ), 2 );
+
+ $this->template = strrev( $template );
+ $this->text = strrev( $text );
+ }
+}
diff --git a/includes/tidy/Balancer.php b/includes/tidy/Balancer.php
index 947a572480..fbe92702df 100644
--- a/includes/tidy/Balancer.php
+++ b/includes/tidy/Balancer.php
@@ -627,6 +627,7 @@ class BalanceElement {
/**
* Get a string key for the Noah's Ark algorithm
+ * @return string
*/
public function getNoahKey() {
if ( $this->noahKey === null ) {
@@ -710,6 +711,7 @@ class BalanceStack implements IteratorAggregate {
/**
* Insert a comment at the appropriate place for inserting a node.
* @param string $value Content of the comment.
+ * @return string
* @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-comment
*/
public function insertComment( $value ) {
@@ -721,6 +723,7 @@ class BalanceStack implements IteratorAggregate {
* Insert text at the appropriate place for inserting a node.
* @param string $value
* @param bool $isComment
+ * @return string
* @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node
*/
public function insertText( $value, $isComment = false ) {
@@ -901,6 +904,8 @@ class BalanceStack implements IteratorAggregate {
/**
* Return the adjusted current node.
+ * @param string $fragmentContext
+ * @return string
*/
public function adjustedCurrentNode( $fragmentContext ) {
return ( $fragmentContext && count( $this->elements ) === 1 ) ?
@@ -1513,6 +1518,8 @@ class BalanceActiveFormattingElements {
* Find and return the last element with the specified tag between the
* end of the list and the last marker on the list.
* Used when parsing <a> "in body mode".
+ * @param string $tag
+ * @return null|Node
*/
public function findElementByTag( $tag ) {
$elt = $this->tail;
diff --git a/includes/tidy/TidyDriverBase.php b/includes/tidy/TidyDriverBase.php
index 6e01894008..f88b673479 100644
--- a/includes/tidy/TidyDriverBase.php
+++ b/includes/tidy/TidyDriverBase.php
@@ -14,6 +14,7 @@ abstract class TidyDriverBase {
/**
* Return true if validate() can be used
+ * @return bool
*/
public function supportsValidate() {
return false;
diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php
index 19f5100a4c..4f639c13fb 100644
--- a/includes/utils/AutoloadGenerator.php
+++ b/includes/utils/AutoloadGenerator.php
@@ -321,7 +321,7 @@ class ClassCollector {
protected $alias;
/**
- * @var string $code PHP code (including 'ä¸ç°½ç´',
'ä¸ç¾ç½²' => 'ä¸ç°½ç½²',
'ä¸ç¾è®¢' => 'ä¸ç°½è¨',
+'ä¸ç¾è¯' => 'ä¸ç°½è',
'ä¸ç¾' => 'ä¸ç±¤',
'ä¸ç³»ä¸' => 'ä¸ç¹«ä¸',
'ä¸è¯¾é' => 'ä¸èª²é',
@@ -3172,6 +3173,7 @@ public static $zh2Hant = [
'ä¸ç¾çº¦' => 'ä¸ç°½ç´',
'ä¸ç¾ç½²' => 'ä¸ç°½ç½²',
'ä¸ç¾è®¢' => 'ä¸ç°½è¨',
+'ä¸ç¾è¯' => 'ä¸ç°½è',
'ä¸ç¾' => 'ä¸ç±¤',
'ä¸è¯¾é' => 'ä¸èª²é',
'ä¸å¹²ä¸å' => 'ä¸ä¹¾ä¸æ·¨',
@@ -3247,6 +3249,7 @@ public static $zh2Hant = [
'ä¸ç¾çº¦' => 'ä¸ç°½ç´',
'ä¸ç¾ç½²' => 'ä¸ç°½ç½²',
'ä¸ç¾è®¢' => 'ä¸ç°½è¨',
+'ä¸ç¾è¯' => 'ä¸ç°½è',
'ä¸ç¾' => 'ä¸ç±¤',
'ä¸é£å' => 'ä¸é¢¨å¾',
'丰仪' => '丰å',
@@ -4322,7 +4325,6 @@ public static $zh2Hant = [
'å°å女' => 'å°å女',
'å°åå' => 'å°åå«',
'å°å·' => 'å°å·',
-'å°å¸æ¯' => 'å°å¸æ¯',
'å°åå²' => 'å°æ·å²',
'å°é' => 'å°é',
'å°é£å¥' => 'å°é¢¨ç',
@@ -4867,6 +4869,8 @@ public static $zh2Hant = [
'å°¸ç¥' => 'å°¸ç¥',
'尸祿' => '尸祿',
'å°¸ç¦' => '尸祿',
+'å°¸ç½' => 'å°¸ç¾
',
+'å°¸ç¾
' => 'å°¸ç¾
',
'å°¸ç½ç²¾è' => 'å°¸ç¾
ç²¾è',
'å°¸ç¾
ç²¾è' => 'å°¸ç¾
ç²¾è',
'å°¸è£' => 'å°¸è£',
@@ -5883,6 +5887,7 @@ public static $zh2Hant = [
'æå' => 'ææ',
'ææå' => 'ææå¾',
'æåå²' => 'ææ·å²',
+'æé²è°·ç©è¯' => 'æé²è°·ç©èª',
'æ¥æ¸¸' => 'æ¥é',
'æ¥é¦æå¦' => 'æ¥é¦é¬¥å¸',
'ææ å' => 'ææ å',
@@ -6034,6 +6039,7 @@ public static $zh2Hant = [
'æ¶é' => 'æ¶é',
'æåª' => 'æé»',
'æ殿å' => 'æ殿å',
+'æåç' => 'æç¼ç',
'æå' => 'æé«®',
'æä¸' => 'æä¸',
'æå' => 'æå',
@@ -6063,7 +6069,6 @@ public static $zh2Hant = [
'æè' => 'æ¡¿è',
'æ¢ä¸åå' => 'æ¢ä¸åå',
'æ¢å¯è¶
' => 'æ¢åè¶
',
-'æ¡å¹²' => 'æ¢å¹¹',
'æ¡æé' => 'æ¢æ裡',
'梨干' => '梨乾',
'梯å²' => '梯è¡',
@@ -6139,7 +6144,6 @@ public static $zh2Hant = [
'横å¾æ´æ' => 'æ©«å¾µæ´æ',
'横æ¢' => 'æ©«æ¨',
'横å²' => 'æ©«è¡',
-'å°å¸' => '檯å¸',
'å°å' => '檯æ',
'å°ç¯' => '檯ç',
'å°ç' => '檯ç',
@@ -8494,6 +8498,10 @@ public static $zh2Hant = [
'é¯è¡' => 'éè©',
'é¯ç¼' => 'éé',
'å
³ç³»' => 'éä¿',
+'å
³ç³»å' => 'éç³»å',
+'å
³ç³»æ' => 'éç³»æ',
+'å
³ç³»ç§' => 'éç³»ç§',
+'å
³ç³»ç»' => 'é系統',
'è¾ä½' => 'é¢ä½',
'è¾ä½' => 'é¢ä½',
'è¾å' => 'é¢å',
@@ -9710,6 +9718,7 @@ public static $zh2Hans = [
'å' => '𪢮',
'å¿' => 'é',
'å' => 'å',
+'å»' => 'å',
'å¡' => 'å',
'å·' => 'æ§',
'å
' => 'å',
@@ -13498,6 +13507,7 @@ public static $zh2Hans = [
'å´å´' => 'æä»',
'å´å' => 'æå§',
'å´å±±' => 'æå±±',
+'å´å³¶' => 'æå²',
'å´æ²' => 'ææ²',
'å´è
' => 'æè
',
'å´è' => 'æè',
@@ -13875,6 +13885,9 @@ public static $zh2TW = [
'å¥ç¹å¼' => 'å¥å¾·å¼',
'å¥æ¯è¾¾é»å ' => 'å¥æ¯å¤§é»å ',
'å¥æ¯éé»å ' => 'å¥æ¯å¤§é»å ',
+'å纳德·ç¹ææ®' => 'åç´Â·å·æ®',
+'ç¶å·ç¹ææ®' => 'åç´Â·å·æ®',
+'ç¶å¥´Â·ç¹ææ®' => 'åç´Â·å·æ®',
'å¡æå¥' => 'åæè©',
'ä¹æ²»Â·å¥¥å¨å°' => 'å¬æ²»Â·æå¨ç¾',
'ä½æ²»äº' => 'å¬æ²»äº',
@@ -13951,6 +13964,7 @@ public static $zh2TW = [
'å°¼æ¥å°' => 'å°¼æ¥',
'å°¼æ¥ç¾' => 'å°¼æ¥',
'é
马å' => 'å±±è',
+'ç¹ææ®' => 'å·æ®',
'æºåº' => 'å·¥å
·æ©',
'æ©åº' => 'å·¥å
·æ©',
'ç寶客æ©' => 'å·¨ç¡é¸å®¢æ©',
@@ -14105,6 +14119,7 @@ public static $zh2TW = [
'奥巴马' => 'æ巴馬',
'奧巴馬' => 'æ巴馬',
'æ£å¨å±å¤' => 'æ£å¨å±å¤',
+'å£ä½©å¾·ç½èæ' => 'æ±å ',
'æè±' => '汶è',
'æ²å¾' => 'æ²æ',
'æ²å°é¿æ伯' => 'æ²çå°é¿æ伯',
@@ -14270,7 +14285,8 @@ public static $zh2TW = [
'æ¯éå¡å°¼äº' => 'è
å©å¡å°¼äº',
'éå°æ¨å
¹' => 'è·å§è²',
'éç¾æ¨è²' => 'è·å§è²',
-'è·ææ´»é' => 'è·ææ´»é',
+'è·éæ´»å»£å ´' => 'è·éæ´»å»£å ´',
+'è·éæ´»é' => 'è·éæ´»é',
'è«æ¡æ¯å
' => 'è«ä¸æ¯å
',
'ç¦æè¨' => 'è¯åæ²',
'è¯éæ²' => 'è¯åæ²',
@@ -14349,6 +14365,8 @@ public static $zh2TW = [
'å±å¹' => 'è¢å¹',
'è¡äººè·¯æ' => 'è¡äººè·¯æ¬',
'è¡äººè·¯æ¬' => 'è¡äººè·¯æ¬',
+'æµåä½æ¥ç³»çµ±' => 'è¡åä½æ¥ç³»çµ±',
+'移å¨æä½ç³»ç»' => 'è¡åä½æ¥ç³»çµ±',
'æµå網絡' => 'è¡å網路',
'移å¨ç½ç»' => 'è¡å網路',
'æµåé»è©±' => 'è¡åé»è©±',
@@ -14840,6 +14858,7 @@ public static $zh2HK = [
'å é«æ' => 'ä½é«æ',
'ç¶å¾·è§' => 'ä½å¾è§',
'ä½åé' => 'ä½åè£',
+'æä½ç³»ç»' => 'ä½æ¥ç³»çµ±',
'ä¾è' => 'ä¾ç',
'ä¾èä½' => 'ä¾èä½',
'ä¾èå' => 'ä¾èå',
@@ -15843,6 +15862,8 @@ public static $zh2HK = [
'æ¸ç¢¼è¨è' => 'æ¸ç¢¼è¨è',
'æ°åçµè§' => 'æ¸ç¢¼é»è¦',
'æ¸ä½é»è¦' => 'æ¸ç¢¼é»è¦',
+'æ°åé³ä¹' => 'æ¸ç¢¼é³æ¨',
+'æ¸ä½é³æ¨' => 'æ¸ç¢¼é³æ¨',
'æ¸èä½' => 'æ¸èä½',
'æ¸èå' => 'æ¸èå',
'æ¸è稱' => 'æ¸è稱',
@@ -15974,7 +15995,6 @@ public static $zh2HK = [
'æèè¿°' => 'æèè¿°',
'æèé' => 'æèé',
'檯' => 'æ±',
-'å°å¸' => 'æ±å¸',
'å°å' => 'æ±æ',
'å°ç¯' => 'æ±ç',
'å°é¢ä¸' => 'æ±é¢ä¸',
@@ -16101,6 +16121,8 @@ public static $zh2HK = [
'æ´»èè
' => 'æ´»èè
',
'æ´»èè¿°' => 'æ´»èè¿°',
'æ´»èé' => 'æ´»èé',
+'移å¨æä½ç³»ç»' => 'æµåä½æ¥ç³»çµ±',
+'è¡åä½æ¥ç³»çµ±' => 'æµåä½æ¥ç³»çµ±',
'移å¨ç½ç»' => 'æµå網絡',
'è¡å網路' => 'æµå網絡',
'移å¨çµè¯' => 'æµåé»è©±',
@@ -16313,6 +16335,8 @@ public static $zh2HK = [
'ç«è稱' => 'ç«è稱',
'ç«èè
' => 'ç«èè
',
'ç»é' => 'ç«è£',
+'åç´Â·å·æ®' => 'ç¶å·ç¹ææ®',
+'å纳德·ç¹ææ®' => 'ç¶å·ç¹ææ®',
'ç¶è' => 'ç¶ç',
'ç¶èä½' => 'ç¶èä½',
'éèä½' => 'ç¶èä½',
@@ -18118,6 +18142,9 @@ public static $zh2CN = [
'åè稱' => 'åè称',
'åèè
' => 'åèè
',
'åèè¿°' => 'åèè¿°',
+'åç´Â·å·æ®' => 'å纳德·ç¹ææ®',
+'ç¶å·ç¹ææ®' => 'å纳德·ç¹ææ®',
+'ç¶å¥´Â·ç¹ææ®' => 'å纳德·ç¹ææ®',
'å±è' => 'å±ç',
'å±èæ¸' => 'å±è书',
'å±èä½' => 'å±èä½',
@@ -18180,6 +18207,7 @@ public static $zh2CN = [
'åé¯æ¯' => 'å¾å¢å
¹',
'åç¦é¯' => 'å¾ç¦å¢',
'ååç' => 'åç ç¬',
+'æ±å ' => 'å£ä½©å¾·ç½èæ',
'èé²è¥¿äº' => 'å£å¢è¥¿äº',
'èå
éæ¯å¤ç¦åå°¼ç¶æ¯' => 'å£åºè¨å尼维æ¯',
'èåæ¯ç´åæ¯' => 'å£åºè¨å尼维æ¯',
@@ -18204,6 +18232,7 @@ public static $zh2CN = [
'è¾è²ç¾' => 'åè²å°',
'èé溫' => 'åé温',
'åè½è®æ¸å稱' => 'åå',
+'網åå稱' => 'åå',
'åéå·´æ¯' => 'åºéå·´æ¯',
'å å§' => 'å å§',
'åå¹æ' => 'å ªå¹æ',
@@ -18783,6 +18812,7 @@ public static $zh2CN = [
'æ¸ä½æè¡' => 'æ°åææ¯',
'æ¸ä½é»è¦' => 'æ°åçµè§',
'æ¸ç¢¼é»è¦' => 'æ°åçµè§',
+'æ¸ä½é³æ¨' => 'æ°åé³ä¹',
'è³æ庫' => 'æ°æ®åº',
'æ¸è' => 'æ°ç',
'æ¸ä½ç
§ç¸æ©' => 'æ°ç ç
§ç¸æº',
@@ -18964,10 +18994,10 @@ public static $zh2CN = [
'梳èè
' => '梳èè
',
'梳èè¿°' => '梳èè¿°',
'梵谷' => '梵é«',
-'æ©ç' => 'æ¦ç',
'æ¬ å¸³' => 'æ¬ è´¦',
'æ»å¸³' => 'æ»è´¦',
'åºéçæ¯' => 'æ¯å©çæ¯',
+'æ«ç´¢' => 'æ¯ç´¢',
'ç¢å¡ç´¢' => 'æ¯å ç´¢',
'è
å©å¡å°¼äº' => 'æ¯éå¡å°¼äº',
'模é西æ¯' => 'æ¯éæ±æ¯',
@@ -19406,6 +19436,8 @@ public static $zh2CN = [
'èæ©' => 'ç§æ©ç½',
'象ç海岸' => 'ç§ç¹è¿ªç¦',
'ç©æ¥µä»½å' => '积æåå',
+'æµåä½æ¥ç³»çµ±' => '移å¨æä½ç³»ç»',
+'è¡åä½æ¥ç³»çµ±' => '移å¨æä½ç³»ç»',
'æµåé»è©±' => '移å¨çµè¯',
'è¡åé»è©±' => '移å¨çµè¯',
'æµå網絡' => '移å¨ç½ç»',
@@ -19609,6 +19641,8 @@ public static $zh2CN = [
'è¢å
æ£' => 'è§å
æ£',
'è¢å±' => 'è§å±',
'éç¾æ¯å¦' => 'è·å°æ¯æ³°å ',
+'è·éæ´»å»£å ´' => 'è·é活广åº',
+'è·éæ´»é' => 'è·éæ´»é',
'è«ä¸æ¯å
' => 'è«æ¡æ¯å
',
'é·ä¼æ³°ç£' => 'è±ç¹æ¹¾',
'è³´ç´¢æ' => 'è±ç´¢æ',
diff --git a/languages/i18n/ais.json b/languages/i18n/ais.json
index 525be3c2ae..4f0cd70fbd 100644
--- a/languages/i18n/ais.json
+++ b/languages/i18n/ais.json
@@ -12,7 +12,7 @@
"tog-watchlisthidecategorization": "midimut kasabelih kakuniza",
"tog-showhiddencats": "paazih madimutay a kakuniza",
"underline-always": "mahizatuay",
- "underline-never": "caaytu",
+ "underline-never": "amana kanca caay",
"editfont-default": "saazih sakaluk pataayaw tu kawaw a sulyang",
"editfont-monospace": "malecad ilaed a kataci nu silit",
"editfont-sansserif": "pacabay tu telay a kataci nu sulit",
@@ -137,8 +137,8 @@
"toolbox": "sakaluk",
"otherlanguages": "zumaay a kamu",
"redirectedfrom": "(miliyawtu tazuma nay $1)",
- "redirectpagesub": "miliyaw tazuma kasabelih",
- "redirectto": "miliyaw tazuma tu:",
+ "redirectpagesub": "miliyaw patatuzuâ",
+ "redirectto": "miliyaw patatuzuâ i:",
"lastmodifiedat": "uyni kasabelih sazikuz mikawaway tu kalumyiti i $1 $2.",
"protectedpage": "madiputay a kasabelih",
"jumpto": "taayaw:",
@@ -175,6 +175,7 @@
"toc": "dilyikotoling",
"showtoc": "paazih",
"hidetoc": "midimut",
+ "collapsible-collapse": "piked",
"collapsible-expand": "micuwat",
"confirmable-yes": "hang",
"confirmable-no": "caay",
@@ -218,6 +219,7 @@
"createacct-yourpasswordagain-ph": "pisulitan ku mima kinacacay aca",
"userlogin-remembermypassword": "i balucuâen aku patalabu setyitase",
"cannotlogin-title": "laâcus patalabu",
+ "cannotlogin-text": "laâcus patalabu.",
"cannotloginnow-title": "laâcus patalabu ayza",
"cannotcreateaccount-title": "laâcusay panganganen ku canghaw",
"yourdomainname": "numisuay a calay-subal(wangyi):",
@@ -295,7 +297,7 @@
"sig_tip": "misuay a sulit nu ngangan atu demiad, tuki",
"hr_tip": "Sapisasuala (cayka yadah kawiza)",
"summary": "pecuâ nu lacul:",
- "subject": "taazihan tu kawaw:",
+ "subject": "satangahan:",
"minoredit": "payni mikilulay a mikawaway-kalumyiti",
"watchthis": "miazih tuyni kasabelih",
"savearticle": "misuped kasabelih",
@@ -346,7 +348,7 @@
"nextrevision": "kilulay masumad â",
"currentrevisionlink": "sabaluhay masumad",
"cur": "ayza",
- "next": "nuzikuzan",
+ "next": "zikuzan a cacay",
"last": "ayaway",
"page_last": "sazikuzay a kasabelih",
"history-fieldset-title": "mikilim masumad nu ayaway",
@@ -387,7 +389,7 @@
"titlematches": "kasabelih satangah matatungus",
"textmatches": "kasabelih lacul matatungus",
"prevn": "ayaw saka {{PLURAL:$1|$1}}",
- "nextn": "zikuzan saka {{PLURAL:$1|$1}}",
+ "nextn": "zikuzan a cacay {{PLURAL:$1|$1}}",
"prev-page": "ayaway a belih",
"next-page": "zikuzan a belih",
"nextn-title": "nuzikuzan saka {{PLURAL:$1|a heci}}",
@@ -395,7 +397,7 @@
"viewprevnext": "ciwsace ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-new": " uyni Wiki patizeng ku kasabelih \"[[:$1]]\"ï¼ {{PLURAL:$2|0=| acasa miazih tu tatengaâay patalabuay a matepaâay a heci. |acasa miazih tu tatengaâay zuma matepaâay a heci.}}",
"searchprofile-articles": "lacul kasabelih",
- "searchprofile-images": "malocimyidiya",
+ "searchprofile-images": "kayadah-myiti",
"searchprofile-everything": "hamin",
"searchprofile-advanced": "tapabaw",
"searchprofile-articles-tooltip": "i labu nu $1 mikilim",
@@ -436,12 +438,13 @@
"searchresultshead": "kilim",
"stub-threshold-sample-link": "maaziahan",
"stub-threshold-disabled": "mapasatezep",
+ "timezonelegend": "tatukian a kakitizaan:",
"localtime": "itiniay a tuki:",
"servertime": "sefuci-kikay a tuki:",
"timezoneregion-africa": "Afilika",
"timezoneregion-america": "Amilikaco",
"timezoneregion-antarctica": "Nancico",
- "timezoneregion-arctic": "Sasaamisan",
+ "timezoneregion-arctic": "Sasaamisan nu kitakit",
"timezoneregion-asia": "Yaco",
"timezoneregion-australia": "Awco",
"timezoneregion-europe": "Ouco",
@@ -485,6 +488,7 @@
"group-suppress": "misisipay",
"group-all": "(hamin)",
"group-bot-member": "{{GENDER:$1|kikay a tademaw}}",
+ "group-bureaucrat-member": "{{GENDER:$1|situngusay-mikawaway}}",
"grouppage-bot": "{{ns:project}}:kikay a tademaw",
"grouppage-sysop": "{{ns:project}}:mikuwanay",
"grouppage-bureaucrat": "{{ns:project}}:situngusay a mikawaway",
@@ -510,13 +514,17 @@
"grant-uploadfile": "patapabaw ku baluhay a tangan",
"grant-basic": "anganganay a tungus",
"newuserlogpage": "patizeng misaungayay nasulitan nakawawan",
+ "action-read": "miasip tina kasabelih",
"action-edit": "mikawaway-kalumyiti uyni a kasabelih",
+ "action-createpage": "patizeng tina kasabelih",
"action-move-categorypages": "milimad kakuniza a kasabelih",
"action-movefile": "milimad tina tangan",
"action-upload": "patapabaw tina tangan",
+ "action-delete": "misipu tina kasabelih",
"action-deleterevision": "misipu tu masumaday nu ayaway",
"action-deletelogentry": "masipu nasulitan nazipaâan kasacacay",
"action-sendemail": "pabahel imyiyo(email)",
+ "action-purge": "misipu tina kasabelih",
"nchanges": "$1 {{PLURAL:$1|misumad}}",
"enhancedrc-history": "nazipaâan",
"recentchanges": "capi a demaiday a sumad",
@@ -626,12 +634,12 @@
"upload-file-error": "ilabuay a mungangaw",
"upload-dialog-button-cancel": "palawpes",
"upload-dialog-button-back": "tatiku",
- "upload-dialog-button-done": "pahezek",
+ "upload-dialog-button-done": "malahecitu",
"upload-dialog-button-save": "suped",
"upload-dialog-button-upload": "patapabaw",
"upload-form-label-infoform-title": "pulitaay a kalunasulitan",
"upload-form-label-infoform-name": "kalungangan",
- "upload-form-label-infoform-description": "patahkal",
+ "upload-form-label-infoform-description": "sapuelac",
"upload-form-label-infoform-categories": "kakuniza",
"upload-form-label-infoform-date": "demiad",
"uploadstash": "patapabaw ku sulu nu pisipetan",
@@ -651,7 +659,7 @@
"listfiles_name": "kalungangan",
"listfiles_user": "misaungayay",
"listfiles_size": "hacica-tabaki",
- "listfiles_description": "patahkal",
+ "listfiles_description": "sapuelac",
"listfiles_count": "baziyong",
"listfiles-latestversion": "ayzaay a baziyong",
"listfiles-latestversion-yes": "hang",
@@ -660,6 +668,7 @@
"filehist": "tangan nu nazipaâan",
"filehist-help": "sapecec ku demiad/tuki sapiciwsace ku tuki nina demiad a tangan baziyong",
"filehist-deleteall": "haminan misipu",
+ "filehist-revert": "patiku",
"filehist-current": "ayza",
"filehist-datetime": "demiad/tuki",
"filehist-thumb": "sukep tu zunga",
@@ -744,6 +753,7 @@
"apihelp": "buhci tu kamu nu API",
"apisandbox": "bunac haku nu API",
"apisandbox-fullscreen": "micuwat tu sapat",
+ "apisandbox-unfullscreen": "paazih kasabelih",
"apisandbox-submit": "miawaw tu milunguc",
"apisandbox-reset": "palawpis",
"apisandbox-retry": "miliyaw mitaneng",
@@ -801,7 +811,7 @@
"emailusernamesubmit": "patayzaan",
"emailfrom": "patigamiay:",
"emailto": "katukuh:",
- "emailsubject": "taazihan tu kawaw:",
+ "emailsubject": "satangahan:",
"emailmessage": "palatuh:",
"emailsend": "patigamitu",
"watchlist": "miazihay a piazihan tu sulit",
@@ -856,7 +866,7 @@
"protect-othertime": "zuma a tatukian:",
"protect-otherreason-op": "zuma a mahicaay",
"protect-edit-reasonlist": "midiput a mahicaay nu mikawaway-kalumyiti",
- "restriction-type": "pabeli tu kinli mahasa:",
+ "restriction-type": "tungus:",
"restriction-level": "kelec kasaselal:",
"minimum-size": "makaadidiâay a sausi",
"maximum-size": "sakatabakiay a sausi:",
@@ -866,10 +876,11 @@
"restriction-create": "patizeng",
"restriction-upload": "patapabaw",
"restriction-level-sysop": "maenapay a diput",
- "restriction-level-autoconfirmed": "madiputay a kasabelih - satizep mikawaway tu kalumyiti",
+ "restriction-level-autoconfirmed": "lalusa-diput",
"restriction-level-all": "amahicahicaay a kasalelal",
"undelete-fieldset-title": "patiku misumad nu ayaway",
"undeletebtn": "patiku",
+ "undeleteinvert": "kabelihan mipiliâ",
"undeletecomment": "mahicaay:",
"undelete-search-submit": "kilim",
"undelete-show-file-submit": "hang",
@@ -897,7 +908,7 @@
"whatlinkshere-title": "masasiket tazumaay a \"$1\" kasabelih",
"whatlinkshere-page": "Kasabelih:",
"linkshere": "isasaay a kasabelih masasiket tazuma tu [[:$1]] :",
- "isredirect": "miliyaw tazuma kasabelih",
+ "isredirect": "miliyaw patatuzuâ",
"istemplate": "palaculen tu kasabelih",
"isimage": "tangan-tangan misiket",
"whatlinkshere-prev": "saka {{PLURAL:$1|nuayaway}}",
@@ -918,6 +929,7 @@
"ipb-confirm": "malucekay tu langat",
"blockipsuccesssub": "milangat malahci",
"ipb-edit-dropdown": "malangat a mahicaay nu mikawaway-kalumyiti",
+ "ipb-unblock-addr": "mihulak tu langat $1",
"ipb-blocklist-duration-left": "$1 pakawili",
"ipusubmit": "misipu tina langat",
"autoblocklist-submit": "kilim",
@@ -935,6 +947,7 @@
"noautoblockblock": "mapasatezep lunuk milangat",
"emailblock": "mapasatezep imyiyo(email)",
"blocklink": "milangat",
+ "unblocklink": "mihulak tu langat",
"change-blocklink": "misumad tu langat",
"contribslink": "paanin",
"emaillink": "pabahel imyiyo(email)",
@@ -968,6 +981,7 @@
"allmessages-filter-translate": "mibelih",
"thumbnail-more": "patabaki(micuwat)",
"filemissing": "tangan mahedaw",
+ "thumbnail_image-missing": "tangan mahedaw: $1",
"import": "pacumuden kasabelih",
"import-interwiki-sourcepage": "saangangan kasabelih:",
"import-interwiki-templates": "yamalyilu sacahamin taazihan mitudung",
@@ -989,6 +1003,8 @@
"tooltip-ca-edit": "mikawaway-kalumyiti uyni a kasabelih",
"tooltip-ca-viewsource": "uyni kasabelih madiputay tuway.\nkapah kisu miciwsace tuyni kasabelih sakatizeng bangu",
"tooltip-ca-history": "uyini kasabelih nasawniay a sumad",
+ "tooltip-ca-protect": "midiput tina kasabelih",
+ "tooltip-ca-delete": "misipu tina kasabelih",
"tooltip-ca-move": "milimad tina kasabelih",
"tooltip-ca-watch": "paynien kasabelih micunus misuay cyinse piazihan tu sulit",
"tooltip-search": "kilim {{SITENAME}}",
@@ -1078,24 +1094,30 @@
"show-big-image-preview": "pataayaway miazih hacica ku tabaki: $1.",
"show-big-image-size": "$1 Ã $2 syangsu",
"file-info-gif-looped": "palalacalen",
- "file-info-gif-frames": "$1 {{PLURAL:$1|misabacu}}",
- "file-info-png-frames": "$1 {{PLURAL:$1|misabacu}}",
+ "file-info-gif-frames": "$1 {{PLURAL:$1|kulit sapat}}",
+ "file-info-png-frames": "$1 {{PLURAL:$1|kulit sapat}}",
"newimages": "baluhay tangan a sulu nu zunga",
"newimages-legend": "kilim",
"noimages": "inayiâ amahicahica tu zunga.",
"gallery-slideshow-toggle": "ketun mibalic sukep tu zunga",
"ilsubmit": "kilim",
"bydate": "ahizan tu demiad",
+ "seconds": "$1 a {{PLURAL:$1|abeti}}",
"minutes": "{{PLURAL:$1|$1 widi}}",
"hours": "{{PLURAL:$1|$1 tuki}}",
"days": "$1 {{PLURAL:$1|a demiad}}",
"ago": "ayaw nu $1",
"just-now": "nasawni",
+ "hours-ago": "ayaw $1 {{PLURAL:$1|a tuki}}",
+ "minutes-ago": "ayaw $1 {{PLURAL:$1|widi}}",
+ "seconds-ago": "ayaw $1 {{PLURAL:$1|a beti}}",
"monday-at": "sakacacay a demiad nu lipay i$1",
"friday-at": "sakalima a demied nu lipay i $1",
"saturday-at": "sakaenem a demiad nu lipay i $1",
"metadata": "pulita tu kalunasulitan",
"metadata-help": "uyni tangan labuay amin yamalyilu zuma cesyun, uyni a cesyun akay nay suewyi sasasing asaca sapisekyin i tapang asaca suwyihwa saayaw katukuh pahzekan a nakawawan mapacunusay. anu nay tangan saayaway setyitase masumadtu, hatizaay pulita kalunasulitan akay laâcus mileku mabetil a misumad tu tangan.",
+ "metadata-expand": "paazih pulita kalunasulitan",
+ "metadata-collapse": "midimut pulitaay a kalunasulitan",
"metadata-fields": "i tini palatuh patahkal i labuay a EXIF pulita tu kalunasulitanay a kakitizaan, yamalyilu i zunga paazih kasabelih, sapipulita tu cudad nu nasulitan malepiâ paazih palatuh.\nzumaay a pulita tu cudad pataayaw tu kawaw midimut.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"exif-imagewidth": "ahebal",
"exif-imagelength": "takalaw sulyang",
@@ -1151,6 +1173,7 @@
"exif-gaincontrol": "makaazihay misimaw",
"exif-contrast": "e-contrast",
"exif-saturation": "matumesay a sulyang",
+ "exif-sharpness": "kacidem",
"exif-devicesettingdescription": "sakaluk setin sapuelac",
"exif-gpslatituderef": "pyiwyi asaca nanwyi",
"exif-gpslongituderef": "tongcing asaca sicing",
@@ -1165,6 +1188,7 @@
"exif-gpsdatestamp": "GPS a demiad",
"exif-keywords": "aazihen dulit",
"exif-worldregioncreated": "zunga masasing a kakitizaan",
+ "exif-countrycreated": "zunga masasingan a kanatal",
"exif-provinceorstatecreated": "yakuwanan a sasing",
"exif-citycreated": "yatukay a sasing",
"exif-countrydest": "paazih tu kanatal",
@@ -1194,6 +1218,7 @@
"exif-label": "aazihen paya",
"exif-rightscertificate": "nisangaâan niza tu tungus a kawaw nu makuwanay a pincen",
"exif-copyrighted": "nisangaâan niza tu tungus a kawaw setyitase",
+ "exif-copyrightowner": "nizaay nisangaâan tu tungus a kawaw",
"exif-usageterms": "mamaala a cedang",
"exif-webstatement": "nabalucu'an nu i telay nisangaâan niza tu tungus a kawaw",
"exif-morepermissionsurl": "paliyuh pabeli tu kinli a cesyun",
@@ -1223,7 +1248,10 @@
"exif-exposureprogram-4": "kiyata maluayaw",
"exif-subjectdistance-value": "$1 mi",
"exif-meteringmode-2": "pikuwanan pacunus lalet",
+ "exif-meteringmode-3": "baniyut-ditek",
+ "exif-meteringmode-4": "kayadah- baniyut-ditek",
"exif-meteringmode-5": "muse",
+ "exif-meteringmode-6": "liyad",
"exif-meteringmode-255": "zuma",
"exif-lightsource-1": "likat",
"exif-lightsource-2": "inkwang a tinghuy",
@@ -1287,6 +1315,7 @@
"exif-objectcycle-b": "namalanam atu namalahuk",
"exif-gpsdirection-t": "tatengaay tatuzuâan",
"exif-gpsdirection-m": "tatuzu'an nu tyice",
+ "exif-ycbcrpositioning-1": "teban",
"exif-ycbcrpositioning-2": "palecad miala tu maaziahan",
"exif-dc-contributor": "paaninay tu kalusasing",
"exif-dc-date": "demiad",
@@ -1311,15 +1340,18 @@
"exif-iimcategory-spo": "wundukay",
"exif-iimcategory-wea": "demidad",
"exif-urgency-normal": "tatungus ($1)",
+ "exif-urgency-low": "puânel ($1)",
"exif-urgency-high": "takalaw ($1)",
"namespacesall": "hamin",
"monthsall": "hamin",
"recreate": "miliyaw miteka patizeng",
+ "confirm-purge-title": "misipu tina kasabelih",
"confirm_purge_button": "malucekay",
"confirm-watch-button": "malucekay",
"confirm-unwatch-button": "malucekay",
"confirm-rollback-button": "malucekay",
"quotation-marks": "\"$1\"",
+ "imgmultipageprev": "ayaway cacay a belih",
"imgmultipagenext": "zikuzan a belih â",
"imgmultigo": "mileku!",
"img-lang-default": "(pataayaw tu kawaw a kamu)",
@@ -1327,6 +1359,7 @@
"ascending_abbrev": "masalaylay adidiâay katukuh tabakiay",
"descending_abbrev": "masalaylay tabakiay katukuh adidiâay",
"table_pager_next": "zikuzan a belih",
+ "table_pager_first": "sakacacay a belih",
"table_pager_last": "sazikuzay a kasabelih",
"table_pager_limit_label": "paybelih a sulit:",
"table_pager_limit_submit": "mileku",
@@ -1336,12 +1369,14 @@
"watchlistedit-normal-title": "miazihay a piazihan tu sulit nu mikawaway-kalumyiti",
"watchlistedit-normal-submit": "misipu satangahan",
"watchlistedit-clear-title": "misipu miazihay a piazihan tu sulit",
+ "watchlisttools-clear": "misipu miazihay a piazihan tu sulit",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| sasukamu ]])",
"timezone-local": "itizaay",
"version": "baziyong",
"version-skins": "malacul tu nuhekalan",
"version-specialpages": "sazumaay a kasabelih",
"version-parserhooks": "kulawid nu saheciay sakaluk",
+ "version-variables": "masumaday-sausi",
"version-other": "zuma",
"version-mediahandlers": "myiti saungayay a sakaluk",
"version-hooks": "kulawid",
@@ -1351,7 +1386,7 @@
"version-skin-colheader-name": "nuhekalan",
"version-ext-colheader-version": "baziyong",
"version-ext-colheader-license": "sapabeli tu kinli a cedang",
- "version-ext-colheader-description": "patahkal",
+ "version-ext-colheader-description": "sapuelac",
"version-ext-colheader-credits": "masacudaday",
"version-poweredby-others": "zuma",
"version-software": "malacul tu ku zwanti",
@@ -1362,9 +1397,11 @@
"version-libraries-library": "sulu nu cengse",
"version-libraries-version": "baziyong",
"version-libraries-license": "sapabeli tu kinli a cedang",
- "version-libraries-description": "patahkal",
+ "version-libraries-description": "sapuelac",
"version-libraries-authors": "masacudaday",
"redirect-submit": "mileku",
+ "redirect-lookup": "palalitemuh tu kawaw:",
+ "redirect-value": "sulyang:",
"redirect-page": "kasabelih ID",
"redirect-file": "kalungangan nu tangan",
"redirect-logid": "nasulitan nazipaâan ID",
@@ -1386,8 +1423,10 @@
"tag-filter-submit": "kilim",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|aazihen payaâ}}]]: $2)",
"tag-mw-contentmodelchange": "lacul tatudungen misangaâ misumad",
+ "tags-title": "aazihen a paya",
"tags-tag": "aazihen a paya kalungangan",
"tags-source-header": "saangangan",
+ "tags-active-header": "miwawah",
"tags-actions-header": "saungay",
"tags-active-yes": "hang",
"tags-active-no": "caay",
@@ -1441,15 +1480,16 @@
"rightsnone": "(nayiâ)",
"feedback-back": "tatiku",
"feedback-cancel": "palawpes",
- "feedback-close": "pahezek",
+ "feedback-close": "malahecitu",
"feedback-external-bug-report-button": "munday nu patubeli",
"feedback-message": "palatuh:",
- "feedback-subject": "taazihan tu kawaw:",
+ "feedback-subject": "satangahan:",
"feedback-submit": "patayzaan",
"feedback-thanks-title": "kukay tisuwanan!",
"searchsuggest-search": "kilim {{SITENAME}}",
"api-error-unknownerror": "caay kapulita ku mungangaw: \"$1\".",
"duration-seconds": "$1 {{PLURAL:$1|a beti}}",
+ "duration-minutes": "$1 {{PLURAL:$1|widi}}",
"duration-hours": "$1 {{PLURAL:$1|tuki}}",
"duration-weeks": "$1 {{PLURAL:$1|a lipas}}",
"duration-years": "$1 {{PLURAL:$1|a mihca}}",
@@ -1474,6 +1514,7 @@
"action-pagelang": "misumad kasabelih a kamu",
"log-name-pagelang": "kamu misumad a nasulitan nazipaâan",
"mediastatistics": "myiti sausi cesyun",
+ "mediastatistics-table-mimetype": "MIME nikalahizaan",
"mediastatistics-table-extensions": "kapah saungay a mikilulay a ngangan nu tangan",
"mediastatistics-table-count": "tangan nikayadah",
"mediastatistics-table-totalbytes": "pulung sausi nu hacica-tabaki",
@@ -1525,6 +1566,7 @@
"log-action-filter-all": "hamin",
"log-action-filter-block-block": "milangat",
"log-action-filter-block-reblock": "milangat tu sapisumad",
+ "log-action-filter-block-unblock": "mihulak tu langat",
"log-action-filter-delete-delete": "misipu kasabelih",
"log-action-filter-delete-delete_redir": "miliyaw patatuzuâ mipakutay tu sulit",
"log-action-filter-delete-restore": "kasabelih milawpes tu sipu",
@@ -1555,10 +1597,11 @@
"authmanager-provider-temporarypassword": "nanunuz a mima",
"authprovider-confirmlink-request-label": "manakanca masasiket tu canghaw",
"authprovider-resetpass-skip-label": "sekipo",
+ "authform-newtoken": "mahedaw mima-sacukcuk. $1",
"authform-wrongtoken": "mima-sacukcuk mungangaw",
"specialpage-securitylevel-not-allowed-title": "amana",
"cannotauth-not-allowed-title": "caykataneng ku tungus",
- "changecredentials": "misumad tu sapangangan",
+ "changecredentials": "misumad tu sapangangan-wacay",
"removecredentials": "misipu sapangangan",
"credentialsform-provider": "pincen nikalahizaan:",
"credentialsform-account": "canghaw kalungangan:",
diff --git a/languages/i18n/az.json b/languages/i18n/az.json
index d2173a2017..3e3b6e6a93 100644
--- a/languages/i18n/az.json
+++ b/languages/i18n/az.json
@@ -998,11 +998,46 @@
"recentchanges-legend-heading": "Legenda: ",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hÉmçinin bax: [[Special:NewPages|yeni sÉhifÉlÉrin siyahısı]])",
"recentchanges-submit": "GöstÉr",
+ "rcfilters-legend-heading": "Abreviaturalar siyahısı: ",
+ "rcfilters-other-review-tools": "DigÉr yoxlama alÉtlÉri ",
+ "rcfilters-group-results-by-page": "DÉyiÅikliklÉri sÉhifÉlÉrÉ görÉ qruplaÅdır",
+ "rcfilters-grouping-title": "QruplaÅdırma",
+ "rcfilters-activefilters": "Aktiv filtrlÉr",
+ "rcfilters-advancedfilters": "GeniÅ filtr",
+ "rcfilters-limit-title": "GöstÉrilmÉli dÉyiÅikliklÉr",
+ "rcfilters-limit-shownum": "Son {{PLURAL:$1|dÉyiÅikliyi|$1 dÉyiÅikliyi}} göstÉr",
+ "rcfilters-days-title": "Son günlÉr",
+ "rcfilters-hours-title": "Son saatlar",
+ "rcfilters-quickfilters": "YaddaÅdakı filtrlÉr",
+ "rcfilters-quickfilters-placeholder-title": "YaddaÅa verilmiÅ keçid yoxdur",
+ "rcfilters-quickfilters-placeholder-description": "Filtr nizamlamalarını yaddaÅda saxlamaq vÉ sonradan tÉkrar istifadÉ etmÉk üçün aÅaÄıdakı Aktiv FiltrlÉr bölmÉsindÉki ÉlfÉcin niÅanını tıqlayın.",
+ "rcfilters-savedqueries-remove": "Sil",
"rcfilters-savedqueries-new-name-label": "Ad",
"rcfilters-savedqueries-cancel-label": "LÉÄv et",
+ "rcfilters-restore-default-filters": "Standart filtrlÉri bÉrpa et",
+ "rcfilters-clear-all-filters": "Bütün filtrlÉri sil",
+ "rcfilters-show-new-changes": "Æn son dÉyiÅikliklÉri göstÉr",
+ "rcfilters-search-placeholder": "Son dÉyiÅikliklÉri filtrlÉ (siyahıdan seçin vÉ ya yazın)",
+ "rcfilters-empty-filter": "Aktiv filtr yoxdur. Bütün redaktÉlÉr göstÉrilir.",
"rcfilters-filterlist-title": "FiltrlÉr",
+ "rcfilters-highlightbutton-title": "NÉticÉlÉri vurÄula",
+ "rcfilters-highlightmenu-title": "RÉng seçin",
+ "rcfilters-highlightmenu-help": "Bu xüsusiyyÉti rÉnglÉmÉk üçün rÉng seçin",
+ "rcfilters-filtergroup-authorship": "RedaktÉlÉrin müÉllifliyi",
+ "rcfilters-filtergroup-userExpLevel": "Ä°stifadÉçi qeydiyyatı vÉ tÉcrübÉsi",
+ "rcfilters-filtergroup-automated": "Avtomatik redaktÉlÉr",
"rcfilters-filter-bots-label": "Bot",
+ "rcfilters-filtergroup-significance": "ÆhÉmiyyÉtlilik",
"rcfilters-filter-minor-label": "Kiçik redaktÉlÉr",
+ "rcfilters-filtergroup-watchlist": "Ä°zlÉmÉ siyahısındakı sÉhifÉlÉr",
+ "rcfilters-filtergroup-changetype": "DÉyiÅiklik növü",
+ "rcfilters-filter-logactions-label": "Qeydiyyatlı redaktÉlÉr",
+ "rcfilters-filtergroup-lastRevision": "Son versiyalar",
+ "rcfilters-exclude-button-off": "SeçilÉnlÉri istisna et",
+ "rcfilters-exclude-button-on": "SeçilmiÅlÉrin çıxarılması",
+ "rcfilters-view-tags": "EtiketlÉnmiÅ redaktÉlÉr",
+ "rcfilters-view-namespaces-tooltip": "NÉticÉlÉri adlar fÉzasına görÉ filtrlÉ",
+ "rcfilters-view-tags-tooltip": "NÉticÉlÉri redaktÉ etiketlÉri Ésasında filtrlÉ",
"rcnotefrom": "AÅaÄıda $2 -dÉn bu yana olan dÉyiÅikliklÉr göstÉrilib ($1 -dÉn çox olmayaraq).",
"rclistfrom": "$3 $2 vaxtından baÅlayaraq yeni dÉyiÅikliklÉri göstÉr",
"rcshowhideminor": "Kiçik redaktÉlÉri $1",
@@ -1049,6 +1084,7 @@
"recentchangeslinked-summary": "AÅaÄıdakı siyahı, qeyd olunan sÉhifÉyÉ (vÉ ya qeyd olunan kateqoriyadakı sÉhifÉlÉrÉ) daxili keçid verÉn sÉhifÉlÉrdÉ edilmiÅ son dÉyiÅikliklÉrin siyahısıdır.\n[[Special:Watchlist|Ä°zlÉmÉ siyahınızdakı]] sÉhifÉlÉr '''qalın''' ÅriftlÉ göstÉrilmiÅdir.",
"recentchangeslinked-page": "SÉhifÉ adı:",
"recentchangeslinked-to": "Qeyd olunan sÉhifÉdÉki deyil, ona daxili keçid verÉn sÉhifÉlÉrdÉki dÉyiÅikliklÉri göstÉr",
+ "recentchanges-page-added-to-category": "[[:$1]] kateqoriyaya ÉlavÉ edildi",
"upload": "Fayl yüklÉ",
"uploadbtn": "SÉnÉd yüklÉ",
"reuploaddesc": "Return to the upload form.",
diff --git a/languages/i18n/azb.json b/languages/i18n/azb.json
index e21d635b35..8b650ca7d5 100644
--- a/languages/i18n/azb.json
+++ b/languages/i18n/azb.json
@@ -867,7 +867,7 @@
"search-interwiki-caption": "Ùارداش پرÙÚÙâÙر",
"search-interwiki-default": "$1 دا٠سÙÙÙجÙار:",
"search-interwiki-more": "(داÙا)",
- "search-interwiki-more-results": "داÙا ÚÙÙØ® سÙÙÙÙجâÙار",
+ "search-interwiki-more-results": "داÙا ÚÙÙØ® ÙتÛجÙâÙر",
"search-relatedarticle": "اÛÙÚ¯ÛÙÛ",
"searchrelated": "اÛÙÚ¯ÛÙÛ",
"searchall": "بÙتÙÙ",
@@ -993,8 +993,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 اÙÚÙ٠اÛستÛÙادÙâÚÛ ØÙÙÙâÙØ§Ø±Û Ø¯ÛÛشدÛرÛÙÛر",
@@ -1009,7 +1009,7 @@
"userrights-changeable-col": "دÙÙÛشدÛر٠بÛÙدÛÚ¯ÛÙÛز ÙرÙÙ¾Ùار",
"userrights-unchangeable-col": "دÙÙÛشدÛر٠بÛÙÙ
ÙâدÛÚ¯ÛÙÛز ÙرÙÙ¾Ùار",
"userrights-expiry-current": "$1-د٠ÙÛرتÙÙÙر",
- "userrights-expiry-othertime": "باشÙا Ùاخت",
+ "userrights-expiry-othertime": "Ø¢ÛØ±Û Úاغ",
"userrights-conflict": "اÛستÛÙادÙâÚÛ ØاÙÙØ§Ø±Û ØªÙÙÙÙØ´Ù
اسÛ! ÙÙØ·Ùا٠گÙزÙÙ Û٠٠دÙÛÛشدÛرÙ
ÙâÙرÛÙÛØ²Û ÛئÙÛâد٠ائدÛÙ.",
"group": "گرÙÙ:",
"group-user": "اÛستÙادÙâÚÛÙر",
diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json
index ce6ae9ec47..39761c5a94 100644
--- a/languages/i18n/be-tarask.json
+++ b/languages/i18n/be-tarask.json
@@ -742,6 +742,7 @@
"parser-template-loop-warning": "ÐÑÑÑÐ»ÐµÐ½Ñ ÑÑÐºÐ»Ñ Ñ ÑаблÑнаÑ
: [[$1]]",
"template-loop-category": "СÑаÑÐ¾Ð½ÐºÑ Ð· ÑÑклÑÐ¼Ñ ÑаблÑнаÑ",
"template-loop-category-desc": "СÑаÑонка ÑÑÑÑмлÑвае ÑÑÐºÐ»Ñ ÑаблÑнÑ, г. зн., ÑаблÑн ÑклÑÑае Ñам ÑÑбе ÑÑкÑÑÑÑÑна.",
+ "template-loop-warning": "ÐапÑÑÑджанÑне: гÑÑÐ°Ñ ÑÑаÑонка вÑклÑкае [[:$1]], ÑÐºÑ Ð·ÑÑÑлÑеÑÑа пÑÑÑÑнай ÑÑÐºÐ»Ñ ÑаблÑÐ½Ð°Ñ (бÑÑконÑÑ ÑÑкÑÑÑÑÑÐ½Ñ Ð²ÑклÑк).",
"parser-template-recursion-depth-warning": "ÐеÑавÑÑÐ°Ð½Ñ Ð»ÑмÑÑ Ð³Ð»ÑбÑÐ½Ñ ÑÑкÑÑÑÑÑ ÑаблÑÐ½Ñ ($1)",
"language-converter-depth-warning": "ÐеÑавÑÑанае абмежаванÑне глÑбÑÐ½Ñ ÐºÐ°Ð½Ð²ÑÑÑаÑÑ Ð²Ð°ÑÑÑнÑÐ°Ñ Ð¼Ð¾Ð²Ñ ($1)",
"node-count-exceeded-category": "СÑаÑÐ¾Ð½ÐºÑ Ð·Ñ Ð¿ÐµÑавÑÑанай колÑкаÑÑÑÑ Ð²ÑзлоÑ",
@@ -3896,5 +3897,6 @@
"cannotlink-no-provider-title": "ÐÑма ÑаÑ
ÑÐ½ÐºÐ°Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑÑÑнÑнÑ",
"cannotlink-no-provider": "ÐÑма ÑаÑ
ÑÐ½ÐºÐ°Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑÑÑнÑнÑ.",
"linkaccounts": "ÐалÑÑÑнÑне ÑаÑ
ÑнкаÑ",
- "linkaccounts-success-text": "РаÑ
Ñнак бÑÑ Ð´Ð°Ð»ÑÑанÑ."
+ "linkaccounts-success-text": "РаÑ
Ñнак бÑÑ Ð´Ð°Ð»ÑÑанÑ.",
+ "linkaccounts-submit": "ÐалÑÑÑÑÑ ÑаÑ
ÑнкÑ"
}
diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json
index 6812863793..77d0083942 100644
--- a/languages/i18n/bn.json
+++ b/languages/i18n/bn.json
@@ -71,6 +71,7 @@
"tog-watchlisthideminor": "à¦
নà§à¦²à§à¦²à§à¦à§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦à§à¦²à§ নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ লà§à¦à¦¿à¦¯à¦¼à§ রাà¦à¦¾ হà§à¦",
"tog-watchlisthideliu": "à¦
à§à¦¯à¦¾à¦à¦¾à¦à¦¨à§à¦à§ পà§à¦°à¦¬à§à¦¶à¦à§à¦¤ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦à¦¾à¦°à§à¦¦à§à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦à§à¦²à¦¿ নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ লà§à¦à¦¿à¦¯à¦¼à§ রাà¦à¦¾ হà§à¦",
"tog-watchlistreloadautomatically": "পà§à¦°à¦¤à¦¿à¦¬à¦¾à¦° à¦à¦à¦à¦¿ à¦à¦¾à¦à¦à¦¨à¦¿ পরিবরà§à¦¤à¦¨ হà¦à¦¯à¦¼à¦¾ মাতà§à¦°à¦ সà§à¦¬à¦¯à¦¼à¦à¦à§à¦°à¦¿à¦¯à¦¼à¦à¦¾à¦¬à§ নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦à¦¿ পà§à¦¨à¦à¦²à§à¦¡ à¦à¦°à¦¾ হà§à¦ (à¦à¦¾à¦à¦¾à¦¸à§à¦à§à¦°à¦¿à¦ªà§à¦ পà§à¦°à¦¯à¦¼à§à¦à¦¨)",
+ "tog-watchlistunwatchlinks": "নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦° à¦à§à¦à§à¦¤à¦¿à¦¤à§ সরাসরি দà§à¦à¦¾/না দà§à¦à¦¾à¦° সà¦à¦¯à§à¦ যà§à¦à§à¦¤ à¦à¦°à§à¦¨ (à¦à¦ à¦à¦¾à¦°à§à¦¯à¦à¦¾à¦°à¦¿à¦¤à¦¾ à¦à¦¨à§à¦¯ à¦à¦¾à¦à¦¾à¦¸à§à¦à§à¦°à¦¿à¦ªà§à¦ পà§à¦°à¦¯à¦¼à§à¦à¦¨)",
"tog-watchlisthideanons": "বà§à¦¨à¦¾à¦®à§ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦à¦¾à¦°à§à¦¦à§à¦° সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦à§à¦²à¦¿ নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ à¦à¦¡à¦¼à¦¾à¦²à§ রাà¦à¦¾ হà§à¦",
"tog-watchlisthidepatrolled": "পরà§à¦à§à¦·à¦¿à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦à§à¦²à¦¿ নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ লà§à¦à¦¿à¦¯à¦¼à§ রাà¦à¦¾ হà§à¦",
"tog-watchlisthidecategorization": "পাতার শà§à¦°à§à¦£à§à¦¬à¦¦à§à¦§à¦à¦°à¦£ লà§à¦à¦¿à¦¯à¦¼à§ রাà¦à¦¾ হà§à¦",
@@ -721,7 +722,7 @@
"permissionserrorstext-withaction": "à¦à¦ªà¦¨à¦¾à¦° $2 à¦
নà§à¦®à¦¤à¦¿ নà§à¦, যার {{PLURAL:$1|à¦à¦¾à¦°à¦£à¦à¦¿|à¦à¦¾à¦°à¦£à¦à§à¦²à¦¿}} হল:",
"contentmodelediterror": "à¦à¦ªà¦¨à¦¿ à¦à¦ পà§à¦¨à¦°à§à¦¬à¦¿à¦¬à§à¦à¦¨à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ à¦à¦°à¦¤à§ পারবà§à¦¨ না à¦à¦¾à¦°à¦£ à¦à¦° বিষয়বসà§à¦¤à§ মডà§à¦² $1
, যা বরà§à¦¤à¦®à¦¾à¦¨ বিষয়বসà§à¦¤à§ মডà§à¦² $2
-à¦à¦° থà§à¦à§ à¦à¦¿à¦¨à§à¦¨à¥¤",
"recreate-moveddeleted-warn": "'''সতরà§à¦à§à¦à¦°à¦£: à¦à¦ªà¦¨à¦¿ à¦à¦®à¦¨ à¦à¦à¦à¦¿ পাতা পà§à¦¨à¦°à¦¾à¦¯à¦¼ তà§à¦°à¦¿ à¦à¦°à¦à§à¦¨ যা পà§à¦°à§à¦¬à§ à¦
পসারণ à¦à¦°à¦¾ হয়à§à¦à¦¿à¦²à¥¤'''\n\nà¦à¦ªà¦¨à¦¿ পাতাà¦à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ à¦à¦¾à¦²à¦¿à¦¯à¦¼à§ যাà¦à¦¯à¦¼à¦¾ ঠিঠহবৠà¦à¦¿à¦¨à¦¾, তা বিবà§à¦à¦¨à¦¾ à¦à¦°à§à¦¨à¥¤\nà¦à¦ªà¦¨à¦¾à¦° সà§à¦¬à¦¿à¦§à¦¾à¦°à§à¦¥à§ পাতাà¦à¦¿à¦° à¦
পলà§à¦ªà§à¦¤à¦¿ লঠà¦à¦à¦¾à¦¨à§ দà§à¦¯à¦¼à¦¾ হলà§:",
- "moveddeleted-notice": "à¦à¦ পাতাà¦à¦¿ à¦
পসারণ à¦à¦°à¦¾ হয়à§à¦à§à¥¤\nসà§à¦¤à§à¦° হিসà§à¦¬à§ নিà¦à§ ঠপাতার à¦
বলà§à¦ªà§à¦¤à¦¿ লঠদà§à¦à¦¯à¦¼à¦¾ হলà§à¥¤",
+ "moveddeleted-notice": "à¦à¦ পাতাà¦à¦¿ à¦
পসারণ à¦à¦°à¦¾ হয়à§à¦à§à¥¤\nসà§à¦¤à§à¦° হিসà§à¦¬à§ নিà¦à§ à¦à¦ পাতার à¦
পসারণ, সà§à¦°à¦à§à¦·à¦¾ ঠসà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° লঠদà§à¦à¦¯à¦¼à¦¾ হলà§à¥¤",
"moveddeleted-notice-recent": "দà§à¦à¦à¦¿à¦¤, à¦à¦ পাতাà¦à¦¿ সামà§à¦ªà§à¦°à¦¤à¦¿ à¦
পসারিত হয়à§à¦à§ (সরà§à¦¬à¦¶à§à¦· ২৪ à¦à¦£à§à¦à¦¾à¦¯à¦¼)।\nসà§à¦¤à§à¦° হিসà§à¦¬à§ নিà¦à§ à¦à¦ পাতা à¦
পসারণ, সà§à¦°à¦à§à¦·à¦¾ ঠসà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° লঠদà§à¦¯à¦¼à¦¾ হয়à§à¦à§à¥¤",
"log-fulllog": "সমà§à¦ªà§à¦°à§à¦£ লঠদà§à¦à§à¦¨",
"edit-hook-aborted": "হà§à¦ দà§à¦¬à¦¾à¦°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পরিতà§à¦¯à¦à§à¦¤ হয়à§à¦à§à¥¤\nà¦à¦° à¦à§à¦¨ বà§à¦¯à¦¾à¦à§à¦¯à¦¾ নাà¦à¥¤",
@@ -1330,6 +1331,7 @@
"rcfilters-savedqueries-new-name-label": "নাম",
"rcfilters-savedqueries-new-name-placeholder": "à¦à¦¾à¦à¦à¦¨à¦¿à¦° à¦à¦¦à§à¦¦à§à¦¶à§à¦¯ বরà§à¦£à¦¨à¦¾ à¦à¦°à§à¦¨",
"rcfilters-savedqueries-apply-label": "à¦à¦¾à¦à¦à¦¨à¦¿ তà§à¦°à¦¿ à¦à¦°à§à¦¨",
+ "rcfilters-savedqueries-apply-and-setdefault-label": "পà§à¦°à§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿ তà§à¦°à¦¿ à¦à¦°à§à¦¨",
"rcfilters-savedqueries-cancel-label": "বাতিল",
"rcfilters-savedqueries-add-new-title": "বরà§à¦¤à¦®à¦¾à¦¨ à¦à¦¾à¦à¦à¦¨à¦¿à¦° সà§à¦à¦¿à¦ সà¦à¦°à¦à§à¦·à¦£ à¦à¦°à§à¦¨",
"rcfilters-restore-default-filters": "পà§à¦°à§à¦¬à¦¨à¦¿à¦°à§à¦§à¦¾à¦°à¦¿à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿ পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° à¦à¦°à§à¦¨",
@@ -1347,7 +1349,7 @@
"rcfilters-filterlist-noresults": "à¦à§à¦¨à¦ à¦à¦¾à¦à¦à¦¨à¦¿ পাà¦à¦¯à¦¼à¦¾ যায়নি",
"rcfilters-noresults-conflict": "à¦à§à¦¨à¦ ফলাফল পাà¦à¦¯à¦¼à¦¾ যায়নি à¦à¦¾à¦°à¦£ à¦
নà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§à¦° মাপà¦à¦¾à¦ িà¦à§à¦²à¦¿à¦° মধà§à¦¯à§ সà¦à¦à¦°à§à¦· à¦à¦à§",
"rcfilters-state-message-subset": "à¦à¦ à¦à¦¾à¦à¦à¦¨à¦¿à¦à¦¿à¦° à¦à§à¦¨ পà§à¦°à¦à¦¾à¦¬ নà§à¦ à¦à¦¾à¦°à¦£ à¦à¦° ফলাফলà¦à§à¦²à¦¿ নিমà§à¦¨à§à¦à§à¦¤ বà§à¦¹à¦¤à§à¦¤à¦° পরিধির {{PLURAL:$2|à¦à¦¾à¦à¦à¦¨à¦¿à¦à¦¿à¦°|à¦à¦¾à¦à¦à¦¨à¦¿à¦à§à¦²à¦¿à¦°}} মধà§à¦¯à§ à¦
নà§à¦¤à¦°à§à¦à§à¦à§à¦¤ à¦à¦à§ (à¦à¦²à§à¦à¦ªà¦¾à¦¤ à¦à¦°à§ à¦à¦à¦¿à¦à§ à¦à¦²à¦¾à¦¦à¦¾ à¦à¦°à§ দà§à¦à¦¾à¦° à¦à§à¦·à§à¦à¦¾ à¦à¦°à§à¦¨): $1",
- "rcfilters-state-message-fullcoverage": "à¦à§à¦¨ দলà§à¦° সমসà§à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿ নিরà§à¦¬à¦¾à¦à¦¨ à¦à¦°à¦¾ à¦à¦¬à¦ à¦à§à¦¨ à¦à¦¾à¦à¦à¦¨à¦¿à¦ নিরà§à¦¬à¦¾à¦à¦¨ না à¦à¦°à¦¾ à¦à¦à¦ à¦à¦¥à¦¾, তাঠà¦à¦ à¦à¦¾à¦à¦à¦¨à¦¿à¦à¦¿à¦° à¦à§à¦¨ পà§à¦°à¦à¦¾à¦¬ নà§à¦à¥¤ à¦à¦ দলৠà¦
নà§à¦¤à¦°à§à¦à§à¦à§à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿à¦à§à¦²à¦¿ হল: $1",
+ "rcfilters-state-message-fullcoverage": "à¦à¦ দলà§à¦° সমসà§à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿ নিরà§à¦¬à¦¾à¦à¦¨ à¦à¦°à¦¾, না à¦à¦°à¦¾ à¦à¦à¦ à¦à¦¥à¦¾, তাঠà¦à¦ à¦à¦¾à¦à¦à¦¨à¦¿à¦à¦¿à¦° à¦à§à¦¨ পà§à¦°à¦à¦¾à¦¬ নà§à¦à¥¤ à¦à¦ দলৠà¦
নà§à¦¤à¦°à§à¦à§à¦à§à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿à¦à§à¦²à¦¿ হল: $1",
"rcfilters-filtergroup-authorship": "à¦à¦¾à¦° দà§à¦¬à¦¾à¦°à¦¾ পরিবরà§à¦¤à¦¿à¦¤",
"rcfilters-filter-editsbyself-label": "à¦à¦ªà¦¨à¦¾à¦° দà§à¦¬à¦¾à¦°à¦¾ পরিবরà§à¦¤à¦¿à¦¤",
"rcfilters-filter-editsbyself-description": "à¦à¦ªà¦¨à¦¾à¦° নিà¦à¦¸à§à¦¬ à¦
বদান।",
@@ -1387,6 +1389,8 @@
"rcfilters-filter-watchlist-notwatched-label": "নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦à§à¦à§à¦¤ নয়",
"rcfilters-filter-watchlist-notwatched-description": "à¦à¦ªà¦¨à¦¾à¦° নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ থাà¦à¦¾ পাতাà¦à§à¦²à¦¿ বà§à¦¯à¦¤à§à¦¯à¦¼ সবà¦à¦¿à¦à§à¥¤",
"rcfilters-filtergroup-watchlistactivity": "নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦° à¦à¦¾à¦°à§à¦¯à¦à§à¦°à¦®",
+ "rcfilters-filter-watchlistactivity-unseen-label": "à¦
দà§à¦à¦¾ পরিবরà§à¦¤à¦¨",
+ "rcfilters-filter-watchlistactivity-seen-label": "দà§à¦à¦¾ পরিবরà§à¦¤à¦¨",
"rcfilters-filtergroup-changetype": "পরিবরà§à¦¤à¦¨à§à¦° ধরন",
"rcfilters-filter-pageedits-label": "পাতার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾",
"rcfilters-filter-pageedits-description": "à¦à¦à¦à¦¿ বিষয়বসà§à¦¤à§, à¦à¦²à§à¦à¦¨à¦¾, বিষয়শà§à¦°à§à¦£à§à¦° বিবরণ... à¦à¦¤à§à¦¯à¦¾à¦¦à¦¿à¦¤à§ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾",
@@ -1408,10 +1412,12 @@
"rcfilters-tag-prefix-namespace-inverted": "$1 :নয় ",
"rcfilters-view-advanced-filters-label": "à¦à¦¨à§à¦¨à¦¤ à¦à¦¾à¦à¦à¦¨à¦¿",
"rcfilters-view-tags": "à¦à§à¦¯à¦¾à¦à¦à§à¦¤ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾",
+ "rcfilters-view-namespaces-tooltip": "নামসà§à¦¥à¦¾à¦¨ à¦
নà§à¦¯à¦¾à¦¯à¦¼à§ ফলাফল à¦à¦¾à¦à¦à§à¦¨",
"rcfilters-view-tags-tooltip": "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ à¦à§à¦¯à¦¾à¦ বà§à¦¯à¦¬à¦¹à¦¾à¦° à¦à¦°à§ ফলাফল à¦à¦¾à¦à¦à§à¦¨",
"rcfilters-view-return-to-default-tooltip": "মà§à¦² à¦à¦¾à¦à¦à¦¨à¦¿à¦° মà§à¦¨à§à¦¤à§ ফিরà§à¦¨",
"rcfilters-liveupdates-button": "সরাসরি হালনাà¦à¦¾à¦¦",
"rcfilters-liveupdates-button-title-on": "সরাসরি হালনাà¦à¦¾à¦¦ বনà§à¦§ à¦à¦°à§à¦¨",
+ "rcfilters-watchlist-markseen-button": "দà§à¦à¦¾ হিসাবৠসব পরিবরà§à¦¤à¦¨ à¦à¦¿à¦¹à§à¦¨à¦¿à¦¤ à¦à¦°à§à¦¨",
"rcnotefrom": "$2 à¦à¦¾ থà§à¦à§ সà¦à¦à¦à¦¿à¦¤ পরিবরà§à¦¤à¦¨à¦à§à¦²à¦¿ (সরà§à¦¬à§à¦à§à¦ $1à¦à¦¿ দà§à¦à¦¾à¦¨à§ হয়à§à¦à§)।",
"rclistfromreset": "তারিঠনিরà§à¦¬à¦¾à¦à¦¨ পà§à¦¨à¦à¦¸à§à¦¥à¦¾à¦ªà¦¨ à¦à¦°à§à¦¨",
"rclistfrom": "$2, $3 তারিà¦à§à¦° পর সà¦à¦à¦à¦¿à¦¤ নতà§à¦¨ পরিবরà§à¦¤à¦¨à¦à§à¦²à§ দà§à¦à¦¾à¦",
@@ -2094,7 +2100,7 @@
"unwatchthispage": "নà¦à¦° সরিয়ৠনিন",
"notanarticle": "বিষয়বসà§à¦¤à§ পাতা নয়",
"notvisiblerev": "à¦
পর à¦à¦à¦à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦à¦¾à¦°à§ à¦à¦°à§à¦¤à§à¦ পà§à¦°à¦£à§à¦¤ সরà§à¦¬à¦¶à§à¦· সà¦à¦¸à§à¦à¦°à¦£à¦à¦¿ à¦
পসারিত হয়à§à¦à§",
- "watchlist-details": "à¦à¦ªà¦¨à¦¾à¦° নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¤à§ {{PLURAL:$1|$1à¦à¦¿ পাতা}} à¦à¦à§ (à¦à¦²à¦¾à¦ª পাতাà¦à§à¦²à¦¿ à¦à¦£à¦¨à¦¾à¦¯à¦¼ না ধরà§)।",
+ "watchlist-details": "à¦à¦ªà¦¨à¦¾à¦° নà¦à¦°à¦¤à¦¾à¦²à¦¿à¦à¦¾à¦¯à¦¼ {{PLURAL:$1|$1à¦à¦¿ পাতা}} à¦à¦à§ (à¦à¦²à¦¾à¦ª পাতাসহ)।",
"wlheader-enotif": "à¦à¦®à§à¦² বিà¦à§à¦à¦ªà§à¦¤à¦¿ সà¦à§à¦°à¦¿à¦¯à¦¼ à¦à¦°à¦¾ à¦à¦à§à¥¤",
"wlheader-showupdated": "à¦à¦ªà¦¨à¦¾à¦° শà§à¦· à¦à¦à¦®à¦¨à§à¦° পর থà§à¦à§ যà§à¦¸à¦¬ পাতায় পরিবরà§à¦¤à¦¨ হয়à§à¦à§ সà§à¦à§à¦²à¦¿ '''à¦à¦¾à¦¢à¦¼''' à¦à¦°à§ দà§à¦à¦¾à¦¨à§ হয়à§à¦à§à¥¤",
"wlnote": "নিà¦à§ $3, $4 তারিঠথà§à¦à§ বিà¦à¦¤ {{PLURAL:$2|১ à¦à¦¨à§à¦à¦¾à¦¯à¦¼|$2 à¦à¦¨à§à¦à¦¾à¦¯à¦¼}} সà¦à¦à¦à¦¿à¦¤ {{PLURAL:$1|শà§à¦· ১à¦à¦¿ পরিবরà§à¦¤à¦¨|শà§à¦· $1à¦à¦¿ পরিবরà§à¦¤à¦¨}} দà§à¦à¦¾à¦¨à§ হল।",
@@ -3575,6 +3581,9 @@
"compare-title-not-exists": "à¦à¦ªà¦¨à¦¾à¦° à¦à¦¾à¦à§à¦à§à¦·à¦¿à¦¤ শিরà§à¦¨à¦¾à¦®à¦à¦¿ নà§à¦à¥¤",
"compare-revision-not-exists": "à¦à¦ªà¦¨à¦¾à¦° à¦à¦¾à¦à§à¦à§à¦·à¦¿à¦¤ সà¦à¦¸à§à¦à¦°à¦£à¦à¦¿ নà§à¦à¥¤",
"diff-form": "পারà§à¦¥à¦à§à¦¯",
+ "diff-form-submit": "পারà§à¦¥à¦à§à¦¯ দà§à¦à¦¾à¦¨",
+ "permanentlink": "সà§à¦¥à¦¾à¦¯à¦¼à§ সà¦à¦¯à§à¦",
+ "permanentlink-revid": "সà¦à¦¶à§à¦§à¦¨ à¦à¦à¦¡à¦¿",
"permanentlink-submit": "à¦à¦ সà¦à¦¶à§à¦§à¦¨à§ যান",
"dberr-problems": " দà§à¦à¦à¦¿à¦¤! à¦à¦ সাà¦à¦à¦à¦¿ বরà§à¦¤à¦®à¦¾à¦¨à§ à¦à¦¾à¦°à§à¦à¦°à§ à¦
সà§à¦¬à¦¿à¦§à¦¾à¦° মà§à¦à§à¦®à§à¦à¦¿ হয়à§à¦à§à¥¤",
"dberr-again": "à¦à¦¯à¦¼à§à¦ মিনিঠপর পà§à¦¨à¦°à¦¾à¦¯à¦¼ পরিদরà§à¦¶à¦¨à§à¦° à¦à§à¦·à§à¦à¦¾ à¦à¦°à§à¦¨à¥¤",
@@ -3984,5 +3993,6 @@
"undelete-cantedit": "à¦à¦ªà¦¨à¦¿ à¦à¦ পাতাà¦à¦¿ ফিরিয়ৠà¦à¦¨à¦¤à§ পারবà§à¦¨ না à¦à¦¾à¦°à¦£ à¦à¦ªà¦¨à¦¾à¦° à¦à¦ পাতাà¦à¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ à¦à¦°à¦¾à¦° à¦
নà§à¦®à¦¤à¦¿ নà§à¦à¥¤",
"undelete-cantcreate": "à¦à¦ªà¦¨à¦¿ à¦à¦ পাতাà¦à¦¿ ফিরিয়ৠà¦à¦¨à¦¤à§ পারবà§à¦¨ না à¦à¦¾à¦°à¦£ à¦à¦ নামৠà¦à§à¦¨ পাতা বিদà§à¦¯à¦®à¦¾à¦¨ নà§à¦ ঠà¦à¦ªà¦¨à¦¾à¦° à¦à¦ পাতাà¦à¦¿ তà§à¦°à¦¿ à¦à¦°à¦¾à¦° à¦
নà§à¦®à¦¤à¦¿ নà§à¦à¥¤",
"pagedata-title": "পাতার à¦à¦ªà¦¾à¦¤à§à¦¤",
+ "pagedata-not-acceptable": "à¦à§à¦¨ মিলৠযাà¦à¦¯à¦¼à¦¾ বিনà§à¦¯à¦¾à¦¸ পাà¦à¦¯à¦¼à¦¾ যায় নি। সমরà§à¦¥à¦¿à¦¤ MIME ধরনà¦à§à¦²à¦¿ হল: $1",
"pagedata-bad-title": "à¦
পà§à¦°à¦¯à§à¦à§à¦¯ শিরà§à¦¨à¦¾à¦®: \"$1\""
}
diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json
index d99bf55b7d..b53395e50b 100644
--- a/languages/i18n/ca.json
+++ b/languages/i18n/ca.json
@@ -56,7 +56,8 @@
"Jaumeortola",
"Kippelboy",
"Syum90",
- "Xð"
+ "Xð",
+ "Abella"
]
},
"tog-underline": "Subratlla els enllaços:",
@@ -183,9 +184,9 @@
"hidden-category-category": "Categories ocultes",
"category-subcat-count": "{{PLURAL:$2|Aquesta categoria només té la següent subcategoria.|Aquesta categoria conté {{PLURAL:$1|la següent subcategoria|les següents $1 subcategories}}, d'un total de $2.}}",
"category-subcat-count-limited": "Aquesta categoria conté {{PLURAL:$1|la següent subcategoria|les següents $1 subcategories}}.",
- "category-article-count": "{{PLURAL:$2|Aquesta categoria només té la pà gina següent.|{{PLURAL:$1|La pà gina següent és|Les $1 pà gines següents són}} dins dâaquesta categoria, dâun total de $2.}}",
+ "category-article-count": "{{PLURAL:$2|Aquesta categoria només conté la pà gina següent.|{{PLURAL:$1|La pà gina és|Les $1 pà gines són}} dins d'aquesta categoria, d'un total de $2.}}",
"category-article-count-limited": "{{PLURAL:$1|La següent pà gina és|Les següents $1 pà gines són}} dins la categoria actual.",
- "category-file-count": "{{PLURAL:$2|Aquesta categoria només té el fitxer següent.|{{PLURAL:$1|El fitxer següent és|Els $1 fitxers següents són}} dins dâaquesta categoria, dâun total de $2.}}",
+ "category-file-count": "{{PLURAL:$2|Aquesta categoria només conté el fitxer següent.|{{PLURAL:$1|El fitxer és|Els $1 fitxers són}} dins d'aquesta categoria, d'un total de $2.}}",
"category-file-count-limited": "{{PLURAL:$1|El següent fitxer és|Els següents $1 fitxers són}} dins la categoria actual.",
"listingcontinuesabbrev": " cont.",
"index-category": "PÃ gines indexades",
@@ -252,14 +253,14 @@
"viewhelppage": "Visualitza la pà gina d'ajuda",
"categorypage": "Visualitza la pà gina de la categoria",
"viewtalkpage": "Visualitza la pà gina de discussió",
- "otherlanguages": "En altres llengües",
+ "otherlanguages": "En altres idiomes",
"redirectedfrom": "(S'ha redirigit des de: $1)",
"redirectpagesub": "Pà gina de redirecció",
"redirectto": "Redirigeix a:",
"lastmodifiedat": "La pà gina va ser modificada per darrera vegada el $1 a les $2.",
"viewcount": "S'ha visitat aquesta pà gina {{PLURAL:$1|una vegada|$1 vegades}}.",
"protectedpage": "PÃ gina protegida",
- "jumpto": "Dreceres rà pides:",
+ "jumpto": "Salta a:",
"jumptonavigation": "navegació",
"jumptosearch": "cerca",
"view-pool-error": "Disculpeu, els servidors es troben sobrecarregats.\nMassa usuaris estan tractant d'accedir a aquesta pà gina.\nPer favor, esperau una mica abans de tornar a accedir a aquesta pà gina.\n\n$1",
@@ -270,13 +271,13 @@
"pool-servererror": "El servei de recompte de la reserva no és disponible ($1).",
"poolcounter-usage-error": "Error d'ús: $1",
"aboutsite": "Quant al projecte {{SITENAME}}",
- "aboutpage": "Project:Quant a",
+ "aboutpage": "Project:Quant al",
"copyright": "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
"copyrightpage": "{{ns:project}}:Drets d'autor",
"currentevents": "Actualitat",
"currentevents-url": "Project:Actualitat",
- "disclaimers": "AvÃs general",
- "disclaimerpage": "Project:AvÃs general",
+ "disclaimers": "Renúncies",
+ "disclaimerpage": "Project:Descà rrec general",
"edithelp": "Ajuda per a l'edició",
"helppage-top-gethelp": "Ajuda",
"mainpage": "PÃ gina principal",
@@ -323,7 +324,7 @@
"feed-invalid": "La subscripció no és và lida pel tipus de sindicament.",
"feed-unavailable": "Els canals de sindicació no estan disponibles",
"site-rss-feed": "Canal RSS $1",
- "site-atom-feed": "Canal Atom $1",
+ "site-atom-feed": "Font Atom $1",
"page-rss-feed": "«$1» RSS Feed",
"page-atom-feed": "Canal Atom «$1»",
"feed-atom": "Atom",
@@ -1475,7 +1476,7 @@
"recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
"recentchanges-page-removed-from-category-bundled": "[[:$1]] treta de la categoria, [[Special:WhatLinksHere/$1|aquesta pà gina està inclosa en d'altres]]",
"autochange-username": "Canvi automà tic del MediaWiki",
- "upload": "Carregueu un fitxer",
+ "upload": "Pujar un fitxer",
"uploadbtn": "Carrega un fitxer",
"reuploaddesc": "Torna al formulari per apujar.",
"upload-tryagain": "Envia la descripció del fitxer modificat",
@@ -2633,7 +2634,7 @@
"tooltip-pt-login": "Us animem a registrar-vos, però no és obligatori",
"tooltip-pt-login-private": "Cal que inicieu una sessió per a utilitzar aquest wiki",
"tooltip-pt-logout": "Finalitza la sessió d'usuari",
- "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu sessió, encara que no és obligatori",
+ "tooltip-pt-createaccount": "Us animem a què creeu un compte i inicieu una sessió, encara que no és obligatori",
"tooltip-ca-talk": "Discussió sobre el contingut d'aquesta pà gina",
"tooltip-ca-edit": "Modifica aquesta pà gina",
"tooltip-ca-addsection": "Comença una secció nova",
@@ -2651,21 +2652,21 @@
"tooltip-search-fulltext": "Cerca aquest text a les pà gines",
"tooltip-p-logo": "Visiteu la pà gina principal",
"tooltip-n-mainpage": "Visiteu la pà gina principal",
- "tooltip-n-mainpage-description": "Vegeu la pà gina principal",
- "tooltip-n-portal": "Sobre el projecte, què podeu fer, on podeu trobar coses",
+ "tooltip-n-mainpage-description": "Visiteu la pà gina principal",
+ "tooltip-n-portal": "Sobre el projecte, què podeu fer, on trobareu les coses",
"tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat",
- "tooltip-n-recentchanges": "Llista de canvis recents al wiki",
+ "tooltip-n-recentchanges": "Una llista dels canvis recents al wiki",
"tooltip-n-randompage": "Carrega una pà gina a lâatzar",
- "tooltip-n-help": "El lloc per saber més coses",
- "tooltip-t-whatlinkshere": "Llista de totes les pà gines wiki que enllacen aquÃ",
+ "tooltip-n-help": "El lloc per a saber més coses",
+ "tooltip-t-whatlinkshere": "Una llista de totes les pà gines wiki que enllacen amb aquesta",
"tooltip-t-recentchangeslinked": "Canvis recents a pà gines enllaçades des d'aquesta pà gina",
"tooltip-feed-rss": "Canal RSS d'aquesta pà gina",
"tooltip-feed-atom": "Canal Atom d'aquesta pà gina",
"tooltip-t-contributions": "Llista de les contribucions d'{{GENDER:$1|aquest usuari|aquesta usuà ria}}",
"tooltip-t-emailuser": "Envia un correu a {{GENDER:$1|aquest usuari|aquesta usuà ria}}",
"tooltip-t-info": "Més informació sobre aquesta pà gina",
- "tooltip-t-upload": "Carregueu fitxers",
- "tooltip-t-specialpages": "Llista de totes les pà gines especials",
+ "tooltip-t-upload": "Pujar alguns fitxers",
+ "tooltip-t-specialpages": "Llista totes les pà gines especials",
"tooltip-t-print": "Versió per a impressió d'aquesta pà gina",
"tooltip-t-permalink": "Enllaç permanent a aquesta versió de la pà gina",
"tooltip-ca-nstab-main": "Vegeu el contingut de la pà gina",
diff --git a/languages/i18n/csb.json b/languages/i18n/csb.json
index c66fdf9f56..405e14fb2b 100644
--- a/languages/i18n/csb.json
+++ b/languages/i18n/csb.json
@@ -844,7 +844,7 @@
"unwatch": "Ãprzestôj ùzerac",
"unwatchthispage": "Ãprzestôj ùzerac nÄ
starnã",
"notanarticle": "To nie je artikel",
- "watchlist-details": "Twòjô lësta ùzérónych starnów zamëkô w se {{PLURAL:$1|$1 pozycjã|$1 pozycje|$1 pozycjów}}, nie rechùjÄ
c diskùsëjów.",
+ "watchlist-details": "{{PLURAL:$1|Starna je |$1 Starnë sÄ
}} na twòji lësce ùzérónych starnów (diskùsëji téż)",
"wlheader-showupdated": "Artiklë jakczé òstaÅë zmienioné òd Twòji slédny wizytë sÄ
wëapratnioné pògrëbieniém ",
"wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédnÄ
zmianã|$1 slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|$2 gòdzënë/gòdzënów}}, rëchùjÄ
c òd $3 dnia $4.",
"wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
diff --git a/languages/i18n/de.json b/languages/i18n/de.json
index e0a83eb176..162c4c2a0b 100644
--- a/languages/i18n/de.json
+++ b/languages/i18n/de.json
@@ -818,6 +818,7 @@
"parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]",
"template-loop-category": "Seiten mit Vorlagenschleifen",
"template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z. B. eine Vorlage, die sich selbst rekursiv aufruft.",
+ "template-loop-warning": "Warnung: Diese Seite ruft [[:$1]] auf, die eine Vorlagenschleife verursacht (ein unendlicher rekursiver Aufruf).",
"parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
"language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
"node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
@@ -1485,6 +1486,8 @@
"rcfilters-watchlist-markseen-button": "Alle Ãnderungen als gesehen markieren",
"rcfilters-watchlist-edit-watchlist-button": "Deine Liste der beobachteten Seiten bearbeiten",
"rcfilters-watchlist-showupdated": "Ãnderungen an Seiten, die du seit ihrem Auftreten nicht besucht hast, sind fett markiert.",
+ "rcfilters-preference-label": "Die verbesserte Version der Letzten Ãnderungen ausblenden",
+ "rcfilters-preference-help": "Macht die Neugestaltung der Oberfläche aus dem Jahr 2017 und alle seitdem hinzugefügten Werkzeuge wieder rückgängig.",
"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.",
diff --git a/languages/i18n/en.json b/languages/i18n/en.json
index 4b01132e37..5dd83453af 100644
--- a/languages/i18n/en.json
+++ b/languages/i18n/en.json
@@ -779,6 +779,7 @@
"parser-template-loop-warning": "Template loop detected: [[$1]]",
"template-loop-category": "Pages with template loops",
"template-loop-category-desc": "The page contains a template loop, ie. a template which calls itself recursively.",
+ "template-loop-warning": "Warning: This page calls [[:$1]] which causes a template loop (an infinite recursive call).",
"parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
"language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
"node-count-exceeded-category": "Pages where node count is exceeded",
@@ -1471,6 +1472,8 @@
"rcfilters-watchlist-markseen-button": "Mark all changes as seen",
"rcfilters-watchlist-edit-watchlist-button": "Edit your list of watched pages",
"rcfilters-watchlist-showupdated": "Changes to pages you haven't visited since the changes occurred are in bold , with solid markers.",
+ "rcfilters-preference-label": "Hide the improved version of Recent Changes",
+ "rcfilters-preference-help": "Rolls back the 2017 interface redesign and all tools added then and since.",
"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",
diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json
index f6242e3832..9493dd490d 100644
--- a/languages/i18n/fr.json
+++ b/languages/i18n/fr.json
@@ -894,6 +894,7 @@
"parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
"template-loop-category": "Pages avec des boucles de modèle",
"template-loop-category-desc": "La page contient une boucle dans le modèle, c.à .d. un modèle qui sâappelle lui-même récursivement.",
+ "template-loop-warning": "Avertissement : Cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif infini).",
"parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
"language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
"node-count-exceeded-category": "Pages dépassant le nombre de nÅuds maximal",
@@ -1561,6 +1562,8 @@
"rcfilters-watchlist-markseen-button": "Marquer toutes les modifications comme vues",
"rcfilters-watchlist-edit-watchlist-button": "Modifier votre liste de pages suivies",
"rcfilters-watchlist-showupdated": "Les modifications faites aux pages que vous nâavez pas visitées depuis quâelles ont été modifiées sont en gras , avec des balises unies.",
+ "rcfilters-preference-label": "Masquer la version améliorée des modifications récentes",
+ "rcfilters-preference-help": "Restitue la version 2017 de l'interface ainsi que de tous les outils ajoutés alors et depuis.",
"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",
@@ -2828,7 +2831,7 @@
"tooltip-t-contributions": "Voir la liste des contributions de {{GENDER:$1|cet utilisateur|cette utilisatrice}}",
"tooltip-t-emailuser": "Envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}",
"tooltip-t-info": "Plus dâinformation sur cette page",
- "tooltip-t-upload": "Importer des fichiers",
+ "tooltip-t-upload": "Téléverser des fichiers",
"tooltip-t-specialpages": "Liste de toutes les pages spéciales",
"tooltip-t-print": "Version imprimable de cette page",
"tooltip-t-permalink": "Adresse permanente de cette version de la page",
@@ -3086,7 +3089,7 @@
"exif-relatedsoundfile": "Fichier audio associé",
"exif-datetimeoriginal": "Date de la prise originelle",
"exif-datetimedigitized": "Date de la numérisation",
- "exif-subsectime": "Date de modification",
+ "exif-subsectime": "Date en fraction de seconde",
"exif-subsectimeoriginal": "Date de la prise originelle",
"exif-subsectimedigitized": "Date de la numérisation",
"exif-exposuretime": "Temps d'exposition",
diff --git a/languages/i18n/glk.json b/languages/i18n/glk.json
index d521606cf6..0cbdff40b8 100644
--- a/languages/i18n/glk.json
+++ b/languages/i18n/glk.json
@@ -348,6 +348,7 @@
"template-semiprotected": "(ÙÙÙ
٠بپأسÙ)",
"hiddencategories": "ا٠ÙÙÚ¯ {{PLURAL:$1|Ùکت٠جخÛت٠جرگÙ|$1 جخÛت٠جرگÙ}} Ù
ئ٠درÙ:",
"moveddeleted-notice": "ا٠ÙÙÚ¯ ØØ°ÙأبؤکÙ.\nØذ٠ؤ اÙÙتÙاÙË Ø³ÙاÙ٠ا٠ÙÙÚ¯Ë ÙÙسÙ٠ا٠بÛÙ ÙÛشؤ٠بدأکÙ.",
+ "content-model-wikitext": "ÙÙÚ©Ù-Ùؤت",
"viewpagelogs": "ا٠ÙÙÚ¯Ë Ø³ÙاÙÙ'Ù٠دئÙ",
"currentrev-asof": "ÙسأÙÙ ÙÛسخ٠تا $1",
"revisionasof": "ÙÛسخ٠$1",
@@ -356,10 +357,12 @@
"currentrevisionlink": "ÙسأÙÙ ÙÛسخÙÙ° ÙÛشؤ٠دأÙ",
"cur": "Ø£ÙؤÙ",
"last": "دأÙ
ÙØ´Ú©Ù",
+ "history-feed-title": "دÚÙÙÙاÚÙÙؤÙË ØªØ§Ø±ÙØ®ÚÙ",
"rev-deleted-user": "(کارگÙر٠ÙؤÙ
ØØ°Ùأبؤ)",
"rev-delundel": "ÙÛشؤ٠دأÙ/جÛØ®ÛساÙئÙ",
"revdelete-hide-user": "کارگÙر٠ÙؤÙ
/Ø¢Ù.Ù¾Ù",
"revdelete-reason-dropdown": "*ØØ°ÙË ÙرÙ
اÙ٠دÙÙÙؤÙ\n** ÚاکÛدÙØÙÙ ÙÙض Ú¯ÛدÙ\n** Ùظر Ùا اطÙاعات٠ک٠Ù
ؤÙاسب ÙÙÙ\n** کارگÙر٠ÙؤÙ
Ù Ú©Ù Ù
ؤÙاسب ÙÙÙ\n** اطÙاعات٠ک٠اÛÙË Ù
ئ٠تؤÙÙ
ت درÙ",
+ "mergelog": "ادغاÙ
Ë Ø³ÙاÙÙ",
"history-title": "\"$1\"Ë ÙاگرداÙ٠تارئخ",
"difference-title": "$1: ÙÛسخÙ'ÙË ØªØ¤ÙÙر",
"lineno": "Ø±Ú $1:",
@@ -426,6 +429,7 @@
"right-sendemail": "باخ٠کارگÙرؤÙ٠اÙÙ
Ù٠بخسأÙ",
"newuserlogpage": "کارگÙر ÚاگÛدÙË Ø³ÙاÙÙ",
"newuserlogpagetext": "ا٠Ùکت٠سÙاÙÙ' کارگÙر ÚاگÛدÙؤÙË Ø¬Ù",
+ "rightslog": "کارگÙØ±Ë Ø§Ø®ØªÙØ§Ø±Ø§ØªË Ø³ÙاÙÙ",
"action-edit": "ا٠ÙÙگ٠دÚÙÙÙاÚÙ٠بکÛÙ",
"action-createaccount": "ا٠کارگÙر٠ØÙساب٠ÚاکÛÙ",
"action-move-categorypages": "جرگ٠ÙÙگؤÙ٠جابجا Ú¯ÛدÙ",
@@ -469,6 +473,7 @@
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|کارگÙر}} Ù¾ÙÚ¯Ùر]",
"rc-change-size-new": "$1 {{PLURAL:$1|باÙت}} تغÙÙØ±Ë Ù¾Ø³Ù",
"recentchangeslinked": "Ù
ÛØ±ØªØ¨Ø·Ë ØªØºÙÙرؤÙ",
+ "recentchangeslinked-feed": "Ù
ÛØ±ØªØ¨Ø·Ë ØªØºÙÙرؤÙ",
"recentchangeslinked-toolbox": "Ù
ÛØ±ØªØ¨Ø·Ë ØªØºÙÙرؤÙ",
"recentchangeslinked-title": "\"$1\"Ë Ù
Ûرتبط تغÙÙرؤÙ",
"recentchangeslinked-summary": "ا٠جÙØ±Ø Ùکت٠ÙÙست٠تÙÙÙ٠بÙÙÙ٠آخر٠تغÙÙØ±Ø¤Ù Ø£Ø¬Ù Ø§Û ÙÙگؤÙË Ù
ئ٠ک٠ا٠ÙÙÚ¯Ë Ø¬Ù Ø®Ø§Ù Ø¨Ø¨Ø¤Ù (Ùا جرگÙÙ Ù
Ø¤Ø±Ø¯Ë ÙØ¸Ø±Ë Ø¬Ù). Ø§Û ÙÙگؤÙÙ Ú©Ù [[Special:Watchlist|Ø´ÙÙ
ئ٠پÙÚ¯Ùر٠ÙÙست]]Û±Ù
Ùئ٠دبÛÙ Ù¾ÛررÙÚ¯ ÙÛشؤ٠بدأبÛÙÙ.",
@@ -478,6 +483,7 @@
"upload-file-error-text": "Ùخت٠ØÙØ³Ø£Ù Ø¨Ø¤Ø¯Ø¨Û Ú©Ù Ø³Ø±ÙØ±Ë Ù
ئ٠Ùکت٠Ù
ؤÙÙت٠ÙاÙÙ ÚاگÛد٠بÛبÛÙØ Ø³Ø£Ø¨ بÛبؤ.\n\nÙکت٠[[Special:ListUsers/sysop|Ú©Ùا]] Ø£Ù
رأ تÙ
اس بگÙرÙÙ.",
"upload-misc-error-text": "جÙرأکشئÙË Ø²Ù
ØªØ Ùکت٠سأب بÛبؤ Ú©Ù Ù
Ø£ÙÛÙ
ÙÙÙ ÚÙسÙ.\nÙؤط٠بکÛÙÙ٠بÙÙÙ٠اÙÙترÙت٠ÙÛشؤÙÙ Ù
ؤعتبر ؤ دسÙأرس اÙس٠ؤ ÙÙدئ٠ØÙسأ٠بکÛÙÙÙ.\n\nØ£Ú¯Ù ÙÙدئ٠دÛرÛسأÙÛØ¨Ø¤Ø Ùکت٠[[Special:ListUsers/sysop|Ú©Ùا'Ù]] Ø£Ù
رأ تÙ
اس بگÙرÙÙ.",
"img-auth-accessdenied": "Ø´ÙÙ
ئ٠دسÙأرس ÙÙÙ",
+ "license": "جÙاز ÙؤÙ
Ù:",
"license-header": "جÙاز",
"license-nopreview": "(Ù¾Ùشادئ٠ئب٠ÙÙÚÙ ÙÙØ£)",
"listfiles-userdoesnotexist": "\"$1\" کارگÙر٠ØÙساب ثبت ÙÛبؤ.",
@@ -519,7 +525,10 @@
"suppress": "دÛØ®ÛساÙگرÙ",
"booksources": "Ú©ÙØªØ§Ø¨Ë Ø³Ø±Ø¨Ø³Ø¤Ù",
"booksources-search": "ÙاÙ
ج",
+ "specialloguserlabel": "Ù
ÛجرÙ:",
"log": "سÙاÙÙÙ°âÙ",
+ "all-logs-page": "ÙÙ
ت٠عÛÙ
ÛÙ
٠سÙاÙÙ'Ù",
+ "allpages": "ÙÙ
ت٠ÙÙگؤÙ",
"allarticles": "ÙÙ
ت٠ÙÙگؤÙ",
"allpagessubmit": "بÛØ´Û",
"categories": "جرگÙ'Ù",
@@ -538,6 +547,8 @@
"emailuser-title-target": "ا٠{{GENDER:$1|کارگÙرÙ}} اÙÙ
Ù٠بخسأÙ.",
"usermaildisabled": "ÙشأÙ٠کارگÙر ئب٠اÙÙ
Ù٠خسأÙئÙ.",
"usermaildisabledtext": "Ø´Ù
٠ا٠ÙÙÚ©Ù Ù
ئ٠Ù
ÙÙÙ٠باخ٠کارگÙرؤÙ٠اÙÙ
Ù٠بخسأÙÙÙ",
+ "usermessage-editor": "سÙستÙ
Ë Ù¾ÙغؤÙ
-رسؤÙ",
+ "watchlist": "Ù¾ÙÚ¯ÙتÙؤÙË ÙÙست",
"mywatchlist": "Ù¾ÙÚ¯ÙتÙؤÙË ÙÙست",
"watch": "Ù¾ÙÚ¯ÙتÙ",
"wlheader-enotif": "ÙØ£ÙØ¯Ø±Ë Ø§ÙÙ
Ù٠کار کؤÙÙ.",
@@ -547,6 +558,8 @@
"alreadyrolled": "ÙشأÙÙ [[:$1]]Ë Ø¢Ø®Ø±Ù Ø¯ÚÙÙÙاÚÙÙÙ Ú©Ù [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); بؤدÙØ Ù¾Ø³Ø§ÙگرداÙئÙØ Ø§ÙÙË Ù¾ÙØ´ÙØ ÙÚ© ÙÙر ÙاÙÙÙÙس٠دÚÙÙÙاÚÙÙ Ùا پساÙگردا٠بؤدÙ.\n\nÙÙÚ¯Ë Ø¢Ø®Ø±Ù Ø¯ÚÙÙÙاÚÙÙÙ [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) بؤدÙ.",
"protectlogpage": "پأسÙË Ø³ÙاÙÙ",
"protect-level-sysop": "ÙÙØ· Ú©Ùا'Ù",
+ "restriction-edit": "دÚÙÙÙاÚÙÙ",
+ "restriction-move": "جابجا Ú¯ÛدÙ",
"restriction-level-sysop": "ÙاÙÙ
بپأسÙ",
"undeletehistorynoadmin": "ا٠ÙÙÚ¯ ØØ°Ùأبؤ.\nا٠ÙÙÚ¯Ë ØØ°ÙأبؤÙË Ø¯ÙÙ٠باÙÙ Ø§Û Ú©Ø§Ø±Ú¯ÙرؤÙË ÙÛشؤÙÙ Ú©Ù ØØ°ÙË Ù¾Ùش٠ا٠ÙÙگ٠دÚÙÙÙاÚÙ٠بؤد٠بؤÙØ Ø¬Ùر٠ÙÙÚاÙË Ù
ئ٠بÙ
Ø£.\nا٠ØØ°Ùأبؤ دÚÙÙÙاÚÙÙؤÙË Ø£ØµÙË Ùؤت خاÙÙ Ú©Ùا'ÙË Ø¯Ø³ÙأرسÙ.",
"namespace": "ÙؤÙ
Ùضا:",
@@ -558,10 +571,16 @@
"contributions": "{{GENDER:$1|کارگÙر}}Ë Ù
ÛشارکتؤÙ",
"mycontris": "Ù
ÛشارکتؤÙ",
"anoncontribs": "Ù
ÛشارکتؤÙ",
+ "contribsub2": "{{GENDER:$3|$1}} ($2)Ë ÙÙسÙÙ",
+ "uctop": "(Ø£ÙؤÙË ÙÛسخÙ)",
"month": "ا٠Ù
ا٠Ù
ئ٠(ؤ دأÙ
ÙØ´Ú©):",
"year": "ا٠ساÙË Ù
ئ٠(ؤ دأÙ
ÙØ´Ú©):",
+ "sp-contributions-blocklog": "دبÛستÙË Ø³ÙاÙÙ'Ù",
"sp-contributions-uploads": "جؤرأکشئÙؤÙ",
+ "sp-contributions-logs": "سÙاÙÙÙ°âÙ",
"sp-contributions-talk": "گب",
+ "sp-contributions-search": "Ù
ÛشارکتؤÙË ÙاÙ
ج",
+ "sp-contributions-username": "Ø¢Ù-Ù¾ÙË Ø¢Ø¯Ø±Ø³ Ùا کارگÙر٠ÙؤÙ
:",
"sp-contributions-submit": "ÙاÙ
ج",
"whatlinkshere": "ÙرÚ٠خا٠ببؤ ائرÙ",
"whatlinkshere-title": "ÙÙگؤÙ٠گ٠«$1Â»Ë Ø£Ù
رأ خا٠دأÙÙ",
@@ -581,6 +600,7 @@
"contribslink": "ÙاÙرÙâئÙ",
"block-log-flags-nousertalk": "Ù
ÙÙÙ Ø®Û Ú¯Ø¨Ë ÙÙگ٠دÚÙÙÙاÚÙ٠بکÛÙÙ",
"block-log-flags-hiddenname": "دÛØ®ÛساÙئ٠کارگÙر٠ÙؤÙ
",
+ "proxyblocker": "پراکس٠دبÛستÙÚÙ",
"movecategorypage-warning": "اخظار: Ø´Ù
٠جرگ٠ÙÙگ٠جابجا کأدرÙÙ. Ø´ÙÙ
Ù ØÙاس بÙ
ؤÙÙ Ú©Ù ÙÙØ· ÙÙÚ¯ جابجا بÙ٠ؤ ÙÙگؤ٠ÙدÙÙ
٠جرگ٠Ù
ئ٠Ù
ؤÙ٠ؤ تاز٠جرگ٠Ù
ئ٠ÙØ´ÙÙ .",
"cant-move-category-page": "Ø´Ù
٠اجاز٠ÙدأÙÙ٠جرگÙÙ°âÙË ÙÙگ٠جابجا بکÛÙÙÙ.",
"cant-move-to-category-page": "Ø´Ù
٠اÙجاز٠ÙدأÙÙÙ Ùکت٠ÙÙگ٠ببرÙÙ Ùکت٠جرگ٠ÙÙÚ¯Ë Ù
ئÙ.",
@@ -637,11 +657,22 @@
"tooltip-summary": "ÙÙÚاÙس٠Ùارد بکÛÙÙÙ",
"pageinfo-header-edits": "تارÙØ®ÚÙÙ° دÚÙÙÙاÚÙÙ Ú¯ÛدÙ",
"pageinfo-header-restrictions": "ÙÙگ٠پأسÙ",
+ "pageinfo-header-properties": "ÙÙÚ¯Ë ÙÙÚÚ¯ÙئÙ",
+ "pageinfo-display-title": "تÙتر٠ÙÛشؤ٠دأÙ",
+ "pageinfo-article-id": "ÙÙÚ¯Ë Ø´ÙاسÙ",
"pageinfo-robot-index": "Ù
ؤجاز",
"pageinfo-firstuser": "ÙÙÚ¯Ë ÚاکÛÙکس",
+ "pageinfo-firsttime": "ÙÙÚ¯Ë ÚاگÛدÙË Ø²Ù
ت",
+ "pageinfo-lastuser": "آخر٠دÚÙÙÙاÚÙÙ Ú¯ÛدÙکس",
+ "pageinfo-lasttime": "آخر٠دÚÙÙÙاÚÙÙË ØªØ§Ø±ÙØ®",
+ "pageinfo-edits": "ÙÙ
ت٠دÚÙÙÙاÚÙÙؤÙË ØªØ¹Ø¯Ø§Ø¯",
+ "pageinfo-recent-edits": "آخر٠دÚÙÙÙاÚÙÙؤÙË ØªØ¹Ø¯Ø§Ø¯ ($1 Ë Ø£Ø®ÙØ±Ë Ù
ÙئÙ)",
+ "pageinfo-recent-authors": "آخر٠تÙÙا ÙÙÙشتÙکسؤÙË ØªØ¹Ø¯Ø§Ø¯",
"pageinfo-hidden-categories": "جخÛت٠{{PLURAL:$1| جرگÙ|جرگÙ}} ( $1 )",
"pageinfo-toolboxlink": "ÙÙÚ¯Ë Ø§Ø·Ùاعات",
+ "pageinfo-contentpage-yes": "Ø£ÙØ£",
"pageinfo-category-info": "جرگ٠اطÙاعات",
+ "patrol-log-page": "Ú¯Ø´ØªË Ø³ÙاÙÙ",
"previousdiff": "â ÙدÙÙ
ÙâØªØ±Ë Ø¯ÚÙÙÙاÚÙÙ",
"nextdiff": "تازÙâØªØ±Ë Ø¯ÚÙÙÙاÚÙÙ â",
"file-info-size": "$1 à $2 Ù¾ÛکسÙØ ÙاÙÙË ÙاÙÙراز: $3Ø ÙÙع MIME ÙاÙÙ: $4",
@@ -661,6 +692,11 @@
"monthsall": "ÙÙ
Ù",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گب]])",
"redirect-submit": "بÛØ´Û",
+ "redirect-lookup": "ÙاÙ
ج:",
+ "redirect-value": "Ù
Ùدار:",
+ "redirect-user": "کارگÙØ±Ë Ø´ÙاسÙ",
+ "redirect-page": "ÙÙÚ¯Ë Ø´ÙاسÙ",
+ "redirect-revision": "ÙÙÚ¯Ë ÙÛسخÙ",
"redirect-file": "ÙاÙÙË ÙؤÙ
",
"specialpages": "Ø®Ø§ØµË ÙÙگؤÙ",
"specialpages-group-login": "دÙرÙÙ/Ø«Ø¨ØªË ÙؤÙ
",
@@ -669,6 +705,7 @@
"logentry-newusers-create": "کارگÙر٠Øساب $1 {{GENDER:$2|ÚاگÛدÙ-بÛبؤ}}",
"logentry-upload-upload": "$1 $3 {{GENDER:$2|جؤرأکشئÙ}}",
"searchsuggest-search": "{{SITENAME}} Ù
ئ٠ÙاÙ
ج",
+ "duration-days": "$1 رÛز",
"expand_templates_preview": "Ù¾ÙشادئÙ",
"default-skin-not-found": "اؤخ! Ù¾ÙØ´ÙØ±Ø¶Ë ÙاÙب٠ک٠شÙÙ
Ù ÙÙک٠ئب٠Ù
ئ٠تعرÙ٠ببؤ ب٠عÙÙاÙË $1
Ø Ø¯Ø³Ùرس ÙÙÙ.\n\nب٠Ùظر Ù
ÛâØ¢Ûد Ùصب Ø´Ù
ا شاÙ
Ù Ù¾ÙستÙâÙØ§Û Ø²Ûر Ù
ÛâØ´Ùد. [https://www.mediawiki.org/wiki/Manual:Skin_configuration راÙÙÙ
ا: تÙظÛÙ
ات Ù¾ÙستÙ] را Ø¨Ø±Ø§Û Ú©Ø³Ø¨ اطÙاعات در بار٠ÚÚ¯ÙÙÚ¯Û ÙعاÙâساخت٠آÙâÙا ٠اÙتخاب Ù¾ÛØ´âÙرض ببÛÙÛد.\n\n$2\n\n; اگر اخÛرا٠Ù
دÛاÙÛÚ©Û Ø±Ø§ Ùصب کردÙâاÛد:\n: اØتÙ
اÙا٠از Ú¯ÛØªØ Ûا ب٠طÙر Ù
ستÙÛÙ
از کد Ù
بدأ ک٠از ÚÙد Ù
تد دÛگر استÙاد٠Ù
ÛâÚ©Ùد Ùصب کردÛد. اÙتظار Ù
ÛâرÙد. ÚÙد {{PLURAL:$4|Ù¾ÙستÙ|Ù¾ÙستÙ}} از [https://www.mediawiki.org/wiki/Category:All_skins ÙÙرست Ù¾Ùست٠mediawiki.org] Ùصب Ú©ÙÛØ¯Ø Ú©Ù ÙÙ
را٠ÚÙدÛÙ Ù¾Ùست٠٠اÙزÙÙÙ ÙستÙد. Ø´Ù
ا Ù
ÛâتÙاÙÛد شاخ٠skins/
را از Ø¢Ù ÙسخÙâØ¨Ø±Ø¯Ø§Ø±Û Ú©Ø±Ø¯Ù Ù Ø¨ÚسباÙÛد.\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins استÙاد٠از Ú¯Ûت Ø¨Ø±Ø§Û Ø¯Ø±ÛاÙت Ù¾ÙستÙâÙا].\n: اÙجاÙ
اÛ٠کار با Ù
خز٠گÛتâتا٠تداخ٠ÙÙ
ÛâÚ©Ùد اگر تÙسعÙâدÙÙد٠Ù
دÛاÙÛÚ©Û ÙستÛد.\n\n; اگر اخÛرا٠Ù
دÛاÙÛÚ©Û Ø±Ø§ ارتÙاء دادÛد:\n: Ù
دÛاÙÛÚ©Û Û±Ù«Û²Û´ ٠تازÙâتر دÛگر ب٠طÙر Ø®Ùدکار Ù¾ÙستÙâÙØ§Û Ùصبâشد٠را Ùعا٠ÙÙ
ÛâÚ©Ùد ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery راÙÙÙ
ا: Ú©Ø´Ù Ø®Ùدکار Ù¾ÙستÙ] را ببÛÙÛد). Ø´Ù
ا Ù
ÛâتÙاÙÛد خطÙØ· زÛر را ب٠داخ٠LocalSettings.php
بÚسباÙÛد تا {{PLURAL:$5|ÙÙ
Ù|ÙÙ
Ù}} Ù¾ÙستÙâÙØ§Û Ùصبâشد٠را Ùعا٠کÙÛد:\n\n$3 \n\n; اگر اخÛرا٠LocalSettings.php
را تغÛÛر دادÛد:\n: ÙاÙ
Ù¾ÙستÙâÙا را Ø¨Ø±Ø§Û ØºÙØ· اÙ
ÙاÛÛ Ø¯ÙØ¨Ø§Ø±Ù Ø¨Ø±Ø±Ø³Û Ú©ÙÛد."
}
diff --git a/languages/i18n/gu.json b/languages/i18n/gu.json
index 6a159510e9..a03e55e430 100644
--- a/languages/i18n/gu.json
+++ b/languages/i18n/gu.json
@@ -336,6 +336,8 @@
"filerenameerror": "\"$1\" નà«àª નામ બદલà«àª¨à« \"$2\" àªàª°àªµàª¾àª®àª¾àª નિષà«àª«àª³.",
"filedeleteerror": "\"$1\" ફાàªàª² હàªàª¾àªµà« ન શàªàª¾àª.",
"directorycreateerror": "ડિરà«àªà«àªàª°à« \"$1\" ન બનાવૠશàªàª¾àª.",
+ "directoryreadonlyerror": "ડિરà«àªà«àªàª°à« \"$1\" ફàªà«àª¤ વાàªàªàªµàª¾ માàªà« àªà«.",
+ "directorynotreadableerror": "ડિરà«àªà«àªàª°à« \"$1\" વાàªàªà« શàªàª¾àª¯ તà«àªµà«àª નથà«.",
"filenotfound": "ફાàªàª² \"$1\" ન મળà«.",
"unexpected": "àª
ણધારૠàªàª¿àªàª®àª¤: \"$1\"=\"$2\".",
"formerror": "તà«àª°à«àªàª¿: પતà«àª°àª રàªà« થયà«àª નહà«àª",
@@ -343,8 +345,14 @@
"cannotdelete": "ફાàªàª² àªà« પાનà«àª \"$1\" હàªàª¾àªµà« શàªàª¾àª¯à«àª નથà«.\nશàªà«àª¯ àªà« àªà« àª
નà«àª¯ àªà«àªàª પહà«àª²à«àª¥à« હàªàª¾àªµà« દà«àª§à«àª હà«àª¯.",
"cannotdelete-title": "\"$1\" પાનà«àª àªàª¾àª¢à« શàªàª¤àª¾ નથà«",
"delete-hook-aborted": "દà«àª° àªàª°àªµàª¾àª¨à«àª હà«àª વડૠરà«àªà« રાàªàªµàª¾àª®àª¾àª àªàªµà«àª¯à«àª.\nતૠàªà«àª àªàª¾àª°àª£ àªàªªàª¤à«àª નથà«.",
+ "no-null-revision": "પà«àª·à«àª \"$1\" માàªà« નવૠનલ પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨ બનાવૠશàªà«àª¯à«àª નથà«",
"badtitle": "àªàª°àª¾àª¬ શિરà«àª·àª",
"badtitletext": "àªàªªàª¨à«àª àªàªà«àªàª¿àª¤ શà«àª°à«àª·àª àª
માનà«àª¯ àªà«, àªàª¾àª²à« àªà«, àª
થવાતૠàª
યà«àªà«àª¯ રà«àª¤à« àªàªàª¤àª°-àªàª¾àª·àª¿àª¯ àªà« àªàªàª¤àª°-વિàªàª¿ સાથૠàªà«àª¡àª¾àª¯à«àª²à«àª શà«àª°à«àª·àª àªà«.\nશàªà«àª¯ àªà« àªà« તà«àª®àª¾àª àªàª àªà« વધૠàªàªµàª¾ àª
àªà«àª·àª° àªà« àªàª¿àª¹à«àª¨à« àªà« àªà« àªà« પાનાનાઠશà«àª°à«àª·àª માàªà« àª
વà«àª§ àªà«.",
+ "title-invalid-empty": "વિનàªàª¤à« àªàª°à«àª²à«àª પાનà«àª શà«àª°à«àª·àª àªàª¾àª²à« àªà« àª
થવા તà«àª®àª¾àª ફàªà«àª¤ નામસà«àª¥àª³àª¨à«àª નામ àªà«.",
+ "title-invalid-utf8": "વિનàªàª¤à« àªàª°àª¾àª¯à«àª² પà«àª·à«àª શà«àª°à«àª·àªàª®àª¾àª àª
માનà«àª¯ UTF-8 àªà«àª°àª® àªà«.",
+ "title-invalid-interwiki": "માàªàª£à« àªàª°à«àª² પà«àª·à«àª શà«àª°à«àª·àªàª®àª¾àª àªàª àªàªàª¤àª°àªµàª¿àªàª¿ àªàª¡à« àªà« àªà«àª¨à« àªàªªàª¯à«àª શà«àª°à«àª·àªàª®àª¾àª àªàª°à« શàªàª¾àª¤à« નથà«.",
+ "title-invalid-talk-namespace": "વિનàªàª¤à« àªàª°àª¾àª¯à«àª² પાનà«àª શà«àª°à«àª·àª àªàªµàª¾ àªàª°à«àªàª¾ પà«àª·à«àª નૠàªàª²à«àª²à«àª àªàª°à« àªà« àªà« àª
સà«àª¤àª¿àª¤à«àªµàª®àª¾àª નથà«.",
+ "title-invalid-characters": "માàªàª£à« àªàª°à«àª² પà«àª·à«àª શà«àª°à«àª·àªàª®àª¾àª àª
માનà«àª¯ àª
àªà«àª·àª°à« àªà«: \"$1\".",
"perfcached": "નà«àªà« દરà«àª¶àª¾àªµà«àª²à« માહિતૠàªà«àª¨àª¾ સàªàªà«àª°àª¹àª®àª¾àªàª¥à« લà«àª§à«àª²à« àªà« àª
નૠશàªà«àª¯ àªà« àªà« તૠહાલનૠપરિસà«àª¥àª¿àª¤àª¿àª®àª¾àª સàªà«àª ના હà«àª¯. વધà«àª®àª¾àª વધૠ{{PLURAL:$1|àªàª પરિણામ|$1 પરિણામà«}} ઠસàªàªà«àª°àª¹àª®àª¾àª àªàªªàª²àª¬à«àª§ àªà«.",
"perfcachedts": "નà«àªà«àª¨à« વિàªàª¤à« àªà«àª¨àª¾ સàªàªà«àª°àª¹àª®àª¾àª¥à« àªà« àª
નૠતૠàªà«àª²à«àª²à« $1ઠતાàªà« àªàª°àªµàª¾àª®àª¾àª àªàªµà« હતà«. વધà«àª®àª¾àª વધૠ{{PLURAL:$4|àªàª પરિણામ|$4 પરિણામà«}} ઠસàªàªà«àª°àª¹àª®àª¾àª àªàªªàª²àª¬à«àª§ àªà«.",
"querypage-no-updates": "ઠપાનાનૠનવૠàªàªµà«àª¤à«àª¤àª¿àª હાલમાઠàª
àªà«àª°àª¿àª¯ àªà«.\nàª
હà«àªàª¨à« વિàªàª¤à« હાલમાઠરિફà«àª°à«àª¶ àªàª°àªµàª¾àª®àª¾àª નહૠàªàªµà«.",
diff --git a/languages/i18n/he.json b/languages/i18n/he.json
index 0e3a57955b..a8bd06ec5f 100644
--- a/languages/i18n/he.json
+++ b/languages/i18n/he.json
@@ -765,6 +765,7 @@
"parser-template-loop-warning": "× ×צ×× ×ª×× ×ת ×ק×ר×ת ×עצ××: [[$1]]",
"template-loop-category": "×פ×× ×¢× ×××××ת ×ת×× ×ת",
"template-loop-category-desc": "×××£ ××× ×××× ××××× ×ת×× ×ת, ××××ר ת×× ×ת שק×ר×ת ×עצ×× ××××¤× ×¨×§×רס×××.",
+ "template-loop-warning": "×××ר×: ×××£ ××× ×§××¨× ×[[:$1]], ××× ×××¨× ×××××× ×ת×× ×ת (קר××× ×¨×§×רס×××ת ××× ×¡×פ×ת).",
"parser-template-recursion-depth-warning": "×¢××ק ×ת×× ××ת ×××××××ת ×× ××× ×¢×ר ×ת ×××××× ($1)",
"language-converter-depth-warning": "×¢××ק ×××ר ××©×¤× ×¢×ר ×ת ×××××× ($1)",
"node-count-exceeded-category": "×פ×× ×©××× ×ספר ×צ×ת×× ×××× ×××",
diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json
index c7cd4e2c05..cd048b9fc8 100644
--- a/languages/i18n/ko.json
+++ b/languages/i18n/ko.json
@@ -3823,7 +3823,7 @@
"special-characters-group-sinhala": "ì±í ë¼ ë¬¸ì",
"special-characters-group-gujarati": "구ìë¼í¸ 문ì",
"special-characters-group-devanagari": "ë°ë°ëê°ë¦¬ì´",
- "special-characters-group-thai": "íì´ì´",
+ "special-characters-group-thai": "íêµì´",
"special-characters-group-lao": "ë¼ì¤ì´",
"special-characters-group-khmer": "í¬ë©ë¥´ì´",
"special-characters-group-canadianaboriginal": "ìºëë¤ ì주민 ì¸ì´",
diff --git a/languages/i18n/ku-latn.json b/languages/i18n/ku-latn.json
index 7a1c129fb3..b596b8dcf8 100644
--- a/languages/i18n/ku-latn.json
+++ b/languages/i18n/ku-latn.json
@@ -65,6 +65,8 @@
"underline-never": "Qet",
"underline-default": "Tercîhên lêgerokê",
"editfont-default": "Tercîhên lêgerokê",
+ "editfont-sansserif": "Fonta Sans-serif'ê",
+ "editfont-serif": "Fonta Serif'ê",
"sunday": "yekÅem",
"monday": "duÅem",
"tuesday": "sêÅem",
@@ -107,10 +109,10 @@
"feb": "reÅ",
"mar": "adr",
"apr": "avr",
- "may": "gulan",
+ "may": "gln",
"jun": "pûÅ",
"jul": "tîr",
- "aug": "teb",
+ "aug": "Glw",
"sep": "rez",
"oct": "kew",
"nov": "ser",
@@ -222,7 +224,7 @@
"currentevents": "Bûyerên rojane",
"currentevents-url": "Project:Bûyerên rojane",
"disclaimers": "Ferexetname",
- "disclaimerpage": "Project:Ferexetname",
+ "disclaimerpage": "Project:Ferexetnameya giÅtî",
"edithelp": "Alîkariya guherandinê",
"helppage-top-gethelp": "Alîkarî",
"mainpage": "Destpêk",
@@ -231,7 +233,7 @@
"portal": "Portala komê",
"portal-url": "Project:Portala komê",
"privacy": "Siyaseta veÅarîtiyê",
- "privacypage": "Project:Parastina daneyan",
+ "privacypage": "Project:Siyaseta veÅarîtiyê",
"badaccess": "Ãewtiya destûrê",
"badaccess-group0": "Tu nikarî vî tiÅtî bikî.",
"badaccess-groups": "Ev tiÅta tu dixwazî bikî tenê ji bikarhênerên {{PLURAL:$2|van koman|vê komê}} re {{PLURAL:$2|ne|ye}}: $1.",
@@ -274,7 +276,7 @@
"nstab-media": "Medya",
"nstab-special": "Rûpela taybet",
"nstab-project": "Rûpela projeyê",
- "nstab-image": "Wêne",
+ "nstab-image": "Dosye",
"nstab-mediawiki": "Peyam",
"nstab-template": "Åablon",
"nstab-help": "Alîkarî",
@@ -548,7 +550,7 @@
"templatesused": "{{PLURAL:$1|Åablona|Åablonên}} ku li ser vê rûpelê {{PLURAL:$1|tê|tên}} bikaranîn:",
"templatesusedpreview": "{{PLURAL:$1|Åablona|Åablonên}} di vê pêÅdîtinê de {{PLURAL:$1|tê|tên}} bikaranîn:",
"templatesusedsection": "{{PLURAL:$1|Åablona ku di vê beÅê de tê bikaranîn|Åablonên ku di vê beÅê de tên bikaranîn}}:",
- "template-protected": "(tê parastin)",
+ "template-protected": "()",
"template-semiprotected": "(nîv-parastî)",
"hiddencategories": "Ev rûpel endamê {{PLURAL:$1|1 kategoriya veÅartî|$1 kategoriyên veÅartî}} ye:",
"nocreate-loggedin": "Destûra te tune ye ku tu rûpelên nu biafirînî.",
@@ -665,7 +667,7 @@
"searchprofile-everything": "Her tiÅt",
"searchprofile-advanced": "PêÅketî",
"searchprofile-articles-tooltip": "Di $1 da lêbigere",
- "searchprofile-images-tooltip": "Li pelan bigere",
+ "searchprofile-images-tooltip": "Li nav dosyeyan bigere",
"searchprofile-everything-tooltip": "Di hemû naverokada bigere (tevî gotûbêja)",
"search-result-size": "$1 ({{PLURAL:$2|peyvek|$2 peyv}})",
"search-redirect": "(beralîkirina ji $1)",
@@ -853,7 +855,7 @@
"recentchanges-legend": "Vebijarkên guherandinên dawî",
"recentchanges-summary": "Guhertinên herî dawî yên wîkiyê li ser vê rûpelê biÅopîne.",
"recentchanges-label-newpage": "Rûpeleke nû hate çêkirin",
- "recentchanges-label-minor": "Ev guherîneke biçûk e",
+ "recentchanges-label-minor": "Ev guhertineke Biçûk e",
"recentchanges-label-bot": "Ev guherîn ji aliyê botekê ve hate çêkirin",
"recentchanges-label-unpatrolled": "Ev gotar hêjî nehatiye sererastkirin",
"recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
@@ -938,7 +940,7 @@
"filetype-banned": "Dosyeyên bi vê cureye hatîye qedexekirin.",
"verification-error": "Ev dosye, rastandina dosyeye derbas nekir.",
"unknown-error": "Ãewtiyeke nenas pêk hat.",
- "large-file": "Mezinbûna pelê bila ji $1 ne mezintir be; ev pel $2 e.",
+ "large-file": "Mezinbûna dosyeyê divê ji $1 ne mezintir be; ev dosye $2 e.",
"emptyfile": "Data'ya barkirî vala ye. Sedemê valabûnê belkî ÅaÅnivîsek di navê data'yê da ye. Xêra xwe seke, ku tu rast dixazê vê data'yê barbikê.",
"fileexists": "Datayek bi vê navê berê heye.\nEger tu niha li âTomarbikeâ xê, ew wêneyê kevin ê here û wêneyê te ê were barkirin di bin wê navê.\nDi bin [[:$1]] du dikarî sekê, ku di dixwazê wê wêneyê biguherînê.\nEger tu naxazê, xêra xwe li âBetalâ xe.\n[[$1|thumb]]",
"fileexists-extension": "Datayek wek vê navê berê heye: [[$2|thumb]]\n* Navî datayê yê tê barkirin: [[:$1]] \n* Navî datayê yê berê heyê: [[:$2]] \nXêra xwe navekî din bibîne.",
@@ -1018,12 +1020,12 @@
"filehist-user": "Bikarhêner",
"filehist-dimensions": "Mezinahî",
"filehist-filesize": "Mezinahiya pelê",
- "filehist-comment": "Åîrove",
+ "filehist-comment": "Åirove",
"imagelinks": "Bikaranîna pelê",
"linkstoimage": "Di van rûpelan de {{PLURAL:$1|page links|$1 lînkek}} ji vî dosyeye re heye:",
"nolinkstoimage": "Rûpelekî ku ji vî wêneyî re girêdankê çêdike nîne.",
"linkstoimage-redirect": "$1 (beralîkirina pelê) $2",
- "sharedupload-desc-here": "Ev pel ji $1 û dibe ku ji aliyê projeyên din ve jî hatibe bikaranîn.\nAgahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîÅandan.",
+ "sharedupload-desc-here": "Ev dosye ji $1 û dibe ku ji aliyê projeyên din ve jî hatibe bikaranîn.\nAgahdariya li ser [$2 rûpela danasîna dosyeyê] li jêr tê nîÅandan.",
"filepage-nofile-link": "Dosyeyek bi vî navî tune ye, lê tu dikarî wê [$1 bar bikî].",
"uploadnewversion-linktext": "Versiyoneke nû ya vê daneyê barbike",
"shared-repo-from": "ji $1",
diff --git a/languages/i18n/lfn.json b/languages/i18n/lfn.json
index 8df8bb1a10..49c7e06aca 100644
--- a/languages/i18n/lfn.json
+++ b/languages/i18n/lfn.json
@@ -46,6 +46,7 @@
"tog-watchlisthideminor": "Asconde editas minor de la lista de pajes oservada",
"tog-watchlisthideliu": "Asconde editas par usores identifiada de la lista de pajes oservada",
"tog-watchlistreloadautomatically": "Recarga automata la lista de pajes oservada cuando un filtre es cambiada (JavaScript nesesada)",
+ "tog-watchlistunwatchlinks": "Ajunta lias direta per monitori/desmonitori a pajes monitorida (JavaScript es usada per alterna entre la du)",
"tog-watchlisthideanons": "Asconde editas par usores anonim de la lista de pajes oservada",
"tog-watchlisthidepatrolled": "Asconde editas patruliada de la lista de pajes oservada",
"tog-watchlisthidecategorization": "Asconde la categori de pajes",
@@ -216,7 +217,11 @@
"jumptosearch": "xerca",
"view-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atenta vide esta paje.\nPer favore espeta ante cuanto tu atenta vide esta paje denova.\n\n$1",
"generic-pool-error": "Pardona, la servadores es tro cargada a esta ora.\nTro multe usores es atentante vide esta recurso.\nPer favore espeta ante cuando tu atenta vide esta recurso denova.",
+ "pool-timeout": "Semafor nonotenable: atenta abandonada",
+ "pool-queuefull": "Filo de servadores es plen",
"pool-errorunknown": "Era nonconoseda",
+ "pool-servererror": "La manejador de servadores no es disponable ($1)",
+ "poolcounter-usage-error": "Era de usa: $1",
"aboutsite": "Sur {{SITENAME}}",
"aboutpage": "Project:Sur",
"copyright": "La contenida es disponeda su $1, estra diferes notada.",
@@ -234,10 +239,16 @@
"portal-url": "Project:Porton de comunia",
"privacy": "Promete de privatia",
"privacypage": "Project:Promete de privatia",
+ "badaccess": "Era de permete",
+ "badaccess-group0": "Tu no es permeteda a fa la ata cual tu ia solisita.",
+ "badaccess-groups": "La ata cual tu ia solisita es limitada a usores en {{PLURAL:$2|la grupo|un de la grupos}}: $1.",
+ "versionrequired": "Revisa $1 de MediaWiki es nesesada",
+ "versionrequiredtext": "Revisa $1 de MediaWiki es nesesada per usa esta paje.\nVide la [[Special:Version|paje de varias]].",
"ok": "Oce",
"retrievedfrom": "Retraeda de \"$1\"",
"youhavenewmessages": "{{PLURAL:$3|Tu ave}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|Tu ave}} $1 de {{PLURAL:$3|un otra usor|$3 usores}} ($2).",
+ "youhavenewmessagesmanyusers": "Tu ave $1 de multe usores ($2).",
"newmessageslinkplural": "{{PLURAL:$1|un mesaje nova|999=mesajes nova}}",
"newmessagesdifflinkplural": "{{PLURAL:$1|cambia|cambias}} resente",
"youhavenewmessagesmulti": "Tu ave mesajes nova en $1",
@@ -255,13 +266,19 @@
"confirmable-confirm": "Esce {{GENDER:$1|tu}} es serta?",
"confirmable-yes": "Si",
"confirmable-no": "No",
+ "thisisdeleted": "Vide o restora $1?",
"viewdeleted": "Vide $1?",
+ "restorelink": "{{PLURAL:$1|un edita sutraeda|$1 editas sutraeda}}",
"feedlinks": "Flue:",
+ "feed-invalid": "Tipo de flue no es valida.",
+ "feed-unavailable": "Flues no es disponable",
"site-rss-feed": "$1 RSS Flue",
"site-atom-feed": "$1 Flue Atom",
"page-rss-feed": "\"$1\" RSS Flue",
"page-atom-feed": "\"$1\" Flue Atom",
"red-link-title": "$1 (paje no esiste)",
+ "sort-descending": "Ordina desendente",
+ "sort-ascending": "Ordina asendente",
"nstab-main": "Paje",
"nstab-user": "Paje de usor",
"nstab-media": "Paje de medio",
@@ -273,13 +290,27 @@
"nstab-help": "Paje de aida",
"nstab-category": "Categoria",
"mainpage-nstab": "Paje xef",
+ "nosuchactiontext": "La ata spesifada par la URL es nonvalida.\nCisa tu ia maltape la URL o ia segue un lia noncoreta.\nO cisa esta indica un defeto en la program usada par {{SITENAME}}.",
"nosuchspecialpage": "Paje spesial nonesistente",
"nospecialpagetext": "Tu ia solisita un paje spesial nonvalida. \n\nUn lista de pajes spesial valida es disponable en [[Special:SpecialPages|{{int:specialpages}}]].",
"error": "Era",
"databaseerror": "Era de base de datos",
+ "databaseerror-text": "Un era ia aveni en interoga la banco de datos.\nCisa esta indica un defeto en la program.",
+ "databaseerror-textcl": "Un era ia aveni en interoga la banco de datos.",
+ "databaseerror-query": "Interoga: $1",
+ "databaseerror-function": "Funsiona: $1",
+ "databaseerror-error": "Era: $1",
"missingarticle-diff": "(Difere: $1, $2)",
"internalerror": "Era interna",
"internalerror_info": "Era interna: $1",
+ "internalerror-fatal-exception": "Era nonreparable de tipo \"$1\"",
+ "filecopyerror": "Fix \"$1\" no ia pote es copiada a \"$2\".",
+ "filerenameerror": "Fix \"$1\" no ia pote es renomida a \"$2\".",
+ "filedeleteerror": "Fix \"$1\" no ia pote es sutraeda.",
+ "directorycreateerror": "Arcivo \"$1\" no ia pote es creada.",
+ "directoryreadonlyerror": "Arcivo \"$1\" es nonscrivable.",
+ "directorynotreadableerror": "Arcivo \"$1\" es nonlejable.",
+ "filenotfound": "Fix \"$1\" no ia pote es trovada.",
"badtitle": "Mal titulo",
"badtitletext": "La titulo de la paje spesifada es nonlegal, vacua, o un titulo interlingual o intervici de lia noncoreta. Cisa lo conteni un o plu sinias cual on no pote usa en titulos.",
"viewsource": "Mostra la fonte",
@@ -290,6 +321,9 @@
"myprivateinfoprotected": "Tu no ave permete per edita tua informa privata.",
"mypreferencesprotected": "Tu no ave permete per edita tua preferes.",
"ns-specialprotected": "La pajes spesial no pote es editada.",
+ "virus-badscanner": "Malajustada: scanador antivirusal nonconoseda: $1 ",
+ "virus-scanfailed": "fali de scane (codigo $1)",
+ "virus-unknownscanner": "scanador antivirusal nonconoseda:",
"logouttext": "Tu es aora desautenticida. \n\nNota ce cisa alga pajes va continua es mostrada como si tu ta es ancora autenticida asta cuando tu vacui la memoria de tua surfador.",
"cannotlogoutnow-title": "Tu no pote desautentici a presente",
"cannotlogoutnow-text": "Desautentici no es posible cuando tu usa $1.",
@@ -348,7 +382,17 @@
"createacct-benefit-body1": "{{PLURAL:$1|edita|editas}}",
"createacct-benefit-body2": "{{PLURAL:$1|paje|pajes}}",
"createacct-benefit-body3": "{{PLURAL:$1|contribuor|contribuores}} resente",
+ "badretype": "La claves cual tu ia tape no es egal.",
+ "usernameinprogress": "Un crea de conta per esta nom de usor aveni ja.\nEspeta, per favore.",
+ "userexists": "La nom spesifada de usor es ja usada.\nEleje un otra nom, per favore.",
"loginerror": "Era de entra",
+ "createacct-error": "Era de crea de conta",
+ "createaccounterror": "La conta no ia pote es creada: $1",
+ "nocookiesnew": "La conta de usor es aora creada, ma tu no ia autentici.\n{{SITENAME}} usa cucis per autentici usores.\nTu ia descomuta cucis.\nPer favore, comuta los e autentici con tua nom de usor nova e tua clave.",
+ "nocookieslogin": "{{SITENAME}} usa cucis per autentici usores.\nTu ia descomuta cucis.\nPer favore, comuta los e atenta denova.",
+ "nocookiesfornew": "La conta de usor no ia es creada, car nos no ia pote confirma sua fonte.\nSerti ce tu ia comuta cucis, recarga esta paje, e atenta denova.",
+ "createacct-loginerror": "La crea de la conta ia susede, ma tu no ia pote es automata autenticida. Per favore, vade a la paje de [[Special:UserLogin|autentici nonautomata]].",
+ "noname": "Tu no ia spesifa un nom de usor valida.",
"loginsuccesstitle": "Tu ia entra",
"loginsuccess": "'''Tu ia entrada aora a {{SITENAME}} como \"$1\".'''",
"nosuchuser": "On no ave un usor con la nom \"$1\".\nOn distingui entre leteras major e minor per nomes de usores.\nEsamina la spele, o [[Special:CreateAccount|crea un conta nova]].",
@@ -365,18 +409,37 @@
"passwordremindertitle": "Sinia secreta temporer nova per {{SITENAME}}",
"passwordremindertext": "Algun (tu, probable, de adirije IP $1)\nia demanda un sinia secreta nova per {{SITENAME}} ($4).\nLa sinia secreta tempora per usor \"$2\" es aora \"$3\". Si esta ia es tua intende, tu debe identifia tu denova per entra e eleje tua sinia nova aora.\nTua sinia tempora va desvalidi en {{PLURAL:$5|un dia|$5 dias}}.\n\nSi algun otra ca tu ia envia esta demanda a nos, o si tu ia recorda tua sinia secreta e no vole cambia lo aora, tu pote iniora esta mesaje e continua usa tua sinia secreta vea.",
"noemail": "No es un adirije de eposta per usor \"$1\".",
+ "noemailcreate": "Tu debe furni un adirije de eposta valida.",
"passwordsent": "Un sinia secreta ia es enviada a la adirije de eposta per \"$1\".\nPer favore, sinia per entra ancora pos tu ia reseta el.",
"eauthentsent": "Un eposta de serti ia es enviada a la adirije de eposta spesifada.\nAnte cualce otra epostas es enviada a tua conta, tu va nesesa segue la instruis en la eposta, per serti ce la conta es vera la tua.",
+ "throttled-mailpassword": "Un eposta de reinisia la clave ia es ja enviada, en la {{PLURAL:$1|ora|$1 oras}} la plu resente.\nPer preveni malusa, sola un tal eposta va es enviada per {{PLURAL:$1|ora|$1 oras}}.",
"mailerror": "Era en envia eposta: $1",
"acct_creation_throttle_hit": "Visitores a esta vici, usante tua adirije IP, ia crea {{PLURAL:$1|1 conta|$1 contas}} en la $2 la plu resente, cual es la masima permeteda en esta periodo.\nComo resulta, visitores con esta adirije IP no pote crea plu contas a esta tempo.",
+ "emailauthenticated": "Tua adirije de eposta ia es confirmada a $2 a $3.",
"emailconfirmlink": "Aproba tu adirije de eposta",
+ "cannotchangeemail": "On no pote cambia adirijes de eposta per contas en esta vici.",
+ "emaildisabled": "Esta vici no pote envia epostas.",
"accountcreated": "Conta es creada",
+ "accountcreatedtext": "La conta de usor per [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discute]]) ia es creada.",
+ "createaccount-title": "Crea de conta per {{SITENAME}}",
+ "createaccount-text": "Algun ia crea un conta per tua adirije de eposta a {{SITENAME}} ($4) nomida \"$2\", con clave \"$3\".\nTu debe autentici e cambia tua clave aora.\n\nTu pote iniora esta mesaje, si esta conta ia es creada par era.",
+ "login-throttled": "Tu ia fa resente tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
+ "login-abort-generic": "Tua autentici ia fali - Abortada",
+ "login-migrated-generic": "Tua conta ia es migrada, e tua nom de usor no esiste plu en esta vici.",
"loginlanguagelabel": "Lingua: $1",
+ "suspicious-userlogout": "Tua solisita de desautentici ia es refusada car lo pare es enviada par un surfador o proxi malfunsionante.",
+ "createacct-another-realname-tip": "La nom vera es nonobligante.\nSi tu eleje furni lo, lo va es usada per atribui la laboras fada par la usor.",
"pt-login": "Identifia se",
"pt-login-button": "Identifia",
"pt-login-continue-button": "Continua autentici",
"pt-createaccount": "Crea un conta",
"pt-userlogout": "Desidentifia",
+ "php-mail-error-unknown": "Era nonconoseda en la funsiona mail() de PHP.",
+ "user-mail-no-addy": "On ia atenta envia un eposta sin adirije de eposta.",
+ "user-mail-no-body": "On ia atenta envia un eposta con corpo vacua o nonormal corta.",
+ "changepassword": "Cambia clave",
+ "resetpass_announce": "Per fini autentici, tu debe furni un clave nova.",
+ "resetpass_header": "Cambia clave de conta",
"oldpassword": "Sinia secreta vea:",
"newpassword": "Sinia secreta nova:",
"retypenew": "Re-entra tu sinia secreta nova:",
@@ -385,6 +448,7 @@
"changepassword-throttled": "Tu ia fa resente tro multe atentas de autentici.\nPer favore, pausa per $1 ante atenta denova.",
"botpasswords": "Claves de bot",
"botpasswords-summary": "Claves de bot permete ce on asede un conta de usor par API sin usa la identia xef de la conta. La diretos de usor disponable pos autentici par clave de bot es cisa restrinjeda.\n\nSi tu no sabe perce on ta vole fa esta, probable tu debe no fa lo. Nunca un otra person debe demanda ce tu jenera un de estas e dona lo a el.",
+ "botpasswords-disabled": "Claves de bot es descomutada.",
"botpasswords-no-central-id": "Per usa claves de bot, tu debe es autenticida con conta sentral.",
"botpasswords-existing": "Claves esistente de bot",
"botpasswords-createnew": "Crea un clave nova de bot",
@@ -405,6 +469,13 @@
"botpasswords-created-body": "La clave de bot \"$1\" de usor \"$2\" ia es creada.",
"botpasswords-updated-title": "Clave de bot cambiada",
"botpasswords-updated-body": "La clave de bot \"$1\" de usor \"$2\" ia es cambiada.",
+ "botpasswords-deleted-title": "Clave de bot sutraeda",
+ "botpasswords-deleted-body": "La clave de bot \"$1\" de usor \"$2\" ia es sutraeda.",
+ "botpasswords-newpassword": "La clave nova per autentici con $1 es $2 . Per favore, nota esta per refere futur. (Per botes vea de cual sua nom de autentici debe es la mesma como la nom de usor ultima, tu pote usa ance $3 como nom de usor e $4 como clave.)",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider no es disponable.",
+ "botpasswords-restriction-failed": "Restrinjes de clave de bot preveni esta autentici.",
+ "botpasswords-invalid-name": "La nom de usor spesifada no conteni la sinia separante de claves de bot (\"$1\").",
+ "botpasswords-not-exist": "Usor \"$1\" no ave un clave de bot nomida \"$2\".",
"resetpass_forbidden": "Claves no pote es cambiada",
"resetpass_forbidden-reason": "Claves no pote es cambiada: $1",
"resetpass-no-info": "Tu debe es autenticida per asede direta esta paje.",
@@ -554,6 +625,7 @@
"nocreatetext": "{{SITENAME}} ave un restringe a la capas per crea pajes nova.\nTu pote vade a retro e edita un paje esistente, o [[Special:UserLogin|sinia per entra o crea un conta]].",
"nocreate-loggedin": "Tu no es permeteda a crea pajes nova.",
"sectioneditnotsupported-title": "La edita de partes no es suportada",
+ "sectioneditnotsupported-text": "La edita de partes no es suportada en esta paje.",
"permissionserrors": "Era de permete",
"permissionserrorstext-withaction": "Tu no pote $2, per la {{PLURAL:$1|razona|razonas}} seguente:",
"recreate-moveddeleted-warn": "Avisa: Tu recrea un paje cual on ia sutrae a ante. \n\nConsidera esce lo conveni ce tu continua edita esta paje. La arcivos de sutrae e move per la paje es presentada asi per aida:",
@@ -599,6 +671,7 @@
"rev-showdeleted": "mostra",
"revdelete-nooldid-title": "Revisa destinal nonvalida",
"revdelete-show-file-submit": "Si",
+ "revdelete-hide-comment": "Resoma de edita",
"revdelete-radio-set": "Ascondeda",
"revdelete-radio-unset": "Vidable",
"revdelete-log": "Razona:",
diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json
index 13a9fd1630..d6974ee6c6 100644
--- a/languages/i18n/mk.json
+++ b/languages/i18n/mk.json
@@ -754,6 +754,7 @@
"parser-template-loop-warning": "ÐÑонаÑдена е Ñамка во ÑаблоноÑ: [[$1]]",
"template-loop-category": "СÑÑаниÑи Ñо ÑаблонÑки Ñамки",
"template-loop-category-desc": "СÑÑаниÑава ÑодÑжи ÑаблонÑка Ñамка, Ñ.е. Ñаблон ÐºÐ¾Ñ Ð¿Ð¾Ð²ÑоÑливо Ñе ÑамоповикÑва",
+ "template-loop-warning": "ÐÑедÑпÑедÑваÑе: СÑÑаниÑава го повикÑва [[:$1]], ÑÑо пÑедизвикÑва Ñамка во ÑÐ°Ð±Ð»Ð¾Ð½Ð¾Ñ (беÑконеÑно повÑоÑлив повик).",
"parser-template-recursion-depth-warning": "ÐÑеÑекоÑена е гÑаниÑаÑа на длабоÑинаÑа на ÑекÑÑзиÑаÑа во ÑÐ°Ð±Ð»Ð¾Ð½Ð¾Ñ ($1)",
"language-converter-depth-warning": "ÐÑеÑекоÑена е гÑаниÑаÑа на длабоÑинаÑа на ÑазиÑÐ½Ð¸Ð¾Ñ Ð¿ÑеÑвоÑÐ°Ñ ($1)",
"node-count-exceeded-category": "СÑÑаниÑи каде е Ð½Ð°Ð´Ð¼Ð¸Ð½Ð°Ñ Ð±ÑоÑÐ¾Ñ Ð½Ð° Ñазли",
diff --git a/languages/i18n/ml.json b/languages/i18n/ml.json
index 5e835fa28a..e151d5d98e 100644
--- a/languages/i18n/ml.json
+++ b/languages/i18n/ml.json
@@ -35,9 +35,9 @@
]
},
"tog-underline": "à´à´£àµà´£à´¿à´àµ¾à´àµà´àµ à´
à´à´¿à´µà´°à´¯à´¿à´àµà´:",
- "tog-hideminor": "à´ªàµà´¤à´¿à´¯ മാറàµà´±à´àµà´à´³àµà´àµ à´ªà´àµà´à´¿à´à´¯à´¿àµ½ à´àµà´±à´¿à´¯ തിരàµà´¤àµà´¤àµà´àµ¾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´àµà´à´¾à´¤à´¿à´°à´¿à´àµà´àµà´",
- "tog-hidepatrolled": "à´±àµà´¨àµà´¤àµà´àµà´±àµà´±à´¿à´¯ തിരàµà´¤àµà´¤àµà´àµ¾ à´ªàµà´¤à´¿à´¯à´®à´¾à´±àµà´±à´àµà´à´³à´¿àµ½ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´àµà´à´¾à´¤à´¿à´°à´¿à´àµà´àµà´",
- "tog-newpageshidepatrolled": "à´±àµà´¨àµà´¤àµà´àµà´±àµà´±à´ªàµà´ªàµà´àµà´ താളàµà´àµ¾ à´ªàµà´¤à´¿à´¯à´¤à´¾à´³àµà´à´³àµà´àµ à´ªà´àµà´à´¿à´à´¯à´¿àµ½ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´àµà´à´¾à´¤à´¿à´°à´¿à´àµà´àµà´",
+ "tog-hideminor": "à´ªàµà´¤à´¿à´¯ മാറàµà´±à´àµà´à´³àµà´àµ à´ªà´àµà´à´¿à´à´¯à´¿àµ½ à´àµà´±à´¿à´¯ തിരàµà´¤àµà´¤àµà´àµ¾ മറയàµà´àµà´àµà´",
+ "tog-hidepatrolled": "à´±àµà´¨àµà´¤àµà´àµà´±àµà´±à´¿à´¯ തിരàµà´¤àµà´¤àµà´àµ¾ à´ªàµà´¤à´¿à´¯à´®à´¾à´±àµà´±à´àµà´à´³à´¿àµ½ മറയàµà´àµà´àµà´",
+ "tog-newpageshidepatrolled": "à´±àµà´¨àµà´¤àµà´àµà´±àµà´±à´ªàµà´ªàµà´àµà´ താളàµà´àµ¾ à´ªàµà´¤à´¿à´¯à´¤à´¾à´³àµà´à´³àµà´àµ à´ªà´àµà´à´¿à´à´¯à´¿àµ½ മറയàµà´àµà´àµà´",
"tog-hidecategorization": "താളàµà´à´³àµà´àµ വർà´àµà´àµà´à´°à´£à´ മറയàµà´àµà´àµà´",
"tog-extendwatchlist": "à´à´±àµà´±à´µàµà´ à´ªàµà´¤à´¿à´¯à´µ മാതàµà´°à´®à´²àµà´², à´à´²àµà´²à´¾ മാറàµà´±à´àµà´à´³àµà´ à´¦àµà´¶àµà´¯à´®à´¾à´àµà´¨àµà´¨ വിധതàµà´¤à´¿àµ½ à´¶àµà´°à´¦àµà´§à´¿à´àµà´àµà´¨àµà´¨ താളàµà´à´³àµà´àµ à´ªà´àµà´à´¿à´ വിà´à´¸à´¿à´ªàµà´ªà´¿à´àµà´àµà´.",
"tog-usenewrc": "സമàµà´ªà´à´¾à´² മാറàµà´±à´àµà´àµ¾, à´¶àµà´°à´¦àµà´§à´¿à´àµà´àµà´¨àµà´¨à´µà´¯àµà´àµ à´ªà´àµà´à´¿à´ à´à´¨àµà´¨àµ താളàµà´à´³à´¿àµ½ മാറàµà´±à´àµà´àµ¾ à´à´£à´à´¤à´¿à´°à´¿à´àµà´àµà´",
diff --git a/languages/i18n/mwl.json b/languages/i18n/mwl.json
index 377611c376..041be722ea 100644
--- a/languages/i18n/mwl.json
+++ b/languages/i18n/mwl.json
@@ -149,6 +149,9 @@
"navigation": "Nabegaçon",
"and": " i",
"faq": "FAQ",
+ "namespaces": "DomÃnios",
+ "variants": "Bariadades",
+ "navigation-heading": "Menu de nabegaçon",
"errorpagetitle": "Erro",
"returnto": "Retornar pa $1.",
"tagline": "De {{SITENAME}}",
@@ -162,6 +165,7 @@
"printableversion": "Berson pa ampremir",
"permalink": "Lhigaçon pa siempre",
"print": "Ampremir",
+ "view": "Ber",
"edit": "Eiditar",
"create": "Criar",
"create-local": "Poner çcriçon lhocal",
@@ -170,7 +174,7 @@
"protect_change": "demudar",
"unprotect": "Altarar la proteçon",
"newpage": "Páigina nuoba",
- "talkpagelinktext": "Cumbersar",
+ "talkpagelinktext": "cumbersa",
"specialpage": "Páigina special",
"personaltools": "Ferramientas pessonales",
"talk": "Cumbersa",
@@ -299,6 +303,8 @@
"emailauthenticated": "L sou andereço de correio eiletrónico fui cunfirmado la $2, a las $3.",
"emailconfirmlink": "Cunfirma la tue morada de correio eiletrónico",
"loginlanguagelabel": "Lhéngua: $1",
+ "pt-login": "Antrar",
+ "pt-createaccount": "Criar ua cuonta",
"pt-userlogout": "Salir",
"changepassword": "Demudar palabra-chabe",
"resetpass_header": "Demudar palabra-chabe de la cuonta",
@@ -364,7 +370,7 @@
"nocreatetext": "{{SITENAME}} restringe la possibilidade de criar nuobas páiginas.\nPuode buoltar atrás i eiditar ua páigina yá eisistente, ó [[Special:UserLogin|outenticar-se ó criar ua cuonta]].",
"permissionserrorstext-withaction": "Tu nun tenes premisson pa $2, {{PLURAL:$1|pula seguinte rezon|pulas seguintes rezones}}:",
"recreate-moveddeleted-warn": "Abiso: Tu stás a criar ua páigina que yá fui d'atrás botada fuora. \n\nBei bien se ye própio cuntinar a eiditar esta páigina.\nL registro de la eileminaçon i de l arrastrar ye amostrado eiqui por cumbeniéncia:",
- "moveddeleted-notice": "Esta páigina fui apagada.\nL registro de la eileminaçon, proteçon i arrastrar desta páigina stá ambaixo pa refréncia.",
+ "moveddeleted-notice": "Esta páigina fui botada fuora.\nL registro de la eileminaçon, porteçon i arrastramiento desta páigina stá ambaixo pa refréncia.",
"viewpagelogs": "Ber registros pa esta páigina",
"currentrev": "Rebison atual",
"currentrev-asof": "Eidiçon atual cumo $1",
@@ -384,6 +390,7 @@
"history-feed-item-nocomment": "$1 a $2",
"rev-delundel": "amostrar/scunder",
"revdel-restore": "Demudar besiblidade",
+ "revdelete-edit-reasonlist": "Eiditar rezones de botar fuora",
"mergehistory-submit": "Misturar eidiçones",
"revertmerge": "Ãfazer ounion",
"history-title": "Stórico de eidiçones de \"$1\"",
@@ -397,13 +404,16 @@
"notextmatches": "Nun fui possible achar, ne l cuntenido de las páiginas, la palabra percurada",
"prevn": "{{PLURAL:$1|anterior|$1 anteriores}}",
"nextn": "{{PLURAL:$1|próssimo|próssimos $1}}",
+ "shown-title": "Amostrar $1 {{PLURAL:$1|resultado|resultados}} por páigina",
"viewprevnext": "Ber ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-new": "Criar la páigina \"[[:$1]]\" nesta berson! {{PLURAL:$2|0=|Beija tamien la páigina ancontrada na percura.|Beija tamien ls resultados de la percura.}}",
"searchprofile-articles": "Páiginas de cuntenido",
"searchprofile-images": "Multimédia",
"searchprofile-everything": "Todo",
"searchprofile-advanced": "Abançado",
+ "searchprofile-articles-tooltip": "Percurar an $1",
"searchprofile-images-tooltip": "Percurar fexeiros",
+ "searchprofile-everything-tooltip": "Percurar an todo l cuntenido (ancluindo páiginas de cumbersa)",
"searchprofile-advanced-tooltip": "Personalizar ls domÃnios adonde percurar",
"search-result-size": "$1 ({{PLURAL:$2|1 palabra|$2 palabras}})",
"search-redirect": "(ancaminamiento pa $1)",
@@ -529,6 +539,7 @@
"right-edit": "Eiditar páiginas",
"right-move": "Arrastrar páiginas",
"right-movefile": "Arrastrar fexeiros",
+ "right-writeapi": "Outelizar la API de scrita",
"grant-editmycssjs": "Eiditar l sou CSS/JavaScript personalizado",
"newuserlogpage": "Registro de criaçon de outelizadores",
"rightslog": "Registro de dreitos de l outelizador",
@@ -543,16 +554,29 @@
"recentchanges": "Redadeiras altaraçones",
"recentchanges-legend": "Oupçones de las redadeiras altaraçones",
"recentchanges-feed-description": "Acumpanha las redadeiras altaraçones de l biqui por esta semiente.",
+ "recentchanges-label-newpage": "Esta eidiçon criou ua nuoba páigina",
+ "recentchanges-label-minor": "Esta ye ua eidiçon pequerrixa",
+ "recentchanges-label-bot": "Esta eidiçon fui feita por un robó",
+ "recentchanges-label-plusminus": "Altaraçon ne l tamanho de la páigina, an bytes",
+ "recentchanges-legend-heading": "Lhegenda: ",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ber tamien la [[Special:NewPages|lhista de páiginas nuobas]])",
+ "recentchanges-submit": "Amostrar",
"rcfilters-filtergroup-watchlist": "Páiginas begiadas",
"rcnotefrom": "Ambaixo {{PLURAL:$5|stá la altaraçon feita|stan las alteraçones feitas}} zde $2 (amostradas até $1 ).",
"rclistfrom": "Amostrar las noubas altaraçones a partir de $2 de $3",
"rcshowhideminor": "$1 eidiçones pequerrixas",
+ "rcshowhideminor-show": "Amostrar",
"rcshowhidebots": "$1 robós",
+ "rcshowhidebots-show": "Amostrar",
"rcshowhideliu": "$1 outelizadores registrados",
+ "rcshowhideliu-show": "Amostrar",
"rcshowhideanons": "$1 outelizadores anónimos",
+ "rcshowhideanons-show": "Amostrar",
"rcshowhidepatr": "$1 eidiçones patrulhadas",
+ "rcshowhidepatr-show": "Amostrar",
"rcshowhidemine": "$1 mies eidiçones",
+ "rcshowhidemine-show": "Amostrar",
+ "rcshowhidecategorization-show": "Amostrar",
"rclinks": "Amostrar las redadeiras $1 altaraçones ne ls redadeiros $2 dies",
"diff": "defr",
"hist": "stór",
@@ -562,6 +586,7 @@
"newpageletter": "N",
"boteditletter": "b",
"rc_categories_any": "Qualquiera de ls scolhidos",
+ "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} açpuis las altaraçones",
"newsectionsummary": "/* $1 */ nuobo cacho",
"rc-enhanced-expand": "Amostrar detailhes",
"rc-enhanced-hide": "Scunder detailhes",
@@ -600,6 +625,7 @@
"filehist-datetime": "Data i hora",
"filehist-thumb": "Amostra",
"filehist-thumbtext": "Amostra de la berson de las $1",
+ "filehist-nothumb": "Meniatura andisponible",
"filehist-user": "Outelizador",
"filehist-dimensions": "Tamanho",
"filehist-filesize": "Tamanho de l fexeiro",
@@ -608,6 +634,7 @@
"linkstoimage": "{{PLURAL:$1|Esta páigina lhiga|Estas $1 páiginas lhigan}} este fexeiro:",
"nolinkstoimage": "Nanhua páigina apunta pa este fexeiro.",
"sharedupload": "Este fexeiro ye de $1 i puode ser outelizado por outros porjetos.",
+ "sharedupload-desc-here": "Este fexeiro ye de $1 i puode ser outelizado por outros porjetos.\nLa çcriçon na [$2 páigina oureginal] ye amostrada ambaixo.",
"uploadnewversion-linktext": "Cargar ua nuoba berson deste fexeiro",
"shared-repo-from": "de $1",
"filerevert-comment": "Motibo:",
@@ -616,6 +643,7 @@
"filedelete-submit": "Apagar",
"filedelete-nofile": "'''$1''' nun eisiste.",
"filedelete-reason-otherlist": "Outra rezon",
+ "filedelete-edit-reasonlist": "Eiditar rezones de botar fuora",
"mimesearch": "Percura MIME",
"listredirects": "Amostrar ancaminamientos",
"unusedtemplates": "Modelos nun outelizados",
@@ -655,6 +683,7 @@
"mostimages": "Eimaiges cun mais refréncias",
"mostrevisions": "Páiginas de cuntenido cun mais rebisones",
"prefixindex": "Todas las páiginas cun perfixo",
+ "prefixindex-submit": "Amostrar",
"shortpages": "Páiginas pequeinhas",
"longpages": "Páiginas cumpridas",
"deadendpages": "Páiginas sin salida",
@@ -662,6 +691,7 @@
"protectedtitles": "TÃtalos portegidos",
"listusers": "Lhista de outelizadores",
"newpages": "Páiginas nuobas",
+ "newpages-submit": "Amostrar",
"ancientpages": "Páiginas mais antigas",
"move": "Arrastrar",
"movethispage": "Arrastrar esta páigina",
@@ -681,6 +711,7 @@
"specialloguserlabel": "Outelizador(a):",
"speciallogtitlelabel": "Albo (tÃtalo ó páigina ó {{ns:user}}:nome d'outelizador):",
"log": "Registros",
+ "logeventslist-submit": "Amostrar",
"all-logs-page": "Todos ls registros públicos",
"logempty": "Nun eisiste nanhue antrada correspondente ne l registro.",
"allpages": "Todas las páiginas",
@@ -692,6 +723,7 @@
"allpagessubmit": "Bota",
"allpagesprefix": "Amostrar páiginas cul perfixo:",
"categories": "Catadories",
+ "categories-submit": "Amostrar",
"linksearch": "Percura de lhigaçones sternas",
"linksearch-ok": "Percurar",
"listusers-submit": "Amostrar",
@@ -711,29 +743,35 @@
"watch": "Begiar",
"watchthispage": "Begiar esta páigina",
"unwatch": "Zantressar-se",
- "watchlist-details": "{{PLURAL:$1|Eisiste $1 páigina|Eisisten $1 páiginas}} na sue lhista de páiginas begiadas, scluindo las páiginas de cumbersa.",
+ "watchlist-details": "{{PLURAL:$1|Eisiste $1 páigina|Eisisten $1 páiginas}} na sue lhista de páiginas begiadas (mais las páiginas de cumbersa).",
"wlheader-enotif": "La notificaçon por correio eiletrónico stá atiba.",
"wlheader-showupdated": "Las páiginas altaradas zde la redadeira beç que las besitou aparecen çtacadas an negrito .",
"wlshowlast": "Ber redadeiras $1 horas $2 dies",
+ "watchlist-submit": "Amostrar",
"watchlist-options": "Oupçones de la lhista de páiginas begiadas",
"watching": "A begiar...",
"unwatching": "A deixar de begiar...",
"enotif_reset": "Marcar todas las páiginas cumo bejitadas",
"created": "criada",
"changed": "demudada",
- "deletepage": "Botar fuora páigina",
+ "deletepage": "Botar fuora la páigina",
+ "excontentauthor": "l cuntenido era: \"$1\", i {{GENDER:$2|l único eiditor|la única eiditora|l(a) único(a) eiditor(a)}} era [[Special:Contributions/$2|$2]] ([[User talk:$2|cumbersa]])",
"delete-confirm": "Botar fuora \"$1\"",
"delete-legend": "Botar fuora",
"historywarning": "Abiso: La páigina que stás quaije a botar fuora ten un stórico cun aprossimadamente $1 {{PLURAL:$1|rebison|rebisones}}:",
+ "historyaction-submit": "Amostrar",
"confirmdeletetext": "Stás quaije a botar fuora para siempre ua páigina ó ua eimaige i todos ls sous stóricos.\nPor fabor, bei se ye esso que quieres fazer, que antendes las cunsequéncias i se esso stá d'acordo culas [[{{MediaWiki:Policy-url}}|polÃticas]].",
"actioncomplete": "Acion acabada",
- "deletedtext": "\"$1\" fue elhiminada.\nConsulte $2 para um registo de eliminações recentes.",
+ "deletedtext": "\"$1\" fue botada fuora.\nCunsulte $2 pa un registro reciente de las páiginas botadas fuora.",
"dellogpage": "Registro de botado fuora",
"deletecomment": "Rezon:",
"deleteotherreason": "Rezon adicional:",
"deletereasonotherlist": "Outra rezon",
"deletereason-dropdown": "* Motibos d'eliminaçon quemuns\n** Spam\n** Bandalismo\n** Biolaçon de dreitos d'outor\n** Pedido de l'outor\n** Ancaminamiento ambálido",
+ "delete-edit-reasonlist": "Eiditar rezones de botar fuora",
"rollbacklink": "retornar",
+ "rollbacklinkcount": "çfazer $1 {{PLURAL:$1|eidiçon|eidiçones}}",
+ "revertpage": "Fúrun çfeitas las eidiçones de [[Special:Contributions/$2|$2]] ([[User talk:$2|cumbersa]]) pa la redadeira rebison de [[User:$1|$1]]",
"protectlogpage": "Registro de porteçon",
"protectedarticle": "porteger \"[[$1]]\"",
"modifiedarticleprotection": "demudeste l nible de porteçon pa \"[[$1]]\"",
@@ -763,6 +801,9 @@
"undeletelink": "ber/restourar",
"namespace": "Spácio de nomes:",
"invert": "Amberter scuolha",
+ "tooltip-invert": "Marque esta caixa pa scunder las altaraçones la páiginas ne l domÃnio selecionado (i ne l domÃnio associado, se scolheu la oupçon)",
+ "namespace_association": "DomÃnio associado",
+ "tooltip-namespace_association": "Marque esta caixa pa ancluir tamien l domÃnio de cuntenido ó de cumbersa associado a la sue seleçon",
"blanknamespace": "(Percipal)",
"contributions": "Cuntribuiçones {{GENDER:$1|de l outelizador|de la outelizadora|de l(a) outelizador(a)}}",
"contributions-title": "Upas {{GENDER:$1|de l outelizador|de la outelizadora}} $1",
@@ -814,7 +855,9 @@
"move-watch": "Begiar esta páigina",
"movepagebtn": "Arrastrar páigina",
"pagemovedsub": "Páigina arrastrada cumo debe de ser",
- "movepage-moved": "'''\"$1\" fui arrastrado pa \"$2\"'''",
+ "movepage-moved": "\"$1\" fui arrastrada pa \"$2\" ",
+ "movepage-moved-redirect": "Fui criado un ancaminamiento.",
+ "movepage-moved-noredirect": "La criaçon dun ancaminamiento fui suprimida.",
"articleexists": "Yá eisiste ua páigina cun este tÃtalo, ou l tÃtalo que scolhiste ye ambálido.\nPor fabor, scuolhe outro nome.",
"movetalk": "Arrastrar tamien la páigina de cumbersa associada",
"move-subpages": "Arrastrar subpáiginas (anté $1)",
@@ -824,6 +867,7 @@
"revertmove": "poner al robés",
"move-leave-redirect": "Criar un ancaminamiento",
"export": "Sportar páiginas",
+ "export-submit": "Sportar",
"export-download": "Grabar cumo fexeiro",
"allmessages": "Todas las mensaiges de l sistema",
"allmessagesname": "Nome",
@@ -840,6 +884,7 @@
"tooltip-pt-mycontris": "{{GENDER:|Mies}} upas",
"tooltip-pt-login": "Tu sós animado pa que te outentiques, inda que esso nun seia oubrigatório.",
"tooltip-pt-logout": "Salir",
+ "tooltip-pt-createaccount": "Ye ancorajado a criar ua cuonta i ampeçar sesson; inda assi, nun ye oubrigatório",
"tooltip-ca-talk": "Cumbersa subre l cuntenido de la páigina",
"tooltip-ca-edit": "Eiditar esta páigina",
"tooltip-ca-addsection": "Ampeçar un cacho nuobo",
@@ -889,6 +934,10 @@
"tooltip-rollback": "\"{{int:rollbacklink}}\" çfazer, cun un solo clique, las eidiçones de l redadeiro eiditor desta páigina.",
"tooltip-undo": "\"Ãfazer\" çfaç esta eidiçoni abre ls campos de eidiçon ne l modo \"ber cumo queda\".\nPremite ajuntar la rezon de la eidiçon ne l sumário.",
"lastmodifiedatby": "Esta páigina fui eiditada pula redadeira beç a la(s) $2 de $1 por $3.",
+ "pageinfo-robot-noindex": "Nun premitida",
+ "pageinfo-subpages-name": "Subpáiginas desta páigina",
+ "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|ancaminamiento|ancaminamientos}}; $3 {{PLURAL:$3|nun ancaminamiento|nun ancaminamientos}})",
+ "pageinfo-magic-words": "{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)",
"pageinfo-toolboxlink": "Anformaçones de la páigina",
"previousdiff": "â Eidiçon d'atrás",
"nextdiff": "Redadeira eidiçon â",
@@ -898,6 +947,9 @@
"file-nohires": "Sin resoluçon maior çponible.",
"svg-long-desc": "fexeiro SVG, de $1 Ã $2 pÃxeles, tamanho: $3",
"show-big-image": "Fexeiro oureginal",
+ "show-big-image-preview": "Tamanho desta antebison: $1.",
+ "show-big-image-other": "{{PLURAL:$2|Outra resoluçon|Outras resoluçones}}: $1.",
+ "show-big-image-size": "$1 Ã $2 pÃxeles",
"newimages": "Galerie de nuobos fexeiros",
"noimages": "Nun hai nada pa ber.",
"ilsubmit": "Percurar",
@@ -978,6 +1030,8 @@
"specialpages-group-pagetools": "Ferramienta de páiginas",
"specialpages-group-wiki": "Dados i ferramientas",
"specialpages-group-redirects": "Páiginas speciales de ancaminamientos",
+ "tag-filter": "Filtrar las [[Special:Tags|etiquetas]]:",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)",
"tags-title": "Eitiquetas",
"tags-edit": "eiditar",
"tags-activate": "atibar",
@@ -987,6 +1041,8 @@
"logentry-move-move": "$1 {{GENDER:$2|arrastrou}} $3 pa $4",
"logentry-move-move-noredirect": "$1 {{GENDER:$2|arrastrou}} $3 pa $4 sin deixar un ancaminamiento",
"logentry-move-move_redir": "$1 {{GENDER:$2|arrastrou}} $3 pa l sou ancaminamiento $4",
+ "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|arrastrou}} $3 pa l sou ancaminamiento $4, suprimindo l purmeiro",
+ "logentry-newusers-create": "La cuonta de {{GENDER:$2|outelizador|outelizadora}} $1 fui criada",
"rightsnone": "(nanhun)",
"searchsuggest-search": "Percurar an {{SITENAME}}",
"mediastatistics-header-multimedia": "Média anriquecida",
diff --git a/languages/i18n/my.json b/languages/i18n/my.json
index 8c67a7c786..13f49bc444 100644
--- a/languages/i18n/my.json
+++ b/languages/i18n/my.json
@@ -408,7 +408,7 @@
"createaccount-title": "{{SITENAME}} á¡áá½áẠá¡áá±á¬áá·áºáá¼á¯áá¯ááºáá¼ááºá¸",
"login-throttled": "áááºááẠlogin áááºááẠá¡áá¼áááºáá¼á±á¬ááºáá¼á¬á¸á
á½á¬ á¡á¬á¸áá¯ááºáá²á·áá¼á®á¸áá¼á
áºáááºá\náá»á±á¸áá°á¸áá¼á¯á áááºááááºááẠ$1 á
á±á¬áá·áºáá±á¸áá«á",
"login-abort-generic": "áá±á¬á·ááºá¡ááºáááºáá¼ááºá¸ áá¡á±á¬ááºáá¼ááºáá« - áá»ááºááááºá¸áá¼á®á¸",
- "loginlanguagelabel": "áá¬áá¬: $1",
+ "loginlanguagelabel": "áá¬áá¬á
áá¬á¸: $1",
"pt-login": "á¡áá±á¬áá·áºáááºáááº",
"pt-login-button": "á¡áá±á¬áá·áºáááºáááº",
"pt-login-continue-button": "áááºááẠáááºáá±á¬ááºáá«",
@@ -752,7 +752,7 @@
"prefs-memberingroups": "{{PLURAL:$1|á¡á¯ááºá
á¯|á¡á¯ááºá
á¯áá»á¬á¸}}á {{GENDER:$2|á¡áá½á²á·áááº}}",
"prefs-registration": "áá¾ááºáá¯á¶áááºááá·áº á¡áá»ááẠ-",
"yourrealname": "áá¬áááºáááºá¸ -",
- "yourlanguage": "áá¬áá¬á
áá¬á¸ -",
+ "yourlanguage": "áá¬áá¬á
áá¬á¸:",
"yournick": "áááºáá¾ááºá¡áá
Ạ-",
"badsig": "ááá¬á¸ááááºááá·áº áááºáá¾ááºá¡áá¼ááºá¸á\nHTML tags ááᯠá
á
áºáá±á¸áá«á",
"badsiglength": "ááá·áºáááºáá¾ááºááẠáá¾ááºáá½ááºá¸áá±áá«áááºá\náááºá¸ááẠá
á¬áá¯á¶á¸ {{PLURAL:$1|áá¯á¶á¸|áá¯á¶á¸}}ááẠááá¾ááºááá«á",
@@ -1466,7 +1466,7 @@
"allmessages-filter-unmodified": "ááá¼á¯áá¼ááºáá¬á¸áá±á¬",
"allmessages-filter-all": "á¡á¬á¸áá¯á¶á¸",
"allmessages-filter-modified": "áá¼á¯áá¼ááºáá¬á¸áá±á¬",
- "allmessages-language": "áá¬áᬠ-",
+ "allmessages-language": "áá¬áá¬á
áá¬á¸:",
"allmessages-filter-submit": "áá½á¬á¸",
"thumbnail-more": "áá¯á¶áá¼á®á¸áá»á²á·áááº",
"filemissing": "ááá¯ááºáá»á±á¬ááºáá±áááº",
diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json
index 7c609948ab..ed2acac903 100644
--- a/languages/i18n/nb.json
+++ b/languages/i18n/nb.json
@@ -1360,7 +1360,7 @@
"rcfilters-empty-filter": "Ingen aktive filtre. Alle bidrag vises.",
"rcfilters-filterlist-title": "Filtre",
"rcfilters-filterlist-whatsthis": "Hvordan virker dette?",
- "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
+ "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på disse (nye) filterverktøyene",
"rcfilters-highlightbutton-title": "Marker resultater",
"rcfilters-highlightmenu-title": "Velg en farge",
"rcfilters-highlightmenu-help": "Velg en farge for å merke denne egenskapen",
@@ -1441,6 +1441,8 @@
"rcfilters-liveupdates-button-title-on": "Slå av live-oppdateringer",
"rcfilters-liveupdates-button-title-off": "Vis nye endringer når de skjer",
"rcfilters-watchlist-markseen-button": "Merk alle endringer som sett.",
+ "rcfilters-watchlist-edit-watchlist-button": "Rediger listen over sider du overvåker",
+ "rcfilters-watchlist-showupdated": "Endringer til sider du ikke har besøkt siden endringene ble gjort vises med fet skrift.",
"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",
@@ -2354,6 +2356,7 @@
"sp-contributions-newonly": "Bare vis bidrag som er sideopprettinger",
"sp-contributions-hideminor": "Skjul mindre endringer",
"sp-contributions-submit": "Søk",
+ "sp-contributions-outofrange": "Kan ikke vise resultater. Det gitte IP-intervallet er større enn CIDR-grensen på /$1.",
"whatlinkshere": "Det som lenker hit",
"whatlinkshere-title": "Sider som lenker til «$1»",
"whatlinkshere-page": "Side:",
diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json
index c33f9540aa..7641ccad1f 100644
--- a/languages/i18n/nn.json
+++ b/languages/i18n/nn.json
@@ -708,7 +708,7 @@
"last": "førre",
"page_first": "fyrste",
"page_last": "siste",
- "histlegend": "Merk av for dei versjonane du vil samanlikne og trykk [Enter] eller klikk på knappen nedst på sida. Forklaring: (no) = skilnad frå den noverande versjonen, (førre) = skilnad frå den førre versjonen, s = småplukk",
+ "histlegend": "Merk av for dei versjonane du vil samanlikne og trykk [Enter] eller klikk på knappen nedst på sida. \nForklaring: ({{int:cur}}) = skilnad frå den noverande versjonen, ({{int:last}}) = skilnad frå den førre versjonen, {{int:minoreditletter}} = småplukk",
"history-fieldset-title": "Søk etter versjonar",
"history-show-deleted": "Berre sletta versjonar",
"histfirst": "eldste",
diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json
index 8fcd2b7655..f18a32f560 100644
--- a/languages/i18n/pl.json
+++ b/languages/i18n/pl.json
@@ -89,7 +89,8 @@
"Kirsan",
"Krottyianock",
"Mazab IZW",
- "InternerowyGoÅÄ
b"
+ "InternerowyGoÅÄ
b",
+ "Wojtas"
]
},
"tog-underline": "PodkreÅlenie linków:",
@@ -1481,6 +1482,7 @@
"rcfilters-liveupdates-button-title-off": "WyÅwietlaj nowe zmiany zaraz po tym jak nastÄ
piÄ
",
"rcfilters-watchlist-markseen-button": "Oznacz wszystkie zmiany jako obejrzane",
"rcfilters-watchlist-edit-watchlist-button": "Edytuj swojÄ
listÄ obserwowanych stron",
+ "rcfilters-preference-label": "WyÅÄ
cz ulepszenia strony Ostatnie zmiany",
"rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianÄ|pokazano zmiany}} {{PLURAL:$5|wykonanÄ
|wykonane}} po $3, $4 (nie wiÄcej niż '''$1''' pozycji).",
"rclistfromreset": "Zresetuj wybór daty",
"rclistfrom": "Pokaż nowe zmiany od $3 $2",
@@ -3626,7 +3628,7 @@
"htmlform-int-toolow": "Podana wartoÅÄ jest poniżej dopuszczalnego minimum $1",
"htmlform-int-toohigh": "Podana wartoÅÄ jest powyżej dopuszczalnego maximum $1",
"htmlform-required": "Podanie tej wartoÅci jest wymagane",
- "htmlform-submit": "WyÅlij",
+ "htmlform-submit": "PrzeÅlij",
"htmlform-reset": "Cofnij zmiany",
"htmlform-selectorother-other": "Inne",
"htmlform-no": "Nie",
diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json
index e6f323efe8..6749e350f7 100644
--- a/languages/i18n/pt.json
+++ b/languages/i18n/pt.json
@@ -801,6 +801,7 @@
"parser-template-loop-warning": "Ciclo de predefinições detetado: [[$1]]",
"template-loop-category": "Páginas com ciclos infinitos de predefinições",
"template-loop-category-desc": "Esta página contém um ciclo infinito de predefinições, isto é, uma predefinição que se chama a si própria recursivamente.",
+ "template-loop-warning": "Aviso: Esta página chama [[:$1]] o que causa um ciclo infinito de predefinições (uma chamada recursiva sem término).",
"parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
"language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
"node-count-exceeded-category": "Páginas em que o total de nós é excedido",
@@ -1465,6 +1466,8 @@
"rcfilters-watchlist-markseen-button": "Marcar todas as modificações como já vistas",
"rcfilters-watchlist-edit-watchlist-button": "Editar a sua lista de páginas vigiadas",
"rcfilters-watchlist-showupdated": "As mudanças das páginas que ainda não visitou após terem sido alteradas aparecem a negrito , com marcadores sólidos.",
+ "rcfilters-preference-label": "Ocultar a versão melhorada das mudanças recentes",
+ "rcfilters-preference-help": "Reverte o redesenho da interface de 2017 e todas as ferramentas adicionadas na altura e desde então.",
"rcnotefrom": "Abaixo {{PLURAL:$5|está a mudança|estão as mudanças}} desde $2 (mostradas até $1 ).",
"rclistfromreset": "Reiniciar a seleção da data",
"rclistfrom": "Mostrar as novas mudanças a partir das $2 de $3",
diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json
index a92504a3bb..9d2e77dcba 100644
--- a/languages/i18n/qqq.json
+++ b/languages/i18n/qqq.json
@@ -970,6 +970,7 @@
"parser-template-loop-warning": "Parameters:\n* $1 - page title",
"template-loop-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with template loops will be listed.",
"template-loop-category-desc": "Pages with template loops category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Template-loop-category}}",
+ "template-loop-warning": "This message is displayed in edit preview when a template loop is detected on the previewed page.\n\nParameters:\n* $1 - the full title of template which causes the template loop.",
"parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
"language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
"node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
@@ -1662,6 +1663,8 @@
"rcfilters-watchlist-markseen-button": "Label for the button to mark all changes as seen on [[Special:Watchlist]] when using the structured filters interface.",
"rcfilters-watchlist-edit-watchlist-button": "Label for the button to edit the watched pages on [[Special:Watchlist]] when using the structured filters interface.\n\nCf. {{msg-mw|watchlisttools-edit}}.",
"rcfilters-watchlist-showupdated": "Message at the top of [[Special:Watchlist]] when the Structured filters are enabled that describes what unseen changes look like.\n\nCf. {{msg-mw|wlheader-showupdated}}",
+ "rcfilters-preference-label": "Option in RecentChanges tab of [[Special:Preferences]].",
+ "rcfilters-preference-help": "Explanation for the option in the RecentChanges tab of [[Special:Preferences]].",
"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}}.",
diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json
index 5ace4bf1c0..d8de413c8d 100644
--- a/languages/i18n/ru.json
+++ b/languages/i18n/ru.json
@@ -114,7 +114,8 @@
"MustangDSG",
"Valeri'swiki",
"Marat-avgust",
- "Ernác"
+ "Ernác",
+ "Wertuose"
]
},
"tog-underline": "ÐодÑÑÑкивание ÑÑÑлок:",
@@ -848,6 +849,7 @@
"parser-template-loop-warning": "ÐбнаÑÑжена пеÑÐ»Ñ Ð² ÑаблонаÑ
: [[$1]]",
"template-loop-category": "СÑÑаниÑÑ Ñ Ð¿ÐµÑлÑми в ÑаблонаÑ
",
"template-loop-category-desc": "ÐÑа ÑÑÑаниÑа ÑодеÑÐ¶Ð¸Ñ Ð¿ÐµÑÐ»Ñ Ð² Ñаблоне, Ñ.е. Ñаблон, коÑоÑÑй ÑекÑÑÑивно вÑзÑÐ²Ð°ÐµÑ Ñам ÑебÑ.",
+ "template-loop-warning": "ÐÑедÑпÑеждение: strong> ÐÑа ÑÑÑаниÑа вÑзÑÐ²Ð°ÐµÑ [[:$1]], коÑоÑÑй пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñикла в Ñаблоне (беÑконеÑнÑй ÑекÑÑÑивнÑй вÑзов).",
"parser-template-recursion-depth-warning": "ÐÑевÑÑен пÑедел глÑÐ±Ð¸Ð½Ñ ÑекÑÑÑии Ñаблона ($1)",
"language-converter-depth-warning": "ÐÑевÑÑен пÑедел глÑÐ±Ð¸Ð½Ñ Ð¿ÑеобÑазоваÑÐµÐ»Ñ ÑзÑков ($1)",
"node-count-exceeded-category": "СÑÑаниÑÑ, на коÑоÑÑÑ
пÑевÑÑено ÑиÑло Ñзлов",
@@ -1394,7 +1396,7 @@
"recentchanges-legend-plusminus": "(''±123'')",
"recentchanges-submit": "ÐоказаÑÑ",
"rcfilters-tag-remove": "УдалиÑÑ '$1'",
- "rcfilters-legend-heading": "ÐÑÑÑÑ
аÑÑÑÑÐ»Ð°Ð½Ñ ÑизмеÑи: ",
+ "rcfilters-legend-heading": "СпиÑок ÑокÑаÑений: ",
"rcfilters-other-review-tools": "ÐÑÑгие инÑÑÑÑменÑÑ Ð¿ÑовеÑки ",
"rcfilters-group-results-by-page": "ÐÑÑппиÑоваÑÑ ÑезÑлÑÑаÑÑ Ð¿Ð¾ ÑÑÑаниÑе",
"rcfilters-grouping-title": "ÐÑÑппиÑовка",
@@ -1504,7 +1506,7 @@
"rcfilters-view-advanced-filters-label": "РаÑÑиÑеннÑе ÑилÑÑÑÑ",
"rcfilters-view-tags": "ТегиÑованнÑе пÑавки",
"rcfilters-view-namespaces-tooltip": "РезÑлÑÑаÑÑ ÑилÑÑÑа по пÑоÑÑÑанÑÑвам имÑн",
- "rcfilters-view-tags-tooltip": "РезÑлÑÑаÑÑ ÑилÑÑÑа, иÑполÑзÑÑÑего меÑки пÑавок",
+ "rcfilters-view-tags-tooltip": "ФилÑÑÑоваÑÑ ÑезÑлÑÑаÑÑ, иÑполÑзÑÑ Ð¼ÐµÑки пÑавок",
"rcfilters-view-return-to-default-tooltip": "ÐеÑнÑÑÑÑÑ Ð² главное Ð¼ÐµÐ½Ñ ÑилÑÑÑов",
"rcfilters-liveupdates-button": "ÐбновлÑÑÑ Ð°Ð²ÑомаÑиÑеÑки",
"rcfilters-liveupdates-button-title-on": "ÐÑклÑÑиÑÑ Ð°Ð²ÑомаÑиÑеÑкие обновлениÑ",
@@ -1512,6 +1514,8 @@
"rcfilters-watchlist-markseen-button": "ÐÑмеÑиÑÑ Ð²Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ðº пÑоÑмоÑÑеннÑе",
"rcfilters-watchlist-edit-watchlist-button": "РедакÑиÑоваÑÑ Ð²Ð°Ñ ÑпиÑок пÑоÑмоÑÑеннÑÑ
ÑÑÑаниÑ",
"rcfilters-watchlist-showupdated": "ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑаниÑ, коÑоÑÑе Ð²Ñ Ð½Ðµ поÑеÑали Ñ Ñого моменÑа, как они изменилиÑÑ, вÑÐ´ÐµÐ»ÐµÐ½Ñ Ð¶Ð¸ÑнÑм и оÑмеÑÐµÐ½Ñ Ð¿Ð¾Ð»Ð½Ñм маÑкеÑом.",
+ "rcfilters-preference-label": "СкÑÑÑÑ ÑлÑÑÑеннÑÑ Ð²ÐµÑÑÐ¸Ñ ÐоÑледниÑ
изменений",
+ "rcfilters-preference-help": "ÐÑкаÑÑÐ²Ð°ÐµÑ Ñедизайн инÑеÑÑейÑа 2017 года и вÑе инÑÑÑÑменÑÑ, добавленнÑе Ñ ÑеÑ
поÑ.",
"rcnotefrom": "Ðиже {{PLURAL:$5|Ñказано изменение|пеÑеÑиÑÐ»ÐµÐ½Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ}} Ñ $3, $4 (показано не более $1 ).",
"rclistfromreset": "СбÑоÑиÑÑ Ð²ÑÐ±Ð¾Ñ Ð´Ð°ÑÑ",
"rclistfrom": "ÐоказаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ $3 $2.",
diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json
index 99a793b416..bc9b0ce327 100644
--- a/languages/i18n/sl.json
+++ b/languages/i18n/sl.json
@@ -742,6 +742,7 @@
"parser-template-loop-warning": "V predlogi je bila odkrita zanka: [[$1]]",
"template-loop-category": "Strani z zankami predlog",
"template-loop-category-desc": "Stran vsebuje zanko predloge, tj. predlogo, ki rekurzivno kliÄe sama sebe.",
+ "template-loop-warning": "Opozorilo: Ta stran kliÄe [[:$1]], kar povzroÄi zanko predloge (neskonÄni rekurzivni klic).",
"parser-template-recursion-depth-warning": "PrekoraÄena globina rekurzije predlog ($1)",
"language-converter-depth-warning": "PrekoraÄena globina pretvorbe jezikov ($1)",
"node-count-exceeded-category": "Strani s prekoraÄenim Å¡tevilom vozliÅ¡Ä",
@@ -1406,6 +1407,8 @@
"rcfilters-watchlist-markseen-button": "OznaÄi vse spremembe kot pregledane",
"rcfilters-watchlist-edit-watchlist-button": "Uredite svoj seznam nadzorovanih strani",
"rcfilters-watchlist-showupdated": "Spremembe strani, ki jih niste obiskali od zadnje spremembe, so prikazane krepko , z moÄnimi oznakami.",
+ "rcfilters-preference-label": "Skrij izboljÅ¡ano razliÄico Zadnjih sprememb",
+ "rcfilters-preference-help": "Povrne preoblikovanje vmesnika leta 2017 in vsa takrat in od takrat dodana orodja.",
"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",
diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json
index 69e3252b64..c933046080 100644
--- a/languages/i18n/sr-ec.json
+++ b/languages/i18n/sr-ec.json
@@ -707,7 +707,7 @@
"permissionserrorstext": "ÐемаÑе овлаÑÑеÑе за Ð¾Ð²Ñ ÑадÑÑ Ð¸Ð· {{PLURAL:$1|1=ÑледеÑег|ÑледеÑиÑ
}} Ñазлога:",
"permissionserrorstext-withaction": "ÐемаÑе Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ Ð·Ð° $2 из {{PLURAL:$1|ÑледеÑег|ÑледеÑиÑ
}} Ñазлога:",
"recreate-moveddeleted-warn": "УпозоÑеÑе: поново пÑавиÑе ÑÑÑаниÑÑ ÐºÐ¾Ñа Ñе пÑеÑÑ
одно обÑиÑана. \n\nРазмоÑÑиÑе да ли Ñе пÑикладно да наÑÑавиÑе Ñ ÑÑеÑиваÑем ове ÑÑÑаниÑе.\nÐвде Ñе наведена иÑÑоÑиÑа бÑиÑаÑа и пÑемеÑÑаÑа Ñ Ð¾Ð±ÑазложеÑем:",
- "moveddeleted-notice": "Ðва ÑÑÑаниÑа Ñе обÑиÑана.\nÐÑÑоÑиÑа Ñеног бÑиÑаÑа и пÑемеÑÑаÑа налази Ñе иÑпод:",
+ "moveddeleted-notice": "Ðва ÑÑÑаниÑа Ñе обÑиÑана.\nÐÑÑоÑиÑа Ñеног бÑиÑаÑа, заÑÑиÑе и пÑемеÑÑаÑа налази Ñе иÑпод:",
"moveddeleted-notice-recent": "Ðао нам Ñе, ова ÑÑÑаниÑа Ñе недавно обÑиÑана (Ñ Ð¿Ð¾ÑледÑиÑ
24 ÑаÑа).\nÐвде Ñе наведена иÑÑоÑиÑа бÑиÑаÑа и пÑемеÑÑаÑа Ñ Ð¾Ð±ÑазложеÑем.",
"log-fulllog": "ÐÐ¾Ð³Ð»ÐµÐ´Ð°Ñ ÑÐµÐ»Ñ Ð¸ÑÑоÑиÑÑ",
"edit-hook-aborted": "ÐÐ·Ð¼ÐµÐ½Ñ Ñе пÑекинÑла кÑка.\nÐиÑе даÑо никакво обÑазложеÑе.",
@@ -3675,6 +3675,7 @@
"mw-widgets-mediasearch-noresults": "Ðема ÑезÑлÑаÑа.",
"mw-widgets-titleinput-description-new-page": "ÑÑÑаниÑа ÑÐ¾Ñ Ñвек не поÑÑоÑи",
"mw-widgets-titleinput-description-redirect": "пÑеÑÑмеÑава на $1",
+ "mw-widgets-usersmultiselect-placeholder": "ÐÐ¾Ð´Ð°Ñ ÑоÑ...",
"date-range-from": "Ðд даÑÑма:",
"date-range-to": "Ðо даÑÑма:",
"randomrootpage": "СлÑÑаÑна коÑенÑка ÑÑÑаниÑа",
diff --git a/languages/i18n/su.json b/languages/i18n/su.json
index 231f0ce1d6..3139e6699d 100644
--- a/languages/i18n/su.json
+++ b/languages/i18n/su.json
@@ -316,13 +316,13 @@
"internalerror": "Kasalahan internal",
"internalerror_info": "Kasalahan internal: $1",
"internalerror-fatal-exception": "Mahiwal dina ketikan \"$1\"",
- "filecopyerror": "Teu bisa nyalin koropak \"$1\" ka \"$2\".",
- "filerenameerror": "Teu bisa ngaganti ngaran koropak \"$1\" jadi \"$2\".",
- "filedeleteerror": "Teu bisa ngahapus koropak \"$1\".",
+ "filecopyerror": "Teu bisa néplak berkas \"$1\" ka \"$2\".",
+ "filerenameerror": "Teu bisa ngarobah ngaran berkas \"$1\" jadi \"$2\".",
+ "filedeleteerror": "Teu bisa mupus berkas \"$1\".",
"directorycreateerror": "Henteu bisa nyieun diréktori \"$1\".",
"directoryreadonlyerror": "Diréktori \"$1\" ukur-baca.",
"directorynotreadableerror": "Diréktori \"$1\" henteu bisa dibaca.",
- "filenotfound": "Teu bisa manggihan koropak \"$1\".",
+ "filenotfound": "Teu bisa manggihan berkas \"$1\".",
"unexpected": "Peunteun di luar hontalan: \"$1\"=\"$2\".",
"formerror": "Kasalahan: teu bisa ngirim formulir",
"badarticleerror": "Peta ieu teu bisa dipigawé na kaca ieu.",
@@ -983,11 +983,11 @@
"timezoneregion-europe": "Ãropah",
"timezoneregion-indian": "Samudra Indonésia",
"timezoneregion-pacific": "Samudra Pasifik",
- "allowemail": "Buka koropak pikeun nampa surélék ti nu séjén",
+ "allowemail": "Buka berkas pikeun nampa surélék ti nu séjén",
"prefs-searchoptions": "Paluruh",
"prefs-namespaces": "Ngaranspasi",
"default": "ti dituna",
- "prefs-files": "Koropak",
+ "prefs-files": "Berkas",
"prefs-custom-css": "CSS sakahayang",
"prefs-custom-js": "JavaScript sakahayang",
"prefs-common-css-js": "CSS/JavaScript dipaké pikeun sakabéh kulit:",
@@ -1051,6 +1051,8 @@
"userrights-expiry": "Kadaluwarsa:",
"userrights-expiry-existing": "Waktu kadaluwarsa kiwari: $3, $2",
"userrights-expiry-othertime": "Séjén waktu:",
+ "userrights-invalid-expiry": "Waktu kadaluwarsa pikeun gorombolan \"$1\" teu sah.",
+ "userrights-expiry-in-past": "Waktu kadaluwarsa pikeun gorombolan \"$1\" geus kaliwat berlalu.",
"group": "Gorombolan:",
"group-user": "Pamaké",
"group-autoconfirmed": "Pamaké anu otomatis dikonfirmasi",
@@ -1084,7 +1086,7 @@
"right-movefile": "Mindahkeun berkas",
"right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca",
"right-upload": "Unjal berkas",
- "right-reupload": "Nimpah koropak nu geus aya",
+ "right-reupload": "Ngalandih berkas 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": "Unjal berkas tina alamat URL",
@@ -1111,6 +1113,7 @@
"right-unblockself": "buka peungpeuk sorangan",
"right-protect": "Ngarobah hambalan protéksi jeung édit kaca anu dikonci",
"right-editprotected": "Edit kaca anu dikonci salaku \"{{int:protect-level-sysop}}\"",
+ "right-editsemiprotected": "Ãdit kaca nu ditantayungan minangka \"{{int:protect-level-autoconfirmed}}\"",
"right-editcontentmodel": "Ãdit modél kontén kaca",
"right-editinterface": "Ãdit antarbenget pamaké",
"right-editusercss": "Ãdit berkas CSS pamaké séjén",
@@ -1118,9 +1121,11 @@
"right-editmyusercss": "Ãdit berkas CSS pamaké anjeun",
"right-editmyuserjs": "Ãdit berkas JavaScript pamaké anjeun",
"right-viewmywatchlist": "Tempo awaskeuneun anjeun",
+ "right-editmywatchlist": "Ãdit daptar awaskeuneun anjeung. Masih aya cara nambahkeun kaca tanpa kudu mibanda ieu hak.",
"right-viewmyprivateinfo": "Tempo data pribadi anjeun (alamat surélék, ngaran asli)",
"right-editmyprivateinfo": "Robah data pribadi anjeun (alamat surélék, ngaran asli)",
"right-editmyoptions": "Robah préferénsi anjeun",
+ "right-rollback": "Geuwat malikkeun éditan-éditan pamaké panungtung nu ngédit kaca tinangtu",
"right-markbotedits": "Nandaan pamalikan révisi minangka éditan bot",
"right-noratelimit": "Teu dipangaruhan ku wawatesan jumlah éditan",
"right-import": "Ngimpor kaca ti wiki séjén",
@@ -1190,7 +1195,7 @@
"action-move-categorypages": "pindahkeun kaca kategori",
"action-movefile": "mindahkeun ieu berkas",
"action-upload": "ngamuat ieu berkas",
- "action-reupload": "nimpah berkas nu geus aya ieu",
+ "action-reupload": "ngalandih berkas nu geus aya",
"action-reupload-shared": "nimpah ier berkas dina gudang sadaya",
"action-upload_by_url": "ngamuat ieu berkas ti URL",
"action-writeapi": "maké API",
@@ -1413,8 +1418,8 @@
"upload-preferred": "Tipeu koropak nu dianjurkeun: $1.",
"upload-prohibited": "{{PLURAL:$2|Jinis}} berkas nu dilarang: $1.",
"uploadlogpage": "Log unggahan",
- "uploadlogpagetext": "Di handap mangrupa daptar muatan koropak nu panganyarna. Titimangsa nu katémbong dumasar titimangsa server.",
- "filename": "Ngaran koropak",
+ "uploadlogpagetext": "Di handap téh daptar unjalan berkas panganyarna. \nTémbong [[Special:NewFiles|galéri berkas anyar]] pikeun pidangan visual.",
+ "filename": "Ngaran berkas",
"filedesc": "Ringkesna",
"fileuploadsummary": "Ringkesan:",
"filereuploadsummary": "Parobahan berkas:",
@@ -1422,8 +1427,8 @@
"filesource": "Sumber:",
"ignorewarning": "Ulah diwaro, simpen baé koropakna.",
"ignorewarnings": "Tong diwaro panginget naon baé",
- "minlength1": "Ngaran koropak sahanteuna kudu diwangun ku hiji aksara.",
- "illegalfilename": "Ngaran koropak \"$1\" ngandung aksara nu teu diwenangkeun pikeun judul kaca. Mangga gentos ngaranna tur cobi muatkeun deui.",
+ "minlength1": "Ngaran koropak sahenteuna ngandung sahurup.",
+ "illegalfilename": "Ngaran berkas \"$1\" ngandung aksara nu teu diwenangkeun pikeun judul kaca. Mangga ganti ngaranna tur coba unjal deui.",
"filename-toolong": "Ngaran berkas teu meunang leuwih ti 240 bit.",
"badfilename": "Ngaran gambar geus dirobah jadi \"$1\".",
"filetype-mime-mismatch": "Ãksténsi berkas \".$1\" teu luyu jeung tipeu MIME anu kadetéksi ti berkas ($2).",
@@ -1443,9 +1448,9 @@
"unknown-error": "Aya kasalahan anu teu dikanyahoankeun.",
"tmp-create-error": "Teu bisa nyieun berkas sementara.",
"tmp-write-error": "Ãror nulis berkas sementara.",
- "large-file": "Hadéna mah koropak nu dimuat téh teu leuwih ti $1 bit; ieu koropak gedéna $2 bit.",
- "largefileserver": "Ieu koropak badag teuing, ngaleuwihan wates nu diwenangkeun ku server.",
- "emptyfile": "Koropak nu dimuatkeun ku anjeun jigana kosong. Hal ieu bisa jadi alatan sarupaning ''typo'' na ngaran koropakna. Mangga parios deui yén anjeun leres-leres hoyong ngamuat koropak éta.",
+ "large-file": "Alusna mah ukuran berkas téh teu leuwih ti $1;\nari ieu berkas $2.",
+ "largefileserver": "Ieu berkas leuwih badag tina nu diwenangkeun ku sérver.",
+ "emptyfile": "Berkas nu diunjal ku anjeun jigana mah kosong. Ieu perkara meureun alatan salah ketik dina ngaran berkasna. Pék pastikeun yén anjeun téh bener-bener hayang ngunjal éta berkas.",
"windows-nonascii-filename": "Ieu wiki teu ngarojong ngaran berkas anu maké aksara husus.",
"fileexists": "Berkas nu ngaranna kieu geus aya, mangga parios [[:$1]] mun {{GENDER:|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.",
@@ -1455,23 +1460,23 @@
"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",
"uploadwarning-text": "Ropéa pedaran berkas di handap terus cobaan deui.",
- "savefile": "Simpen koropak",
+ "savefile": "Simpen berkas",
"uploaddisabled": "Punten, ngamuat ayeuna ditumpurkeun.",
"copyuploaddisabled": "Unggahan dumasar URL ditumpurkeun.",
- "uploaddisabledtext": "Fungsi ngamuat koropak ditumpurkeun.",
- "uploadscripted": "Koropak ieu ngandung kode HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat (''web browser'').",
+ "uploaddisabledtext": "Fungsi ngunjal berkas ditumpurkeun.",
+ "uploadscripted": "Ieu berkas ngandung kodeu HTML atawa skrip nu bisa dibaca ngaco ku panyungsi ramat.",
"uploaded-setting-href-svg": "Maké tag \"sét\" pikeun nambahkeun atribut \"href\" kana élemén utama dipeungpeuk.",
"uploadinvalidxml": "XML na berkas nu diunjal teu bisa didadarkeun.",
"uploadvirus": "Koropakna ngandung virus! Katrangan: $1",
- "upload-source": "Koropak sumber",
- "sourcefilename": "Ngaran koropak sumber:",
+ "upload-source": "Berkas sumber",
+ "sourcefilename": "Ngaran berkas sumber:",
"sourceurl": "URL sumber:",
- "destfilename": "Ngaran koropak tujuan:",
- "upload-maxfilesize": "Ukuran koropak panggedéna: $1",
- "upload-description": "Pedaran koropak",
+ "destfilename": "Ngaran berkas tujuan:",
+ "upload-maxfilesize": "Ukuran maksimum berkas: $1",
+ "upload-description": "Pedaran berkas",
"upload-options": "Pilihan muat",
"watchthisupload": "Awaskeun ieu kaca",
- "filewasdeleted": "Ngaran koropak ieu geus di hapus. Anjeun kudu ningali ka $1 sa acan muatkeun koropak deui",
+ "filewasdeleted": "Berkas nu ngaranna kieu pernah diunjal sarta tuluy dipupus. Pék riksa heula $1 saméméh ngunjal éta berkas téh.",
"upload-proto-error": "Salah protokol",
"upload-file-error": "Kasalahan internal",
"upload-misc-error": "Kasalahan muat anu teu kanyahoan",
@@ -1479,6 +1484,7 @@
"upload-http-error": "Aya galat HTTP: $1",
"upload-copy-upload-invalid-domain": "Unjalan téplakan teu sayaga ti ieu domain.",
"upload-foreign-cant-upload": "Ieu wiki teu diatur pikeun ngunjal berkas ka gudang panyindangan asing.",
+ "upload-dialog-disabled": "Unjal berkas maké ieu dialog dipareuman di ieu wiki.",
"upload-dialog-title": "Unjal berkas",
"upload-dialog-button-cancel": "Bolay",
"upload-dialog-button-back": "Balik deui",
@@ -1487,12 +1493,14 @@
"upload-dialog-button-upload": "Unjal",
"upload-form-label-infoform-title": "Wincikan",
"upload-form-label-infoform-name": "Ngaran",
+ "upload-form-label-infoform-name-tooltip": "Judul déskriptif anu unik pikeun berkas, anu bakal miboga fungsi minangka ngaran berkas. Anjeun bisa maké basa basajan kalawan spasi. Ulah ngawuwuhkeun éksténsi berkas",
"upload-form-label-infoform-description": "Pedaran",
"upload-form-label-usage-title": "Pamakéan",
"upload-form-label-usage-filename": "Ngaran berkas",
"upload-form-label-own-work": "Ieu mah karya kuring sorangan",
"upload-form-label-infoform-categories": "Kategori",
"upload-form-label-infoform-date": "Ping",
+ "upload-form-label-not-own-work-local-generic-local": "Sugan anjeun hayang nyoba [[Special:Upload|kaca unjalan baku]].",
"backend-fail-stream": "Teu bisa malidkeun berkas \"$1\"",
"backend-fail-backup": "Teu bisa nyadangkeun berkas \"$1\".",
"backend-fail-notexists": "Berkas $1 euweuh.",
@@ -1530,12 +1538,14 @@
"uploadstash-errclear": "Mersihan berkas nu garagal.",
"uploadstash-refresh": "Nyegerken deui daptar berkas",
"uploadstash-thumbnail": "tempo miniatur",
+ "invalid-chunk-offset": "Opsét potongan teu valid",
"img-auth-accessdenied": "Aksés ditolak",
"img-auth-nofile": "Berkas \"$1\" henteu aya.",
"img-auth-streaming": "Palidan \"$1\".",
"img-auth-noread": "Pamaké teu boga kawenangan maca \"$1\".",
"http-invalid-url": "URL teu bener: $1",
"http-invalid-scheme": "URL kalawan skéma \"$1\" teu dirojong.",
+ "http-request-error": "Pundutan HTTP gagal alatan kasalahan nu teu dipikanyaho.",
"http-read-error": "Kasalahan maca HTTP.",
"http-timed-out": "Pamundutan HTTP béakeun waktu.",
"http-curl-error": "Kasalahan keur nyokot URL: $1",
@@ -1578,13 +1588,13 @@
"filehist-nothumb": "Taya miniatur",
"filehist-user": "Kontributor",
"filehist-dimensions": "Ukuran",
- "filehist-filesize": "Ukuran koropak",
+ "filehist-filesize": "Ukuran berkas",
"filehist-comment": "Kamandang",
"imagelinks": "Pamakéan berkas",
"linkstoimage": "Kaca ieu {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
"nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
"linkstoimage-redirect": "$1 (pangalihan berkas) $2",
- "sharedupload": "Ieu koropak téh ti $1 nu bisa jadi dipaké ku proyék-proyék lianna.",
+ "sharedupload": "Ieu berkas téh ti $1 jeung meureun dipaké ku proyék-proyék séjén.",
"sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
"filepage-nofile": "Taya berkas nu ngaranna kieu.",
"filepage-nofile-link": "Taya berkan nu ngaranna kieu, tapi anjeun bisa [$1 ngunjalkeunna].",
@@ -2016,11 +2026,14 @@
"protectedarticle": "ngonci $1",
"modifiedarticleprotection": "hambalan koncian \"[[$1]]\" geus dirobah",
"unprotectedarticle": "muka konci tina \"[[$1]]\"",
+ "movedarticleprotection": "ngalihkeun pangaturan protéksi ti \"[[$2]]\" ka \"[[$1]]\"",
"protectedarticle-comment": "{{GENDER:$2|Nangtayungan}} \"[[$1]]\"",
+ "modifiedarticleprotection-comment": "{{GENDER:$2|Ngarobah tingkat panangtayungan}} pikeun \"[[$1]]\"",
"protect-title": "Ngonci \"$1\"",
"protect-title-notallowed": "Tempo undak panangtayungan ti \"$1\"",
"prot_1movedto2": "mindahkeun [[$1]] ka [[$2]]",
"protect-badnamespace-title": "Ngaranspasi nu teu bisa ditangtayungan",
+ "protect-badnamespace-text": "Kaca dina ieu ngaranspasi teu bisa diprotéksi.",
"protect-norestrictiontypes-title": "Kaca nu teu karaksa",
"protect-legend": "Konfirmasi ngonci",
"protectcomment": "Alesan:",
@@ -2114,6 +2127,7 @@
"year": "Ti taun (jeung saméméhna):",
"sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
"sp-contributions-newbies-sub": "Pikeun akun anyar",
+ "sp-contributions-newbies-title": "Kontribusi pamaké pikeun akun anyar",
"sp-contributions-blocklog": "log peungpeuk",
"sp-contributions-suppresslog": "kontribusi {{GENDER:$1|pamaké}} nu disamunikeun",
"sp-contributions-deleted": "kontribusi {{GENDER:$1|pamaké}} nu dipupus",
@@ -2165,10 +2179,11 @@
"ipboptions": "2 jam:2 hours,sapoé:1 day,3 poé:3 days,saminggu:1 week,2 minggu:2 weeks,sabulan:1 month,3 bulan:3 months,6 bulan:6 months,sataun:1 year,tanpa wates:infinite",
"ipbhidename": "Sumputkeun ngaran pamaké tina éditan jeung daptar pamaké",
"ipbwatchuser": "Awaskeun kaca pamaké jeung kaca obrolan pamaké ieu",
+ "ipb-change-block": "Peungpeuk deui pamaké kalawan sét konfigurasi ieu",
"ipb-confirm": "Konfirmasi peungpeuk",
"badipaddress": "Alamat IP teu sah",
"blockipsuccesssub": "Meungpeuk geus hasil",
- "blockipsuccesstext": "\"$1\" dipeungpeuk.\n Tempo [[Special:BlockList|daptar peungpeuk IP]] pikeun nempoan deui peungpeuk.",
+ "blockipsuccesstext": "[[Special:Contributions/$1|$1]] geus dipeungpeuk. \nTempo [[Special:BlockList|daptar peungpeukan]] pikeun niténan deui pameungpeukan.",
"ipb-edit-dropdown": "Ãdit alesan meungpeuk",
"ipb-unblock-addr": "Buka peungpeuk $1",
"ipb-unblock": "Nyabut peungpeuk pamaké atawa alamat IP",
@@ -2379,14 +2394,14 @@
"imported-log-entries": "Geus diimpor $1 {{PLURAL:$1|saéntri log|éntri log}}.",
"importfailed": "Ngimpor gagal: $1",
"importunknownsource": "Tipeu sumber impor teu dipikawanoh",
- "importcantopen": "Teu bisa muka koropak impor",
+ "importcantopen": "Teu bisa muka berkas impor",
"importbadinterwiki": "Tutumbu antarwiki awon",
"importsuccess": "Ngimpor geus hasil!",
"importnosources": "Taya wiki ti nu diimpor nu geus dijieun sarta pamuatan jujuta sacara langsung geus di non-aktifkeun.",
- "importnofile": "Euweuh koropak impor nu dimuat.",
- "importuploaderrorsize": "Koropak impor gagal dimuat. Ukuranana ngaleuwihan wates nu diwenangkeun.",
- "importuploaderrorpartial": "Koropak impor gagal dimuat sagemblengna.",
- "importuploaderrortemp": "Koropak impor gagal dimuat. Folder samentarana leungit.",
+ "importnofile": "Euweuh berkas impor nu diunjal.",
+ "importuploaderrorsize": "Unjalan berkas impor gagal. Ukuranna ngaleuwihan wates nu diwenangkeun.",
+ "importuploaderrorpartial": "Unjalan berkas impor gagal.\nNgan sawaréh berkas nu ngahasil diunjal.",
+ "importuploaderrortemp": "Unjalan berkas impor gagal. Folder témporérna leungit.",
"import-parse-failure": "Prosés impor XML teu hasil",
"import-noarticle": "Euweuh kaca imporeun!",
"import-nonewrevisions": "Euweuh révisi nu diimpor (sakum révisi geus aya atawa diliwatan lantaran kasalahan).",
@@ -2400,6 +2415,7 @@
"import-logentry-interwiki-detail": "$1 {{PLURAL:$1|sarévisi|révisi}} diimpor ti $2",
"javascripttest": "Nguji JavaScript",
"javascripttest-pagetext-unknownaction": "Tarékah \"$1\" teu dipikanyaho.",
+ "javascripttest-qunit-intro": "Tempo [$1 dokuméntasi pangujian] di mediawiki.org.",
"tooltip-pt-userpage": "Kaca {{GENDER:|pamaké anjeun}}",
"tooltip-pt-anonuserpage": "Kaca pamaké pikeun IP nu ku anjeun keur diédit",
"tooltip-pt-mytalk": "Kaca obrolan {{GENDER:|anjeun}}",
@@ -2522,7 +2538,9 @@
"pageinfo-redirectsto-info": "info",
"pageinfo-contentpage": "Diitung minangka kaca eusi",
"pageinfo-contentpage-yes": "Enya",
+ "pageinfo-protect-cascading": "Panangtayungan ngaruntuy ti dieu",
"pageinfo-protect-cascading-yes": "Enya",
+ "pageinfo-protect-cascading-from": "Panangtayungan mapay ti",
"pageinfo-category-info": "Info kategori",
"pageinfo-category-total": "Jumlah anggahota",
"pageinfo-category-pages": "Jumlah kaca",
@@ -2531,6 +2549,7 @@
"pageinfo-user-id": "ID pamaké",
"markaspatrolleddiff": "Tandaan salaku geus diriksa",
"markaspatrolledtext": "Tandaan artikel ieu salaku geus diriksa",
+ "markaspatrolledtext-file": "Tandaan vérsi berkas minangka kaawas",
"markedaspatrolled": "Tandaan salaku geus diriksa",
"markedaspatrolledtext": "Révisi [[:$1]] nu dipilih geus ditandaan salaku geus diroris.",
"rcpatroldisabled": "Ronda Nu Anyar Robah ditumpurkeun",
@@ -2538,6 +2557,8 @@
"markedaspatrollederror": "Teu bisa nandaan geus dipatroli",
"markedaspatrollederrortext": "Anjeun kudu milih révisi anu rék ditandaan geus diroris.",
"markedaspatrollederror-noautopatrol": "Anjeung teu diwenangkeun nandaan pangriksa ka éditan sorangan.",
+ "markedaspatrollednotify": "Ieu parobahan pikeun $1 geus ditandaan kaawas.",
+ "markedaspatrollederrornotify": "Nandaan minangka kaawas gagal.",
"patrol-log-page": "Log patroli",
"patrol-log-header": "Ieu minangka log pikeun révisi nu geus diroris.",
"log-show-hide-patrol": "$1 log rorisan",
@@ -2607,7 +2628,7 @@
"yesterday-at": "Kamari jam $1",
"bad_image_list": "Formatna kieu:\n\nNgan daptar butiran (baris anu dimimitian ku tanda *) anu diitung. \nTutumbu kahiji dina hiji baris dianggap numbu ka berkas anu goréng. \nTutumbu sanggeusna dina baris anu sarua dianggap bener, nyaéta artikel anu midangkeun éta berkas.",
"metadata": "Métadata",
- "metadata-help": "Ieu koropak ngandung émbaran tambahan, nu sigana asalna tina kaméra digital atawa paminday nu dipaké pikeun ngadigitalkeunana. Mun ieu koropak geus dirobah tina bentuk aslina, datana bisa jadi teu bener.",
+ "metadata-help": "Ieu berkas ngandung informasi panambah, mumkin ditambahkeun tina kaméra digital atawa pamindéy nu dipaké pikeun nyieun atawa ngadigitalkeun ieu berkas.\nMun ieu berkas geus diropéa tina wangun aslina, sawatara wincikan meureun baé teu sagemblengna ngarépléksikeun informasi ti ieu berkas nu diropéa téh.",
"metadata-expand": "Témbongkeun wincikan panambah",
"metadata-collapse": "Sumputkeun wincikan panambah",
"metadata-fields": "Widang métadata gambar nu dibéréndélkeun di handap bakal dipidangkeun dina kaca gambar mun tabél métadata disumputkeun.\nNu séjénna bakal disumputkeun sakumaha asalna.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
@@ -3048,7 +3069,7 @@
"redirect-logid": "ID log",
"redirect-not-exists": "Ajén teu kapanggih",
"fileduplicatesearch": "Paluruh gambar duplikat",
- "fileduplicatesearch-filename": "Ngaran koropak:",
+ "fileduplicatesearch-filename": "Ngaran berkas:",
"fileduplicatesearch-submit": "Paluruh",
"fileduplicatesearch-info": "$1 Ã $2 piksel Ukuran koropak: $3 Tipeu MIME: $4",
"fileduplicatesearch-result-1": "Koropak \"$1\" teu boga duplikat idéntik.",
diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json
index 77474e8759..af6289705b 100644
--- a/languages/i18n/zh-hans.json
+++ b/languages/i18n/zh-hans.json
@@ -826,6 +826,7 @@
"parser-template-loop-warning": "æ£æ¥å°æ¨¡æ¿å¾ªç¯ï¼[[$1]]",
"template-loop-category": "æ模æ¿å¾ªç¯ç页é¢",
"template-loop-category-desc": "页é¢åå¨æ¨¡æ¿å¾ªç¯ï¼å°±æ¯éå½è¿è¡èªæè°ç¨ç模æ¿ã",
+ "template-loop-warning": "è¦åï¼ æ¤é¡µé¢è°ç¨[[:$1]]ï¼è¿å¯¼è´äºæ¨¡æ¿å¾ªç¯ï¼æ ééå½è°ç¨ï¼ã",
"parser-template-recursion-depth-warning": "模æ¿éå½æ·±åº¦è¶éï¼$1ï¼",
"language-converter-depth-warning": "åè¯è½¬æ¢å¨æ·±åº¦è¶éï¼$1ï¼",
"node-count-exceeded-category": "页é¢çèç¹æ°è¶
åºéå¶",
@@ -1490,6 +1491,8 @@
"rcfilters-watchlist-markseen-button": "æ è®°æææ´æ¹ä¸ºå·²æ¥ç",
"rcfilters-watchlist-edit-watchlist-button": "ç¼è¾æ¨ççè§é¡µé¢çå表",
"rcfilters-watchlist-showupdated": "èªæ´æ¹åç以æ¥ï¼å¯¹æ¨å°æªè®¿é®ç页é¢ååºçæ´æ¹ä»¥ç²ä½ æ¾ç¤ºï¼å¹¶å¸¦æç«ä½æ è®°ã",
+ "rcfilters-preference-label": "éèæ¹è¿çæè¿æ´æ¹çæ¬",
+ "rcfilters-preference-help": "è¿åå°2017å¹´çé¢éæ°è®¾è®¡çï¼å¹¶éæ°æ·»å è¿ä»¥åæ°å¢çå·¥å
·ã",
"rcnotefrom": "ä¸é¢{{PLURAL:$5|æ¯}}$3 $4 ä¹åçæ´æ¹ï¼æå¤æ¾ç¤º$1 个ï¼ã",
"rclistfromreset": "éç½®æ¶é´éæ©",
"rclistfrom": "æ¾ç¤º$3 $2ä¹åçæ°æ´æ¹",
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index 89e8089fbf..ecbbb85117 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -1244,8 +1244,8 @@ abstract class Maintenance {
* This function has the same parameters as wfGetDB()
*
* @param int $db DB index (DB_REPLICA/DB_MASTER)
- * @param array $groups; default: empty array
- * @param string|bool $wiki; default: current wiki
+ * @param array $groups default: empty array
+ * @param string|bool $wiki default: current wiki
* @return IMaintainableDatabase
*/
protected function getDB( $db, $groups = [], $wiki = false ) {
diff --git a/maintenance/addSite.php b/maintenance/addSite.php
index 1ebc4f6643..04158aee7a 100644
--- a/maintenance/addSite.php
+++ b/maintenance/addSite.php
@@ -35,6 +35,7 @@ class AddSite extends Maintenance {
/**
* Imports the site described by the parameters (see self::__construct()) passed to this
* maintenance sccript into the sites table of MediaWiki.
+ * @return bool
*/
public function execute() {
$siteStore = MediaWikiServices::getInstance()->getSiteStore();
diff --git a/maintenance/findDeprecated.php b/maintenance/findDeprecated.php
index 94b7fb4429..6128d2386d 100644
--- a/maintenance/findDeprecated.php
+++ b/maintenance/findDeprecated.php
@@ -69,6 +69,8 @@ class DeprecatedInterfaceFinder extends FileAwareNodeVisitor {
/**
* Check whether a function or method includes a call to wfDeprecated(),
* indicating that it is a hard-deprecated interface.
+ * @param PhpParser\Node $node
+ * @return bool
*/
public function isHardDeprecated( PhpParser\Node $node ) {
if ( !$node->stmts ) {
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index d273a6a802..26a9c39935 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -410,7 +410,7 @@ class GenerateSitemap extends Maintenance {
/**
* gzwrite() / fwrite() wrapper
*
- * @param resource $handle
+ * @param resource &$handle
* @param string $str
*/
function write( &$handle, $str ) {
@@ -427,7 +427,7 @@ class GenerateSitemap extends Maintenance {
/**
* gzclose() / fclose() wrapper
*
- * @param resource $handle
+ * @param resource &$handle
*/
function close( &$handle ) {
if ( $this->compress ) {
diff --git a/maintenance/language/zhtable/toCN.manual b/maintenance/language/zhtable/toCN.manual
index 6975e2503c..a63149e6a4 100644
--- a/maintenance/language/zhtable/toCN.manual
+++ b/maintenance/language/zhtable/toCN.manual
@@ -2269,6 +2269,7 @@
è¡åé»è©± 移å¨çµè¯
æµåé»è©± 移å¨çµè¯
æ¸ææ© è°å¶è§£è°å¨
+網åå稱 åå
èé ä¹é¨
è²éæ¯ ä¼¯å©å
¹
ç¶å¾·è§ ä½å¾è§
@@ -2343,6 +2344,7 @@
馬ç¾å°å¤« 马å°ä»£å¤«
馬ç¾ä» 马è³ä»
馬å©å
±åå 马éå
񆆫
+æ±å å£ä½©å¾·ç½èæ
笨豬跳 蹦æè·³
ç»ç´§è·³ 蹦æè·³
çé» ç¬åª
@@ -2400,6 +2402,9 @@
è³æç» æ¬æç»
è³Â·æç» æ¬Â·æç»
æ巴馬 奥巴马
+åç´Â·å·æ® å纳德·ç¹ææ®
+ç¶å·ç¹ææ® å纳德·ç¹ææ®
+ç¶å¥´Â·ç¹ææ® å纳德·ç¹ææ®
åé åæé²
å°åé å°åé©
寮人æ°æ°ä¸»å
±åå èæ人æ°æ°ä¸»å
񆆫
@@ -2480,6 +2485,8 @@
ç¾æ
é ç¾æ
大
ä¸è©å¸ æ§éå±±
è·éæ´» 好è±å
+è·éæ´»é è·éæ´»é
+è·éæ´»å»£å ´ è·é活广åº
麻è©è«¸å¡ 马è¨è¯¸å¡
ä¼å©è«¾ ä¼å©è¯ºä¼
ä¼å©è«¾ä¼ ä¼å©è¯ºä¼
@@ -2501,6 +2508,8 @@
éé« åºä»¶
å¯è® åªè¯»
ä½æ¥ç³»çµ± æä½ç³»ç»
+è¡åä½æ¥ç³»çµ± 移å¨æä½ç³»ç»
+æµåä½æ¥ç³»çµ± 移å¨æä½ç³»ç»
å¤æç¨å¼ æ件
é»æ¶é« æ¶ä½ç®¡
é¡¯ç¤ºå¡ æ¾å¡
@@ -2576,7 +2585,6 @@ Aåèç ç²åèç
è®æ°è¦æ¨¡ éæ°é级
è®æ°å°éè¦æ¨¡ éæ°å°éè§æ¨¡
é»å
ç¹å¶ éæ°
-æ©ç æ¦ç
è¡æ¿ç¸½è£ é¦å¸æ§è¡å®
å·è¡é·ï¼ é¦å¸æ§è¡å®ï¼
å·è¡é·ã é¦å¸æ§è¡å®ã
@@ -2624,6 +2632,7 @@ Aåèç ç²åèç
æ¸ä½æè¡ æ°åææ¯
æ¸ä½è¨è æ°åä¿¡å·
æ¸ç¢¼è¨è æ°åä¿¡å·
+æ¸ä½é³æ¨ æ°åé³ä¹
æ¸ä½å æ°åå
è¡å網路 移å¨ç½ç»
æµå網絡 移å¨ç½ç»
@@ -2672,3 +2681,4 @@ Aåèç ç²åèç
è¡äººè·¯æ è¡äººè·¯æ
å¡è è¢ å¡æè¢
çé¾éºµ ä¹å¬é¢
+æ«ç´¢ æ¯ç´¢
diff --git a/maintenance/language/zhtable/toHK.manual b/maintenance/language/zhtable/toHK.manual
index 7a07259eec..b71764ad7c 100644
--- a/maintenance/language/zhtable/toHK.manual
+++ b/maintenance/language/zhtable/toHK.manual
@@ -14,7 +14,6 @@
å¦å° å¦æ±
å¼¹ç å° å½ç æ±
æå° æºæ±
-å°å¸ æ±å¸
å°å æ±æ
å°ç¯ æ±ç
ååå° å¯«åæ±
@@ -2664,6 +2663,9 @@
æ©å¨äºº æ©æ¢°äºº
移å¨çµè¯ æµåé»è©±
è¡åé»è©± æµåé»è©±
+æä½ç³»ç» ä½æ¥ç³»çµ±
+移å¨æä½ç³»ç» æµåä½æ¥ç³»çµ±
+è¡åä½æ¥ç³»çµ± æµåä½æ¥ç³»çµ±
æ¸ææ© èª¿å¶è§£èª¿å¨
çä¿¡ çè¨
ç°¡è¨ çè¨
@@ -2896,6 +2898,8 @@
è³æç» æ¬æç»
è³Â·æç» æ¬Â·æç»
æ巴馬 奧巴馬
+åç´Â·å·æ® ç¶å·ç¹ææ®
+å纳德·ç¹ææ® ç¶å·ç¹ææ®
æç»Â·å¸æ ç½é«æ¦
ççç ççç
Aè ç²è
@@ -3007,6 +3011,8 @@ IPå°å IPä½å
æ¸ä½æè¡ æ¸ç¢¼æè¡
æ°åä¿¡å· æ¸ç¢¼è¨è
æ¸ç¢¼è¨è æ¸ç¢¼è¨è
+æ°åé³ä¹ æ¸ç¢¼é³æ¨
+æ¸ä½é³æ¨ æ¸ç¢¼é³æ¨
æ°åå æ¸ç¢¼å
æ¸ä½å æ¸ç¢¼å
è¡å網路 æµå網絡
diff --git a/maintenance/language/zhtable/toSimp.manual b/maintenance/language/zhtable/toSimp.manual
index 6f3304fce8..56400c35d4 100644
--- a/maintenance/language/zhtable/toSimp.manual
+++ b/maintenance/language/zhtable/toSimp.manual
@@ -184,6 +184,7 @@
å´è
æè
å´è æè
å´èª¿ æè°
+å´å³¶ æå²
è« è å§å
æ
«æ
ææ¿
éå
æ éå
æ
diff --git a/maintenance/language/zhtable/toTW.manual b/maintenance/language/zhtable/toTW.manual
index d983932fe4..16e275168d 100644
--- a/maintenance/language/zhtable/toTW.manual
+++ b/maintenance/language/zhtable/toTW.manual
@@ -508,7 +508,8 @@
馬å©è 馬éè
é士满 éå¥è
è·éæ´» 好èå¡¢
-è·ææ´»é è·ææ´»é
+è·éæ´»é è·éæ´»é
+è·éæ´»å»£å ´ è·éæ´»å»£å ´
ç»´å°äº¬ç¾¤å² ç¶äº¬ç¾¤å³¶
ç¶ç¾äº¬ç¾¤å³¶ ç¶äº¬ç¾¤å³¶
纽é»æ ç´åè¬
@@ -533,6 +534,7 @@
èç¹å©ç¾ èç¹å©
æ¯å ªççº³ç»´äº æ¯å ªå°é£ç¶äº
æ¯å ªçç´ç¶äº æ¯å ªå°é£ç¶äº
+å£ä½©å¾·ç½èæ æ±å
麦å
å° éº¥å¯
è¿å
å° éº¥å¯
é¯è³æ¯Â·å·´éåç¾
é¯æ¬Â·å·´çåç¾
@@ -604,6 +606,10 @@
è¯å°¼è¿ª ç迺迪
奥巴马 æ巴馬
奧巴馬 æ巴馬
+ç¹ææ® å·æ®
+å纳德·ç¹ææ® åç´Â·å·æ®
+ç¶å·ç¹ææ® åç´Â·å·æ®
+ç¶å¥´Â·ç¹ææ® åç´Â·å·æ®
æ¦ç æ©ç
ç¯çç ççç
ç²è Aè
@@ -619,6 +625,8 @@
æºè½å¡ æºæ
§å¡
æ¸æ庫 è³æ庫
æä½ç³»ç» ä½æ¥ç³»çµ±
+移å¨æä½ç³»ç» è¡åä½æ¥ç³»çµ±
+æµåä½æ¥ç³»çµ± è¡åä½æ¥ç³»çµ±
人æºäº¤äº 人æ©äºå
交äºè®¾è®¡ äºåè¨è¨
äºèç½ç» 網é網路
diff --git a/maintenance/language/zhtable/trad2simp.manual b/maintenance/language/zhtable/trad2simp.manual
index e5b05ffec2..1912bcf240 100644
--- a/maintenance/language/zhtable/trad2simp.manual
+++ b/maintenance/language/zhtable/trad2simp.manual
@@ -135,6 +135,7 @@ U+056D9å|U+056E0å |
U+05705å
|U+051FDå½|
U+0577Få¿|U+09644é|
U+0579Cå|U+0579Bå|
+U+057BBå»|U+0575Då|
U+0585Aå¡|U+051A2å¢|
U+0585Få¡|U+0846Cè¬|
U+05872塲|U+0573Aåº|
diff --git a/maintenance/language/zhtable/tradphrases.manual b/maintenance/language/zhtable/tradphrases.manual
index 9b2e081019..c5d5fd7350 100644
--- a/maintenance/language/zhtable/tradphrases.manual
+++ b/maintenance/language/zhtable/tradphrases.manual
@@ -776,6 +776,7 @@
éªçªè¢å
çå
é±å
+å çµ
é¥é¥
ä¹¾è
æ¯è
@@ -1095,6 +1096,7 @@
ä¸ç°½ç¼
ä¸ç°½ç´
ä¸ç°½äº
+ä¸ç°½è
ä¸ç°½å
ä¸ç°½å
ä¸ç°½æ¶
@@ -1105,6 +1107,7 @@
ä¸ç°½ç¼
ä¸ç°½ç´
ä¸ç°½äº
+ä¸ç°½è
ä¸ç°½å
ä¸ç°½å
ä¸ç°½æ¶
@@ -1115,6 +1118,7 @@
ä¸ç°½ç¼
ä¸ç°½ç´
ä¸ç°½äº
+ä¸ç°½è
çç¡®
磽确
ç¡®ç
@@ -1868,6 +1872,7 @@
山谷 #åè©ç¨
æºè°·
æ¼è°·
+æé²è°·ç©èª
äºç¾äºº
ç·ç·»
æ°äº
@@ -2364,7 +2369,6 @@
å¯èªå¶
å°å女
å°åå«
-å°å¸æ¯
å°å·
å°é¢¨ç©©å¥
ç©©å¥çå°é¢¨
@@ -2393,6 +2397,7 @@
尸鳩
尸佼
å°¸å
+å°¸ç¾
å°¸ç¾
ç²¾è
æ¯å©å°¸ä½
å°¸æ£ä½
@@ -3682,6 +3687,7 @@
èç½ç¼
ç¼çæ
ç¼çæ³
+æç¼ç
å¤äººæäº
æ人æäº
äºæ
@@ -3710,3 +3716,7 @@
æ§å¥ææ²
ç®èå¸
é²åç®è
+éç³»å
+é系統
+éç³»æ
+éç³»ç§
diff --git a/maintenance/language/zhtable/tradphrases_exclude.manual b/maintenance/language/zhtable/tradphrases_exclude.manual
index c622560176..3ab14eb199 100644
--- a/maintenance/language/zhtable/tradphrases_exclude.manual
+++ b/maintenance/language/zhtable/tradphrases_exclude.manual
@@ -776,3 +776,5 @@
éäº
é£äº
ç®è
+æ¢å¹¹
+檯å¸
diff --git a/maintenance/migrateComments.php b/maintenance/migrateComments.php
index 431380647a..9d4e2615c0 100644
--- a/maintenance/migrateComments.php
+++ b/maintenance/migrateComments.php
@@ -222,7 +222,7 @@ class MigrateComments extends LoggedUpdateMaintenance {
* comment ID field.
* Blanks the old fields while migrating.
*
- * @param string $oldTable Table to migrate
+ * @param string $table Table to migrate
* @param string $primaryKey Primary key of the table.
* @param string $oldField Old comment field name
* @param string $newPrimaryKey Primary key of the new table.
diff --git a/maintenance/populateIpChanges.php b/maintenance/populateIpChanges.php
index eb60f801cd..e086c5e9e6 100644
--- a/maintenance/populateIpChanges.php
+++ b/maintenance/populateIpChanges.php
@@ -67,12 +67,12 @@ TEXT
$this->output( "Copying IP revisions to ip_changes, from rev_id $start to rev_id $end\n" );
while ( $blockStart <= $end ) {
- $cond = "rev_id >= $blockStart AND rev_user = 0 ORDER BY rev_id ASC LIMIT " . $this->mBatchSize;
$rows = $dbw->select(
'revision',
[ 'rev_id', 'rev_timestamp', 'rev_user_text' ],
- $cond,
- __METHOD__
+ [ "rev_id >= $blockStart", 'rev_user' => 0 ],
+ __METHOD__,
+ [ 'ORDER BY' => 'rev_id ASC', 'LIMIT' => $this->mBatchSize ]
);
if ( !$rows || $rows->numRows() === 0 ) {
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index 01cf3c3eb1..8ac7f919ee 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -106,6 +106,7 @@ class UserOptions {
/**
* Dumb stuff to run a mode.
+ * @return bool
*/
public function run() {
if ( !$this->mReady ) {
diff --git a/phpcs.xml b/phpcs.xml
index 4c5266e419..bd9890b231 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -20,6 +20,9 @@
+
+
+
diff --git a/resources/src/mediawiki.action/images/close.png b/resources/src/mediawiki.action/images/close.png
new file mode 100644
index 0000000000..80dde95155
Binary files /dev/null and b/resources/src/mediawiki.action/images/close.png differ
diff --git a/resources/src/mediawiki.action/images/close.svg b/resources/src/mediawiki.action/images/close.svg
new file mode 100644
index 0000000000..7f7551128e
--- /dev/null
+++ b/resources/src/mediawiki.action/images/close.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
index e1fa925823..d19f098529 100644
--- a/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
+++ b/resources/src/mediawiki.action/mediawiki.action.view.postEdit.less
@@ -7,7 +7,7 @@
height: 0;
left: 50%;
z-index: 1000;
- font-size: 13px;
+ font-size: 14px;
cursor: pointer;
}
@@ -19,6 +19,24 @@
opacity: 1;
.transition( opacity 250ms );
+ &:after {
+ content: '';
+ background: no-repeat center center;
+ .background-image-svg( 'images/close.svg', 'images/close.png' );
+ background-size: 12px 12px;
+ position: absolute;
+ right: 0.4em;
+ top: 0;
+ bottom: 0;
+ min-width: 32px;
+ min-height: 32px;
+ opacity: 0.87;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
&.mw-notification {
padding-right: 3em;
}
@@ -29,32 +47,13 @@
}
.postedit-icon {
- padding-left: 41px; /* 25 + 8 + 8 */
+ padding-left: 25px;
/* like min-height, but old IE compatible and keeps text vertically aligned, too */
line-height: 25px;
background-repeat: no-repeat;
- background-position: 8px 50%;
}
.postedit-icon-checkmark {
/* @embed */
background-image: url( images/green-checkmark.png );
- background-position: left;
-}
-
-.postedit:after {
- content: 'Ã';
- position: absolute;
- padding: 0 0.8em;
- right: 0;
- top: 0;
- font-size: 1.25em;
- font-weight: bold;
- line-height: 2.3em;
- text-shadow: 0 0.0625em 0 #fff;
- opacity: 0.2;
-}
-
-.postedit:hover:after {
- opacity: 0.4;
}
diff --git a/resources/src/mediawiki.language/mediawiki.language.js b/resources/src/mediawiki.language/mediawiki.language.js
index 3726a68527..6a5243403c 100644
--- a/resources/src/mediawiki.language/mediawiki.language.js
+++ b/resources/src/mediawiki.language/mediawiki.language.js
@@ -188,6 +188,45 @@
setSpecialCharacters: function ( data ) {
this.specialCharacters = data;
+ },
+
+ /**
+ * Formats language tags according the BCP47 standard.
+ * See wfBCP47 for the PHP implementation.
+ *
+ * @param {string} languageTag Well-formed language tag
+ * @return {string}
+ */
+ bcp47: function ( languageTag ) {
+ var formatted,
+ isFirstSegment = true,
+ isPrivate = false,
+ segments = languageTag.split( '-' );
+
+ formatted = segments.map( function ( segment ) {
+ var newSegment;
+
+ // when previous segment is x, it is a private segment and should be lc
+ if ( isPrivate ) {
+ newSegment = segment.toLowerCase();
+ // ISO 3166 country code
+ } else if ( segment.length === 2 && !isFirstSegment ) {
+ newSegment = segment.toUpperCase();
+ // ISO 15924 script code
+ } else if ( segment.length === 4 && !isFirstSegment ) {
+ newSegment = segment.charAt( 0 ).toUpperCase() + segment.substring( 1 ).toLowerCase();
+ // Use lowercase for other cases
+ } else {
+ newSegment = segment.toLowerCase();
+ }
+
+ isPrivate = segment.toLowerCase() === 'x';
+ isFirstSegment = false;
+
+ return newSegment;
+ } );
+
+ return formatted.join( '-' );
}
} );
diff --git a/resources/src/mediawiki.legacy/shared.css b/resources/src/mediawiki.legacy/shared.css
index c6ad65566c..9930525f08 100644
--- a/resources/src/mediawiki.legacy/shared.css
+++ b/resources/src/mediawiki.legacy/shared.css
@@ -278,7 +278,7 @@ p.mw-delete-editreasons {
/* The auto-generated edit comments */
.autocomment {
- color: #808080;
+ color: #72777d;
}
/** Generic minor/bot/newpage styling (recent changes) */
@@ -361,11 +361,11 @@ a.mw-selflink:visited {
* keep in sync with commonPrint.css
*/
table.wikitable {
- margin: 1em 0;
background-color: #f8f9fa;
+ color: #222;
+ margin: 1em 0;
border: 1px solid #a2a9b1;
border-collapse: collapse;
- color: #000;
}
table.wikitable > tr > th,
diff --git a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
index 8d0aa05bb3..f37229f725 100644
--- a/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
+++ b/resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
@@ -561,7 +561,8 @@
'liveUpdate',
{
limit: 1,
- peek: 1, // bypasses all UI
+ // temporarily disabled ( T173613#3591657 )
+ // peek: 1, // bypasses all UI
from: this.changesListModel.getNextFrom()
}
);
diff --git a/resources/src/mediawiki.ui/components/inputs.less b/resources/src/mediawiki.ui/components/inputs.less
index cc9c65a13b..74dc0b756a 100644
--- a/resources/src/mediawiki.ui/components/inputs.less
+++ b/resources/src/mediawiki.ui/components/inputs.less
@@ -29,7 +29,7 @@
width: 100%;
border: 1px solid @colorFieldBorder;
border-radius: @borderRadius;
- padding: 0.625em 0.546875em 0.546875em;
+ padding: 0.625em 0.625em 0.546875em;
// necessary for smooth transition
box-shadow: inset 0 0 0 0.1em #fff;
font-family: inherit;
diff --git a/resources/src/mediawiki/mediawiki.feedback.css b/resources/src/mediawiki/mediawiki.feedback.css
index 6a93fddd67..c4363ed003 100644
--- a/resources/src/mediawiki/mediawiki.feedback.css
+++ b/resources/src/mediawiki/mediawiki.feedback.css
@@ -10,13 +10,22 @@
.mw-feedbackDialog-welcome-message,
.mw-feedbackDialog-feedback-terms {
- line-height: 1.2em;
+ line-height: 1.4;
}
-.mw-feedbackDialog-feedback-form {
- margin-top: 1em;
+.mw-feedbackDialog-welcome-message {
+ margin-bottom: 1em;
+}
+
+/* Overwriting OOUI is no fun */
+.mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
+ min-width: 4.2em;
+ width: 10%;
+}
+.mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+ width: 80%;
}
.mw-feedbackDialog-feedback-termsofuse {
- margin-left: 2.5em;
+ margin-left: 2em;
}
diff --git a/resources/src/mediawiki/mediawiki.util.js b/resources/src/mediawiki/mediawiki.util.js
index 34f7eba473..fb34a89063 100644
--- a/resources/src/mediawiki/mediawiki.util.js
+++ b/resources/src/mediawiki/mediawiki.util.js
@@ -90,14 +90,9 @@
* @return {string} Encoded string
*/
escapeIdForLink: function ( str ) {
- var mode = mw.config.get( 'wgFragmentMode' )[ 0 ],
- id = escapeIdInternal( str, mode );
-
- if ( mode === 'html5' ) {
- id = encodeURIComponent( id ).replace( /%3A/g, ':' );
- }
+ var mode = mw.config.get( 'wgFragmentMode' )[ 0 ];
- return id;
+ return escapeIdInternal( str, mode );
},
/**
diff --git a/tests/integration/includes/http/MWHttpRequestTestCase.php b/tests/integration/includes/http/MWHttpRequestTestCase.php
index 545769681d..81473df227 100644
--- a/tests/integration/includes/http/MWHttpRequestTestCase.php
+++ b/tests/integration/includes/http/MWHttpRequestTestCase.php
@@ -234,7 +234,7 @@ class MWHttpRequestTestCase extends PHPUnit_Framework_TestCase {
/**
* Asserts that the cookie jar does not have the given cookie.
- * @param string $expectedName Cookie name
+ * @param string $name Cookie name
* @param CookieJar $cookieJar
*/
protected function assertNotHasCookie( $name, CookieJar $cookieJar ) {
diff --git a/tests/parser/DbTestPreviewer.php b/tests/parser/DbTestPreviewer.php
index 784c29cf4b..33aee7d304 100644
--- a/tests/parser/DbTestPreviewer.php
+++ b/tests/parser/DbTestPreviewer.php
@@ -29,6 +29,8 @@ class DbTestPreviewer extends TestRecorder {
/**
* This should be called before the table prefix is changed
+ * @param IDatabase $db
+ * @param bool|string $filter
*/
function __construct( $db, $filter = false ) {
$this->db = $db;
diff --git a/tests/parser/ParserTestPrinter.php b/tests/parser/ParserTestPrinter.php
index ac9f150945..94d226c1d5 100644
--- a/tests/parser/ParserTestPrinter.php
+++ b/tests/parser/ParserTestPrinter.php
@@ -280,6 +280,7 @@ class ParserTestPrinter extends TestRecorder {
/**
* Show a warning to the user
+ * @param string $message
*/
public function warning( $message ) {
echo "$message\n";
@@ -287,6 +288,8 @@ class ParserTestPrinter extends TestRecorder {
/**
* Mark a test skipped
+ * @param string $test
+ * @param string $subtest
*/
public function skipped( $test, $subtest ) {
if ( $this->showProgress ) {
diff --git a/tests/parser/ParserTestResultNormalizer.php b/tests/parser/ParserTestResultNormalizer.php
index 37ed85f75d..61aa0d795f 100644
--- a/tests/parser/ParserTestResultNormalizer.php
+++ b/tests/parser/ParserTestResultNormalizer.php
@@ -78,6 +78,7 @@ class ParserTestResultNormalizer {
/**
* Serialize the XML DOM for comparison purposes. This does not generate HTML.
+ * @return string
*/
protected function serialize() {
return strtr( $this->doc->saveXML( $this->body ),
diff --git a/tests/parser/ParserTestRunner.php b/tests/parser/ParserTestRunner.php
index 46c551b68f..5fe2177d11 100644
--- a/tests/parser/ParserTestRunner.php
+++ b/tests/parser/ParserTestRunner.php
@@ -518,6 +518,8 @@ class ParserTestRunner {
/**
* Ensure a given setup stage has been done, throw an exception if it has
* not.
+ * @param string $funcName
+ * @param string|null $funcName2
*/
protected function checkSetupDone( $funcName, $funcName2 = null ) {
if ( !$this->setupDone[$funcName]
@@ -700,6 +702,8 @@ class ParserTestRunner {
/**
* Determine whether the current parser has the hooks registered in it
* that are required by a file read by TestFileReader.
+ * @param array $requirements
+ * @return bool
*/
public function meetsRequirements( $requirements ) {
foreach ( $requirements as $requirement ) {
@@ -1600,12 +1604,15 @@ class ParserTestRunner {
// get a reference to the mock object.
MessageCache::singleton()->getParser();
$restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
- $status = $page->doEditContent(
- ContentHandler::makeContent( $text, $title ),
- '',
- EDIT_NEW | EDIT_INTERNAL
- );
- $restore();
+ try {
+ $status = $page->doEditContent(
+ ContentHandler::makeContent( $text, $title ),
+ '',
+ EDIT_NEW | EDIT_INTERNAL
+ );
+ } finally {
+ $restore();
+ }
if ( !$status->isOK() ) {
throw new MWException( $status->getWikiText( false, false, 'en' ) );
diff --git a/tests/parser/PhpunitTestRecorder.php b/tests/parser/PhpunitTestRecorder.php
index 238d018eee..2f82ca7267 100644
--- a/tests/parser/PhpunitTestRecorder.php
+++ b/tests/parser/PhpunitTestRecorder.php
@@ -9,6 +9,8 @@ class PhpunitTestRecorder extends TestRecorder {
/**
* Mark a test skipped
+ * @param string $test
+ * @param string $reason
*/
public function skipped( $test, $reason ) {
$this->testCase->markTestSkipped( "SKIPPED: $reason" );
diff --git a/tests/parser/TidySupport.php b/tests/parser/TidySupport.php
index 39c9ca5272..6aed02f304 100644
--- a/tests/parser/TidySupport.php
+++ b/tests/parser/TidySupport.php
@@ -29,6 +29,7 @@ class TidySupport {
/**
* Determine if there is a usable tidy.
+ * @param bool $useConfiguration
*/
public function __construct( $useConfiguration = false ) {
global $IP, $wgUseTidy, $wgTidyBin, $wgTidyInternal, $wgTidyConfig,
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
index 3f93793263..ff777e7098 100644
--- a/tests/parser/parserTests.txt
+++ b/tests/parser/parserTests.txt
@@ -307,7 +307,7 @@ CircularRef
!! html/parsoid
[1]
-â Error: Expansion loop detected at Template:CircularRef
+â Error: Expansion loop detected at Template:CircularRef
!! end
!! test
@@ -2449,7 +2449,7 @@ Block tag pre
foo
!! html/parsoid
-
foo
+
foo
!! end
!!test
@@ -4332,6 +4332,21 @@ Definition Lists: Mixed Lists: Test 10
!! end
+# This is a regression test for T175099
+# html/php+tidy is insufficient since Tidy covers up the bug.
+# But once Tidy is replaced with RemexHTML, html/php+tidy is good enough
+!! test
+Definition Lists: Mixed Lists: Test 11
+!! wikitext
+;a
+:*b
+!! html
+a
+
+
+
+!! end
+
# The Parsoid team disagrees with the PHP parser's seemingly-random
# rules regarding dd/dt on the next two tests. Parsoid is more
# consistent, and recognizes the shared nesting and keeps the
@@ -4339,7 +4354,7 @@ Definition Lists: Mixed Lists: Test 10
# (And tidy again converts to before 'bar'.)
!! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 12
!! wikitext
*#*#;*;;foo :bar
*#*#;boo :baz
@@ -6672,7 +6687,7 @@ Don't break on | in extension attribute in template
!! html/parsoid
[1]
-â ha
+â ha
!! end
## We don't support roundtripping of these attributes in Parsoid.
@@ -6847,7 +6862,7 @@ T107652: [s in templates that also generate table cell attributes should be
-]â foo
+â foo
!! end
!! test
@@ -7307,8 +7322,8 @@ parsoid=wt2html
!! html
!! end
@@ -9691,7 +9706,7 @@ parsoid
!! wikitext
*
!! html/parsoid
-
+
!! end
!! test
@@ -9861,6 +9876,17 @@ parsoid=wt2html,wt2wt
+!! html/parsoid
+ foo
+li-hack
+templated li-hack
+ unsupported li-hack with preceding comments
+
+
+
!!end
!! test
@@ -9896,9 +9922,9 @@ Parsoid: Test of whitespace serialization with Templated bullets
parsoid
!! wikitext
* {{bullet}}
-!! html
+!! html/parsoid
!! end
@@ -13206,7 +13232,7 @@ Templates: Wiki Tables: 7. Fosterable [s should get fostered
]
-â foo
+â foo
!!end
!! test
@@ -14245,6 +14271,20 @@ Image with caption, T55312 #3
Caption page=stuff
!! end
+!! test
+Image caption with pipe entity
+!! wikitext
+[[File:Foobar.jpg|thumb|one | two]]
+[[File:Foobar.jpg|thumb|one ''two'' | three]]
+!! html/php
+
+
+
+!! html/parsoid
+one | two
+one two | three
+!! end
+
!! test
Allow empty links in image captions (T62753)
!! options
@@ -15565,7 +15605,7 @@ T93580: 1. Templated [ inside block images
!! html/parsoid
]Caption with templated ref: [1]
-â foo
+â foo
!! end
!! test
@@ -15577,7 +15617,7 @@ T93580: 2. [ inside inline images
!! html/parsoid
]
-â foo
+â foo
!! end
!! test
@@ -15589,7 +15629,7 @@ T93580: 3. Templated [ inside inline images
!! html/parsoid
]
-â foo
+â foo
!! end
###
@@ -18124,7 +18164,7 @@ Parser hook: static parser hook inside a comment
!! html/parsoid
-
+
!! end
# Nested template calls; this case was broken by Parser.php rev 1.506,
@@ -20910,7 +20950,7 @@ HTML with raw HTML ($wgRawHtml==true)
wgRawHtml=1
!! wikitext
-!! html
+!! html/php
!! end
@@ -24409,12 +24449,12 @@ Empty LI and TR nodes should not be stripped from top-level content
!! html/parsoid
-
+
foo
@@ -24428,9 +24468,9 @@ Empty TR nodes should not be stripped if they have any attributes set
{{EmptyTRWithHTMLAttrTest}}
!! html/parsoid
!! end
@@ -25716,7 +25756,7 @@ parsoid=html2wt
'foo [1]
'foo test
'foo and bar
-
+
â test
!! wikitext
@@ -25866,7 +25906,7 @@ a
parsoid=html2wt
!! html/parsoid
foo [1]
-
+
â a
b
@@ -26274,7 +26314,7 @@ RT-ed inter-element separators should be valid separators
!! html/parsoid
!!end
@@ -26421,7 +26461,7 @@ parsoid
!! html
@@ -26443,7 +26483,7 @@ parsoid
!! html
-
+
@@ -29240,17 +29280,18 @@ unclosed internal link XSS (T137264)
[[#%3Cscript%3Ealert(1)%3C/script%3E|
!! end
+# Use $wgRawHtml to inject a
-!! html+tidy
+!! html/php+tidy
@@ -29307,10 +29348,10 @@ wgFragmentMode=[ 'html5', 'legacy' ]
@@ -29320,9 +29361,9 @@ wgFragmentMode=[ 'html5', 'legacy' ]
ТеÑÑ [ edit ]
ÑеÑÑ [ edit ]
Hey < # " > % : ' [ edit ]
-#Foo bar #foo Bar #ТеÑÑ #ÑеÑÑ #Hey < # " > % : '
-
%F0%9F%92%A9
-
#å¤é
#å¤é
+
#Foo bar #foo Bar #ТеÑÑ #ÑеÑÑ #Hey < # " > % : '
+
ð©
+
#å¤é
#å¤é
!! end
@@ -29401,10 +29442,10 @@ wgFragmentMode=[ 'html5' ]
@@ -29414,8 +29455,8 @@ wgFragmentMode=[ 'html5' ]
ТеÑÑ [ edit ]
ÑеÑÑ [ edit ]
Hey < # " > % : ' [ edit ]
-#Foo bar #foo Bar #ТеÑÑ #ÑеÑÑ #Hey < # " > % : '
-
%F0%9F%92%A9
-
#å¤é
#å¤é
+
#Foo bar #foo Bar #ТеÑÑ #ÑеÑÑ #Hey < # " > % : '
+
ð©
+
#å¤é
#å¤é
!! end
diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php
index 91aaff5236..f04eec73b4 100644
--- a/tests/phpunit/MediaWikiTestCase.php
+++ b/tests/phpunit/MediaWikiTestCase.php
@@ -213,6 +213,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
*
* @param Config|null $bootstrapConfig The bootstrap config to use with the new
* MediaWikiServices.
+ * @return MediaWikiServices
*/
protected static function resetGlobalServices( Config $bootstrapConfig = null ) {
$oldServices = MediaWikiServices::getInstance();
@@ -1591,7 +1592,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
*
* @since 1.20
*
- * @param array $array
+ * @param array &$array
*/
protected function objectAssociativeSort( array &$array ) {
uasort(
@@ -1609,7 +1610,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
*
* @since 1.20
*
- * @param mixed $r The array to remove string keys from.
+ * @param mixed &$r The array to remove string keys from.
*/
protected static function stripStringKeys( &$r ) {
if ( !is_array( $r ) ) {
@@ -1832,6 +1833,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
/**
* Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
+ * @param string $buffer
* @return string
*/
public static function wfResetOutputBuffersBarrier( $buffer ) {
diff --git a/tests/phpunit/ResourceLoaderTestCase.php b/tests/phpunit/ResourceLoaderTestCase.php
index f75cc2294c..1024ecd0a6 100644
--- a/tests/phpunit/ResourceLoaderTestCase.php
+++ b/tests/phpunit/ResourceLoaderTestCase.php
@@ -17,6 +17,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
* - string 'modules' Pipe-separated list of module names
* - string|null 'only' "scripts" (unwrapped script), "styles" (stylesheet), or null
* (mw.loader.implement).
+ * @param ResourceLoader|null $rl
* @return ResourceLoaderContext
*/
protected function getResourceLoaderContext( $options = [], ResourceLoader $rl = null ) {
diff --git a/tests/phpunit/data/templates/recurse.mustache b/tests/phpunit/data/templates/recurse.mustache
new file mode 100644
index 0000000000..391f227e3b
--- /dev/null
+++ b/tests/phpunit/data/templates/recurse.mustache
@@ -0,0 +1 @@
+r{{#r}}{{>recurse}}{{/r}}
\ No newline at end of file
diff --git a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
index b6682f7274..a70f136a1c 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
@@ -21,7 +21,7 @@ class WfTimestampTest extends MediaWikiTestCase {
[ -30281104, TS_MW, '19690115123456', 'Negative TS_UNIX to TS_MW' ],
[ $t, TS_UNIX, 979562096, 'TS_UNIX to TS_UNIX' ],
[ $t, TS_DB, '2001-01-15 12:34:56', 'TS_UNIX to TS_DB' ],
- [ $t + .01, TS_MW, '20010115123456', 'TS_UNIX float to TS_MW' ],
+ [ $t + 0.01, TS_MW, '20010115123456', 'TS_UNIX float to TS_MW' ],
[ $t, TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_ISO_8601_BASIC to TS_DB' ],
diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
index d5066235ec..350cb7064e 100644
--- a/tests/phpunit/includes/SanitizerTest.php
+++ b/tests/phpunit/includes/SanitizerTest.php
@@ -432,7 +432,6 @@ class SanitizerTest extends MediaWikiTestCase {
* @covers Sanitizer::escapeIdForLink()
* @covers Sanitizer::escapeIdForExternalInterwiki()
* @covers Sanitizer::escapeIdInternal()
- * @covers Sanitizer::urlEscapeId()
*
* @param string $stuff
* @param string[] $config
@@ -456,7 +455,6 @@ class SanitizerTest extends MediaWikiTestCase {
$text = 'foo ÑеÑÑ_#%!\'()[]:<>';
$legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E';
$html5Encoded = 'foo_ÑеÑÑ_#%!\'()[]:<>';
- $html5Escaped = 'foo_%D1%82%D0%B5%D1%81%D1%82_%23%25%21%27%28%29%5B%5D:%3C%3E';
$html5Experimental = 'foo_ÑеÑÑ_!_()[]:<>';
// Settings: last element is $wgExternalInterwikiFragmentMode, the rest is $wgFragmentMode
@@ -484,20 +482,20 @@ class SanitizerTest extends MediaWikiTestCase {
// New world: HTML5 links, legacy fallbacks
[ 'Attribute', $newLegacy, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
[ 'Attribute', $newLegacy, $text, $legacyEncoded, Sanitizer::ID_FALLBACK ],
- [ 'Link', $newLegacy, $text, $html5Escaped ],
+ [ 'Link', $newLegacy, $text, $html5Encoded ],
[ 'ExternalInterwiki', $newLegacy, $text, $legacyEncoded ],
// Distant future: no legacy fallbacks, but still linking to leagacy wikis
[ 'Attribute', $new, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
[ 'Attribute', $new, $text, false, Sanitizer::ID_FALLBACK ],
- [ 'Link', $new, $text, $html5Escaped ],
+ [ 'Link', $new, $text, $html5Encoded ],
[ 'ExternalInterwiki', $new, $text, $legacyEncoded ],
// Just before the heat death of universe: external interwikis are also HTML5 \m/
[ 'Attribute', $allNew, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
[ 'Attribute', $allNew, $text, false, Sanitizer::ID_FALLBACK ],
- [ 'Link', $allNew, $text, $html5Escaped ],
- [ 'ExternalInterwiki', $allNew, $text, $html5Escaped ],
+ [ 'Link', $allNew, $text, $html5Encoded ],
+ [ 'ExternalInterwiki', $allNew, $text, $html5Encoded ],
// Someone flipped $wgExperimentalHtmlIds on
[ 'Attribute', $experimentalLegacy, $text, $html5Experimental, Sanitizer::ID_PRIMARY ],
@@ -508,7 +506,7 @@ class SanitizerTest extends MediaWikiTestCase {
// Migration from $wgExperimentalHtmlIds to modern HTML5
[ 'Attribute', $newExperimental, $text, $html5Encoded, Sanitizer::ID_PRIMARY ],
[ 'Attribute', $newExperimental, $text, $html5Experimental, Sanitizer::ID_FALLBACK ],
- [ 'Link', $newExperimental, $text, $html5Escaped ],
+ [ 'Link', $newExperimental, $text, $html5Encoded ],
[ 'ExternalInterwiki', $newExperimental, $text, $legacyEncoded ],
];
}
diff --git a/tests/phpunit/includes/TemplateParserTest.php b/tests/phpunit/includes/TemplateParserTest.php
index 2bd9086d60..c161f85306 100644
--- a/tests/phpunit/includes/TemplateParserTest.php
+++ b/tests/phpunit/includes/TemplateParserTest.php
@@ -109,4 +109,17 @@ class TemplateParserTest extends MediaWikiTestCase {
],
];
}
+
+ public function testEnableRecursivePartials() {
+ $tp = new TemplateParser( $this->templateDir );
+ $data = [ 'r' => [ 'r' => [ 'r' => [] ] ] ];
+
+ $tp->enableRecursivePartials( true );
+ $this->assertEquals( 'rrr', $tp->processTemplate( 'recurse', $data ) );
+
+ $tp->enableRecursivePartials( false );
+ $this->setExpectedException( 'Exception' );
+ $tp->processTemplate( 'recurse', $data );
+ }
+
}
diff --git a/tests/phpunit/includes/XmlTest.php b/tests/phpunit/includes/XmlTest.php
index 6c059ec5fd..25b754d2bc 100644
--- a/tests/phpunit/includes/XmlTest.php
+++ b/tests/phpunit/includes/XmlTest.php
@@ -403,12 +403,15 @@ class XmlTest extends MediaWikiTestCase {
*/
public function testListDropDown() {
$this->assertEquals(
- '' . "\n" .
- 'other reasons ' .
- 'Foo 1 ' .
- 'Example ' .
- '' .
- 'Bar 1 ' . "\n" .
+ '' .
+ 'other reasons ' . "\n" .
+ '' .
+ 'Foo 1 ' . "\n" .
+ 'Example ' . "\n" .
+ ' ' . "\n" .
+ '' .
+ 'Bar 1 ' . "\n" .
+ ' ' .
' ',
Xml::listDropDown(
// name
@@ -426,4 +429,52 @@ class XmlTest extends MediaWikiTestCase {
)
);
}
+
+ /**
+ * @covers Xml::listDropDownOptions
+ */
+ public function testListDropDownOptions() {
+ $this->assertEquals(
+ [
+ 'other reasons' => 'other',
+ 'Foo' => [
+ 'Foo 1' => 'Foo 1',
+ 'Example' => 'Example',
+ ],
+ 'Bar' => [
+ 'Bar 1' => 'Bar 1',
+ ],
+ ],
+ Xml::listDropDownOptions(
+ "* Foo\n** Foo 1\n** Example\n* Bar\n** Bar 1",
+ [ 'other' => 'other reasons' ]
+ )
+ );
+ }
+
+ /**
+ * @covers Xml::listDropDownOptionsOoui
+ */
+ public function testListDropDownOptionsOoui() {
+ $this->assertEquals(
+ [
+ [ 'data' => 'other', 'label' => 'other reasons' ],
+ [ 'optgroup' => 'Foo' ],
+ [ 'data' => 'Foo 1', 'label' => 'Foo 1' ],
+ [ 'data' => 'Example', 'label' => 'Example' ],
+ [ 'optgroup' => 'Bar' ],
+ [ 'data' => 'Bar 1', 'label' => 'Bar 1' ],
+ ],
+ Xml::listDropDownOptionsOoui( [
+ 'other reasons' => 'other',
+ 'Foo' => [
+ 'Foo 1' => 'Foo 1',
+ 'Example' => 'Example',
+ ],
+ 'Bar' => [
+ 'Bar 1' => 'Bar 1',
+ ],
+ ] )
+ );
+ }
}
diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php
index 9ed8f15630..d19d998146 100644
--- a/tests/phpunit/includes/db/DatabaseTestHelper.php
+++ b/tests/phpunit/includes/db/DatabaseTestHelper.php
@@ -53,6 +53,7 @@ class DatabaseTestHelper extends Database {
/**
* Returns SQL queries grouped by '; '
* Clear the list of queries that have been done so far.
+ * @return string
*/
public function getLastSqls() {
$lastSqls = implode( '; ', $this->lastSqls );
diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
index 881ace272f..c762aa7d70 100644
--- a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
+++ b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
@@ -1184,11 +1184,11 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase {
public static function provideAdaptiveTTL() {
return [
- [ 3600, 900, 30, .2, 720 ],
- [ 3600, 500, 30, .2, 500 ],
- [ 3600, 86400, 800, .2, 800 ],
- [ false, 86400, 800, .2, 800 ],
- [ null, 86400, 800, .2, 800 ]
+ [ 3600, 900, 30, 0.2, 720 ],
+ [ 3600, 500, 30, 0.2, 500 ],
+ [ 3600, 86400, 800, 0.2, 800 ],
+ [ false, 86400, 800, 0.2, 800 ],
+ [ null, 86400, 800, 0.2, 800 ]
];
}
diff --git a/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php b/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
index cb18fb3dc3..b6ea4265ba 100644
--- a/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
+++ b/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
@@ -112,10 +112,10 @@ class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
$tp->setLogger( $logger );
$tp->setExpectation( 'queries', 2, __METHOD__ );
- $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
- $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
- $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 ); // warn
- $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 ); // warn
+ $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 0.01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 0.01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 3", microtime( true ) - 0.01, false, 0 ); // warn
+ $tp->recordQueryCompletion( "SQL 4", microtime( true ) - 0.01, false, 0 ); // warn
}
public function testWriteQueryCount() {
@@ -126,16 +126,16 @@ class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
$tp->setLogger( $logger );
$tp->setExpectation( 'writes', 2, __METHOD__ );
- $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
- $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
- $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 );
- $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 0.01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 0.01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 3", microtime( true ) - 0.01, false, 0 );
+ $tp->recordQueryCompletion( "SQL 4", microtime( true ) - 0.01, false, 0 );
$tp->transactionWritingIn( 'srv1', 'db1', '123' );
- $tp->recordQueryCompletion( "SQL 1w", microtime( true ) - .01, true, 2 );
- $tp->recordQueryCompletion( "SQL 2w", microtime( true ) - .01, true, 5 );
- $tp->recordQueryCompletion( "SQL 3w", microtime( true ) - .01, true, 3 );
- $tp->recordQueryCompletion( "SQL 4w", microtime( true ) - .01, true, 1 );
+ $tp->recordQueryCompletion( "SQL 1w", microtime( true ) - 0.01, true, 2 );
+ $tp->recordQueryCompletion( "SQL 2w", microtime( true ) - 0.01, true, 5 );
+ $tp->recordQueryCompletion( "SQL 3w", microtime( true ) - 0.01, true, 3 );
+ $tp->recordQueryCompletion( "SQL 4w", microtime( true ) - 0.01, true, 1 );
$tp->transactionWritingOut( 'srv1', 'db1', '123', 1, 1 );
}
}
diff --git a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
index b564310429..456447f01c 100644
--- a/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
+++ b/tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
@@ -352,8 +352,8 @@ class DatabaseMysqlBaseTest extends PHPUnit_Framework_TestCase {
$db->setLBInfo( 'clusterMasterHost', 'db1052' );
$lagEst = $db->getLag();
- $this->assertGreaterThan( $lag - .010, $lagEst, "Correct heatbeat lag" );
- $this->assertLessThan( $lag + .010, $lagEst, "Correct heatbeat lag" );
+ $this->assertGreaterThan( $lag - 0.010, $lagEst, "Correct heatbeat lag" );
+ $this->assertLessThan( $lag + 0.010, $lagEst, "Correct heatbeat lag" );
}
public static function provideLagAmounts() {
diff --git a/tests/phpunit/includes/specials/SpecialPageExecutor.php b/tests/phpunit/includes/specials/SpecialPageExecutor.php
index 2f7b7678ca..e7cfca7f01 100644
--- a/tests/phpunit/includes/specials/SpecialPageExecutor.php
+++ b/tests/phpunit/includes/specials/SpecialPageExecutor.php
@@ -15,7 +15,7 @@ class SpecialPageExecutor {
* @param User|null $user The user which should be used in the context of this special page
*
* @throws Exception
- * @return array( string, WebResponse ) A two-elements array containing the HTML output
+ * @return array [ string, WebResponse ] A two-elements array containing the HTML output
* generated by the special page as well as the response object.
*/
public function executeSpecialPage(
diff --git a/tests/phpunit/includes/specials/SpecialPageTestBase.php b/tests/phpunit/includes/specials/SpecialPageTestBase.php
index 2f091d5d06..930bbe4de7 100644
--- a/tests/phpunit/includes/specials/SpecialPageTestBase.php
+++ b/tests/phpunit/includes/specials/SpecialPageTestBase.php
@@ -51,7 +51,7 @@ abstract class SpecialPageTestBase extends MediaWikiTestCase {
* @param User|null $user The user which should be used in the context of this special page
*
* @throws Exception
- * @return array( string, WebResponse ) A two-elements array containing the HTML output
+ * @return array [ string, WebResponse ] A two-elements array containing the HTML output
* generated by the special page as well as the response object.
*/
protected function executeSpecialPage(
diff --git a/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php b/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
index d712254c22..6b9b782397 100644
--- a/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
+++ b/tests/phpunit/mocks/content/DummyContentHandlerForTesting.php
@@ -34,6 +34,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
/**
* Creates an empty Content object of the type supported by this ContentHandler.
+ * @return DummyContentForTesting
*/
public function makeEmptyContent() {
return new DummyContentForTesting( '' );
diff --git a/tests/phpunit/mocks/content/DummyNonTextContentHandler.php b/tests/phpunit/mocks/content/DummyNonTextContentHandler.php
index 098181debb..9d91d4a1a2 100644
--- a/tests/phpunit/mocks/content/DummyNonTextContentHandler.php
+++ b/tests/phpunit/mocks/content/DummyNonTextContentHandler.php
@@ -34,6 +34,7 @@ class DummyNonTextContentHandler extends DummyContentHandlerForTesting {
/**
* Creates an empty Content object of the type supported by this ContentHandler.
+ * @return DummyNonTextContent
*/
public function makeEmptyContent() {
return new DummyNonTextContent( '' );
diff --git a/tests/phpunit/mocks/filebackend/MockFSFile.php b/tests/phpunit/mocks/filebackend/MockFSFile.php
index 047c03ad1f..ef1caa5d12 100644
--- a/tests/phpunit/mocks/filebackend/MockFSFile.php
+++ b/tests/phpunit/mocks/filebackend/MockFSFile.php
@@ -41,6 +41,7 @@ class MockFSFile extends FSFile {
/**
* August 22 â The theft of the Mona Lisa is discovered in the Louvre."
* T22281
+ * @return int
*/
public function getSize() {
return 1911;
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
index b9650796ef..5ce61ea752 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
@@ -1,7 +1,7 @@
( function ( mw, $ ) {
'use strict';
- var grammarTests;
+ var grammarTests, bcp47Tests;
QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment( {
setup: function () {
@@ -587,4 +587,100 @@
assert.equal( mw.language.listToText( [ 'a', 'b' ] ), 'a and b', 'Two items' );
assert.equal( mw.language.listToText( [ 'a', 'b', 'c' ] ), 'a, b and c', 'More than two items' );
} );
+
+ bcp47Tests = [
+ // Extracted from BCP 47 (list not exhaustive)
+ // # 2.1.1
+ [ 'en-ca-x-ca', 'en-CA-x-ca' ],
+ [ 'sgn-be-fr', 'sgn-BE-FR' ],
+ [ 'az-latn-x-latn', 'az-Latn-x-latn' ],
+ // # 2.2
+ [ 'sr-Latn-RS', 'sr-Latn-RS' ],
+ [ 'az-arab-ir', 'az-Arab-IR' ],
+
+ // # 2.2.5
+ [ 'sl-nedis', 'sl-nedis' ],
+ [ 'de-ch-1996', 'de-CH-1996' ],
+
+ // # 2.2.6
+ [
+ 'en-latn-gb-boont-r-extended-sequence-x-private',
+ 'en-Latn-GB-boont-r-extended-sequence-x-private'
+ ],
+
+ // Examples from BCP 47 Appendix A
+ // # Simple language subtag:
+ [ 'DE', 'de' ],
+ [ 'fR', 'fr' ],
+ [ 'ja', 'ja' ],
+
+ // # Language subtag plus script subtag:
+ [ 'zh-hans', 'zh-Hans' ],
+ [ 'sr-cyrl', 'sr-Cyrl' ],
+ [ 'sr-latn', 'sr-Latn' ],
+
+ // # Extended language subtags and their primary language subtag
+ // # counterparts:
+ [ 'zh-cmn-hans-cn', 'zh-cmn-Hans-CN' ],
+ [ 'cmn-hans-cn', 'cmn-Hans-CN' ],
+ [ 'zh-yue-hk', 'zh-yue-HK' ],
+ [ 'yue-hk', 'yue-HK' ],
+
+ // # Language-Script-Region:
+ [ 'zh-hans-cn', 'zh-Hans-CN' ],
+ [ 'sr-latn-RS', 'sr-Latn-RS' ],
+
+ // # Language-Variant:
+ [ 'sl-rozaj', 'sl-rozaj' ],
+ [ 'sl-rozaj-biske', 'sl-rozaj-biske' ],
+ [ 'sl-nedis', 'sl-nedis' ],
+
+ // # Language-Region-Variant:
+ [ 'de-ch-1901', 'de-CH-1901' ],
+ [ 'sl-it-nedis', 'sl-IT-nedis' ],
+
+ // # Language-Script-Region-Variant:
+ [ 'hy-latn-it-arevela', 'hy-Latn-IT-arevela' ],
+
+ // # Language-Region:
+ [ 'de-de', 'de-DE' ],
+ [ 'en-us', 'en-US' ],
+ [ 'es-419', 'es-419' ],
+
+ // # Private use subtags:
+ [ 'de-ch-x-phonebk', 'de-CH-x-phonebk' ],
+ [ 'az-arab-x-aze-derbend', 'az-Arab-x-aze-derbend' ],
+ /**
+ * Previous test does not reflect the BCP 47 which states:
+ * az-Arab-x-AZE-derbend
+ * AZE being private, it should be lower case, hence the test above
+ * should probably be:
+ * [ 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ],
+ */
+
+ // # Private use registry values:
+ [ 'x-whatever', 'x-whatever' ],
+ [ 'qaa-qaaa-qm-x-southern', 'qaa-Qaaa-QM-x-southern' ],
+ [ 'de-qaaa', 'de-Qaaa' ],
+ [ 'sr-latn-qm', 'sr-Latn-QM' ],
+ [ 'sr-qaaa-rs', 'sr-Qaaa-RS' ],
+
+ // # Tags that use extensions
+ [ 'en-us-u-islamcal', 'en-US-u-islamcal' ],
+ [ 'zh-cn-a-myext-x-private', 'zh-CN-a-myext-x-private' ],
+ [ 'en-a-myext-b-another', 'en-a-myext-b-another' ]
+
+ // # Invalid:
+ // de-419-DE
+ // a-DE
+ // ar-a-aaa-b-bbb-a-ccc
+ ];
+
+ QUnit.test( 'mw.language.bcp47', function ( assert ) {
+ bcp47Tests.forEach( function ( data ) {
+ var input = data[ 0 ],
+ expected = data[ 1 ];
+ assert.equal( mw.language.bcp47( input ), expected );
+ } );
+ } );
}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
index 2efe9cd7f4..bb27626575 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
@@ -156,7 +156,7 @@
// Test cases are kept in sync with SanitizerTest.php
var text = 'foo ÑеÑÑ_#%!\'()[]:<>',
legacyEncoded = 'foo_.D1.82.D0.B5.D1.81.D1.82_.23.25.21.27.28.29.5B.5D:.3C.3E',
- html5Escaped = 'foo_%D1%82%D0%B5%D1%81%D1%82_%23%25!\'()%5B%5D:%3C%3E',
+ html5Encoded = 'foo_ÑеÑÑ_#%!\'()[]:<>',
html5Experimental = 'foo_ÑеÑÑ_!_()[]:<>',
// Settings: this is wgFragmentMode
legacy = [ 'legacy' ],
@@ -172,13 +172,13 @@
// Transition to a new world: legacy links with HTML5 fallback
[ legacyNew, text, legacyEncoded ],
// New world: HTML5 links, legacy fallbacks
- [ newLegacy, text, html5Escaped ],
+ [ newLegacy, text, html5Encoded ],
// Distant future: no legacy fallbacks
- [ allNew, text, html5Escaped ],
+ [ allNew, text, html5Encoded ],
// Someone flipped wgExperimentalHtmlIds on
[ experimentalLegacy, text, html5Experimental ],
// Migration from wgExperimentalHtmlIds to modern HTML5
- [ newExperimental, text, html5Escaped ]
+ [ newExperimental, text, html5Encoded ]
], function ( index, testCase ) {
mw.config.set( 'wgFragmentMode', testCase[ 0 ] );