<ruleset name="MediaWiki">
<rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
<exclude name="Generic.ControlStructures.InlineControlStructure" />
- <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamComment" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
<exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
<exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
<exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
<exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
+ <exclude name="MediaWiki.Commenting.LicenseComment.InvalidLicenseTag" />
<exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
<exclude name="MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName" />
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
<exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.SingleSpaceBeforeSingleLineComment" />
<exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
<exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage" />
+ <exclude name="MediaWiki.Usage.ForbiddenFunctions.assert" />
<exclude name="MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals" />
<exclude name="MediaWiki.Files.ClassMatchesFilename.WrongCase" />
<exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
</properties>
</rule>
<rule ref="Generic.Files.LineLength">
- <exclude-pattern>*/languages/messages/Messages*.php</exclude-pattern>
+ <exclude-pattern>*/languages/messages/Messages*\.php</exclude-pattern>
</rule>
<rule ref="PSR2.Methods.MethodDeclaration.Underscore">
- <exclude-pattern>*/includes/StubObject.php</exclude-pattern>
+ <exclude-pattern>*/includes/StubObject\.php</exclude-pattern>
</rule>
<file>.</file>
<arg name="encoding" value="UTF-8"/>
was configured with 'any'.
=== New features in 1.31 ===
+* (T76554) User sub-pages named ….json are now protected in the same way that ….js
+ and ….css pages are, so that configuration options can safely be placed there.
* Wikimedia\Rdbms\IDatabase->select() and similar methods now support
joins with parentheses for grouping.
* As a first pass in standardizing dialog boxes across the MediaWiki product,
* Wikimedia\Rdbms\IDatabase::doAtomicSection(), non-native ::insertSelect(),
and non-MySQL ::replace() and ::upsert() no longer roll back the whole
transaction on failure.
+* (T189785) Added a monthly heartbeat ping to the pingback feature.
=== External library changes in 1.31 ===
* StripState::merge()
* The "free" CSS class is now only applied to unbracketed URLs in wikitext. Links
written using square brackets will get the class "text" not "free".
+* SpecialPageFactory::getList(), deprecated in 1.24, has been removed. You can
+ use ::getNames() instead.
* OpenSearch::getOpenSearchTemplate(), deprecated in 1.25, has been removed. You
can use ApiOpenSearch::getOpenSearchTemplate() instead.
* The global function wfBaseConvert, deprecated in 1.27, has been removed. Use
* The global function wfOutputHandler() was removed, use the its replacement
MediaWiki\OutputHandler::handle() instead. The global function was only sometimes defined.
Its replacement is always available via the autoloader.
+* ChangeTags::listExtensionActivatedTags and ::listExtensionDefinedTags, deprecated
+ in 1.28, have been removed. Use ::listSoftwareActivatedTags() and
+ ::listSoftwareDefinedTags() instead.
+* Title::getTitleInvalidRegex(), deprecated in 1.25, has been removed. You
+ can use MediaWikiTitleCodec::getTitleInvalidRegex() instead.
+* HTMLForm & VFormHTMLForm::isVForm(), deprecated in 1.25, have been removed.
+* The ProfileSection class, deprecated in 1.25 and unused, has been removed.
== Compatibility ==
MediaWiki 1.31 requires PHP 5.5.9 or later. Although HHVM 3.18.5 or later is supported,
The supported versions are:
* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
+* PostgreSQL 9.2 or later
* SQLite 3.3.7 or later
* Oracle 9.0.1 or later
* Microsoft SQL Server 2005 (9.00.1399)
'CleanupUsersWithNoId' => __DIR__ . '/maintenance/cleanupUsersWithNoId.php',
'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
'ClearUserWatchlistJob' => __DIR__ . '/includes/jobqueue/jobs/ClearUserWatchlistJob.php',
+ 'ClearWatchlistNotificationsJob' => __DIR__ . '/includes/jobqueue/jobs/ClearWatchlistNotificationsJob.php',
'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
'CodeCleanerGlobalsPass' => __DIR__ . '/maintenance/CodeCleanerGlobalsPass.inc',
'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
'DeleteArchivedFiles' => __DIR__ . '/maintenance/deleteArchivedFiles.php',
'DeleteArchivedRevisions' => __DIR__ . '/maintenance/deleteArchivedRevisions.php',
+ 'DeleteAutoPatrolLogs' => __DIR__ . '/maintenance/deleteAutoPatrolLogs.php',
'DeleteBatch' => __DIR__ . '/maintenance/deleteBatch.php',
'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
'PoolCounterWorkViaCallback' => __DIR__ . '/includes/poolcounter/PoolCounterWorkViaCallback.php',
'PoolCounter_Stub' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
+ 'PopulateArchiveRevId' => __DIR__ . '/maintenance/populateArchiveRevId.php',
'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php',
'Preprocessor_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
'ProcessCacheLRU' => __DIR__ . '/includes/libs/ProcessCacheLRU.php',
'Processor' => __DIR__ . '/includes/registration/Processor.php',
- 'ProfileSection' => __DIR__ . '/includes/profiler/ProfileSection.php',
'Profiler' => __DIR__ . '/includes/profiler/Profiler.php',
'ProfilerOutput' => __DIR__ . '/includes/profiler/output/ProfilerOutput.php',
'ProfilerOutputDb' => __DIR__ . '/includes/profiler/output/ProfilerOutputDb.php',
"ext-xml": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.2.0",
- "oojs/oojs-ui": "0.26.0",
+ "oojs/oojs-ui": "0.26.1",
"oyejorge/less.php": "1.7.0.14",
"php": ">=5.5.9",
"psr/log": "1.0.2",
"jakub-onderka/php-parallel-lint": "0.9.2",
"jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
"justinrainbow/json-schema": "~5.2",
- "mediawiki/mediawiki-codesniffer": "16.0.0",
+ "mediawiki/mediawiki-codesniffer": "17.0.0",
"monolog/monolog": "~1.22.1",
"nikic/php-parser": "3.1.3",
"nmred/kafka-php": "0.1.5",
"phpunit/phpunit": "4.8.36",
"psy/psysh": "0.8.11",
- "wikimedia/avro": "1.7.7",
+ "wikimedia/avro": "1.8.0",
"wikimedia/testing-access-wrapper": "~1.0",
"wmde/hamcrest-html-matchers": "^0.1.0"
},
* Maximum length of a comment in UTF-8 characters. Longer comments will be truncated.
* @note This must be at least 255 and not greater than floor( MAX_COMMENT_LENGTH / 4 ).
*/
- const COMMENT_CHARACTER_LIMIT = 1000;
+ const COMMENT_CHARACTER_LIMIT = 500;
/**
* Maximum length of a comment in bytes. Longer comments will be truncated.
$wgGroupPermissions['user']['reupload-shared'] = true;
$wgGroupPermissions['user']['minoredit'] = true;
$wgGroupPermissions['user']['editmyusercss'] = true;
+$wgGroupPermissions['user']['editmyuserjson'] = true;
$wgGroupPermissions['user']['editmyuserjs'] = true;
$wgGroupPermissions['user']['purge'] = true;
$wgGroupPermissions['user']['sendemail'] = true;
$wgGroupPermissions['sysop']['undelete'] = true;
$wgGroupPermissions['sysop']['editinterface'] = true;
$wgGroupPermissions['sysop']['editusercss'] = true;
+$wgGroupPermissions['sysop']['edituserjson'] = true;
$wgGroupPermissions['sysop']['edituserjs'] = true;
$wgGroupPermissions['sysop']['import'] = true;
$wgGroupPermissions['sysop']['importupload'] = true;
// FIXME: Rename editmycssjs to editmyconfig
$wgGrantPermissions['editmycssjs'] = $wgGrantPermissions['editpage'];
$wgGrantPermissions['editmycssjs']['editmyusercss'] = true;
+$wgGrantPermissions['editmycssjs']['editmyuserjson'] = true;
$wgGrantPermissions['editmycssjs']['editmyuserjs'] = true;
$wgGrantPermissions['editmyoptions']['editmyoptions'] = true;
$wgGrantPermissions['editinterface'] = $wgGrantPermissions['editpage'];
$wgGrantPermissions['editinterface']['editinterface'] = true;
$wgGrantPermissions['editinterface']['editusercss'] = true;
+$wgGrantPermissions['editinterface']['edituserjson'] = true;
$wgGrantPermissions['editinterface']['edituserjs'] = true;
$wgGrantPermissions['createeditmovepage'] = $wgGrantPermissions['editpage'];
'categoryMembershipChange' => CategoryMembershipChangeJob::class,
'clearUserWatchlist' => ClearUserWatchlistJob::class,
'cdnPurge' => CdnPurgeJob::class,
- 'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
'userGroupExpiry' => UserGroupExpiryJob::class,
+ 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
+ 'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
'null' => NullJob::class,
];
}
/**
- * Wrap status errors in an errorbox for increased visiblity
+ * Wrap status errors in an errorbox for increased visibility
*
* @param Status $status
* @return string Wikitext
if ( $namespace == NS_MEDIAWIKI ) {
# Show a warning if editing an interface message
$out->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
- # If this is a default message (but not css or js),
+ # If this is a default message (but not css, json, or js),
# show a hint that it is translatable on translatewiki.net
- if ( !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS )
+ if (
+ !$this->mTitle->hasContentModel( CONTENT_MODEL_CSS )
+ && !$this->mTitle->hasContentModel( CONTENT_MODEL_JSON )
&& !$this->mTitle->hasContentModel( CONTENT_MODEL_JAVASCRIPT )
) {
$defaultMessageText = $this->mTitle->getDefaultMessageText();
}
if ( $this->getTitle()->isSubpageOf( $user->getUserPage() ) ) {
$isUserCssConfig = $this->mTitle->isUserCssConfigPage();
+ $isUserJsonConfig = $this->mTitle->isUserJsonConfigPage();
+ $isUserJsConfig = $this->mTitle->isUserJsConfigPage();
$warning = $isUserCssConfig
? 'usercssispublic'
- : 'userjsispublic';
+ : ( $isUserJsonConfig ? 'userjsonispublic' : 'userjsispublic' );
$out->wrapWikiMsg( '<div class="mw-userconfigpublic">$1</div>', $warning );
"<div id='mw-usercssyoucanpreview'>\n$1\n</div>",
[ 'usercssyoucanpreview' ]
);
- }
-
- if ( $this->mTitle->isJsSubpage() && $config->get( 'AllowUserJs' ) ) {
+ } elseif ( $isUserJsonConfig /* No comparable 'AllowUserJson' */ ) {
+ $out->wrapWikiMsg(
+ "<div id='mw-userjsonyoucanpreview'>\n$1\n</div>",
+ [ 'userjsonyoucanpreview' ]
+ );
+ } elseif ( $isUserJsConfig && $config->get( 'AllowUserJs' ) ) {
$out->wrapWikiMsg(
"<div id='mw-userjsyoucanpreview'>\n$1\n</div>",
[ 'userjsyoucanpreview' ]
if ( $level === 'user' && !$config->get( 'AllowUserCss' ) ) {
$format = false;
}
+ } elseif ( $content->getModel() == CONTENT_MODEL_JSON ) {
+ $format = 'json';
+ if ( $level === 'user' /* No comparable 'AllowUserJson' */ ) {
+ $format = false;
+ }
} elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
$format = 'js';
if ( $level === 'user' && !$config->get( 'AllowUserJs' ) ) {
}
# Used messages to make sure grep find them:
- # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+ # Messages: usercsspreview, userjsonpreview, userjspreview,
+ # sitecsspreview, sitejsonpreview, sitejspreview
if ( $level && $format ) {
$note = "<div id='mw-{$level}{$format}preview'>" .
$this->context->msg( "{$level}{$format}preview" )->text() .
$ifWritesSince = null, $wiki = false, $cluster = false, $timeout = null
) {
if ( $timeout === null ) {
- $timeout = wfIsCLI() ? 86400 : 10;
+ $timeout = wfIsCLI() ? 60 : 10;
}
if ( $cluster === '*' ) {
<?php
namespace MediaWiki;
+use ActorMigration;
use CommentStore;
use Config;
use ConfigFactory;
$this->rlUserModuleState = $exemptStates['user'] = $userState;
}
- $rlClient = new ResourceLoaderClientHtml( $context, $this->getTarget() );
+ $rlClient = new ResourceLoaderClientHtml( $context, [
+ 'target' => $this->getTarget(),
+ ] );
$rlClient->setConfig( $this->getJSVars() );
$rlClient->setModules( $this->getModules( /*filter*/ true ) );
$rlClient->setModuleStyles( $moduleStyles );
}
/**
- * Has a pingback already been sent for this MediaWiki version?
+ * Has a pingback been sent in the last month for this MediaWiki version?
* @return bool
*/
private function checkIfSent() {
$dbr = wfGetDB( DB_REPLICA );
- $sent = $dbr->selectField(
- 'updatelog', '1', [ 'ul_key' => $this->key ], __METHOD__ );
- return $sent !== false;
+ $timestamp = $dbr->selectField(
+ 'updatelog',
+ 'ul_value',
+ [ 'ul_key' => $this->key ],
+ __METHOD__
+ );
+ if ( $timestamp === false ) {
+ return false;
+ }
+ // send heartbeat ping if last ping was over a month ago
+ if ( time() - (int)$timestamp > 60 * 60 * 24 * 30 ) {
+ return false;
+ }
+ return true;
}
/**
*/
private function markSent() {
$dbw = wfGetDB( DB_MASTER );
- return $dbw->insert(
- 'updatelog', [ 'ul_key' => $this->key ], __METHOD__, 'IGNORE' );
+ $timestamp = time();
+ return $dbw->upsert(
+ 'updatelog',
+ [ 'ul_key' => $this->key, 'ul_value' => $timestamp ],
+ [ 'ul_key' => $this->key ],
+ [ 'ul_value' => $timestamp ],
+ __METHOD__
+ );
}
/**
return $wgLegalTitleChars;
}
- /**
- * Returns a simple regex that will match on characters and sequences invalid in titles.
- * Note that this doesn't pick up many things that could be wrong with titles, but that
- * replacing this regex with something valid will make many titles valid.
- *
- * @deprecated since 1.25, use MediaWikiTitleCodec::getTitleInvalidRegex() instead
- *
- * @return string Regex string
- */
- static function getTitleInvalidRegex() {
- wfDeprecated( __METHOD__, '1.25' );
- return MediaWikiTitleCodec::getTitleInvalidRegex();
- }
-
/**
* Utility method for converting a character sequence from bytes to Unicode.
*
}
/**
- * Could this page contain custom CSS or JavaScript for the global UI.
- * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
- * or CONTENT_MODEL_JAVASCRIPT.
+ * Could this MediaWiki namespace page contain custom CSS, JSON, or JavaScript for the
+ * global UI. This is generally true for pages in the MediaWiki namespace having
+ * CONTENT_MODEL_CSS, CONTENT_MODEL_JSON, or CONTENT_MODEL_JAVASCRIPT.
*
- * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage()
+ * This method does *not* return true for per-user JS/JSON/CSS. Use isUserConfigPage()
* for that!
*
- * Note that this method should not return true for pages that contain and
- * show "inactive" CSS or JS.
+ * Note that this method should not return true for pages that contain and show
+ * "inactive" CSS, JSON, or JS.
*
* @return bool
* @since 1.31
NS_MEDIAWIKI == $this->mNamespace
&& (
$this->hasContentModel( CONTENT_MODEL_CSS )
+ || $this->hasContentModel( CONTENT_MODEL_JSON )
|| $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT )
)
);
/**
* @return bool
- * @deprecated Since 1.31; use ::isSiteConfigPage() instead
+ * @deprecated Since 1.31; use ::isSiteConfigPage() instead (which also checks for JSON pages)
*/
public function isCssOrJsPage() {
wfDeprecated( __METHOD__, '1.31' );
}
/**
- * Is this a "config" (.css or .js) sub-page of a user page?
+ * Is this a "config" (.css, .json, or .js) sub-page of a user page?
*
* @return bool
* @since 1.31
&& $this->isSubpage()
&& (
$this->hasContentModel( CONTENT_MODEL_CSS )
+ || $this->hasContentModel( CONTENT_MODEL_JSON )
|| $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT )
)
);
/**
* @return bool
- * @deprecated Since 1.31; use ::isUserConfigPage() instead
+ * @deprecated Since 1.31; use ::isUserConfigPage() instead (which also checks for JSON pages)
*/
public function isCssJsSubpage() {
wfDeprecated( __METHOD__, '1.31' );
}
/**
- * Trim down a .css or .js subpage title to get the corresponding skin name
+ * Trim down a .css, .json, or .js subpage title to get the corresponding skin name
*
- * @return string Containing skin name from .css or .js subpage title
+ * @return string Containing skin name from .css, .json, or .js subpage title
* @since 1.31
*/
public function getSkinFromConfigSubpage() {
$subpage = $subpage[count( $subpage ) - 1];
$lastdot = strrpos( $subpage, '.' );
if ( $lastdot === false ) {
- return $subpage; # Never happens: only called for names ending in '.css' or '.js'
+ return $subpage; # Never happens: only called for names ending in '.css'/'.json'/'.js'
}
return substr( $subpage, 0, $lastdot );
}
/**
* @deprecated Since 1.31; use ::getSkinFromConfigSubpage() instead
- * @return string Containing skin name from .css or .js subpage title
+ * @return string Containing skin name from .css, .json, or .js subpage title
*/
public function getSkinFromCssJsSubpage() {
wfDeprecated( __METHOD__, '1.31' );
}
/**
- * Is this a .js subpage of a user page?
+ * Is this a JSON "config" sub-page of a user page?
+ *
+ * @return bool
+ * @since 1.31
+ */
+ public function isUserJsonConfigPage() {
+ return (
+ NS_USER == $this->mNamespace
+ && $this->isSubpage()
+ && $this->hasContentModel( CONTENT_MODEL_JSON )
+ );
+ }
+
+ /**
+ * Is this a JS "config" sub-page of a user page?
*
* @return bool
* @since 1.31
}
/**
- * Check CSS/JS sub-page permissions
+ * Check CSS/JSON/JS sub-page permissions
*
* @param string $action The action to check
* @param User $user User to check
* @return array List of errors
*/
private function checkUserConfigPermissions( $action, $user, $errors, $rigor, $short ) {
- # Protect css/js subpages of user pages
+ # Protect css/json/js subpages of user pages
# XXX: this might be better using restrictions
if ( $action != 'patrol' ) {
&& !$user->isAllowedAny( 'editmyusercss', 'editusercss' )
) {
$errors[] = [ 'mycustomcssprotected', $action ];
+ } elseif (
+ $this->isUserJsonConfigPage()
+ && !$user->isAllowedAny( 'editmyuserjson', 'edituserjson' )
+ ) {
+ $errors[] = [ 'mycustomjsonprotected', $action ];
} elseif (
$this->isUserJsConfigPage()
&& !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' )
&& !$user->isAllowed( 'editusercss' )
) {
$errors[] = [ 'customcssprotected', $action ];
+ } elseif (
+ $this->isUserJsonConfigPage()
+ && !$user->isAllowed( 'edituserjson' )
+ ) {
+ $errors[] = [ 'customjsonprotected', $action ];
} elseif (
$this->isUserJsConfigPage()
&& !$user->isAllowed( 'edituserjs' )
// If we are looking at a css/js user subpage, purge the action=raw.
if ( $this->isUserJsConfigPage() ) {
$urls[] = $this->getInternalURL( 'action=raw&ctype=text/javascript' );
+ } elseif ( $this->isUserJsonConfigPage() ) {
+ $urls[] = $this->getInternalURL( 'action=raw&ctype=application/json' );
} elseif ( $this->isUserCssConfigPage() ) {
$urls[] = $this->getInternalURL( 'action=raw&ctype=text/css' );
}
return; // Client cache fresh and headers sent, nothing more to do.
}
- $gen = $request->getVal( 'gen' );
- if ( $gen == 'css' || $gen == 'js' ) {
- $this->gen = true;
- }
-
$contentType = $this->getContentType();
$maxage = $request->getInt( 'maxage', $config->get( 'SquidMaxage' ) );
$smaxage = $request->getIntOrNull( 'smaxage' );
if ( $smaxage === null ) {
- if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
- // CSS/JS raw content has its own CDN max age configuration.
- // Note: Title::getCdnUrls() includes action=raw for css/js pages,
- // so if using the canonical url, this will get HTCP purges.
+ if (
+ $contentType == 'text/css' ||
+ $contentType == 'application/json' ||
+ $contentType == 'text/javascript'
+ ) {
+ // CSS/JSON/JS raw content has its own CDN max age configuration.
+ // Note: Title::getCdnUrls() includes action=raw for css/json/js
+ // pages, so if using the canonical url, this will get HTCP purges.
$smaxage = intval( $config->get( 'ForcedRawSMaxage' ) );
} else {
// No CDN cache for anything else
}
if ( $content === null || $content === false ) {
- // section not found (or section not supported, e.g. for JS and CSS)
+ // section not found (or section not supported, e.g. for JS, JSON, and CSS)
$text = false;
} else {
$text = $content->getNativeData();
}
}
- if ( $text !== false && $text !== '' && $request->getVal( 'templates' ) === 'expand' ) {
+ if ( $text !== false && $text !== '' && $request->getRawVal( 'templates' ) === 'expand' ) {
$text = $wgParser->preprocess(
$text,
$title,
* @return string
*/
public function getContentType() {
- $ctype = $this->getRequest()->getVal( 'ctype' );
+ // Use getRawVal instead of getVal because we only
+ // need to match against known strings, there is no
+ // storing of localised content or other user input.
+ $ctype = $this->getRequest()->getRawVal( 'ctype' );
if ( $ctype == '' ) {
- $gen = $this->getRequest()->getVal( 'gen' );
+ // Legacy compatibilty
+ $gen = $this->getRequest()->getRawVal( 'gen' );
if ( $gen == 'js' ) {
$ctype = 'text/javascript';
} elseif ( $gen == 'css' ) {
'text/x-wiki',
'text/javascript',
'text/css',
+ // FIXME: Should we still allow Zope editing? External editing feature was dropped
'application/x-zope-edit',
'application/json'
];
$res['id'] = $block->getId();
} else {
# should be unreachable
- $res['expiry'] = '';
- $res['id'] = '';
+ $res['expiry'] = ''; // @codeCoverageIgnore
+ $res['id'] = ''; // @codeCoverageIgnore
}
$res['reason'] = $params['reason'];
$hasHistory = false;
$reason = $page->getAutoDeleteReason( $hasHistory );
if ( $reason === false ) {
- return Status::newFatal( 'cannotdelete', $title->getPrefixedText() );
+ // Should be reachable only if the page has no revisions
+ return Status::newFatal( 'cannotdelete', $title->getPrefixedText() ); // @codeCoverageIgnore
}
}
}
try {
- $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ $content = ContentHandler::makeContent( $text, $titleObj );
} catch ( MWContentSerializationException $ex ) {
$this->dieWithException( $ex, [
'wrap' => ApiMessage::create( 'apierror-contentserializationexception', 'parseerror' )
return;
}
if ( !$status->getErrors() ) {
- $status->fatal( 'hookaborted' );
+ // This appears to be unreachable right now, because all
+ // code paths will set an error. Could change, though.
+ $status->fatal( 'hookaborted' ); //@codeCoverageIgnore
}
$this->dieStatus( $status );
+ // These two cases will normally have been caught earlier, and will
+ // only occur if something blocks the user between the earlier
+ // check and the check in EditPage (presumably a hook). It's not
+ // obvious that this is even possible.
+ // @codeCoverageIgnoreStart
case EditPage::AS_BLOCKED_PAGE_FOR_USER:
$this->dieWithError(
'apierror-blocked',
case EditPage::AS_READ_ONLY_PAGE:
$this->dieReadOnly();
+ // @codeCoverageIgnoreEnd
case EditPage::AS_SUCCESS_NEW_ARTICLE:
$r['new'] = true;
$status->fatal( 'apierror-noimageredirect-anon' );
break;
case EditPage::AS_IMAGE_REDIRECT_LOGGED:
- $status->fatal( 'apierror-noimageredirect-logged' );
+ $status->fatal( 'apierror-noimageredirect' );
break;
case EditPage::AS_CONTENT_TOO_BIG:
case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
// Currently shouldn't be needed, but here in case
// hooks use them without setting appropriate
// errors on the status.
+ // @codeCoverageIgnoreStart
case EditPage::AS_SPAM_ERROR:
$status->fatal( 'apierror-spamdetected', $result['spam'] );
break;
wfWarn( __METHOD__ . ": Unknown EditPage code {$status->value} with no message" );
$status->fatal( 'apierror-unknownerror-editpage', $status->value );
break;
+ // @codeCoverageIgnoreEnd
}
}
$this->dieStatus( $status );
- break;
}
$apiResult->addValue( null, $this->getModuleName(), $r );
}
ApiBase::PARAM_TYPE => 'text',
],
'undo' => [
- ApiBase::PARAM_TYPE => 'integer'
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_MIN => 0,
+ ApiBase::PARAM_RANGE_ENFORCE => true,
],
'undoafter' => [
- ApiBase::PARAM_TYPE => 'integer'
+ ApiBase::PARAM_TYPE => 'integer',
+ ApiBase::PARAM_MIN => 0,
+ ApiBase::PARAM_RANGE_ENFORCE => true,
],
'redirect' => [
ApiBase::PARAM_TYPE => 'boolean',
|| ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
|| ( isset( $show['patrolled'] ) && isset( $show['unpatrolled'] ) )
|| ( isset( $show['!patrolled'] ) && isset( $show['unpatrolled'] ) )
+ || ( isset( $show['autopatrolled'] ) && isset( $show['!autopatrolled'] ) )
+ || ( isset( $show['autopatrolled'] ) && isset( $show['unpatrolled'] ) )
+ || ( isset( $show['autopatrolled'] ) && isset( $show['!patrolled'] ) )
) {
$this->dieWithError( 'apierror-show' );
}
if ( isset( $show['patrolled'] )
|| isset( $show['!patrolled'] )
|| isset( $show['unpatrolled'] )
+ || isset( $show['autopatrolled'] )
+ || isset( $show['!autopatrolled'] )
) {
if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
}
}
+ $this->addWhereIf( 'rc_patrolled != 2', isset( $show['!autopatrolled'] ) );
+ $this->addWhereIf( 'rc_patrolled = 2', isset( $show['autopatrolled'] ) );
+
// Don't throw log entries out the window here
$this->addWhereIf(
'page_is_redirect = 0 OR page_is_redirect IS NULL',
/* Add the patrolled flag */
if ( $this->fld_patrolled ) {
- $vals['patrolled'] = $row->rc_patrolled == 1;
+ $vals['patrolled'] = $row->rc_patrolled != 0;
$vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user );
+ $vals['autopatrolled'] = $row->rc_patrolled == 2;
}
if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
'!redirect',
'patrolled',
'!patrolled',
- 'unpatrolled'
+ 'unpatrolled',
+ 'autopatrolled',
+ '!autopatrolled',
]
],
'limit' => [
$userIter = call_user_func( function () use ( $dbSecondary, $sort, $op, $fname ) {
global $wgActorTableSchemaMigrationStage;
- $from = $fromName = false;
+ $fromName = false;
if ( !is_null( $this->params['continue'] ) ) {
$continue = explode( '|', $this->params['continue'] );
$this->dieContinueUsageIf( count( $continue ) != 4 );
$this->dieContinueUsageIf( $continue[0] !== 'name' );
$fromName = $continue[1];
- $from = "$op= " . $dbSecondary->addQuotes( $fromName );
}
$like = $dbSecondary->buildLike( $this->params['userprefix'], $dbSecondary->anyString() );
$limit = 501;
do {
+ $from = $fromName ? "$op= " . $dbSecondary->addQuotes( $fromName ) : false;
+
// For the new schema, pull from the actor table. For the
// old, pull from rev_user. For migration a FULL [OUTER]
// JOIN would be what we want, except MySQL doesn't support
}
$count = 0;
- $from = null;
+ $fromName = false;
foreach ( $res as $row ) {
if ( ++$count >= $limit ) {
- $from = $row->user_name;
+ $fromName = $row->user_name;
break;
}
yield User::newFromRow( $row );
}
- } while ( $from !== null );
+ } while ( $fromName !== false );
} );
// Do the actual sorting client-side, because otherwise
// prepareQuery might try to sort by actor and confuse everything.
if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
|| ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+ || ( isset( $show['autopatrolled'] ) && isset( $show['!autopatrolled'] ) )
+ || ( isset( $show['autopatrolled'] ) && isset( $show['!patrolled'] ) )
|| ( isset( $show['top'] ) && isset( $show['!top'] ) )
|| ( isset( $show['new'] ) && isset( $show['!new'] ) )
) {
$this->addWhereIf( 'rev_minor_edit != 0', isset( $show['minor'] ) );
$this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
$this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
+ $this->addWhereIf( 'rc_patrolled != 2', isset( $show['!autopatrolled'] ) );
+ $this->addWhereIf( 'rc_patrolled = 2', isset( $show['autopatrolled'] ) );
$this->addWhereIf( $idField . ' != page_latest', isset( $show['!top'] ) );
$this->addWhereIf( $idField . ' = page_latest', isset( $show['top'] ) );
$this->addWhereIf( 'rev_parent_id != 0', isset( $show['!new'] ) );
$this->addOption( 'LIMIT', $limit + 1 );
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
- $this->fld_patrolled
+ isset( $show['autopatrolled'] ) || isset( $show['!autopatrolled'] ) || $this->fld_patrolled
) {
if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieWithError( 'apierror-permissiondenied-patrolflag', 'permissiondenied' );
}
+ $isFilterset = isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
+ isset( $show['autopatrolled'] ) || isset( $show['!autopatrolled'] );
$this->addTables( 'recentchanges' );
$this->addJoinConds( [ 'recentchanges' => [
- isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ? 'JOIN' : 'LEFT JOIN',
+ $isFilterset ? 'JOIN' : 'LEFT JOIN',
[
// This is a crazy hack. recentchanges has no index on rc_this_oldid, so instead of adding
// one T19237 did a join using rc_user_text and rc_timestamp instead. Now rc_user_text is
}
if ( $this->fld_patrolled ) {
- $vals['patrolled'] = (bool)$row->rc_patrolled;
+ $vals['patrolled'] = $row->rc_patrolled != RecentChange::PRC_UNPATROLLED;
+ $vals['autopatrolled'] = $row->rc_patrolled == RecentChange::PRC_AUTOPATROLLED;
}
if ( $this->fld_size && !is_null( $row->rev_len ) ) {
'!minor',
'patrolled',
'!patrolled',
+ 'autopatrolled',
+ '!autopatrolled',
'top',
'!top',
'new',
}
if ( $this->fld_patrol ) {
$includeFields[] = WatchedItemQueryService::INCLUDE_PATROL_INFO;
+ $includeFields[] = WatchedItemQueryService::INCLUDE_AUTOPATROL_INFO;
}
if ( $this->fld_sizes ) {
$includeFields[] = WatchedItemQueryService::INCLUDE_SIZES;
&& isset( $show[WatchedItemQueryService::FILTER_NOT_ANON] ) )
|| ( isset( $show[WatchedItemQueryService::FILTER_PATROLLED] )
&& isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] ) )
+ || ( isset( $show[WatchedItemQueryService::FILTER_AUTOPATROLLED] )
+ && isset( $show[WatchedItemQueryService::FILTER_NOT_AUTOPATROLLED] ) )
+ || ( isset( $show[WatchedItemQueryService::FILTER_AUTOPATROLLED] )
+ && isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] ) )
|| ( isset( $show[WatchedItemQueryService::FILTER_UNREAD] )
&& isset( $show[WatchedItemQueryService::FILTER_NOT_UNREAD] ) );
}
/* Add the patrolled flag */
if ( $this->fld_patrol ) {
- $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] == 1;
+ $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] != 0;
$vals['unpatrolled'] = ChangesList::isUnpatrolled( (object)$recentChangeInfo, $user );
+ $vals['autopatrolled'] = $recentChangeInfo['rc_patrolled'] == 2;
}
if ( $this->fld_loginfo && $recentChangeInfo['rc_type'] == RC_LOG ) {
WatchedItemQueryService::FILTER_NOT_ANON,
WatchedItemQueryService::FILTER_PATROLLED,
WatchedItemQueryService::FILTER_NOT_PATROLLED,
+ WatchedItemQueryService::FILTER_AUTOPATROLLED,
+ WatchedItemQueryService::FILTER_NOT_AUTOPATROLLED,
WatchedItemQueryService::FILTER_UNREAD,
WatchedItemQueryService::FILTER_NOT_UNREAD,
]
"apihelp-query+recentchanges-paramvalue-prop-sizes": "Adds the new and old page length in bytes.",
"apihelp-query+recentchanges-paramvalue-prop-redirect": "Tags edit if page is a redirect.",
"apihelp-query+recentchanges-paramvalue-prop-patrolled": "Tags patrollable edits as being patrolled or unpatrolled.",
+ "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "Tags patrollable edits as being autopatrolled or not.",
"apihelp-query+recentchanges-paramvalue-prop-loginfo": "Adds log information (log ID, log type, etc) to log entries.",
"apihelp-query+recentchanges-paramvalue-prop-tags": "Lists tags for the entry.",
"apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
"apihelp-query+usercontribs-paramvalue-prop-sizediff": "Adds the size delta of the edit against its parent.",
"apihelp-query+usercontribs-paramvalue-prop-flags": "Adds flags of the edit.",
"apihelp-query+usercontribs-paramvalue-prop-patrolled": "Tags patrolled edits.",
+ "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "Tags autopatrolled edits.",
"apihelp-query+usercontribs-paramvalue-prop-tags": "Lists tags for the edit.",
"apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
"apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.",
"apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Adds parsed comment of the edit.",
"apihelp-query+watchlist-paramvalue-prop-timestamp": "Adds timestamp of the edit.",
"apihelp-query+watchlist-paramvalue-prop-patrol": "Tags edits that are patrolled.",
+ "apihelp-query+watchlist-paramvalue-prop-autopatrol": "Tags edits that are autopatrolled.",
"apihelp-query+watchlist-paramvalue-prop-sizes": "Adds the old and new lengths of the page.",
"apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adds timestamp of when the user was last notified about the edit.",
"apihelp-query+watchlist-paramvalue-prop-loginfo": "Adds log information where appropriate.",
"Sator",
"An13sa",
"Gorkaazk",
- "Mikel Ibaiba"
+ "Mikel Ibaiba",
+ "Iñaki LL"
]
},
"apihelp-main-param-action": "Zein ekintza burutuko da.",
"apihelp-edit-summary": "Orrialdeak sortu eta aldatu.",
"apihelp-edit-param-title": "Orri izenburua aldatzeke. Hurrengoarekin batera ezin da erabili: <var>$1pageid</var>.",
"apihelp-edit-param-pageid": "Ezabatzeko orri edo ID orria. Hurrengoarekin batera ezin da erabili: <var>$1title</var>.",
- "apihelp-edit-param-sectiontitle": "Atal berri baten titulua.",
+ "apihelp-edit-param-sectiontitle": "Atal berri baten izenburua.",
"apihelp-edit-param-text": "Orrialdearen edukia.",
"apihelp-edit-param-tags": "Aldatu etiketak berrikusketa eskatzeko.",
"apihelp-edit-param-minor": "Aldaketa txikia.",
"apihelp-opensearch-summary": "Procure na wiki usando o protocolo OpenSearch.",
"apihelp-opensearch-param-search": "Pesquisar string.",
"apihelp-opensearch-param-limit": "Número máximo de resultados.",
- "apihelp-opensearch-param-namespace": "Espaço nominal para pesquisar.",
+ "apihelp-opensearch-param-namespace": "Espaços nominais a pesquisar. Ignorados se <var>$1search</var> começar com um prefixo de espaço nominal válido.",
"apihelp-opensearch-param-suggest": "Não fazer nada se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> é false.",
"apihelp-opensearch-param-redirects": "Como lidar com os redirecionamentos:\n;return: Retornar o redirecionamento em si.\n;resolve: Retornar a página de destino. Pode retornar menos de $1 resultados.\nPor razões históricas, o padrão é \"return\" para $1format=json e \"resolve\" para outros formatos.",
"apihelp-opensearch-param-format": "O formato da saída.",
"apihelp-query+prefixsearch-summary": "Execute uma pesquisa de prefixo para títulos de página.",
"apihelp-query+prefixsearch-extended-description": "Apesar da semelhança nos nomes, este módulo não se destina a ser equivalente a[[Special:PrefixIndex]]; para isso, veja <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> com o parâmetro <kbd>apprefix</kbd>.O propósito deste módulo é semelhante a <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: para inserir o usuário e fornecer os títulos de melhor correspondência. Dependendo do backend do mecanismo de pesquisa, isso pode incluir correção de digitação, evasão de redirecionamento ou outras heurísticas.",
"apihelp-query+prefixsearch-param-search": "Pesquisar string.",
- "apihelp-query+prefixsearch-param-namespace": "Espaço nominal para pesquisar.",
+ "apihelp-query+prefixsearch-param-namespace": "Os espaços nominais onde realizar a pesquisa. Ignorados se <var>$1search</var> começar com um prefixo de espaço nominal válido.",
"apihelp-query+prefixsearch-param-limit": "Número máximo de resultados.",
"apihelp-query+prefixsearch-param-offset": "Número de resultados a ignorar.",
"apihelp-query+prefixsearch-example-simple": "Procure títulos de páginas começando com <kbd>meaning</kbd>.",
"apihelp-opensearch-summary": "Pesquisar a wiki usando o protocolo OpenSearch.",
"apihelp-opensearch-param-search": "Texto a pesquisar.",
"apihelp-opensearch-param-limit": "O número máximo de resultados a serem devolvidos.",
- "apihelp-opensearch-param-namespace": "Espaços nominais a pesquisar.",
+ "apihelp-opensearch-param-namespace": "Espaços nominais a pesquisar. Ignorados se <var>$1search</var> começar com um prefixo de espaço nominal válido.",
"apihelp-opensearch-param-suggest": "Não fazer nada se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> for falso.",
"apihelp-opensearch-param-redirects": "Como tratar redirecionamentos:\n;return:Devolver o próprio redirecionamento.\n;resolve:Devolver a página de destino. Pode devolver menos de $1limit resultados.\nPor razões históricas, o valor por omissão é \"return\" para o formato $1format=json e \"resolve\" para outros formatos.",
"apihelp-opensearch-param-format": "O formato do resultado.",
"apihelp-query+prefixsearch-summary": "Realizar uma procura de prefixo nos títulos de página.",
"apihelp-query+prefixsearch-extended-description": "Apesar da semelhança de nomes, este módulo não pretende ser equivalente a [[Special:PrefixIndex]]; para este, consulte <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> com o parâmetro <kbd>apprefix</kbd>. O propósito deste módulo é semelhante a <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: receber dados introduzidos pelo utilizador e devolver os títulos com melhor correspondência. Dependendo do motor de busca do servidor, isto pode incluir correções de erros ortográficos, evitar redirecionamentos, e outras heurísticas.",
"apihelp-query+prefixsearch-param-search": "O texto a ser pesquisado.",
- "apihelp-query+prefixsearch-param-namespace": "Os espaços nominais onde realizar a pesquisa.",
+ "apihelp-query+prefixsearch-param-namespace": "Os espaços nominais onde realizar a pesquisa. Ignorados se <var>$1search</var> começar com um prefixo de espaço nominal válido.",
"apihelp-query+prefixsearch-param-limit": "O número máximo de resultados a serem devolvidos.",
"apihelp-query+prefixsearch-param-offset": "O número de resultados a serem omitidos.",
"apihelp-query+prefixsearch-example-simple": "Procurar os títulos de página que começam por <kbd>meaning</kbd>.",
"apihelp-query+recentchanges-paramvalue-prop-sizes": "{{doc-apihelp-paramvalue|query+recentchanges|prop|sizes}}",
"apihelp-query+recentchanges-paramvalue-prop-redirect": "{{doc-apihelp-paramvalue|query+recentchanges|prop|redirect}}",
"apihelp-query+recentchanges-paramvalue-prop-patrolled": "{{doc-apihelp-paramvalue|query+recentchanges|prop|patrolled}}",
+ "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "{{doc-apihelp-paramvalue|query+recentchanges|prop|autopatrolled}}",
"apihelp-query+recentchanges-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+recentchanges|prop|loginfo}}",
"apihelp-query+recentchanges-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+recentchanges|prop|tags}}",
"apihelp-query+recentchanges-paramvalue-prop-sha1": "{{doc-apihelp-paramvalue|query+recentchanges|prop|sha1}}",
"apihelp-query+usercontribs-paramvalue-prop-sizediff": "{{doc-apihelp-paramvalue|query+usercontribs|prop|sizediff}}",
"apihelp-query+usercontribs-paramvalue-prop-flags": "{{doc-apihelp-paramvalue|query+usercontribs|prop|flags}}",
"apihelp-query+usercontribs-paramvalue-prop-patrolled": "{{doc-apihelp-paramvalue|query+usercontribs|prop|patrolled}}",
+ "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "{{doc-apihelp-paramvalue|query+usercontribs|prop|autopatrolled}}",
"apihelp-query+usercontribs-paramvalue-prop-tags": "{{doc-apihelp-paramvalue|query+usercontribs|prop|tags}}",
"apihelp-query+usercontribs-param-show": "{{doc-apihelp-param|query+usercontribs|show|params=* $1 - Value of [[mw:Manual:$RCMaxAge|$RCMaxAge]]|paramstart=2}}",
"apihelp-query+usercontribs-param-tag": "{{doc-apihelp-param|query+usercontribs|tag}}",
"apihelp-query+watchlist-paramvalue-prop-parsedcomment": "{{doc-apihelp-paramvalue|query+watchlist|prop|parsedcomment}}",
"apihelp-query+watchlist-paramvalue-prop-timestamp": "{{doc-apihelp-paramvalue|query+watchlist|prop|timestamp}}",
"apihelp-query+watchlist-paramvalue-prop-patrol": "{{doc-apihelp-paramvalue|query+watchlist|prop|patrol}}",
+ "apihelp-query+watchlist-paramvalue-prop-autopatrol": "{{doc-apihelp-paramvalue|query+watchlist|prop|autopatrol}}",
"apihelp-query+watchlist-paramvalue-prop-sizes": "{{doc-apihelp-paramvalue|query+watchlist|prop|sizes}}",
"apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "{{doc-apihelp-paramvalue|query+watchlist|prop|notificationtimestamp}}",
"apihelp-query+watchlist-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+watchlist|prop|loginfo}}",
const SRC_EXTERNAL = 'mw.external'; // obsolete
const SRC_CATEGORIZE = 'mw.categorize';
+ const PRC_UNPATROLLED = 0;
+ const PRC_PATROLLED = 1;
+ const PRC_AUTOPATROLLED = 2;
+
public $mAttribs = [];
public $mExtra = [];
);
}
- /**
- * @see listSoftwareActivatedTags
- * @deprecated since 1.28 call listSoftwareActivatedTags directly
- * @return array
- */
- public static function listExtensionActivatedTags() {
- wfDeprecated( __METHOD__, '1.28' );
- return self::listSoftwareActivatedTags();
- }
-
/**
* Basically lists defined tags which count even if they aren't applied to anything.
- * It returns a union of the results of listExplicitlyDefinedTags() and
- * listExtensionDefinedTags().
+ * It returns a union of the results of listExplicitlyDefinedTags()
*
* @return string[] Array of strings: tags
*/
);
}
- /**
- * Call listSoftwareDefinedTags directly
- *
- * @see listSoftwareDefinedTags
- * @deprecated since 1.28
- * @return array
- */
- public static function listExtensionDefinedTags() {
- wfDeprecated( __METHOD__, '1.28' );
- return self::listSoftwareDefinedTags();
- }
-
/**
* Invalidates the short-term cache of defined tags used by the
* list*DefinedTags functions, as well as the tag statistics cache.
require_once __DIR__ . '/../AutoLoader.php';
/**
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class ComposerHookHandler {
use Composer\Semver\Constraint\Constraint;
/**
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class ComposerPackageModifier {
<?php
/**
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class ComposerVersionNormalizer {
* @file
* @ingroup Database
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Daniel Kinzler
*/
abstract class DBAccessBase implements IDBAccessObject {
return $this->displayFormat;
}
- /**
- * Test if displayFormat is 'vform'
- * @since 1.22
- * @deprecated since 1.25
- * @return bool
- */
- public function isVForm() {
- wfDeprecated( __METHOD__, '1.25' );
- return false;
- }
-
/**
* Get the HTMLFormField subclass for this descriptor.
*
*/
protected $displayFormat = 'vform';
- public function isVForm() {
- wfDeprecated( __METHOD__, '1.25' );
- return true;
- }
-
public static function loadInputFromParameters( $fieldname, $descriptor,
HTMLForm $parent = null
) {
$this->output( "done.\n" );
}
+ /**
+ * Populate ar_rev_id, then make it not nullable
+ * @since 1.31
+ */
+ protected function populateArchiveRevId() {
+ $info = $this->db->fieldInfo( 'archive', 'ar_rev_id', __METHOD__ );
+ if ( !$info ) {
+ throw new MWException( 'Missing ar_rev_id field of archive table. Should not happen.' );
+ }
+ if ( $info->isNullable() ) {
+ $this->output( "Populating ar_rev_id.\n" );
+ $task = $this->maintenance->runChild( 'PopulateArchiveRevId', 'populateArchiveRevId.php' );
+ if ( $task->execute() ) {
+ $this->applyPatch( 'patch-ar_rev_id-not-null.sql', false,
+ 'Making ar_rev_id not nullable' );
+ }
+ }
+ }
+
}
// Should have been in 1.30
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+ // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
+ [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
+ // Should have been in 1.30
[ 'migrateComments' ],
// 1.31
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
[ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
+ [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
+ [ 'populateArchiveRevId' ],
+ [ 'modifyField', 'recentchanges', 'rc_patrolled', 'patch-rc_patrolled_type.sql' ],
];
}
[ 'renameIndex', 'user_properties', 'user_properties_user_property', 'PRIMARY', false,
'patch-user_properties-fix-pk.sql' ],
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+
+ // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
+ [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
+
[ 'migrateComments' ],
[ 'renameIndex', 'l10n_cache', 'lc_lang_key', 'PRIMARY', false,
'patch-l10n_cache-primary-key.sql' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
[ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
+ [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
+ [ 'populateArchiveRevId' ],
];
}
// Should have been in 1.30
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+ // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
+ [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
+ // Should have been in 1.30
[ 'migrateComments' ],
// 1.31
[ 'migrateArchiveText' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
+ [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
+ [ 'populateArchiveRevId' ],
// KEEP THIS AT THE BOTTOM!!
[ 'doRebuildDuplicateFunction' ],
'_InstallUser' => 'postgres',
];
- public static $minimumVersion = '8.3';
+ public static $minimumVersion = '9.2';
protected static $notMiniumumVerisonMessage = 'config-postgres-old';
public $maxRoleSearchDepth = 5;
[ 'log_timestamp', 'timestamptz_ops', 'btree', 0 ],
],
'CREATE INDEX "logging_times" ON "logging" USING "btree" ("log_timestamp")' ],
- [ 'dropIndex', 'oldimage', 'oi_name' ],
+ [ 'dropPgIndex', 'oldimage', 'oi_name' ],
[ 'checkIndex', 'oi_name_archive_name', [
[ 'oi_name', 'text_ops', 'btree', 0 ],
[ 'oi_archive_name', 'text_ops', 'btree', 0 ],
[ 'checkOiNameConstraint' ],
[ 'checkPageDeletedTrigger' ],
[ 'checkRevUserFkey' ],
- [ 'dropIndex', 'ipblocks', 'ipb_address' ],
+ [ 'dropPgIndex', 'ipblocks', 'ipb_address' ],
[ 'checkIndex', 'ipb_address_unique', [
[ 'ipb_address', 'text_ops', 'btree', 0 ],
[ 'ipb_user', 'int4_ops', 'btree', 0 ],
[ 'changeNullableField', 'protected_titles', 'pt_reason', 'NOT NULL', true ],
[ 'addPgField', 'protected_titles', 'pt_reason_id', 'INTEGER NOT NULL DEFAULT 0' ],
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+
+ // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
+ [ 'addPgField', 'image', 'img_description_id', 'INTEGER NOT NULL DEFAULT 0' ],
+
[ 'migrateComments' ],
[ 'addIndex', 'site_stats', 'site_stats_pkey', 'patch-site_stats-pk.sql' ],
[ 'addTable', 'ip_changes', 'patch-ip_changes.sql' ],
[ 'addPgIndex', 'logging', 'logging_actor_type_time', '( log_actor, log_type, log_timestamp )' ],
[ 'addPgIndex', 'logging', 'logging_actor_time', '( log_actor, log_timestamp )' ],
[ 'migrateActors' ],
+ [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
+ [ 'populateArchiveRevId' ],
];
}
}
}
- protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
+ protected function dropPgIndex( $table, $index ) {
if ( $this->db->indexExists( $table, $index ) ) {
$this->output( "Dropping obsolete index '$index'\n" );
$this->db->query( "DROP INDEX \"" . $index . "\"" );
[ 'renameIndex', 'user_properties', 'user_properties_user_property', 'PRIMARY', false,
'patch-user_properties-fix-pk.sql' ],
[ 'addTable', 'comment', 'patch-comment-table.sql' ],
+
+ // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
+ [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
+
[ 'migrateComments' ],
[ 'renameIndex', 'l10n_cache', 'lc_lang_key', 'PRIMARY', false,
'patch-l10n_cache-primary-key.sql' ],
[ 'addTable', 'actor', 'patch-actor-table.sql' ],
[ 'migrateActors' ],
[ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
+ [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
+ [ 'populateArchiveRevId' ],
];
}
"config-extensions": "Olekeni",
"config-skins": "Temey",
"config-install-step-done": "qeyd ke",
- "config-install-step-failed": "nêbı",
+ "config-install-step-failed": "ebe ser nêkewt",
"config-install-schema": "Şema dek",
"config-install-pg-commit": "Vırnayışa cemaati",
"config-install-tables": "Tabloy dek",
"config-cc-again": "Elegir otra vez...",
"config-cc-not-chosen": "Elige la licencia Creative Commons que desees y haz clic en \"proceed\".",
"config-advanced-settings": "Configuración avanzada",
- "config-cache-options": "Configuración de la caché de objetos:",
+ "config-cache-options": "Configuración de la antememoria de objetos:",
"config-cache-help": "El almacenamiento en caché de objetos se utiliza para mejorar la velocidad de MediaWiki mediante el almacenamiento en caché los datos usados más frecuentemente.\nA los sitios medianos y grandes se les recomienda que permitirlo. También es beneficioso para los sitios pequeños.",
"config-cache-none": "Sin almacenamiento en caché (no se pierde ninguna funcionalidad, pero la velocidad puede resentirse en sitios grandes)",
"config-cache-accel": "Almacenamiento en caché de objetos PHP (APC, APCu, XCache o WinCache)",
"config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
"config-install-done": "<strong>Parabéns!</strong>\nVocê instalou o MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo na raiz da sua instalação (o mesmo diretório onde está o arquivo index.php). O download deve iniciar automaticamente.\n\nSe o download não foi iniciado ou se ele foi cancelado, você pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota:</strong> Se você não fizer isso agora, o arquivo de configuração que foi gerado não estará mais disponível se você sair da instalação sem fazer o download.\n\nQuando isso tiver sido feito, você pode <strong>[$2 entrar na sua wiki]</strong>.",
"config-install-done-path": "<strong>Parabéns!</strong>\nVocê instalou o MediaWiki.\n\nO instalador gerou um arquivo <code>LocalSettings.php</code>.\nEste arquivo contém todas as suas configurações.\n\nVocê precisa fazer o download desse arquivo e colocá-lo em <code>$4</code>. O download deve iniciar automaticamente.\n\nSe o download não foi iniciado ou se ele foi cancelado, você pode recomeçá-lo clicando no link abaixo:\n\n$3\n\n<strong>Nota:</strong> Se você não fizer isso agora, o arquivo de configuração que foi gerado não estará mais disponível se você sair da instalação sem fazer o download.\n\nQuando isso tiver sido feito, você pode <strong>[$2 entrar na sua wiki]</strong>.",
+ "config-install-success": "O MediaWiki foi instalado. Já pode visitar <$1$2> para ver a sua wiki.\nSe tiver dúvidas, veja a nossa lista de perguntas frequentes,\n<https://www.mediawiki.org/wiki/Manual:FAQ/pt-br>, ou utilize um dos fóruns de suporte indicados nessa página.",
"config-download-localsettings": "Baixar <code>LocalSettings.php</code>",
"config-help": "ajuda",
"config-help-tooltip": "clique para expandir",
"config-apc": "[http://www.php.net/apc APC] встановлено",
"config-apcu": "[http://www.php.net/apcu APCu] встановлено",
"config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] встановлено",
- "config-no-cache-apcu": "<strong>Увага:</strong> Не вдалося знайти [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] чи [http://www.iis.net/download/WinCacheForPhp WinCache].\nКешування об'єктів не ввімкнено.",
+ "config-no-cache-apcu": "<strong>Увага:</strong> Не вдалося знайти [http://www.php.net/apcu APCu] чи [http://www.iis.net/download/WinCacheForPhp WinCache].\nКешування об'єктів не ввімкнено.",
"config-mod-security": "'''Увага''': на Вашому веб-сервері увімкнено [https://modsecurity.org/ mod_security]. У разі неправильних налаштувать, він може викликати проблеми MediaWiki або іншого ПЗ, яке дозволяє користувачам надсилати довільний вміст.\nЗверніться до [https://modsecurity.org/documentation/ документації mod_security] або підтримки Вашого хостера, якщо під час роботи виникають незрозумілі помилки.",
"config-diff3-bad": "GNU diff3 не знайдено.",
"config-git": "Знайшов програму управління версіями Git: <code>$1</code>.",
"config-cache-options": "Налаштування кешування об'єктів:",
"config-cache-help": "Кешування об'єктів використовується для покращення швидкодії MediaWiki методом кешування часто використовуваних даних.\nЗаохочується увімкнення цієї можливості для середніх і великих сайтів, малі сайти також можуть відчути її перевагу.",
"config-cache-none": "Без кешування (жодні функції не втрачаються, але впливає на швидкодію великих вікі-сайтів)",
- "config-cache-accel": "PHP кешування об'єктів (APC, APCu, XCache чи WinCache)",
+ "config-cache-accel": "PHP кешування об'єктів (APC, APCu чи WinCache)",
"config-cache-memcached": "Використовувати Memcached (вимагає додаткової установки і налаштування)",
"config-memcached-servers": "Сервери Memcached:",
"config-memcached-help": "Список IP-адрес, що викоритовує Memcached.\nВкажіть по одному в рядку, разом з портами. Наприклад:\n 127.0.0.1:11211\n 192.168.1.25:1234",
/**
* Job for updating user activity like "last viewed" timestamps
*
+ * Job parameters include:
+ * - type: one of (updateWatchlistNotification) [required]
+ * - userid: affected user ID [required]
+ * - notifTime: timestamp to set watchlist entries to [required]
+ * - curTime: UNIX timestamp of the event that triggered this job [required]
+ *
* @ingroup JobQueue
* @since 1.26
*/
function __construct( Title $title, array $params ) {
parent::__construct( 'activityUpdateJob', $title, $params );
- if ( !isset( $params['type'] ) ) {
- throw new InvalidArgumentException( "Missing 'type' parameter." );
+ static $required = [ 'type', 'userid', 'notifTime', 'curTime' ];
+ $missing = implode( ', ', array_diff( $required, array_keys( $this->params ) ) );
+ if ( $missing != '' ) {
+ throw new InvalidArgumentException( "Missing paramter(s) $missing" );
}
$this->removeDuplicates = true;
if ( $this->params['type'] === 'updateWatchlistNotification' ) {
$this->updateWatchlistNotification();
} else {
- throw new InvalidArgumentException(
- "Invalid 'type' parameter '{$this->params['type']}'." );
+ throw new InvalidArgumentException( "Invalid 'type' '{$this->params['type']}'." );
}
return true;
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * Job for clearing all of the "last viewed" timestamps for a user's watchlist
+ *
+ * Job parameters include:
+ * - userId: affected user ID [required]
+ * - casTime: UNIX timestamp of the event that triggered this job [required]
+ *
+ * @ingroup JobQueue
+ * @since 1.31
+ */
+class ClearWatchlistNotificationsJob extends Job {
+ function __construct( Title $title, array $params ) {
+ parent::__construct( 'clearWatchlistNotifications', $title, $params );
+
+ static $required = [ 'userId', 'casTime' ];
+ $missing = implode( ', ', array_diff( $required, array_keys( $this->params ) ) );
+ if ( $missing != '' ) {
+ throw new InvalidArgumentException( "Missing paramter(s) $missing" );
+ }
+
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $services = MediaWikiServices::getInstance();
+ $lbFactory = $services->getDBLoadBalancerFactory();
+ $rowsPerQuery = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
+
+ $dbw = $lbFactory->getMainLB()->getConnection( DB_MASTER );
+ $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+
+ $asOfTimes = array_unique( $dbw->selectFieldValues(
+ 'watchlist',
+ 'wl_notificationtimestamp',
+ [ 'wl_user' => $this->params['userId'], 'wl_notificationtimestamp IS NOT NULL' ],
+ __METHOD__,
+ [ 'ORDER BY' => 'wl_notificationtimestamp DESC' ]
+ ) );
+
+ foreach ( array_chunk( $asOfTimes, $rowsPerQuery ) as $asOfTimeBatch ) {
+ $dbw->update(
+ 'watchlist',
+ [ 'wl_notificationtimestamp' => null ],
+ [
+ 'wl_user' => $this->params['userId'],
+ 'wl_notificationtimestamp' => $asOfTimeBatch,
+ // New notifications since the reset should not be cleared
+ 'wl_notificationtimestamp < ' .
+ $dbw->addQuotes( $dbw->timestamp( $this->params['casTime'] ) )
+ ],
+ __METHOD__
+ );
+ $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+ }
+ }
+}
use HashBagOStuff;
use LogicException;
use InvalidArgumentException;
+use UnexpectedValueException;
use Exception;
use RuntimeException;
$this->flags |= self::DBO_TRX;
}
}
+ // Disregard deprecated DBO_IGNORE flag (T189999)
+ $this->flags &= ~self::DBO_IGNORE;
$this->sessionVars = $params['variables'];
return $res;
}
- /**
- * Turns on (false) or off (true) the automatic generation and sending
- * of a "we're sorry, but there has been a database error" page on
- * database errors. Default is on (false). When turned off, the
- * code should use lastErrno() and lastError() to handle the
- * situation as appropriate.
- *
- * Do not use this function outside of the Database classes.
- *
- * @param null|bool $ignoreErrors
- * @return bool The previous value of the flag.
- */
- protected function ignoreErrors( $ignoreErrors = null ) {
- $res = $this->getFlag( self::DBO_IGNORE );
- if ( $ignoreErrors !== null ) {
- // setFlag()/clearFlag() do not allow DBO_IGNORE changes for sanity
- if ( $ignoreErrors ) {
- $this->flags |= self::DBO_IGNORE;
- } else {
- $this->flags &= ~self::DBO_IGNORE;
- }
- }
-
- return $res;
- }
-
public function trxLevel() {
return $this->trxLevel;
}
public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
if ( ( $flag & self::DBO_IGNORE ) ) {
- throw new \UnexpectedValueException( "Modifying DBO_IGNORE is not allowed." );
+ throw new UnexpectedValueException( "Modifying DBO_IGNORE is not allowed." );
}
if ( $remember === self::REMEMBER_PRIOR ) {
public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
if ( ( $flag & self::DBO_IGNORE ) ) {
- throw new \UnexpectedValueException( "Modifying DBO_IGNORE is not allowed." );
+ throw new UnexpectedValueException( "Modifying DBO_IGNORE is not allowed." );
}
if ( $remember === self::REMEMBER_PRIOR ) {
* @throws DBQueryError
*/
public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
- if ( $this->ignoreErrors() || $tempIgnore ) {
+ if ( $tempIgnore ) {
$this->queryLogger->debug( "SQL ERROR (ignored): $error\n" );
} else {
$sql1line = mb_substr( str_replace( "\n", "\\n", $sql ), 0, 5 * 1024 );
$this->trxWriteAdjQueryCount = 0;
$this->trxWriteCallers = [];
// First SELECT after BEGIN will establish the snapshot in REPEATABLE-READ.
- // Get an estimate of the replica DB lag before then, treating estimate staleness
- // as lag itself just to be safe
- $status = $this->getApproximateLagStatus();
- $this->trxReplicaLag = $status['lag'] + ( microtime( true ) - $status['since'] );
+ // Get an estimate of the replication lag before any such queries.
+ $this->trxReplicaLag = $this->getApproximateLagStatus()['lag'];
// T147697: make explicitTrxActive() return true until begin() finishes. This way, no
// caller will think its OK to muck around with the transaction just because startAtomic()
// has not yet completed (e.g. setting trxAtomicLevels).
* @return array|null ('lag': seconds or false on error, 'since': UNIX timestamp of BEGIN)
* @since 1.27
*/
- protected function getTransactionLagStatus() {
+ final protected function getTransactionLagStatus() {
return $this->trxLevel
? [ 'lag' => $this->trxReplicaLag, 'since' => $this->trxTimestamp() ]
: null;
// Cache getServerId() for 24 hours
const SERVER_ID_CACHE_TTL = 86400;
+ /** @var float Warn if lag estimates are made for transactions older than this many seconds */
+ const LAG_STALE_WARN_THRESHOLD = 0.100;
+
/**
* Additional $params include:
* - lagDetectionMethod : set to one of (Seconds_Behind_Master,pt-heartbeat).
protected function getLagFromSlaveStatus() {
$res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
$row = $res ? $res->fetchObject() : false;
+ // If the server is not replicating, there will be no row
if ( $row && strval( $row->Seconds_Behind_Master ) !== '' ) {
return intval( $row->Seconds_Behind_Master );
}
protected function getLagFromPtHeartbeat() {
$options = $this->lagDetectionOptions;
+ $staleness = $this->trxLevel
+ ? microtime( true ) - $this->trxTimestamp()
+ : 0;
+ if ( $staleness > self::LAG_STALE_WARN_THRESHOLD ) {
+ // Avoid returning higher and higher lag value due to snapshot age
+ // given that the isolation level will typically be REPEATABLE-READ
+ $this->queryLogger->warning(
+ "Using cached lag value for {db_server} due to active transaction",
+ $this->getLogContext( [ 'method' => __METHOD__ ] )
+ );
+
+ return $this->getTransactionLagStatus()['lag'];
+ }
+
if ( isset( $options['conds'] ) ) {
// Best method for multi-DC setups: use logical channel names
$data = $this->getHeartbeatData( $options['conds'] );
// Note: this would use "TIMESTAMPDIFF(MICROSECOND,ts,UTC_TIMESTAMP(6))" but the
// percision field is not supported in MySQL <= 5.5.
$res = $this->query(
- "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1"
+ "SELECT ts FROM heartbeat.heartbeat WHERE $whereSQL ORDER BY ts DESC LIMIT 1",
+ __METHOD__
);
$row = $res ? $res->fetchObject() : false;
} finally {
$rpos = $this->getReplicaPos();
$gtidsWait = $rpos ? MySQLMasterPos::getCommonDomainGTIDs( $pos, $rpos ) : [];
if ( !$gtidsWait ) {
+ $this->queryLogger->error(
+ "No GTIDs with the same domain between master ($pos) and replica ($rpos)",
+ $this->getLogContext( [
+ 'method' => __METHOD__,
+ ] )
+ );
+
return -1; // $pos is from the wrong cluster?
}
// Wait on the GTID set (MariaDB only)
$gtidArg = $this->addQuotes( implode( ',', $gtidsWait ) );
- if ( strpos( $gtidArg, ':' ) !== false ) {
- // MySQL GTIDs, e.g "source_id:transaction_id"
- $res = $this->doQuery( "SELECT WAIT_FOR_EXECUTED_GTID_SET($gtidArg, $timeout)" );
- } else {
- // MariaDB GTIDs, e.g."domain:server:sequence"
- $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" );
- }
+ $res = $this->doQuery( "SELECT MASTER_GTID_WAIT($gtidArg, $timeout)" );
} else {
// Wait on the binlog coordinates
$encFile = $this->addQuotes( $pos->getLogFile() );
- $encPos = intval( $pos->getLogPosition()[$pos::CORD_EVENT] );
+ $encPos = intval( $pos->pos[1] );
$res = $this->doQuery( "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)" );
}
$row = $res ? $this->fetchRow( $res ) : false;
if ( !$row ) {
- throw new DBExpectedError( $this, "Replication wait failed: {$this->lastError()}" );
+ throw new DBExpectedError( $this,
+ "MASTER_POS_WAIT() or MASTER_GTID_WAIT() failed: {$this->lastError()}" );
}
// Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual
* @return MySQLMasterPos|bool
*/
public function getReplicaPos() {
- $now = microtime( true ); // as-of-time *before* fetching GTID variables
-
- if ( $this->useGTIDs() ) {
- // Try to use GTIDs, fallbacking to binlog positions if not possible
- $data = $this->getServerGTIDs( __METHOD__ );
- // Use gtid_current_pos for MariaDB and gtid_executed for MySQL
- foreach ( [ 'gtid_current_pos', 'gtid_executed' ] as $name ) {
- if ( isset( $data[$name] ) && strlen( $data[$name] ) ) {
- return new MySQLMasterPos( $data[$name], $now );
- }
+ $now = microtime( true );
+
+ if ( $this->useGTIDs ) {
+ $res = $this->query( "SELECT @@global.gtid_slave_pos AS Value", __METHOD__ );
+ $gtidRow = $this->fetchObject( $res );
+ if ( $gtidRow && strlen( $gtidRow->Value ) ) {
+ return new MySQLMasterPos( $gtidRow->Value, $now );
}
}
- $data = $this->getServerRoleStatus( 'SLAVE', __METHOD__ );
- if ( $data && strlen( $data['Relay_Master_Log_File'] ) ) {
+ $res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+ $row = $this->fetchObject( $res );
+ if ( $row && strlen( $row->Relay_Master_Log_File ) ) {
return new MySQLMasterPos(
- "{$data['Relay_Master_Log_File']}/{$data['Exec_Master_Log_Pos']}",
+ "{$row->Relay_Master_Log_File}/{$row->Exec_Master_Log_Pos}",
$now
);
}
* @return MySQLMasterPos|bool
*/
public function getMasterPos() {
- $now = microtime( true ); // as-of-time *before* fetching GTID variables
-
- $pos = false;
- if ( $this->useGTIDs() ) {
- // Try to use GTIDs, fallbacking to binlog positions if not possible
- $data = $this->getServerGTIDs( __METHOD__ );
- // Use gtid_current_pos for MariaDB and gtid_executed for MySQL
- foreach ( [ 'gtid_current_pos', 'gtid_executed' ] as $name ) {
- if ( isset( $data[$name] ) && strlen( $data[$name] ) ) {
- $pos = new MySQLMasterPos( $data[$name], $now );
- break;
- }
- }
- // Filter domains that are inactive or not relevant to the session
- if ( $pos ) {
- $pos->setActiveOriginServerId( $this->getServerId() );
- $pos->setActiveOriginServerUUID( $this->getServerUUID() );
- if ( isset( $data['gtid_domain_id'] ) ) {
- $pos->setActiveDomain( $data['gtid_domain_id'] );
- }
- }
- }
+ $now = microtime( true );
- if ( !$pos ) {
- $data = $this->getServerRoleStatus( 'MASTER', __METHOD__ );
- if ( $data && strlen( $data['File'] ) ) {
- $pos = new MySQLMasterPos( "{$data['File']}/{$data['Position']}", $now );
+ if ( $this->useGTIDs ) {
+ $res = $this->query( "SELECT @@global.gtid_binlog_pos AS Value", __METHOD__ );
+ $gtidRow = $this->fetchObject( $res );
+ if ( $gtidRow && strlen( $gtidRow->Value ) ) {
+ return new MySQLMasterPos( $gtidRow->Value, $now );
}
}
- return $pos;
- }
-
- /**
- * @return int
- * @throws DBQueryError If the variable doesn't exist for some reason
- */
- protected function getServerId() {
- return $this->srvCache->getWithSetCallback(
- $this->srvCache->makeGlobalKey( 'mysql-server-id', $this->getServer() ),
- self::SERVER_ID_CACHE_TTL,
- function () {
- $res = $this->query( "SELECT @@server_id AS id", __METHOD__ );
- return intval( $this->fetchObject( $res )->id );
- }
- );
- }
-
- /**
- * @return string|null
- */
- protected function getServerUUID() {
- return $this->srvCache->getWithSetCallback(
- $this->srvCache->makeGlobalKey( 'mysql-server-uuid', $this->getServer() ),
- self::SERVER_ID_CACHE_TTL,
- function () {
- $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'server_uuid'" );
- $row = $this->fetchObject( $res );
-
- return $row ? $row->Value : null;
- }
- );
- }
-
- /**
- * @param string $fname
- * @return string[]
- */
- protected function getServerGTIDs( $fname = __METHOD__ ) {
- $map = [];
- // Get global-only variables like gtid_executed
- $res = $this->query( "SHOW GLOBAL VARIABLES LIKE 'gtid_%'", $fname );
- foreach ( $res as $row ) {
- $map[$row->Variable_name] = $row->Value;
- }
- // Get session-specific (e.g. gtid_domain_id since that is were writes will log)
- $res = $this->query( "SHOW SESSION VARIABLES LIKE 'gtid_%'", $fname );
- foreach ( $res as $row ) {
- $map[$row->Variable_name] = $row->Value;
+ $res = $this->query( 'SHOW MASTER STATUS', __METHOD__ );
+ $row = $this->fetchObject( $res );
+ if ( $row && strlen( $row->File ) ) {
+ return new MySQLMasterPos( "{$row->File}/{$row->Position}", $now );
}
- return $map;
- }
-
- /**
- * @param string $role One of "MASTER"/"SLAVE"
- * @param string $fname
- * @return string[] Latest available server status row
- */
- protected function getServerRoleStatus( $role, $fname = __METHOD__ ) {
- return $this->query( "SHOW $role STATUS", $fname )->fetchRow() ?: [];
+ return false;
}
public function serverIsReadOnly() {
return 'CAST( ' . $field . ' AS SIGNED )';
}
- /*
- * @return bool Whether GTID support is used (mockable for testing)
- */
- protected function useGTIDs() {
- return $this->useGTIDs;
- }
}
class_alias( DatabaseMysqlBase::class, 'DatabaseMysqlBase' );
public function ping( &$rtt = null );
/**
- * Get replica DB lag. Currently supported only by MySQL.
+ * Get the amount of replication lag for this database server
*
- * Note that this function will generate a fatal error on many
- * installations. Most callers should use LoadBalancer::safeGetLag()
- * instead.
+ * Callers should avoid using this method while a transaction is active
*
* @return int|bool Database replication lag in seconds or false on error
* @throws DBError
* - Binlog-based usage assumes single-source replication and non-hierarchical replication.
* - GTID-based usage allows getting/syncing with multi-source replication. It is assumed
* that GTID sets are complete (e.g. include all domains on the server).
- *
- * @see https://mariadb.com/kb/en/library/gtid/
- * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
*/
class MySQLMasterPos implements DBMasterPos {
- /** @var int One of (BINARY_LOG, GTID_MYSQL, GTID_MARIA) */
- private $style;
- /** @var string|null Base name of all Binary Log files */
- private $binLog;
- /** @var int[]|null Binary Log position tuple (index number, event number) */
- private $logPos;
- /** @var string[] Map of (server_uuid/gtid_domain_id => GTID) */
- private $gtids = [];
- /** @var int|null Active GTID domain ID */
- private $activeDomain;
- /** @var int|null ID of the server were DB writes originate */
- private $activeServerId;
- /** @var string|null UUID of the server were DB writes originate */
- private $activeServerUUID;
+ /** @var string|null Binlog file base name */
+ public $binlog;
+ /** @var int[]|null Binglog file position tuple */
+ public $pos;
+ /** @var string[] GTID list */
+ public $gtids = [];
/** @var float UNIX timestamp */
- private $asOfTime = 0.0;
-
- const BINARY_LOG = 'binary-log';
- const GTID_MARIA = 'gtid-maria';
- const GTID_MYSQL = 'gtid-mysql';
-
- /** @var int Key name of the binary log index number of a position tuple */
- const CORD_INDEX = 0;
- /** @var int Key name of the binary log event number of a position tuple */
- const CORD_EVENT = 1;
+ public $asOfTime = 0.0;
/**
* @param string $position One of (comma separated GTID list, <binlog file>/<integer>)
protected function init( $position, $asOfTime ) {
$m = [];
if ( preg_match( '!^(.+)\.(\d+)/(\d+)$!', $position, $m ) ) {
- $this->binLog = $m[1]; // ideally something like host name
- $this->logPos = [ self::CORD_INDEX => (int)$m[2], self::CORD_EVENT => (int)$m[3] ];
- $this->style = self::BINARY_LOG;
+ $this->binlog = $m[1]; // ideally something like host name
+ $this->pos = [ (int)$m[2], (int)$m[3] ];
} else {
$gtids = array_filter( array_map( 'trim', explode( ',', $position ) ) );
foreach ( $gtids as $gtid ) {
- $components = self::parseGTID( $gtid );
- if ( !$components ) {
+ if ( !self::parseGTID( $gtid ) ) {
throw new InvalidArgumentException( "Invalid GTID '$gtid'." );
}
-
- list( $domain, $pos ) = $components;
- if ( isset( $this->gtids[$domain] ) ) {
- // For MySQL, handle the case where some past issue caused a gap in the
- // executed GTID set, e.g. [last_purged+1,N-1] and [N+1,N+2+K]. Ignore the
- // gap by using the GTID with the highest ending sequence number.
- list( , $otherPos ) = self::parseGTID( $this->gtids[$domain] );
- if ( $pos > $otherPos ) {
- $this->gtids[$domain] = $gtid;
- }
- } else {
- $this->gtids[$domain] = $gtid;
- }
-
- if ( is_int( $domain ) ) {
- $this->style = self::GTID_MARIA; // gtid_domain_id
- } else {
- $this->style = self::GTID_MYSQL; // server_uuid
- }
+ $this->gtids[] = $gtid;
}
if ( !$this->gtids ) {
- throw new InvalidArgumentException( "GTID set cannot be empty." );
+ throw new InvalidArgumentException( "Got empty GTID set." );
}
}
}
// Prefer GTID comparisons, which work with multi-tier replication
- $thisPosByDomain = $this->getActiveGtidCoordinates();
- $thatPosByDomain = $pos->getActiveGtidCoordinates();
+ $thisPosByDomain = $this->getGtidCoordinates();
+ $thatPosByDomain = $pos->getGtidCoordinates();
if ( $thisPosByDomain && $thatPosByDomain ) {
$comparisons = [];
// Check that this has positions reaching those in $pos for all domains in common
}
// Prefer GTID comparisons, which work with multi-tier replication
- $thisPosDomains = array_keys( $this->getActiveGtidCoordinates() );
- $thatPosDomains = array_keys( $pos->getActiveGtidCoordinates() );
+ $thisPosDomains = array_keys( $this->getGtidCoordinates() );
+ $thatPosDomains = array_keys( $pos->getGtidCoordinates() );
if ( $thisPosDomains && $thatPosDomains ) {
// Check that $this has a GTID for at least one domain also in $pos; due to MariaDB
// quirks, prior master switch-overs may result in inactive garbage GTIDs that cannot
}
/**
- * @return string|null Base name of binary log files
- * @since 1.31
- */
- public function getLogName() {
- return $this->gtids ? null : $this->binLog;
- }
-
- /**
- * @return int[]|null Tuple of (binary log file number, event number)
- * @since 1.31
- */
- public function getLogPosition() {
- return $this->gtids ? null : $this->logPos;
- }
-
- /**
- * @return string|null Name of the binary log file for this position
- * @since 1.31
+ * @return string|null
*/
public function getLogFile() {
- return $this->gtids ? null : "{$this->binLog}.{$this->logPos[self::CORD_INDEX]}";
+ return $this->gtids ? null : "{$this->binlog}.{$this->pos[0]}";
}
/**
- * @return string[] Map of (server_uuid/gtid_domain_id => GTID)
- * @since 1.31
+ * @return string[]
*/
public function getGTIDs() {
return $this->gtids;
}
/**
- * @param int|null $id @@gtid_domain_id of the active replication stream
- * @since 1.31
+ * @return string GTID set or <binlog file>/<position> (e.g db1034-bin.000976/843431247)
*/
- public function setActiveDomain( $id ) {
- $this->activeDomain = (int)$id;
- }
-
- /**
- * @param int|null $id @@server_id of the server were writes originate
- * @since 1.31
- */
- public function setActiveOriginServerId( $id ) {
- $this->activeServerId = (int)$id;
- }
-
- /**
- * @param string|null $id @@server_uuid of the server were writes originate
- * @since 1.31
- */
- public function setActiveOriginServerUUID( $id ) {
- $this->activeServerUUID = $id;
+ public function __toString() {
+ return $this->gtids
+ ? implode( ',', $this->gtids )
+ : $this->getLogFile() . "/{$this->pos[1]}";
}
/**
* @param MySQLMasterPos $pos
* @param MySQLMasterPos $refPos
* @return string[] List of GTIDs from $pos that have domains in $refPos
- * @since 1.31
*/
public static function getCommonDomainGTIDs( MySQLMasterPos $pos, MySQLMasterPos $refPos ) {
- return array_values(
- array_intersect_key( $pos->gtids, $refPos->getActiveGtidCoordinates() )
- );
+ $gtidsCommon = [];
+
+ $relevantDomains = $refPos->getGtidCoordinates(); // (domain => unused)
+ foreach ( $pos->gtids as $gtid ) {
+ list( $domain ) = self::parseGTID( $gtid );
+ if ( isset( $relevantDomains[$domain] ) ) {
+ $gtidsCommon[] = $gtid;
+ }
+ }
+
+ return $gtidsCommon;
}
/**
* @see https://mariadb.com/kb/en/mariadb/gtid
* @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
- * @return array Map of (server_uuid/gtid_domain_id => integer position); possibly empty
+ * @return array Map of (domain => integer position); possibly empty
*/
- protected function getActiveGtidCoordinates() {
+ protected function getGtidCoordinates() {
$gtidInfos = [];
-
- foreach ( $this->gtids as $domain => $gtid ) {
- list( $domain, $pos, $server ) = self::parseGTID( $gtid );
-
- $ignore = false;
- // Filter out GTIDs from non-active replication domains
- if ( $this->style === self::GTID_MARIA && $this->activeDomain !== null ) {
- $ignore |= ( $domain !== $this->activeDomain );
- }
- // Likewise for GTIDs from non-active replication origin servers
- if ( $this->style === self::GTID_MARIA && $this->activeServerId !== null ) {
- $ignore |= ( $server !== $this->activeServerId );
- } elseif ( $this->style === self::GTID_MYSQL && $this->activeServerUUID !== null ) {
- $ignore |= ( $server !== $this->activeServerUUID );
- }
-
- if ( !$ignore ) {
- $gtidInfos[$domain] = $pos;
- }
+ foreach ( $this->gtids as $gtid ) {
+ list( $domain, $pos ) = self::parseGTID( $gtid );
+ $gtidInfos[$domain] = $pos;
}
return $gtidInfos;
}
/**
- * @param string $id GTID
- * @return array|null [domain ID or server UUID, sequence number, server ID/UUID] or null
+ * @param string $gtid
+ * @return array|null [domain, integer position] or null
*/
- protected static function parseGTID( $id ) {
+ protected static function parseGTID( $gtid ) {
$m = [];
- if ( preg_match( '!^(\d+)-(\d+)-(\d+)$!', $id, $m ) ) {
+ if ( preg_match( '!^(\d+)-\d+-(\d+)$!', $gtid, $m ) ) {
// MariaDB style: <domain>-<server id>-<sequence number>
- return [ (int)$m[1], (int)$m[3], (int)$m[2] ];
- } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(?:\d+-|)(\d+)$!', $id, $m ) ) {
- // MySQL style: <server UUID>:<sequence number>-<sequence number>
- // Normally, the first number should reflect the point (gtid_purged) where older
- // binary logs where purged to save space. When doing comparisons, it may as well
- // be 1 in that case. Assume that this is generally the situation.
- return [ $m[1], (int)$m[2], $m[1] ];
+ return [ (int)$m[1], (int)$m[2] ];
+ } elseif ( preg_match( '!^(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}):(\d+)$!', $gtid, $m ) ) {
+ // MySQL style: <UUID domain>:<sequence number>
+ return [ $m[1], (int)$m[2] ];
}
return null;
/**
* @see https://dev.mysql.com/doc/refman/5.7/en/show-master-status.html
* @see https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html
- * @return array|bool Map of (binlog:<string>, pos:(<integer>, <integer>)) or false
+ * @return array|bool (binlog, (integer file number, integer position)) or false
*/
protected function getBinlogCoordinates() {
- return ( $this->binLog !== null && $this->logPos !== null )
- ? [ 'binlog' => $this->binLog, 'pos' => $this->logPos ]
+ return ( $this->binlog !== null && $this->pos !== null )
+ ? [ 'binlog' => $this->binlog, 'pos' => $this->pos ]
: false;
}
$this->init( $data['position'], $data['asOfTime'] );
}
-
- /**
- * @return string GTID set or <binary log file>/<position> (e.g db1034-bin.000976/843431247)
- */
- public function __toString() {
- return $this->gtids
- ? implode( ',', $this->gtids )
- : $this->getLogFile() . "/{$this->logPos[self::CORD_EVENT]}";
- }
}
$opts += [
'domain' => false,
'cluster' => false,
- 'timeout' => 60,
+ 'timeout' => $this->cliMode ? 60 : 10,
'ifWritesSince' => null
];
}
$conn = $this->parent->getAnyOpenConnection( $i );
- if ( $conn ) {
+ if ( $conn && !$conn->trxLevel() ) {
+ # Handles with open transactions are avoided since they might be subject
+ # to REPEATABLE-READ snapshots, which could affect the lag estimate query.
$close = false; // already open
} else {
$conn = $this->parent->openConnection( $i, '' );
// Log the autopatrol if the log entry is patrollable
if ( $this->getIsPatrollable() &&
- $rc->getAttribute( 'rc_patrolled' ) === 1
+ $rc->getAttribute( 'rc_patrolled' ) === 2
) {
PatrolLog::record( $rc, true, $this->getPerformer() );
}
use Wikimedia\Assert\Assert;
use Wikimedia\Rdbms\FakeResultWrapper;
use Wikimedia\Rdbms\IDatabase;
-use Wikimedia\Rdbms\DBError;
use Wikimedia\Rdbms\DBUnexpectedError;
/**
return;
}
- Hooks::run( 'PageViewUpdates', [ $this, $user ] );
- // Update newtalk / watchlist notification status
- try {
- $user->clearNotification( $this->mTitle, $oldid );
- } catch ( DBError $e ) {
- // Avoid outage if the master is not reachable
- MWExceptionHandler::logException( $e );
- }
+ // Update newtalk / watchlist notification status;
+ // Avoid outage if the master is not reachable by using a deferred updated
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $user, $oldid ) {
+ Hooks::run( 'PageViewUpdates', [ $this, $user ] );
+
+ $user->clearNotification( $this->mTitle, $oldid );
+ },
+ DeferredUpdates::PRESEND
+ );
}
/**
// Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
// Mark as patrolled if the user can do so
- $patrolled = $wgUseRCPatrol && !count(
+ $autopatrolled = $wgUseRCPatrol && !count(
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
// Add RC row to the DB
RecentChange::notifyEdit(
$oldContent ? $oldContent->getSize() : 0,
$newsize,
$revisionId,
- $patrolled,
+ $autopatrolled ? RecentChange::PRC_AUTOPATROLLED :
+ RecentChange::PRC_UNPATROLLED,
$tags
);
}
$target->getId(),
$guser,
null,
- $tags,
- $current->getId()
+ $tags
);
// Set patrolling and bot flag on the edits, which gets rollbacked.
public function doHeadings( $text ) {
for ( $i = 6; $i >= 1; --$i ) {
$h = str_repeat( '=', $i );
- $text = preg_replace( "/^$h(.+)$h\\s*$/m", "<h$i>\\1</h$i>", $text );
+ // Trim non-newline whitespace from headings
+ // Using \s* will break for: "==\n===\n" and parse as <h2>=</h2>
+ $text = preg_replace( "/^(?:$h)[ \\t]*(.+?)[ \\t]*(?:$h)\\s*$/m", "<h$i>\\1</h$i>", $text );
}
return $text;
}
# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
- # This regexp also trims whitespace in the heading's content
+ # NOTE: white space in headings have been trimmed in doHeadings. They shouldn't
+ # be trimmed here since whitespace in HTML headings is significant.
$matches = [];
$numMatches = preg_match_all(
- '/<H(?P<level>[1-6])(?P<attrib>.*?>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
+ '/<H(?P<level>[1-6])(?P<attrib>.*?>)(?P<header>[\s\S]*?)<\/H[1-6] *>/i',
$text,
$matches
);
'section' => 'watchlist/advancedwatchlist',
'label-message' => 'tog-watchlisthideliu',
];
- $defaultPreferences['watchlistreloadautomatically'] = [
- 'type' => 'toggle',
- 'section' => 'watchlist/advancedwatchlist',
- 'label-message' => 'tog-watchlistreloadautomatically',
- ];
+
+ if ( !\SpecialWatchlist::checkStructuredFilterUiEnabled(
+ $this->config,
+ $user
+ ) ) {
+ $defaultPreferences['watchlistreloadautomatically'] = [
+ 'type' => 'toggle',
+ 'section' => 'watchlist/advancedwatchlist',
+ 'label-message' => 'tog-watchlistreloadautomatically',
+ ];
+ }
+
$defaultPreferences['watchlistunwatchlinks'] = [
'type' => 'toggle',
'section' => 'watchlist/advancedwatchlist',
+++ /dev/null
-<?php
-/**
- * Function scope profiling assistant
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Profiler
- */
-
-/**
- * Class for handling function-scope profiling
- *
- * @since 1.22
- * @deprecated since 1.25 No-op now
- */
-class ProfileSection {
- /**
- * Begin profiling of a function and return an object that ends profiling
- * of the function when that object leaves scope. As long as the object is
- * not specifically linked to other objects, it will fall out of scope at
- * the same moment that the function to be profiled terminates.
- *
- * This is typically called like:
- * @code $section = new ProfileSection( __METHOD__ ); @endcode
- *
- * @param string $name Name of the function to profile
- */
- public function __construct( $name ) {
- wfDeprecated( __CLASS__, '1.25' );
- }
-}
}
public function log( array $stats ) {
- $pfhost = $this->perHost ? wfHostname() : '';
-
try {
$dbw = wfGetDB( DB_MASTER );
- $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster
- if ( $useTrx ) {
- $dbw->startAtomic( __METHOD__ );
- }
- foreach ( $stats as $data ) {
- $name = $data['name'];
- $eventCount = $data['calls'];
- $timeSum = (float)$data['real'];
- $memorySum = (float)$data['memory'];
- $name = substr( $name, 0, 255 );
+ } catch ( DBError $e ) {
+ return; // ignore
+ }
+
+ $fname = __METHOD__;
+ $dbw->onTransactionIdle( function () use ( $stats, $dbw, $fname ) {
+ $pfhost = $this->perHost ? wfHostname() : '';
+ // Sqlite: avoid excess b-tree rebuilds (mostly for non-WAL mode)
+ // non-Sqlite: lower contention with small transactions
+ $useTrx = ( $dbw->getType() === 'sqlite' );
- // Kludge
- $timeSum = $timeSum >= 0 ? $timeSum : 0;
- $memorySum = $memorySum >= 0 ? $memorySum : 0;
+ try {
+ $useTrx ? $dbw->startAtomic( $fname ) : null;
- $dbw->upsert( 'profiling',
- [
- 'pf_name' => $name,
- 'pf_count' => $eventCount,
- 'pf_time' => $timeSum,
- 'pf_memory' => $memorySum,
- 'pf_server' => $pfhost
- ],
- [ [ 'pf_name', 'pf_server' ] ],
- [
- "pf_count=pf_count+{$eventCount}",
- "pf_time=pf_time+{$timeSum}",
- "pf_memory=pf_memory+{$memorySum}",
- ],
- __METHOD__
- );
+ foreach ( $stats as $data ) {
+ $name = $data['name'];
+ $eventCount = $data['calls'];
+ $timeSum = (float)$data['real'];
+ $memorySum = (float)$data['memory'];
+ $name = substr( $name, 0, 255 );
+
+ // Kludge
+ $timeSum = $timeSum >= 0 ? $timeSum : 0;
+ $memorySum = $memorySum >= 0 ? $memorySum : 0;
+
+ $dbw->upsert( 'profiling',
+ [
+ 'pf_name' => $name,
+ 'pf_count' => $eventCount,
+ 'pf_time' => $timeSum,
+ 'pf_memory' => $memorySum,
+ 'pf_server' => $pfhost
+ ],
+ [ [ 'pf_name', 'pf_server' ] ],
+ [
+ "pf_count=pf_count+{$eventCount}",
+ "pf_time=pf_time+{$timeSum}",
+ "pf_memory=pf_memory+{$memorySum}",
+ ],
+ $fname
+ );
+ }
+ } catch ( DBError $e ) {
+ // ignore
}
- if ( $useTrx ) {
- $dbw->endAtomic( __METHOD__ );
+
+ try {
+ $useTrx ? $dbw->endAtomic( $fname ) : null;
+ } catch ( DBError $e ) {
+ // ignore
}
- } catch ( DBError $e ) {
- }
+ } );
}
}
/** @var ResourceLoader */
private $resourceLoader;
- /** @var string|null */
- private $target;
+ /** @var array */
+ private $options;
/** @var array */
private $config = [];
/**
* @param ResourceLoaderContext $context
- * @param string|null $target [optional] Custom 'target' parameter for the startup module
+ * @param array $options [optional] Array of options
+ * - 'target': Custom parameter passed to StartupModule.
*/
- public function __construct( ResourceLoaderContext $context, $target = null ) {
+ public function __construct( ResourceLoaderContext $context, array $options = [] ) {
$this->context = $context;
$this->resourceLoader = $context->getResourceLoader();
- $this->target = $target;
+ $this->options = $options;
}
/**
}
// Async scripts. Once the startup is loaded, inline RLQ scripts will run.
- // Pass-through a custom target from OutputPage (T143066).
- $startupQuery = $this->target ? [ 'target' => $this->target ] : [];
+ // Pass-through a custom 'target' from OutputPage (T143066).
+ $startupQuery = isset( $this->options['target'] )
+ ? [ 'target' => (string)$this->options['target'] ]
+ : [];
$chunks[] = $this->getLoad(
'startup',
ResourceLoaderModule::TYPE_SCRIPTS,
$this->request = $request;
$this->logger = $resourceLoader->getLogger();
- // Future developers: Avoid use of getVal() in this class, which performs
- // expensive UTF normalisation by default. Use getRawVal() instead.
- // Values here are either one of a finite number of internal IDs,
- // or previously-stored user input (e.g. titles, user names) that were passed
- // to this endpoint by ResourceLoader itself from the canonical value.
- // Values do not come directly from user input and need not match.
+ // Future developers: Use WebRequest::getRawVal() instead getVal().
+ // The getVal() method performs slow Language+UTF logic. (f303bb9360)
// List of modules
$modules = $request->getRawVal( 'modules' );
<?php
/**
- * Module for ResourceLoader initialization.
- *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* @author Roan Kattouw
*/
+/**
+ * Module for ResourceLoader initialization.
+ *
+ * See also <https://www.mediawiki.org/wiki/ResourceLoader/Features#Startup_Module>
+ *
+ * The startup module, as being called only from ResourceLoaderClientHtml, has
+ * the ability to vary based extra query parameters, in addition to those
+ * from ResourceLoaderContext:
+ *
+ * - target: Only register modules in the client allowed within this target.
+ * Default: "desktop".
+ * See also: OutputPage::setTarget(), ResourceLoaderModule::getTargets().
+ */
class ResourceLoaderStartUpModule extends ResourceLoaderModule {
// Cache for getConfigSettings() as it's called by multiple methods
*/
public function getModuleRegistrations( ResourceLoaderContext $context ) {
$resourceLoader = $context->getResourceLoader();
- $target = $context->getRequest()->getVal( 'target', 'desktop' );
+ // Future developers: Use WebRequest::getRawVal() instead getVal().
+ // The getVal() method performs slow Language+UTF logic. (f303bb9360)
+ $target = $context->getRequest()->getRawVal( 'target', 'desktop' );
// Bypass target filter if this request is Special:JavaScriptTest.
// To prevent misuse in production, this is only allowed if testing is enabled server-side.
$byPassTargetFilter = $this->getConfig()->get( 'EnableJavaScriptTest' ) && $target === 'test';
}
if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) {
$toolbox['permalink'] = $this->data['nav_urls']['permalink'];
- if ( $toolbox['permalink']['href'] === '' ) {
- unset( $toolbox['permalink']['href'] );
- $toolbox['ispermalink']['tooltiponly'] = true;
- $toolbox['ispermalink']['id'] = 't-ispermalink';
- $toolbox['ispermalink']['msg'] = 'permalink';
- } else {
- $toolbox['permalink']['id'] = 't-permalink';
- }
+ $toolbox['permalink']['id'] = 't-permalink';
}
if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
$toolbox['info'] = $this->data['nav_urls']['info'];
return array_keys( self::getPageList() );
}
- /**
- * Get the special page list as an array
- *
- * @deprecated since 1.24, use getNames() instead.
- * @return array
- */
- public static function getList() {
- wfDeprecated( __FUNCTION__, '1.24' );
- return self::getPageList();
- }
-
/**
* Get the special page list as an array
*
];
$on['rd_namespace'] = $target->getNamespace();
// Inner LIMIT is 2X in case of stale backlinks with wrong namespaces
- $subQuery = $dbr->selectSQLText(
+ $subQuery = $dbr->buildSelectSubquery(
[ $table, 'redirect', 'page' ],
[ $fromCol, 'rd_from' ],
$conds[$table],
]
);
return $dbr->select(
- [ 'page', 'temp_backlink_range' => "($subQuery)" ],
+ [ 'page', 'temp_backlink_range' => $subQuery ],
[ 'page_id', 'page_namespace', 'page_title', 'rd_from', 'page_is_redirect' ],
[],
__CLASS__ . '::showIndirectLinks',
'editmyoptions',
'editmyprivateinfo',
'editmyusercss',
+ 'editmyuserjson',
'editmyuserjs',
'editmywatchlist',
'editsemiprotected',
'editusercss',
+ 'edituserjson',
'edituserjs',
'hideuser',
'import',
return;
}
- $dbw = wfGetDB( DB_MASTER );
- $asOfTimes = array_unique( $dbw->selectFieldValues(
- 'watchlist',
- 'wl_notificationtimestamp',
- [ 'wl_user' => $id, 'wl_notificationtimestamp IS NOT NULL' ],
- __METHOD__,
- [ 'ORDER BY' => 'wl_notificationtimestamp DESC', 'LIMIT' => 500 ]
- ) );
- if ( !$asOfTimes ) {
- return;
- }
- // Immediately update the most recent touched rows, which hopefully covers what
- // the user sees on the watchlist page before pressing "mark all pages visited"....
- $dbw->update(
- 'watchlist',
- [ 'wl_notificationtimestamp' => null ],
- [ 'wl_user' => $id, 'wl_notificationtimestamp' => $asOfTimes ],
- __METHOD__
- );
- // ...and finish the older ones in a post-send update with lag checks...
- DeferredUpdates::addUpdate( new AutoCommitUpdate(
- $dbw,
- __METHOD__,
- function () use ( $dbw, $id ) {
- global $wgUpdateRowsPerQuery;
-
- $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
- $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
- $asOfTimes = array_unique( $dbw->selectFieldValues(
- 'watchlist',
- 'wl_notificationtimestamp',
- [ 'wl_user' => $id, 'wl_notificationtimestamp IS NOT NULL' ],
- __METHOD__
- ) );
- foreach ( array_chunk( $asOfTimes, $wgUpdateRowsPerQuery ) as $asOfTimeBatch ) {
- $dbw->update(
- 'watchlist',
- [ 'wl_notificationtimestamp' => null ],
- [ 'wl_user' => $id, 'wl_notificationtimestamp' => $asOfTimeBatch ],
- __METHOD__
- );
- $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
- }
- }
- ) );
+ $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
+ $watchedItemStore->resetAllNotificationTimestampsForUser( $this );
+
// We also need to clear here the "you have new message" notification for the own
// user_talk page; it's cleared one page view later in WikiPage::doViewUpdates().
}
throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
}
+ public function resetAllNotificationTimestampsForUser( User $user ) {
+ throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
+ }
+
public function resetNotificationTimestamp(
User $user,
Title $title,
const INCLUDE_USER_ID = 'userid';
const INCLUDE_COMMENT = 'comment';
const INCLUDE_PATROL_INFO = 'patrol';
+ const INCLUDE_AUTOPATROL_INFO = 'autopatrol';
const INCLUDE_SIZES = 'sizes';
const INCLUDE_LOG_INFO = 'loginfo';
const INCLUDE_TAGS = 'tags';
const FILTER_NOT_ANON = '!anon';
const FILTER_PATROLLED = 'patrolled';
const FILTER_NOT_PATROLLED = '!patrolled';
+ const FILTER_AUTOPATROLLED = 'autopatrolled';
+ const FILTER_NOT_AUTOPATROLLED = '!autopatrolled';
const FILTER_UNREAD = 'unread';
const FILTER_NOT_UNREAD = '!unread';
const FILTER_CHANGED = 'changed';
} elseif ( in_array( self::FILTER_NOT_PATROLLED, $options['filters'] ) ) {
$conds[] = 'rc_patrolled = 0';
}
+
+ if ( in_array( self::FILTER_AUTOPATROLLED, $options['filters'] ) ) {
+ $conds[] = 'rc_patrolled = 2';
+ } elseif ( in_array( self::FILTER_NOT_AUTOPATROLLED, $options['filters'] ) ) {
+ $conds[] = 'rc_patrolled != 2';
+ }
}
if ( in_array( self::FILTER_UNREAD, $options['filters'] ) ) {
* @since 1.27
* @param User $user
* @param LinkTarget $target
- * @return bool
+ * @return WatchedItem|bool
*/
public function loadWatchedItem( User $user, LinkTarget $target ) {
// Only loggedin user can have a watchlist
return $success;
}
+ public function resetAllNotificationTimestampsForUser( User $user ) {
+ // Only loggedin user can have a watchlist
+ if ( $user->isAnon() ) {
+ return;
+ }
+
+ // If the page is watched by the user (or may be watched), update the timestamp
+ $job = new ClearWatchlistNotificationsJob(
+ $user->getUserPage(),
+ [ 'userId' => $user->getId(), 'casTime' => time() ]
+ );
+
+ // Try to run this post-send
+ // Calls DeferredUpdates::addCallableUpdate in normal operation
+ call_user_func(
+ $this->deferredUpdatesAddCallableUpdateCallback,
+ function () use ( $job ) {
+ $job->run();
+ }
+ );
+ }
+
/**
* @since 1.27
* @param User $editor
* @param LinkTarget $target
* @param string|int $timestamp
- * @return int
+ * @return int[]
*/
public function updateNotificationTimestamp( User $editor, LinkTarget $target, $timestamp ) {
$dbw = $this->getConnectionRef( DB_MASTER );
/**
* @since 1.31
*
- * @param User $user The user to set the timestamp for
+ * @param User $user The user to set the timestamps for
* @param string|null $timestamp Set the update timestamp to this value
* @param LinkTarget[] $targets List of targets to update. Default to all targets
*
array $targets = []
);
+ /**
+ * Reset all watchlist notificaton timestamps for a user using the job queue
+ *
+ * @since 1.31
+ *
+ * @param User $user The user to reset the timestamps for
+ */
+ public function resetAllNotificationTimestampsForUser( User $user );
+
/**
* @since 1.31
*
* @param int $oldid The revision id being viewed. If not given or 0, latest revision is
* assumed.
*
- * @return bool success
+ * @return bool success Whether a job was enqueued
*/
public function resetNotificationTimestamp( User $user, Title $title, $force = '', $oldid = 0 );
}
// check for roman numbers like VII, XIX...
- $roman = '/^M{0,3}(C[DM]|D{0,1}C{0,3})(X[LC]|L{0,1}X{0,3})(I[VX]|V{0,1}I{0,3})$/u';
+ // Lookahead assertion ensures $roman doesn't match the empty string
+ $roman = '/^(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})$/u';
# match any sub-string of the relevant letters and convert it
$matches = preg_split( '/(\b|^)[^' . $letters . ']+(\b|$)/u',
// Only process words composed of standard English alphabet, leave the rest unchanged.
// This skips some English words like 'naïve' or 'résumé', but we can live with that.
// Ignore single letters and words which aren't lowercase or uppercase-first.
- return preg_replace_callback( '/[A-Za-z][a-z]+/', function ( $matches ) {
+ return preg_replace_callback( '/[A-Za-z][a-z\']+/', function ( $matches ) {
$word = $matches[0];
if ( preg_match( '/^[aeiou]/i', $word ) ) {
return $word . 'way';
} else {
- return preg_replace_callback( '/^(qu|[^aeiou][^aeiouy]*)(.*)$/i', function ( $m ) {
+ return preg_replace_callback( '/^(s?qu|[^aeiou][^aeiouy]*)(.*)$/i', function ( $m ) {
$ucfirst = strtoupper( $m[1][0] ) === $m[1][0];
if ( $ucfirst ) {
return ucfirst( $m[2] ) . lcfirst( $m[1] ) . 'ay';
/* From Kazakh interface, maybe we need it later
$breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
- $roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
+ // Lookahead assertion ensures $roman doesn't match the empty string
+ $roman = '(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
$roman = '';
$reg = '/^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks.'/';
$breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
- $roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
+ // Lookahead assertion ensures $roman doesn't match the empty string
+ $roman = '(?=[MDCLXVI])M{0,4}(C[DM]|D?C{0,3})(X[LC]|L?X{0,3})(I[VX]|V?I{0,3})';
$reg = '/^' . $roman . '$|^' . $roman . $breaks . '|' . $breaks
. $roman . '$|' . $breaks . $roman . $breaks . '/';
'ks-arab' => 'کٲشُر', # Kashmiri (Perso-Arabic script)
'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
'ksh' => 'Ripoarisch', # Ripuarian
- 'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
- 'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
+ 'ku' => 'kurdî', # Kurdish (multiple scripts - defaults to Latin)
+ 'ku-latn' => "kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F", # Northern Kurdish (Arabic script) (falls back to ckb)
'kum' => 'къумукъ', # Kumyk (Cyrillic, 'kum-latn' for Latin script)
'kv' => 'коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
"recentchanges-legend-heading": "<strong>ব্যাখ্যা:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
"recentchanges-legend-plusminus": "(''±১২৩'')",
+ "rcfilters-legend-heading": "<strong>সংক্ষিপ্ত ৰূপৰ তালিকা:</strong>",
+ "rcfilters-other-review-tools": "আন পুনৰীক্ষণ সঁজুলি",
"rcnotefrom": "<strong>$2</strong>ৰ পৰা হোৱা পৰিৱৰ্তনসমূহ (সৰ্বোচ্চ <strong>$1টা</strong> দেখুৱা হৈছে)।",
"rclistfrom": "$3 $2ৰ পৰা নতুন সালসলনি দেখুৱাওক",
"rcshowhideminor": "$1 -সংখ্যক নগণ্য সম্পাদনা",
"cascadeprotected": "Esta páxina ta protexida d'ediciones porque ta trescluída {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:\n$2",
"namespaceprotected": "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
"customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
+ "customjsonprotected": "Nun tienes permisu pa editar esta páxina JSON porque contien preferencies personales d'otru usuariu.",
"customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
"mycustomcssprotected": "Nun tien permisu pa editar esta páxina CSS.",
+ "mycustomjsonprotected": "Nun tien permisu pa editar esta páxina JSON.",
"mycustomjsprotected": "Nun tien permisu pa editar esta páxina JavaScript.",
"myprivateinfoprotected": "Nun tien permisu pa editar la so información privada.",
"mypreferencesprotected": "Nun tien permisu pa editar les sos preferencies.",
"wrongpasswordempty": "La contraseña taba en blanco.\nVuelvi a intentalo.",
"passwordtooshort": "Les contraseñes han de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
"passwordtoolong": "Les contraseñes nun puen ser mayores de {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
- "passwordtoopopular": "Les contraseñes más escoyíes de vezu nun pueden usase. Escueye una contraseña más única.",
+ "passwordtoopopular": "Les contraseñes más escoyíes de vezu nun pueden usase. Escueye una contraseña más difícil d'aldovinar.",
"password-name-match": "La contraseña tien de ser distinta del nome d'usuariu.",
"password-login-forbidden": "Ta torgao usar esti nome d'usuariu y contraseña.",
"mailmypassword": "Reaniciar contraseña",
"savechanges": "Guardar los cambios",
"publishpage": "Publicar la páxina",
"publishchanges": "Publicar los cambios",
+ "savearticle-start": "Guardar la páxina...",
+ "savechanges-start": "Guardar los cambios...",
+ "publishpage-start": "Publicar la páxina...",
+ "publishchanges-start": "Publicar los cambios...",
"preview": "Vista previa",
"showpreview": "Amosar previsualización",
"showdiff": "Amosar cambeos",
"blocked-notice-logextract": "Anguaño esti usuariu ta bloquiáu.\nMás abaxo ufrese la entrada del rexistru de bloqueos pa referencia:",
"clearyourcache": "'''Nota:''' Llueu de guardar, seique tengas que llimpiar la caché del restolador pa ver los cambeos.\n*'''Firefox / Safari:''' Caltén ''Mayús'' mentes calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nun Mac)\n* '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nun Mac)\n* '''Internet Explorer:''' Caltén ''Ctrl'' mentes calques ''Refrescar'', o calca ''Ctrl-F5''\n* '''Opera:''' Entra'n Menú → Preferencies'' (''Opera → Preferencies'' nun Mac) y d'ehí en ''Intimidá y seguridá → Llimpiar datos de navegación → Imáxenes y ficheros en caché''.",
"usercssyoucanpreview": "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el CSS nuevu enantes de guardalu.",
+ "userjsonyoucanpreview": "<strong>Conseyu:</strong> Usa'l botón \"{{int:showpreview}}\" pa probar el JSON nuevu enantes de guardalu.",
"userjsyoucanpreview": "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el JavaScript nuevu enantes de guardalu.",
"usercsspreview": "'''Recuerda que namái ye la vista previa del CSS d'usuariu.'''\n'''¡Inda nun ta guardáu!'''",
+ "userjsonpreview": "<strong>Recuerda que namái ye la prueba/vista previa de la configuración JSON d'usuariu.\n¡Inda nun ta guardada!</strong>",
"userjspreview": "'''Recuerda que namái ye la prueba/vista previa del JavaScript d'usuariu.'''\n'''¡Inda nun ta guardáu!'''",
"sitecsspreview": "'''Recuerda que namái tas previsualizando esti CSS.'''\n'''¡Tovía nun ta guardáu!'''",
+ "sitejsonpreview": "<strong>Recuerda que namái tas previsualizando esta configuración JSON.\n'''¡Tovía nun se guardó!'''",
"sitejspreview": "'''Recuerda que namái tas probando esti códigu JavaScript.'''\n'''¡Inda nun tá guardáu!'''",
- "userinvalidconfigtitle": "'''Avisu:''' Nun esiste'l tema «$1».\nLes páxines personalizaes de .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css y non {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Avisu:</strong> Nun esiste'l tema «$1».\nLes páxines personalizaes de .css, .json y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css y non {{ns:user}}:Foo/Vector.css.",
"updated": "(Anovao)",
"note": "'''Nota:'''",
"previewnote": "'''Alcuerdate de qu'esto ye sólo una vista previa.'''\n¡Los cambios entá nun se guardaron!",
"default": "predetermináu",
"prefs-files": "Ficheros",
"prefs-custom-css": "CSS personalizáu",
+ "prefs-custom-json": "JSON personalizáu",
"prefs-custom-js": "JavaScript personalizáu",
- "prefs-common-config": "CSS/JavaScript compartíu pa toles pieles:",
+ "prefs-common-config": "CSS/JSON/JavaScript compartíu pa toles pieles:",
"prefs-reset-intro": "Pues usar esta páxina pa reaniciar les preferencies a los valores predeterminaos del sitiu.\nEsto nun se pue desfacer.",
"prefs-emailconfirm-label": "Confirmación del corréu:",
"youremail": "Corréu electrónicu:",
"right-editcontentmodel": "Editar el modelu de conteníu d'una páxina",
"right-editinterface": "Editar la interfaz d'usuariu",
"right-editusercss": "Editar los ficheros CSS d'otros usuarios",
+ "right-edituserjson": "Editar los ficheros JSON d'otros usuarios",
"right-edituserjs": "Editar los ficheros JavaScript d'otros usuarios",
"right-editmyusercss": "Editar los propios ficheros CSS d'usuariu",
+ "right-editmyuserjson": "Editar los ficheros JSON d'usuariu propios",
"right-editmyuserjs": "Editar los propios ficheros JavaScript d'usuariu",
"right-viewmywatchlist": "Ver la llista de vixilancia propia",
"right-editmywatchlist": "Editar la llista de vixilancia propia. Tenga en cuenta que dalgunes aiciones amestarán páxines igual, inda ensin esti permisu.",
"grant-createaccount": "Crear cuentes",
"grant-createeditmovepage": "Crear, editar y mover páxines",
"grant-delete": "Desaniciar páxines, revisiones y entraes del rexistru",
- "grant-editinterface": "Editar l'espaciu de nomes MediaWiki y los CSS/JavaScript d'usuariu",
- "grant-editmycssjs": "Editar los CSS/JavaScript d'usuariu propios",
+ "grant-editinterface": "Editar l'espaciu de nomes MediaWiki y los CSS/JSON/JavaScript d'usuariu",
+ "grant-editmycssjs": "Editar los CSS/JSON/JavaScript d'usuariu propios",
"grant-editmyoptions": "Editar les preferencies d'usuariu propies",
"grant-editmywatchlist": "Editar la llista de vixilancia propia",
"grant-editpage": "Editar páxines esistentes",
"group-bot.css": "/* Los CSS allugaos equí afeutarán a los bots namái */",
"group-sysop.css": "/* Los CSS allugaos equí afeutarán a los sysops namái */",
"group-bureaucrat.css": "/* Los CSS allugaos equí afeutarán a los burócrates namái */",
+ "common.json": "/* Cualquier JavaScript que tea equí cargaráse pa tolos usuarios en cada carga de páxina. */",
"common.js": "/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */",
"group-autoconfirmed.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */",
"group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
"unlinkaccounts-success": "Desenllazóse la cuenta.",
"authenticationdatachange-ignored": "Nun se xestionó'l cambéu de los datos d'autentificacion. ¿Seique, nun se configuró un fornidor?",
"userjsispublic": "Atención: les subpáxines JavaScript nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
+ "userjsonispublic": "Recuerda: les subpáxines JSON nun tendríen de contener datos acutaos porque pueden veles otros usuarios.",
"usercssispublic": "Atención: les subpáxines CSS nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
"restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
"restrictionsfield-label": "Rangos d'IP permitíos:",
"cascadeprotected": "Гэтая старонка абароненая ад рэдагаваньня, таму што яна ўключаная ў {{PLURAL:$1|1=наступную старонку, якая была абароненая|наступныя старонкі, якія былі абароненыя}} з актывізаванай опцыяй «каскаднай абароны»:\n$2",
"namespaceprotected": "Вы ня маеце правоў на рэдагаваньне старонак у прасторы назваў <strong>$1</strong>.",
"customcssprotected": "Вы ня маеце правоў на рэдагаваньне гэтай CSS-старонкі, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
+ "customjsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
"customjsprotected": "Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.",
"mycustomcssprotected": "Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.",
+ "mycustomjsonprotected": "Вы ня маеце дазволу на рэдагаваньне гэтай JSON-старонкі.",
"mycustomjsprotected": "Вы ня маеце дазволу рэдагаваць гэтую JavaScript-старонку.",
"myprivateinfoprotected": "Вы ня маеце дазволу на зьмяненьне ўласных прыватных зьвестак.",
"mypreferencesprotected": "Вы ня маеце дазволу на зьмяненьне сваіх наладаў.",
"userjspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд Вашага JavaScript. Ён яшчэ не запісаны!</strong>",
"sitecsspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд гэтага CSS.\nЁн яшчэ не захаваны!</strong>",
"sitejspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд гэтага коду JavaScript.\nЁн яшчэ не захаваны!</strong>",
- "userinvalidconfigtitle": "<strong>Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне:</strong> нÑ\8fма Ñ\82Ñ\8dмÑ\8b аÑ\84аÑ\80мленÑ\8cнÑ\8f «$1».\nÐ\9fамÑ\8fÑ\82айÑ\86е, Ñ\88Ñ\82о Ñ\9eлаÑ\81нÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 .css і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Ð\9fапÑ\8fÑ\80Ñ\8dджанÑ\8cне:</strong> нÑ\8fма Ñ\82Ñ\8dмÑ\8b аÑ\84аÑ\80мленÑ\8cнÑ\8f «$1».\nУлаÑ\81нÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 .css, .json і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
"updated": "(Абноўлена)",
"note": "<strong>Заўвага:</strong>",
"previewnote": "<strong>Гэта толькі папярэдні прагляд.</strong>\nВашыя зьмены яшчэ не былі захаваныя!",
"prefs-files": "Файлы",
"prefs-custom-css": "Уласны CSS",
"prefs-custom-js": "Уласны JavaScript",
- "prefs-common-config": "Агульны CSS/JavaScript для ўсіх тэмаў афармленьня:",
+ "prefs-common-config": "Агульны CSS/JSON/JavaScript для ўсіх тэмаў афармленьня:",
"prefs-reset-intro": "Вы можаце выкарыстаць гэтую старонку для замены вашых наладаў на налады сайту па змоўчаньні.\nГэтае дзеяньне ня можа быць адмененае.",
"prefs-emailconfirm-label": "Пацьверджаньне адрасу электроннай пошты:",
"youremail": "Адрас электроннай пошты:",
"right-autopatrol": "Аўтаматычнае пазначэньне рэдагаваньняў як «патруляваных»",
"right-patrolmarks": "Прагляд пазначэньняў пра патруляваньне ў апошніх зьменах",
"right-unwatchedpages": "Прагляд сьпісу старонак, за якімі ніхто не назірае",
- "right-mergehistory": "аб’яднаньне гісторыі старонак",
- "right-userrights": "рэдагаваньне правоў усіх удзельнікаў",
- "right-userrights-interwiki": "рэдагаваньне правоў удзельнікаў у іншых вікі",
+ "right-mergehistory": "Ð\90б’яднаньне гісторыі старонак",
+ "right-userrights": "Рэдагаваньне ўсіх правоў удзельнікаў",
+ "right-userrights-interwiki": "Рэдагаваньне правоў удзельнікаў у іншых вікі",
"right-siteadmin": "блякаваньне і разблякаваньне базы зьвестак",
- "right-override-export-depth": "экспартаваньне старонак, уключаючы зьвязаныя старонкі з глыбінёй да 5",
- "right-sendemail": "адпраўка электронных лістоў іншым удзельнікам",
+ "right-override-export-depth": "Экспартаваньне старонак, у тым ліку зьвязаных старонак з глыбінёй да 5",
+ "right-sendemail": "Ð\90дпраўка электронных лістоў іншым удзельнікам",
"right-managechangetags": "стварэньне і (дэ)актывацыя [[Special:Tags|метак]]",
"right-applychangetags": "дадаваць [[Special:Tags|меткі]] пры рэдагаваньні",
"right-changetags": "дадаваць і выдаляць адвольныя [[Special:Tags|меткі]] да асобных вэрсіяў і запісаў у журнале падзеяў",
"grant-group-private-information": "Доступ да прыватных зьвестак пра вас",
"grant-group-other": "Розная актыўнасьць",
"grant-blockusers": "Блякаваньне і разблякаваньне ўдзельнікаў",
- "grant-createaccount": "СÑ\82ваÑ\80Ñ\8bÑ\86Ñ\8c Ñ\80аÑ\85Ñ\83нкÑ\96",
- "grant-createeditmovepage": "Ствараць, рэдагаваць і пераносіць старонкі",
+ "grant-createaccount": "СÑ\82ваÑ\80Ñ\8dнÑ\8cне Ñ\80аÑ\85Ñ\83нкаÑ\9e",
+ "grant-createeditmovepage": "Стварэньне, рэдагаваньне і перанос старонак",
"grant-delete": "Выдаляць старонкі, вэрсіі і запісы журналу",
"grant-editinterface": "Рэдагаваць прасторы назваў МэдыяВікі і CSS/JavaScript удзельніка",
"grant-editmycssjs": "Рэдагаваць Ваш CSS/JavaScript",
"cascadeprotected": "এই পাতাটিকে সম্পাদনা করা থেকে সুরক্ষিত করা হয়েছে, কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যেটি|যেগুলি}} \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
"namespaceprotected": "<strong>$1</strong> নামস্থানের কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
"customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
+ "customjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এই পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
"customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
"mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
+ "mycustomjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই।",
"mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
"myprivateinfoprotected": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করতে আপনার অনুমতি নেই",
"mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
"wrongpasswordempty": "পাসওয়ার্ড প্রবেশের ঘরটি খালি ছিল। দয়া করে আবার চেষ্টা করুন।",
"passwordtooshort": "পাসওয়ার্ড কমপক্ষে {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে।",
"passwordtoolong": "পাসওয়ার্ড {{PLURAL:$1|১|$1}} অক্ষরের চেয়ে দীর্ঘ হতে পারবে না।",
- "passwordtoopopular": "সাধারণà¦à¦¾à¦¬à§\87 নিরà§\8dবাà¦\9aিত পাসà¦\93য়ারà§\8dড বà§\8dযবহার à¦\95রা যাবà§\87 না। দয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦\85ননà§\8dয পাসà¦\93য়ারà§\8dড নিরà§\8dবাà¦\9aন à¦\95রà§\81ন।",
+ "passwordtoopopular": "সাধারণà¦à¦¾à¦¬à§\87 নিরà§\8dবাà¦\9aিত পাসà¦\93য়ারà§\8dড বà§\8dযবহার à¦\95রা যাবà§\87 না। দয়া à¦\95রà§\87 à¦\8fমন à¦\8fà¦\95à¦\9fি পাসà¦\93য়ারà§\8dড নিরà§\8dবাà¦\9aন à¦\95রà§\81ন যা à¦\85নà§\81মান à¦\95রা à¦\86রà¦\93 à¦\95ঠিন।",
"password-name-match": "আপনার পাসওয়ার্ড আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
"password-login-forbidden": "এই ব্যবহারকারীর নাম এবং পাসওয়ার্ডটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
"mailmypassword": "পাসওয়ার্ড পুনঃস্থাপন",
"savechanges": "পরিবর্তন সংরক্ষণ",
"publishpage": "পাতা প্রকাশ করুন",
"publishchanges": "পরিবর্তন প্রকাশ করুন",
+ "savearticle-start": "পাতা সংরক্ষণ করুন...",
+ "savechanges-start": "পরিবর্তন সংরক্ষণ করুন...",
+ "publishpage-start": "পাতা প্রকাশ করুন...",
+ "publishchanges-start": "পরিবর্তন প্রকাশ করুন...",
"preview": "প্রাকদর্শন",
"showpreview": "প্রাকদর্শন",
"showdiff": "পরিবর্তনসমূহ",
"blocked-notice-logextract": "এই ব্যবহারকারী বর্তমানে অবরুদ্ধ রয়েছেন।\nসূত্রের জন্য সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হল:",
"clearyourcache": "<strong>লক্ষ্য করুন:</strong> সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।\n* <strong>ফায়ারফক্স / সাফারি:</strong> <em>Shift</em> ধরে রাখা অবস্থায়<em>পুনঃলোড করুন</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> বা <em>Ctrl-R</em> (ম্যাক-এ <em>⌘-R</em>) চাপুন\n* <strong>গুগল ক্রোম:</strong> <em>Ctrl-Shift-R</em> (ম্যাক-এ <em>⌘-Shift-R</em>) চাপুন\n* <strong>ইন্টারনেট এক্সপ্লোরার:</strong> <em>Ctrl</em> ধরে রাখা অবস্থায় <em>Refresh</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> চাপুন\n* <strong>অপেরা:</strong> <em>মেনু → ব্যবস্থাপনাসমূহ</em>-এ যান (ম্যাকে <em>অপেরা → পছন্দসমূহ</em>) এবং এরপর <em>গোপনীয়তা ও সুরক্ষা → ব্রাউজিং-এর তথ্য পরিষ্কার করুন → ক্যাশে করা ছবি ও ফাইলগুলি</em>।",
"usercssyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
+ "userjsonyoucanpreview": "<strong>পরামর্শ:</strong> \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JSON পরীক্ষা করুন।",
"userjsyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
"usercsspreview": "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।\nএটা এখনও সংরক্ষণ করা হয়নি!'''",
+ "userjsonpreview": "<strong>মনে রাখুন আপনি আপনার ব্যবহারকারী JSON কেবলমাত্র পরীক্ষা/প্রাকদর্শন করছেন। এটা এখনও সংরক্ষণ করা হয়নি!</strong>",
"userjspreview": "'''মনে রাখুন আপনি আপনার ব্যবহারকারী জাভাস্ক্রিপ্ট কেবলমাত্র পরীক্ষা/প্রাকদর্শন করছেন। এটা এখনও সংরক্ষণ করা হয়নি!'''",
"sitecsspreview": "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।\nএটা এখনও সংরক্ষণ করা হয়নি!'''",
+ "sitejsonpreview": "<strong>মনে রাখুন আপনি আপনার ব্যবহারকারী JSON কেবলমাত্র প্রাকদর্শন করছেন। এটা এখনও সংরক্ষণ করা হয়নি!</strong>",
"sitejspreview": "'''মনে রাখুন আপনি আপনার ব্যবহারকারী জাভাস্ক্রিপ্ট কেবলমাত্র প্রাকদর্শন করছেন।'''\n'''এটা এখনও সংরক্ষণ করা হয়নি!'''",
- "userinvalidconfigtitle": "'''সতর্কীকরণ:''' \"$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছন্দমাফিক .css এবং .js পাতাগুলি ছোট হাতের শিরোনাম ব্যবহার করে, যেমন {{ns:user}}:Foo/vector.css; কিন্তু এরকম শিরোনাম নয়: {{ns:user}}:Foo/Vector.css",
+ "userinvalidconfigtitle": "<strong>সতর্কীকরণ:</strong> \"$1\" নামে কোন আবরণ নেই।\nমনে রাখবেন, পছন্দমাফিক .css, .json, এবং .js পাতাগুলি ছোট হাতের শিরোনাম ব্যবহার করে, যেমন {{ns:user}}:উদাহরণ/vector.css; কিন্তু এরকম শিরোনাম নয়: {{ns:user}}:উদাহরণ/Vector.css।",
"updated": "(হালনাগাদ)",
"note": "<strong>টীকা:</strong>",
"previewnote": "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''\nআপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
"copyrightwarning": "অনুগ্রহ করে লক্ষ্য করুন {{SITENAME}}-তে সমস্ত অবদান $2-এর আওতায় প্রাপ্য (বিস্তারিত $1-তে দেখুন)। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে পুনর্বিতরণ করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না।<br />\nআপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।\n'''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
"copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
"editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর রূপ পরিবর্তন করা যাবে না।",
- "longpageerror": "'''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
+ "longpageerror": "<strong>ত্রুটি: আপনার জমা দেয়া লেখার পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।</strong>\nএটি সংরক্ষণ করা সম্ভব নয়।",
"readonlywarning": "<strong>সতর্কবার্তা: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনি আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।</strong>\nআপনি চাইলে লেখাটি প্রতিলিপি করে কোন টেক্সট ফাইলে সেঁটে ভবিষ্যতের জন্য সংরক্ষণ করতে পারেন।\n\nযে সিস্টেম প্রশাসক ডাটাবেজটি অবরুদ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
"protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
"semiprotectedpagewarning": "<strong>টীকা:</strong> এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক লগের বিবরণ নিচে দেওয়া হলো:",
"default": "পূর্বনির্ধারিত",
"prefs-files": "ফাইল",
"prefs-custom-css": "স্বনির্ধারিত CSS",
+ "prefs-custom-json": "স্বনির্ধারিত JSON",
"prefs-custom-js": "স্বনির্ধারিত JS",
- "prefs-common-config": "সà¦\95ল à¦\95à§\8dষà§\87তà§\8dরà§\87র à¦\9cনà§\8dয সিà¦\8fসà¦\8fস/à¦\9cাà¦à¦¾à¦¸à§\8dà¦\95à§\8dরিপà§\8dà¦\9f",
+ "prefs-common-config": "সà¦\95ল à¦\86বরণà§\87র à¦\9cনà§\8dয à¦à¦¾à¦\97à¦\95à§\83ত CSS/JSON/à¦\9cাà¦à¦¾à¦¸à§\8dà¦\95à§\8dরিপà§\8dà¦\9f:",
"prefs-reset-intro": "আপনি এই পাতা ব্যবহার করে আপনার পছন্দসমূহকে সাইটের পূর্বপ্রদত্ত সেটিংসে পরিবর্তন করতে পারেন।\nপরিবর্তন করার পর এটা আর ফিরিয়ে আনা যাবে না।",
"prefs-emailconfirm-label": "ই-মেইল নিশ্চিতকরণ:",
"youremail": "ইমেইল *",
"grant-createeditmovepage": "পাতা তৈরি, সম্পাদনা এবং স্থানান্তর করুন",
"grant-delete": "পাতা, পুনর্বিবেচনা ও লগ ভুক্তিসমূহ মুছে ফেলুন।",
"grant-editinterface": "মিডিয়াউইকি নামস্থান এবং ব্যবহারকারীর সিএসএস/জাভাস্ক্রিপ্ট সম্পাদনা করে",
- "grant-editmycssjs": "à¦\86পনার সিà¦\8fসà¦\8fস/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
+ "grant-editmycssjs": "à¦\86পনার বà§\8dযবহারà¦\95ারà§\80 সিà¦\8fসà¦\8fস/à¦\9cà§\87à¦\8fসà¦\93à¦\8fন/জাভাস্ক্রিপ্ট সম্পাদনা করুন",
"grant-editmyoptions": "আপনার ব্যবহারকারী পছন্দসমূহ সম্পাদনা করুন",
"grant-editmywatchlist": "আপনার নজরতালিকা সম্পাদনা করুন",
"grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
"timezoneregion-indian": "Indijski okean",
"timezoneregion-pacific": "Tihi okean",
"allowemail": "Dozvoli e-poštu od ostalih korisnika",
+ "email-allow-new-users-label": "Dozvoli e-poštu od potpuno novih korisnika",
"email-blacklist-label": "Zabrani sljedećim korisnicima da mi šalju e-poštu:",
"prefs-searchoptions": "Pretraga",
"prefs-namespaces": "Imenski prostori",
"tag-mw-blank": "pražnjenje",
"tag-mw-replace": "zamijenjeno",
"tag-mw-rollback": "vraćanje",
+ "tag-mw-undo": "poništenje",
"tags-title": "Oznake",
"tags-intro": "Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.",
"tags-tag": "Naziv oznake",
"recentchangesdays-max": "(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})",
"recentchangescount": "ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:",
"prefs-help-recentchangescount": "ئەمە دوایین گۆڕانکارییەکان، مێژووی پەڕەکان و لۆگەکانیش لەبەردەگرێت.",
+ "prefs-help-watchlist-token2": "ئەمە کلیلێکی تایبەتیی پێڕستی چاودێرییەکەتە. ھەرکەسێک بیزانێت دەتوانێت پێڕستی چاودێرییەکەت ببینێت، بۆیە لای خۆت بیپارێزە.\nئەگەر پێویستی کرد، [[Special:ResetTokens|دەتوانیت بیگۆڕیت]].",
"savedprefs": "ھەڵبژاردەکانت پاشەکەوت کران",
"timezonelegend": "ناوچەی کاتی:",
"localtime": "کاتی خۆماڵی:",
"Marek Pavlica",
"Asmen",
"Meliganai",
- "Ilimanaq29"
+ "Ilimanaq29",
+ "Patriccck",
+ "Ed g2s"
]
},
"tog-underline": "Podtrhávat odkazy:",
"savechanges": "Uložit změny",
"publishpage": "Zveřejnit stránku",
"publishchanges": "Zveřejnit změny",
+ "savearticle-start": "Uložit změny…",
+ "savechanges-start": "Uložit změny…",
+ "publishpage-start": "Zveřejnit stránku…",
+ "publishchanges-start": "Zveřejnit změny…",
"preview": "Náhled",
"showpreview": "Ukázat náhled",
"showdiff": "Ukázat změny",
"ThePiscin",
"Osnard",
"Suriyaa Kudo",
- "KPFC"
+ "KPFC",
+ "ToBeFree"
]
},
"tog-underline": "Links unterstreichen:",
"tog-showhiddencats": "Versteckte Kategorien anzeigen",
"tog-norollbackdiff": "Unterschiede nach dem Zurücksetzen nicht anzeigen",
"tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
- "tog-prefershttps": "Stets eine sichere Verbindung benutzen, solange ich angemeldet bin",
+ "tog-prefershttps": "Immer eine sichere Verbindung benutzen, solange ich angemeldet bin",
"underline-always": "immer",
"underline-never": "nie",
"underline-default": "abhängig von der Benutzeroberfläche oder Browsereinstellung",
"pool-queuefull": "Poolwarteschlange ist voll",
"pool-errorunknown": "Unbekannter Fehler",
"pool-servererror": "Der Poolzählerdienst ist nicht verfügbar ($1).",
- "poolcounter-usage-error": "Anwendungsfehler: $1",
+ "poolcounter-usage-error": "Benutzungsfehler: $1",
"aboutsite": "Über {{SITENAME}}",
"aboutpage": "Project:Über_{{SITENAME}}",
"copyright": "Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.",
"cascadeprotected": "Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:\n$2",
"namespaceprotected": "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum <strong>$1</strong> bearbeiten zu können.",
"customcssprotected": "Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.",
+ "customjsonprotected": "Du hast keine Berechtigung, diese JSON-Seite zu bearbeiten, da sie persönliche Einstellungen eines anderen Benutzers enthält.",
"customjsprotected": "Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.",
"mycustomcssprotected": "Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.",
+ "mycustomjsonprotected": "Du hast keine Berechtigung, diese JSON-Seite zu bearbeiten.",
"mycustomjsprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten.",
"myprivateinfoprotected": "Du hast keine Berechtigung, deine privaten Informationen zu bearbeiten.",
"mypreferencesprotected": "Du bist nicht berechtigt, deine Einstellungen zu ändern.",
"savechanges": "Änderungen speichern",
"publishpage": "Seite veröffentlichen",
"publishchanges": "Änderungen veröffentlichen",
+ "savearticle-start": "Seite speichern …",
+ "savechanges-start": "Änderungen speichern …",
+ "publishpage-start": "Seite veröffentlichen …",
+ "publishchanges-start": "Änderungen veröffentlichen …",
"preview": "Vorschau",
"showpreview": "Vorschau zeigen",
"showdiff": "Änderungen zeigen",
"blocked-notice-logextract": "{{GENDER:$1|Dieser Benutzer|Diese Benutzerin}} ist zurzeit gesperrt.\nZur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:",
"clearyourcache": "<strong>Hinweis:</strong> Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.\n* <strong>Firefox/Safari:</strong> <em>Umschalttaste</em> drücken und gleichzeitig <em>Aktualisieren</em> anklicken oder entweder <em>Strg+F5</em> oder <em>Strg+R</em> (<em>⌘+R</em> auf dem Mac) drücken\n* <strong>Google Chrome:</strong> <em>Umschalttaste+Strg+R</em> (<em>⌘+Umschalttaste+R</em> auf dem Mac) drücken\n* <strong>Internet Explorer:</strong> <em>Strg+F5</em> drücken oder <em>Strg</em> drücken und gleichzeitig <em>Aktualisieren</em> anklicken\n* <strong>Opera:</strong> Gehe zu <em>Menü → Einstellungen</em> (<em>Opera → Einstellungen</em> auf dem Mac) und dann auf <em>Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien</em>.",
"usercssyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues CSS vor dem Speichern zu testen.",
+ "userjsonyoucanpreview": "<strong>Tipp:</strong> Benutze den „{{int:showpreview}}“-Button, um dein neues JSON vor dem Speichern zu testen.",
"userjsyoucanpreview": "'''Tipp:''' Benutze den „{{int:showpreview}}“-Button, um dein neues JavaScript vor dem Speichern zu testen.",
"usercsspreview": "'''Beachte, dass du nur eine Vorschau deines Benutzer-CSS betrachtest.'''\n'''Es wurde noch nicht gespeichert!'''",
+ "userjsonpreview": "<strong>Du testest/zeigst nur eine Vorschau deiner Benutzer-JSON-Konfiguration an.\nSie wurde noch nicht gespeichert!</strong>",
"userjspreview": "'''Beachte, dass du nur eine Vorschau deines Benutzer-JavaScripts betrachtest.'''\n'''Es wurde noch nicht gespeichert!'''",
"sitecsspreview": "'''Beachte, dass du nur eine Vorschau dieses CSS betrachtest.'''\n'''Es wurde noch nicht gespeichert!'''",
+ "sitejsonpreview": "<strong>Du zeigst nur eine Vorschau dieser JSON-Konfiguration an.\nSie wurde noch nicht gespeichert!</strong>",
"sitejspreview": "'''Beachte, dass du nur eine Vorschau dieses JavaScript betrachtest.'''\n'''Es wurde noch nicht gespeichert!'''",
- "userinvalidconfigtitle": "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenke, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
+ "userinvalidconfigtitle": "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenke, dass benutzerspezifische .css-, .json- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
"updated": "(Geändert)",
"note": "'''Hinweis:'''",
"previewnote": "'''Dies ist nur eine Vorschau.'''\nDie Seite wurde noch nicht gespeichert!",
"default": "Voreinstellung",
"prefs-files": "Dateien",
"prefs-custom-css": "Benutzerdefiniertes CSS",
+ "prefs-custom-json": "Benutzerdefiniertes JSON",
"prefs-custom-js": "Benutzerdefiniertes JavaScript",
- "prefs-common-config": "Gemeinsames CSS/JavaScript aller Benutzeroberflächen:",
+ "prefs-common-config": "Gemeinsames CSS/JSON/JavaScript aller Benutzeroberflächen:",
"prefs-reset-intro": "Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.\nDies kann nicht mehr rückgängig gemacht werden.",
"prefs-emailconfirm-label": "Bestätigung:",
"youremail": "E-Mail-Adresse:",
"right-editcontentmodel": "Das Inhaltsmodell einer Seite bearbeiten",
"right-editinterface": "Systemnachrichten und Benutzeroberflächen bearbeiten",
"right-editusercss": "Fremde CSS-Dateien bearbeiten",
+ "right-edituserjson": "JSON-Dateien anderer Benutzer bearbeiten",
"right-edituserjs": "Fremde JavaScript-Dateien bearbeiten",
"right-editmyusercss": "Eigene Benutzer-CSS-Dateien bearbeiten",
+ "right-editmyuserjson": "Eigene Benutzer-JSON-Dateien bearbeiten",
"right-editmyuserjs": "Eigene Benutzer-JavaScript-Dateien bearbeiten",
"right-viewmywatchlist": "Eigene Beobachtungsliste ansehen",
"right-editmywatchlist": "Eigene Beobachtungsliste bearbeiten. Einige Aktionen ermöglichen das Hinzufügen von Seiten ohne dieses Recht.",
"grant-createaccount": "Benutzerkonten erstellen",
"grant-createeditmovepage": "Seiten erstellen, bearbeiten und verschieben",
"grant-delete": "Seiten, Versionen und Logbucheinträge löschen",
- "grant-editinterface": "MediaWiki-Namensraum und Benutzer-CSS/JavaScript bearbeiten",
- "grant-editmycssjs": "Dein Benutzer-CSS/JavaScript bearbeiten",
+ "grant-editinterface": "MediaWiki-Namensraum und Benutzer-CSS/JSON/JavaScript bearbeiten",
+ "grant-editmycssjs": "Dein Benutzer-CSS/JSON/JavaScript bearbeiten",
"grant-editmyoptions": "Deine Benutzereinstellungen bearbeiten",
"grant-editmywatchlist": "Deine Beobachtungsliste bearbeiten",
"grant-editpage": "Vorhandene Seiten bearbeiten",
"group-bot.css": "/* CSS an dieser Stelle wirkt sich nur auf Bots aus */",
"group-sysop.css": "/* CSS an dieser Stelle wirkt sich nur auf Administratoren aus */",
"group-bureaucrat.css": "/* Das folgende CSS wird nur für Bürokraten geladen. */",
+ "common.json": "/* JSON an dieser Stelle wird bei jeder Seitenladung für alle Benutzer geladen. */",
"common.js": "/* Das folgende JavaScript wird für alle Benutzer geladen. */",
"group-autoconfirmed.js": "/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */",
"group-user.js": "/* Das folgende JavaScript wird nur für angemeldete Benutzer geladen. */",
"unlinkaccounts-success": "Das Benutzerkonto wurde getrennt.",
"authenticationdatachange-ignored": "Die Änderung der Authentifizierungsdaten wurde nicht bearbeitet. Vielleicht wurde kein Anbieter konfiguriert?",
"userjsispublic": "Bitte beachten: JavaScript-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
+ "userjsonispublic": "Bitte beachte: JSON-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern einsehbar sind.",
"usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
"restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
"restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
"tog-watchlisthidebots": "Lista seyr kerdışi ra vurnayışanê boti bınımne",
"tog-watchlisthideminor": "Vurnayışanê qıckekan lista mına seyr kerdışi de bınımne",
"tog-watchlisthideliu": "Lista seyr kerdışi ra vurnayışanê karberanê cı kewteyan bınımne",
- "tog-watchlistreloadautomatically": "Filtra vıriyayış dı listey seyri otomatikman anewe kı",
+ "tog-watchlistreloadautomatically": "Yew filtre ke vurriya, lista seyrkerdışi be xo newe ke (JavaScript lazımo)",
"tog-watchlisthideanons": "Lista seyr kerdışi ra vurnayışanê karberanê anoniman bınımne",
"tog-watchlisthidepatrolled": "Lista seyr kerdışi ra vurnayışanê qontrol kerdeyan bınımne",
"tog-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
"savechanges": "Αποθήκευση αλλαγών",
"publishpage": "Δημοσίευση σελίδας",
"publishchanges": "Δημοσίευση αλλαγών",
+ "savearticle-start": "Αποθήκευση σελίδας σε εξέλιξη...",
+ "publishpage-start": "Δημοσίευση σελίδας...",
+ "publishchanges-start": "Δημοσίευση αλλαγών...",
"preview": "Προεπισκόπηση",
"showpreview": "Εμφάνιση προεπισκόπησης",
"showdiff": "Εμφάνιση αλλαγών",
"userjspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του JavaScript του χρήστη -δεν το έχετε ακόμα αποθηκεύσει!'''",
"sitecsspreview": "<strong>Θυμηθείτε ότι είναι απλώς μια προεπισκόπηση αυτού του CSS.\nΔεν έχει αποθηκευτεί ακόμα!</strong>",
"sitejspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ'αυτόν τον κώδικα JavaScript.'' '\n'' ' Δεν τον έχετε αποθηκεύσει ακόμη!'' '",
- "userinvalidconfigtitle": "'''Προσοχή:''' Δεν υπάρχει skin με τίτλο \"$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css και .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Προσοχή:<strong> Δεν υπάρχει skin με τίτλο \"$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css, .json, .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
"updated": "(Ενημερώθηκε)",
"note": "'''Προσοχή: '''",
"previewnote": "<strong>Να θυμάστε ότι αυτό είναι απλώς προεπισκόπηση.</strong>\nΟι αλλαγές σας δεν έχουν αποθηκευτεί ακόμα!",
"default": "προεπιλογή",
"prefs-files": "Αρχεία",
"prefs-custom-css": "Προκαθορισμένη CSS",
+ "prefs-custom-json": "Εξατομικευμένο JSON",
"prefs-custom-js": "Προσαρμοσμένη JavaScript",
- "prefs-common-config": "Κοινά CSS/JavaScript για όλα τα θέματα εμφάνισης:",
+ "prefs-common-config": "Κοινά CSS/JSON/JavaScript για όλα τα θέματα εμφάνισης:",
"prefs-reset-intro": "Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.",
"prefs-emailconfirm-label": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου:",
"youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
"grant-createaccount": "Δημιουργία λογαριασμών",
"grant-createeditmovepage": "Δημιουργία, επεξεργασία και μετακίνηση σελίδων",
"grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων και καταχωρίσεων σε αρχεία καταγραφής",
- "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και των CSS/JavaScript των χρηστών",
- "grant-editmycssjs": "Επεξεργασία των CSS/JavaScript χρήστη σας",
+ "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και των CSS/JSON/JavaScript των χρηστών",
+ "grant-editmycssjs": "Επεξεργασία των CSS/JSON/JavaScript του χρήστη σας",
"grant-editmyoptions": "Επεξεργασία των προτιμήσεων χρήστη σας",
"grant-editmywatchlist": "Επεξεργασία της λίστας παρακολούθησής σας",
"grant-editpage": "Επεξεργασία υπαρχουσών σελίδων",
"rcfilters-view-namespaces-tooltip": "Φιλτράρισμα αποτελεσμάτων κατά ονοματοχώρο",
"rcfilters-liveupdates-button": "Ζωντανή ανανέωση",
"rcfilters-liveupdates-button-title-on": "Απενεργοποίηση ζωντανής ανανέωσης",
+ "rcfilters-watchlist-markseen-button": "Σημειώστε όλες τις αλλαγές ως εξετασμένες",
+ "rcfilters-watchlist-edit-watchlist-button": "Διορθώστε τη λίστα παρακολούθησης",
+ "rcfilters-watchlist-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
"rcfilters-preference-label": "Απόκρυψη της βελτιωμένης έκδοσης των Πρόσφατων Αλλαγών",
"rcfilters-preference-help": "Αναστέλλει τον επανασχεδιασμό διεπαφής 2017 και όλα τα εργαλεία που προστέθηκαν στη συνέχεια και από τότε.",
"rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
"cascadeprotected": "This page has been protected from editing because it is transcluded in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
"namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
"customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
+ "customjsonprotected": "You do not have permission to edit this JSON page because it contains another user's personal settings.",
"customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
"mycustomcssprotected": "You do not have permission to edit this CSS page.",
+ "mycustomjsonprotected": "You do not have permission to edit this JSON page.",
"mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
"myprivateinfoprotected": "You do not have permission to edit your private information.",
"mypreferencesprotected": "You do not have permission to edit your preferences.",
"savechanges": "Save changes",
"publishpage": "Publish page",
"publishchanges": "Publish changes",
+ "savearticle-start": "Save page…",
+ "savechanges-start": "Save changes…",
+ "publishpage-start": "Publish page…",
+ "publishchanges-start": "Publish changes…",
"preview": "Preview",
"showpreview": "Show preview",
"showdiff": "Show changes",
"blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
"clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
"usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
+ "userjsonyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JSON before saving.",
"userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
"usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
+ "userjsonpreview": "<strong>Remember that you are only testing/previewing your user JSON config.\nIt has not yet been saved!</strong>",
"userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
"sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
+ "sitejsonpreview": "<strong>Remember that you are only previewing this JSON config.\nIt has not yet been saved!</strong>",
"sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
- "userinvalidconfigtitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css, .json, and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
"updated": "(Updated)",
"note": "<strong>Note:</strong>",
"previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
"default": "default",
"prefs-files": "Files",
"prefs-custom-css": "Custom CSS",
+ "prefs-custom-json": "Custom JSON",
"prefs-custom-js": "Custom JavaScript",
- "prefs-common-config": "Shared CSS/JavaScript for all skins:",
+ "prefs-common-config": "Shared CSS/JSON/JavaScript for all skins:",
"prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
"prefs-emailconfirm-label": "Email confirmation:",
"youremail": "Email:",
"right-editcontentmodel": "Edit the content model of a page",
"right-editinterface": "Edit the user interface",
"right-editusercss": "Edit other users' CSS files",
+ "right-edituserjson": "Edit other users' JSON files",
"right-edituserjs": "Edit other users' JavaScript files",
"right-editmyusercss": "Edit your own user CSS files",
+ "right-editmyuserjson": "Edit your own user JSON files",
"right-editmyuserjs": "Edit your own user JavaScript files",
"right-viewmywatchlist": "View your own watchlist",
"right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
"grant-createaccount": "Create accounts",
"grant-createeditmovepage": "Create, edit, and move pages",
"grant-delete": "Delete pages, revisions, and log entries",
- "grant-editinterface": "Edit the MediaWiki namespace and user CSS/JavaScript",
- "grant-editmycssjs": "Edit your user CSS/JavaScript",
+ "grant-editinterface": "Edit the MediaWiki namespace and user CSS/JSON/JavaScript",
+ "grant-editmycssjs": "Edit your user CSS/JSON/JavaScript",
"grant-editmyoptions": "Edit your user preferences",
"grant-editmywatchlist": "Edit your watchlist",
"grant-editpage": "Edit existing pages",
"group-bot.css": "/* CSS placed here will affect bots only */",
"group-sysop.css": "/* CSS placed here will affect sysops only */",
"group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
+ "common.json": "/* Any JSON here will be loaded for all users on every page load. */",
"common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
"group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
"group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
"unlinkaccounts-success": "The account was unlinked.",
"authenticationdatachange-ignored": "The authentication data change was not handled. Maybe no provider was configured?",
"userjsispublic": "Please note: JavaScript subpages should not contain confidential data as they are viewable by other users.",
+ "userjsonispublic": "Please note: JSON subpages should not contain confidential data as they are viewable by other users.",
"usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
"restrictionsfield-badip": "Invalid IP address or range: $1",
"restrictionsfield-label": "Allowed IP ranges:",
"history-feed-empty": "La petita paĝo ne ekzistas.\nĜi verŝajne estis forigita de la vikio, aŭ alinomita.\nProvu [[Special:Search|serĉi en la vikio]] por rilataj novaj paĝoj.",
"history-edit-tags": "Redakti etikedojn de elektitaj revizioj",
"rev-deleted-comment": "(komento forigita)",
- "rev-deleted-user": "(uzanto-nomo forigita)",
+ "rev-deleted-user": "(uzantonomo forigita)",
"rev-deleted-event": "(protokolaj detaloj forigitaj)",
"rev-deleted-user-contribs": "[salutnomo aŭ IP-adreso estis forigita - redakto estas kaŝita en kontribuoj]",
"rev-deleted-text-permission": "Ĉi tiu revizio de la paĝo estis '''forigita'''.\nEble estas detaloj en la [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} protokolo pri forigado].",
"savechanges": "Guardar cambios",
"publishpage": "Publicar la página",
"publishchanges": "Publicar cambios",
+ "savearticle-start": "Guardar página…",
+ "savechanges-start": "Guardar cambios…",
+ "publishpage-start": "Publicar página…",
+ "publishchanges-start": "Publicar cambios…",
"preview": "Previsualizar",
"showpreview": "Mostrar previsualización",
"showdiff": "Mostrar los cambios",
"userpage-userdoesnotexist-view": "El usuario «$1» no está registrado.",
"blocked-notice-logextract": "Este usuario se encuentra actualmente bloqueado.\nA continuación se muestra la última entrada del registro de bloqueos para más información:",
"clearyourcache": "<strong>Nota:</strong> tras guardar, quizás necesites actualizar la caché de tu navegador para ver los cambios.\n* <strong>Firefox/Safari:</strong> Mantén presionada la tecla <em>Mayús</em> mientras pulsas el botón <em>Actualizar</em>, o presiona <em>Ctrl+F5</em> o <em>Ctrl+R</em> (<em>⌘+R</em> en Mac)\n* <strong>Google Chrome:</strong> presiona <em>Ctrl+Shift+R</em> (<em>⌘+Mayús+R</em> en Mac)\n* <strong>Internet Explorer:</strong> mantén presionada <em>Ctrl</em> mientras pulsas <em>Actualizar</em>, o presiona <em>Ctrl+F5</em>\n* <strong>Opera:</strong> dirígete a <em>Menú → Configuración</em> (<em>Opera → Preferencias</em> en Mac) y luego a <em>Privacidad y seguridad → Borrar datos de navegación → Imágenes y archivos en caché</em>.",
- "usercssyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el nuevo CSS antes de guardarlo.",
- "userjsyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el nuevo código JavaScript antes de guardarlo.",
+ "usercssyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el código CSS nuevo antes de guardarlo.",
+ "userjsonyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el código JSON nuevo antes de guardarlo.",
+ "userjsyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el código JavaScript nuevo antes de guardarlo.",
"usercsspreview": "<strong>Recuerda que solo estás previsualizando tu CSS de usuario.\n¡Aún no se ha guardado!</strong>",
"userjspreview": "<strong>¡Recuerda que solo estás previsualizando tu JavaScript de usuario.\n¡Aún no se ha guardado!</strong>",
"sitecsspreview": "<strong>Recuerda que solo estás previsualizando este CSS.\n¡Aún no se ha guardado!</strong>",
"default": "predeterminado",
"prefs-files": "Archivos",
"prefs-custom-css": "CSS personalizado",
+ "prefs-custom-json": "JSON personalizado",
"prefs-custom-js": "JavaScript personalizado",
- "prefs-common-config": "CSS/JavaScript compartido para todas las apariencias:",
+ "prefs-common-config": "CSS/JSON/JavaScript compartido para todas las apariencias:",
"prefs-reset-intro": "Puedes usar esta página para restaurar los valores predeterminados de tus preferencias.\nNo podrás deshacer esta acción.",
"prefs-emailconfirm-label": "Confirmación de correo electrónico:",
"youremail": "Correo electrónico:",
"right-editcontentmodel": "Editar el modelo de contenido de una página",
"right-editinterface": "Editar la interfaz de usuario",
"right-editusercss": "Editar las páginas de CSS de otros usuarios",
+ "right-edituserjson": "Editar archivos JSON de otros usuarios",
"right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
"right-editmyusercss": "Editar tus archivos CSS",
"right-editmyuserjs": "Editar tus archivos JavaScript",
"grant-createeditmovepage": "Crear, editar y trasladar páginas",
"grant-delete": "Borrar páginas, revisiones y entradas del registro",
"grant-editinterface": "Editar el espacio de nombres MediaWiki y el CSS/JavaScript de usuarios",
- "grant-editmycssjs": "Editar tu CSS o JavaScript",
+ "grant-editmycssjs": "Editar tu CSS/JSON/JavaScript",
"grant-editmyoptions": "Editar tus preferencias de usuario",
"grant-editmywatchlist": "Editar tu lista de seguimiento",
"grant-editpage": "Editar páginas existentes",
"protectedarticle-comment": "{{GENDER:$2|Protegió}} «[[$1]]»",
"modifiedarticleprotection-comment": "{{GENDER:$2|Cambió el nivel de protección}} de «[[$1]]»",
"unprotectedarticle-comment": "{{GENDER:$2|Eliminó la protección}} de «[[$1]]»",
- "protect-title": "Cambiando el nivel de protección de «$1»",
+ "protect-title": "Cambio del nivel de protección de «$1»",
"protect-title-notallowed": "Ver el nivel de protección de «$1»",
"prot_1movedto2": "[[$1]] se trasladó a [[$2]]",
"protect-badnamespace-title": "Espacio de nombres no protegible",
"fileduplicatesearch-info": "$1 × $2 píxeles<br />Tamaño: $3<br />Tipo MIME: $4",
"fileduplicatesearch-result-1": "El archivo «$1» no tiene duplicados idénticos.",
"fileduplicatesearch-result-n": "El archivo «$1» tiene {{PLURAL:$2|1 duplicado idéntico|$2 duplicados idénticos}}.",
- "fileduplicatesearch-noresults": "Ningún archivo con el nombre «$1» encontrado.",
+ "fileduplicatesearch-noresults": "No se encontró ningún archivo denominado «$1».",
"specialpages": "Páginas especiales",
"specialpages-note-top": "Leyenda",
"specialpages-note-restricted": "* Páginas especiales ordinarias.\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>",
"unlinkaccounts": "Desvincular cuentas",
"unlinkaccounts-success": "Se ha desvinculado la cuenta.",
"authenticationdatachange-ignored": "El cambio den los datos de autentificacion no fue realizado. ¿Tal vez, no se configuró un proveedor?",
- "userjsispublic": "Recuerda: las subpáginas JavaScript no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
- "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
+ "userjsispublic": "Recuerda: las subpáginas JavaScript no deben contener datos confidenciales, pues otros usuarios los podrían ver.",
+ "userjsonispublic": "Recuerda: las subpáginas JSON no deben contener datos confidenciales, pues otros usuarios los podrían ver.",
+ "usercssispublic": "Recuerda: las subpáginas CSS no deben contener datos confidenciales, pues otros usuarios los podrían ver.",
"restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
"restrictionsfield-label": "Intervalos de IP permitidos:",
"restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
"cascadeprotected": "See lehekülg on muutmise eest kaitstud, sest see on osa {{PLURAL:$1|järgmisest leheküljest|järgmistest lehekülgedest}}, mis on kaskaadkaitse all:\n$2",
"namespaceprotected": "Sul pole õigust redigeerida lehekülgi nimeruumis '''$1'''.",
"customcssprotected": "Sul pole õigust seda CSS-lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.",
+ "customjsonprotected": "Sul pole lubatud redigeerida seda JSON-lehekülge, sest see sisaldab teise kasutaja isiklikke eelistusi.",
"customjsprotected": "Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.",
"mycustomcssprotected": "Sul pole õigust redigeerida seda CSS-lehekülge.",
+ "mycustomjsonprotected": "Sul pole lubatud seda JSON-lehekülge redigeerida.",
"mycustomjsprotected": "Sul pole õigust redigeerida seda JavaScript-lehekülge.",
"myprivateinfoprotected": "Sul pole lubatud oma eraandmeid redigeerida.",
"mypreferencesprotected": "Sul pole lubatud oma eelistusi muuta.",
"wrongpasswordempty": "Parool jäi sisestamata. Palun proovi uuesti.",
"passwordtooshort": "Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.",
"passwordtoolong": "Parool ei saa olla pikem kui {{PLURAL:$1|üks märk|$1 märk}}.",
- "passwordtoopopular": "Liigi levinud parooli ei saa kasutada. Palun vali haruldasem parool.",
+ "passwordtoopopular": "Liiga levinud paroole ei saa kasutada. Palun vali parool, mida on keerulisem ära arvata.",
"password-name-match": "Parool peab kasutajanimest erinema.",
"password-login-forbidden": "Selle kasutajanime ja parooli kasutamine on keelatud.",
"mailmypassword": "Lähtesta parool",
"savechanges": "Salvesta",
"publishpage": "Avalda lehekülg",
"publishchanges": "Avalda muudatused",
+ "savearticle-start": "Salvesta lehekülg…",
+ "savechanges-start": "Salvesta muudatused…",
+ "publishpage-start": "Avalda lehekülg…",
+ "publishchanges-start": "Avalda muudatused…",
"preview": "Eelvaade",
"showpreview": "Näita eelvaadet",
"showdiff": "Näita muudatusi",
"blocked-notice-logextract": "See kasutaja on praegu blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
"clearyourcache": "<strong>Märkus:</strong> Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks brauseri puhver tühjendada.\n* <strong>Firefox / Safari:</strong> Hoia all <em>Shift</em>-klahvi ja klõpsa <em>Laadi uuesti</em> või vajuta kas <em>Ctrl-F5</em> või <em>Ctrl-R</em> (Macis <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> Vajuta <em>Ctrl-Shift-R</em> (Macis <em>⌘-Shift-R</em>).\n* <strong>Internet Explorer:</strong> Hoia all <em>Ctrl</em>-klahvi ja klõpsa <em>Värskenda</em> või vajuta <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Mine asukohta <em>Menüü → Seaded</em> (Macis <em>Opera → Eelistused</em>) ja seejärel <em>Andmekaitse ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid</em>.",
"usercssyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
+ "userjsonyoucanpreview": "<strong>Nõuanne:</strong> Kasuta nuppu \"{{int:showpreview}}\", et uut JSON-i enne salvestamist katsetada.",
"userjsyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
"usercsspreview": "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''",
+ "userjsonpreview": "<strong>Pea meeles, see on eelvaade ja sa kõigest katsetad kasutaja JSON-häälestust.\nSeda pole veel salvestatud!</strong>",
"userjspreview": "'''Ära unusta, et see versioon sinu isiklikust JavaScriptist on alles salvestamata!'''",
"sitecsspreview": "'''Pea meeles, et see on vaid selle stiililehe eelvaade.'''\n'''Seda pole veel salvestatud!'''",
+ "sitejsonpreview": "<strong>Pea meeles, see on kõigest JSON-häälestuse eelvaade.\nSeda pole veel salvestatud!</strong>",
"sitejspreview": "'''Pea meeles, et see on vaid selle JavaScripti-koodi eelvaade.'''\n'''Seda pole veel salvestatud!'''",
- "userinvalidconfigtitle": "'''Hoiatus:''' Kujundust nimega \"$1\" ei ole.\nÄra unusta, et kasutaja isiklikud .css- ja .js-lehed kasutavad väiketähega algavaid nimesid, näiteks {{ns:user}}:Juhan Julm/vector.css ja mitte {{ns:user}}:Juhan Julm/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Hoiatus:</strong> Kujundust nimega \"$1\" ei ole.\nKohandatud .css-, .json- ja .js-lehtede pealkirjad algavad väikese tähega; näiteks {{ns:user}}:Juhan Julm/vector.css, mitte {{ns:user}}:Juhan Julm/Vector.css.",
"updated": "(Värskendatud)",
"note": "'''Meeldetuletus:'''",
"previewnote": "'''Ära unusta, et see on kõigest eelvaade!'''\nSinu muudatused pole veel salvestatud!",
"expansion-depth-exceeded-category": "Ületatud hõrendussügavusega leheküljed",
"expansion-depth-exceeded-category-desc": "Lehekülg ületab hõrendussügavuse ülemmäära.",
"expansion-depth-exceeded-warning": "Lehekülg ületas hõrendussügavuse.",
- "parser-unstrip-loop-warning": "''Unstrip''-funktsiooni silmus tuvastatud",
- "unstrip-depth-warning": "''Unstrip''-funktsioonis rekursiooni piirmäär ületatud ($1)",
+ "parser-unstrip-loop-warning": "Tuvastatud funktsiooni \"unstrip\" silmus",
+ "unstrip-depth-warning": "Ületatud funktsiooni \"unstrip\" sügavuse piirmäär ($1)",
+ "unstrip-depth-category": "Leheküljed, kus funktsiooni \"unstrip\" sügavuse limiit on ületatud",
+ "unstrip-size-warning": "Funktsiooni \"unstrip\" suuruse ülemmäär ületatud ($1)",
+ "unstrip-size-category": "Leheküljed, kus funktsiooni \"unstrip\" suuruse ülemmäär on ületatud",
"converter-manual-rule-error": "Tõrge keelevariandi käsivahetusreeglis",
"undo-success": "Selle redaktsiooni käigus tehtud muudatusi saab eemaldada. Palun kontrolli allolevat võrdlust veendumaks, et tahad need muudatused tõepoolest eemaldada. Seejärel saad lehekülje salvestada.",
"undo-failure": "Muudatust ei saa vahapeal tehtud redigeerimiste tõttu tühistada.",
"stub-threshold-disabled": "Välja lülitatud",
"recentchangesdays": "Mitu päeva näidata viimastes muudatustes:",
"recentchangesdays-max": "Ülemmäär $1 {{PLURAL:$1|päev|päeva}}",
- "recentchangescount": "Mitut redaktsiooni vaikimisi näidata:",
- "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
+ "recentchangescount": "Mitut muudatust viimaste muudatuste loendis, lehekülgede ajalugudes ja logides vaikimisi näidata:",
+ "prefs-help-recentchangescount": "Suurim võimalik väärtus: 1000",
"prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
"savedprefs": "Sinu eelistused on salvestatud.",
"savedrights": "Kasutaja $1 rühmad on salvestatud.",
"default": "vaikeväärtus",
"prefs-files": "Failid",
"prefs-custom-css": "kohandatud CSS",
+ "prefs-custom-json": "kohandatud JSON",
"prefs-custom-js": "kohandatud JavaScript",
- "prefs-common-config": "Kõigi kujunduste ühine CSS/JavaScript:",
+ "prefs-common-config": "Kõigi kujunduste ühine CSS/JSON/JavaScript:",
"prefs-reset-intro": "Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.\nToimingut ei saa hiljem tühistada.",
"prefs-emailconfirm-label": "E-posti kinnitus:",
"youremail": "E-posti aadress:",
"right-editcontentmodel": "Muuta lehekülje sisumudelit",
"right-editinterface": "Muuta kasutajaliidest",
"right-editusercss": "Redigeerida teiste kasutajate CSS-faile",
+ "right-edituserjson": "Redigeerida teiste kasutajate JSON-faile",
"right-edituserjs": "Redigeerida teiste kasutajate JS-faile",
"right-editmyusercss": "Redigeerida oma CSS-kasutajafaile",
+ "right-editmyuserjson": "Redigeerida oma JSON-kasutajafaile",
"right-editmyuserjs": "Redigeerida oma JavaScript-kasutajafaile",
"right-viewmywatchlist": "Vaadata oma jälgimisloendit",
"right-editmywatchlist": "Redigeerida oma jälgimisloendit. Pane tähele, et mõne toiminguga lisatakse lehekülgi siiski ka ilma selle õiguseta.",
"grant-createaccount": "Kontode loomine",
"grant-createeditmovepage": "Lehekülgede alustamine, muutmine ja teisaldamine",
"grant-delete": "Lehekülgede, redaktsioonide ja logisissekannete kustutamine",
- "grant-editinterface": "MediaWiki nimeruumi ning kasutaja CSSi ja JavaScripti redigeerimine",
- "grant-editmycssjs": "Oma CSSi või JavaScripti muutmine",
+ "grant-editinterface": "MediaWiki nimeruumi ning kasutaja CSSi, JSONi ja JavaScripti redigeerimine",
+ "grant-editmycssjs": "Oma CSSi, JSONi või JavaScripti muutmine",
"grant-editmyoptions": "Enda eelistuste muutmine",
"grant-editmywatchlist": "Oma jälgimisloendi muutmine",
"grant-editpage": "Olemasolevate lehekülgede redigeerimine",
"group-bot.css": "/* Siin asuv kaskaadilaadistik puudutab ainult roboteid. */",
"group-sysop.css": "/* Siin asuv kaskaadilaadistik puudutab ainult administraatoreid. */",
"group-bureaucrat.css": "/* Siin asuv kaskaadilaadistik puudutab ainult bürokraate. */",
+ "common.json": "/* Siin asuv JSON laaditakse igale kasutajale iga lehekülje laadimisel. */",
"common.js": "/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */",
"group-autoconfirmed.js": "/* Siin asuv JavaScript laaditakse ainult automaatselt kinnitatud kasutajate jaoks. */",
"group-user.js": "/* Siin asuv JavaScript laaditakse ainult registreeritud kasutajate jaoks. */",
"tag-filter": "[[Special:Tags|Märgisefilter]]:",
"tag-filter-submit": "Filtri",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Märgis|Märgised}}]]: $2)",
- "tag-mw-contentmodelchange": "sisumudeli muudatus",
+ "tag-mw-contentmodelchange": "Sisumudeli muudatus",
"tag-mw-contentmodelchange-description": "Lehekülje [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel sisumudelit muutvad] redaktsioonid",
"tag-mw-new-redirect": "Uus ümbersuunamine",
"tag-mw-new-redirect-description": "Muudatused, millega luuakse uus ümbersuunamislehekülg või muudetakse lehekülg ümbersuunamiseks",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bait|baiti}}",
"limitreport-expansiondepth": "Suurim hõrendussügavus",
"limitreport-expensivefunctioncount": "Kulukate parserifunktsioonide arv",
+ "limitreport-unstrip-depth": "Funktsiooni \"unstrip\" rekursioonisügavus",
+ "limitreport-unstrip-size": "Funktsiooni \"unstrip\" hõrendusjärgne suurus",
+ "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bait|baiti}}",
"expandtemplates": "Mallide hõrendamine",
"expand_templates_intro": "See erilehekülg hõrendab siia sisestatud vikitekstis kõik mallid rekursiivselt.\nSamuti hõrendab see parserifunktsioonid nagu\n<code><nowiki>{{</nowiki>#language:…}}</code> ja muutujad nagu\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nÕigupoolest hõrendab see kahekordsete looksulgude vahel pea kõike.",
"expand_templates_title": "Sisu pealkiri, näiteks {{FULLPAGENAME}} jaoks:",
"unlinkaccounts-success": "Kontode linkimine on tühistatud.",
"authenticationdatachange-ignored": "Autentimisandmete muutmine jäi rahuldamata. Võimalik, et ühtegi pakkujat polnud häälestatud.",
"userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
+ "userjsonispublic": "Palun pane tähele: JSON-alamleheküljel ei peaks olema konfidentsiaalseid andmeid, kuna teised kasutajad näevad seda.",
"usercssispublic": "Palun pane tähele: CSS-alamleheküljel ei peaks olema konfidentsiaalseid andmeid, kuna teised kasutajad näevad seda.",
"restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
"restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
"Vriullop",
"Osoitz",
"Mikel Ibaiba",
- "MarcoAurelio"
+ "MarcoAurelio",
+ "Iñaki LL"
]
},
"tog-underline": "Azpimarratu loturak:",
"tog-hidecategorization": "Ezkutatu orrien kategorizazioa",
"tog-extendwatchlist": "Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak",
"tog-usenewrc": "Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu",
- "tog-numberheadings": "Zenbakitu automatikoki goiburuak",
+ "tog-numberheadings": "Zenbakitu automatikoki atalburuak",
"tog-showtoolbar": "Aldaketen tresna-barra erakutsi",
"tog-editondblclick": "Klik bikoitzaren bitartez orrialdeak aldatu",
"tog-editsectiononrightclick": "Atalen izenburuetan eskuin klik eginez aldatzea gaitu",
"fileexists-duplicate-version": "Igoera oraingo bertsio honen bikoizketa zehatza da {{PLURAL:$2|bertsio zaharrago bat|bertsio zaharragoak}} of <strong>[[:$1]]</strong>.",
"file-exists-duplicate": "Fitxategi hau beste fitxategi {{PLURAL:$1|honen|hauen}} kopia bat da:",
"file-deleted-duplicate": "Fitxategi honen ([[:$1]]) fitxategi berbera aldez aurretik ezabatua izan da. Fitxategi horren ezabaketa-erregistroa begiratu beharko zenuke berriz igo baino lehen.",
- "file-deleted-duplicate-notitle": "Fitxategi honetarako fitxategi berdin bat aurretik ezabatu da eta titulua kendu egin da. Ordezkatutako fitxategiaren datuak ikusi ahal izateko ezabatutakoa ikusteko ahalmena duen norbaiti galdetu beharko zenioke berriro kargatu baino lehen.",
+ "file-deleted-duplicate-notitle": "Fitxategi honetarako fitxategi berdin bat aurretik ezabatu da eta izenburua kendu egin da. Ordezkatutako fitxategiaren datuak ikusi ahal izateko ezabatutakoa ikusteko ahalmena duen norbaiti galdetu beharko zenioke berriro kargatu baino lehen.",
"uploadwarning": "Igotzeko oharra",
"uploadwarning-text": "Aldatu beheko fitxategiaren deskribapena, mesedez, eta saiatu berriz.",
"uploadwarning-text-nostash": "Fitxategia berriz kargatu, aldatu beheko azalpena eta saiatu berriro.",
"wrongpasswordempty": "گذرواژهای که وارد کردهاید، خالی است.\nلطفاً دوباره تلاش کنید.",
"passwordtooshort": "گذرواژه باید دستکم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته باشد.",
"passwordtoolong": "گذرواژه نمی تواند حروفش بیشتر از {{PLURAL:$1|۱ حرف|$1 حرف}} باشد.",
- "passwordtoopopular": "گذرÙ\88اÚ\98Ù\87â\80\8cÙ\87اÛ\8c Ù\85تداÙ\88Ù\84 را Ù\86Ù\85Û\8câ\80\8cتÙ\88اÙ\86Û\8cد استÙ\81ادÙ\87 Ú©Ù\86Û\8cد. Ù\84Ø·Ù\81اÙ\8b گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c اÙ\86تخاب Ú©Ù\86Û\8cد Ú©Ù\87 بÛ\8cشتر Ù\85Ù\86Øصر بÙ\87 Ù\81رد باشد.",
+ "passwordtoopopular": "گذرÙ\88اÚ\98Ù\87â\80\8cÙ\87اÛ\8c Ù\85تداÙ\88Ù\84 را Ù\86Ù\85Û\8câ\80\8cتÙ\88اÙ\86Û\8cد استÙ\81ادÙ\87 Ú©Ù\86Û\8cد. Ù\84Ø·Ù\81اÙ\8b گذرÙ\88اÚ\98Ù\87â\80\8cاÛ\8c اÙ\86تخاب Ú©Ù\86Û\8cد Ú©Ù\87 Øدسâ\80\8cزدÙ\86 Ø¢Ù\86 سخت باشد.",
"password-name-match": "گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.",
"password-login-forbidden": "استفاده از این نام کاربری و گذرواژه ممنوع است.",
"mailmypassword": "بازنشانی گذرواژه",
"savechanges": "ذخیره کردن تغییرات",
"publishpage": "انتشار صفحه",
"publishchanges": "انتشار تغییرات",
+ "savearticle-start": "ذخیرهٔ صفحه...",
+ "savechanges-start": "ذخیرهٔ تغییرات...",
+ "publishpage-start": "انتشار صفحه...",
+ "publishchanges-start": "انتشار تغییرات...",
"preview": "پیشنمایش",
"showpreview": "پیشنمایش",
"showdiff": "نمایش تغییرات",
"default": "پیشفرض",
"prefs-files": "پروندهها",
"prefs-custom-css": "سیاساس شخصی",
+ "prefs-custom-json": "JSON شخصی",
"prefs-custom-js": "جاوااسکریپت شخصی",
- "prefs-common-config": "سیاساس/جاوااسکریپت مشترک برای تمام پوستهها:",
+ "prefs-common-config": "سیاساس/جاوااسکریپت/JSON مشترک برای تمام پوستهها:",
"prefs-reset-intro": "شما میتوانید از این صفحه برای بازگرداندن تنظیمات خود به پیشفرض تارنما استفاده کنید.\nاین کار بازگشتناپذیر است.",
"prefs-emailconfirm-label": "تأیید ایمیل:",
"youremail": "ایمیل:",
"grant-createaccount": "ایجاد حسابهای کاربری",
"grant-createeditmovepage": "ایجاد، ویرایش و انتقال صفحات",
"grant-delete": "حذف صفحات، نسخههای ویرایش و سیاهه ورودی",
- "grant-editinterface": "ویرایش CSS کاربر/جاوااسکریپت و فضای نام مدیاویکی",
- "grant-editmycssjs": "ویرایش CSS /جاوااسکریپت کاربری",
+ "grant-editinterface": "ویرایش CSS کاربر/جاوااسکریپت/JSON و فضای نام مدیاویکی",
+ "grant-editmycssjs": "ویرایش CSS /جاوااسکریپت/JSON کاربری",
"grant-editmyoptions": "اولویتهای کاربری را ویرایش کنید",
"grant-editmywatchlist": "ویرایش فهرست پیگیریهایتان",
"grant-editpage": "ویرایش صفحات موجود",
"mediastatistics-header-bitmap": "تصاویر بیتمپ",
"mediastatistics-header-drawing": "طراحیها (تصاویر برداری)",
"mediastatistics-header-audio": "صدا",
- "mediastatistics-header-video": "ویدیوها",
+ "mediastatistics-header-video": "ویدئوها",
"mediastatistics-header-multimedia": "رسانههای غنی",
"mediastatistics-header-office": "دفتر",
"mediastatistics-header-text": "متنی",
"cascadeprotected": "Cette page est protégée contre les modifications car elle est transcluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
"namespaceprotected": "Vous n’avez pas la permission de modifier les pages de l’espace de noms « <strong>$1</strong> ».",
"customcssprotected": "Vous n’avez pas la permission de modifier cette feuille de style CSS, car elle contient les paramètres personnels d’un autre utilisateur.",
+ "customjsonprotected": "Vous n’avez pas le droit de modifier cette page JSON parce qu’elle contient les paramètres personnels d’un autre utilisateur.",
"customjsprotected": "Vous n’avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d’un autre utilisateur.",
"mycustomcssprotected": "Vous n’avez pas le droit de modifier cette page CSS.",
+ "mycustomjsonprotected": "Vous n’avez pas le droit de modifier cette page JSON.",
"mycustomjsprotected": "Vous n’avez pas le droit de modifier cette page JavaScript.",
"myprivateinfoprotected": "Vous n’avez pas le droit de modifier vos informations personnelles.",
"mypreferencesprotected": "Vous n’avez pas le droit de modifier vos préférences.",
"savechanges": "Enregistrer les modifications",
"publishpage": "Publier la page",
"publishchanges": "Publier les modifications",
+ "savearticle-start": "Enregistrer la page…",
+ "savechanges-start": "Enregistrer les modifications…",
+ "publishpage-start": "Publier la page…",
+ "publishchanges-start": "Publier les modifications…",
"preview": "Prévisualisation",
"showpreview": "Prévisualiser",
"showdiff": "Voir les modifications",
"blocked-notice-logextract": "Cet utilisateur est actuellement bloqué.\nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
"clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac) \n* <strong>Google Chrome :</strong> appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac) \n* <strong>Internet Explorer :</strong> maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> \n* <strong>Opera :</strong> allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité & sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
"usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
+ "userjsonyoucanpreview": "<strong>Conseil :</strong> Utiliser le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
"userjsyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
"usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS. \nElle n’a pas encore été enregistrée !</strong>",
+ "userjsonpreview": "<strong>Rappelez-vous que vous êtes seulement en train de tester/faire un aperçu de votre configuration utilisateur JSON.\nElle n’a pas encore été enregistrée !</strong>",
"userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
"sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée !</strong>",
+ "sitejsonpreview": "<strong>Souvenez-vous que vous ne faites que regarder un aperçu de cette configuration JSON.\nElle n’a pas encore été enregistrée !</strong>",
"sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript. \nIl n’a pas encore été enregistré !</strong>",
- "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ». \nLes pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ». \nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
"updated": "(Mis à jour)",
"note": "<strong>Note :</strong>",
"previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
"default": "défaut",
"prefs-files": "Fichiers",
"prefs-custom-css": "CSS personnalisé",
+ "prefs-custom-json": "JSON personnalisé",
"prefs-custom-js": "JavaScript personnalisé",
- "prefs-common-config": "CSS et JavaScript communs à tous les habillages :",
+ "prefs-common-config": "CSS/JSON/JavaScript communs à tous les habillages :",
"prefs-reset-intro": "Vous pouvez utiliser cette page pour restaurer vos préférences aux valeurs par défaut du site. Ceci ne peut pas être défait.",
"prefs-emailconfirm-label": "Confirmation du courriel :",
"youremail": "Courriel :",
"right-editcontentmodel": "Modifier le modèle de contenu d’une page",
"right-editinterface": "Modifier l'interface utilisateur",
"right-editusercss": "Modifier les fichiers CSS d'autres utilisateurs",
+ "right-edituserjson": "Modifier les fichiers JSON d’un autre utilisateur",
"right-edituserjs": "Modifier les fichiers JavaScript d'autres utilisateurs",
"right-editmyusercss": "Modifier vos propres fichiers CSS utilisateur",
+ "right-editmyuserjson": "Modifier vos propres fichiers utilisateur JSON",
"right-editmyuserjs": "Modifier vos propres fichiers JavaScript utilisateur",
"right-viewmywatchlist": "Afficher votre propre liste de suivi",
"right-editmywatchlist": "Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.",
"grant-createaccount": "Créer des comptes",
"grant-createeditmovepage": "Créer, modifier et déplacer des pages",
"grant-delete": "Supprimer les pages, les révisions et les entrées du journal",
- "grant-editinterface": "Modifier l’espace de noms MediaWiki et le CSS/JavaScript utilisateur",
- "grant-editmycssjs": "Modifier votre CSS/JavaScript utilisateur",
+ "grant-editinterface": "Modifier l’espace de noms MediaWiki et le CSS/JSON/JavaScript utilisateur",
+ "grant-editmycssjs": "Modifier votre CSS/JSON/JavaScript utilisateur",
"grant-editmyoptions": "Modifier vos préférences utilisateur",
"grant-editmywatchlist": "Modifier votre liste de suivi",
"grant-editpage": "Modifier des pages existantes",
"group-bot.css": "/* Le CSS placé ici affectera les robots seulement. */",
"group-sysop.css": "/* Le CSS inclus ici n’affectera que les administrateurs */",
"group-bureaucrat.css": "/* Le CSS inclus ici n’affectera que les bureaucrates */",
+ "common.json": "/* Tout JSON ici sera chargé pour tous les utilisateurs à chaque chargement de page. */",
"common.js": "/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */",
"group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs autoconfirmés */",
"group-user.js": "/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */",
"unlinkaccounts-success": "Le compte a été dissocié.",
"authenticationdatachange-ignored": "Les modifications de données d’authentification n’ont pas été gérées. Peut-être aucun fournisseur n’a-t-il été configuré ?",
"userjsispublic": "Veuillez noter : les sous-pages JavaScript ne doivent pas contenir de données confidentielles parce qu’elles sont visibles des autres utilisateurs.",
+ "userjsonispublic": "Notez bien : Les sous-pages JSON ne doivent pas contenir de données confidentielles car elles sont visibles par les autres utilisateurs.",
"usercssispublic": "Veuillez noter : les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu’elles sont visibles des autres utilisateurs.",
"restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
"restrictionsfield-label": "Plages IP autorisées :",
"LeGuyanaisPure"
]
},
+ "tog-underline": "Soulignman di lyen :",
+ "tog-hideminor": "Maské modifikasyon minò andan modifikasyon résant",
+ "tog-hidepatrolled": "Maské modifikasyon ki rouli andan modifikasyon résant",
+ "tog-newpageshidepatrolled": "Maské paj ki rouli andan lis dé nouvèl paj",
+ "tog-hidecategorization": "Maské katégorizasyon dé paj",
+ "tog-extendwatchlist": "Étann lis di swivi pou afiché tout modifikasyon é pa inikman pli résant",
+ "tog-usenewrc": "Groupé chanjman-yan pa paj andan modifikasyon-yan résant ké lis di swivi-a",
+ "tog-numberheadings": "Niméroté otomatikman tit di sèksyon",
+ "tog-showtoolbar": "Afiché bar di zouti di édisyon",
+ "tog-editondblclick": "Modifyé paj-ya ké roun doub-klik",
+ "tog-editsectiononrightclick": "Aktivé modifikasyon-an dé sèksyon pa roun klik drèt asou tit di sèksyon",
+ "tog-watchcreations": "Ajouté à mo lis di swivi paj-ya ki mo kréyé é fiché-ya ki mo ka enpòrté",
+ "tog-watchdefault": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka modifyé",
+ "tog-watchmoves": "Ajouté paj-ya ké fiché-ya ki mo ka déplasé annan mo lis di swivi",
+ "tog-watchdeletion": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka souprimé",
+ "tog-watchuploads": "Ajouté nouvèl fiché ki mo ka enpòrté à mo lis di swivi",
+ "tog-watchrollback": "Ajouté à mo lis di swivi paj-ya asou lakèl mo éfèktchwé roun révokasyon",
+ "tog-minordefault": "Marké tout mo modifikasyon kou minò pa défo",
+ "tog-previewontop": "Afiché prévizwalizasyon-an laro di zonn di modifikasyon",
+ "tog-previewonfirst": "Afiché prévizwalizasyon-an lò di pronmyé modifikasyon",
+ "tog-enotifwatchlistpages": "Avèrti mo pa kouryé lò roun paj ou roun fiché di mo lis di swivi sa modifyé",
+ "tog-enotifusertalkpages": "Avèrti mo pa kouryé lò mo paj di diskisyon sa modifyé",
+ "tog-enotifminoredits": "Avèrti mo pa kouryé égalman lò dé modifikasyon minò dé paj ou dé fiché",
+ "tog-enotifrevealaddr": "Afiché mo adrès élèktronik andan kouryé di notifikasyon",
+ "tog-shownumberswatching": "Afiché nonm-an di itilizatò an kour",
+ "tog-oldsig": "Zòt signatir atchwèl :",
+ "tog-fancysig": "Trété signatir-a kou di wikitèks (san lyen otomatik)",
+ "tog-uselivepreview": "Afiché apèrsou san roucharjé paj-a",
+ "tog-forceeditsummary": "Avèrti mo lò mo pa spésifyé di rézimé di modifikasyon",
+ "tog-watchlisthideown": "Maské mo pròp modifikasyon annan lis di swivi",
+ "tog-watchlisthidebots": "Maské modifikasyon-yan ki fè pa dé robo annan lis di swivi",
+ "tog-watchlisthideminor": "Maské modifikasyon-yan minò annan lis di swivi",
+ "tog-watchlisthideliu": "Maské modifikasyon-yan ki fè pa dé itilizatò annan lis di swivi",
+ "tog-watchlistreloadautomatically": "Roucharjé otomatikman lis di swivi-a lò lòpsyon di filtraj sa modifyé (JavaScript réki)",
+ "tog-watchlistunwatchlinks": "Ajouté dé lyen dirèk pou swiv ou arété di swiv antré-ya di lis di swivi (JavaScript sa nésésèr pou itilizé fonksyonalité-a)",
+ "tog-watchlisthideanons": "Maské modifikasyon-yan di itilizatò anonim annan lis di swivi",
+ "tog-watchlisthidepatrolled": "Maské modifikasyon-yan ki rouli annan lis di swivi",
+ "tog-watchlisthidecategorization": "Maské katégorizasyon dé paj",
+ "tog-ccmeonemails": "• Voyé mo roun kopi dé kouryé ki mo ka voyé pou ròt itilizatò",
+ "tog-diffonly": "Pa afiché kontni di paj-ya anba diff",
+ "tog-showhiddencats": "Afiché katégori-ya ki kaché",
+ "tog-norollbackdiff": "Pa afiché diff aprè révoké",
+ "tog-useeditwarning": "Avèrti mo lò mo ka kité roun paj an kour di modifikasyon san sovgardé",
+ "tog-prefershttps": "Toujou itilizé roun konèksyon sékirizé lò mo konèkté",
+ "underline-always": "Toujou",
+ "underline-never": "Janmè",
+ "underline-default": "Valò pa défo di tenm ou di navigatò",
+ "editfont-style": "Stil di polis di zonn di modifikasyon",
+ "editfont-monospace": "Polis ké chas fiks",
+ "editfont-sansserif": "Polis sans-serif",
+ "editfont-serif": "Polis serif",
"sunday": "Dimanch",
"monday": "Lendi",
- "tuesday": "Mardi",
+ "tuesday": "mardi",
"wednesday": "Mèrkrédi",
"thursday": "Jédi",
"friday": "Vandrédi",
"thu": "Jé.",
"fri": "Van.",
"sat": "Sanm.",
- "january": "Janvyé",
- "february": "Févriyé",
- "march": "Mars",
- "april": "Avril",
- "may_long": "Mè",
- "june": "Jen",
- "july": "Jwiyé",
- "august": "Out",
- "september": "Sèptanm",
- "october": "Ã\92ktòb",
- "november": "Novanm",
- "december": "Désanm",
- "january-gen": "Janvyé",
- "february-gen": "Févriyé",
- "march-gen": "Mars",
- "april-gen": "Avril",
- "may-gen": "Mè",
- "june-gen": "Jen",
- "july-gen": "Jwiyé",
- "august-gen": "Out",
- "september-gen": "Sèptanm",
- "october-gen": "Ã\92ktòb",
- "november-gen": "Novanm",
- "december-gen": "Désanm",
- "jan": "Jan.",
+ "january": "janvyé",
+ "february": "févriyé",
+ "march": "mars",
+ "april": "avril",
+ "may_long": "mè",
+ "june": "jen",
+ "july": "jwiyé",
+ "august": "out",
+ "september": "sèptanm",
+ "october": "òktòb",
+ "november": "novanm",
+ "december": "désanm",
+ "january-gen": "janvyé",
+ "february-gen": "févriyé",
+ "march-gen": "mars",
+ "april-gen": "avril",
+ "may-gen": "mè",
+ "june-gen": "jen",
+ "july-gen": "jwiyé",
+ "august-gen": "out",
+ "september-gen": "sèptanm",
+ "october-gen": "òktòb",
+ "november-gen": "novanm",
+ "december-gen": "désanm",
+ "jan": "janv.",
"feb": "Fév.",
- "mar": "Mar.",
- "apr": "Avr.",
- "may": "Mè",
- "jun": "Jen.",
- "jul": "Jwi.",
- "aug": "Out",
- "sep": "Sèp.",
- "oct": "Òkt.",
- "nov": "Nov.",
- "dec": "Dés.",
+ "mar": "mars",
+ "apr": "avr.",
+ "may": "mè",
+ "jun": "jen.",
+ "jul": "jwi.",
+ "aug": "out",
+ "sep": "sèp.",
+ "oct": "òkt.",
+ "nov": "nov.",
+ "dec": "dés.",
+ "january-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} janvyé",
+ "february-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} févriyé",
+ "march-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} mars",
+ "april-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} avril",
+ "may-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} mè",
+ "june-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} jen",
+ "july-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} jwiyé",
+ "august-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} out",
+ "september-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} sèptanm",
+ "october-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} òktòb",
+ "november-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} novanm",
+ "december-date": "{{PLURAL:$1|1=1ᵉʳ|$1}} désanm",
+ "period-am": "AM",
+ "period-pm": "PM",
"pagecategories": "{{PLURAL:$1|Katégori}}",
"category_header": "Paj andan katégori-a « $1 »",
"subcategories": "Soukatégori",
"category-media-header": "Médya andan katégori-a « $1 »",
"category-empty": "<em>Sa katégori pa ka kontni atchwèlman pyès paj ni fiché miltimédya.</em>",
"hidden-categories": "{{PLURAL:$1|Katégori kaché}}",
+ "hidden-category-category": "Katégori kaché",
"category-subcat-count": "Sa katégori {{PLURAL:$2|0=pa ka konprann pyès soukatégori|1=ka konprann sèlman soukatégori ki anba|ka konprann $2 soukatégori, don {{PLURAL:$1|0=pyès|1=sala|$1}} ki anba}}.",
+ "category-subcat-count-limited": "Sa katégori ka konprann {{PLURAL:$1|soukatégori-a|soukatégori-ya}} anba.",
"category-article-count": "Sa katégori {{PLURAL:$2|0=pa ka konprann pyès paj|1=ka konprann sèlman paj ki anba|ka konprann $2 paj, don {{PLURAL:$1|0=pyès|1=sala|$1}} ki anba}}.",
+ "category-article-count-limited": "{{PLURAL:$1|0=Pyès paj ka figiré|1=Paj-a swivant ka figiré|$1 Paj-ya swivant ka figiré}} andan katégori prézant.",
"category-file-count": "Sa katégori {{PLURAL:$2|0=pa ka konprann pyès katégori|1=ka konprann fiché swivan|ka konprann $2 fiché, don {{PLURAL:$1|0=pyès|1=sala|$1}} ki anba}}.",
+ "category-file-count-limited": "{{PLURAL:$1|0=Pyès fiché pa ka figiré|1=Fiché-a swivan ka figiré|$1 Fiché-ya swivan ka figiré}} andan katégori prézant.",
"listingcontinuesabbrev": "(swit)",
+ "index-category": "Paj endèksé",
"noindex-category": "Paj ki pa endèksé",
"broken-file-category": "Paj ké dé lyen di fiché brizé",
"about": "À propo",
+ "article": "Paj di kontni",
"newwindow": "(Ka ouvri so kò andan roun nouvèl finèt)",
"cancel": "Anilé",
+ "moredotdotdot": "Plis...",
+ "morenotlisted": "Sa lis pé sa enkonplèt",
+ "mypage": "Paj",
"mytalk": "Diskisyon",
+ "anontalk": "Diskisyon",
"navigation": "Navigasyon",
"and": " é",
+ "faq": "FAQ",
+ "actions": "Aksyon",
"namespaces": "Lèspas di non",
"variants": "Varyant",
- "navigation-heading": "Menu di navigasyon",
+ "navigation-heading": "Ménou di navigasyon",
+ "errorpagetitle": "Érò",
"returnto": "Rouvini kot paj-a $1.",
"tagline": "Di {{SITENAME}}",
"help": "Èd",
"search": "Sasé",
+ "search-ignored-headings": " #<!-- pa modifyé sa lign --><pre>\n# Tit dé sèksyon ki sa ignoré pa sasé-a.\n# Chanjman éfèktchwé isi ka pran éfè lò ki paj-a ké tit-a sa endèksé.\n# Zòt pé fòrsé réyendèksasyon di paj-a an éfèktchwan oun modifikasyon vid.\n# Sentaks-a sa swivant :\n# * Tousa ki ka swiv roun « # » jouk finisman di lign-a sa roun koumantèr.\n# * Tout lign ki pa-vid sa tit ègzak à ignoré, kas konprann osi.\nRéférans\nLyen èkstèrn\nWè osi\n #</pre><!-- pa modifyé sa lign -->",
"searchbutton": "Sasé",
+ "go": "Konsilté",
"searcharticle": "Kontinwé",
"history": "Istorik di paj-a",
"history_short": "Istorik",
+ "history_small": "istorik",
+ "updatedmarker": "modifyé dipi mo dannyé vizit",
"printableversion": "Vèrsyon enprimab",
"permalink": "Lyen pèrmanan",
+ "print": "Enprimé",
"view": "Lir",
"view-foreign": "Wè asou $1",
"edit": "Modifyé",
+ "edit-local": "Modifyé dèskripsyon lokal",
"create": "Kréyé",
"create-local": "Ajouté roun dèskripsyon lokal",
"delete": "Souprimé",
+ "undelete_short": "Rèstoré {{PLURAL:$1|roun modifikasyon|$1 modifikasyon}}",
+ "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon souprimé|$1 modifikasyon souprimé}}",
+ "protect": "Protéjé",
+ "protect_change": "modifyé",
+ "unprotect": "Chanjé protèksyon-an",
"newpage": "Nouvèl paj",
"talkpagelinktext": "diskisyon",
+ "specialpage": "Paj spésyal",
"personaltools": "Zouti pèrsonèl",
"talk": "Diskisyon",
"views": "Afichaj",
"toolbox": "Zouti",
+ "tool-link-userrights": "Modifyé group-ya di itiliz{{GENDER:$1|ò|ris}}-a",
+ "tool-link-userrights-readonly": "Wè group-ya di itilizat{{GENDER:$1|ò|ris}}",
+ "tool-link-emailuser": "Voyé roun kouryé pou {{GENDER:$1|sa itilizatò|sa itilizatris}}",
+ "imagepage": "Wè paj-a di fiché",
+ "mediawikipage": "Wè paj di mésaj",
+ "templatepage": "Wè paj di modèl",
+ "viewhelppage": "Wè paj di lèd",
+ "categorypage": "Wè paj di katégori",
+ "viewtalkpage": "Wè paj di diskisyon",
"otherlanguages": "Annan rounòt langaj",
"redirectedfrom": "(Roudirijé dipi $1)",
"redirectpagesub": "Paj di roudirèksyon",
"redirectto": "Roudirijé vèr :",
- "lastmodifiedat": "Dannyé modifikasyon di sa paj té fè asou $1 à $2.",
+ "lastmodifiedat": "Dannyé modifikasyon di sa paj té fè $1 à $2.",
+ "viewcount": "Sa paj {{PLURAL:$1|0=pa té janmè konsilté|1=té konsilté roun sèl fwè|té konsilté $1 fwè}}.",
+ "protectedpage": "Paj protéjé",
"jumpto": "Alé à",
"jumptonavigation": "navigasyon",
"jumptosearch": "sasé",
+ "view-pool-error": "Dézolé, sèrvò-ya sa sircharjé pou moman-an.\nTròp itilizatò ka sasé konsilté sa paj.\nSouplé, atann enpé anvan di éséyé òkò d’aksédé à sala.\n\n$1",
+ "generic-pool-error": "Dézolé, sèrvò-ya sa sircharjé pou moman-an.\nTròp itilizatò ka sasé konsilté sa rousours.\nSouplé, atann enpé anvan di tanté òkò d'aksédé à sala.",
+ "pool-timeout": "Délè di atant di vérou dépasé",
+ "pool-queuefull": "Fil dé processus sa plen",
+ "pool-errorunknown": "Éròr enkonèt",
+ "pool-servererror": "Sèrvis di rézèrvasyon pa disponib ($1).",
+ "poolcounter-usage-error": "Éròr di itilizasyon : $1",
"aboutsite": "À propo di {{SITENAME}}",
"aboutpage": "Project:À propo di",
"copyright": "Kontni-a sa disponib anba lisans $1 sof mansyon kontrèr.",
"disclaimers": "Panga",
"disclaimerpage": "Project:Panga jénéral",
"edithelp": "Èd pou modifikasyon",
+ "helppage-top-gethelp": "Èd",
"mainpage": "Paj Prensipal",
"mainpage-description": "Paj prensipal",
+ "policy-url": "Project:Larèl",
"portal": "Pòrtay konminotèr",
"portal-url": "Project:Pòrtay konminotèr",
"privacy": "Politik di konfidansyalité",
"privacypage": "Project:Politik di konfidansyalité",
+ "badaccess": "Éròr di pèrmisyon",
+ "badaccess-group0": "Zòt pa gen drwè sifizan pou réyalizé laksyon doumandé.",
+ "badaccess-groups": "Aksyon-an ki zòt ka éséyé di réyalizé sa pèrmi yenk pou itilizatò-ya {{PLURAL:$2|di group|di roun dé group}} : $1.",
+ "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr",
+ "versionrequiredtext": "Vèrsyon $1 di MediaWiki sa nésésèr pou itilizé sa paj.\nKonsilté [[Special:Version|paj di vèrsyon-yan]].",
+ "ok": "Validé",
"retrievedfrom": "Rékipéré di « $1 »",
"youhavenewmessages": "{{PLURAL:$3|Zòt gen}} $1 ($2).",
"youhavenewmessagesfromusers": "{{PLURAL:$4|Zòt gen}} $1 {{PLURAL:$3|di rounòt itilizatò|di $3 ròt itilizatò}} ($2).",
+ "youhavenewmessagesmanyusers": "Zòt gen $1 di nonbré itilizatò ($2).",
"newmessageslinkplural": "{{PLURAL:$1|oun nouvèl mésaj|dé nouvèl mésaj}}",
"newmessagesdifflinkplural": "{{PLURAL:$1|dannyé modifikasyon}}",
+ "youhavenewmessagesmulti": "Zòt gen dé nouvèl mésaj asou $1.",
"editsection": "Modifyé",
"editold": "modifyé",
"viewsourceold": "wè sours-a",
"viewsourcelink": "wè sours-a",
"editsectionhint": "Modifyé sèksyon-an : $1",
"toc": "Somèr",
+ "showtoc": "afiché",
+ "hidetoc": "maské",
+ "collapsible-collapse": "Roupliyé",
+ "collapsible-expand": "Dévlopé",
+ "confirmable-confirm": "Ès zòt sir{{GENDER:$1||}} ?",
+ "confirmable-yes": "Wi",
+ "confirmable-no": "Awa",
+ "thisisdeleted": "Ès zòt ka déziré afiché ou rèstoré $1 ?",
+ "viewdeleted": "Wè $1 ?",
+ "restorelink": "Wè {{PLURAL:$1|roun modifikasyon éfasé|$1 modifikasyon éfasé}}",
+ "feedlinks": "Flux :",
+ "feed-invalid": "Tip di flux d'abonnman pa valid.",
+ "feed-unavailable": "Flux-ya di sendikasyon pa disponib",
+ "site-rss-feed": "Flux RSS di $1",
"site-atom-feed": "Flux Atom di $1",
+ "page-rss-feed": "Flux RSS di « $1 »",
"page-atom-feed": "Flux Atom di « $1 »",
"red-link-title": "$1 (paj pa ka ègzisté)",
+ "sort-descending": "Tri dékrwasan",
+ "sort-ascending": "Tri krwasan",
"nstab-main": "Paj",
"nstab-user": "Paj di {{GENDER:{{ROOTPAGENAME}}|itilizatò|itilizatris}}",
+ "nstab-media": "Médja",
"nstab-special": "Paj spésyal",
"nstab-project": "À propo",
"nstab-image": "Fiché",
"nstab-mediawiki": "Mésaj",
"nstab-template": "Modèl",
+ "nstab-help": "Èd",
"nstab-category": "Katégori",
"mainpage-nstab": "Paj prensipal",
+ "nosuchaction": "Aksyon enkonèt",
+ "nosuchactiontext": "Aksyon-an spésifyé andan URL-a sa envalid.\nZòt pitèt mal antré URL-a ou swivi roun lyen éroné.\nLi pé égalman endiké oun anomali andan logisyèl itilizé pa {{SITENAME}}.",
"nosuchspecialpage": "Paj spésyal inègzistant",
"nospecialpagetext": "<strong>Zòt doumandé oun paj spésyal ki pa ka ègzisté.</strong>\n\nOun lis dé paj spésyal valid ka trouvé so kò asou [[Special:SpecialPages|{{int:specialpages}}]].",
+ "error": "Érò",
+ "databaseerror": "Érò di baz di doné",
+ "databaseerror-text": "Oun érò di rékèt di baz di doné aparèt.\nSala pé provini di roun anomali annan lojisyèl-a.",
+ "databaseerror-textcl": "Oun érò di rékèt di baz di doné aparèt.",
+ "databaseerror-query": "Rékèt : $1",
+ "databaseerror-function": "Fonksyon : $1",
+ "databaseerror-error": "Érò : $1",
+ "transaction-duration-limit-exceeded": "Pou évité roun tròp fò ogmantasyon di délè di réplikasyon, sa tranzaksyon té anilé piskétan douré di ékritir ($1) dépasé limit-a di $2 ségonn. Si zòt ka sasé modifyé oun gran nonm di éléman similtanéman, éséyé plito di éfèktchwé opérasyon-an an plizyò étap pli piti.",
+ "laggedslavemode": "Panga, sa paj pa pé kontni tout dannyé modifikasyon éfèktchwé",
+ "readonly": "Baz di doné vérouyé",
+ "enterlockreason": "Endiké rézon-an di vérouyaj ensi ki roun èstimasyon di so douré",
+ "readonlytext": "Ajou ké mizajou di baz di doné sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré andan lòrd.\n\nAdministratò sistèm ki vérouyé baz di doné té fourni èksplikasyon swivant :<br /> $1",
+ "missing-article": "Baz-a di doné pa trouvé tèks-a di roun paj ki li té divèt trouvé, entitilé « $1 » $2.\n\nJénéralman, sala ka sirviv an swivan roun lyen vèr roun diff périmé ou vèr listorik di roun paj souprimé.\n\nSi a pa sa ki la, zòt pitèt trouvé roun anomali annan program-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.",
+ "missingarticle-rev": "(niméro di vèrsyon : $1)",
+ "missingarticle-diff": "(diff : $1, $2)",
+ "readonly_lag": "Baz-a di doné té otomatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal",
+ "nonwrite-api-promise-error": "Ankèt-a HTTP « <code>Promise-Non-Write-API-Action:</code> » té voyé mè rékèt-a té fè à oun modjoul di ékritir di API-a.",
+ "internalerror": "Érò entèrn",
+ "internalerror_info": "Érò entèrn : $1",
+ "internalerror-fatal-exception": "Érò fatal di tip « $1 »",
+ "filecopyerror": "Enposib di kopyé fiché-a « $1 » vèr « $2 ».",
+ "filerenameerror": "Enposib di rounonmen fiché-a « $1 » an « $2 ».",
+ "filedeleteerror": "Enposib di souprimé fiché-a « $1 ».",
+ "directorycreateerror": "Enposib di kréyé répèrtwar-a « $1 ».",
+ "directoryreadonlyerror": "Répèrtwar-a « $1 » sa an lèktir sèl.",
+ "directorynotreadableerror": "Répèrtwar-a « $1 » pa lizib.",
+ "filenotfound": "Enposib di trouvé fiché-a « $1 ».",
+ "unexpected": "Valò ki pa nòrmal : « $1 » = « $2 ».",
+ "formerror": "Érò : enposib di soumèt fòrmilèr-a.",
+ "badarticleerror": "Sa aksyon pa pé sa éfèktchwé asou sa paj.",
+ "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »",
"badtitle": "Movè tit",
"badtitletext": "Tit di paj doumandé pa valid, vid, ou mal formé si a roun tit entèr-lanng ou entèr-projè.\nI ka kontni pitèt oun ou plizyò karaktèr ki pa pé sa itilizé andan tit-ya.",
"viewsource": "Wè tèks sours",
"tooltip-ca-move": "Rounonmen sa paj",
"tooltip-ca-watch": "Ajouté sa paj annan zòt lis di swivi",
"tooltip-ca-unwatch": "Routiré sa paj di zòt lis di swivi",
- "tooltip-search": "Sasé andan {{SITENAME}}",
+ "tooltip-search": "Sasé annan {{SITENAME}}",
"tooltip-search-go": "Aksédé à roun paj di menm non si li ka ègzisté",
"tooltip-search-fulltext": "Sasé paj-ya ka konpòrté sa tèks.",
"tooltip-p-logo": "Vizité paj prensipal-a",
"logentry-newusers-autocreate": "Kont $1 {{GENDER:$2|té kréyé}} otomatikman",
"logentry-upload-upload": "$1 {{GENDER:$2|té télévèrsé}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|télévèrsé}} oun nouvèl vèrsyon di $3",
- "searchsuggest-search": "Sasé andan {{SITENAME}}",
+ "searchsuggest-search": "Sasé annan {{SITENAME}}",
"duration-days": "$1 jou{{PLURAL:$1|}}",
"randomrootpage": "Paj rakaba aléyatwar"
}
"tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
"underline-always": "תמיד",
"underline-never": "לעולם לא",
- "underline-default": "ברירת המחדל של העיצוב או הדפדפן",
+ "underline-default": "×\91ר×\99רת ×\94×\9e×\97×\93×\9c ש×\9c ×\94×¢×\99צ×\95×\91 ×\90×\95 ש×\9c ×\94×\93פ×\93פ×\9f",
"editfont-style": "הגופן בתיבת העריכה:",
"editfont-monospace": "גופן ברוחב קבוע (monospace)",
- "editfont-sansserif": "×\92×\95פ×\9f ×\9c×\90 ×\9e×¢×\95צ×\91 (sans-serif)",
- "editfont-serif": "×\92×\95פ×\9f ×\9e×¢×\95צ×\91 (serif)",
+ "editfont-sansserif": "×\92×\95פ×\9f ×\9c×\9c×\90 ת×\92×\99×\9d",
+ "editfont-serif": "×\92×\95פ×\9f ×¢×\9d ת×\92×\99×\9d",
"sunday": "ראשון",
"monday": "שני",
"tuesday": "שלישי",
"redirectedfrom": "(הופנה מהדף $1)",
"redirectpagesub": "דף הפניה",
"redirectto": "הפניה ל:",
- "lastmodifiedat": "דף זה נערך לאחרונה ב־$1, בשעה $2.",
+ "lastmodifiedat": "דף זה נערך לאחרונה ב־$2, $1.",
"viewcount": "דף זה נצפה {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}.",
"protectedpage": "דף מוגן",
"jumpto": "קפיצה אל:",
"generic-pool-error": "מצטערים, השרתים עמוסים כרגע.\nיותר מדי משתמשים מנסים לצפות במשאב הזה.\nנא להמתין זמן מה ולאחר מכן לנסות שוב.",
"pool-timeout": "זמן ההמתנה לסיום הנעילה עבר",
"pool-queuefull": "התור מלא",
- "pool-errorunknown": "שגיאה בלתי ידועה",
+ "pool-errorunknown": "שגיאה בלתי־ידועה",
"pool-servererror": "שירות המנייה אינו זמין ($1).",
"poolcounter-usage-error": "שגיאת שימוש: $1",
"aboutsite": "אודות {{SITENAME}}",
"delete-hook-aborted": "המחיקה הופסקה על־ידי מבנה Hook.\nלא ניתן הסבר.",
"no-null-revision": "לא ניתן היה ליצור גרסת־דמה בדף \"$1\"",
"badtitle": "כותרת שגויה",
- "badtitletext": "כותרת הדף המבוקש הייתה בלתי תקינה, ריקה, או קישור שגוי לשפה אחרת או למיזם אחר.\nייתכן שהיא מכילה תו אחד או יותר שאינו יכול לשמש בכותרות.",
+ "badtitletext": "כותרת הדף המבוקש הייתה בלתי־תקינה, ריקה, או קישור שגוי לשפה אחרת או למיזם אחר.\nייתכן שהיא מכילה תו אחד או יותר שאינו יכול לשמש בכותרות.",
"title-invalid-empty": "כותרת הדף המבוקש ריקה או מכילה רק שם של מרחב שם.",
"title-invalid-utf8": "כותרת הדף המבוקש מכילה רצף UTF-8 בלתי תקין.",
"title-invalid-interwiki": "כותרת הדף המבוקש מכילה קישור בינוויקי, שלא ניתן להשתמש בו בכותרות.",
"title-invalid-talk-namespace": "כותרת הדף המבוקש מפנה לדף שיחה שאינו יכול להתקיים.",
- "title-invalid-characters": "כותרת הדף המבוקש מכילה תווים בלתי תקינים: \"$1\".",
+ "title-invalid-characters": "כותרת הדף המבוקש מכילה תווים בלתי־תקינים: \"$1\".",
"title-invalid-relative": "בכותרת יש נתיב יחסי. כותרות דפים יחסיות (./, ../) אינן תקינות, כיוון שלעתים קרובות לא ניתן יהיה לגשת אליהן אם הן יטופלו בידי הדפדפן של המשתמש.",
"title-invalid-magic-tilde": "כותרת הדף המבוקש מכילה רצף טילדות מיוחד שאינו תקין (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "כותרת הדף המבוקש ארוכה מדי. היא צריכה להיות לכל היותר באורך של {{PLURAL:$1|בית אחד|$1 בתים}} בקידוד UTF-8.",
- "title-invalid-leading-colon": "כותרת הדף המבוקש מכילה תו נקודתיים בלתי תקין בתחילתה.",
+ "title-invalid-leading-colon": "כותרת הדף המבוקש מכילה תו נקודתיים בלתי־תקין בתחילתה.",
"perfcached": "המידע הבא הוא עותק שמור בזיכרון המטמון, ועשוי שלא להיות מעודכן. לכל היותר {{PLURAL:$1|תוצאה אחת נשמרת|$1 תוצאות נשמרות}} בזיכרון המטמון.",
"perfcachedts": "המידע הבא הוא עותק שמור בזיכרון המטמון, שעודכן לאחרונה ב־$1. לכל היותר {{PLURAL:$4|תוצאה אחת נשמרת|$4 תוצאות נשמרות}} בזיכרון המטמון.",
- "querypage-no-updates": "×\94×¢×\93×\9b×\95× ×\99×\9d ×\9c×\93×£ ×\96×\94 ×\9bר×\92×¢ ×\9e×\95פסק×\99×\9d, ×\95המידע לא יעודכן באופן שוטף.",
+ "querypage-no-updates": "×\94×¢×\93×\9b×\95× ×\99×\9d ×\9c×\93×£ ×\94×\96×\94 ×\9e×\95פסק×\99×\9d ×\9bר×\92×¢.\nהמידע לא יעודכן באופן שוטף.",
"viewsource": "הצגת מקור",
"viewsource-title": "הצגת המקור של הדף \"$1\"",
"actionthrottled": "הפעולה הוגבלה",
"protectedinterface": "דף זה הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
"editinginterface": "<strong>אזהרה:</strong> דף זה הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
"translateinterface": "כדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
- "cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
- "namespaceprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
- "customcssprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את דף ה־CSS הזה, משום שהוא מכיל הגדרות אישיות של משתמש אחר.",
- "customjsprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את דף ה־JavaScript הזה, משום שהוא מכיל הגדרות אישיות של משתמש אחר.",
- "mycustomcssprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את דף ה־CSS הזה.",
- "mycustomjsprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את דף ה־JavaScript הזה.",
- "myprivateinfoprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את המידע הפרטי {{GENDER:|שלך|שלך|שלכם}}.",
- "mypreferencesprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך את ההעדפות {{GENDER:|שלך|שלך|שלכם}}.",
+ "cascadeprotected": "דף זה מוגן מפני עריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
+ "namespaceprotected": "אין לך הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
+ "customcssprotected": "אין לך הרשאה לערוך את דף ה־CSS הזה, משום שהוא מכיל הגדרות אישיות של משתמש אחר.",
+ "customjsonprotected": "אין לך הרשאה לערוך את דף ה־JSON הזה, משום שהוא מכיל הגדרות אישיות של משתמש אחר.",
+ "customjsprotected": "אין לך הרשאה לערוך את דף ה־JavaScript הזה, משום שהוא מכיל הגדרות אישיות של משתמש אחר.",
+ "mycustomcssprotected": "אין לך הרשאה לערוך את דף ה־CSS הזה.",
+ "mycustomjsonprotected": "אין לך הרשאה לערוך את דף ה־JSON הזה.",
+ "mycustomjsprotected": "אין לך הרשאה לערוך את דף ה־JavaScript הזה.",
+ "myprivateinfoprotected": "אין לך הרשאה לערוך את המידע הפרטי שלך.",
+ "mypreferencesprotected": "אין לך הרשאה לערוך את ההעדפות שלך.",
"ns-specialprotected": "לא ניתן לערוך דפים מיוחדים.",
"titleprotected": "[[User:$1|$1]] {{GENDER:$1|הפעיל|הפעילה}} על הדף הזה הגנה מפני יצירה.\nהסיבה שניתנה להגנה היא: <em>$2</em>.",
- "filereadonlyerror": "לא ניתן לשנות את הקובץ \"$1\" כיוון שמאגר הקבצים \"$2\" במצב קריאה בלבד.\n\nמנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: \"'''$3'''\".",
- "invalidtitle-knownnamespace": "×\9b×\95תרת ×\91×\9cת×\99־תק×\99× ×\94 ×¢×\9d ×\9eר×\97×\91 ×\94ש×\9d \"$2\" ×\95ש×\9d דף \"$3\"",
- "invalidtitle-unknownnamespace": "×\9b×\95תרת ×\91×\9cת×\99־תק×\99× ×\94 ×¢×\9d ×\9eר×\97×\91 ש×\9d ×\91×\9cת×\99Ö¾×\99×\93×\95×¢ ×\9eספר $1 ×\95ש×\9d דף \"$2\"",
+ "filereadonlyerror": "לא ניתן לשנות את הקובץ \"$1\" כיוון שמאגר הקבצים \"$2\" במצב קריאה בלבד.\n\nמנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: \"$3\".",
+ "invalidtitle-knownnamespace": "×\9b×\95תרת ×\91×\9cת×\99־תק×\99× ×\94 ×¢×\9d ×\9eר×\97×\91 ×\94ש×\9d \"$2\" ×\95×¢×\9d ש×\9d ×\94דף \"$3\"",
+ "invalidtitle-unknownnamespace": "×\9b×\95תרת ×\91×\9cת×\99־תק×\99× ×\94 ×¢×\9d ×\9eר×\97×\91 ש×\9d ×\91×\9cת×\99Ö¾×\99×\93×\95×¢ ×\9eספר $1 ×\95×¢×\9d ש×\9d ×\94דף \"$2\"",
"exception-nologin": "לא בחשבון",
"exception-nologin-text": "נדרשת כניסה לחשבון כדי לראות את הדף הזה או לבצע את הפעולה הזאת.",
"exception-nologin-text-manual": "נדרשת $1 כדי לראות את הדף הזה או לבצע את הפעולה הזאת.",
- "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
+ "virus-badscanner": "הגדרות שגויות: סורק הווירוסים אינו ידוע: <em>$1</em>",
"virus-scanfailed": "הסריקה נכשלה (קוד: $1)",
"virus-unknownscanner": "אנטי־וירוס בלתי ידוע:",
"logouttext": "<strong>יצאתם מהחשבון.</strong>\n\nשימו לב שייתכן שדפים מסוימים ימשיכו להיות מוצגים כאילו אתם עדיין מחוברים לחשבון, עד שתנקו את המטמון של הדפדפן שלכם.",
"cannotlogoutnow-title": "לא ניתן לצאת מהחשבון עכשיו",
- "cannotlogoutnow-text": "היציאה אינה אפשרית בעת שימוש ב{{GRAMMAR:תחילית|$1}}.",
+ "cannotlogoutnow-text": "×\94×\99צ×\99×\90×\94 ×\9e×\94×\97ש×\91×\95×\9f ×\90×\99× ×\94 ×\90פשר×\99ת ×\91עת ש×\99×\9e×\95ש ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|$1}}.",
"welcomeuser": "ברוך בואך, $1!",
- "welcomecreation-msg": "חשבונך נוצר.\nבאפשרותך להתאים את [[Special:Preferences|ההעדפות]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.",
+ "welcomecreation-msg": "חשבונך נוצר.\nבאפשרותך להתאים את ה[[Special:Preferences|העדפות]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.",
"yourname": "שם משתמש:",
"userlogin-yourname": "שם משתמש",
"userlogin-yourname-ph": "יש להקליד את שם המשתמש",
"userlogin-signwithsecure": "שימוש בחיבור מאובטח",
"cannotlogin-title": "לא ניתן להיכנס לחשבון",
"cannotlogin-text": "הכניסה לחשבון אינה אפשרית.",
- "cannotloginnow-title": "לא ניתן להיכנס עכשיו",
- "cannotloginnow-text": "הכניסה אינה אפשרית בעת שימוש ב{{GRAMMAR:תחילית|$1}}.",
+ "cannotloginnow-title": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×\99×\9b× ×¡ ×\9c×\97ש×\91×\95×\9f ×¢×\9bש×\99×\95",
+ "cannotloginnow-text": "×\94×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f ×\90×\99× ×\94 ×\90פשר×\99ת ×\91עת ש×\99×\9e×\95ש ×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|$1}}.",
"cannotcreateaccount-title": "לא ניתן ליצור חשבונות",
"cannotcreateaccount-text": "יצירת חשבונות באופן ישיר אינה מותרת באתר זה.",
"yourdomainname": "המתחם שלך:",
"userlogin-resetpassword-link": "שכחת את הסיסמה?",
"userlogin-helplink2": "עזרה בכניסה לחשבון",
"userlogin-loggedin": "אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.\nהשתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.",
- "userlogin-reauth": "עליכם להיכנס לחשבון כדי לאמת שאתם באמת {{GENDER:$1|$1}}.",
+ "userlogin-reauth": "{{GENDER:$1|עליך|עלייך}} להיכנס לחשבון כדי לאמת {{GENDER:$1|שאתה|שאת}} באמת $1.",
"userlogin-createanother": "יצירת חשבון אחר",
"createacct-emailrequired": "כתובת דוא\"ל",
"createacct-emailoptional": "כתובת דוא\"ל (לא חובה)",
"createacct-email-ph": "יש להקליד את כתובת הדוא\"ל שלך",
"createacct-another-email-ph": "יש להקליד כתובת דוא\"ל",
"createaccountmail": "שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא\"ל שצוינה",
- "createaccountmail-help": "×\99×\9b×\95×\9c ×\9cש×\9eש ×\9c×\99צ×\99רת ×\97ש×\91×\95×\9f ×\9c×\90×\93×\9d ×\90×\97ר ×\91×\9c×\99 ×\9c×\91רר ×\9e×\94 ×\94ססמה.",
+ "createaccountmail-help": "×\99×\9b×\95×\9c ×\9cש×\9eש ×\9c×\99צ×\99רת ×\97ש×\91×\95×\9f ×¢×\91×\95ר ×\90×\93×\9d ×\90×\97ר ×\91×\9c×\99 ×\9c×\9c×\9e×\95×\93 ×\90ת ×\94ס×\99סמה.",
"createacct-realname": "שם אמיתי (לא חובה)",
"createacct-reason": "סיבה",
"createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
"createacct-benefit-body1": "{{PLURAL:$1|עריכה|עריכות}}",
"createacct-benefit-body2": "{{PLURAL:$1|דף|דפים}}",
"createacct-benefit-body3": "{{PLURAL:$1|תורם|תורמים}} לאחרונה",
- "badretype": "×\94ס×\99ס×\9e×\90×\95ת ש×\94×\96× ×ª ×\90×\99× ×\9f ×\9eת×\90×\99מות.",
+ "badretype": "×\94ס×\99ס×\9e×\90×\95ת ש×\94×\96× ×ª ×\90×\99× ×\9f ת×\95×\90מות.",
"usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
"userexists": "שם המשתמש שבחרת כבר נמצא בשימוש.\nנא לבחור שם אחר.",
"loginerror": "שגיאה בכניסה לחשבון",
"createacct-loginerror": "החשבון נוצר בהצלחה, אבל לא ניתן היה להיכנס אליו באופן אוטומטי. נא [[Special:UserLogin|להיכנס באופן ידני]].",
"noname": "לא הזנת שם משתמש תקין.",
"loginsuccesstitle": "נכנסת לחשבון",
- "loginsuccess": "'''נכנסת ל{{grammar:תחילית|{{SITENAME}}}} בשם \"$1\".'''",
- "nosuchuser": "אין משתמש בשם \"$1\".\nשימו לב ששמות משתמשים הם תלויי־רישיות.\nאנא בִדקו את האיות של שם המשתמש, או [[Special:CreateAccount|צרו חשבון חדש]].",
+ "loginsuccess": "<strong>נכנסת ל{{GRAMMAR:תחילית|{{SITENAME}}}} בשם \"$1\".</strong>",
+ "nosuchuser": "אין משתמש בשם \"$1\".\nשימו לב ששמות משתמשים הם תלויי־רישיות.\nאנא בדקו את האיות של שם המשתמש, או [[Special:CreateAccount|צרו חשבון חדש]].",
"nosuchusershort": "אין משתמש בשם \"$1\".\nנא לוודא שהאיות נכון.",
"nouserspecified": "יש לציין שם משתמש.",
- "login-userblocked": "×\9eשת×\9eש ×\96×\94 ×\97ס×\95×\9d. ×\90×\99× ×\9b×\9d ×\9e×\95רש×\99×\9d להיכנס לחשבון.",
+ "login-userblocked": "×\9eשת×\9eש ×\96×\94 ×\97ס×\95×\9d. ×\90×\99×\9f ×\90פשר×\95ת להיכנס לחשבון.",
"wrongpassword": "שם המשתמש או הסיסמה שהזנת שגויים.\nנא לנסות שוב.",
"wrongpasswordempty": "הסיסמה שהזנת ריקה.\nנא לנסות שוב.",
"passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
"password-login-forbidden": "השימוש בשם המשתמש והסיסמה האלה נאסר.",
"mailmypassword": "איפוס סיסמה",
"passwordremindertitle": "סיסמה זמנית חדשה מ{{grammar:תחילית|{{SITENAME}}}}",
- "passwordremindertext": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש סיסמה\nחדשה לכניסה לחשבון ב{{GRAMMAR:תחילית|{{SITENAME}}}} ($4). נוצרה סיסמה זמנית למשתמש \"$2\",\nוסיסמה זו היא \"$3\". אם זו הייתה כוונתכם, תוכלו כעת להיכנס לחשבון ולבחור סיסמה חדשה.\nהסיסמה הזמנית שלכם תפקע תוך {{PLURAL:$5|יום אחד|יומיים|$5 ימים}}.\n\nעליכם להיכנס לאתר ולשנות את סיסמתכם בהקדם האפשרי. אם מישהו אחר ביקש סיסמה חדשה זו או אם נזכרתם בסיסמתכם\nואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמתכם הישנה.",
+ "passwordremindertext": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש סיסמה\nחדשה לכניסה לחשבון ב{{GRAMMAR:תחילית|{{SITENAME}}}}‏ ($4). נוצרה סיסמה זמנית למשתמש \"$2\",\nוסיסמה זו היא \"$3\". אם זו הייתה כוונתכם, עליכם להיכנס עכשיו לחשבון ולבחור סיסמה חדשה.\nהסיסמה הזמנית שלכם תפקע תוך {{PLURAL:$5|יום אחד|יומיים|$5 ימים}}.\n\nאם מישהו אחר ביקש סיסמה חדשה זו, או אם נזכרתם בסיסמתכם\nואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו\nולהמשיך להשתמש בסיסמתכם הישנה.",
"noemail": "לא רשומה כתובת דואר אלקטרוני עבור ה{{GENDER:$1|משתמש|משתמשת}} \"$1\".",
"noemailcreate": "יש לספק כתובת דואר אלקטרוני תקינה.",
"passwordsent": "סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור \"$1\".\nאנא היכנסו חזרה לאתר אחרי שתקבלו אותה.",
"blocked-mailpassword": "כתובת ה־IP שלך נחסמה מעריכה. כדי למנוע ניצול לרעה, אינך מורשה להשתמש באפשרות שחזור הסיסמה.",
- "eauthentsent": "דוא\"ל אימות נשלח לכתובת הדוא\"ל שצוינה.\nלפני שדברי דוא\"ל אחרים יישלחו לחשבון הזה, יהיה עליכם לפעול לפי ההוראות בדוא\"ל, כדי לאשר שהחשבון אכן שייך לכם.",
+ "eauthentsent": "דוא\"ל אימות נשלח לכתובת הדוא\"ל שצוינה.\nלפני שדברי דוא\"ל אחרים יישלחו לחשבון הזה, יהיה {{GENDER:|עליך|עלייך}} לפעול לפי ההוראות בדוא\"ל, כדי לאשר שהחשבון אכן שייך לך.",
"throttled-mailpassword": "כבר נשלח דוא\"ל לאיפוס הסיסמה ב{{PLURAL:$1|שעה האחרונה|שעתיים האחרונות|־$1 השעות האחרונות}}.\nכדי למנוע ניצול לרעה, יכול להישלח רק דוא\"ל אחד כזה בכל {{PLURAL:$1|שעה|שעתיים|$1 שעות}}.",
- "mailerror": "שגיאה בשליחת דואר: $1",
+ "mailerror": "שגיאה בשליחת דוא\"ל: $1",
"acct_creation_throttle_hit": "מבקרים באתר זה דרך כתובת ה־IP שלך כבר יצרו {{PLURAL:$1|חשבון אחד|$1 חשבונות}} במהלך $2. זהו המקסימום המותר בתקופה זו.\nלפיכך, כרגע לא ניתן ליצור חשבונות נוספים מכתובת ה־IP הזו.",
- "emailauthenticated": "כתובת הדוא\"ל שלך אומתה ב־$2 בשעה $3.",
- "emailnotauthenticated": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ש×\9c×\9b×\9d ×¢×\93×\99×\99×\9f ×\9c×\90 ×\90×\95×\9eת×\94.\n×\9c×\90 ×\99×\99ש×\9c×\97 ×\90×\9c×\99×\9b×\9d דוא\"ל עבור אף אחת מהתכונות הבאות.",
+ "emailauthenticated": "כתובת הדוא\"ל שלך אומתה ב־$3, $2.",
+ "emailnotauthenticated": "×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ש×\9c×\9a ×¢×\93×\99×\99×\9f ×\9c×\90 ×\90×\95×\9eת×\94.\n×\9c×\90 ×\99×\99ש×\9c×\97 {{GENDER:|×\90×\9c×\99×\9a|×\90×\9c×\99×\99×\9a}} דוא\"ל עבור אף אחת מהתכונות הבאות.",
"noemailprefs": "יש לציין כתובת דוא\"ל בהעדפות שלך כדי שתכונות אלה יעבדו.",
"emailconfirmlink": "אישור כתובת הדוא\"ל שלך",
"invalidemailaddress": "כתובת הדוא\"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא חוקי.\nיש להקליד כתובת תקינה או להשאיר את השדה ריק.",
- "cannotchangeemail": "×\9c×\90 × ×\99ת×\9f ×\9c×©× ×\95ת ×\90ת ×\9bת×\95×\91×\95ת ×\94×\93×\95×\90\"×\9c ש×\9c ×\97ש×\91×\95× ×\95ת ×\91×\90תר ×\95×\99ק×\99 זה.",
+ "cannotchangeemail": "×\9c×\90 × ×\99ת×\9f ×\9c×©× ×\95ת ×\90ת ×\9bת×\95×\91×\95ת ×\94×\93×\95×\90\"×\9c ש×\9c ×\97ש×\91×\95× ×\95ת ×\91×\90תר ×\94×\95×\95×\99ק×\99 ×\94זה.",
"emaildisabled": "אתר זה לא יכול לשלוח דואר אלקטרוני.",
"accountcreated": "החשבון נוצר",
"accountcreatedtext": "חשבון המשתמש [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|שיחה]]) נוצר.",
"createaccount-title": "יצירת חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
- "createaccount-text": "×\9e×\99ש×\94×\95 ×\99צר ×\97ש×\91×\95×\9f ×\91ש×\9d $2 ×\91{{grammar:ת×\97×\99×\9c×\99ת|{{SITENAME}}}} ($4), ×\95×\94ס×\99ס×\9e×\94 ×\94×\96×\9e× ×\99ת ש×\9c ×\94×\97ש×\91×\95×\9f ×\94×\99×\90 \"$3\". ×¢×\9c×\99×\9b×\9d ×\9c×\94×\99×\9b× ×¡ ×\95×\9c×©× ×\95ת ×¢×\9bש×\99×\95 ×\90ת ×\94ס×\99ס×\9e×\94.\n\n×\91×\90פשר×\95ת×\9b×\9d להתעלם מהודעה זו, אם החשבון נוצר בטעות.",
- "login-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
- "login-abort-generic": "כניסתך לחשבון לא הצליחה - היא הופסקה",
- "login-migrated-generic": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ש×\9c×\9a ×\94×\95×¢×\91ר, ×\95ש×\9d ×\94×\9eשת×\9eש ש×\9c×\9a ×\9b×\91ר ×\9c×\90 ק×\99×\99×\9d ×\91×\90תר ×\95×\99ק×\99 זה.",
+ "createaccount-text": "×\9e×\99ש×\94×\95 ×\99צר ×¢×\91×\95ר×\9a ×\97ש×\91×\95×\9f ×\91ש×\9d \"$2\" ×\91×\90תר {{SITENAME}}‏ ($4), ×\95×\94ס×\99ס×\9e×\94 ×\94×\96×\9e× ×\99ת ש×\9c ×\94×\97ש×\91×\95×\9f ×\94×\99×\90 \"$3\".\n× ×\90 ×\9c×\94×\99×\9b× ×¡ ×\9c×\97ש×\91×\95×\9f ×¢×\9bש×\99×\95 ×\95×\9c×©× ×\95ת ×\90ת ×\94ס×\99ס×\9e×\94.\n\n×\91×\90פשר×\95ת×\9a להתעלם מהודעה זו, אם החשבון נוצר בטעות.",
+ "login-throttled": "ביצעת לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nנא להמתין $1 ולאחר מכן לנסות שוב.",
+ "login-abort-generic": "כניסתך לחשבון לא הצליחה – היא הופסקה",
+ "login-migrated-generic": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ש×\9c×\9a ×\94×\95×¢×\91ר, ×\95ש×\9d ×\94×\9eשת×\9eש ש×\9c×\9a ×\9b×\91ר ×\9c×\90 ק×\99×\99×\9d ×\91×\90תר ×\94×\95×\95×\99ק×\99 ×\94זה.",
"loginlanguagelabel": "שפה: $1",
- "suspicious-userlogout": "בקשתך לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על־ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.",
+ "suspicious-userlogout": "×\91קשת×\9a ×\9cצ×\90ת ×\9e×\94×\97ש×\91×\95×\9f × ×\93×\97ת×\94 ×\9b×\99×\95×\95×\9f ×©× ×¨×\90×\94 ש×\94×\99×\90 × ×©×\9c×\97×\94 ×¢×\9cÖ¾×\99×\93×\99 ×\93פ×\93פ×\9f ש×\91×\95ר ×\90×\95 ×¢×\9cÖ¾×\99×\93×\99 שרת פר×\95קס×\99 ×¢×\9d ×\96×\99×\9bר×\95×\9f ×\9e×\98×\9e×\95×\9f.",
"createacct-another-realname-tip": "לא חובה למלא את השם האמיתי.\nאם סופק, הוא עשוי לשמש כדי לייחס לך את עבודתך.",
"pt-login": "כניסה לחשבון",
"pt-login-button": "כניסה לחשבון",
"user-mail-no-addy": "ניסיון לשלוח דוא\"ל ללא כתובת דוא\"ל.",
"user-mail-no-body": "ניסיון לשלוח דוא\"ל עם תוכן ריק או קצר מאוד.",
"changepassword": "שינוי סיסמה",
- "resetpass_announce": "כדי לסיים את הכניסה, עליכם להגדיר סיסמה חדשה.",
- "resetpass_text": "<!-- ×\94×\95ס×\99פ×\95 טקסט כאן -->",
+ "resetpass_announce": "כדי לסיים את הכניסה לחשבון, יש להגדיר סיסמה חדשה.",
+ "resetpass_text": "<!-- ×\99ש ×\9c×\94×\95ס×\99×£ טקסט כאן -->",
"resetpass_header": "שינוי סיסמת החשבון",
"oldpassword": "סיסמה ישנה:",
"newpassword": "סיסמה חדשה:",
"retypenew": "חזרה על הסיסמה החדשה:",
"resetpass_submit": "הגדרת הסיסמה וכניסה לחשבון",
"changepassword-success": "סיסמתך שונתה!",
- "changepassword-throttled": "ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nאנא המתינו $1 לפני שתנסו שוב.",
- "botpasswords": "ססמאות בוט",
- "botpasswords-summary": "<em>סס×\9e×\90×\95ת ×\91×\95×\98</em> ×\9e×\90פשר×\95ת ×\9b× ×\99ס×\94 ×\9c×\97ש×\91×\95×\9f ×\9eשת×\9eש ×\91×\90×\9eצע×\95ת API, ×\9c×\9c×\90 ש×\99×\9e×\95ש ×\91× ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת ×\94ר×\90ש×\99×\99×\9d ש×\9c ×\94×\97ש×\91×\95×\9f. × ×\99ת×\9f ×\9c×\94×\92×\91×\99×\9c ×\90ת ×\94רש×\90×\95ת ×\94×\9eשת×\9eש ×\94×\96×\9e×\99× ×\95ת ×\9b×\90שר × ×\9b× ×¡×\99×\9d ×¢×\9d סס×\9eת ×\91×\95×\98.",
- "botpasswords-disabled": "אפשרות השימוש בססמאות בוט מבוטלת.",
- "botpasswords-no-central-id": "כדי להשתמש בססמאות בוט, יש להיכנס עם חשבון משתמש מאוחד.",
- "botpasswords-existing": "ססמאות בוט קיימות",
- "botpasswords-createnew": "יצירת ססמת בוט חדשה",
- "botpasswords-editexisting": "עריכת ססמת בוט קיימת",
+ "changepassword-throttled": "ביצעת לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.\nנא להמתין $1 ולאחר מכן לנסות שוב.",
+ "botpasswords": "ס×\99ס×\9e×\90×\95ת ×\91×\95×\98",
+ "botpasswords-summary": "<em>ס×\99ס×\9e×\90×\95ת ×\91×\95×\98</em> ×\9e×\90פשר×\95ת ×\9c×\94×\99×\9b× ×¡ ×\9c×\97ש×\91×\95×\9f ×\9eשת×\9eש ×\91×\90×\9eצע×\95ת API, ×\9c×\9c×\90 ש×\99×\9e×\95ש ×\91× ×ª×\95× ×\99 ×\94×\94×\96×\93×\94×\95ת ×\94ר×\90ש×\99×\99×\9d ש×\9c ×\94×\97ש×\91×\95×\9f. × ×\99ת×\9f ×\9c×\94×\92×\91×\99×\9c ×\90ת ×\94רש×\90×\95ת ×\94×\9eשת×\9eש ×\94×\96×\9e×\99× ×\95ת ×\9b×\90שר × ×\9b× ×¡×\99×\9d ×¢×\9d ס×\99ס×\9eת ×\91×\95×\98.\n\n×\90×\9d {{GENDER:|×\90×\99× ×\9a ×\99×\95×\93×¢|×\90×\99× ×\9a ×\99×\95×\93עת|×\90×\99× ×\9b×\9d ×\99×\95×\93×¢×\99×\9d}} ×\9e×\94×\99 ×\94×\9e×\98ר×\94 ש×\9c ×\9b×\9c×\99 ×\96×\94, רצ×\95×\99 ×\9c×\94×\99×\9e× ×¢ ×\9eש×\99×\9e×\95ש ×\91×\95. ×\9c×¢×\95×\9c×\9d ×\90×\9c {{GENDER:|ת×\99ת×\9f|ת×\99×ª× ×\99|ת×\99×ª× ×\95}} ×\9c×\9e×\99ש×\94×\95 ×\90×\97ר ×\90×£ ×\90×\97ת ×\9eס×\99ס×\9e×\90×\95ת ×\94×\91×\95×\98 {{GENDER:|ש×\9c×\9a|ש×\9c×\9a|ש×\9c×\9b×\9d}} ×\95×\90×\9c {{GENDER:|ת×\99×\99צר|ת×\99×\99צר×\99|ת×\99×\99צר×\95}} ס×\99ס×\9e×\90×\95ת ×\91×\95×\98 ×¢×\91×\95ר ×\90×\97ר×\99×\9d.",
+ "botpasswords-disabled": "×\90פשר×\95ת ×\94ש×\99×\9e×\95ש ×\91ס×\99ס×\9e×\90×\95ת ×\91×\95×\98 ×\9e×\91×\95×\98×\9cת.",
+ "botpasswords-no-central-id": "×\9b×\93×\99 ×\9c×\94שת×\9eש ×\91ס×\99ס×\9e×\90×\95ת ×\91×\95×\98, ×\99ש ×\9c×\94×\99×\9b× ×¡ ×¢×\9d ×\97ש×\91×\95×\9f ×\9eשת×\9eש ×\9e×\90×\95×\97×\93.",
+ "botpasswords-existing": "ס×\99ס×\9e×\90×\95ת ×\91×\95×\98 ק×\99×\99×\9e×\95ת",
+ "botpasswords-createnew": "×\99צ×\99רת ס×\99ס×\9eת ×\91×\95×\98 ×\97×\93ש×\94",
+ "botpasswords-editexisting": "ער×\99×\9bת ס×\99ס×\9eת ×\91×\95×\98 ק×\99×\99×\9eת",
"botpasswords-label-appid": "שם הבוט:",
"botpasswords-label-create": "יצירה",
"botpasswords-label-update": "עדכון",
"botpasswords-label-cancel": "ביטול",
"botpasswords-label-delete": "מחיקה",
- "botpasswords-label-resetpassword": "×\90×\99פ×\95ס ססמה",
- "botpasswords-label-grants": "זיכיונות מתאימים",
+ "botpasswords-label-resetpassword": "×\90×\99פ×\95ס ×\94ס×\99סמה",
+ "botpasswords-label-grants": "זיכיונות מתאימים:",
"botpasswords-help-grants": "זיכיונות נותנים גישה להרשאות שכבר מוחזקות בידי חשבון המשתמש שלך. הפעלת זיכיון בדף זה אינה נותנת גישה להרשאות אחרות שאינן מוחזקות בידי חשבון המשתמש שלך. מידע נוסף מופיע ב[[Special:ListGrants|טבלת הזיכיונות]].",
"botpasswords-label-grants-column": "ניתן זיכיון",
"botpasswords-bad-appid": "שם הבוט \"$1\" אינו תקין.",
"botpasswords-insert-failed": "הוספת שם הבוט \"$1\" נכשלה. האם הוא כבר נוסף?",
"botpasswords-update-failed": "לא היה אפשר לעדכן את שם הבוט \"$1\". האם הוא נמחק?",
- "botpasswords-created-title": "ססמת הבוט נוצרה",
- "botpasswords-created-body": "ססמת הבוט עבור בוט בשם \"$1\" של {{GENDER:$2|המשתמש|המשתמשת}} \"$2\" נוצרה.",
- "botpasswords-updated-title": "ססמת הבוט עודכנה",
- "botpasswords-updated-body": "ססמת הבוט עבור בוט בשם \"$1\" של {{GENDER:$2|המשתמש|המשתמשת}} \"$2\" עודכנה.",
- "botpasswords-deleted-title": "ססמת הבוט נמחקה",
- "botpasswords-deleted-body": "ססמת הבוט עבור בוט בשם \"$1\" של {{GENDER:$2|המשתמש|המשתמשת}} \"$2\" נמחקה.",
+ "botpasswords-created-title": "ס×\99ס×\9eת ×\94×\91×\95×\98 × ×\95צר×\94",
+ "botpasswords-created-body": "ס×\99ס×\9eת ×\94×\91×\95×\98 ×¢×\91×\95ר ×\91×\95×\98 ×\91ש×\9d \"$1\" ש×\9c {{GENDER:$2|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$2\" × ×\95צר×\94.",
+ "botpasswords-updated-title": "ס×\99ס×\9eת ×\94×\91×\95×\98 ×¢×\95×\93×\9b× ×\94",
+ "botpasswords-updated-body": "ס×\99ס×\9eת ×\94×\91×\95×\98 ×¢×\91×\95ר ×\91×\95×\98 ×\91ש×\9d \"$1\" ש×\9c {{GENDER:$2|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$2\" ×¢×\95×\93×\9b× ×\94.",
+ "botpasswords-deleted-title": "ס×\99ס×\9eת ×\94×\91×\95×\98 × ×\9e×\97ק×\94",
+ "botpasswords-deleted-body": "ס×\99ס×\9eת ×\94×\91×\95×\98 ×¢×\91×\95ר ×\91×\95×\98 ×\91ש×\9d \"$1\" ש×\9c {{GENDER:$2|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$2\" × ×\9e×\97ק×\94.",
"botpasswords-newpassword": "הסיסמה החדשה לכניסה לחשבון <strong>$1</strong> היא <strong>$2</strong>. <em>נא לשמור מידע זה לצורך עיון עתידי.</em> <br> (עבור בוטים ישנים שדורשים ששם המשתמש בכניסה לחשבון יהיה זהה לשם המשתמש שאיתו הם יפעלו, ניתן להשתמש גם בשם המשתמש <strong>$3</strong> עם הסיסמה <strong>$4</strong>.)",
"botpasswords-no-provider": "BotPasswordsSessionProvider אינו זמין.",
- "botpasswords-restriction-failed": "כניסה זו נמנעה בשל הגבלות על ססמאות בוט.",
- "botpasswords-invalid-name": "שם המשתמש שניתן אינו מכיל את תו הפרדת ססמאות הבוט (\"$1\").",
- "botpasswords-not-exist": "למשתמש \"$1\" אין ססמת בוט בשם \"$2\".",
+ "botpasswords-restriction-failed": "×\9b× ×\99ס×\94 ×\96×\95 × ×\9e× ×¢×\94 ×\91ש×\9c ×\94×\92×\91×\9c×\95ת ×¢×\9c ס×\99ס×\9e×\90×\95ת ×\91×\95×\98.",
+ "botpasswords-invalid-name": "ש×\9d ×\94×\9eשת×\9eש ×©× ×\99ת×\9f ×\90×\99× ×\95 ×\9e×\9b×\99×\9c ×\90ת ת×\95 ×\94פר×\93ת ס×\99ס×\9e×\90×\95ת ×\94×\91×\95×\98 (\"$1\").",
+ "botpasswords-not-exist": "{{GENDER:$1|למשתמש|למשתמשת}} \"$1\" אין סיסמת בוט בשם \"$2\".",
"resetpass_forbidden": "לא ניתן לשנות סיסמאות.",
"resetpass_forbidden-reason": "לא ניתן לשנות את הסיסמאות: $1",
"resetpass-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה באופן ישיר.",
"resetpass-submit-loggedin": "שינוי סיסמה",
"resetpass-submit-cancel": "ביטול",
"resetpass-wrong-oldpass": "הסיסמה הזמנית או הנוכחית אינה תקינה.\nייתכן שכבר שינית את סיסמתך או שכבר ביקשת סיסמה זמנית חדשה.",
- "resetpass-recycled": "×\90× ×\90 ×\90פס×\95 ×\90ת ×\94ס×\99ס×\9e×\94 ×\9cס×\99ס×\9e×\94 ש×\95× ×\94 ×\9eס×\99ס×\9eת×\9b×\9d הנוכחית.",
- "resetpass-temp-emailed": "נכנסתם באמצעות סיסמה זמנית שנשלחה אליכם בדוא\"ל.\nכדי לסיים את הכניסה, עליכם להגדיר כאן סיסמה חדשה:",
+ "resetpass-recycled": "×\99ש ×\9c×\90פס ×\90ת ×\94ס×\99ס×\9e×\94 ×\9cס×\99ס×\9e×\94 ×\94ש×\95× ×\94 ×\9eס×\99×\9eסת×\9a הנוכחית.",
+ "resetpass-temp-emailed": "נכנסת באמצעות סיסמה זמנית שנשלחה {{GENDER:|אליך|אלייך}} בדוא\"ל.\nכדי לסיים את הכניסה, יש להגדיר כאן סיסמה חדשה:",
"resetpass-temp-password": "סיסמה זמנית:",
"resetpass-abort-generic": "שינוי הסיסמה בוטל על־ידי הרחבה.",
- "resetpass-expired": "ס×\99ס×\9eת×\9b×\9d פקע×\94. ×\90× ×\90 ×\94×\92×\93×\99ר×\95 סיסמה חדשה כדי להיכנס.",
+ "resetpass-expired": "ס×\99ס×\9eת×\9a פקע×\94. × ×\90 ×\9c×\94×\92×\93×\99ר סיסמה חדשה כדי להיכנס.",
"resetpass-expired-soft": "הסיסמה שלך פקעה, וצריך לאפס אותה. יש לבחור סיסמה חדשה כעת, או ללחוץ על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס אותה מאוחר יותר.",
"resetpass-validity-soft": "הסיסמה שלך אינה תקינה: $1\n\nיש לבחור סיסמה חדשה כעת או ללחוץ על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס את הסיסמה מאוחר יותר.",
"passwordreset": "איפוס סיסמה",
- "passwordreset-text-one": "×\9e×\9c×\90×\95 טופס זה כדי לקבל סיסמה זמנית בדוא\"ל.",
- "passwordreset-text-many": "{{PLURAL:$1||×\9e×\9c×\90×\95 אחד מהשדות הבאים כדי לקבל סיסמה זמנית בדוא\"ל.}}",
+ "passwordreset-text-one": "× ×\90 ×\9c×\9e×\9c×\90 טופס זה כדי לקבל סיסמה זמנית בדוא\"ל.",
+ "passwordreset-text-many": "{{PLURAL:$1||×\99ש ×\9c×\9e×\9c×\90 אחד מהשדות הבאים כדי לקבל סיסמה זמנית בדוא\"ל.}}",
"passwordreset-disabled": "איפוסי סיסמה בוטלו באתר ויקי זה.",
"passwordreset-emaildisabled": "שירותי הדוא\"ל בוטלו באתר ויקי זה.",
"passwordreset-username": "שם משתמש:",
"passwordreset-domain": "תחום:",
"passwordreset-email": "כתובת דוא\"ל:",
"passwordreset-emailtitle": "פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
- "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
- "passwordreset-emailtext-user": "{{GENDER:$1|המשתמש|המשתמשת}} $1 ב{{GRAMMAR:תחילית|{{SITENAME}}}} {{GENDER:$1|ביקש|ביקשה}} איפוס של הסיסמה שלכם ב{{GRAMMAR:תחילית|{{SITENAME}}}}\n($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}} לכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
+ "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}}‏ ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או אם נזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
+ "passwordreset-emailtext-user": "המשתמש $1 ב{{GRAMMAR:תחילית|{{SITENAME}}}} ביקש איפוס של הסיסמה שלכם ב{{GRAMMAR:תחילית|{{SITENAME}}}}‏\n($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}} לכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או אם נזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
"passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
"passwordreset-emailsentemail": "אם כתובת הדואר האלקטרוני הזאת משויכת לחשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
"passwordreset-emailsentusername": "אם יש כתובת דואר אלקטרוני שמשויכת לשם המשתמש הזה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
"changeemail-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה ישירות.",
"changeemail-oldemail": "כתובת דוא\"ל נוכחית:",
"changeemail-newemail": "כתובת דוא\"ל חדשה:",
- "changeemail-newemail-help": "×¢×\9c×\99×\9b×\9d ×\9c×\94ש×\90×\99ר ש×\93×\94 ×\96×\94 ר×\99ק ×\90×\9d ×\91רצ×\95× ×\9b×\9d ×\9c×\94ס×\99ר ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ש×\9c×\9b×\9d. ×\90×\9d תס×\99ר×\95 ×\90×\95ת×\94, ×\9c×\90 ת×\95×\9b×\9c×\95 ×\9c×\90פס ס×\99ס×\9e×\94 שש×\9b×\97ת×\9d ×\95×\9c×\90 ת×\95×\9b×\9c×\95 לקבל הודעות דואר אלקטרוני מאתר הוויקי הזה.",
+ "changeemail-newemail-help": "×\91×\90פשר×\95ת×\9a ×\9c×\94ש×\90×\99ר ש×\93×\94 ×\96×\94 ר×\99ק ×\90×\9d ×\91רצ×\95× ×\9a ×\9c×\94ס×\99ר ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ש×\9c×\9a. ×\90×\9d ×\94×\99×\90 ת×\95סר, ×\9c×\90 ×\99×\94×\99×\94 ×\91×\90פשר×\95ת×\9a ×\9c×\90פס ס×\99ס×\9e×\94 שש×\9b×\97ת ×\95×\9c×\90 {{GENDER:|ת×\95×\9b×\9c|ת×\95×\9b×\9c×\99}} לקבל הודעות דואר אלקטרוני מאתר הוויקי הזה.",
"changeemail-none": "(אין)",
"changeemail-password": "סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:",
"changeemail-submit": "שינוי כתובת הדוא\"ל",
"savechanges": "שמירת השינויים",
"publishpage": "פרסום הדף",
"publishchanges": "פרסום השינויים",
+ "savearticle-start": "שמירת הדף…",
+ "savechanges-start": "שמירת השינויים…",
+ "publishpage-start": "פרסום הדף…",
+ "publishchanges-start": "פרסום השינויים…",
"preview": "תצוגה מקדימה",
"showpreview": "תצוגה מקדימה",
"showdiff": "הצגת שינויים",
"systemblockedtext": "שם המשתמש או כתובת ה־IP שלך נחסמו באופן אוטומטי על־ידי תוכנת מדיה־ויקי.\nהסיבה שניתנה לחסימה היא:\n\n:<em>$2</em>\n\n* תחילת החסימה: $8\n* פקיעת החסימה: $6\n* החסימה שבוצעה: $7\n\nכתובת ה־IP הנוכחית שלך היא $3.\nיש לציין את כל הפרטים הללו בכל פנייה לבירור החסימה.",
"blockednoreason": "לא ניתנה סיבה",
"whitelistedittext": "נדרשת $1 כדי לערוך דפים.",
- "confirmedittext": "×¢×\9c×\99×\9b×\9d ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ש×\9c×\9b×\9d ×\9c×¤× ×\99 שת×\95×\9b×\9c×\95 ×\9cער×\95×\9a ×\93פ×\99×\9d. ×\90× ×\90 ×\94×\92×\93×\99ר×\95 ×\95×\90×\9eת×\95 ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ש×\9c×\9b×\9d ×\91×\90×\9eצע×\95ת [[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש]] ש×\9c×\9b×\9d.",
+ "confirmedittext": "×\99ש ×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ×\9c×¤× ×\99 ער×\99×\9bת ×\93פ×\99×\9d.\n× ×\90 ×\9c×\94×\92×\93×\99ר ×\95×\9c×\90×\9eת ×\90ת ×\9bת×\95×\91ת ×\94×\93×\95×\90\"×\9c ש×\9c×\9a ×\91×\90×\9eצע×\95ת [[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש]] ש×\9c×\9a.",
"nosuchsectiontitle": "הפסקה לא נמצאה",
"nosuchsectiontext": "ניסית לערוך פסקה שאינה קיימת.\nייתכן שהיא הועברה או נמחקה בעת שצפית בדף.",
"loginreqtitle": "נדרשת כניסה לחשבון",
"blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
"clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>).\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>).\n* <strong>אינטרנט אקספלורר:</strong> להחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>.\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק: <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
"usercssyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
+ "userjsonyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את דף ה־JSON החדש שלכם לפני השמירה.",
"userjsyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
"usercsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.\nהוא עדיין לא נשמר!</strong>",
+ "userjsonpreview": "<strong>זִכרו שזו רק בדיקה/תצוגה מקדימה של הגדרות ה־JSON שלכם.\nהן עדיין לא נשמרו!</strong>",
"userjspreview": "<strong>זִכרו שזו רק בדיקה/תצוגה מקדימה של סקריפט ה־JavaScript שלכם.\nהוא עדיין לא נשמר!</strong>",
- "sitecsspreview": "'''זכרו שזו רק תצוגה מקדימה של גיליון ה־CSS הזה.'''\n'''הוא טרם נשמר!'''",
- "sitejspreview": "'''זכרו שזו רק תצוגה מקדימה של קוד ה־JavaScript הזה.'''\n'''הוא טרם נשמר!'''",
- "userinvalidconfigtitle": "'''אזהרה:''' העיצוב \"$1\" אינו קיים.\nדפי .css ו־.js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
+ "sitecsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS הזה.\nהוא עדיין לא נשמר!</strong>",
+ "sitejsonpreview": "<strong>זִכרו שזו רק תצוגה מקדימה של הגדרות ה־JSON האלה.\nהן עדיין לא נשמרו!</strong>",
+ "sitejspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של סקריפט ה־JavaScript הזה.\nהוא עדיין לא נשמר!</strong>",
+ "userinvalidconfigtitle": "<strong>אזהרה:</strong> העיצוב \"$1\" אינו קיים.\nדפי .css, דפי .json, ודפי .js מותאמים אישית משתמשים בכותרת עם אותיות קטנות – למשל, {{ns:user}}:דוגמה/vector.css ולא {{ns:user}}:דוגמה/Vector.css.",
"updated": "(מעודכן)",
"note": "'''הערה:'''",
"previewnote": "<strong>{{GENDER:|זכור|זִכרי|זִכרו}} שזו רק תצוגה מקדימה.</strong>\nהשינויים {{GENDER:|שלך|שלך|שלכם}} עדיין לא נשמרו!",
"sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
"sectioneditnotsupported-text": "עריכת פסקאות אינה נתמכת בדף זה.",
"permissionserrors": "שגיאת הרשאה",
- "permissionserrorstext": "אין ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
- "permissionserrorstext-withaction": "אין ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} $2, מה{{PLURAL:$1|סיבה הבאה|סיבות הבאות}}:",
+ "permissionserrorstext": "אין באפשרותך לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
+ "permissionserrorstext-withaction": "אין באפשרותך $2, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
"contentmodelediterror": "לא ניתן לערוך את הגרסה הזאת כי מודל התוכן שלה הוא <code>$1</code>, השונה ממודל התוכן הנוכחי של הדף, <code>$2</code>.",
"recreate-moveddeleted-warn": "'''אזהרה: הנכם יוצרים דף חדש שנמחק בעבר.'''\n\nכדאי לשקול אם יהיה זה נכון להמשיך לערוך את הדף.\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
"moveddeleted-notice": "דף זה נמחק.\nיומני המחיקות, ההגנות וההעברות של הדף מוצגים להלן לעיון.",
"default": "ברירת המחדל",
"prefs-files": "קבצים",
"prefs-custom-css": "קובץ CSS מותאם אישית",
+ "prefs-custom-json": "קובץ JSON מותאם אישית",
"prefs-custom-js": "קובץ JavaScript מותאם אישית",
- "prefs-common-config": "קובצי CSS/JavaScript משותפים לכל העיצובים:",
+ "prefs-common-config": "קובצי CSS/JSON/JavaScript משותפים לכל העיצובים:",
"prefs-reset-intro": "באפשרותך להשתמש באפשרות זו כדי להחזיר את ההעדפות שלך להגדרות ברירת המחדל של האתר.\nלא ניתן לבטל פעולה זו.",
"prefs-emailconfirm-label": "אימות כתובת דוא\"ל:",
"youremail": "דואר אלקטרוני:",
"right-editcontentmodel": "שינוי מודל התוכן של דפים",
"right-editinterface": "עריכת ממשק המשתמש",
"right-editusercss": "עריכת קובצי CSS של משתמשים אחרים",
+ "right-edituserjson": "עריכת קובצי JSON של משתמשים אחרים",
"right-edituserjs": "עריכת קובצי JavaScript של משתמשים אחרים",
"right-editmyusercss": "עריכת קובצי CSS של המשתמש עצמו",
+ "right-editmyuserjson": "עריכת קובצי JSON של המשתמש עצמו",
"right-editmyuserjs": "עריכת קובצי JavaScript של המשתמש עצמו",
"right-viewmywatchlist": "צפייה ברשימת המעקב של המשתמש עצמו",
"right-editmywatchlist": "עריכת רשימת המעקב של המשתמש עצמו. מספר פעולות יוסיפו דפים גם ללא הרשאה זו.",
"grant-createaccount": "יצירת חשבונות",
"grant-createeditmovepage": "יצירה, עריכה והעברה של דפים",
"grant-delete": "מחיקת דפים, גרסאות ורשומות יומן",
- "grant-editinterface": "עריכת מרחב השם מדיה ויקי ו־CSS/JavaScript של משתמשים",
- "grant-editmycssjs": "עריכת CSS/JavaScript שלך",
+ "grant-editinterface": "עריכת מרחב השם מדיה ויקי ו־CSS/JSON/JavaScript של משתמשים",
+ "grant-editmycssjs": "עריכת CSS/JSON/JavaScript שלך",
"grant-editmyoptions": "עריכת העדפות המשתמש שלך",
"grant-editmywatchlist": "עריכת רשימת המעקב שלך",
"grant-editpage": "עריכת דפים קיימים",
"filerevert-success": "הקובץ <strong>[[Media:$1|$1]]</strong> שוחזר ל[$4 גרסה מ־$3, $2].",
"filerevert-badversion": "אין גרסה מקומית קודמת של הקובץ שהועלתה בתאריך המבוקש.",
"filerevert-identical": "הגרסה הנוכחית של הקובץ כבר זהה לגרסה שנבחרה.",
- "filedelete": "מחיקת $1",
+ "filedelete": "מחיקת הקובץ \"$1\"",
"filedelete-legend": "מחיקת קובץ",
"filedelete-intro": "אתם עומדים למחוק את הקובץ <strong>[[Media:$1|$1]]</strong> יחד עם כל היסטוריית הגרסאות שלו.",
"filedelete-intro-old": "אתם מוחקים את הגרסה של '''[[Media:$1|$1]]''' מ־[$4 $3, $2].",
"listusers-creationsort": "מיון לפי תאריך היצירה של החשבון",
"listusers-desc": "מיון בסדר יורד",
"usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
- "usercreated": "{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1",
+ "usercreated": "{{GENDER:$3|נוצר}} ב־$2, $1",
"newpages": "דפים חדשים",
"newpages-submit": "הצגה",
"newpages-username": "שם משתמש:",
"log": "יומנים",
"logeventslist-submit": "הצגה",
"all-logs-page": "כל היומנים הציבוריים",
- "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
+ "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי־רישיות) או הדף המושפע (גם כן תלוי־רישיות).",
"logempty": "אין פריטים תואמים ביומן.",
"log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
"showhideselectedlogentries": "שינוי מצב התצוגה של פעולות היומן שנבחרו",
"ipblocklist-localblock": "חסימה מקומית",
"ipblocklist-otherblocks": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
"infiniteblock": "ללא הגבלת זמן",
- "expiringblock": "החסימה פוקעת ב־$1 בשעה $2",
+ "expiringblock": "החסימה פוקעת ב־$2, $1",
"anononlyblock": "משתמשים אנונימיים בלבד",
"noautoblockblock": "חסימה אוטומטית מבוטלת",
"createaccountblock": "יצירת חשבונות נחסמה",
"ipb_expiry_invalid": "זמן פקיעת החסימה אינו תקין.",
"ipb_expiry_old": "זמן התפוגה כבר עבר.",
"ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
- "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ֫־$1 עריכות}}.",
+ "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ־$1 עריכות}}.",
"ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
"ipb-needreblock": "$1 כבר {{GENDER:$1|חסום|חסומה}}. האם ברצונך לשנות את הגדרות החסימה?",
"ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
"group-bot.css": "/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */",
"group-sysop.css": "/* הסגנונות הנכתבים כאן ישפיעו על מפעילי מערכת בלבד */",
"group-bureaucrat.css": "/* הסגנונות הנכתבים כאן ישפיעו על ביורוקרטים בלבד */",
+ "common.json": "/* כל ה־JSON שנכתב כאן ייטען עבור כל המשתמשים בכל טעינת עמוד. */",
"common.js": "/* כל הסקריפטים שנכתבים כאן ייטענו עבור כל המשתמשים בכל טעינת עמוד. */",
"group-autoconfirmed.js": "/* כל הסקריפטים הנכתבים כאן ייטענו עבור משתמשים ותיקים בלבד */",
"group-user.js": "/* כל הסקריפטים הנכתבים כאן ייטענו עבור משתמשים רשומים בלבד */",
"unlinkaccounts-success": "קישור החשבון בוטל.",
"authenticationdatachange-ignored": "השינוי בנתוני האימות לא הצליח. ייתכן שלא הוגדר ספק.",
"userjsispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־JavaScript שלכם, ולכן אין לכלול בהם מידע סודי.",
+ "userjsonispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־JSON שלכם, ולכן אין לכלול בהם מידע סודי.",
"usercssispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־CSS שלכם, ולכן אין לכלול בהם מידע סודי.",
"restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
"restrictionsfield-label": "טווחי כתובות IP מותרים:",
"rawhtml-notallowed": "לא ניתן להשתמש בתגיות <html> מחוץ לדפים רגילים.",
"gotointerwiki": "עזיבת {{SITENAME}}",
"gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.",
- "gotointerwiki-external": "{{GENDER:|×\90ת×\94 ×¢×\95×\9e×\93|×\90ת ×¢×\95×\9e×\93ת|×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d}} ×\9c×¢×\96×\95×\91 ×\90ת {{SITENAME}} ×\9b×\93×\99 ×\9c×\91קר ×\91×\90תר ×\94× ×¤×¨×\93 \"[[$2]]\".\n\n'''[$1 ×\9c×\94×\9eשך לכתובת $1]'''",
+ "gotointerwiki-external": "{{GENDER:|×\90ת×\94 ×¢×\95×\9e×\93|×\90ת ×¢×\95×\9e×\93ת|×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d}} ×\9c×¢×\96×\95×\91 ×\90ת {{SITENAME}} ×\9b×\93×\99 ×\9c×\91קר ×\91×\90תר ×\94×\97×\99צ×\95× ×\99 \"[[$2]]\".\n\n'''[$1 ×\9c×\94×\9eש×\99ך לכתובת $1]'''",
"undelete-cantedit": "אין באפשרותך לשחזר דף זה, כי אין באפשרותך לערוך אותו.",
"undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו.",
"pagedata-title": "מידע על הדף",
"cascadeprotected": "यह पृष्ठ सुरक्षित हैं, क्योंकि यह निम्नलिखित {{PLURAL:$1|पृष्ठ|पृष्ठों}} की सुरक्षा-सीढ़ी में समाविष्ट है:\n$2",
"namespaceprotected": "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
"customcssprotected": "आपको इस CSS पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
+ "customjsonprotected": "आपको इस JSON पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
"customjsprotected": "आपको इस जावास्क्रिप्ट पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
"mycustomcssprotected": "आपके पास इस CSS पृष्ठ को सम्पादित करने का अधिकार नहीं है।",
+ "mycustomjsonprotected": "आपके पास इस JSON पृष्ठ को सम्पादित करने का अधिकार नहीं है।",
"mycustomjsprotected": "आपके पास इस जावास्क्रिप्ट पृष्ठ को सम्पादित करने का अधिकार नहीं है।",
"myprivateinfoprotected": "आपके पास अपनी व्यक्तिगत जानकारी बदलने की अनुमति नहीं है।",
"mypreferencesprotected": "आपके पास अपनी वरीयताएँ बदलने की अनुमति नहीं है।",
"wrongpasswordempty": "कूटशब्द खाली है।\nपुनः यत्न करें।",
"passwordtooshort": "आपका कूटशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरों}} का होना चाहिये।",
"passwordtoolong": "पासवर्ड {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से ज़्यादा लम्बे नही हो सकते।",
- "passwordtoopopular": "à¤\86म पासवरà¥\8dड à¤\86प नहà¥\80à¤\82 à¤\9aà¥\81न सà¤\95तà¥\87 हà¥\88à¤\82। à¤\95à¥\83पया à¤\85नà¥\8bà¤\96ा पासवर्ड चुनें।",
+ "passwordtoopopular": "à¤\86प à¤\86म पासवरà¥\8dड नहà¥\80à¤\82 à¤\9aà¥\81न सà¤\95तà¥\87 हà¥\88à¤\82। à¤\95à¥\83पया à¤\95ठिन पासवर्ड चुनें।",
"password-name-match": "आपका कूटशब्द आपके सदस्यनाम से भिन्न होना चाहिए।",
"password-login-forbidden": "इस सदस्यनाम और कूटशब्द का उपयोग वर्जित है।",
"mailmypassword": "कूटशब्द पुनःस्थापित करें",
"savechanges": "बदलाव सहेजें",
"publishpage": "पृष्ठ प्रकाशित करें",
"publishchanges": "परिवर्तन प्रकाशित करें",
+ "savearticle-start": "पृष्ठ सहेजें...",
+ "savechanges-start": "बदलाव सहेजें...",
+ "publishpage-start": "पृष्ठ प्रकाशित करें...",
+ "publishchanges-start": "परिवर्तन प्रकाशित करें...",
"preview": "झलक",
"showpreview": "झलक दिखाएँ",
"showdiff": "बदलाव दिखाएँ",
"blocked-notice-logextract": "यह सदस्य फ़िलहाल अवरोधित है।\nसदंर्भ के लिए ताज़ातरीन अवरोध लॉग प्रविष्टि नीचे दी है:",
"clearyourcache": "'''ध्यान दें:''' संजोने के बाद बदलाव देखने के लिए आपको अपने ब्राउज़र की कैश खाली करनी पड़ सकती है।\n* '''फ़ायरफ़ॉक्स / सफ़ारी:''' ''Reload'' (रीलोड) दबाते समय ''Shift'' (शिफ़्ट) दबा के रखें, या फिर ''Ctrl-F5'' (कंट्रोल-F5) या ''Ctrl-R'' (कंट्रोल-R) दबाएँ (मैक पर ''⌘-R'')\n* '''गूगल क्रोम:''' ''Ctrl-Shift-R'' (कंट्रोल-शिफ़्ट-R) दबाएँ (मैक पर ''⌘-Shift-R'')\n* '''इन्टर्नेट एक्सप्लोरर:''' ''Ctrl'' (कंट्रोल) दबाकर ''Refresh'' (रिफ़्रेश) करें या ''Ctrl-F5'' (कंट्रोल-F5) दबाएँ\n* '''ऑपेरा:''' ''Tools → Preferences'' (उपकरण → वरीयताएँ) में कैश साफ़ करें",
"usercssyoucanpreview": "'''टिप''': संजोने से पहले अपनी नई सी॰एस॰एस को जाँचने के लिये \"{{int:showpreview}}\" बटन का प्रयोग करें।",
+ "userjsonyoucanpreview": "<strong>टिप:</strong> संजोने से पहले अपनी नई JSON को जाँचने के लिये \"{{int:showpreview}}\" बटन का प्रयोग करें।",
"userjsyoucanpreview": "'''टिप''': संजोने से पहले अपनी नई जावास्क्रिप्ट को जाँचने के लिये \"{{int:showpreview}}\" बटन का प्रयोग करें।",
"usercsspreview": "'''ध्यान दें कि आप अपनी सी॰एस॰एस की झलक देख रहे हैं।'''\n'''यह अभी तक संजोई नहीं गई है!'''",
"userjspreview": "'''ध्यान दें कि आप अपनी जावास्क्रिप्ट की झलक देख रहे हैं।'''\n'''यह अभी तक संजोई नहीं गई है!'''",
"postedit-confirmation-created": "पृष्ठ निर्मित किया गया है।",
"postedit-confirmation-restored": "पृष्ठ पुरानी स्थिति पर लाया गया है।",
"postedit-confirmation-saved": "आपका सम्पादन सहेजा गया है।",
+ "postedit-confirmation-published": "आपका संशोधन प्रकाशित कर दिया गया था।",
"edit-already-exists": "नया पृष्ठ बनाया नहीं जा सका।\nयह पहले से मौजूद है।",
"defaultmessagetext": "संदेश का डिफ़ॉल्ट पाठ",
"content-failed-to-parse": "$1 के लिए $2 सामग्री को पार्स करने में विफल, त्रुटि: $3",
"expansion-depth-exceeded-warning": "पृष्ठ में विस्तार गहराई पार की गई है",
"parser-unstrip-loop-warning": "Unstrip लूप पाया गया",
"unstrip-depth-warning": "Unstrip पुनरावर्तन सीमा पार की गई ($1)",
+ "unstrip-depth-category": "पृष्ठ जिन पर गहराई की सीमा को पार किया गया है",
+ "unstrip-size-warning": "बिना सीमा के आकार की सीमा पार हो गई ($1)",
"converter-manual-rule-error": "मैन्यूअल भाषा परिवर्तन नियम में त्रुटि",
"undo-success": "यह संपादन पूर्ववत किया जा सकता है।\nऐसा करने के लिये कृपया निम्नलिखित पाठ को ध्यान से देखकर बदलाव संजोयें।",
"undo-failure": "इस बीच अन्य बदलाव होने के कारण यह संपादन पूर्ववत करना संभव नहीं है।",
"cascadeprotected": "Ez a lap szerkesztés elleni védelemmel lett ellátva, mert be van illesztve a következő {{PLURAL:$1|lapon|lapokon}}, ahol be van kapcsolva a „kaszkádolt” védelem:\n$2",
"namespaceprotected": "Nincs jogosultságod a(z) '''$1''' névtérben található lapok szerkesztésére.",
"customcssprotected": "Nem szerkesztheted ezt a CSS-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.",
+ "customjsonprotected": "Nem szerkesztheted ezt a JSON-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.",
"customjsprotected": "Nem szerkesztheted ezt a JavaScript-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.",
"mycustomcssprotected": "Nincs jogod szerkeszteni ezt a CSS-lapot.",
+ "mycustomjsonprotected": "Nincs jogod szerkeszteni ezt a JSON-lapot.",
"mycustomjsprotected": "Nincs jogod szerkeszteni ezt a JavaScript-lapot.",
"myprivateinfoprotected": "Nincs jogod módosítani a privát adataidat.",
"mypreferencesprotected": "Nincs jogod módosítani a beállításaidat.",
"wrongpasswordempty": "Nem adtál meg jelszót. Próbáld meg újra.",
"passwordtooshort": "A jelszónak legalább $1 karakterből kell állnia.",
"passwordtoolong": "A jelszó nem lehet hosszabb $1 karakternél.",
- "passwordtoopopular": "A gyakori jelszavak nem használhatók. Válassz egy egyedibb jelszót.",
+ "passwordtoopopular": "A gyakran használt jelszavak nem használhatók. Válassz olyan jelszót, amit nehezebb kitalálni.",
"password-name-match": "A jelszavadnak különböznie kell a szerkesztőnevedtől.",
"password-login-forbidden": "Ezen felhasználónév és jelszó használata tiltott.",
"mailmypassword": "Jelszó alaphelyzetbe állítása",
"savechanges": "Módosítások mentése",
"publishpage": "Lap közzététele",
"publishchanges": "Változtatások közzététele",
+ "savearticle-start": "Lap mentése...",
+ "savechanges-start": "Változtatások mentése...",
+ "publishpage-start": "Lap közzététele...",
+ "publishchanges-start": "Változtatások közzététele...",
"preview": "Előnézet",
"showpreview": "Előnézet megtekintése",
"showdiff": "Változtatások megtekintése",
"blocked-notice-logextract": "A felhasználó jelenleg blokkolva van.\nA blokkolási napló legutóbbi ide vonatkozó bejegyzése a következő:",
"clearyourcache": "<strong>Megjegyzés:</strong> mentés után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.\n* <strong>Firefox / Safari:</strong> tartsd lenyomva a <em>Shift</em> gombot és kattints a <em>Frissítés</em> gombra a címsorban, vagy használd a <em>Ctrl–F5</em> vagy <em>Ctrl–R</em> (Macen <em>⌘–R</em>) billentyűkombinációt\n* <strong>Google Chrome:</strong> használd a <em>Ctrl–Shift–R</em> (Macen <em>⌘–Shift–R</em>) billentyűkombinációt\n* <strong>Internet Explorer:</strong> tartsd nyomva a <em>Ctrl</em>-t, és kattints a <em>Frissítés</em> gombra, vagy nyomj <em>Ctrl–F5</em>-öt\n* <strong>Opera:</strong> Nyisd meg a Beállításokat a <em>Menü</em>ből (Macen <em>Opera</em> menüből), majd válaszd az <em>Adatvédelem és biztonság → Böngészési adatok törlése → Gyorsítótáras képek és fájlok</em> opciót.",
"usercssyoucanpreview": "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új CSS-ed teszteléséhez.",
+ "userjsonyoucanpreview": "<strong>Tipp:</strong> mentés előtt használd az „{{int:showpreview}}” gombot az új JSON-od teszteléséhez.",
"userjsyoucanpreview": "'''Tipp:''' mentés előtt használd az „{{int:showpreview}}” gombot az új JavaScipted teszteléséhez.",
"usercsspreview": "'''Ne felejtsd el, hogy ez csak a felhasználói CSS-ed előnézete és még nincs elmentve!'''",
"userjspreview": "'''Ne felejtsd el, hogy még csak teszteled a felhasználói JavaScriptedet, és még nincs elmentve!'''",
"prefs-files": "Fájlok",
"prefs-custom-css": "saját CSS",
"prefs-custom-js": "saját JS",
- "prefs-common-config": "Közös CSS/JS az összes felület számára:",
+ "prefs-common-config": "Közös CSS/JSON/JS az összes felület számára:",
"prefs-reset-intro": "Ezen a lapon állíthatod vissza a beállításaidat az oldal alapértelmezett értékeire.\nA műveletet nem lehet visszavonni.",
"prefs-emailconfirm-label": "E-mail-cím megerősítése:",
"youremail": "Az e-mail címed:",
"right-editcontentmodel": "A lap tartalom modelljének szerkesztése",
"right-editinterface": "felhasználói felület szerkesztése",
"right-editusercss": "más felhasználók CSS fájljainak szerkesztése",
+ "right-edituserjson": "Más felhasználók JSON fájljainak szerkesztése",
"right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
"right-editmyusercss": "Saját szerkesztői CSS-fájlok szerkesztése",
+ "right-editmyuserjson": "Saját szerkesztői JSON-fájlok szerkesztése",
"right-editmyuserjs": "saját szerkesztői JavaScript-fájlok szerkesztése",
"right-viewmywatchlist": "saját figyelőlista megtekintése",
"right-editmywatchlist": "saját figyelőlista szerkesztése; bizonyos műveletek képesek lapok figyelőlistához adására ezen jog nélkül is",
"grant-createaccount": "fiókok létrehozása",
"grant-createeditmovepage": "lapok létrehozása, szerkesztése és átnevezése",
"grant-delete": "lapok, lapváltozatok és naplóbejegyzések törlése",
- "grant-editinterface": "MediaWiki-névtér és felhasználói CSS/JavaScript szerkesztése",
- "grant-editmycssjs": "Felhasználói CSS-ed/JavaScripted szerkesztése",
+ "grant-editinterface": "MediaWiki-névtér és felhasználói CSS/JSON/JavaScript szerkesztése",
+ "grant-editmycssjs": "Felhasználói CSS-ed/JSON-od/JavaScripted szerkesztése",
"grant-editmyoptions": "felhasználói beállításaid módosítása",
"grant-editmywatchlist": "figyelőlista szerkesztése",
"grant-editpage": "létező lapok szerkesztése",
"enotif_lastvisited": "Az utolsó látogatásod óta történt változtatásokért lásd: $1",
"enotif_lastdiff": "Ezen változtatás megtekintéséhez lásd: $1",
"enotif_anon_editor": "$1 névtelen felhasználó",
- "enotif_body": "Kedves $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nA szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT\n\nA szerkesztő elérhetősége:\ne-mail küldése: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAmíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.\n\nBaráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere\n\n--\nAz e-mail értesítéseid módosításához keresd fel a \n{{canonicalurl:{{#special:Preferences}}}} címet\n\nA figyelőlistád módosításához keresd fel a\n{{canonicalurl:{{#special:EditWatchlist}}}} címet\n\nA lap figyelőlistádról való törléséhez keresd fel a\n$UNWATCHURL címet\n\nVisszajelzés és további segítség:\n$HELPPAGE",
+ "enotif_body": "Kedves $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nA szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT\n\nA szerkesztő elérhetősége:\ne-mail küldése: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAmíg nem keresed fel az oldalt bejelentkezve, addig nem érkeznek újabb értesítések az oldal változásaival kapcsolatban. A figyelőlistádon is beállíthatod, hogy újból kapj értesítéseket, az összes lap után.\n\nBaráti üdvözlettel: a(z) {{SITENAME}} értesítő rendszere\n\n--\nAz e-mail-értesítéseid módosításához keresd fel a \n{{canonicalurl:{{#special:Preferences}}}} címet\n\nA figyelőlistád módosításához keresd fel a\n{{canonicalurl:{{#special:EditWatchlist}}}} címet\n\nA lap figyelőlistádról való törléséhez keresd fel a\n$UNWATCHURL címet\n\nVisszajelzés és további segítség:\n$HELPPAGE",
"enotif_minoredit": "Ez egy apró szerkesztés",
"created": "létrehozta",
"changed": "megváltoztatta",
"permissionserrorstext": "Ձեզ չի թույլատրվում դա անել հետևյալ {{PLURAL:$1|պատճառով|պատճառներով}}.",
"permissionserrorstext-withaction": "Ձեզ չի թույլատրվում $2 հետևյալ {{PLURAL:$1|պատճառով|պատճառներով}}.",
"recreate-moveddeleted-warn": "'''Զգուշացում. դուք փորձում եք վերստեղծել մի էջ, որը ջնջվել է նախկինում։'''\n\nԽնդրում ենք վերանայել ձեր խմբագրման նպատակահարմարությունը։ Հարմարության համար ստորև բերված են այս էջի ջնջման և տեղափոխման տեղեկամատյանները։",
- "moveddeleted-notice": "Այս էջը հեռացված է։\nԷջի մասին գրառումները տեղափոխման և ջնջման տեղեկամատյանից բերված են ստորև տեղեկության համար։",
+ "moveddeleted-notice": "Այս էջը հեռացված է։\nԷջի մասին գրառումները տեղափոխման, պաշտպանման և ջնջման տեղեկամատյանից բերված են ստորև տեղեկության համար։",
"log-fulllog": "Դիտել ամբողջական տեղեկամատյանը",
"edit-conflict": "Խմբագրման ընհարում։",
"edit-no-change": "Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։",
"pagelang-nonexistent-page": "$1 էջը գոյություն չունի",
"special-characters-group-latin": "Լատիներեն",
"special-characters-group-latinextended": "Լատիներեն ընդլայնված",
- "special-characters-group-ipa": "IPA",
+ "special-characters-group-ipa": "ՄՀԱ (IPA)",
"special-characters-group-symbols": "Սիմվոլներ",
"special-characters-group-greek": "Հունարեն",
+ "special-characters-group-greekextended": "Հունարեն ընդլայնված",
"special-characters-group-cyrillic": "Կիրիլիցա",
"special-characters-group-arabic": "Արաբերեն",
"special-characters-group-arabicextended": "Արաբերեն ընդլայնված",
"special-characters-group-thai": "Թայերեն",
"special-characters-group-lao": "Լաոերեն",
"special-characters-group-khmer": "Կխմեր",
+ "special-characters-group-canadianaboriginal": "Կանադական վանկագիր",
"special-characters-title-endash": "ո գծիկ (en dash)",
"special-characters-title-emdash": "ա գծիկ (em dash)",
"special-characters-title-minus": "հանածի նշան",
"welcomeuser": "Esez bonvenanta, $1!",
"welcomecreation-msg": "Vua konto kreesis.\n\nVu povas modifikar vua [[Special:Preferences|preferaji en la {{SITENAME}}]] se vu deziras.",
"yourname": "Vua uzantonomo:",
- "userlogin-yourname": "Uzantonomo",
+ "userlogin-yourname": "Nomo dil uzero",
"userlogin-yourname-ph": "Enirez vua uzantonomo",
"createacct-another-username-ph": "Enirez la uzantonomo",
"yourpassword": "Pasovorto:",
"noemail": "Ne esas e-adreso konservita por la uzero \"$1\".",
"noemailcreate": "Tu mustas informar valida e-posto",
"passwordsent": "Nova pasovorto sendesis a la e-adreso registragita por \"$1\".\nVoluntez enirar altrafoye pos recevar ol.",
- "blocked-mailpassword": "Vua adreso di IP blokuzesis por redaktado. Por preventar misuzo, ne permisesas rekuperar pasovorti de ca adreso di IP.",
+ "blocked-mailpassword": "Vua IP-adreso blokusesis por redaktado. Por preventar misuzo, ne permisesas rekuperar pasovorti de ca IP-adreso.",
"eauthentsent": "E-posto por konfirmar l'informi sendesis a la e-posto indikita da vu.\nAnte ke altra e-posto sendesos a vua konto, vu mustos sequar l'instrukti mencionata en la e-posto, por konfirmar ke la konto fakte esas vua.",
"throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
"mailerror": "Eroro sendante posto: $1",
"usereditcount": "$1 {{PLURAL:$1|redakto|redakti}}",
"usercreated": "{{GENDER:$3|Kreita}} ye $1 $2",
"newpages": "Nova pagini",
- "newpages-username": "Uzantonomo:",
+ "newpages-username": "Nomo dil uzero:",
"ancientpages": "Maxim anciena artikli",
"move": "Movar",
"movethispage": "Rinomizar ica pagino",
"alllogstext": "Kombinata montro di omna 'log'-i di {{SITENAME}} disponebla.\nVu povas stretigar la vidado per la selekto di la tipo di protoloko (log type), l'uzantonomo (case-sensitive), o la pagino afektita (also case-sensitive).",
"logempty": "Nula kombinuri trovesis en la protokolo.",
"showhideselectedlogentries": "Modifikar la videbleso di la selektita eniri di 'log'",
+ "checkbox-select": "Selektez: $1",
+ "checkbox-all": "Omna",
+ "checkbox-none": "Nula",
+ "checkbox-invert": "Inversigar",
"allpages": "Omna pagini",
"nextpage": "Sequanta pagino ($1)",
"prevpage": "Antea pagino ($1)",
"listusersfrom": "Montrez uzeri komencante de:",
"listusers-submit": "Montrez",
"activeusers": "Listo pri aktiva uzeri",
+ "activeusers-intro": "Yen listo pri uzeri qui laboris en la Wiki dum la lasta $1 {{PLURAL:$1|dio|dii}}.",
"activeusers-from": "Montrez uzeri komencante de:",
"activeusers-noresult": "Nula uzero trovesis.",
"listgrouprights-group": "Grupo",
"delete-confirm": "Efacar \"$1\"",
"delete-legend": "Efacar",
"historywarning": "<strong>Averto:</strong> La pagino quan vu efaceskas havas historio kun $1 {{PLURAL:$1|revizo|revizi}}:",
+ "historyaction-submit": "Montrez",
"confirmdeletetext": "Vu selektis efacar ica pagino komplete, inkluzite omna modifiki en ol e la kronologio di la modifiki.\n\nVoluntez konfirmar ke vu fakte deziras facar to, ke vu komprenas omna konsequi dil efaco, e ke vu efacos ol segun [[{{MediaWiki:Policy-url}}|la normi pri l'efaco di artikli]].",
"actioncomplete": "Ago kompletigita",
"deletedtext": "\"$1\" efacesis.\nVidez $2 por obtenar registro di recenta efaci.",
"rollback": "Retrorulez redakti",
"rollbacklink": "retrorulez",
"rollbacklinkcount": "nuligar $1 {{PLURAL:$1|modifiko|modifiki}}",
+ "rollbacklinkcount-morethan": "nuligar nemediate plua kam $1 {{PLURAL:$1|redakto|redakti}}",
"rollbackfailed": "Retrorular ne sucesis",
"cantrollback": "Ne esas posibla retrorular. La lasta kontributanto esas la nura autoro di ica pagino.",
"alreadyrolled": "Vu ne povas retrorular la lasta chanjo di [[:$1]] da [[User:$2|$2]] ([[User talk:$2|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nulu pluse ja redaktis o retrorulis ica pagino.\n\nLa lasta chanjo a la pagino esis da [[User:$3|$3]] ([[User talk:$3|Diskutez]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"uctop": "(aktuala)",
"month": "De monato (e plu frue):",
"year": "De yaro (e plu frue):",
- "sp-contributions-newbies": "Montrez nur kontributadi di nova konti",
+ "sp-contributions-newbies": "Montrez nur kontributadi di la nova uzeri",
"sp-contributions-newbies-sub": "Di nova konti",
"sp-contributions-blocklog": "blokusar-registraro",
"sp-contributions-deleted": "efacita {{GENDER:$1|uzero}}-kontributadi",
"whatlinkshere-filters": "Filtrili",
"block": "Blokusar uzero",
"blockip": "Blokusado di IP-adresi",
+ "blockiptext": "Uzez la formulario adinfre por blokusar aceso de specifika adreso IP o de specifika uzeronomo.\nTo mustos facesor NUR POR PREVENTAR VANDALISMO, segun la [[{{MediaWiki:Policy-url}}|politiko de ica Wiki]].\nInformez adinfre la specifika motivi (example, mencionez specifika pagini qui subisis vandalismo dal IP/uzero).\nVu povas blokuzar serio di adresi IP per l'uzo dil sintaxo [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; la maxim longa serio permisata esas /$1 por IPv4 e /$2 por IPv6.",
"ipaddressorusername": "IP-adreso od uzantonomo:",
"ipbexpiry": "Expiro:",
"ipbreason": "Motivo:",
"ipbother": "Altra tempo:",
"ipboptions": "2 horo:2 hours,1 dio:1 day,3 dii:3 days,1 semano:1 week,2 semani:2 weeks,1 monato:1 month,3 monati:3 months,6 monati:6 months,1 yaro:1 year,infinita:infinite",
"ipbwatchuser": "Vigilar la pagino di prizentado e la pagino di diskuto de ica uzero",
- "ipb-disableusertalk": "Impedar l'uzero redaktar en lua propra diskutopagino dum la blokuzo",
+ "ipb-disableusertalk": "Impedar l'uzero redaktar en lua propra diskutopagino dum la blokuso",
"badipaddress": "IP-adreso ne esas valida",
"blockipsuccesssub": "Blokusado sucesis",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokusesis.<br />\nVidez [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.",
"ipusubmit": "Desblokusar",
"ipblocklist": "Blokusita uzanti",
"ipblocklist-submit": "Serchar",
+ "ipblocklist-otherblocks": "Altra {{PLURAL:$1|blokuso|blokusi}}",
"infiniteblock": "nefinita",
"blocklink": "blokusar",
"unblocklink": "desblokusar",
"block-log-flags-nocreate": "ne povas krear konto",
"block-log-flags-noemail": "e-posto blokuzita",
"ipb_expiry_invalid": "Nevalida expiro-tempo.",
+ "ipb-otherblocks-header": "Altra {{PLURAL:$1|blokuso|blokusi}}",
"ip_range_invalid": "Nevalida IP-rango.",
"proxyblocker": "Blokuso di 'Proxy'",
"lockdb": "Blokusar datumaro",
"pageinfo-toolboxlink": "Informo di ca pagino",
"pageinfo-contentpage": "Konsiderita kontenajo-pagino",
"pageinfo-contentpage-yes": "Yes",
+ "markaspatrolledtext": "Patroliar ica pagino",
"patrol-log-page": "Protokolo pri patroliado",
"previousdiff": "← Plu anciena versiono",
"nextdiff": "Plu recenta versiono →",
"newimages-legend": "Filtrilo",
"ilsubmit": "Serchar",
"bydate": "per dato",
+ "days": "{{PLURAL:$1|$1 dio|$1 dii}}",
+ "weeks": "{{PLURAL:$1|$1 semano|$1 semani}}",
"months": "{{PLURAL:$1|$1 monato|$1 monati}}",
"years": "{{PLURAL:$1|$1 yaro|$1 yari}}",
"metadata": "Metadonaji",
"table_pager_prev": "Antea pagino",
"table_pager_first": "Unesma pagino",
"table_pager_last": "Lasta pagino",
+ "table_pager_limit": "Montrez $1 artiklo per pagino",
"table_pager_limit_submit": "Irar",
"table_pager_empty": "Nula rezultajo",
"autosumm-blank": "Pagino vakuigesis",
"logentry-delete-restore": "$1 {{GENDER:$2|restauris}} la pagino $3 ($4)",
"logentry-delete-revision": "$1 {{GENDER:$2|modifikis}} videbleso di {{PLURAL:$5|la revizo|$5 revizi}} di la pagino $3: $4",
"revdelete-content-hid": "celita kontenajo",
- "logentry-block-block": "$1 {{GENDER:$2|blokuzis}} {{GENDER:$4|$3}} dum $5 $6",
+ "logentry-block-block": "$1 {{GENDER:$2|blokusis}} {{GENDER:$4|$3}} dum $5 $6",
"logentry-move-move": "$1 {{GENDER:$2|movis}} la pagino $3 a $4",
"logentry-move-move-noredirect": "$1 {{GENDER:$2|movis}} la pagino $3 a $4 sen lasar ridirektilo",
"logentry-move-move_redir": "$1 {{GENDER:$2|movis}} la pagino $3 a $4 sen lasar ridirekto",
"expand_templates_output": "Rezulto",
"expand_templates_ok": "O.K.",
"expand_templates_preview": "Previdar",
+ "pagelang-language": "Linguo",
"special-characters-group-latin": "Latina",
"special-characters-group-latinextended": "Latina extensita",
"special-characters-group-symbols": "Simboli",
"cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
"namespaceprotected": "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
"customcssprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.",
+ "customjsonprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina JSON, in quanto contiene le impostazioni personali di un altro utente.",
"customjsprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.",
"mycustomcssprotected": "Non si dispone dei permessi necessari per modificare questa pagina CSS.",
+ "mycustomjsonprotected": "Non si dispone dei permessi necessari per modificare questa pagina JSON.",
"mycustomjsprotected": "Non si dispone dei permessi necessari per modificare questa pagina JavaScript.",
"myprivateinfoprotected": "Non si dispone dei permessi necessari per modificare i propri dati personali.",
"mypreferencesprotected": "Non si dispone dei permessi necessari per modificare le proprie preferenze.",
"savechanges": "Salva le modifiche",
"publishpage": "Pubblica la pagina",
"publishchanges": "Pubblica le modifiche",
+ "savearticle-start": "Salva pagina…",
+ "savechanges-start": "Salva modifiche…",
+ "publishpage-start": "Pubblica pagina…",
+ "publishchanges-start": "Pubblica modifiche…",
"preview": "Anteprima",
"showpreview": "Visualizza anteprima",
"showdiff": "Mostra modifiche",
"usercssyoucanpreview": "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo CSS prima di salvarlo.",
"userjsyoucanpreview": "'''Suggerimento:''' usa il pulsante 'Visualizza anteprima' per provare il tuo nuovo JavaScript prima di salvarlo.",
"usercsspreview": "'''Questa è solo un'anteprima del proprio CSS personale. Le modifiche non sono ancora state salvate!'''",
+ "userjsonpreview": "<strong>Questa è solo un'anteprima per provare il proprio JSON personale; le modifiche non sono ancora state salvate!</strong>",
"userjspreview": "'''Questa è solo un'anteprima per provare il proprio JavaScript personale; le modifiche non sono ancora state salvate!'''",
"sitecsspreview": "Questa è solo un'anteprima del CSS. Le modifiche non sono ancora state salvate!'''",
+ "sitejsonpreview": "<strong>Questa è solo un'anteprima del JSON. Le modifiche non sono ancora state salvate!</strong>",
"sitejspreview": "Questa è solo un'anteprima per provare il JavaScript; le modifiche non sono ancora state salvate!'''",
- "userinvalidconfigtitle": "<strong>Attenzione:</strong> non esiste alcun tema con nome \"$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Attenzione:</strong> non esiste alcun tema con nome \"$1\". Si noti che le pagine per i .css, .json e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
"updated": "(Aggiornato)",
"note": "'''Nota:'''",
"previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
"prefs-files": "File",
"prefs-custom-css": "CSS personalizzato",
"prefs-custom-js": "JavaScript personalizzato",
- "prefs-common-config": "CSS/JavaScript condiviso per tutti i temi:",
+ "prefs-common-config": "CSS/JSON/JavaScript condiviso per tutti i temi:",
"prefs-reset-intro": "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.\nL'operazione non può essere annullata.",
"prefs-emailconfirm-label": "Conferma dell'email:",
"youremail": "Indirizzo email:",
"right-editusercss": "Modifica i file CSS di altri utenti",
"right-edituserjs": "Modifica i file JS di altri utenti",
"right-editmyusercss": "Modifica il file CSS del proprio utente",
+ "right-editmyuserjson": "Modifica il file JSON del proprio utente",
"right-editmyuserjs": "Modifica il file JavaScript del proprio utente",
"right-viewmywatchlist": "Visualizza i propri osservati speciali",
"right-editmywatchlist": "Modifica i propri osservati speciali. Da notare che alcune azioni potranno ancora aggiungere pagine anche senza questo diritto.",
"grant-createaccount": "Crea un'utenza",
"grant-createeditmovepage": "Crea, modifica e sposta le pagine",
"grant-delete": "Cancella pagine, versioni, e voci di registro",
- "grant-editinterface": "Modifica il namespace MediaWiki e i CSS/JavaScript degli utenti",
- "grant-editmycssjs": "Modifica i CSS/JavaScript della tua utenza",
+ "grant-editinterface": "Modifica il namespace MediaWiki e i CSS/JSON/JavaScript degli utenti",
+ "grant-editmycssjs": "Modifica i CSS/JSON/JavaScript della tua utenza",
"grant-editmyoptions": "Modifica le preferenze della tua utenza",
"grant-editmywatchlist": "Modifica i tuoi osservati speciali",
"grant-editpage": "Modifica pagine esistenti",
"group-bot.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ai bot * /",
"group-sysop.css": "/ * Gli stili CSS inseriti qui si applicheranno solo agli amministratori/sysop * /",
"group-bureaucrat.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ai burocrati * /",
+ "common.json": "/* Il codice JSON inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */",
"common.js": "/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */",
"group-autoconfirmed.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /",
"group-user.js": "/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti registrati * /",
"cascadeprotected": "このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}でトランスクルードのため読み込まれているので、編集できないように保護されています:\n$2",
"namespaceprotected": "<strong>$1</strong>名前空間にあるページを編集する権限がありません。",
"customcssprotected": "この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
+ "customjsonprotected": "この JSON ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
"customjsprotected": "この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
"mycustomcssprotected": "あなたにはこの CSS ページを編集する権限がありません。",
+ "mycustomjsonprotected": "あなたにはこの JSON ページを編集する権限がありません。",
"mycustomjsprotected": "あなたにはこの JavaScript ページを編集する権限がありません。",
"myprivateinfoprotected": "あなたには自身の非公開情報を編集する権限がありません。",
"mypreferencesprotected": "あなたには自身の個人設定を編集する権限がありません。",
"wrongpasswordempty": "パスワードを空欄にはできません。\nもう一度やり直してください。",
"passwordtooshort": "パスワードは {{PLURAL:$1|$1 文字}}以上にしてください。",
"passwordtoolong": "パスワードは {{PLURAL:$1|$1 文字}}以下にしてください。",
- "passwordtoopopular": "選択したパスワードはありきたりであるため使用することはできません。誰も思いつかないようなパスワードを選択してください。",
+ "passwordtoopopular": "選択したパスワードはありきたりであるため使用することはできません。簡単に思いつかないようなパスワードを選択してください。",
"password-name-match": "パスワードは利用者名とは異なる必要があります。",
"password-login-forbidden": "この利用者名とパスワードの使用は禁止されています。",
"mailmypassword": "パスワードを再設定",
"savechanges": "変更を保存",
"publishpage": "ページを公開",
"publishchanges": "変更を公開",
+ "savearticle-start": "ページを保存...",
+ "savechanges-start": "変更を保存...",
+ "publishpage-start": "ページを公開...",
+ "publishchanges-start": "変更を公開...",
"preview": "プレビュー",
"showpreview": "プレビューを表示",
"showdiff": "差分を表示",
"blocked-notice-logextract": "この利用者は現在ブロックされています。\n参考のために最新のブロック記録項目を以下に表示します:",
"clearyourcache": "<strong>注意:</strong> 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。\n* <strong>Firefox / Safari:</strong> <em>Shift</em> を押しながら <em>再読み込み</em> をクリックするか、<em>Ctrl-F5</em> または <em>Ctrl-R</em> を押してください (Mac では <em>⌘-R</em>)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> を押してください (Mac では <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> を押しながら <em>最新の情報に更新</em> をクリックするか、<em>Ctrl-F5</em> を押してください\n* <strong>Opera:</strong> <em>メニュー → 設定</em> (Mac では <em>Opera → 環境設定</em>) に移動し、<em>プライバシーとセキュリティ → 閲覧データを消去 → キャッシュされた画像およびファイル</em> からキャッシュをクリアしてください。",
"usercssyoucanpreview": "<strong>ヒント:</strong>「{{int:showpreview}}」ボタンを使うと、保存前に新しいCSSを試験できます。",
+ "userjsonyoucanpreview": "<strong>ヒント:</strong>「{{int:showpreview}}」ボタンを使うと、保存前に新しいJSONを試験できます。",
"userjsyoucanpreview": "<strong>ヒント:</strong>「{{int:showpreview}}」ボタンを使うと、保存前に新しいJavaScriptを試験できます。",
"usercsspreview": "<strong>利用者CSSをプレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
+ "userjsonpreview": "<strong>利用者JSONを試験/プレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
"userjspreview": "<strong>利用者JavaScriptを試験/プレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
"sitecsspreview": "<strong>ここでは、CSSをプレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
+ "sitejsonpreview": "<strong>ここでは、JSONをプレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
"sitejspreview": "<strong>ここでは、JavaScriptをプレビューしているだけに過ぎません。</strong>\n<strong>まだ保存されていません!</strong>",
- "userinvalidconfigtitle": "<strong>警告:</strong>「$1」という外装はありません。\nカスタム .css/.js ページではページ名を小文字にしてください。例: {{ns:user}}:Hoge/Vector.css ではなく {{ns:user}}:Hoge/vector.css",
+ "userinvalidconfigtitle": "<strong>警告:</strong>「$1」という外装はありません。\nカスタム .css/.json/.js ページではページ名を小文字にしてください。例: {{ns:user}}:Hoge/Vector.css ではなく {{ns:user}}:Hoge/vector.css",
"updated": "(更新)",
"note": "<strong>お知らせ:</strong>",
"previewnote": "<strong>これはプレビューです。</strong>\n変更内容はまだ保存されていません!",
"default": "既定",
"prefs-files": "ファイル",
"prefs-custom-css": "カスタムCSS",
+ "prefs-custom-json": "カスタムJSON",
"prefs-custom-js": "カスタムJavaScript",
- "prefs-common-config": "すべての外装に共通のCSSとJavaScript:",
+ "prefs-common-config": "すべての外装に共通のCSSとJSONとJavaScript:",
"prefs-reset-intro": "このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。\nこの操作は取り消せません。",
"prefs-emailconfirm-label": "メールアドレスの確認:",
"youremail": "メールアドレス:",
"right-editcontentmodel": "ページのコンテンツモデルを編集",
"right-editinterface": "ユーザーインターフェースを編集",
"right-editusercss": "他の利用者のCSSファイルを編集",
+ "right-edituserjson": "他の利用者のJSONファイルを編集",
"right-edituserjs": "他の利用者のJavaScriptファイルを編集",
"right-editmyusercss": "自身のCSSファイルを編集",
+ "right-editmyuserjson": "自身のJSONファイルを編集",
"right-editmyuserjs": "自身のJavaScriptファイルを編集",
"right-viewmywatchlist": "ウォッチリストを閲覧",
"right-editmywatchlist": "自身のウォッチリストを編集 (注: この権限がなくてもページを追加できる権限が他にもあります)",
"grant-createaccount": "アカウントを作成",
"grant-createeditmovepage": "ページを作成、編集、および移動",
"grant-delete": "ページ、版、記録項目を削除",
- "grant-editinterface": "MediaWiki 名前空間および利用者 CSS/JavaScript を編集",
- "grant-editmycssjs": "あなた自身の利用者 CSS/JavaScript を編集",
+ "grant-editinterface": "MediaWiki 名前空間および利用者 CSS/JOSN/JavaScript を編集",
+ "grant-editmycssjs": "あなた自身の利用者 CSS/JSON/JavaScript を編集",
"grant-editmyoptions": "あなたの個人設定を編集",
"grant-editmywatchlist": "あなたのウォッチリストを編集",
"grant-editpage": "既存のページを編集",
"group-bot.css": "/* ここに記述したCSSはボットのみに影響します */",
"group-sysop.css": "/* ここに記述したCSSは管理者のみに影響します */",
"group-bureaucrat.css": "/* ここに記述したCSSはビューロクラットのみに影響します */",
+ "common.json": "/* ここにあるすべてのJSONは、すべてのページ読み込みですべての利用者に対して読み込まれます */",
"common.js": "/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */",
"group-autoconfirmed.js": "/* ここにあるすべてのJavaScriptは、自動承認された利用者のみに読み込まれます */",
"group-user.js": "/* ここにあるすべてのJavaScriptは、登録利用者のみに読み込まれます */",
"unlinkaccounts-success": "アカウントの関連付けが解除されました。",
"authenticationdatachange-ignored": "認証データの変更は処理されませんでした。プロバイダーが設定されていない可能性があります。",
"userjsispublic": "注意: JavaScript のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
+ "userjsonispublic": "注意: JSON のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
"usercssispublic": "注意: CSS のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
"restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
"restrictionsfield-label": "許可する IP の範囲:",
"Nuevo Paso"
]
},
- "tog-underline": "링크에 밑줄:",
+ "tog-underline": "링크에 밑줄 긋기:",
"tog-hideminor": "최근 바뀜에서 사소한 편집을 숨기기",
"tog-hidepatrolled": "최근 바뀜에서 점검한 편집을 숨기기",
"tog-newpageshidepatrolled": "새 문서 목록에서 검토한 문서를 숨기기",
"tog-enotifminoredits": "문서나 파일의 사소한 편집도 이메일로 알림",
"tog-enotifrevealaddr": "알림 메일에 내 이메일 주소를 밝히기",
"tog-shownumberswatching": "주시하는 사용자 수 보이기",
- "tog-oldsig": "당신의 기존 서명:",
+ "tog-oldsig": "기존 서명:",
"tog-fancysig": "서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)",
"tog-uselivepreview": "페이지를 다시 불러오지 않고 미리 보기 표시",
"tog-forceeditsummary": "편집 요약을 쓰지 않았을 때 내게 물어보기",
"tog-useeditwarning": "바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 내게 알리기",
"tog-prefershttps": "로그인하는 동안 항상 보안 연결 사용",
"underline-always": "항상",
- "underline-never": "항상 치지 않기",
+ "underline-never": "항상 긋지 않기",
"underline-default": "스킨 또는 브라우저 기본값",
"editfont-style": "편집 영역의 글꼴 형식:",
"editfont-monospace": "고정폭 글꼴",
"cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서|문서들}}에 포함되어 있어 함께 보호됩니다:\n$2",
"namespaceprotected": "<strong>$1</strong> 이름공간의 문서를 편집할 권한이 없습니다.",
"customcssprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.",
+ "customjsonprotected": "다른 사용자의 개인 설정이 포함되어 있기 때문에 이 JSON 문서를 편집할 권한이 없습니다.",
"customjsprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.",
"mycustomcssprotected": "이 CSS 문서를 편집할 권한이 없습니다.",
+ "mycustomjsonprotected": "이 JSON 문서를 편집할 권한이 없습니다.",
"mycustomjsprotected": "이 자바스크립트 문서를 편집할 권한이 없습니다.",
"myprivateinfoprotected": "내 개인 정보를 편집할 권한이 없습니다.",
"mypreferencesprotected": "내 환경 설정을 편집할 권한이 없습니다.",
"savechanges": "변경사항 저장",
"publishpage": "문서 게시",
"publishchanges": "변경사항 게시",
+ "savearticle-start": "문서 저장...",
+ "savechanges-start": "변경사항 저장...",
+ "publishpage-start": "문서 게시...",
+ "publishchanges-start": "변경사항 게시...",
"preview": "미리 보기",
"showpreview": "미리 보기",
"showdiff": "차이 보기",
"prefs-watchlist": "주시문서 목록",
"prefs-editwatchlist": "주시문서 목록 편집",
"prefs-editwatchlist-label": "주시문서 목록의 항목을 편집합니다:",
- "prefs-editwatchlist-edit": "주시문서의 제목을 보고 지우기",
+ "prefs-editwatchlist-edit": "주시문서 목록의 제목 보기 및 지우기",
"prefs-editwatchlist-raw": "주시문서 목록 직접 편집하기",
- "prefs-editwatchlist-clear": "주시문서 목록 지우기",
+ "prefs-editwatchlist-clear": "주시문서 목록 비우기",
"prefs-watchlist-days": "주시문서 목록에서 볼 날짜 수:",
"prefs-watchlist-days-max": "최대 $1{{PLURAL:$1|일}}",
"prefs-watchlist-edits": "주시문서 목록에서 볼 최대 변경사항의 수:",
"prefs-email": "이메일 옵션",
"prefs-rendering": "보이기",
"saveprefs": "저장",
- "restoreprefs": "(모든 부분에서) 모두 기본 설정으로 되돌리기",
+ "restoreprefs": "모두 기본 설정으로 되돌리기(모든 부문)",
"prefs-editing": "편집",
"searchresultshead": "검색",
- "stub-threshold": "링크를 토막글 형식으로 보여줄 문서 크기 ($1):",
- "stub-threshold-sample-link": "ì\83\98í\94\8c",
+ "stub-threshold": "토막글 링크의 형식으로 보여줄 최소 수치($1):",
+ "stub-threshold-sample-link": "ì\98\88ì\8b\9c",
"stub-threshold-disabled": "비활성화됨",
"recentchangesdays": "최근 바뀜에 보여줄 날짜 수:",
"recentchangesdays-max": "최대 $1{{PLURAL:$1|일}}",
"timezoneregion-pacific": "태평양",
"allowemail": "다른 사용자가 내게 이메일을 보낼 수 있게 허용",
"email-allow-new-users-label": "처음 온 사용자들로부터 오는 이메일 허용",
- "email-blacklist-label": "이 사용자들이 내게 이메일을 보내는 것을 금지합니다:",
+ "email-blacklist-label": "이 사용자가 내게 이메일을 보내지 못하게 합니다:",
"prefs-searchoptions": "검색",
"prefs-namespaces": "이름공간",
"default": "기본값",
"prefs-files": "파일",
"prefs-custom-css": "사용자 CSS",
+ "prefs-custom-json": "사용자 지정 JSON",
"prefs-custom-js": "사용자 자바스크립트",
- "prefs-common-config": "모든 스킨에 공유된 CSS/자바스크립트:",
+ "prefs-common-config": "모든 스킨에 공유된 CSS/JSON/자바스크립트:",
"prefs-reset-intro": "이 페이지를 사용해 사이트 기본값으로 환경 설정을 재설정할 수 있습니다.\n이는 되돌릴 수 없습니다.",
"prefs-emailconfirm-label": "이메일 인증:",
"youremail": "이메일:",
"prefs-help-signature": "토론 문서에 글을 쓴 후에는 마지막에 서명을 해야 합니다. “<nowiki>~~~~</nowiki>” 기호를 추가하면 서명과 글 작성 시각이 자동으로 입력됩니다.",
"badsig": "서명이 잘못되었습니다.\nHTML 태그를 확인하세요.",
"badsiglength": "서명이 너무 깁니다.\n서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.",
- "yourgender": "ì\96´ë\96¤ ì\84±ë³\84ë¡\9c í\91\9cì\8b\9cë\90\98ë\8a\94 ê²\83ì\9d\84 ì\84 í\98¸í\95©니까?",
- "gender-unknown": "당신을 언급할 때, 소프트웨어는 가능한 한 성 중립적인 단어를 사용할 것입니다.",
- "gender-male": "위키 문서를 편집하는 남자입니다",
- "gender-female": "ì\9c\84í\82¤ 문ì\84\9c를 í\8e¸ì§\91í\95\98ë\8a\94 ì\97¬ì\9e\90ì\9e\85ë\8b\88ë\8b¤",
+ "yourgender": "ì\96´ë\8a\90 ì\84±ë³\84ë¡\9c ë¬\98ì\82¬í\95\98기를 ì\9b\90í\95\98ì\8b니까?",
+ "gender-unknown": "언급할 때 소프트웨어는 가능한 항상 중성적인 단어를 사용합니다.",
+ "gender-male": "남성이 위키 문서를 편집합니다.",
+ "gender-female": "ì\97¬ì\84±ì\9d´ ì\9c\84í\82¤ 문ì\84\9c를 í\8e¸ì§\91í\95©ë\8b\88ë\8b¤.",
"prefs-help-gender": "이 환경 설정은 선택 사항입니다.\n소프트웨어는 적절한 성별 문법을 사용하여 다른 사용자에게 당신을 언급하는 것을 해결하기 위해 사용됩니다.\n이 정보는 공개됩니다.",
"email": "이메일",
"prefs-help-realname": "실명은 선택 사항입니다.\n실명을 입력하면 당신의 기여에 대한 저작자 표시에 쓰이게 될 수 있습니다.",
"right-editcontentmodel": "문서의 콘텐츠 모델을 편집",
"right-editinterface": "사용자 인터페이스를 편집",
"right-editusercss": "다른 사용자의 CSS 문서를 편집",
+ "right-edituserjson": "다른 사용자의 JSON 파일을 편집",
"right-edituserjs": "다른 사용자의 자바스크립트 문서를 편집",
"right-editmyusercss": "자신의 사용자 CSS 파일 편집하기",
+ "right-editmyuserjson": "자신의 사용자 JSON 파일 편집하기",
"right-editmyuserjs": "자신의 사용자 자바스크립트 파일 편집하기",
"right-viewmywatchlist": "자신의 주시문서 목록 보기",
"right-editmywatchlist": "자신의 주시문서 목록을 편집합니다. 이 권한이 없어도 문서를 추가할 수 있는 권한이 이외에도 있음을 참고하세요.",
"grant-createaccount": "계정 만들기",
"grant-createeditmovepage": "문서 만들기, 편집 및 이동",
"grant-delete": "문서, 판 및 기록 항목 삭제",
- "grant-editinterface": "미디어위키 이름공간과 사용자 CSS/JS 편집",
- "grant-editmycssjs": "자신의 사용자 CSS/자바스크립트 편집하기",
+ "grant-editinterface": "미디어위키 이름공간과 사용자 CSS/JSON/자바스크립트 편집",
+ "grant-editmycssjs": "자신의 사용자 CSS/JSON/자바스크립트 편집하기",
"grant-editmyoptions": "사용자 환경 설정 편집하기",
"grant-editmywatchlist": "내 주시문서 목록 편집하기",
"grant-editpage": "기존 문서 편집하기",
"log": "기록 목록",
"logeventslist-submit": "보기",
"all-logs-page": "모든 공개 기록",
- "alllogstext": "{{SITENAME}}ì\9d\98 사용할 수 있는 모든 기록이 표시됩니다.\n기록 종류나 사용자 이름(대소문자 구별) 또는 영향을 받는 문서(대소문자 구별)를 선택하여 범위를 좁혀서 살펴볼 수 있습니다.",
+ "alllogstext": "{{SITENAME}}ì\97\90ì\84\9c 사용할 수 있는 모든 기록이 표시됩니다.\n기록 종류나 사용자 이름(대소문자 구별) 또는 영향을 받는 문서(대소문자 구별)를 선택하여 범위를 좁혀서 살펴볼 수 있습니다.",
"logempty": "일치하는 항목이 없습니다.",
"log-title-wildcard": "다음 글로 시작하는 제목 검색",
"showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
"group-bot.css": "/* 이 CSS 설정은 봇에만 적용됩니다 */",
"group-sysop.css": "/* 이 CSS 설정은 관리자에만 적용됩니다 */",
"group-bureaucrat.css": "/* 이 CSS 설정은 사무관에만 적용됩니다 */",
+ "common.json": "/* 이 JSON 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
"common.js": "/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */",
"group-autoconfirmed.js": "/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */",
"group-user.js": "/* 이 자바스크립트 설정은 등록된 사용자에만 적용됩니다 */",
"anoneditwarning": "<strong>Hişyarî:</strong> Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin. Heke tu <strong>[$1 têkevî]</strong> an jî <strong>[$2 hesabekî çêbikî]</strong>, li gel sûdên te yên din guhertinên ku tu bikî jî wê ji nasnavê te re bê atfkirin.",
"anonpreviewwarning": "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
"missingsummary": "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
- "missingcommenttext": "Ji kerema xwe kurteya naverokê li jêr binivisîne.",
+ "missingcommenttext": "Ji kerema xwe kurteya naverokê binivîsîne.",
"missingcommentheader": "<strong>Zanibe:</strong> Te sernav/mijarek nenivîsandîye. Heke tu niha carekî din li ser \"$1\" bitikînî, ev guherandina te bê sernav/mijar wê were tomarkirin.",
"summary-preview": "Pêşdîtina kurtenivîsa guherandinê:",
"subject-preview": "Pêşdîtina mijarê:",
"history-feed-empty": "Rûpela xwestî tune ye. Belkî ew rûpel jê hatibe birîn an jî sernavê wê hatibe guherandin. [[Special:Search|Di wîkîyê de li rûpelên nêzîkî wê bigere]].",
"rev-deleted-comment": "(kurteya guherandinê hate jêbirin)",
"rev-deleted-user": "(navê bikarhêner hate jêbirin)",
- "rev-deleted-event": "(pêkhatin hate jêbirin)",
- "rev-deleted-text-permission": "Ev guhertoya vê rûpelê hatiye jêbirin. Belkî agahî di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jêbirina têketinê] de hebe.",
+ "rev-deleted-event": "(dêtayên qeydê hate jêbirin)",
+ "rev-deleted-text-permission": "Guhertoya vê rûpelê <strong>hatiye jêbirin</strong>. Dêtayên vê di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} qeyda jêbirinê] de dikarî bibînî.",
"rev-delundel": "xuyakirinê biguherîne",
"rev-showdeleted": "nîşan bide",
"revisiondelete": "Guhertoyan jê bibe/nebe",
"search-category": "(kategorî $1)",
"search-file-match": "(bi naveroka dosye re lê te)",
"search-suggest": "Gelo mebesta te ev bû: $1",
- "search-interwiki-caption": "Projeyên hevçeng",
+ "search-interwiki-caption": "Netîceyên ji projeyên hevçeng",
"search-interwiki-default": "Encamên ji $1:",
"search-interwiki-more": "(bêhtir)",
"search-relatedarticle": "Pêwendîdar",
"prefs-editwatchlist-clear": "Lîsteya xwe ya şopandinê paqij bike",
"prefs-watchlist-days": "Hejmara rojên ku di lîsteya şopandinê de bê nîşandan:",
"prefs-watchlist-days-max": "Herî zêde $1 {{PLURAL:$1|roj|rojan}}",
- "prefs-watchlist-edits": "Hejmara maximum guhertinê ê di lîsteya şopandinê ya berfirehkirî de bê nîşandanː",
+ "prefs-watchlist-edits": "Hejmara maximum yê guhertinan wê di lîsteya şopandinê de bê nîşandanː",
"prefs-watchlist-edits-max": "Hejmara mezintirîn: 1000",
"prefs-misc": "Eyarên cuda",
"prefs-resetpass": "Şifreyê biguherîne",
- "prefs-changeemail": "Navnîşana e-nameyê biguherîne",
+ "prefs-changeemail": "Navnîşana e-nameyê biguherîne an jî rake",
"prefs-setemail": "Navnîşana e-nameyê binivîse",
"prefs-email": "Vebijarkên Enameyê",
"prefs-rendering": "Rû",
"prefs-registration": "Dema xweqeydkirinê:",
"yourrealname": "Navê te yê rast:",
"yourlanguage": "Ziman:",
- "yourvariant": "Cuda:",
+ "yourvariant": "Varyanta zimanê naverokê:",
"yournick": "Bernavkê nû (ji bo îmzeyê):",
"badsig": "Îmzeya ne derbasdar! Li HTML binêre ka sedema şaşbûnê çiye.",
"badsiglength": "Navê te zêde dirêj e; pêwîst e di bin {{PLURAL:$1|nîşanekê|nîşanan}} de be.",
"prefs-displaywatchlist": "Vebijarkan nîşan bide",
"prefs-diffs": "Cudahî",
"userrights": "Îdarekirina mafên bikarhêneran",
- "userrights-lookup-user": "Birêvebirina koman",
+ "userrights-lookup-user": "Bikarhênerek bibijêre",
"userrights-user-editname": "Navekî bikarhêneriyê binivîse:",
- "editusergroup": "Komên bikarhêneran biguherîne",
+ "editusergroup": "Komên bikarhêneran nîşan bide",
"editinguser": "Mafên bikarhêner '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) tên guhertin",
- "userrights-editusergroup": "Komên bikarhêneran biguherîne",
+ "userrights-editusergroup": "Komên {{GENDER:$1|bikarhêneran}} biguherîne",
"saveusergroups": "Komên {{GENDER:$1|bikarhêneran}} tomar bike",
"userrights-groupsmember": "Endamê/a:",
"userrights-groups-help": "Tu dikarî komên bikarhêneran ên vê/vî bikarhênerê/î biguherînî:\n* Qutiyeke nîşankirî dibêje ku ev bikarhêner di wê komê de ye.\n* Qutiyeke nenîşankirî dibêje ku ev bikarhêner ne di wê komê de ye.\n* Stêrkek (*) nîşan dide ku tu nikarî wê komê jêbibî, heke te berê ew lê zêde kiribe.",
"action-movefile": "vê daneyê bigerîne",
"action-upload": "vê daneyê bar bike",
"action-delete": "vê rûpelê jê bibe",
- "action-deleterevision": "Vê revîzyonê je bibe",
+ "action-deleterevision": "revîzyonan jê bibe",
"action-deletedhistory": "dîroka vê rûpelê jêbirî bibîne",
"action-browsearchive": "li rûpelên jêbirî bigere",
- "action-undelete": "vê rûpelê jê nebe",
+ "action-undelete": "rûpelan jê nebe",
"action-userrights": "hemû mafên bikarhêneran biguherîne",
"action-userrights-interwiki": "mafê bikarhênerên li ser wîkiyên din biguherîne",
"action-sendemail": "enameyan bişîne",
"notanarticle": "Ne gotar e",
"watchlist-details": "{{PLURAL:$1|Rûpelekî|$1 rûpel}} li ser lîsteya te ya şopandinê ye (xeynî rûpelên gotûbêjê).",
"wlheader-enotif": "Agahdariya e-nameyan hate çalakkirin",
- "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi <strong>nivîsa stûr<strong> tê xuyakirin.",
- "wlnote": "Ji $3, $4 heta niha {{PLURAL:$1|guherandinê|</strong>$1</strong> guherandinên}} dawî yê {{PLURAL:$2|saetê|</strong>$2</strong> saetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
+ "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi <strong>nivîsa stûr</strong> tê xuyakirin.",
+ "wlnote": "Ji $3, $4 heta niha {{PLURAL:$1|guherandinê|<strong>$1</strong> guherandinên}} dawî yê {{PLURAL:$2|saetê|<strong>$2</strong> saetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
"wlshowlast": "Guhertinên berî $1 saetan, $2 rojan nîşan bide",
"watchlist-hide": "Veşêre",
"watchlist-submit": "Nîşan bide",
"move-watch": "Vê rûpelê bişopîne",
"movepagebtn": "Vê rûpelê bigerîne",
"pagemovedsub": "Gerandin serkeftî",
- "movepage-moved": "'''Navê \"$1\" weke \"$2\" hate guhertin'''",
+ "movepage-moved": "<strong>Navê \"$1\" weke \"$2\" hate guhertin</strong>",
"movepage-moved-redirect": "Beralîkirinek hate çêkirin.",
"movepage-moved-noredirect": "Beralîkirin nehate çêkirin.",
"articleexists": "Rûpela bi vî navî heye, an navê ku te hilbijart derbas nabe. Navekî din hilbijêre.",
"errorpagetitle": "Erratum",
"returnto": "Redire ad $1.",
"tagline": "E {{grammar:ablative|{{SITENAME}}}}",
- "help": "Adiutatum",
+ "help": "Auxilium",
"search": "Quaerere",
"searchbutton": "Quaerere",
"go": "Ire",
"personaltools": "Instrumenta personalia",
"talk": "Disputatio",
"views": "Visae",
- "toolbox": "Arca ferramentorum",
+ "toolbox": "Instrumenta",
"imagepage": "Videre paginam fasciculi",
"mediawikipage": "Videre nuntium",
"templatepage": "Videre formulam",
"tooltip-n-currentevents": "Eventus novissimi",
"tooltip-n-recentchanges": "Index nuper mutatorum in hac vici",
"tooltip-n-randompage": "Ire ad paginam fortuitam",
- "tooltip-n-help": "Adiutatum de hoc vici",
+ "tooltip-n-help": "Adiumentum ad hoc incepto utendum",
"tooltip-t-whatlinkshere": "Index paginarum quae hic nectunt",
"tooltip-t-recentchangeslinked": "Nuper mutata in paginis quibus haec pagina nectit",
"tooltip-feed-rss": "Fluxus RSS huius paginae",
"mypreferencesprotected": "Dir hutt net d'Recht fir Är Astellungen z'änneren.",
"ns-specialprotected": "Spezialsäite kënnen net verännert ginn.",
"titleprotected": "Dësen Titel gouf vum [[User:$1|$1]] esou gespaart datt en net kann ugeluecht ginn. De Grond deen ugi gouf ass <em>$2</em>",
- "filereadonlyerror": "De Fichier \"$1\" konnt net geännert ginn well de Repertoire vun de Fichieren \"$2\" nëmme gelies däerf ginn.\n\nDe System-Administrateur den d'Schreiwe gespaart huet, huet dës Erklärung uginn: \"$3\"",
+ "filereadonlyerror": "De Fichier \"$1\" konnt net geännert ginn well de Repertoire vun de Fichieren \"$2\" nëmme gelies däerf ginn.\n\nDe System-Administrateur deen d'Schreiwe gespaart huet, huet dës Erklärung uginn: \"$3\"",
"invalidtitle-knownnamespace": "Net valabelen Titel mam Nummraum \"$2\" a mam Text \"$3\"",
"invalidtitle-unknownnamespace": "Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text \"$2\"",
"exception-nologin": "Net ageloggt",
"virus-unknownscanner": "onbekannten Antivirus:",
"logouttext": "'''Dir sidd elo ausgeloggt.'''\n\nOpgepasst: Op verschiddene Säite kann et nach sou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
"cannotlogoutnow-title": "Ausloggen ass elo net méiglech",
- "cannotlogoutnow-text": "Ausloggen ass net méiglech wann dir $1 benotzt.",
+ "cannotlogoutnow-text": "Ausloggen ass net méiglech wann Dir $1 benotzt.",
"welcomeuser": "Wëllkomm $1!",
"welcomecreation-msg": "Äre Benotzerkont gouf ugeluecht.\nVergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
"yourname": "Benotzernumm:",
"cannotlogin-title": "Aloggen ass net méiglech",
"cannotlogin-text": "Aloggen ass net méiglech.",
"cannotloginnow-title": "Aloggen ass elo net méiglech",
- "cannotloginnow-text": "Aloggen ass net méiglech wann dir $1 benotzt.",
+ "cannotloginnow-text": "Aloggen ass net méiglech wann Dir $1 benotzt.",
"cannotcreateaccount-title": "Benotzerkont kënnen net opgemaach ginn",
"cannotcreateaccount-text": "D'direkt Uleeë vu Benotzerkonten ass an dëser Wiki net aktivéiert.",
"yourdomainname": "Ären Domän:",
"savechanges": "Ännerunge späicheren",
"publishpage": "Säit publizéieren",
"publishchanges": "Ännerunge publizéieren",
+ "savearticle-start": "Säit späicheren...",
+ "savechanges-start": "Ännerunge späicheren...",
+ "publishpage-start": "Säit publizéieren...",
+ "publishchanges-start": "Ännerunge publizéieren...",
"preview": "Kucken ouni ofzespäicheren",
"showpreview": "Kucken ouni ofzespäicheren",
"showdiff": "Ännerunge weisen",
"userjspreview": "'''Denkt drun datt Dir Äre Javascript nëmmen test.'''\n'''En ass nach net gespäichert!'''",
"sitecsspreview": "'''Denkt drun datt Dir dësen CSS just kuckt.\nE gouf nach net gespäichert!'''",
"sitejspreview": "'''Denkt drun datt Dir dëse JavaScript-Code just kuckt.\nE gouf nach net gespäichert!'''",
- "userinvalidconfigtitle": "'''Opgepasst:''' Et gëtt keen Ausgesinn (skin) \"$1\".\nDenkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen, z. Bsp. {{ns:user}}:Foo/vector.css am Géigesaz zu {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Opgepasst:</strong> Et gëtt keen Ausgesinn (skin) \"$1\".\nDenkt drun datt personaliséiert .css .json an .js Säiten e kleng geschriwwenen Titel benotzen, z. Bsp. {{ns:user}}:Foo/vector.css am Géigesaz zu {{ns:user}}:Foo/Vector.css.",
"updated": "(Geännert)",
"note": "'''Notiz:'''",
"previewnote": "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''\nÄr Ännerunge sinn nach net gespäichert!",
"default": "Standard",
"prefs-files": "Fichieren",
"prefs-custom-css": "Benotzerdefinéierten CSS",
+ "prefs-custom-json": "Personaliséierten JSON",
"prefs-custom-js": "Benotzerdefinéierte JS",
- "prefs-common-config": "Gemeinsam CSS/JS fir all Ausgesinn (skins):",
+ "prefs-common-config": "Gemeinsam CSS/JSON/JavaScript fir all Ausgesinn (skins):",
"prefs-reset-intro": "Dir kënnt dës Säit benotze fir Är Astellungen zréck op d'Standard-Astllungen ze setzen.\nDëst kann net réckgängeg gemaach ginn.",
"prefs-emailconfirm-label": "E-Mail Confirmatioun:",
"youremail": "E-Mail-Adress:",
"grant-createaccount": "Benotzerkonten opmaachen",
"grant-createeditmovepage": "Säiten uleeën, änneren a réckelen",
"grant-delete": "Säiten, Versiounen a Rubriken a Logbicher läschen",
- "grant-editinterface": "MediaWiki-Nummraum a Benotzer CSS/JavaScript änneren",
- "grant-editmycssjs": "Äre Benotzer CSS/JavaScript änneren",
+ "grant-editinterface": "MediaWiki-Nummraum a Benotzer CSS/JSON/JavaScript änneren",
+ "grant-editmycssjs": "Äre Benotzer CSS/JSON/JavaScript änneren",
"grant-editmyoptions": "Ännert Är Benotzerastellungen",
"grant-editmywatchlist": "Ännert Är Iwwerwaachungslëscht",
"grant-editpage": "Säiten déi et gëtt änneren",
"pageinfo-robot-index": "Erlaabt",
"pageinfo-robot-noindex": "Net erlaabt",
"pageinfo-watchers": "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
- "pageinfo-visiting-watchers": "Zuel vun de Benotzer déi iwwerwaachen déi déi rezent Ännerunge besicht hunn",
+ "pageinfo-visiting-watchers": "Zuel vun den Obsevateuren déi déi rezent Ännerunge gekuckt hunn",
"pageinfo-few-watchers": "Manner wéi $1 {{PLURAL:$1|Benotzer deen iwwerwaacht|Benotzer déi iwwerwaachen}}",
"pageinfo-redirects-name": "Zuel vun de Viruleedungen op dës Säit",
"pageinfo-subpages-name": "Ënnersäite vun dëser Säit",
"wrongpasswordempty": "'t Ingegaeve wachwoord waor laeg. Perbeer 't obbenuujts.",
"passwordtooshort": "Dien wachwaord is te kort. 't Mót minstes oet {{PLURAL:$1|1 teike|$1 teikes}} besjtaon.",
"passwordtoolong": "Wachwäörd kónne neet lenger zeen es {{PLURAL:$1|ei teike| $1 teikes}}.",
- "passwordtoopopular": "Dök-gekaoze wachwäörd kan me neet gebroeke. Kees 'n eigener wachwaord.",
+ "passwordtoopopular": "Dök-gekaoze wachwäörd kan me neet gebroeke. Kees 'n eige wachwaord det lestiger is de raoje.",
"password-name-match": "Die wachwaord mót anges zeen es diene gebroekersnaam.",
"password-login-forbidden": "'t Gebroek van deze gebroekersnaam mit dit wachwoord is neet toegesjtange.",
"mailmypassword": "Mail mich e nuuj wachwaord",
"notificationemail_subject_removed": "geregistreerd e-mailadres van {{SITENAME}} is eweggehaold",
"scarytranscludedisabled": "[Interwikitransclusie is oetgesjakeld]",
"scarytranscludefailed": "[Sjabloon $1 kós neet opgehaold waer]",
+ "scarytranscludefailed-httpstatus": "[Sjabloon $1 kós neet waere opgehaold: HTTP $2]",
"scarytranscludetoolong": "[URL is te lank]",
"deletedwhileediting": "'''Waorsjoewing''': Dees pazjena is gewis naodats doe bis begós mit bewirke!",
"confirmrecreate": "Gebroeker [[User:$1|$1]] ([[User talk:$1|euverlèk]]) heet dees pagina eweggesjaf naodats doe mèt bewirke begós mèt de rae:\n: ''$2''\nBevesteg estebleef dats te dees pazjena ech obbenuujts wils aanmake.",
"version-entrypoints": "Ingang-URLs",
"version-entrypoints-header-entrypoint": "Ingank",
"version-entrypoints-header-url": "URL",
+ "version-libraries": "Geïnstalleerde biebs",
+ "version-libraries-library": "Bieb",
+ "version-libraries-version": "Versie",
+ "version-libraries-license": "Lisens",
+ "version-libraries-description": "Besjrieving",
+ "version-libraries-authors": "Sjrievers",
"redirect": "Redirek op bestandj, gebroeker, pagina, versie of log-ID",
"redirect-summary": "Dees speciaal pagina verwies door nao e bestandj (es 'ne bestandjsnaam weurt opgegaeve), 'n pagina (es e paginanómmer of versienómmer weurt opgegaeve), 'ne gebroekerspagina (es e gebroekersnómmer weurt opgegaeve) of 'ne logbookregel (es 'n logboekregel-ID weurt opgegaeve). Gebroek: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] of [[{{#Special:Redirect}}/logid/186]].",
"redirect-submit": "Gank",
"redirect-page": "Paginanómmer",
"redirect-revision": "Paginaversie",
"redirect-file": "Bestandjsnaam",
+ "redirect-logid": "Log-ID",
+ "redirect-not-exists": "Waerd neet gevónje",
"fileduplicatesearch": "Zeuk veur döbbelbestaondje bestenj",
"fileduplicatesearch-summary": "Zeuk veur döbbel bestaondje bestenj op basis van zien hashwaarde.",
"fileduplicatesearch-filename": "Bestandjsnaam:",
"fileduplicatesearch-result-n": "'t Bestandj \"$1\" haet {{PLURAL:$2|1 identieke döbbelversie|$2 identiek döbbelversies}}.",
"fileduplicatesearch-noresults": "d'r Is gei bestandj mitte naam \"$1\" gevónje.",
"specialpages": "Speciaal pazjena's",
+ "specialpages-note-top": "Legenda",
+ "specialpages-note-restricted": "* Normaal speciaal pagina's.\n* <span class=\"mw-specialpagerestricted\">Bepirk-tougenkelike speciaal pagina's.</span>",
"specialpages-group-maintenance": "Óngerhajingsrapporter",
"specialpages-group-other": "Euverige speciaal pazjena's",
"specialpages-group-login": "Meld dich aan / registreer",
"tag-filter": "[[Special:Tags|Labelfilter]]:",
"tag-filter-submit": "Filtere",
"tag-list-wrapper": "([[Special:Tags|Label{{PLURAL:$1||s}}]]: $2)",
+ "tag-mw-contentmodelchange": "inhawdsmodelverangering",
+ "tag-mw-contentmodelchange-description": "Bewirkinge die [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel 't inhawdsmodel van 'n pagina verangere]",
+ "tag-mw-new-redirect": "Nuje redirek",
+ "tag-mw-new-redirect-description": "Bewirkinge die 'ne nuje redirek aanmake of 'n pagina verangere in 'ne redirek",
+ "tag-mw-removed-redirect": "Eweggehaolde redirek",
+ "tag-mw-removed-redirect-description": "Bewirkinge die 'ne bestäönde redirek verangere in 'ne neet-redirek",
+ "tag-mw-changed-redirect-target": "Redireksdoel verangerd",
+ "tag-mw-changed-redirect-target-description": "Bewirkinge die 't doel van 'ne redirek verangere",
+ "tag-mw-blank": "Laeggehaold",
+ "tag-mw-blank-description": "Bewirkinge die 'n pagina laegmake",
+ "tag-mw-replace": "Vervange",
+ "tag-mw-replace-description": "Bewirkinge die mier es 90% van 'n pagina eweghaole",
+ "tag-mw-rollback": "Trökdrejjing",
+ "tag-mw-rollback-description": "Bewirkinge die ierder bewirkinge trökdrejje middels de \"drej trök\"-link",
+ "tag-mw-undo": "Maak óngedaon",
+ "tag-mw-undo-description": "Bewirkinge die veurige bewirkinge óngedaon make middels de \"maak óngedaon\"-link",
"tags-title": "Labels",
"tags-intro": "Op deze pagina staon de labels womit de software edere bewerking kan markere, en häör betekenis.",
"tags-tag": "Labelnaam",
"tags-display-header": "Weergave in wiezigingslieste",
"tags-description-header": "Volledige beschrieving van betekenis",
+ "tags-source-header": "Brón",
+ "tags-active-header": "Aktief?",
"tags-hitcount-header": "Gelabelde bewerkinge",
+ "tags-actions-header": "Hanjelinge",
"tags-active-yes": "Jao",
"tags-active-no": "Nae",
+ "tags-source-extension": "Bepaold door de sofware",
+ "tags-source-manual": "Handjmaesig tougeveug door gebroekers en bots",
+ "tags-source-none": "Neet mier in gebroek",
"tags-edit": "bewerking",
+ "tags-delete": "sjaf eweg",
+ "tags-activate": "aktiveer",
+ "tags-deactivate": "deaktiveer",
"tags-hitcount": "$1 {{PLURAL:$1|wieziging|wieziginge}}",
"tags-deactivate-reason": "Raeje:",
"tags-deactivate-submit": "Deaktiveer",
"cascadeprotected": "Оваа страница е заштитена од уредувања бидејќи е превметната во {{PLURAL:$1|следнава страница, којашто е заштитена|следниве страници, коишто се заштитени}} со можноста „каскадна заштита“:\n$2",
"namespaceprotected": "Немате дозвола за уредување страници во именскиот простор '''$1'''.",
"customcssprotected": "Немате дозвола да ја менувате оваа страница со CSS бидејќи содржи туѓи лични нагодувања.",
+ "customjsonprotected": "Немате дозвола да ја менувате оваа страница со JSON бидејќи содржи туѓи лични нагодувања.",
"customjsprotected": "Немате дозвола да ја менувате оваа страница со JavaScript бидејќи содржи туѓи лични нагодувања.",
"mycustomcssprotected": "Немате дозвола да ја уредувате оваа каскадна стилска страница (CSS).",
+ "mycustomjsonprotected": "Немате дозвола да ја уредувате оваа страница со JSON.",
"mycustomjsprotected": "Немате дозвола да ја уредувате оваа страница со JavaScript.",
"myprivateinfoprotected": "Немате дозвола да ги уредувате вашите лични информации.",
"mypreferencesprotected": "Немате дозвола да ги уредувате вашите нагодувања.",
"wrongpasswordempty": "Внесената лозинка е празна. Обидете се повторно.",
"passwordtooshort": "Лозинката мора да има најмалку {{PLURAL:$1|1 знак|$1 знаци}}.",
"passwordtoolong": "Лозинката не треба да има повеќе од {{PLURAL:$1|1 знак|$1 знаци}}.",
- "passwordtoopopular": "Не користете пречесто застапени лозинки. Одберете некоја поинаква од вообичаените.",
+ "passwordtoopopular": "Не се допуштаат пречесто застапени лозинки. Изберете потешка лозинка за погодување.",
"password-name-match": "Лозинката мора да се разликува од корисничкото име.",
"password-login-forbidden": "Употребата на ова корисничко име и лозинка е забранета.",
"mailmypassword": "Нова лозинка",
"savechanges": "Зачувај промени",
"publishpage": "Објави ја страницата",
"publishchanges": "Објави промени",
+ "savearticle-start": "Зачувај страница…",
+ "savechanges-start": "Зачувај промени…",
+ "publishpage-start": "Објави страница…",
+ "publishchanges-start": "Објави промени…",
"preview": "Преглед",
"showpreview": "Преглед",
"showdiff": "Прикажи промени",
"blocked-notice-logextract": "Овој корисник е моментално блокиран.\nПодолу е прикажан последниот дневнички запис:",
"clearyourcache": "<strong>Напомена:</strong> По зачувувањето морате да го исчистите меѓускладот (кеш) на прелистувачот за да можете ги видите промените.\n* <strong>Firefox / Safari:</strong> Држете <em>Shift</em> и стиснете на <em>Превчитај</em> (<em>Reload</em>) или притиснете <em>Ctrl-F5</em> или <em>Ctrl-R</em> (''⌘-R'' на Mac);\n* <strong>Google Chrome:</strong> Притиснете <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Држете <em>Ctrl</em> додека притискате на <em>Refresh</em> или притиснете <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Појдете на <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Мекинтош), а потоа на <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
"usercssyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
+ "userjsonyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов JSON пред да зачувате.",
"userjsyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript пред да зачувате.",
"usercsspreview": "'''Запомнете дека ова е само преглед на вашиот кориснички CSS код, страницата сè уште не е зачувана!'''",
+ "userjsonpreview": "<strong>Запомнете дека ова е само испробување/преглед на поставеноста на вашиот JSON. \nСтраницата сè уште не е зачувана!</strong>",
"userjspreview": "'''Запомнете дека ова е само преглед на вашиот JavaScript код, страницата сè уште не е зачувана!'''",
"sitecsspreview": "'''Запомнете дека ова е само преглед на овој CSS-код.'''\n'''Сè уште не е зачуван!'''",
+ "sitejsonpreview": "<strong>Запомнете дека ова е само преглед на оваа поставеност на JSON. Сè уште не е зачуван!</strong>",
"sitejspreview": "'''Запомнете дека ова е само преглед на овој JavaScript-код.'''\n'''Сè уште не е зачуван!'''",
- "userinvalidconfigtitle": "'''Предупредување:''' Нема руво „$1“.\nЗапомнете дека сопствените .css и .js страници имаат имиња со мали букви, пр. {{ns:user}}:Некој/vector.css наместо {{ns:user}}:Некој/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Предупредување:</strong> Нема руво „$1“.\nСтраниците со наставка .css, .json и .js имаат имиња со мали букви, пр. {{ns:user}}:Некој/vector.css наместо {{ns:user}}:Некој/Vector.css.",
"updated": "(Подновено)",
"note": "'''Напомена:'''",
"previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
"stub-threshold-disabled": "Оневозможено",
"recentchangesdays": "Денови за приказ во скорешните промени:",
"recentchangesdays-max": "(највеќе {{PLURAL:$1|еден ден|$1 дена}})",
- "recentchangescount": "Број на уредувања кои ќе се прикажуваат по основно:",
- "prefs-help-recentchangescount": "Ð\9fодÑ\80азбиÑ\80а Ñ\81коÑ\80еÑ\88ни пÑ\80омени, иÑ\81Ñ\82оÑ\80ии на Ñ\81Ñ\82Ñ\80аниÑ\86и и дневниÑ\86и.",
+ "recentchangescount": "Бројот на уредувања за приказ во скорешните промени, историите на страниците и во дневници. По основно:",
+ "prefs-help-recentchangescount": "Ð\9dаÑ\98веÑ\9cе: 1000",
"prefs-help-watchlist-token2": "Ова е тајна шифра за тековникот на вашите набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\nАко е потребно, [[Special:ResetTokens|можете да ставите нова]].",
"savedprefs": "Вашите нагодувања се зачувани.",
"savedrights": "Корисничките групи на {{GENDER:$1|$1}} се зачувани.",
"default": "по основно",
"prefs-files": "Податотеки",
"prefs-custom-css": "Посебно CSS",
+ "prefs-custom-json": "Прилагоден JSON",
"prefs-custom-js": "Посебно JS",
- "prefs-common-config": "Заеднички CSS/JS за сите изгледи:",
+ "prefs-common-config": "Заеднички CSS/JSON/JavaScript за сите рува:",
"prefs-reset-intro": "Може да ја користите оваа страница за враќање на вашите нагодувања на основно-зададените нагодувања на викито. Ова дејство е неповратно.",
"prefs-emailconfirm-label": "Потврда на е-пошта:",
"youremail": "Е-пошта:",
"right-editcontentmodel": "Уредување на содржинскиот модел на страница",
"right-editinterface": "Уредување на кориснички посредник",
"right-editusercss": "Уредување на CSS податотеки на други корисници",
+ "right-edituserjson": "Уредување на JSON-податотеките на други корисници",
"right-edituserjs": "Уредување на JS податотеки на други корисници",
"right-editmyusercss": "Уредување на сопствени кориснички каскадни стилски податотеки (CSS)",
+ "right-editmyuserjson": "Уредување на сопствените кориснички JSON-податотеки",
"right-editmyuserjs": "Уредување на сопствени кориснички податотеки со JavaScript",
"right-viewmywatchlist": "Преглед на вашиот список на набљудувања",
"right-editmywatchlist": "Уредување на вашите набљудувани. Извесни дејства сепак ќе ставаат страници во нив и без да го имате ова право.",
"grant-createaccount": "Правење сметки",
"grant-createeditmovepage": "Создавање, уредување и преместување страници",
"grant-delete": "Бришење страници, преработки и дневнички записи",
- "grant-editinterface": "Измена на именскиот простор „МедијаВики“ и кориснички CSS/JavaScript",
- "grant-editmycssjs": "Уредување на вашиот кориснички CSS/JavaScript",
+ "grant-editinterface": "Измена на именскиот простор „МедијаВики“ и кориснички CSS/JSON/JavaScript",
+ "grant-editmycssjs": "Уредување на вашиот кориснички CSS/JSON/JavaScript",
"grant-editmyoptions": "Уредување на вашите кориснички нагодувања",
"grant-editmywatchlist": "Уредување на вашите набљудувани",
"grant-editpage": "Менување постоечки страници",
"group-bot.css": "/* Тука поставениот CSS ќе се применува само врз ботовите */",
"group-sysop.css": "/* Тука поставениот CSS ќе се применува само врз системските оператори */",
"group-bureaucrat.css": "/* Тука поставениот CSS ќе се применува само врз бирократите */",
+ "common.json": "/* Тука поставениот JSON ќе им се вчитува на сите корисници при отворањето на секоја страница. */",
"common.js": "/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */",
"group-autoconfirmed.js": "/* Тука поставениот JavaScript ќе им се вчитува само на автопотврдените корисници */",
"group-user.js": "/* Тука поставениот JavaScript ќе им се вчитува само на регистрираните корисници */",
"unlinkaccounts-success": "Сметката е одврзана.",
"authenticationdatachange-ignored": "Промената на податоците во заверката не е обработена. Можеби не е поставен услужник?",
"userjsispublic": "Напомена: потстраниците со JavaScript не треба да содржат дсоверливи податоци бидејќи истите се видливи и за други корисници.",
+ "userjsonispublic": "Имајте на ум: Потстраниците со JSON не треба да содржат доверливи податоци бидејќи истите се видливи за другите корисници.",
"usercssispublic": "Напомена: потстраниците со CSS не треба да содржат дсоверливи податоци бидејќи истите се видливи и за други корисници.",
"restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
"restrictionsfield-label": "Допуштени IP-опсези:",
"wrongpasswordempty": "രഹസ്യവാക്ക് നൽകിയിരുന്നില്ല. വീണ്ടും ശ്രമിക്കുക.",
"passwordtooshort": "രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.",
"passwordtoolong": "രഹസ്യവാക്കിൽ പരമാവധി {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} മാത്രമേ പാടുള്ളു.",
- "passwordtoopopular": "പരà´\95àµ\8dà´\95àµ\86 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ രഹസàµ\8dയവാà´\95àµ\8dà´\95àµ\81à´\95ൾ à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´°àµ\81à´¤àµ\8d. ദയവായി à´\95àµ\82à´\9fàµ\81തൽ à´\85നനàµ\8dയമായ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
+ "passwordtoopopular": "പരà´\95àµ\8dà´\95àµ\86 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ രഹസàµ\8dയവാà´\95àµ\8dà´\95àµ\81à´\95ൾ à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´°àµ\81à´¤àµ\8d. ദയവായി à´\8aഹിà´\9aàµ\8dà´\9aàµ\86à´\9fàµ\81à´\95àµ\8dà´\95ാൻ à´¬àµ\81à´¦àµ\8dധിമàµ\81à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
"password-name-match": "താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.",
"password-login-forbidden": "ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.",
"mailmypassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
"userjspreview": "'''താങ്കൾ താങ്കളുടെ സ്വന്തം ജാവസ്ക്രിപ്റ്റ് പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക. ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
"sitecsspreview": "'''താങ്കൾ ഈ സി.എസ്.എസ്.ന്റെ പ്രിവ്യൂ കാണുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
"sitejspreview": "'''താങ്കൾ ഈ ജാവസ്ക്രിപ്റ്റ് കോഡിന്റെ പ്രിവ്യൂ കാണുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
- "userinvalidconfigtitle": "'''മുന്നറിപ്പ്:''' \"$1\" എന്ന പേരിൽ ഒരു ദൃശ്യരൂപം ഇല്ല. '''.css''' ഉം '''.js''' ഉം താളുകൾ ഇംഗ്ലീഷ് ചെറിയക്ഷര തലക്കെട്ട് ആണ് ഉപയോഗിക്കുന്നതെന്നു ദയവായി ഓർക്കുക. ഉദാ: {{ns:user}}:Foo/Vector.css എന്നതിനു പകരം {{ns:user}}:Foo/vector.css എന്നാണു ഉപയോഗിക്കേണ്ടത്.",
+ "userinvalidconfigtitle": "<strong>മുന്നറിയിപ്പ്:</strong> \"$1\" എന്ന പേരിൽ ഒരു ദൃശ്യരൂപം ഇല്ല. ഐച്ഛികാനുസരണമുള്ള .css, .json, .js താളുകൾ ഇംഗ്ലീഷ് ചെറിയക്ഷര തലക്കെട്ട് ആണ് ഉപയോഗിക്കുന്നതെന്നോർക്കുക. ഉദാ: {{ns:user}}:Foo/Vector.css എന്നതിനു പകരം {{ns:user}}:Foo/vector.css എന്നാണു ഉപയോഗിക്കേണ്ടത്.",
"updated": "(പുതുക്കിയിരിക്കുന്നു)",
"note": "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
"previewnote": "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''\nതാങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല!",
"continue-editing": "തിരുത്തൽ മേഖലയിലേയ്ക്ക് പോവുക",
"previewconflict": "ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ് ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.",
- "session_fail_preview": "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.''' \nദയവായി വീണ്ടും ശ്രമിക്കൂ.\nഎന്നിട്ടും ശരിയാവുന്നില്ലെങ്കിൽ [[Special:UserLogout|ലോഗൗട്ട് ചെയ്തതിനു ശേഷം]] വീണ്ടും ലോഗിൻ ചെയ്തുനോക്കൂ.",
- "session_fail_preview_html": "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.'''\n\n''{{SITENAME}} സംരംഭത്തിൽ raw HTML സജ്ജമാക്കിയിരിക്കുന്നതിനാൽ, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ പ്രിവ്യൂ മറച്ചിരിക്കുന്നു.''\n\n'''താങ്കളുടേതു ഉത്തരവാദിത്വത്തോടെയുള്ള തിരുത്തലെങ്കിൽ, ദയവായി വീണ്ടും ശ്രമിക്കൂ'''. എന്നിട്ടും ശരിയാവുന്നില്ലെങ്കിൽ [[Special:UserLogout|ലോഗൗട്ട് ചെയ്തതിനു]] ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യൂ.",
+ "session_fail_preview": "ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.\n\nതാങ്കൾ പുറത്ത് കടന്നിട്ടുണ്ടാകാം. <strong>ഇപ്പോഴും പ്രവേശിച്ചിരിക്കുകയാണെന്ന് ഉറപ്പ് വരുത്തിയിട്ട് വീണ്ടും ശ്രമിക്കുക</strong>.\nഎന്നിട്ടും ശരിയാവുന്നില്ലെങ്കിൽ [[Special:UserLogout|ലോഗൗട്ട് ചെയ്തതിനു ശേഷം]] വീണ്ടും ലോഗിൻ ചെയ്തുനോക്കൂ.",
+ "session_fail_preview_html": "ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.\n\n<em>{{SITENAME}} സംരംഭത്തിൽ raw HTML സജ്ജമാക്കിയിരിക്കുന്നതിനാൽ, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ പ്രിവ്യൂ മറച്ചിരിക്കുന്നു.</em>\n\n<strong>താങ്കളുടേതു ഉത്തരവാദിത്വത്തോടെയുള്ള തിരുത്തലെങ്കിൽ, ദയവായി വീണ്ടും ശ്രമിക്കൂ.</strong> എന്നിട്ടും ശരിയാവുന്നില്ലെങ്കിൽ [[Special:UserLogout|ലോഗൗട്ട് ചെയ്തതിനു]] ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യൂ, ഒപ്പം താങ്കളുടെ ബ്രൗസർ ഈ സൈറ്റിൽ നിന്നുള്ള കുക്കികൾ അനുവദിക്കുന്നുണ്ടോ എന്നുറപ്പുവരുത്തുക.",
"token_suffix_mismatch": "'''താങ്കളുടെ ക്ലൈന്റ് തിരുത്തൽ കുറിയിലെ ചിഹ്നനങ്ങൾ നശിപ്പിച്ചതിനാൽ താങ്കളുടെ തിരുത്തൽ സ്വീകരിക്കുന്നില്ല.'''\nതാളിലെ എഴുത്തിന്റെ നാശം ഒഴിവാക്കാനാണു താങ്കളുടെ തിരുത്തൽ സ്വീകരിക്കാത്തത്.\nഗുണനിലവാരമില്ലാത്ത വെബ് അധിഷ്ഠിത അജ്ഞാത പ്രോക്സി സേവനങ്ങൾ ഉപയോഗിച്ചാൽ ചിലപ്പോൾ ഇത്തരത്തിലുണ്ടാകാറുണ്ട്.",
"edit_form_incomplete": "'''തിരുത്തൽ ഫോമിന്റെ ചില ഭാഗങ്ങൾ സെർവറിൽ എത്തിയിട്ടില്ല; താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾക്ക് ക്ഷതമേറ്റിട്ടില്ലെന്ന് ഉറപ്പുവരുത്തി വീണ്ടും ശ്രമിക്കുക.'''",
"editing": "തിരുത്തുന്ന താൾ: $1",
"readonlywarning": "<strong>മുന്നറിയിപ്പ്: ഡേറ്റാബേസ് പരിപാലനത്തിനു വേണ്ടി ബന്ധിച്ചിരിക്കുന്നു, അതുകൊണ്ട് താങ്കളിപ്പോൾ വരുത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്യാൻ സാദ്ധ്യമല്ല.</strong>\nതാങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഒരു ടെക്സ്റ്റ് ഫയലിലേക്ക് പകർത്തി (കോപ്പി & പേസ്റ്റ്) പിന്നീടുപയോഗിക്കുന്നതിനായി കരുതിവക്കാൻ താല്പര്യപ്പെടുന്നു. \n\nഡേറ്റാബേസ് ബന്ധിച്ച സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്റർ നൽകിയ വിശദീകരണം: $1",
"protectedpagewarning": "'''മുന്നറിയിപ്പ്: ഈ താൾ കാര്യനിർവാഹക പദവിയുള്ളവർക്കു മാത്രം തിരുത്താൻ സാധിക്കാവുന്ന തരത്തിൽ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
"semiprotectedpagewarning": "'''ശ്രദ്ധിക്കുക:'''അംഗത്വമെടുത്തിട്ടുള്ളവർക്കുമാത്രം തിരുത്താൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
- "cascadeprotectedwarning": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താൾ കാര്യനിർവാഹക അവകാശമുള്ളവർക്കു മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്. ഇനിക്കൊടുക്കുന്ന {{PLURAL:$1|താൾ|താളുകൾ}} നിർഝരിത(cascade) സംരക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ് ഈ താൾ:",
+ "cascadeprotectedwarning": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താൾ [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ളവർക്കു]] മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്. ഇനിക്കൊടുക്കുന്ന {{PLURAL:$1|താൾ|താളുകൾ}} നിർഝരിത(cascade) സംരക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ് ഈ താൾ:",
"titleprotectedwarning": "'''മുന്നറിയിപ്പ്: [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ള]] ഉപയോക്താക്കൾക്ക് മാത്രം സൃഷ്ടിക്കാൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
"templatesused": "ഈ താളിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
"templatesusedpreview": "ഈ പ്രിവ്യൂവിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
"permissionserrorstext-withaction": "താങ്കൾക്ക് $2 എന്ന പ്രവൃത്തി ചെയ്യാൻ അനുമതി ഇല്ല, {{PLURAL:$1|കാരണം|കാരണങ്ങൾ}} താഴെ കൊടുത്തിരിക്കുന്നു:",
"recreate-moveddeleted-warn": "'''മുന്നറിയിപ്പ്: മുമ്പ് മായ്ച്ചുകളഞ്ഞ താളാണ് താങ്കൾ വീണ്ടും ചേർക്കാൻ ശ്രമിക്കുന്നത്'''\n\nതാങ്കൾ ചെയ്യുന്നത് ശരിയായ നടപടിയാണോ എന്നു പരിശോധിക്കുക. ഉറപ്പിനായി ഈ താളിന്റെ മായ്ക്കൽ രേഖയും മാറ്റൽ രേഖയും കൂടെ ചേർത്തിരിക്കുന്നു.",
"moveddeleted-notice": "ഈ താൾ മായ്ക്കപ്പെട്ടിരിക്കുന്നു.\nഈ താളിന്റെ മായ്ക്കൽ, സംരക്ഷണ, മാറ്റ രേഖ പരിശോധനയ്ക്കായി താഴെ കൊടുത്തിരിക്കുന്നു",
- "moveddeleted-notice-recent": "ക്ഷമിക്കുക, ഈ താൾ ഈയടുത്ത് (കഴിഞ്ഞ 24 മണിക്കൂറിനുള്ളിൽ) മായ്ക്കപ്പെട്ടു.\nഅവലംബമായി മായ്ക്കലിന്റെയും താൾ നീക്കിയതിന്റെയും രേഖ താഴെ കൊടുത്തിരിക്കുന്നു.",
+ "moveddeleted-notice-recent": "ക്ഷമിക്കുക, ഈ താൾ ഈയടുത്ത് (കഴിഞ്ഞ 24 മണിക്കൂറിനുള്ളിൽ) മായ്ക്കപ്പെട്ടു.\nഅവലംബമായി മായ്ക്കലിന്റെയും, സംരക്ഷിക്കലിന്റെയും, താൾ നീക്കിയതിന്റെയും രേഖ താഴെ കൊടുത്തിരിക്കുന്നു.",
"log-fulllog": "എല്ലാ രേഖകളും കാണുക",
"edit-hook-aborted": "തിരുത്തൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.\nവിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.",
"edit-gone-missing": "ഈ താൾ പുതുക്കുവാൻ സാധിക്കുകയില്ല.\nഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.",
"stub-threshold-disabled": "നിർജ്ജീവമാക്കപ്പെട്ടിരിക്കുന്നു",
"recentchangesdays": "പുതിയ മാറ്റങ്ങളിൽ കാണിക്കേണ്ട ദിവസങ്ങളുടെ എണ്ണം:",
"recentchangesdays-max": "പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}",
- "recentchangescount": "സ്വതേ പ്രദർശിപ്പിക്കേണ്ട തിരുത്തലുകളുടെ എണ്ണം:",
- "prefs-help-recentchangescount": "à´ªàµ\81തിയ മാറàµ\8dà´±à´\99àµ\8dà´\99ൾ, താളിനàµ\8dà´±àµ\86 നാൾവഴിà´\95ൾ, à´°àµ\87à´\96à´\95ൾ à´\8eà´¨àµ\8dനിവà´\95àµ\8dà´\95àµ\81à´\82 à´\87à´¤àµ\8d ബാധà´\95മാണàµ\8d.",
- "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ വെബ്ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\n[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].",
+ "recentchangescount": "സമàµ\80à´ªà´\95ാലമാറàµ\8dà´±à´\99àµ\8dà´\99ളിലàµ\81à´\82 താളàµ\81à´\95à´³àµ\81à´\9fàµ\86 നാൾപàµ\8dപതിപàµ\8dà´ªàµ\81à´\95ളിലàµ\81à´\82 à´°àµ\87à´\96à´\95ളിലàµ\81à´\82 à´¸àµ\8dവതàµ\87 à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9f തിരàµ\81à´¤àµ\8dതലàµ\81à´\95à´³àµ\81à´\9fàµ\86 à´\8eà´£àµ\8dà´£à´\82:",
+ "prefs-help-recentchangescount": "പരമാവധി à´\8eà´£àµ\8dà´£à´\82: 1000",
+ "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ വെബ്ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\nതാങ്കൾക്കാവശ്യമെങ്കിൽ [[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കാവുന്നതാണ്]].",
"savedprefs": "താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.",
"savedrights": "{{GENDER:$1|$1}} എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ സംഘങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
"timezonelegend": "സമയ മേഖല:",
"prefs-files": "പ്രമാണങ്ങൾ",
"prefs-custom-css": "സ്വന്തം സി.എസ്.എസ്.",
"prefs-custom-js": "സ്വന്തം ജെ.എസ്.",
- "prefs-common-config": "എല്ലാ ദൃശ്യരൂപങ്ങൾക്കുമായി പങ്ക് വെയ്ക്കപ്പെട്ട സി.എസ്.എസ്./ജെ.എസ്.:",
+ "prefs-common-config": "എല്ലാ ദൃശ്യരൂപങ്ങൾക്കുമായി പങ്ക് വെയ്ക്കപ്പെട്ട സി.എസ്.എസ്./ജെസൺ/ജാവാസ്ക്രിപ്റ്റ്:",
"prefs-reset-intro": "സൈറ്റിൽ സ്വതേയുണ്ടാവേണ്ട ക്രമീകരണങ്ങൾ പുനഃക്രമീകരിക്കാൻ താങ്കൾക്ക് ഈ താൾ ഉപയോഗിക്കാവുന്നതാണ്.\nഇത് തിരിച്ചു ചെയ്യാൻ സാദ്ധ്യമല്ല.",
"prefs-emailconfirm-label": "ഇമെയിൽ സ്ഥിരീകരണം:",
"youremail": "ഇമെയിൽ:",
"right-siteadmin": "ഡേറ്റാബേസ് തുറക്കുക, പൂട്ടുക",
"right-override-export-depth": "കണ്ണിവത്കരിക്കപ്പെട്ട താളുകളുടെ ആഴം 5 വരെയുള്ള താളുകൾ കയറ്റുമതി ചെയ്യുക",
"right-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
- "right-managechangetags": "ഡേറ്റാബേസിൽ നിന്നുള്ള [[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ മായ്ക്കുക",
+ "right-managechangetags": "[[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുക",
"right-applychangetags": "മാറ്റങ്ങളോടൊപ്പം [[Special:Tags|ടാഗുകളും]] ബാധകമാക്കുക",
"right-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക [[Special:Tags|ടാഗുകൾ]] ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
"grant-generic": "\"$1\" അവകാശ സഞ്ചയം",
"grant-createaccount": "അംഗത്വങ്ങൾ സൃഷ്ടിക്കുക",
"grant-createeditmovepage": "താളുകൾ സൃഷ്ടിക്കുക, തിരുത്തുക, മാറ്റുക",
"grant-delete": "താളുകൾ, നാൾപ്പതിപ്പുകൾ, രേഖകളിലെ ഉൾപ്പെടുത്തലുകൾ മായ്ക്കുക",
- "grant-editinterface": "മീഡിയവിക്കി നാമമേഖലയും ഉപയോക്തൃ സി.എസ്.എസ്./ജാവാസ്ക്രിപ്റ്റും തിരുത്തുക",
- "grant-editmycssjs": "താങ്കളുടെ ഉപയോക്തൃ സി.എസ്.എസ്./ജാവാസ്ക്രിപ്റ്റ് തിരുത്തുക",
+ "grant-editinterface": "à´®àµ\80ഡിയവിà´\95àµ\8dà´\95à´¿ നാമമàµ\87à´\96ലയàµ\81à´\82 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 സി.à´\8eà´¸àµ\8d.à´\8eà´¸àµ\8d./à´\9càµ\86സൺ/à´\9cാവാസàµ\8dà´\95àµ\8dà´°à´¿à´ªàµ\8dà´±àµ\8dà´±àµ\81à´\82 തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95",
+ "grant-editmycssjs": "താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 സി.à´\8eà´¸àµ\8d.à´\8eà´¸àµ\8d./à´\9càµ\86സൺ/à´\9cാവാസàµ\8dà´\95àµ\8dà´°à´¿à´ªàµ\8dà´±àµ\8dà´±àµ\8d തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95",
"grant-editmyoptions": "താങ്കളുടെ ഉപയോക്തൃ ക്രമീകരണങ്ങൾ തിരുത്തുക",
"grant-editmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക",
"grant-editpage": "നിലവിലുള്ള താളുകൾ തിരുത്തുക",
"uploadstash-clear": "രഹസ്യമാക്കിയ പ്രമാണങ്ങൾ ശൂന്യമാക്കുക",
"uploadstash-nofiles": "താങ്കൾക്ക് രഹസ്യമാക്കിയ പ്രമാണങ്ങൾ ഒന്നുമില്ല.",
"uploadstash-badtoken": "പ്രവൃത്തി വിജയകരമായിരുന്നില്ല, താങ്കളുടെ തിരുത്തുവാനുള്ള അവകാശങ്ങൾ ചിലപ്പോൾ കാലഹരണപ്പെട്ടിട്ടുണ്ടാകാം. വീണ്ടും ശ്രമിക്കുക.",
- "uploadstash-errclear": "à´ªàµ\8dരമാണà´\99àµ\8dà´\99ൾ à´¶àµ\82à´¨àµ\8dയമാà´\95àµ\8dà´\95ൽ വിà´\9cà´¯à´\95രമായിരàµ\81à´¨àµ\8dനിലàµ\8dà´².",
+ "uploadstash-errclear": "à´ªàµ\8dരമാണà´\99àµ\8dà´\99ൾ à´¶àµ\82à´¨àµ\8dയമാà´\95àµ\8dà´\95ൽ പരാà´\9cയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fàµ\81.",
"uploadstash-refresh": "പ്രമാണങ്ങളുടെ പട്ടിക പുതുക്കുക",
"uploadstash-thumbnail": "ലഘുചിത്രം കാണുക",
"uploadstash-bad-path-unknown-type": "അപരിചിതമായ തരം \"$1\".",
"doubleredirects": "ഇരട്ട തിരിച്ചുവിടലുകൾ",
"doubleredirectstext": "ഈ താളിൽ ഒരു തിരിച്ചുവിടലിൽ നിന്നും മറ്റു തിരിച്ചുവിടൽ താളുകളിലേയ്ക്ക് പോകുന്ന താളുകൾ കൊടുത്തിരിക്കുന്നു. ഓരോ വരിയിലും ഒന്നാമത്തേയും രണ്ടാമത്തേയും തിരിച്ചുവിടൽ താളിലേക്കുള്ള കണ്ണികളും, രണ്ടാമത്തെ തിരിച്ചുവിടൽ താളിൽ നിന്നു ശരിയായ ലക്ഷ്യതാളിലേക്കുള്ള കണ്ണികളും ഉൾക്കൊള്ളുന്നു.\n<del>വെട്ടിക്കൊടുത്തിരിക്കുന്നവ</del> ശരിയാക്കിയവയാണ്.",
"double-redirect-fixed-move": "[[$1]] മാറ്റിയിരിക്കുന്നു.\nഇത് ഇപ്പോൾ സ്വയം പുതുക്കപ്പെട്ട് [[$2]] എന്നതിലേയ്ക്ക് തിരിച്ചുവിടപ്പെട്ടിരിക്കുന്നു.",
- "double-redirect-fixed-maintenance": "[[$1]] എന്ന താളിൽ നിന്ന് [[$2]] എന്ന താളിലേയ്ക്കുള്ള ഇരട്ട തിരിച്ചുവിടൽ പരിപാലനജോലികൾക്കിടെ സ്വയം ശരിയാക്കുന്നു.",
+ "double-redirect-fixed-maintenance": "[[$1]] എന്ന താളിൽ നിന്ന് [[$2]] എന്ന താളിലേയ്ക്കുള്ള ഇരട്ട തിരിച്ചുവിടൽ പരിപാലനജോലികൾക്കിടെ സ്വയം ശരിയാക്കുന്നു",
"double-redirect-fixer": "തിരിച്ചുവിടൽ ശരിയാക്കിയത്",
"brokenredirects": "മുറിഞ്ഞ തിരിച്ചുവിടലുകൾ",
"brokenredirectstext": "താഴെക്കാണുന്ന തിരിച്ചുവിടലുകൾ നിലവിലില്ലാത്ത താളുകളിലേയ്ക്കാണ്:",
"tmp-write-error": "ယာယီဖိုင်ရေးသားရာတွင် အမှားဖြစ်ပေါ်နေသည်။",
"largefileserver": "ဤဖိုင်သည် ဆာဗာတွင် ခွင့်ပြုရန်သတ်မှတ်ထားသော ဖိုင်အရွယ်အစားထက် ကြီးနေသည်။",
"file-exists-duplicate": "ဤဖိုင်သည် အောက်ပါ {{PLURAL:$1|ဖိုင်|ဖိုင်များ}}၏ ထပ်တူပုံပွား ဖြစ်သည် -",
- "uploadwarning": "Upload á\80\90á\80\84á\80ºá\80\9bá\80¬á\80\90á\80½á\80\84á\80º á\80\9eá\80\90á\80ºပေးချက်",
+ "uploadwarning": "Upload á\80\90á\80\84á\80ºá\80\9bá\80¬á\80\90á\80½á\80\84á\80º á\80\9eá\80\90á\80ပေးချက်",
"savefile": "ဖိုင်သိမ်းရန်",
"uploaddisabled": "Upload တင်ခြင်း ပိတ်ထားသည်။",
"copyuploaddisabled": "URL လင့်မှ Upload တင်ခြင်း ပိတ်ထားသည်။",
"Macofe",
"V6rg",
"Nemo bis",
- "S4b1nuz E.656"
+ "S4b1nuz E.656",
+ "Ruthven"
]
},
"tog-underline": "Sottolinia 'e jonte:",
"permissionserrorstext-withaction": "Nun haje premmesse abbastante pe' $2, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
"contentmodelediterror": "Vuje nun putite cagnà sta verziona pecché 'o mudell' 'e cuntenute è <code>$1</code>, ca cagnasse nu poco nfacc' 'o mudell' 'e mò d' 'a paggena è <code>$2</code>.",
"recreate-moveddeleted-warn": "'''Attenziò: staje a crià na paggena scancellata già.'''\n\nVire si è bbuono 'e cuntinuà a cagnà sta paggena. L'elenco ch' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' ffà comodo:",
- "moveddeleted-notice": "Sta paggena è stata scancellata.\nL'elenco d' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' n'avé nfurmazione.",
+ "moveddeleted-notice": "Sta paggena è stata scancellata.\n'A lista d' 'e relative scancellamiente e spustamente sta cca 'bbascio pe' n'avé 'nfurmazione.",
"moveddeleted-notice-recent": "Scusate, sta mmasciata è stata scancellata mo mo (dint'a sti 24 ore).\n\nL'aziune 'e scancellazione e spustamento pe' sta paggena so dispunibbele ccà p' 'a cumpretezza.",
"log-fulllog": "Vide log sano",
"edit-hook-aborted": "'O cagnamiento è stato annullato 'a 'o «hook».\nNun dette spiegazione nisciuna.",
"rcshowhidecategorization": "$1 categorizzaziona d' 'a paggena",
"rcshowhidecategorization-show": "Faje vedé",
"rcshowhidecategorization-hide": "Annascunne",
- "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne",
+ "rclinks": "Faje vedé ll'urdeme $1 cagnamienti dint' ll'urdeme $2 juorne",
"diff": "diff",
"hist": "cron",
"hide": "annascunne",
"unwatchthispage": "Nun cuntrullà cchiù sta paggena",
"notanarticle": "Chesta paggena nun è na voce",
"notvisiblerev": "'A verzione è stata scancellata",
- "watchlist-details": "L'elenco 'e paggene cuntrullate cuntene {{PLURAL:$1|na paggena (e pure 'a paggena 'e chiacchiera)|$1 paggene (e pure 'e paggene 'e chiacchiera}}.",
+ "watchlist-details": "L'elenco 'e paggene cuntrullate tene {{PLURAL:$1|na paggena (e pure 'a paggena 'e chiacchiera)|$1 paggene (e pure 'e ppaggene 'e chiacchiera}}.",
"wlheader-enotif": "'A funzione 'e notifiche e-mail è appicciata.",
"wlheader-showupdated": "* 'E paggene cca so' state cagnate a l'urdema visita avevano so' nzignate ccà 'n '''grassetto'''.",
"wlnote": "Ccà abbascio {{PLURAL:$1|è elencato 'o cagnamiento cchiù ricente|songo elencate 'e <strong>$1</strong> cagnamiente cchiù recente}} {{PLURAL:$2|int'a ll'urdema ora|int' 'e ll'urdeme <strong>$2</strong> ore}}; 'e date songo agghiurnate 'o $3, $4.",
"wrongpasswordempty": "Du oppga ikke noe passord. Prøv igjen.",
"passwordtooshort": "Passord må ha minst {{PLURAL:$1|ett tegn|$1 tegn}}.",
"passwordtoolong": "Passord kan ikke overskride {{PLURAL:$1|1 character|$1 characters}}.",
- "passwordtoopopular": "Nylig valgt passord kan ikke brukes. Vennligst bruk et mer unikt passord.",
+ "passwordtoopopular": "Hyppig brukte passord kan ikke brukes. Vennligst bruk et mer unikt passord.",
"password-name-match": "Passord og brukernavn kan ikke være det samme.",
"password-login-forbidden": "Bruken av dette brukernavnet og passordet er forbudt.",
"mailmypassword": "Tilbakestill passord",
"expansion-depth-exceeded-warning": "Sida har overskredet ekspansjonsdybden",
"parser-unstrip-loop-warning": "«Unstrip»-loop påvist",
"unstrip-depth-warning": "Rekursjonsgrense for taggfjerning overskredet ($1)",
+ "unstrip-depth-category": "Sider hvor dybdegrensen for unstrip er nådd",
+ "unstrip-size-warning": "Størrelsesgrensen for unstrip er nådd ($1)",
+ "unstrip-size-category": "Sider hvor størrelsesgrensen for unstrip er nådd",
"converter-manual-rule-error": "En feil ble oppdaget i en manuell språkkonverteringsregel",
"undo-success": "Redigeringen kan omgjøres. Sjekk sammenligningen under for å bekrefte at du vil gjøre dette, og lagre endringene for å fullføre omgjøringen.",
"undo-failure": "Redigeringen kunne ikke omgjøres på grunn av konflikterende etterfølgende redigeringer.",
"stub-threshold-disabled": "Deaktivert",
"recentchangesdays": "Antall dager som skal vises i siste endringer:",
"recentchangesdays-max": "Maks $1 {{PLURAL:$1|dag|dager}}",
- "recentchangescount": "Antall redigeringer som skal vises som standard:",
+ "recentchangescount": "Antall redigeringer som skal vises som standard i siste endringer, sidehistorikker og logger:",
"prefs-help-recentchangescount": "Maksimalt antall: 1000",
"prefs-help-watchlist-token2": "Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.\nEnhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.\nOm du trenger å gjøre det kan du [[Special:ResetTokens|nullstille nøkkelen]].",
"savedprefs": "Innstillingene ble lagret.",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
"limitreport-expansiondepth": "Største ekspansjonsdybde",
"limitreport-expensivefunctioncount": "Antall kostbare parserfunksjoner",
+ "limitreport-unstrip-depth": "Rekursjonsdybde for unstrip",
+ "limitreport-unstrip-size": "Størrelse for unstrip etter utvidelse",
"limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte}}",
"expandtemplates": "Utvid maler",
"expand_templates_intro": "Denne spesialsiden tar wikitekst og utvider rekusivt alle maler brukt i teksten. \nDen utvider også alle parserfunksjoner som \n<code><nowiki>{{</nowiki>#language:…}}</code>, og variabler som \n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nFaktisk utvider den det meste innkapslet i doble krøllparenteser.",
"editfont-monospace": "Lettertype waorvan t tekenbreedte vaste steet",
"editfont-sansserif": "Sans-seriflettertype",
"editfont-serif": "Seriflettertype",
- "sunday": "zundag",
- "monday": "maondag",
- "tuesday": "diensdag",
+ "sunday": "sündag",
+ "monday": "måndag",
+ "tuesday": "dinsdag",
"wednesday": "woonsdag",
"thursday": "donderdag",
- "friday": "vriedag",
- "saturday": "zaoterdag",
+ "friday": "vrydag",
+ "saturday": "såterdag",
"sun": "zun",
"mon": "mao",
"tue": "die",
"thu": "don",
"fri": "vrie",
"sat": "zao",
- "january": "jannewaori",
- "february": "febrewaori",
- "march": "meert",
+ "january": "januåri",
+ "february": "februåri",
+ "march": "määrt",
"april": "april",
"may_long": "mei",
"june": "juni",
"september": "september",
"october": "oktober",
"november": "november",
- "december": "desember",
+ "december": "december",
"january-gen": "jannewaori",
"february-gen": "febrewaori",
"march-gen": "meert",
"feb": "feb",
"mar": "mrt",
"apr": "apr",
- "may": "mei",
+ "may": "mey",
"jun": "jun",
"jul": "jul",
"aug": "aug",
"sep": "sep",
"oct": "okt",
"nov": "nov",
- "dec": "des",
+ "dec": "dec",
"january-date": "$1 jannewaori",
"february-date": "$1 febrewaori",
"march-date": "$1 meert",
"morenotlisted": "Disse lieste is niet kompleet...",
"mypage": "Gebrukerszied",
"mytalk": "Myn oaverleg",
- "anontalk": "Overleg",
+ "anontalk": "Oaverleg",
"navigation": "Navigasie",
"and": " en",
"faq": "Vragen die vake esteld wörden",
"viewdeleted_short": "{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken",
"protect": "Beveiligen",
"protect_change": "wiezigen",
- "unprotect": "Beveiliging wiezigen",
+ "unprotect": "Beveyliging wysigen",
"newpage": "Nieje zied",
- "talkpagelinktext": "Overleg",
+ "talkpagelinktext": "Oaverleg",
"specialpage": "Spesiale zied",
"personaltools": "Persoonlike instellingen",
"talk": "Oaverleg",
"youhavenewmessagesmanyusers": "Je hebben $1 van n bulte gebrukers ($2).",
"newmessageslinkplural": "{{PLURAL:$1|n niej bericht|999=nieje berichten}}",
"newmessagesdifflinkplural": "leste {{PLURAL:$1|wieziging|999=wiezigingen}}",
- "youhavenewmessagesmulti": "Je hebben nieje berichten op $1",
+ "youhavenewmessagesmulti": "Jy hebben nye berichten up $1",
"editsection": "bewark",
"editold": "bewark",
"viewsourceold": "brontekste bekyken",
"recentchanges-summary": "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
"recentchanges-noresult": "Der waren in disse periode gien wiezigingen die an de kriteria voldoon.",
"recentchanges-feed-description": "Zeuk naor de alderleste wiezingen op disse wiki in disse voer.",
- "recentchanges-label-newpage": "Mit disse bewarking is n nieje zied an-emaakt",
- "recentchanges-label-minor": "Dit is n kleine wieziging",
- "recentchanges-label-bot": "Disse bewarking is uutevoerd deur n bot",
- "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
- "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
+ "recentchanges-label-newpage": "Mid disse bewarking is een nye syde an-emaakt",
+ "recentchanges-label-minor": "Dit is een kleyne wysiging",
+ "recentchanges-label-bot": "Disse bewarking is uutevoord döär een bot",
+ "recentchanges-label-unpatrolled": "Disse bewarking is noch nyt nå-ekeaken",
+ "recentchanges-label-plusminus": "Disse sydegroutte is mid dit antal bytes ewysigd",
"recentchanges-legend-heading": "<strong>Legenda:</strong>",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sy ouk de [[Special:NewPages|lyste mid nye syden]])",
"recentchanges-submit": "Bekiek",
- "rcfilters-legend-heading": "<strong>Lieste mit aofkortingen:</strong>",
+ "rcfilters-legend-heading": "<strong>Lyste mid ofkortingen:</strong>",
"rcfilters-group-results-by-page": "Resultaoten per zied groeperen",
- "rcfilters-activefilters": "Aktieve filters",
+ "rcfilters-activefilters": "Aktive filters",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|wysiging|wysigingen}}, $2",
"rcfilters-days-title": "De leste dagen",
"rcfilters-hours-title": "De leste uren",
- "rcfilters-quickfilters": "Op-esleugen filterinstellingen",
- "rcfilters-quickfilters-placeholder-title": "Nog gien verwiezingen op-esleugen",
- "rcfilters-quickfilters-placeholder-description": "Um joew filterinstellingen op te slaon en t laoter te gebruken, klik op t bladwiezerikoon onderan bie \"Aktieve filter\".",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|dag|dagen}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|uur|uren}}",
+ "rcfilters-quickfilters": "Up-eslöägen filters",
+ "rcfilters-quickfilters-placeholder-title": "Noch gyn filters up-eslöägen",
+ "rcfilters-quickfilters-placeholder-description": "Üm juuw filterinstellingen up te slån en et låter te gebruken, klik up et bladwyserikoon underan by \"Aktive filters\".",
"rcfilters-savedqueries-apply-label": "Instellingen opslaon",
"rcfilters-savedqueries-cancel-label": "Aofbreken",
- "rcfilters-savedqueries-add-new-title": "Filterinstellingen opslaon",
+ "rcfilters-savedqueries-add-new-title": "Filterinstellingen upslån",
"rcfilters-restore-default-filters": "Standardfilters weerummezetten",
"rcfilters-clear-all-filters": "Alle filters vortdoon",
- "rcfilters-search-placeholder": "Filter leste wiezigingen (blaojer of begin mit intypen)",
- "rcfilters-filterlist-feedbacklink": "Geef kommentaar op de nieje (bèta)filters",
- "rcfilters-highlightbutton-title": "Resultaoten markeren",
+ "rcfilters-search-placeholder": "Filter wysigingen (gebruuk et menu of söök up filtername)",
+ "rcfilters-filterlist-feedbacklink": "Låt uns weaten wat jy van disse (nye) filterhülpmiddels vinden",
+ "rcfilters-highlightbutton-title": "Resultåten markeren",
"rcfilters-highlightmenu-title": "Kies n kleur",
+ "rcfilters-filtergroup-userExpLevel": "Gebrukersanmelding en ervåring",
+ "rcfilters-filter-user-experience-level-registered-label": "An-emeld",
+ "rcfilters-filter-user-experience-level-registered-description": "An-emelde bewarkers.",
+ "rcfilters-filter-user-experience-level-unregistered-label": "Nyt an-emeld",
+ "rcfilters-filter-user-experience-level-unregistered-description": "Bewarkers dy nyt an-emeld binnen.",
+ "rcfilters-filter-user-experience-level-newcomer-label": "Anwas",
+ "rcfilters-filter-user-experience-level-newcomer-description": "An-emelde bewarkers dy minder as 10 bewarkingen edån hebben of 4 dagen aktiv ewest binnen.",
+ "rcfilters-filter-user-experience-level-learner-label": "Learlingen",
+ "rcfilters-filter-user-experience-level-learner-description": "An-emelde bewarkers mid meer ervåring as \"anwas\", mär minder as \"ervåren gebrukers\".",
+ "rcfilters-filter-user-experience-level-experienced-label": "Ervåren gebrukers",
+ "rcfilters-filter-user-experience-level-experienced-description": "An-emelde bewarkers mid meer as 500 bewarkingen en 30 dagen van aktiviteyt.",
"rcfilters-filter-bots-label": "Bot",
- "rcfilters-filter-humans-label": "Meenselik (gien bot)",
- "rcfilters-filter-humans-description": "Bewarkingen deur meenselike bewarkers.",
+ "rcfilters-filter-humans-label": "Meanskelik (gyn bot)",
+ "rcfilters-filter-humans-description": "Bewarkingen döär meanskelike bewarkers.",
"rcfilters-filtergroup-reviewstatus": "Beoordelingsstaotus",
"rcfilters-filter-patrolled-label": "Nao-ekeken",
"rcfilters-filter-unpatrolled-label": "Niet nao-ekeken",
"rcfilters-filtergroup-significance": "Petansie",
- "rcfilters-filter-minor-label": "Kleine bewarkingen",
- "rcfilters-filter-major-label": "Gien kleine bewarking",
+ "rcfilters-filter-minor-label": "Kleyne bewarkingen",
+ "rcfilters-filter-major-label": "Gyn kleyne bewarking",
"rcfilters-filter-major-description": "Bewarkingen niet emarkeerd as klein.",
"rcfilters-filtergroup-watchlist": "Evolgde ziejen",
"rcfilters-filter-watchlist-watched-label": "Op de volglieste",
"rcfilters-filter-watchlist-watchednew-label": "Nieje volgliestwiezigingen",
"rcfilters-filter-watchlist-notwatched-label": "Niet op de volglieste",
"rcfilters-filter-watchlist-notwatched-description": "Alles behalve wiezigingen an ziejen die op joew volglieste staon.",
- "rcfilters-filter-pageedits-label": "Ziedbewarkingen",
- "rcfilters-filter-newpages-label": "Nieje ziejen",
- "rcfilters-filter-newpages-description": "Bewarkingen waormee'j een nieje zied anmaken.",
- "rcfilters-filter-categorization-label": "Kategoriewiezigingen",
- "rcfilters-filter-logactions-label": "Eregistreerden aksies",
- "rcfilters-filtergroup-lastRevision": "Leste versie",
- "rcfilters-filter-lastrevision-label": "Leste versie",
- "rcfilters-filter-previousrevision-label": "Eerdere versies",
- "rcfilters-liveupdates-button": "Rechtstreekse aktualisering",
+ "rcfilters-filter-pageedits-label": "Sydebewarkingen",
+ "rcfilters-filter-pageedits-description": "Wysigingen an de wiki-inhold, diskussys, kategorybeskryvingen…",
+ "rcfilters-filter-newpages-label": "Nye syden",
+ "rcfilters-filter-newpages-description": "Bewarkingen wårmead jy een nye syde anmaken.",
+ "rcfilters-filter-categorization-label": "Kategorywysigingen",
+ "rcfilters-filter-categorization-description": "Upgave van syden dy tovoogd of vortedån wörden uut kategoryen.",
+ "rcfilters-filter-logactions-label": "Eregistreerde aktys",
+ "rcfilters-filtergroup-lastRevision": "Lätste versys",
+ "rcfilters-filter-lastrevision-label": "Lätste versy",
+ "rcfilters-filter-lastrevision-description": "Allinnig de lätste wysiging an een syde.",
+ "rcfilters-filter-previousrevision-label": "Nyt de lätste versy",
+ "rcfilters-filter-previousrevision-description": "Alle wysigingen dy nyt de \"lätste versy\" binnen.",
+ "rcfilters-view-namespaces-tooltip": "Filter resultåten up naamruumte",
+ "rcfilters-view-tags-tooltip": "Filter resultåten döär gebruuk te maken van bewarkingsetiketten",
+ "rcfilters-liveupdates-button": "Rechtstreakse aktualisering",
"rcfilters-liveupdates-button-title-off": "Nieje wiezigingen voortdalik laoten zien",
"rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
"rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
"rcshowhidecategorization-show": "Bekiek",
"rcshowhidecategorization-hide": "Verbarg",
"rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen",
- "diff": "wiez",
- "hist": "gesch",
+ "diff": "verskil",
+ "hist": "geskydenisse",
"hide": "verbarg",
"show": "bekiek",
"minoreditletter": "K",
"newpages-submit": "Bekiek",
"newpages-username": "Gebrukersnaam:",
"ancientpages": "Oudste artikels",
- "move": "Herneumen",
+ "move": "Hernömen",
"movethispage": "Herneum",
"unusedimagestext": "Vergeet niet dat aandere wiki's misschien oek n antal van disse bestaanden gebruken.\n\nDe volgende bestaanden bin op-estuurd mer niet in gebruuk.\nt Kan ween dat der drekt verwezen wörden naor n bestaand.\nn Bestaand kan hier dus verkeerd op-eneumen ween.",
"unusedcategoriestext": "De onderstaonde kategorieën bin an-emaakt mer bin niet in gebruuk.",
"sp-contributions-deleted": "vortedaone gebrukersbiedragen",
"sp-contributions-uploads": "nieje bestaanden",
"sp-contributions-logs": "logboeken",
- "sp-contributions-talk": "overleg",
+ "sp-contributions-talk": "oaverleg",
"sp-contributions-userrights": "gebrukersrechtenbeheer",
"sp-contributions-blocked-notice": "Disse gebruker is op t moment eblokkeerd.\nDe leste regel uut t blokkeerlogboek steet hieronder as referensie:",
"sp-contributions-blocked-notice-anon": "Dit IP-adres is eblokkeerd.\nDe leste regel uut t blokkeerlogboek steet as referensie",
"watchlisttools-view": "Wiezigingen bekieken",
"watchlisttools-edit": "Volglieste bekieken en bewarken",
"watchlisttools-raw": "Volglieste as tekstlieste bewarken",
- "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|oaverleg]])",
"duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
"version": "Versie",
"version-extensions": "Uutbreidingen die installeerd bin",
"cascadeprotected": "Deze pagina kan niet bewerkt worden, omdat ze is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:\n$2",
"namespaceprotected": "U hebt geen rechten om pagina's in de naamruimte <strong>$1</strong> te bewerken.",
"customcssprotected": "U kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.",
+ "customjsonprotected": "U kunt deze JSONpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.",
"customjsprotected": "U kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.",
"mycustomcssprotected": "U hebt geen rechten om deze CSS-pagina te bewerken.",
+ "mycustomjsonprotected": "U hebt geen rechten om deze JSONpagina te bewerken.",
"mycustomjsprotected": "U hebt geen rechten om deze JavaScriptpagina te bewerken.",
"myprivateinfoprotected": "U hebt geen rechten om uw privégegevens te bewerken.",
"mypreferencesprotected": "U hebt geen rechten om uw voorkeuren aan te passen.",
"wrongpasswordempty": "Het opgegeven wachtwoord was leeg.\nProbeer het opnieuw.",
"passwordtooshort": "Wachtwoorden moeten uit minstens {{PLURAL:$1|$1 teken|$1 tekens}} bestaan.",
"passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|één teken|$1 tekens}}.",
- "passwordtoopopular": "Vaak gekozen wachtwoorden kunnen niet worden gebruikt. Kies een unieker wachtwoord.",
+ "passwordtoopopular": "Veel gekozen wachtwoorden kunnen niet worden gebruikt. Kies een wachtwoord dat lastiger kan worden geraden.",
"password-name-match": "Uw wachtwoord en uw gebruikersnaam mogen niet overeenkomen.",
"password-login-forbidden": "Het gebruik van deze gebruikersnaam met dit wachtwoord is niet toegestaan.",
"mailmypassword": "Nieuw wachtwoord e-mailen",
"savechanges": "Wijzigingen opslaan",
"publishpage": "Pagina publiceren",
"publishchanges": "Wijzigingen publiceren",
+ "savearticle-start": "Pagina opslaan...",
+ "savechanges-start": "Wijzigingen opslaan...",
+ "publishpage-start": "Pagina publiceren...",
+ "publishchanges-start": "Wijzigingen publiceren...",
"preview": "Voorvertoning",
"showpreview": "Bewerking ter controle bekijken",
"showdiff": "Wijzigingen bekijken",
"blocked-notice-logextract": "Deze gebruiker is momenteel geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
"clearyourcache": "<strong>Opmerking:</strong> nadat u de wijzigingen hebt opgeslagen is het wellicht nodig uw browsercache te legen.\n* <strong>Firefox / Safari:</strong> houd <em>Shift</em> ingedrukt terwijl u op <em>Vernieuwen</em> klikt of druk op <em>Ctrl-F5</em> of <em>Ctrl-R</em> (<em>⌘-Shift-R</em> op een Mac)\n* <strong>Google Chrome:</strong> druk op <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> op een Mac)\n* <strong>Internet Explorer:</strong> houd <em>Ctrl</em> ingedrukt terwijl u op <em>Vernieuwen</em> klikt of druk op <em>Ctrl-F5</em>\n* '''Opera:''' ga naar <em>Menu → Instellingen</em> (<em>Opera → Voorkeuren</em> op een Mac) en daarna naar <em>Privacy & beveiliging → Browsegegevens wissen... → Tijdelijk opgeslgen afbeeldingen en bestanden</em>.",
"usercssyoucanpreview": "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
+ "userjsonyoucanpreview": "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JSON te testen alvorens op te slaan.",
"userjsyoucanpreview": "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
"usercsspreview": "'''Dit is alleen een voorvertoning van uw persoonlijke CSS.'''\n'''Deze is nog niet opgeslagen!'''",
+ "userjsonpreview": "<strong>Let op: u test nu uw persoonlijke JSON.\nDe pagina is niet opgeslagen!</strong>",
"userjspreview": "'''Let op: u test nu uw persoonlijke JavaScript.'''\n'''De pagina is niet opgeslagen!'''",
"sitecsspreview": "'''Dit is alleen een voorvertoning van de CSS.'''\n'''Deze is nog niet opgeslagen!'''",
+ "sitejsonpreview": "<strong>Dit is alleen een voorvertoning van de JSON configuratie.\nDeze is nog niet opgeslagen!</strong>",
"sitejspreview": "'''Dit is alleen een voorvertoning van de JavaScriptcode.'''\n'''Deze is nog niet opgeslagen!'''",
- "userinvalidconfigtitle": "'''Waarschuwing:''' er is geen uiterlijk \"$1\".\nUw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Waarschuwing:</strong>''' er is geen vormgeving \"$1\".\nUw eigen .css-, .json- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
"updated": "(Bijgewerkt)",
"note": "<strong>Opmerking:</strong>",
"previewnote": "'''Let op: dit is een controlepagina.'''\nUw tekst is niet opgeslagen!",
"default": "standaard",
"prefs-files": "Bestanden",
"prefs-custom-css": "Aangepaste CSS",
- "prefs-custom-js": "Aangepast JavaScript",
- "prefs-common-config": "Gedeelde CSS/JavaScript voor elke vormgeving:",
+ "prefs-custom-json": "Aangepaste JSON",
+ "prefs-custom-js": "Aangepaste JavaScript",
+ "prefs-common-config": "Gedeelde CSS/JSON/JavaScript voor elke vormgeving:",
"prefs-reset-intro": "Gebruik deze functie om uw voorkeuren te herstellen naar de standaardinstellingen.\nDeze handeling kan niet ongedaan gemaakt worden.",
"prefs-emailconfirm-label": "E-mailbevestiging:",
"youremail": "E-mailadres:",
"right-editcontentmodel": "Het paginainhoudmodel bewerken",
"right-editinterface": "De gebruikersinterface bewerken",
"right-editusercss": "De CSS-bestanden van andere gebruikers bewerken",
+ "right-edituserjson": "De JSONbestanden van andere gebruikers bewerken",
"right-edituserjs": "De JavaScriptbestanden van andere gebruikers bewerken",
"right-editmyusercss": "Uw eigen CSS-pagina's bewerken",
+ "right-editmyuserjson": "Uw eigen JSonpagina's bewerken",
"right-editmyuserjs": "Uw eigen JavaScriptpagina's bewerken",
"right-viewmywatchlist": "Uw eigen volglijst bekijken",
"right-editmywatchlist": "Uw eigen volglijst bewerken. Via sommige handelingen kunnen nog steeds pagina's toegevoegd worden, zelfs zonder deze bevoegdheid",
"grant-createaccount": "Accounts aanmaken",
"grant-createeditmovepage": "Pagina's aanmaken, bewerken en hernoemen",
"grant-delete": "Pagina's, wijzigingen en logboekregels verwijderen",
- "grant-editinterface": "De naamruimte MediaWiki en CSS en JavaScript van gebruikers bewerken",
- "grant-editmycssjs": "Eigen CSS en JavaScript bewerken",
+ "grant-editinterface": "De naamruimte MediaWiki en CSS, JSON en JavaScript van gebruikers bewerken",
+ "grant-editmycssjs": "Eigen CSS, JSON en JavaScript bewerken",
"grant-editmyoptions": "Eigen voorkeuren instellen",
"grant-editmywatchlist": "Eigen volglijst bewerken",
"grant-editpage": "Bestaande pagina's bewerken",
"group-bot.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op robots */",
"group-sysop.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op beheerders */",
"group-bureaucrat.css": "/* CSS die hier wordt geplaatst heeft alleen invloed op bureaucraten */",
+ "common.json": "/* JSON die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
"common.js": "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
"group-autoconfirmed.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */",
"group-user.js": "/* JavaScript die hier wordt geplaatst heeft alleen invloed op geregistreerde gebruikers */",
"unlinkaccounts-success": "Het account is ontkoppeld.",
"authenticationdatachange-ignored": "De wijziging van de authenticatiegegevens is niet afgehandeld. Misschien is er geen provider geconfigureerd?",
"userjsispublic": "Let op: JavaScript deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
+ "userjsonispublic": "Let op: JSON deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
"usercssispublic": "Let op: CSS deelpagina's moeten geen vertrouwelijke gegevens bevatten omdat ze kunnen worden bekeken door andere gebruikers.",
"restrictionsfield-badip": "Ongeldig IP-adres of range: $1",
"restrictionsfield-label": "Toegestane IP-ranges:",
"tag-filter-submit": "Filtrer",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merke}}]]: $2)",
"tag-mw-contentmodelchange": "endring av innhaldsmodell",
+ "tag-mw-contentmodelchange-description": "Endringar som [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel byter innhaldsmodellen] til ei side",
"tag-mw-new-redirect": "Ny omdirigering",
+ "tag-mw-new-redirect-description": "Endringar som opprettar ei ny omdirigering eller gjer ei side om til ei omdirigering",
"tag-mw-removed-redirect": "Fjerna omdirigering",
+ "tag-mw-removed-redirect-description": "Endringar som gjer om ei omdirigering til ei ikkje-omdirigering",
"tag-mw-changed-redirect-target": "Omdirigeringsmål endra",
"tag-mw-changed-redirect-target-description": "Endringar som endrar målet til ei omdirigering",
"tag-mw-blank-description": "Endringar som tømmer ei side",
"tag-mw-replace": "Bytte ut innhald",
"tag-mw-replace-description": "Endringar som fjernar meir enn 90 % av innhaldet på ei side",
"tag-mw-rollback": "Attenderulling",
+ "tag-mw-rollback-description": "Endringar som rullar attende tidlegare endringar ved hjelp av attenderullingslenkja",
"tag-mw-undo": "Endringsfjerning",
+ "tag-mw-undo-description": "Endringar som fjernar tidlegare endringar med fjernelenkja",
"tags-title": "Merke",
"tags-intro": "Denne sida listar opp merka som programvara kan merkja ei endring med, og kva desse tyder.",
"tags-tag": "Merkenamn",
"Xð",
"Nicolas Eynaud",
"Fitoschido",
- "Vriullop"
+ "Vriullop",
+ "Unuaiga",
+ "Guilhelma"
]
},
"tog-underline": "Soslinhar los ligams :",
"cascadeprotected": "Aquesta pagina es protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta qu'es estada protegida|las paginas seguentas que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :\n$2",
"namespaceprotected": "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
"customcssprotected": "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
+ "customjsonprotected": "Avètz pas la permission d'editar aquesta pagina JSON perque conten las preferéncias d’un autre utilizator.",
"customjsprotected": "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
"mycustomcssprotected": "Avètz pas lo dreit de modificar aquesta pagina CSS.",
+ "mycustomjsonprotected": "Avètz pas la permission de modificar aquesta pagina JSON.",
"mycustomjsprotected": "Avètz pas lo dreit de modificar aquesta pagina JavaScript.",
"myprivateinfoprotected": "Avètz pas los dreits per modificar vòstras informacions personalas.",
"mypreferencesprotected": "Avètz pas los dreits per modificar vòstras preferéncias.",
"savechanges": "Enregistrar los cambiaments",
"publishpage": "Publicar la pagina",
"publishchanges": "Publicar las modificacions",
+ "savearticle-start": "Enregistrar la pagina...",
+ "savechanges-start": "Enregistrar las modificacions",
+ "publishpage-start": "Publicar la pagina",
+ "publishchanges-start": "Publicar las modificacions...",
"preview": "Previsualizar",
"showpreview": "Previsualizar",
"showdiff": "Veire los cambiaments",
"blocked-notice-logextract": "Aqueste utilizaire es actualament blocat.\nLa darrièra entrada del jornal dels blocatges es indicada çaijós a títol d’informacion :",
"clearyourcache": "<strong>Nòta</strong>: Aprèp aver enregistrat vòstras modificacions, es possible que vos calga forçar lo recargament complet de l'escondedor de vòstre navigador per veire los cambiaments : \n* <strong>Firefox / Safari :</strong> mantenètz la tòca <em>Maj</em> (<em>Shift</em>) en clicant lo boton <em>Actualizar</em> o quichatz sus <em>Ctrl-F5</em> o <em>Ctrl-R</em> (<em>⌘-R</em> sus un Mac)\n* <strong>Google Chrome :</strong> Quichatz sus <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> sus un Mac) \n* <strong>Internet Explorer :</strong> Mantenètz la tòca <em>Ctrl</em> en clicant sul boton <em>Actualizar</em>, o quichatz <em>Ctrl-F5</em> \n* <strong>Opera :</strong> anatz dins <em>Menú → Settings</em> (<em>Opera → Preferéncias</em> sus un Mac) e puèi a <em>Confidencialitat & seguretat → Escafar las donadas d’exploracion → Imatges e fichièrs en cache</em>.",
"usercssyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
+ "userjsonyoucanpreview": "<strong>Astúcia :</strong> Utilizatz lo boton \"{{int:showpreview}}\" per testar vòstre novèl JSON abans de salvar.",
"userjsyoucanpreview": "'''Astúcia :''' Utilizatz lo boton 'Previsualizacion' per testar vòstre fuèlh css/js novèl abans de l'enregistrar.",
"usercsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
+ "userjsonpreview": "Remembratz-vos que sètz a testar vòstre configuracion utilizaire JSON\nEs pas encara estada enregistrada !",
"userjspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còdi JavaScript e qu’es pas encara estat enregistrat !'''",
"sitecsspreview": "'''Remembratz-vos que sètz a previsualizar vòstre pròpri fuèlh CSS !'''\n'''Es pas estada encara enregistrada !'''",
+ "sitejsonpreview": "<strong>Remembratz-vos que fasètz pas que previsualizar aquesta configuracion JSON.\nEs pas encara estada salvagardada !</strong>",
"sitejspreview": "'''Remembratz-vos que sètz a visualizar o testar vòstre còdi JavaScript e qu’es pas encara estat enregistrat !'''",
"userinvalidconfigtitle": "'''Atencion :''' existís pas d'estil « $1 ». Remembratz-vos que las paginas personalas amb extensions .css e .js utilizan de títols en minusculas, per exemple, {{ns:user}}:Foo/vector.css e non pas {{ns:user}}:Foo/Vector.css.",
"updated": "(Mes a jorn)",
"default": "defaut",
"prefs-files": "Fichièrs",
"prefs-custom-css": "CSS personalizat",
+ "prefs-custom-json": "JSON personalizat",
"prefs-custom-js": "JS personalizat",
- "prefs-common-config": "JavaScript e CSS partejat per totes los abilhatges :",
+ "prefs-common-config": "JavaScript, CSS e JSON partejat per totes los abilhatges :",
"prefs-reset-intro": "Podètz utilizar aquesta pagina per restablir vòstras preferéncias a las valors per defaut del site. Aquò pòt pas èsser desfait.",
"prefs-emailconfirm-label": "Confirmacion del corrièr electronic :",
"youremail": "Adreça de corrièr electronic :",
"right-editcontentmodel": "Modificar lo modèl de contengut d’una pagina",
"right-editinterface": "Modificar l'interfàcia d'utilizaire",
"right-editusercss": "Modificar los fichièrs CSS d'autres utilizaires",
+ "right-edituserjson": "Modificar los fichièrs JSON dels autres utilizators",
"right-edituserjs": "Modificar los fichièrs JS d'autres utilizaires",
"right-editmyusercss": "Modificar vòstres pròpris fichièrs CSS utilizaire",
+ "right-editmyuserjson": "Modificar vòstres fichièrs JSON d'utilizator pròpris",
"right-editmyuserjs": "Modificar vòstres pròpris fichièrs JavaScript utilizaire",
"right-viewmywatchlist": "Afichar vòstra pròpria lista de seguiment",
"right-editmywatchlist": "Modificar vòstra pròpria lista de seguiment. Remarcatz que certanas accions apondràn encara de paginas sens aqueste dreit.",
"grant-blockusers": "Blocar e desblocar d'utilizaires",
"grant-createaccount": "Crear de comptes",
"grant-createeditmovepage": "Crear, modificar e desplaçar de paginas",
+ "grant-editinterface": "Modificar l'espaci de noms de MediaWiki e lo CSS/JSON/Javascript",
+ "grant-editmycssjs": "Modificar vòstre CSS/JSON/JavaScript utilizator",
"grant-editmyoptions": "Modificar vòstras preferéncias d'utilizaire",
"grant-editpage": "Modificar de paginas existentas",
"grant-editprotected": "Modificar de paginas protegidas",
"tooltip-summary": "Apondètz un brèu resumit",
"common.css": "/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */",
"print.css": "/* Lo CSS plaçat aicí afectarà las impressions */",
+ "common.json": "/* Qual JSON que siá aquí serà cargat per totes los utilizators sus cada pagina cargada. */",
"common.js": "/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */",
"anonymous": "{{PLURAL:$1|Utilizaire anonim|Utilizaires anonims}} de {{SITENAME}}",
"siteuser": "Utilizaire $1 de {{SITENAME}}",
"linkaccounts": "Ligar los comptes",
"linkaccounts-success-text": "Lo compte es estat ligat.",
"linkaccounts-submit": "Ligar los comptes",
+ "userjsonispublic": "De notar : las jos-paginas JSON devon pas contenir de donadas confidencialas perque d'autres utilizators las pòdon veire.",
"restrictionsfield-badip": "Adreça IP o plaja invalida : $1",
"revid": "version $1",
"pageid": "ID de pagina $1"
"redirectedfrom": "(Przekierowano z $1)",
"redirectpagesub": "Strona przekierowująca",
"redirectto": "Przekierowanie do:",
- "lastmodifiedat": "Tę stronę ostatnio edytowano $2, $1.",
+ "lastmodifiedat": "Tę stronę ostatnio edytowano $1, $2.",
"viewcount": "Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.",
"protectedpage": "Strona zabezpieczona",
"jumpto": "Skocz do:",
"cascadeprotected": "Ta strona została zabezpieczona przed edycją, ponieważ jest ona zawarta na {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:\n$2",
"namespaceprotected": "Nie masz uprawnień do edytowania stron w przestrzeni nazw '''$1'''.",
"customcssprotected": "Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
+ "customjsonprotected": "Nie jesteś uprawniony do edytowania tej strony JSON, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
"customjsprotected": "Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.",
"mycustomcssprotected": "Nie masz uprawnień do edytowania tej strony CSS.",
+ "mycustomjsonprotected": "Nie masz uprawnień do edytowania tej strony JSON.",
"mycustomjsprotected": "Nie masz uprawnień do edytowania tej strony JavaScript.",
"myprivateinfoprotected": "Nie masz uprawnień do edytowania swoich prywatnych danych.",
"mypreferencesprotected": "Nie masz uprawnień do edytowania swoich preferencji.",
"savechanges": "Zapisz zmiany",
"publishpage": "Opublikuj stronę",
"publishchanges": "Opublikuj zmiany",
+ "savearticle-start": "Zapisz stronę...",
+ "savechanges-start": "Zapisz zmiany...",
+ "publishpage-start": "Opublikuj stronę...",
+ "publishchanges-start": "Opublikuj zmiany...",
"preview": "Podgląd",
"showpreview": "Pokaż podgląd",
"showdiff": "Podgląd zmian",
"blocked-notice-logextract": "{{GENDER:$1|Ten użytkownik|Ta użytkowniczka}} jest obecnie {{GENDER:$1|zablokowany|zablokowana}}.\nOstatni wpis rejestru blokad jest pokazany poniżej.",
"clearyourcache": "<strong>Uwaga:</strong> aby zobaczyć zmiany po zapisaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.\n* <strong>Firefox / Safari:</strong> Przytrzymaj <em>Shift</em> podczas klikania <em>Odśwież bieżącą stronę</em>, lub naciśnij klawisze <em>Ctrl+F5</em> lub <em>Ctrl+R</em> (<em>⌘-R</em> na komputerze Mac)\n* <strong>Google Chrome:</strong> Naciśnij <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na komputerze Mac)\n* <strong>Internet Explorer:</strong> Przytrzymaj <em>Ctrl</em>, jednocześnie klikając <em>Odśwież</em>, lub naciśnij klawisze <em>Ctrl+F5</em>\n* <strong>Opera:</strong> Przejdź do <em>Menu → Ustawienia</em> (<em>Opera → Preferencje</em> w Mac), a następnie <em>Prywatność i bezpieczeństwo → Wyczyść dane przeglądania → Opróżnij pamięć podręczną</em>.",
"usercssyoucanpreview": "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy arkusz stylów CSS przed jego zapisaniem.",
+ "userjsonyoucanpreview": "<strong>Podpowiedź:</strong>Użyj przycisku „{{int:showpreview}}”, aby przetestować nowy JSON przed jego zapisaniem.",
"userjsyoucanpreview": "'''Podpowiedź:''' Użyj przycisku „Podgląd”, aby przetestować nowy kod JavaScript przed jego zapisaniem.",
"usercsspreview": "'''Pamiętaj, że to tylko podgląd arkusza stylów CSS – nic jeszcze nie zostało zapisane!'''",
+ "userjsonpreview": "<strong>Pamiętaj że teraz tylko testujesz lub wyświetlasz podgląd swojej konfiguracji użytkownika w JSON.\nZawartość nie została jeszcze zapisana!</strong>",
"userjspreview": "'''Pamiętaj, że to tylko podgląd Twojego kodu JavaScript – nic jeszcze nie zostało zapisane!'''",
"sitecsspreview": "'''Pamiętaj, że to tylko podgląd arkusza stylów CSS.'''\n'''Zmiany nie zostały jeszcze zapisane!'''",
+ "sitejsonpreview": "<strong>Pamiętaj że teraz tylko wyświetlasz podgląd tej konfiguracji w JSON.\nZawartość nie została jeszcze zapisana!</strong>",
"sitejspreview": "'''Pamiętaj, że to tylko podgląd kodu JavaScript.'''\n'''Zmiany nie zostały jeszcze zapisane!'''",
- "userinvalidconfigtitle": "'''Uwaga:''' Brak skórki o nazwie „$1”.\nStrony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/vector.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Uwaga:</strong> Brak skórki o nazwie „$1”.\nStrony użytkownika zawierające CSS, JSON i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/vector.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Vector.css.",
"updated": "(Zmodyfikowano)",
"note": "'''Uwaga:'''",
"previewnote": "<strong>To jest tylko podgląd.</strong>\nZmiany nie zostały jeszcze zapisane!",
"default": "domyślnie",
"prefs-files": "Pliki",
"prefs-custom-css": "własny CSS",
+ "prefs-custom-json": "Własny JSON",
"prefs-custom-js": "własny JavaScript",
- "prefs-common-config": "Wspólny CSS/JS dla wszystkich skórek:",
+ "prefs-common-config": "Wspólny CSS/JSON/JS dla wszystkich skórek:",
"prefs-reset-intro": "Na tej stronie można przywrócić domyślne ustawienia preferencji dla tej witryny.\nTej operacji nie można później cofnąć.",
"prefs-emailconfirm-label": "Potwierdzenie adresu e‐mail:",
"youremail": "Twój adres e‐mail:",
"right-editcontentmodel": "Edycja modelu zawartości strony",
"right-editinterface": "Edycja interfejsu użytkownika",
"right-editusercss": "Edycja plików CSS innych użytkowników",
+ "right-edituserjson": "Edycja plików JSON innych użytkowników",
"right-edituserjs": "Edycja plików JS innych użytkowników",
"right-editmyusercss": "Edycja swoich plików CSS",
+ "right-editmyuserjson": "Edycja swoich plików JSON",
"right-editmyuserjs": "Edycja swoich plików JavaScript",
"right-viewmywatchlist": "Podgląd swojej listy obserwowanych stron",
"right-editmywatchlist": "Edycja swojej listy obserwowanych stron. Niektóre akcje mogą dodawać strony do obserwowanych bez tego uprawnienia.",
"grant-createaccount": "Tworzenie kont",
"grant-createeditmovepage": "Tworzenie, edycja i przenoszenie stron",
"grant-delete": "Usuwanie stron, wersji stron i wpisów rejestru",
- "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz CSS/JavaScript użytkownika",
- "grant-editmycssjs": "Edycja swoich plików CSS/JavaScript",
+ "grant-editinterface": "Edycja przestrzeni nazw MediaWiki oraz CSS/JSON/JavaScript użytkownika",
+ "grant-editmycssjs": "Edycja swoich plików CSS/JSON/JavaScript",
"grant-editmyoptions": "Edycja swoich preferencji",
"grant-editmywatchlist": "Edycja listy obserwowanych",
"grant-editpage": "Edycja istniejących stron",
"group-bot.css": "/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */",
"group-sysop.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */",
"group-bureaucrat.css": "/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */",
+ "common.json": "/* Umieszczony tutaj JSON zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */",
"common.js": "/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */",
"anonymous": "{{PLURAL:$1|Anonimowy użytkownik|Anonimowi użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}",
"siteuser": "{{GENDER:$2|użytkownik|użytkowniczka}} {{GRAMMAR:D.lp|{{SITENAME}}}} – $1",
"unlinkaccounts": "Odłącz konta",
"unlinkaccounts-success": "Konta zostały odłączone.",
"userjsispublic": "Uwaga: Podstrony z kodem JavaScript są widoczne publicznie i nie powinny zawierać poufnych danych.",
+ "userjsonispublic": "Uwaga: podstrony JSON nie powinny zawierać poufnych danych, ponieważ są dostępne dla innych użytkowników.",
"usercssispublic": "Uwaga: Podstrony z kodem CSS są widoczne publicznie i nie powinny zawierać poufnych danych.",
"restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
"restrictionsfield-label": "Dozwolone zakresy adresów IP:",
"BarbaraAckles",
"Trigonometria87",
"RadiX",
- "Fitoschido"
+ "Fitoschido",
+ "Ed g2s"
]
},
"tog-underline": "Ligação sublinhada:",
"cascadeprotected": "Esta página foi protegida contra edições porque é transcluída {{PLURAL:$1| na seguinte página que está protegida|nas seguintes páginas que estão protegidas}} com a opção \"em cascata\" ativada: $2",
"namespaceprotected": "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
"customcssprotected": "Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.",
+ "customjsonprotected": "Você não tem permissão para editar esta página JSON porque ela contém as configurações pessoais de outro usuário.",
"customjsprotected": "Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.",
"mycustomcssprotected": "Você não tem permissão para editar esta página CSS",
+ "mycustomjsonprotected": "Você não tem permissão para editar esta página JSON.",
"mycustomjsprotected": "Você não tem permissão para editar esta página JavaScript",
"myprivateinfoprotected": "Você não tem permissão para editar suas informações privadas.",
"mypreferencesprotected": "Você não tem permissão para editar suas preferências.",
"wrongpasswordempty": "Foi fornecida uma senha em branco.\nTente novamente.",
"passwordtooshort": "As senhas devem ter no mínimo {{PLURAL:$1|1 caractere|$1 caracteres}}.",
"passwordtoolong": "Senhas não podem ser maiores do que {{PLURAL:$1|1 caractere|$1 caracteres}}.",
- "passwordtoopopular": "Senhas comuns não podem ser usadas. Por favor escolha uma senha mais difícil",
+ "passwordtoopopular": "Não podem ser usadas senha vulgares. Escolha uma palavra-passe mais difícil de adivinhar, por favor.",
"password-name-match": "A sua senha deve ser diferente do seu nome de usuário.",
"password-login-forbidden": "O uso deste nome de usuário e senha foi desautorizado.",
"mailmypassword": "Redefinir senha",
"savechanges": "Salvar alterações",
"publishpage": "Publicar página",
"publishchanges": "Publicar alterações",
+ "savearticle-start": "Salvar página…",
+ "savechanges-start": "Salvar alterações…",
+ "publishpage-start": "Publicar página…",
+ "publishchanges-start": "Publicar alterações…",
"preview": "Pré-visualização",
"showpreview": "Mostrar previsão",
"showdiff": "Mostrar alterações",
"blocked-notice-logextract": "{{GENDER:$1|Este usuário está atualmente bloqueado|Esta usuária está atualmente bloqueada|Este(a) usuário(a) está atualmente bloqueado(a)}}.\nO registro de bloqueio mais recente é fornecido abaixo, para referência:",
"clearyourcache": "<strong>Nota:</strong> Após salvar, você pode ter que limpar o \"cache\" do seu navegador para ver as alterações.\n*<strong>Firefox / Safari:</strong> Pressione <em>Shift</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> no Mac)\n*<strong>Google Chrome:</strong> Pressione <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> no Mac)\n* <strong>Internet Explorer:</strong> Pressione<em>Ctrl</em> enquanto clica <em>Recarregar</em>, ou Pressione <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Vá para <em>Menu → Configurações</em> (<em>Opera → Preferencias</em> no Mac) e depois para <em>Privacidade e Segurança → Limpar dados de navegação → Imagens e arquivos em cache</em>.",
"usercssyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo CSS antes de salvar.",
+ "userjsonyoucanpreview": "<strong>Dica:</strong> Use o botão \"{{int:showpreview}}\" para testar o seu novo JSON antes de gravar.",
"userjsyoucanpreview": "'''Dica:''' Utilize o botão \"{{int:showpreview}}\" para testar seu novo JavaScript antes de salvar.",
"usercsspreview": "'''Lembre-se de que você está apenas previsualizando o seu CSS particular.'''\n'''Ele ainda não foi salvo!'''",
+ "userjsonpreview": "<strong>Lembre-se de que está apenas a testar ou pré-visualizar o JSON na sua configuração de usuário.\nEste ainda não foi salvado!</strong>",
"userjspreview": "'''Lembre-se que está apenas testando/prevendo o seu JavaScript particular e que ele ainda não foi salvo!'''",
"sitecsspreview": "'''Lembre-se de que você está apenas previsualizando este CSS.'''\n'''Ele ainda não foi salvo!'''",
+ "sitejsonpreview": "<strong>Lembre-se de que está apenas pré-visualizar esta configuração do JSON.\nEla ainda não foi salvada!</strong>",
"sitejspreview": "'''Lembre-se de que você está apenas previsualizando este código JavaScript.'''\n'''Ele ainda não foi salvo!'''",
- "userinvalidconfigtitle": "'''Aviso:''' Não existe um tema \"$1\". Lembre-se que as páginas .css e .js utilizam um título em minúsculas, exemplo: {{ns:user}}:Alguém/vector.css aposto a {{ns:user}}:Alguém/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Aviso:</strong> Não existe um tema \"$1\".\nAs páginas personalizadas .css, .json e .js têm um título em minúsculas, por exemplo: {{ns:user}}:Alguém/vector.css em vez de {{ns:user}}:Alguém/Vector.css.",
"updated": "(Atualizado)",
"note": "'''Nota:'''",
"previewnote": "'''Lembre-se de que isto é apenas uma previsão.'''\nSuas alterações ainda não foram salvas!",
"default": "padrão",
"prefs-files": "Arquivos",
"prefs-custom-css": "CSS personalizada",
+ "prefs-custom-json": "JSON personalizado",
"prefs-custom-js": "JS personalizado",
- "prefs-common-config": "CSS/JS compartilhado por todos os temas:",
+ "prefs-common-config": "CSS/JSON/JavaScript compartilhado por todos os temas:",
"prefs-reset-intro": "Você pode usar esta página para restaurar as suas preferências para os valores predefinidos do sítio.\nEsta ação não pode ser desfeita.",
"prefs-emailconfirm-label": "Confirmação do e-mail:",
"youremail": "Seu e-mail:",
"right-editcontentmodel": "Editar o modelo de uma pagina",
"right-editinterface": "Editar a interface de usuário",
"right-editusercss": "Editar os arquivos CSS de outros usuários",
+ "right-edituserjson": "\nEditar arquivos JSON de outros usuários",
"right-edituserjs": "Editar os arquivos JS de outros usuários",
"right-editmyusercss": "Edite seu próprio arquivo CSS de usuário",
+ "right-editmyuserjson": "Edite seus próprios arquivos JSON do usuário",
"right-editmyuserjs": "Edite seu próprio arquivo JavaScript de usuário",
"right-viewmywatchlist": "Ver sua lista de vigiados",
"right-editmywatchlist": "Editar sua lista de vigiados. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.",
"grant-createaccount": "Criar contas",
"grant-createeditmovepage": "Criar, editar e mover páginas",
"grant-delete": "Excluir páginas, revisões e entradas de registro",
- "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JavaScript do usuário",
- "grant-editmycssjs": "Editar o seu CSS/JavaScript de usuário",
+ "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JSON/JavaScript do usuário",
+ "grant-editmycssjs": "Editar o seu CSS/JSON/JavaScript personalizado",
"grant-editmyoptions": "Editar suas preferências de usuário",
"grant-editmywatchlist": "Editar sua lista de páginas vigiadas",
"grant-editpage": "Editar páginas existentes",
"tooltip-preferences-save": "Salvar preferências",
"tooltip-summary": "Forneça um breve resumo",
"common.css": "/** o código CSS colocado aqui será aplicado a todos os temas */",
+ "common.json": "/* Qualquer JSON aqui será carregado para todos os usuários em cada carregamento de página. */",
"common.js": "/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */",
"anonymous": "{{PLURAL:$1|Usuário anônimo|Usuários anônimos}} da {{SITENAME}}",
"siteuser": "{{GENDER:$2|um usuário|uma usuária|um usuário}} da {{SITENAME}} ($1)",
"unlinkaccounts-success": "A conta foi desassociada.",
"authenticationdatachange-ignored": "A alteração de dados de autenticação não foi processada. Talvez nenhum provedor tenha sido configurado?",
"userjsispublic": "Observação: as subpáginas JavaScript não devem conter dados confidenciais, pois são visíveis por outros usuários.",
+ "userjsonispublic": "Observe: as subpáginas JSON não devem conter dados confidenciais, pois podem ser visualizados por outros usuários.",
"usercssispublic": "Observação: As subpáginas CSS não devem conter dados confidenciais, pois são visíveis por outros usuários.",
"restrictionsfield-badip": "Endereço IP ou intervalo inválido: $1",
"restrictionsfield-label": "Intervalos IP permitidos:",
"cascadeprotected": "Esta página foi protegida contra edições por estar transcluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
"namespaceprotected": "Não tem permissão para editar páginas no espaço nominal <strong>$1</strong>.",
"customcssprotected": "Não tem permissão para editar esta página de CSS porque a página contém as configurações pessoais de outro utilizador.",
+ "customjsonprotected": "Não tem permissão para editar esta página de JSON porque a página contém as configurações pessoais de outro utilizador.",
"customjsprotected": "Não tem permissão para editar esta página de JavaScript porque a página contém as configurações pessoais de outro utilizador.",
"mycustomcssprotected": "Não tem permissão para editar esta página de CSS.",
+ "mycustomjsonprotected": "Não tem permissão para editar esta página de JSON.",
"mycustomjsprotected": "Não tem permissão para editar esta página de JavaScript.",
"myprivateinfoprotected": "Não tem permissão para editar a sua informação privada.",
"mypreferencesprotected": "Não tem permissão para editar as suas preferências.",
"savechanges": "Gravar alterações",
"publishpage": "Publicar página",
"publishchanges": "Publicar alterações",
+ "savearticle-start": "Gravar página…",
+ "savechanges-start": "Gravar alterações…",
+ "publishpage-start": "Publicar página…",
+ "publishchanges-start": "Publicar alterações…",
"preview": "Antevisão",
"showpreview": "Antever resultado",
"showdiff": "Mostrar alterações",
"blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
"clearyourcache": "<strong>Nota:</strong> Após gravar, terá de limpar a <em>cache</em> do seu navegador para ver as alterações.\n* <strong>Firefox / Safari:</strong> Pressione <em>Shift</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> no Mac)\n* <strong>Google Chrome:</strong> Pressione <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> no Mac)\n* <strong>Internet Explorer:</strong> Pressione <em>Ctrl</em> enquanto clica <em>Recarregar</em>, ou pressione <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Ir para <em>Menu → Configurações</em> (<em>Opera → Preferências</em> no Mac) e, em seguida, <em>Privacidade e segurança → Limpar dados de navegação → Imagens e ficheiros em cache</em>.",
"usercssyoucanpreview": "<strong>Dica:</strong> Use o botão \"{{int:showpreview}}\" para testar o seu novo CSS antes de gravar.",
+ "userjsonyoucanpreview": "<strong>Dica:</strong> Use o botão \"{{int:showpreview}}\" para testar o seu novo JSON antes de gravar.",
"userjsyoucanpreview": "<strong>Dica:</strong> Use o botão \"{{int:showpreview}}\" para testar o seu novo JavaScript antes de gravar.",
"usercsspreview": "<strong>Lembre-se de que está apenas a antever o seu CSS particular.\nEste ainda não foi gravado!</strong>",
+ "userjsonpreview": "<strong>Lembre-se de que está apenas a testar ou a antever o JSON na sua configuração de utilizador.\nEste ainda não foi gravado!</strong>",
"userjspreview": "<strong>Lembre-se de que está apenas a testar ou a antever o seu JavaScript particular.\nEste ainda não foi gravado!</strong>",
"sitecsspreview": "<strong>Lembre-se de que está apenas a antever este CSS.\nEle ainda não foi gravado!</strong>",
+ "sitejsonpreview": "<strong>Lembre-se de que está apenas a antever esta configuração do JSON.\nEla ainda não foi gravada!</strong>",
"sitejspreview": "<strong>Lembre-se de que está apenas a antever este código JavaScript.\nEle ainda não foi gravado!</strong>",
- "userinvalidconfigtitle": "<strong>Aviso:</strong> Não existe um tema \"$1\".\nAs páginas personalizadas .css e .js têm um título em minúsculas, por exemplo: {{ns:user}}:Alguém/vector.css em vez de {{ns:user}}:Alguém/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Aviso:</strong> Não existe um tema \"$1\".\nAs páginas personalizadas .css, .json e .js têm um título em minúsculas, por exemplo: {{ns:user}}:Alguém/vector.css em vez de {{ns:user}}:Alguém/Vector.css.",
"updated": "(Atualizado)",
"note": "<strong>Nota:</strong>",
"previewnote": "<strong>Lembre-se de que esta é apenas uma antevisão do resultado.</strong>\nAs modificações ainda não foram gravadas!",
"default": "padrão",
"prefs-files": "Ficheiros",
"prefs-custom-css": "CSS personalizado",
+ "prefs-custom-json": "JSON personalizado",
"prefs-custom-js": "JS personalizado",
- "prefs-common-config": "CSS/JS partilhado por todos os temas:",
+ "prefs-common-config": "CSS/JSON/JavaScript partilhado por todos os temas:",
"prefs-reset-intro": "Pode usar esta página para repor as configurações padrão das preferências.\nAs suas preferências serão modificadas para os valores predefinidos do sítio.\nEsta operação não pode ser desfeita.",
"prefs-emailconfirm-label": "Confirmação do correio eletrónico:",
"youremail": "Correio eletrónico:",
"right-editcontentmodel": "Editar o modelo de conteúdo de uma página",
"right-editinterface": "Editar a interface de utilizador",
"right-editusercss": "Editar os ficheiros CSS de outros utilizadores",
+ "right-edituserjson": "Editar os ficheiros JSON de outros utilizadores",
"right-edituserjs": "Editar os ficheiros JS de outros utilizadores",
"right-editmyusercss": "Editar os seus próprios ficheiros CSS de utilizador",
+ "right-editmyuserjson": "Editar os ficheiros JSON do próprio utilizador",
"right-editmyuserjs": "Editar os seus próprios ficheiros JavaScript de utilizador",
"right-viewmywatchlist": "Ver a sua lista de páginas vigiadas",
"right-editmywatchlist": "Editar a sua própria lista de páginas vigiadas. Observe que algumas ações continuaram a adicionar páginas, mesmo sem este direito.",
"grant-createaccount": "Criar contas",
"grant-createeditmovepage": "Criar, editar e mover páginas",
"grant-delete": "Eliminar páginas, revisões e entradas de registo",
- "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JavaScript do utilizador",
- "grant-editmycssjs": "Editar o seu CSS/JavaScript personalizado",
+ "grant-editinterface": "Editar o domínio MediaWiki e o CSS/JSON/JavaScript do utilizador",
+ "grant-editmycssjs": "Editar o seu CSS/JSON/JavaScript personalizado",
"grant-editmyoptions": "Editar as suas preferências de utilizador",
"grant-editmywatchlist": "Editar a sua lista de páginas vigiadas",
"grant-editpage": "Editar páginas existentes",
"common.css": "/* Código CSS colocado aqui será aplicado a todos os temas */",
"print.css": "/* Código CSS colocado aqui afectará as impressões */",
"noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
+ "common.json": "/* Qualquer JSON colocado aqui será carregado para todos os utilizadores em cada carregamento de página. */",
"common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
"anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da wiki {{SITENAME}}",
"siteuser": "$1 da wiki {{SITENAME}}",
"unlinkaccounts-success": "A conta foi desassociada.",
"authenticationdatachange-ignored": "A alteração dos dados de autenticação não foi realizada. Talvez o fornecedor não tenha sido configurado?",
"userjsispublic": "Nota: As subpáginas de Javascript não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
+ "userjsonispublic": "Note, por favor: as subpáginas JSON não devem conter dados confidenciais, pois podem ser vistas por outros utilizadores.",
"usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
"restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
"restrictionsfield-label": "Gamas de endereços IP permitidas:",
"sitetitle": "{{Ignore}}",
"sitesubtitle": "{{Ignore}}",
"actions": "{{Identical|Action}}",
- "namespaces": "{{Identical|Namespace}}",
+ "namespaces": "Currently there's lack of documentation about usages of this message, please join [[phab:T190158]] to discuss.\n{{Identical|Namespace}}",
"variants": "Used by the Vector skin.",
"navigation-heading": "Heading shown above the navigation menu (sidebar) for screen-readers (or in non-standard skins).",
"errorpagetitle": "Message shown in browser title bar when encountering error operation.\n\n{{Identical|Error}}",
"cascadeprotected": "Parameters:\n* $1 - number of cascade-protected pages, used for PLURAL\n* $2 - list of cascade-protected pages\n* $3 - (Unused) the action the user attempted to perform",
"namespaceprotected": "Parameters:\n* $1 - namespace name\n* $2 - (Unused) the action the user attempted to perform",
"customcssprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
+ "customjsonprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
"customjsprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
"mycustomcssprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
+ "mycustomjsonprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
"mycustomjsprotected": "Used as error message. Parameters:\n* $1 - (Unused) the action the user attempted to perform",
"myprivateinfoprotected": "Used as error message.",
"mypreferencesprotected": "Used as error message.",
"savechanges": "Text on the button to save the changes to an existing page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savearticle}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save changes}}",
"publishpage": "Text on the button to create a new page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
"publishchanges": "Text on the button to save the changes to an existing page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being created.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish changes}}",
+ "savearticle-start": "Text on the button to start the process to create a new page. Usually just {{msg-mw|savearticle}} with an ellipsis (…).",
+ "savechanges-start": "Text on the button to start the process save the changes to an existing page. Usually just {{msg-mw|savechanges}} with an ellipsis (…).",
+ "publishpage-start": "Text on the button to start the process create a new page on a public wiki. Usually just {{msg-mw|publishpage}} with an ellipsis (…).",
+ "publishchanges-start": "Text on the button to start the process save the changes to an existing page on a public wiki. Usually just {{msg-mw|publishchanges}} with an ellipsis (…).",
"preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
"showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
"showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
"userpage-userdoesnotexist": "Error message displayed when trying to edit or create a page or a subpage that belongs to a user who is not registered on the wiki.\n\nParameters:\n* $1 - a username\n{{Identical|Userdoesnotexist}}",
"userpage-userdoesnotexist-view": "Shown in user pages of non-existing users. See for example [{{canonicalurl:User:Foo}} User:Foo].\n\nParameters:\n* $1 - a username\n{{Identical|Userdoesnotexist}}",
"blocked-notice-logextract": "{{gender}}\nParameters:\n* $1 - (Optional) the name of the blocked user. Can be used for GENDER.",
- "clearyourcache": "Text at the top of .js/.css pages.\n\nWhen translating browser function names, check how they are translated in the localized versions of these web browsers in your language. If a browser is not translated to it, use English or another language in which browsers are most commonly used by the speakers of your language.",
- "usercssyoucanpreview": "Text displayed on every CSS page.\n\nSee also:\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Showpreview}}",
- "userjsyoucanpreview": "Text displayed on every JavaScript page.\n\nSee also:\n* {{msg-mw|Usercssyoucanpreview}}\n* {{msg-mw|Showpreview}}",
+ "clearyourcache": "Text at the top of .js/.json/.css pages.\n\nWhen translating browser function names, check how they are translated in the localized versions of these web browsers in your language. If a browser is not translated to it, use English or another language in which browsers are most commonly used by the speakers of your language.",
+ "usercssyoucanpreview": "Text displayed on every CSS page.\n\nSee also:\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Userjsonyoucanpreview}}\n* {{msg-mw|Showpreview}}",
+ "userjsonyoucanpreview": "Text displayed on every JSON page.\n\nSee also:\n* {{msg-mw|Usercssyoucanpreview}}\n* {{msg-mw|Userjsyoucanpreview}}\n* {{msg-mw|Showpreview}}",
+ "userjsyoucanpreview": "Text displayed on every JavaScript page.\n\nSee also:\n* {{msg-mw|Userjsonyoucanpreview}}\n* {{msg-mw|Usercssyoucanpreview}}\n* {{msg-mw|Showpreview}}",
"usercsspreview": "Text displayed on preview of every user .css subpage.\n\nSee also:\n* {{msg-mw|Sitecsspreview}}",
+ "userjsonpreview": "Text displayed on preview of every user .json subpage",
"userjspreview": "Text displayed on preview of every user .js subpage",
"sitecsspreview": "Text displayed on preview of .css pages in MediaWiki namespace.\n\nSee also:\n* {{msg-mw|Usercsspreview}}",
+ "sitejsonpreview": "Text displayed on preview of .json pages in MediaWiki namespace",
"sitejspreview": "Text displayed on preview of .js pages in MediaWiki namespace",
"userinvalidconfigtitle": "Parameters:\n* $1 - skin name",
"updated": "{{Identical|Updated}}",
"addsection-preload": "{{notranslate}}",
"addsection-editintro": "{{notranslate}}",
"defaultmessagetext": "Caption above the default message text shown on the left-hand side of a diff displayed after clicking \"Show changes\" when creating a new page in the MediaWiki: namespace",
- "content-failed-to-parse": "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – content model, any one of the following messages:\n** {{msg-mw|Content-model-wikitext}}\n** {{msg-mw|Content-model-javascript}}\n** {{msg-mw|Content-model-css}}\n** {{msg-mw|Content-model-text}}\n* $2 – content format as MIME type (e.g. <code>text/css</code>)\n* $3 – specific error message",
+ "content-failed-to-parse": "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – content model, any one of the following messages:\n** {{msg-mw|Content-model-wikitext}}\n** {{msg-mw|Content-model-javascript}}\n** {{msg-mw|Content-model-css}}\n** {{msg-mw|Content-model-json}}\n** {{msg-mw|Content-model-text}}\n* $2 – content format as MIME type (e.g. <code>text/css</code>)\n* $3 – specific error message",
"invalid-content-data": "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
- "content-not-allowed-here": "Error message indicating that the desired content model is not supported in given localtion.\n* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}\n* $2 - the title of the page in question",
+ "content-not-allowed-here": "Error message indicating that the desired content model is not supported in given localtion.\n* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-json}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}\n* $2 - the title of the page in question",
"editwarning-warning": "Uses {{msg-mw|Prefs-editing}}",
"editpage-invalidcontentmodel-title": "Title of error page shown when using an unrecognized content model on EditPage",
"editpage-invalidcontentmodel-text": "Error message shown when using an unrecognized content model on EditPage. $1 is the user's invalid input",
"default": "{{Identical|Default}}",
"prefs-files": "Title of a tab in [[Special:Preferences]].\n{{Identical|File}}",
"prefs-custom-css": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom CSS}}",
+ "prefs-custom-json": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom JSON}}",
"prefs-custom-js": "visible on [[Special:Preferences]] -[Skins].\n{{Identical|Custom JavaScript}}",
"prefs-common-config": "Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab \"Appearance\", section \"Skin\".\n\nSee also:\n* {{msg-mw|Globalcssjs-custom-css-js}}",
"prefs-reset-intro": "Used in [[Special:Preferences/reset]].",
"right-editcontentmodel": "{{doc-right|editcontentmodel}}",
"right-editinterface": "{{doc-right|editinterface}}",
"right-editusercss": "{{doc-right|editusercss}}\nSee also:\n* {{msg-mw|Right-editmyusercss}}",
+ "right-edituserjson": "{{doc-right|edituserjson}}\nSee also:\n* {{msg-mw|Right-editmyuserjson}}",
"right-edituserjs": "{{doc-right|edituserjs}}\nSee also:\n* {{msg-mw|Right-editmyuserjs}}",
"right-editmyusercss": "{{doc-right|editmyusercss}}\nSee also:\n* {{msg-mw|Right-editusercss}}",
+ "right-editmyuserjson": "{{doc-right|editmyuserjson}}\nSee also:\n* {{msg-mw|Right-edituserjson}}",
"right-editmyuserjs": "{{doc-right|editmyuserjs}}\nSee also:\n* {{msg-mw|Right-edituserjs}}",
"right-viewmywatchlist": "{{doc-right|viewmywatchlist}}",
"right-editmywatchlist": "{{doc-right|editmywatchlist}}",
"filerevert-success": "Message displayed when you succeed in reverting a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is an URL and must follow square bracket: [$4\n{{Identical|Revert}}",
"filerevert-badversion": "Used as error message.",
"filerevert-identical": "Used as error message.",
- "filedelete": "Used as page title. Parameters:\n* $1 - file title\nSee also:\n* {{msg-mw|Filedelete-intro}}",
+ "filedelete": "Used as page title. Parameters:\n* $1 - file title (without namespace prefix)\nSee also:\n* {{msg-mw|Filedelete-intro}}",
"filedelete-legend": "Used as fieldset label in the \"Delete file\" form.\n{{Identical|Delete file}}",
"filedelete-intro": "Used as introduction for FileDelete form. Parameters:\n* $1 - page title for file\nSee also:\n* {{msg-mw|Filedelete|page title}}",
"filedelete-intro-old": "Message displayed when you try to delete a version of a file.\n* $1 is the name of the media\n* $2 is a date\n* $3 is a time\n* $4 is a URL and must follow square bracket: [$4",
"group-bot.css": "{{doc-group|bot|css}}",
"group-sysop.css": "{{doc-group|sysop|css}}",
"group-bureaucrat.css": "{{doc-group|bureaucrat|css}}",
+ "common.json": "{{optional}}\nJSON for all users.",
"common.js": "{{optional}}\nJS for all users.",
"group-autoconfirmed.js": "{{doc-group|autoconfirmed|js}}",
"group-user.js": "{{doc-group|user|js}}",
"unlinkaccounts": "Title of the special page [[Special:UnlinkAccounts]] which allows the user to remove linked remote accounts.",
"unlinkaccounts-success": "Account unlinking form success message",
"authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems.\n\nCf. e.g. {{msg-mw|Passwordreset-ignored}}.",
- "userjsispublic": "A reminder to users that Javascript subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .js. See also {{msg-mw|usercssispublic}}.",
- "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}}",
+ "userjsispublic": "A reminder to users that Javascript subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .js. See also {{msg-mw|usercssispublic}} and {{msg-mw|userjsonispublic}}.",
+ "userjsonispublic": "A reminder to users that JSON subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .json. See also {{msg-mw|userjsispublic}} and {{msg-mw|usercssispublic}}",
+ "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}} and {{msg-mw|userjsonispublic}}",
"restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
"restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
"restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
"cascadeprotected": "Данная страница защищена от изменений, поскольку она включена в {{PLURAL:$1|1=следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:\n$2",
"namespaceprotected": "У вас нет разрешения редактировать страницы в пространстве имён «$1».",
"customcssprotected": "У вас нет разрешения редактировать эту CSS-страницу, так как она содержит личные настройки другого участника.",
+ "customjsonprotected": "У вас нет разрешения редактировать эту JSON-страницу, так как она содержит личные настройки другого участника.",
"customjsprotected": "У вас нет разрешения редактировать эту JavaScript-страницу, так как она содержит личные настройки другого участника.",
"mycustomcssprotected": "У вас нет прав для редактирования этого CSS страницы.",
+ "mycustomjsonprotected": "У вас нет прав для редактирования этой JSON-страницы.",
"mycustomjsprotected": "У вас нет прав для редактирования JavaScript на странице.",
"myprivateinfoprotected": "У вас нет разрешения на изменение вашей личной информации",
"mypreferencesprotected": "У вас нет прав для редактирования настроек.",
"wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
"passwordtooshort": "Пароль должен состоять не менее, чем из $1 {{PLURAL:$1|символа|символов}}.",
"passwordtoolong": "Пароль не может содержать более {{PLURAL:$1|1=$1 символа|$1 символов}}.",
- "passwordtoopopular": "ЧаÑ\81Ñ\82о вÑ\8bбиÑ\80аемÑ\8bе паÑ\80оли не могÑ\83Ñ\82 бÑ\8bÑ\82Ñ\8c иÑ\81полÑ\8cзованÑ\8b. Ð\9fожалÑ\83йÑ\81Ñ\82а, вÑ\8bбеÑ\80иÑ\82е более Ñ\83никалÑ\8cнÑ\8bй паÑ\80оль.",
+ "passwordtoopopular": "ЧаÑ\81Ñ\82о вÑ\8bбиÑ\80аемÑ\8bе паÑ\80оли не могÑ\83Ñ\82 бÑ\8bÑ\82Ñ\8c иÑ\81полÑ\8cзованÑ\8b. Ð\9fожалÑ\83йÑ\81Ñ\82а, вÑ\8bбеÑ\80иÑ\82е паÑ\80олÑ\8c, коÑ\82оÑ\80Ñ\8bй Ñ\81ложнее Ñ\83гадаÑ\82ь.",
"password-name-match": "Введённый пароль должен отличаться от имени участника.",
"password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
"mailmypassword": "Сбросить пароль",
"savechanges": "Записать страницу",
"publishpage": "Создать страницу",
"publishchanges": "Записать страницу",
+ "savearticle-start": "Сохранить страницу…",
+ "savechanges-start": "Сохранить изменения…",
+ "publishpage-start": "Опубликовать страницу…",
+ "publishchanges-start": "Опубликовать изменения…",
"preview": "Предпросмотр",
"showpreview": "Предварительный просмотр",
"showdiff": "Внесённые изменения",
"blocked-notice-logextract": "{{GENDER:$1|Этот участник|Эта участница}} в данный момент {{GENDER:$1|заблокирован|заблокирована}}.\nНиже приведена последняя запись из журнала блокировок:",
"clearyourcache": "<strong>Замечание.</strong> Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.\n* <strong>Firefox / Safari:</strong> Удерживая клавишу <em>Shift</em>, нажмите на панели инструментов <em>Обновить</em> либо нажмите <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> Нажмите <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Удерживая <em>Ctrl</em>, нажмите <em>Обновить</em> либо нажмите <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Перейдите в <em>Menu → Настройки</em> (<em>Opera → Настройки</em> на Mac), а затем <em>Безопасность → Очистить историю посещений → Кэшированные изображения и файлы</em>",
"usercssyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
+ "userjsonyoucanpreview": "<strong>Подсказка:</strong> Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JSON-файл перед сохранением.",
"userjsyoucanpreview": "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
"usercsspreview": "'''Помните, что это только предварительный просмотр вашего CSS-файла, он ещё не сохранён!'''",
+ "userjsonpreview": "<strong>Помните, что это только тестовый/предварительный просмотр вашей JSON-конфигурации.\nОна ещё не сохранена!</strong>",
"userjspreview": "'''Помните, что это только предварительный просмотр вашего javascript-файла, он ещё не сохранён!'''",
"sitecsspreview": "'''Помните, что вы только предварительно просматриваете этот CSS.'''\n'''Он ещё не сохранён!'''",
+ "sitejsonpreview": "<strong>Помните, что это только предварительный просмотр JSON-конфигурации.\nОна ещё не сохранена!</strong>",
"sitejspreview": "'''Помните, что вы только предварительно просматриваете этот JavaScript-код.'''\n'''Он ещё не сохранён!'''",
- "userinvalidconfigtitle": "'''Внимание:''' тема оформления «$1» не найдена. Помните, что пользовательские страницы .css и .js должны иметь название, состоящее только из строчных букв, например «{{ns:user}}:Некто/vector.css», а не «{{ns:user}}:Некто/Vector.css».",
+ "userinvalidconfigtitle": "<strong>Внимание:</strong> тема оформления «$1» не найдена. Пользовательские страницы .css, .json и .js должны иметь название, состоящее только из строчных букв, например «{{ns:user}}:Некто/vector.css», а не «{{ns:user}}:Некто/Vector.css».",
"updated": "(Обновлена)",
"note": "'''Примечание:'''",
"previewnote": "'''Помните, что это только предварительный просмотр.'''\nВаши изменения ещё не были сохранены!",
"sectioneditnotsupported-text": "На этой странице не поддерживается редактирование разделов",
"permissionserrors": "Ошибка прав доступа",
"permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
- "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
+ "permissionserrorstext-withaction": "У вас нет прав на выполнение действия «$2» по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
"contentmodelediterror": "Вы не можете редактировать эту версию, поскольку модель её содержания — <code>$1</code>, отличающаяся от текущей модели содержания страницы — <code>$2</code>.",
"recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
"moveddeleted-notice": "Эта страница была удалена.\nНиже для справки приведены журналы удаления, защиты и перемещения для этой страницы.",
"default": "по умолчанию",
"prefs-files": "Файлы",
"prefs-custom-css": "Собственный CSS",
+ "prefs-custom-json": "Пользовательский JSON",
"prefs-custom-js": "Собственный JS",
- "prefs-common-config": "Общие CSS/JS для всех тем оформления:",
+ "prefs-common-config": "Общие CSS/JSON/JavaScript для всех тем оформления:",
"prefs-reset-intro": "Эта страница может быть использована для сброса ваших настроек на стандартные.\nУчтите, что это действие невозможно отменить.",
"prefs-emailconfirm-label": "Подтверждение электронной почты:",
"youremail": "Электронная почта:",
"right-editcontentmodel": "редактирование контентной модели страницы",
"right-editinterface": "изменение пользовательского интерфейса",
"right-editusercss": "правка CSS-файлов других участников",
+ "right-edituserjson": "правка JSON-файлов других участников",
"right-edituserjs": "правка JavaScript-файлов других участников",
"right-editmyusercss": "редактирование своих пользовательских CSS-файлов",
+ "right-editmyuserjson": "редактирование своих пользовательских JSON-файлов",
"right-editmyuserjs": "редактирование своих пользовательских JavaScript-файлов",
"right-viewmywatchlist": "просмотр своего списка наблюдения",
"right-editmywatchlist": "редактирование своего списка наблюдения",
"grant-createaccount": "Создание учётных записей",
"grant-createeditmovepage": "Создание, редактирование и переименование страниц",
"grant-delete": "Удаление страниц, правок и записей журнала",
- "grant-editinterface": "Правка пространства имён MediaWiki и пользовательских CSS/JavaScript",
- "grant-editmycssjs": "РедакÑ\82иÑ\80ование ваÑ\88иÑ\85 полÑ\8cзоваÑ\82елÑ\8cÑ\81киÑ\85 CSS/JavaScript",
+ "grant-editinterface": "Правка пространства имён MediaWiki и пользовательских CSS/JSON/JavaScript",
+ "grant-editmycssjs": "Ð\9fÑ\80авка ваÑ\88иÑ\85 полÑ\8cзоваÑ\82елÑ\8cÑ\81киÑ\85 CSS/JSON/JavaScript",
"grant-editmyoptions": "Редактирование ваших персональных настроек",
"grant-editmywatchlist": "Редактирование вашего списка наблюдения",
"grant-editpage": "Редактирование существующих страниц",
"rcfilters-watchlist-markseen-button": "Отметить все изменения как просмотренные",
"rcfilters-watchlist-edit-watchlist-button": "Редактировать ваш список наблюдения",
"rcfilters-watchlist-showupdated": "Изменения страниц, которые вы не посещали с того момента, как они изменились, выделены <strong>жирным</strong> и отмечены полным маркером.",
- "rcfilters-preference-label": "Скрыть улучшенную версию Последних изменений",
+ "rcfilters-preference-label": "Скрыть улучшенную версию «Свежих правок»",
"rcfilters-preference-help": "Откатывает редизайн интерфейса 2017 года и все инструменты, добавленные с тех пор.",
"rcfilters-filter-showlinkedfrom-label": "Показать правки на ссылаемых страницах",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Страницы, на которые ссылается</strong> выбранная",
"group-bot.css": "/* Размещённый здесь CSS будет применяться только для ботов */",
"group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
"group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
+ "common.json": "/* Размещённый здесь JSON-код будет загружаться всем участникам при каждом обращении к странице */",
"common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
"group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
"group-user.js": "/* Размещённый здесь JavaScript будет применяться только для зарегистрированных пользователей */",
"unlinkaccounts-success": "Учетная запись была отвязан.",
"authenticationdatachange-ignored": "Изменение данных для проверки подлинности не было обработано. Может быть, не был настроен ни один провайдер?",
"userjsispublic": "Обратите внимание: подстраницы JavaScript не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
+ "userjsonispublic": "Обратите внимание: подстраницы JSON не должны содержать конфиденциальных данных, поскольку они доступны для просмотра другими участниками.",
"usercssispublic": "Обратите внимание: подстраницы CSS не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
"restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
"restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
"tog-newpageshidepatrolled": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱤᱰᱟᱹᱣᱠᱟᱱ ᱥᱟᱦᱴᱟᱠᱚ ᱩᱠᱩᱭᱢᱮ",
"tog-hidecategorization": "ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱛᱷᱚᱠ ᱠᱚ ᱫᱟᱱᱟᱝ",
"tog-extendwatchlist": "ᱠᱷᱟᱹᱞᱤ ᱱᱮᱛᱚᱜ ᱵᱚᱫᱚᱞᱟᱜ ᱫᱚ ᱵᱟᱝ, ᱡᱚᱛᱚ ᱵᱟᱫᱚᱞᱟᱜ ᱜᱮ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱯᱷᱟᱭᱞᱟᱣᱢᱮ",
- "tog-usenewrc": "Nahaḱ bodolakanaḱko ar nojor reaḱ pahaṭare bodolaḱko mit́são ńelńam",
+ "tog-usenewrc": "ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱠᱩ ᱟᱨ ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ ᱯᱟᱸᱦᱴᱟᱨᱮ ᱵᱚᱫᱚᱞᱟᱠᱠᱳ ᱢᱤᱛᱥᱟᱶ ᱧᱮᱞᱢᱮ",
"tog-numberheadings": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱷᱟᱠᱩ ᱫᱚ ᱟᱪᱛᱮᱜᱮ ᱯᱤᱲᱦᱤ ᱯᱤᱲᱦᱤᱛᱮ ᱥᱟᱡᱟᱜᱢᱟ",
"tog-showtoolbar": "ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱟᱸᱛ ᱩᱫᱩᱜᱽ ᱢᱮ",
- "tog-editondblclick": "Bar dhao lin kate sakam torjomão reaḱ ạidari emogoḱma",
- "tog-editsectiononrightclick": "Pahaṭa reaḱ pahaṭa guṭkathare jojom seć lin hotete <br /> pahaṭa sompadon lạgitte ektiạr em hoyoḱma (JavaScript)",
+ "tog-editondblclick": "ᱵᱟᱨ ᱫᱷᱟᱣ ᱞᱤᱱ ᱠᱟᱛᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱵᱚᱫᱚᱞᱢᱮ",
+ "tog-editsectiononrightclick": "ᱯᱟᱦᱴᱟ ᱨᱮᱭᱟᱜ ᱜᱩᱴ ᱠᱟᱛᱷᱟᱨᱮ ᱡᱚᱡᱚᱢ ᱥᱮᱡ ᱞᱤᱱ ᱦᱚᱛᱮᱛᱮ <br /> ᱯᱟᱸᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱞᱟᱜᱤᱛᱛᱮ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱮᱢ ᱦᱩᱭᱩᱜ ᱢᱟ (JavaScript)",
"tog-watchcreations": "ᱥᱟᱦᱴᱟᱠᱩ ᱥᱮᱞᱮᱫᱢᱮ ᱤᱧᱟᱜ ᱛᱮᱭᱟᱨ ᱟᱨ ᱨᱮᱫᱠᱩ ᱤᱧᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱨᱟᱠᱟᱵ ᱢᱮ",
"tog-watchdefault": "ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱟᱨ ᱨᱮᱫᱠᱩ ᱥᱮᱞᱮᱫ ᱢᱮ",
"tog-watchmoves": "ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱟᱨ ᱨᱮᱫᱠᱩ ᱚᱪᱟᱜᱽ ᱢᱮ",
"tog-minordefault": "ᱮᱛᱦᱚᱵᱨᱮ ᱥᱟᱱᱟᱢ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱦᱩᱰᱤᱧ ᱞᱮᱠᱟᱛᱮ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ",
"tog-previewontop": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱠᱥᱳ ᱞᱟᱦᱟᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ",
"tog-previewonfirst": "ᱯᱟᱹᱦᱤᱞ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ",
- "tog-enotifwatchlistpages": "E-mailạńme one tinre in̕aḱ n̕eloḱ tạlika do bodolok",
+ "tog-enotifwatchlistpages": "ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱥᱮ ᱨᱮᱫ ᱤᱧᱟᱜ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱠᱩ ᱵᱚᱫᱚᱞ ᱞᱮᱱ ᱠᱷᱟᱡ E-mail ᱟᱹᱧᱢᱮ",
"tog-enotifusertalkpages": "ᱤ-ᱢᱮᱞ ᱟᱹᱧᱢᱮ ᱛᱤᱱᱨᱮ ᱤᱧᱟᱜ ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞᱜ-ᱟ",
- "tog-enotifminoredits": "E-mailạn̕me arhõ one tinre in̕aḱ sakamre huḍiń kạmi hoyoḱ",
+ "tog-enotifminoredits": "ᱥᱟᱦᱴᱟ ᱟᱨ ᱨᱮᱫ ᱠᱩ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱞᱮᱱ ᱠᱷᱟᱡ ᱦᱚᱸ E-mail ᱟᱹᱧᱢᱮ",
"tog-enotifrevealaddr": "ᱰᱷᱟᱹᱨᱣᱟᱜ ᱥᱟᱦᱴᱟᱨᱮ ᱤᱧᱟᱜ e-mail ᱴᱷᱤᱠᱱᱟ ᱥᱚᱫᱚᱨ ᱦᱩᱭᱩᱜ ᱢᱟ",
"tog-shownumberswatching": "ᱧᱮᱞᱚᱜ ᱵᱮᱵᱟᱦᱟᱨᱤᱡ ᱠᱯᱣᱟᱜ ᱮᱞᱮᱞ ᱩᱫᱩᱜᱽ ᱢᱮ",
"tog-oldsig": "ᱟᱢᱟᱜ ᱥᱩᱦᱤ:",
"tog-fancysig": "ᱥᱩᱦᱤ ᱫᱚ ᱣᱤᱠᱤ ᱚᱞ ᱦᱤᱥᱟᱹᱵᱛᱮ ᱢᱚᱱᱮᱭᱢᱮ (ᱟᱪᱛᱮ ᱦᱩᱭᱠᱟᱱ ᱡᱚᱱᱚᱲ ᱵᱟᱹᱜᱤᱠᱟᱛᱮ)",
- "tog-uselivepreview": "Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)",
+ "tog-uselivepreview": "ᱡᱤᱣᱟᱹᱛ ᱧᱮᱞᱚᱜ ᱵᱮᱣᱦᱟᱨᱢᱮ(JavaScript ᱡᱟᱹᱨᱩᱲ ᱢᱮᱱᱟᱜ-ᱟ)",
"tog-forceeditsummary": "ᱠᱷᱟᱹᱞᱤ ᱥᱟᱯᱲᱟᱣ ᱜᱤᱴ ᱠᱟᱛᱷᱟ ᱮᱢ ᱚᱠᱛᱚᱨᱮ ᱤᱧ ᱵᱟᱰᱟᱭ ᱚᱪᱚᱭᱤᱧ ᱦᱩᱭᱩᱜᱢᱟ",
"tog-watchlisthideown": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
"tog-watchlisthidebots": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱠᱷᱚᱱ ᱵᱚᱴ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱩᱠᱩᱭᱢᱮ",
"tog-ccmeonemails": "E-mail ᱠᱩ ᱨᱮᱭᱟᱜ ᱠᱚᱯᱤᱠᱩ ᱠᱩᱞᱢᱮ ᱡᱟᱸᱦᱟᱸ ᱤᱧ ᱮᱴᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱡᱠᱩ ᱴᱷᱮᱱᱤᱧ ᱠᱩᱞ ᱞᱮ",
"tog-diffonly": "ᱯᱷᱟᱨᱟᱠ ᱨᱮᱭᱟᱜ ᱞᱟᱛᱟᱨ ᱥᱟᱦᱴᱟᱨᱮ ᱵᱟᱵᱚᱛᱠᱩ ᱵᱟᱝ ᱩᱫᱩᱜᱚᱜ ᱢᱟ",
"tog-showhiddencats": "ᱩᱠᱩ ᱛᱷᱚᱠᱠᱩ ᱩᱫᱩᱜᱽᱢᱮ",
- "tog-norollbackdiff": "rollback tayomte farak alom uduga",
+ "tog-norollbackdiff": "rollback ᱛᱟᱭᱚᱢ ᱛᱮ ᱯᱷᱟᱨᱟᱠ ᱟᱞᱚᱢ ᱩᱫᱩᱜᱟ",
"underline-always": "ᱥᱟᱨᱟ ᱜᱷᱟᱹᱲᱤᱡ",
"underline-never": "ᱛᱤᱥ ᱦᱚᱸ ᱵᱟᱝ",
- "underline-default": "Browjarre cetlekate em hoy akana",
+ "underline-default": "ᱦᱟᱨᱛᱟ ᱥᱮ ᱵᱨᱟᱣᱡᱟᱨ ᱪᱮᱛᱞᱮᱠᱟ ᱛᱟᱸᱦᱮᱸᱠᱟᱱᱟ ᱚᱝᱠᱟᱜᱮ",
"editfont-style": "ᱥᱟᱯᱲᱟᱣ ᱡᱟᱜᱟ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱱᱴ ᱮᱥᱴᱟᱭᱤᱞ:",
"editfont-monospace": "Monospaced font",
"editfont-sansserif": "Sans-serif font",
"laggedslavemode": "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
"readonly": "ᱰᱟᱴᱟᱵᱮᱡᱽ ᱛᱟᱞᱟᱜᱮᱭᱟ",
"enterlockreason": "Cạbie reaḱ karon do cet́kana ma lạimẽ, Saõte tinre tala cạbim jhija ona okte hõ lạimẽ",
- "readonlytext": "Nãwã hataen ar eṭagaḱ sompadon lạgit́te ḍaṭabes do nit bondo gea. Paseć ḍaṭabes rukhiyạre niyom lekate kạmi calaḱ kana. Thoṛa ghạrịić porte laha obosthare acur hạjuḱa.\nSasetić do noa kathae roṛ keda: $1",
+ "readonlytext": "ᱱᱟᱣᱟ ᱦᱟᱹᱴᱤᱧ ᱟᱨ ᱮᱴᱟᱜᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱰᱟᱴᱟᱵᱮᱡᱽ ᱫᱚ ᱱᱤᱛ ᱵᱚᱱᱰᱷᱚ ᱜᱮᱭᱟ᱾ ᱯᱟᱥᱮᱡ ᱰᱟᱴᱟᱵᱮᱡ ᱨᱩᱠᱷᱤᱭᱟᱨᱮ ᱱᱤᱭᱚᱢ ᱞᱮᱠᱟᱛᱮ ᱠᱟᱹᱢᱤ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ᱾ ᱛᱷᱚᱲᱟ ᱜᱷᱟᱹᱲᱤᱡ ᱯᱚᱨ ᱞᱟᱦᱟᱛᱮ ᱞᱮᱠᱟ ᱟᱹᱪᱩᱨ ᱦᱟᱹᱡᱩᱜ-ᱟ᱾\nᱥᱟᱥᱮᱛᱤᱪ ᱫᱚ ᱱᱚᱣᱟ ᱠᱟᱛᱷᱟᱭ ᱨᱚᱲ ᱠᱮᱫᱟ: $1",
"missing-article": "\"$1\" $2 noa ńutumanaḱ sakhiyạ̣t sakamre olakanaḱ do bań ṅamoka.\nNoa hoy renaḱ karon do hoyoḱkana cabak tạrik pharak se noare joṛao sakam do get́ giḍi akana.\nJudi noa do karon bań hoylen khan, noa do am sopṭoyer re kạtićtem ńam daṛeyaḱa.\nDaya katet́ noa do nonde [[Special:ListUsers/sysop|administrator]], ṭhen lạime, URL hotete.",
"missingarticle-rev": "(ᱥᱩᱫᱷᱨᱟᱹᱣ#:$1)",
"missingarticle-diff": "(ᱯᱷᱟᱨᱟᱠ: $1, $2)",
"viewsource": "ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞ",
"viewsource-title": "$1 ᱨᱮᱱᱟᱜ ᱯᱷᱮᱰᱟᱛ ᱧᱮᱞᱢᱮ",
"actionthrottled": "ᱠᱟᱹᱢᱤ ᱨᱮᱭᱟᱜ ᱫᱷᱟᱨᱟ ᱵᱟᱹᱭ",
- "protectedpagetext": "Noa sakam do ol toṅge lạgit́te do bańcao gea.",
+ "protectedpagetext": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱚᱞ ᱥᱟᱯᱲᱟᱣ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱫᱚ ᱵᱟᱸᱪᱟᱣ ᱜᱮᱭᱟ᱾",
"viewsourcetext": "ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱢ ᱧᱮᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨᱮᱢ ᱠᱚᱯᱤ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾",
- "viewyourtext": "Am do '''Amaḱ sompadon''' noa sakam ńel arem kopi hatao daṛeaḱa:",
+ "viewyourtext": "ᱟᱢ ᱫᱚ '''ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ''' ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱟᱨ ᱮᱢ ᱠᱚᱯᱤ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ:",
"protectedinterface": "Noa sakam reaḱ babotko do wiki sofṭoyer reaḱ mit́ṭen inṭarfes khobore ema, onate noa do rukhiyạ doho hoeakana.",
"cascadeprotected": "Noa sakam do sompadon khon rukhiyạre menaḱa, karon sakam do latar reaḱ {{PLURAL:$1 gan sakam reaḱ gan sakam reaḱ}} bhitrire, oka sakam do (cascading) te rukhiyạ menaḱa:\n$2",
"namespaceprotected": "Amaḱ do sakamko joṛao lạgit́te ạidạri banuḱ tama '''$1''' ńutumjayga.",
"anoneditwarning": "<strong>ᱦᱩᱥᱤᱭᱟᱹᱨ:</strong> ᱟᱢ ᱵᱟᱢ ᱵᱚᱞᱚᱣᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱥᱟᱯᱲᱟᱣᱟᱢ ᱟᱢᱟᱜ IP ᱵᱩᱴᱟᱹ ᱥᱚᱫᱚᱨ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱡᱩᱫᱤ ᱟᱢ [$1 ᱵᱚᱞᱚᱱᱟᱢ]</strong> ᱟᱨᱵᱟᱝ <strong>[$2 ᱠᱷᱟᱛᱟ ᱛᱮᱭᱟᱨᱟᱢ]</strong>, ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱫᱩᱜᱚᱜ-ᱟ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ, ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱥᱩᱵᱤᱫᱷᱟ ᱠᱚ ᱾",
"anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
"missingcommenttext": "ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱠᱟᱛᱷᱟ ᱵᱚᱞᱚᱭ ᱢᱮ᱾",
- "summary-preview": "Guṭ katha unuduḱ:",
- "subject-preview": "Babot/Guṭkatha unuduḱ:",
+ "summary-preview": "ᱜᱩᱴ ᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:",
+ "subject-preview": "ᱜᱩᱴᱠᱟᱛᱷᱟ ᱩᱱᱩᱫᱩᱜ:",
"blockedtitle": "ᱵᱮᱵᱷᱟᱨᱤᱡ ᱫᱚ ᱮᱥᱮᱫ ᱚᱪᱚᱣᱟᱠᱟᱱᱟᱭ",
"blockedtext": "<strong>ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱟᱨᱵᱟᱝ IP ᱵᱩᱴᱟᱹ ᱫᱚ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱾ </strong>\n\nᱱᱚᱶᱟ ᱵᱚᱸᱫᱽ ᱫᱚ $1 ᱫᱟᱨᱟᱭᱛᱮ ᱦᱩᱭᱟᱠᱱᱟ ᱾\nᱱᱚᱶᱟ ᱨᱮᱱᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱢᱮᱱᱟ <em>$2</em>.\n\n* ᱵᱚᱸᱫᱽ ᱮᱦᱚᱵ: $8\n* ᱵᱚᱸᱫᱽ ᱢᱩᱪᱟᱹᱫ: $6\n* ᱟᱥᱟᱦᱟᱱ ᱵᱚᱸᱫᱽᱠᱚ: $7\n\nᱟᱢ $1 ᱮᱢ ᱥᱟᱹᱜᱟᱹᱭ ᱫᱟᱲᱮᱭᱟᱭᱟ ᱵᱟᱝᱠᱷᱟᱱ ᱮᱴᱟᱜ [[{{MediaWiki:Grouppage-sysop}}|ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ]] ᱵᱚᱸᱫᱽ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱜᱟᱞᱚᱪ ᱞᱟᱹᱜᱤᱫ ᱾\nᱟᱢ ᱵᱟᱢ ᱵᱮᱵᱷᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ \"email this user\" ᱥᱩᱵᱤᱫᱷᱟ ᱡᱚᱛᱷᱟᱛ ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱛᱟᱢ ᱵᱟᱝ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱟᱨ ᱱᱚᱶᱟ ᱫᱚ ᱪᱤᱱᱦᱟᱹᱣ-ᱟ [[Special:Preferences|ᱠᱷᱟᱛᱟ ᱧᱮᱞᱚᱚᱜ]] ᱠᱷᱚᱱ ᱟᱨ ᱟᱢ ᱫᱚ ᱵᱟᱢ ᱵᱚᱸᱫᱽ ᱟᱠᱟᱱᱟ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ ᱠᱷᱚᱱ ᱾\nᱟᱢᱟᱜ ᱱᱤᱛᱚᱜᱟᱜ IP ᱵᱩᱴᱟᱹ ᱫᱚ $3, ᱟᱨ ᱵᱚᱸᱫᱽ ID ᱫᱚ #$5 \nᱫᱟᱭᱟᱠᱟᱛᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ ᱪᱮᱛᱟᱱᱟᱜ ᱠᱟᱛᱷᱟᱠᱚ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ ᱠᱩᱠᱞᱤ ᱨᱮ ᱾",
"blockednoreason": "ᱡᱟᱸᱦᱟᱸᱱ ᱚᱡᱮ ᱵᱟᱝ ᱮᱢᱠᱟᱱᱟ",
"page_last": "ᱢᱩᱪᱟᱹᱫ",
"histlegend": "ᱮᱴᱟᱜ ᱵᱟᱪᱷᱟᱣ: ᱱᱟᱣᱟ ᱵᱚᱫᱚᱞᱠᱚ ᱛᱩᱞᱟᱹᱣ ᱢᱮᱱᱠᱷᱟᱱ, ᱨᱮᱰᱤᱭᱳ ᱵᱟᱠᱥᱚᱨᱮ ᱪᱤᱱ ᱮᱢ ᱠᱟᱛᱮ ᱵᱚᱞᱚᱜ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ ᱵᱟᱴᱚᱱ ᱞᱤᱱᱢᱮ᱾<br />\nᱩᱱᱩᱫᱩᱜ: <strong>({{int:cur}})</strong> = ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, <strong>({{int:last}})</strong> = ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱥᱟᱶᱛᱮ ᱥᱚᱝ, <strong>{{int:minoreditletter}}</strong> = ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱾",
"history-fieldset-title": "ᱧᱮᱞ ᱟᱹᱨᱩ ᱞᱟᱹᱜᱤᱫ ᱥᱮᱸᱫᱽᱨᱟ",
- "history-show-deleted": "khạli get giḍiyaḱ koge",
+ "history-show-deleted": "ᱠᱷᱟᱹᱞᱤ ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱜ ᱠᱚᱜᱮ",
"histfirst": "ᱢᱟᱨᱮᱱᱟᱜ",
"histlast": "ᱱᱟᱣᱟᱱᱟᱜ",
"historysize": "({{PLURAL:$1 1 ᱵᱟᱭᱤᱴ $1 ᱵᱟᱭᱤᱴᱥ}})",
"history-feed-item-nocomment": "$2 ᱨᱮ $1",
"rev-deleted-comment": "(ᱥᱟᱯᱲᱟᱣ ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ ᱚᱪᱟᱜᱠᱟᱱᱟ)",
"rev-deleted-user": "(ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ ᱚᱪᱚᱜᱠᱟᱱᱟ)",
- "rev-deleted-event": "(Log kạmi do ocog hoena)",
+ "rev-deleted-event": "(Log ᱠᱟᱹᱢᱤ ᱫᱚ ᱚᱪᱚᱜ ᱦᱩᱭᱱᱟ)",
"rev-deleted-user-contribs": "[ᱵᱮᱵᱷᱟᱨᱤᱡ ᱧᱩᱛᱩᱢ ᱥᱮ IP ᱴᱷᱤᱠᱟᱱᱟ ᱫᱚ ᱚᱪᱟᱜ ᱦᱩᱭᱱᱟ - ᱮᱱᱮᱢ ᱠᱷᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱩᱠᱩ ᱟᱠᱟᱱᱟ]",
"rev-delundel": "ᱧᱮᱧᱮᱞᱟᱜ ᱵᱚᱫᱚᱞ",
"rev-showdeleted": "ᱥᱚᱫᱚᱨ",
"revdelete-show-file-submit": "ᱦᱮᱸ",
"revdelete-hide-text": "Nãwã aroe olko ukuemẽ",
"revdelete-hide-image": "ᱨᱮᱫ ᱥᱟᱛᱚᱢᱠᱩ ᱩᱠᱩᱭᱢᱮ",
- "revdelete-hide-name": "Kạmi ar bejha ukue mẽ",
- "revdelete-hide-comment": "Sompadon gut katha ukue mẽ",
- "revdelete-hide-user": "Sompadonićaḱ beohar ńutum/IP ṭhikạna ukuemẽ",
+ "revdelete-hide-name": "ᱠᱟᱹᱢᱤ ᱟᱨ ᱵᱮᱡᱷᱟ ᱩᱠᱩᱭᱢᱮ",
+ "revdelete-hide-comment": "ᱥᱟᱯᱲᱟᱣ ᱜᱩᱴᱠᱟᱛᱷᱟ",
+ "revdelete-hide-user": "ᱥᱟᱯᱲᱟᱣᱤᱡ ᱟ ᱧᱩᱛᱩᱢ/IP ᱴᱷᱤᱠᱟᱱᱟᱠᱩ",
"revdelete-radio-same": "(ᱟᱞᱚᱢ ᱵᱚᱫᱚᱞᱟ)",
"revdelete-radio-set": "ᱩᱠᱩ",
"revdelete-radio-unset": "ᱧᱮᱞ ᱜᱟᱱᱚᱜ",
"search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)",
"search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1",
"search-interwiki-caption": "ᱥᱟᱶᱛᱮᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ",
- "search-interwiki-default": "$1 folko:",
+ "search-interwiki-default": "Results from $1:",
"search-interwiki-more": "(ᱵᱟᱹᱲᱛᱤ)",
"search-interwiki-more-results": "ᱵᱟᱹᱲᱛᱤ ᱚᱨᱡᱚᱠᱚ",
"search-relatedarticle": "ᱥᱟᱹᱜᱟᱹᱭᱟᱱ",
"datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ",
"prefs-user-pages": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ",
"prefs-resetpass": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱚᱫᱚᱞ",
- "prefs-changeemail": "E-mail á¹hikạna bodolme",
+ "prefs-changeemail": "E-mail ᱴᱷᱤᱠá±\9fá±±á±\9f á±µá±\9aᱫá±\9aá±\9e ᱥᱮ á±\9cᱮᱫ á±\9cᱤᱰᱤá±á±¢á±®",
"prefs-setemail": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱡᱚᱲᱟᱣᱢᱮ",
"saveprefs": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
"searchresultshead": "ᱥᱮᱸᱫᱽᱨᱟ",
"prefs-searchoptions": "ᱥᱮᱸᱫᱽᱨᱟ",
"prefs-files": "ᱨᱮᱫᱠᱚ",
"youremail": "Email:",
- "username": "Beoharićaḱ ńutum:",
+ "username": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱩᱛᱩᱢ}}:",
"yourrealname": "ᱟᱥᱚᱞ ᱧᱩᱛᱩᱢ:",
"yourlanguage": "ᱯᱟᱹᱨᱥᱤ:",
"yournick": "ᱱᱟᱶᱟ ᱥᱩᱦᱤ:",
- "gender-male": "Baba hoṛ",
- "gender-female": "Gogo hoṛ, Kuṛi, Kuṛi gidrạ",
+ "gender-male": "ᱵᱟᱵᱟ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ",
+ "gender-female": "ᱜᱚᱜᱚ ᱦᱚᱲ ᱣᱤᱠᱤ ᱥᱟᱦᱴᱟ ᱠᱩᱭ ᱥᱟᱯᱲᱟᱣ ᱠᱮᱫᱟ",
"email": "Email",
"prefs-help-email": "E-mail ṭhikana do bạṛtitege, menkhan uku namber nãwãte benao jạruṛa, am do amaḱ uku nomborem hiṛiń keda.",
"prefs-help-email-others": "Am são e-mail hotete jogajog dohoy lạgitte mitṭen joṛao se amaḱ katha roṛaḱ sakam bachao jońme.\nAmaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara",
"prefs-signature": "ᱥᱩᱦᱤ",
"prefs-editor": "ᱥᱟᱯᱲᱮᱛ",
"prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
- "userrights": "Beoharićaḱ laṛcaṛ ektiạrko",
- "userrights-lookup-user": "Beoharkoaḱ gãotako laṛcaṛ",
+ "userrights": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
+ "userrights-lookup-user": "ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱦᱟᱨᱤ ᱴᱷᱤᱠᱤ ᱢᱮ",
"userrights-user-editname": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱧᱤᱛᱩᱢ ᱵᱚᱞᱚᱭ ᱢᱮ:",
- "editusergroup": "Beoharićaḱ gãotako toṅgeymẽ",
- "userrights-editusergroup": "Beoharićaḱ gãotako toṅgeymẽ",
- "saveusergroups": "Beoharićaḱ gãotako rukhiyaymẽ",
+ "editusergroup": "ᱵᱮᱵᱦᱟᱨᱤ ᱜᱟᱶᱛᱟᱠᱩ ᱩᱰᱩᱜᱽ ᱢᱮ",
+ "userrights-editusergroup": "ᱥᱟᱯᱲᱟᱣ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
+ "saveusergroups": "ᱨᱩᱠᱷᱤᱭᱟᱹ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
"userrights-reason": "ᱚᱡᱮ:",
"group-bot": "ᱵᱚᱴᱠᱚ",
"group-sysop": "ᱟᱰᱢᱤᱱᱤᱥᱴᱨᱮᱴᱚᱨ",
"newpageletter": "N",
"boteditletter": "b",
"rc-change-size-new": "$1 {{PLURAL:$1|ᱵᱟᱭᱤᱴ|ᱵᱟᱭᱤᱴᱥ}} ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ",
- "rc-enhanced-expand": "Purạote uduḱ",
+ "rc-enhanced-expand": "ᱡᱚᱛᱚ ᱩᱰᱩᱜᱽ ᱢᱮ",
"rc-enhanced-hide": "ᱡᱚᱛᱚᱭᱟᱜ ᱩᱠᱩᱭᱢᱮ",
"rc-old-title": "ᱚᱥᱚᱞᱨᱮ ᱛᱮᱭᱟᱨᱟᱠᱟᱱᱟ \"$1\" ᱞᱮᱠᱟᱛᱮ",
"recentchangeslinked": "ᱥᱟᱶᱛᱮᱱᱟᱜ ᱵᱚᱫᱚᱞᱠᱚ",
"listusers-blocked": "(ᱮᱥᱮᱫ ᱜᱮᱭᱟ)",
"listgrouprights-group": "ᱜᱟᱶᱛᱟ",
"listgrouprights-rights": "ᱟᱹᱭᱫᱟᱹᱨᱤᱠᱚ",
- "listgrouprights-helppage": "Goṛo:Gaõta ạidạri",
+ "listgrouprights-helppage": "ᱜᱚᱸᱲᱚᱸ:ᱜᱟᱶᱛᱟ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
"listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)",
"listgrouprights-addgroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱥᱮᱞᱮᱫ ᱠᱩ ᱢᱮ",
"listgrouprights-removegroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱚᱪᱚᱜ ᱠᱩ ᱢᱮ",
"whatlinkshere-hideimages": "$1 ᱨᱮᱫ ᱡᱳᱱᱳᱲᱠᱚ",
"whatlinkshere-filters": "ᱪᱷᱟᱹᱱᱤᱠᱩ",
"block": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱮᱢ",
- "blockip": "Beoharić esedem",
+ "blockip": "ᱮᱥᱮᱫᱽ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}}",
"ipboptions": "᱒ ᱜᱷᱚᱱᱴᱟ : 2 hours, ᱑ ᱢᱟᱦᱟᱸ:1 day, ᱓ ᱢᱟᱦᱟᱸ : 3 days,᱑ ᱦᱟᱯᱛᱟ:1 week, ᱒ ᱦᱟᱯᱛᱟ : 2 weeks, ᱑ ᱪᱟᱸᱫᱚ :1 month, ᱓ ᱪᱟᱸᱫᱚ : 3 months, ᱖ ᱪᱟᱸᱫᱚ:6 months, ᱑ ᱥᱮᱨᱢᱟ:1 year, ᱥᱤᱢᱟᱹᱱᱟᱹ ᱪᱷᱟᱲᱟ : infinite",
"autoblocklist-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
"ipblocklist": "ᱵᱮᱵᱦᱟᱨᱤᱡ ᱮᱥᱮᱫᱜᱮᱭᱟᱭ",
"changeemail-none": "(کوئی وی کائنی)",
"changeemail-password": "تہاݙا {{SITENAME}} پاس ورڈ:",
"changeemail-submit": "ای-میل بدلو",
+ "resettokens": "ٹوکناں دی نویں ترتیب",
"resettokens-tokens": "ٹوکن",
"resettokens-token-label": "$1 (موجودہ قدر: $2)",
"bold_sample": "موٹی لکھائی",
"diff-empty": "(کوئی فرق کائنی)",
"searchresults": "کھوج دا نتارا",
"searchresults-title": "\"$1\" دے کھوج نتارے",
+ "titlematches": "ورقے دا ناں رلدے",
+ "textmatches": "ورقے دی لکھت رلدی ہے",
+ "notextmatches": "ورقے دی لکھت نی رلدی",
"prevn": "پچھلے {{PLURAL:$1|$1}}",
"nextn": "اگلے {{PLURAL:$1|$1}}",
"prev-page": "پچھلا ورقہ",
"grant-createaccount": "کھاتے کھولو",
"grant-uploadfile": "نویاں فائلاں اپ لوڈ کرو",
"grant-basic": "بنیادی حقوق",
+ "grant-viewmywatchlist": "آپݨی نظریں ہیٹھ تندیر ݙیکھو",
"newuserlogpage": "کھاتہ بݨاوݨ آلی لاگ",
"rightslog": "ورتݨ والے دے حقاں دی لاگ",
"action-read": "ایہ ورقہ پڑھو",
"action-createaccount": "ایہ ورتݨ آلا کھاتہ کھولو",
"action-move": "ایہ ورقہ ٹورو",
"action-movefile": "ایہ فائل ٹورو",
+ "action-upload": "ایہ فائل اپ لوڈ کرو",
"action-delete": "ایہ ورقہ مٹاؤ",
"action-sendemail": "ای میلاں بھیجو",
+ "action-purge": "ایہ ورقہ تازہ تے صاف کرو",
"enhancedrc-history": "پچھلا کم",
"recentchanges": "نویاں تبدیلیاں",
"recentchanges-legend": "اِختیاراتِ حالیہ تبدیلیاں",
"recentchanges-legend-heading": "<strong>اختصارات:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ایہ وی ݙیکھو [[Special:NewPages|نویں ورقیاں دی لسٹ]])",
"recentchanges-submit": "ݙیکھاؤ",
+ "rcfilters-tag-remove": "ہٹاؤ '$1'",
+ "rcfilters-activefilters": "فعال نتارے",
+ "rcfilters-advancedfilters": "ودھائے نتارے",
+ "rcfilters-limit-title": "ݙیکھاوݨ کیتے نتیجے",
"rcfilters-limit-and-date-label": "$1{{PLURAL:$1|تبدیلی|تبدیلیاں}}، $2",
+ "rcfilters-date-popup-title": "ڳولݨ کیتے ویلے دی مدت",
"rcfilters-days-title": "موجودہ ݙینہ",
"rcfilters-hours-title": "موجودہ گھنٹے",
+ "rcfilters-days-show-days": "$1 {{PLURAL:$1|ݙینہ}}",
+ "rcfilters-days-show-hours": "$1 {{PLURAL:$1|گھنٹہ|گھنٹے}}",
+ "rcfilters-highlighted-filters-list": "نمایاں: $1",
+ "rcfilters-quickfilters": "محفوظ نتارے",
"rcfilters-savedqueries-rename": "نواں ناں لکھو",
"rcfilters-savedqueries-setdefault": "ݙیفالٹ بݨاؤ",
"rcfilters-savedqueries-unsetdefault": "ݙیفالٹ توں ہٹاؤ",
"cascadeprotected": "Ta stran je bila zaščitena pred urejanji, ker je vključena na {{PLURAL:$1|sledečo stran, ki je bila zaščitena|sledeči strani, ki sta bili zaščiteni|sledeče strani, ki so bile zaščitene}} z vključeno kaskadno možnostjo:\n$2",
"namespaceprotected": "Za urejanje strani v imenskem prostoru '''$1''' nimate dovoljenja.",
"customcssprotected": "Nimate pravice urejati te strani CSS, ker vsebuje osebne nastavitve drugega uporabnika.",
+ "customjsonprotected": "Nimate pravice urejati te strani JSON, ker vsebuje osebne nastavitve drugega uporabnika.",
"customjsprotected": "Nimate pravice urejati te strani JavaScript, ker vsebuje osebne nastavitve drugega uporabnika.",
"mycustomcssprotected": "Nimate pravic za urejanje te strani s CSS.",
+ "mycustomjsonprotected": "Nimate pravic za urejanje te strani z JSON.",
"mycustomjsprotected": "Nimate pravic za urejanje te strani z JavaScriptom.",
"myprivateinfoprotected": "Nimate dovoljenja za urejanje svojih zasebnih podatkov.",
"mypreferencesprotected": "Nimate dovoljenja za urejanje svojih nastavitev.",
"savechanges": "Shrani spremembe",
"publishpage": "Objavi stran",
"publishchanges": "Objavi spremembe",
+ "savearticle-start": "Shrani stran ...",
+ "savechanges-start": "Shrani spremembe ...",
+ "publishpage-start": "Objavi stran ...",
+ "publishchanges-start": "Objavi spremembe ...",
"preview": "Predogled",
"showpreview": "Prikaži predogled",
"showdiff": "Prikaži spremembe",
"blocked-notice-logextract": "Ta uporabnik je trenutno blokiran.\nNajnovejši vnos v dnevniku blokad je prikazan spodaj:",
"clearyourcache": "<strong>Opomba:</strong> Da bodo spremembe prišle do veljave, po shranitvi izpraznite predpomnilnik svojega brskalnika.\n* <strong>Firefox/Safari:</strong> Držite <em>Shift</em> in kliknite <em>Ponovno naloži</em> (<em>Reload</em>) ali pritisnite <em>Ctrl-Shift-R</em> ali <em>Ctrl-R</em> (<em>⌘-R</em> na sistemu Mac)\n* <strong>Internet Explorer:</strong> Držite <em>Ctrl-F5</em> in kliknite <em>Osveži</em> (<em>Refresh</em>) ali pritisnite <em>Ctrl-F5</em>\n* <strong>Google Chrome:</strong> Pritisnite <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> na sistemu Mac)\n* <strong>Opera:</strong> Pojdite v <em>Meni → Nastavitve</em> (<em>Opera → Nastavitve</em> na sistemu Mac) in nato na <em>Zasebnost in varnost → Počisti podatke o brskanju → Predpomnjene slike in datoteke</em>.",
"usercssyoucanpreview": "'''Nasvet:''' Za preizkušanje svojega novega CSS pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
+ "userjsonyoucanpreview": "<strong>Nasvet:</strong> Za preizkušanje svojega novega JSON pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
"userjsyoucanpreview": "'''Nasvet:''' Za preizkušanje svojega novega JavaScripta pred shranjevanjem uporabite gumb »{{int:showpreview}}«.",
"usercsspreview": "'''Svoj uporabniški CSS le predogledujete.'''\n'''Ni še bil shranjen!'''",
+ "userjsonpreview": "<strong>Ne pozabite, da svojo uporabniško konfiguracijo JSON le preizkušate/predogledujete.\nNi še bila shranjena!</strong>",
"userjspreview": "'''Ne pozabite, da svoj uporabniški JavaScript le preizkušate/predogledujete.'''\n'''Ni še bil shranjen!'''",
"sitecsspreview": "'''Ne pozabite, da ta CSS samo preizkušate.'''\n'''Ni še bil shranjen!'''",
+ "sitejsonpreview": "<strong>Ne pozabite, da svojo uporabniško konfiguracijo JSON le predogledujete.\nNi še bila shranjena!</strong>",
"sitejspreview": "'''Ne pozabite, da kodo tega JavaScripta samo preizkušate.'''\n'''Ni še bila shranjena!'''",
- "userinvalidconfigtitle": "'''Opozorilo:''' Koža »$1« ne obstaja.\nVedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Opozorilo:</strong> Koža »$1« ne obstaja.\nVedite, da strani .css, .json in .js po meri uporabljajo naslov z malo začetnico, npr. {{ns:user}}:Blabla/vector.css namesto {{ns:user}}:Blabla/Vector.css.",
"updated": "(Posodobljeno)",
"note": "'''Opomba:'''",
"previewnote": "'''Vedite, da stran le predogledujete.'''\nVaših sprememb še nismo shranili!",
"default": "privzeto",
"prefs-files": "Datoteke",
"prefs-custom-css": "CSS po meri",
+ "prefs-custom-json": "JSON po meri",
"prefs-custom-js": "JS po meri",
- "prefs-common-config": "Skupni CSS/JS za vse kože:",
+ "prefs-common-config": "Skupni CSS/JSON/JavaScript za vse kože:",
"prefs-reset-intro": "To stran lahko uporabite za ponastavitev nastavitev na privzete za to spletišče.\nTega ni mogoče razveljaviti.",
"prefs-emailconfirm-label": "Potrditev e-pošte:",
"youremail": "E-poštni naslov:",
"right-editcontentmodel": "Urejanje vsebinskega modela strani",
"right-editinterface": "Urejanje uporabniškega vmesnika",
"right-editusercss": "Uredi CSS datotek drugih uporabnikov",
+ "right-edituserjson": "Urejanje JSON-datotek drugih uporabnikov",
"right-edituserjs": "Uredi JS datotek drugih uporabnikov",
"right-editmyusercss": "Uredite svoje uporabniške datoteke CSS",
+ "right-editmyuserjson": "Urejanje svojih uporabniških datotek JSON",
"right-editmyuserjs": "Uredite svoje uporabniške datoteke JavaScript",
"right-viewmywatchlist": "Ogledovanje svojega spiska nadzorov",
"right-editmywatchlist": "Urejanje vašega spiska nadzorov. Vedite, da bodo nekatera dejanja dodala strani nanj tudi brez te pravice.",
"grant-createaccount": "Ustvarjanje računov",
"grant-createeditmovepage": "Ustvarjanje, urejanje in prestavljanje strani",
"grant-delete": "Brisanje strani, redakcij in dnevniških vnosov",
- "grant-editinterface": "Urejanje imenskega prostora MediaWiki in uporabniškega CSS/JavaScripta",
- "grant-editmycssjs": "Urejanje svojega uporabniškega CSS/JavaScripta",
+ "grant-editinterface": "Urejanje imenskega prostora MediaWiki in uporabniškega CSS/JSON/JavaScripta",
+ "grant-editmycssjs": "Urejanje svojega uporabniškega CSS/JSON/JavaScripta",
"grant-editmyoptions": "Urejanje svojih uporabniških nastavitev",
"grant-editmywatchlist": "Urejanje svojega spiska nadzorov",
"grant-editpage": "Urejanje obstoječih strani",
"tooltip-preferences-save": "Shrani nastavitve",
"tooltip-summary": "Vnesite kratek povzetek",
"interlanguage-link-title": "$1 – $2",
+ "common.json": "/* JSON, ki ga vnesete tukaj, se bo naložil vsem uporabnikom ob nalaganju vsake strani. */",
"anonymous": "{{PLURAL:$1|Brezimni uporabnik|Brezimna uporabnika|Brezimni uporabniki}} {{GRAMMAR:rodilnik|{{SITENAME}}}}",
"siteuser": "uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
"anonuser": "Brezimni uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}} $1",
"unlinkaccounts-success": "Račun smo razvezali.",
"authenticationdatachange-ignored": "Sprememba overitvenih podatkov ni bila obdelana. Morda ni bil konfiguriran noben ponudnik?",
"userjsispublic": "Pomnite: Podstrani JavaScript naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
+ "userjsonispublic": "Pomnite: podstrani JSON naj ne vsebujejo zaupnih podatkov, saj so vidne drugih uporabnikom.",
"usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
"restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
"restrictionsfield-label": "Dovoljeni IP-obsegi:",
"createacct-another-username-ph": "Shtypni emrin e përdoruesit",
"yourpassword": "Fjalëkalimi:",
"userlogin-yourpassword": "Fjalëkalimi",
- "userlogin-yourpassword-ph": "Shtypni fjalëkalimin tuaj",
- "createacct-yourpassword-ph": "Shtypni një fjalëkalim",
+ "userlogin-yourpassword-ph": "Fut fjalëkalimin tënd",
+ "createacct-yourpassword-ph": "Fut një fjalëkalim",
"yourpasswordagain": "Fusni fjalëkalimin përsëri",
"createacct-yourpasswordagain": "Konfirmoni fjalëkalimin",
- "createacct-yourpasswordagain-ph": "Shtypni fjalëkalimin përsëri",
+ "createacct-yourpasswordagain-ph": "Fut fjalëkalimin përsëri",
"userlogin-remembermypassword": "Më mbaj të kyçur",
"userlogin-signwithsecure": "Përdor lidhje të sigurtë",
"cannotlogin-title": "Nuk mund të kyçeni",
"userlogin-reauth": "Duhet të identifikoheni përsëri për të verifikuar që jeni {{GENDER:$1|$1}}",
"userlogin-createanother": "Krijo një llogari tjeter",
"createacct-emailrequired": "Posta elektronike",
- "createacct-emailoptional": "Adresa Elektronike (me dëshirë)",
+ "createacct-emailoptional": "Adresa elektronike (me dëshirë)",
"createacct-email-ph": "Fusni adresën tuaj elektronike",
"createacct-another-email-ph": "Vendos adresën e postës elektronike",
"createaccountmail": "Përdorni një fjalëkalim të përkohshëm të rastit dhe dërgojeni atë në adresën e specifikuar te email",
"copyright": "Садржај је доступан под лиценцом $1 осим ако је другачије наведено.",
"copyrightpage": "{{ns:project}}:Ауторска права",
"currentevents": "Актуелности",
- "currentevents-url": "Project:Ð\9dовости",
+ "currentevents-url": "Project:Ð\90кÑ\82Ñ\83елности",
"disclaimers": "Одрицање одговорности",
"disclaimerpage": "Project:Одрицање одговорности",
"edithelp": "Помоћ при уређивању",
"badaccess": "Грешке у овлашћењима",
"badaccess-group0": "Није Вам дозвољено да извршите захтевану радњу.",
"badaccess-groups": "Радња коју сте захтевали је ограничена само корисницима у {{PLURAL:$2|следећој групи|следећим групама}}: $1.",
- "versionrequired": "Ð\9fоÑ\82Ñ\80ебно Ñ\98е $1 издаÑ\9aе Медијавикија",
- "versionrequiredtext": "Потребно је $1 издање Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].",
+ "versionrequired": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е веÑ\80зиÑ\98а $1 Медијавикија",
+ "versionrequiredtext": "Потребно је издање $1 Медијавикија да бисте користили ову страницу.\nПогледајте страницу за [[Special:Version|издање]].",
"ok": "У реду",
"pagetitle": "$1 — {{SITENAME}}",
"pagetitle-view-mainpage": "{{SITENAME}}",
"toc": "Садржај",
"showtoc": "прикажи",
"hidetoc": "сакриј",
- "collapsible-collapse": "СакÑ\80иÑ\98",
+ "collapsible-collapse": "СкÑ\83пи",
"collapsible-expand": "Прикажи",
"confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?",
"confirmable-yes": "Да",
"passwordreset-ignored": "Ресетовање лозинке није успело. Можда послужилац није конфигурисан?",
"passwordreset-invalidemail": "Неисправна имејл адреса",
"passwordreset-nodata": "Корисничко име и адреса е-поште нису наведени",
- "changeemail": "Ð\9fÑ\80омени или Ñ\83клони имеÑ\98л адÑ\80еÑ\81Ñ\83",
+ "changeemail": "Ð\9fÑ\80омена или Ñ\83клаÑ\9aаÑ\9aе имеÑ\98л адÑ\80еÑ\81е",
"changeemail-header": "Попуните овај образац да би сте променили Вашу имејл адресу. Ако жели да ускратите приступ било којој имејл адреси Вашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.",
"changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
"changeemail-oldemail": "Тренутна имејл адреса:",
"savechanges": "Сачувај измене",
"publishpage": "Објави страницу",
"publishchanges": "Објави измене",
+ "savearticle-start": "Сачувај страницу...",
+ "savechanges-start": "Сачувај измене...",
+ "publishpage-start": "Објави страницу...",
+ "publishchanges-start": "Објави измене...",
"preview": "Претпреглед",
"showpreview": "Прикажи претпреглед",
"showdiff": "Прикажи измене",
"userjspreview": "<strong>Ово је само преглед јаваскрипта.\nСтраница још није сачувана!</strong>",
"sitecsspreview": "<strong>Ово је само преглед CSS-а.\nСтраница још није сачувана!</strong>",
"sitejspreview": "<strong>Ово је само преглед јаваскрипта.\nСтраница још није сачувана!</strong>",
- "userinvalidconfigtitle": "<strong>Упозорење:</strong> не постоји тема „$1“.\nПрилагођене странице CSS и јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
+ "userinvalidconfigtitle": "<strong>Упозорење:</strong> не постоји тема „$1“.\nПрилагођене странице CSS, JSON и Јаваскрипт почињу малим словом, нпр. {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
"updated": "(ажурирано)",
"note": "<strong>Напомена:</strong>",
"previewnote": "<strong>Не заборавите да је ово само претпреглед.</strong>\nВаше измене још нису сачуване!",
"viewpagelogs": "Дневници ове странице",
"nohistory": "Не постоји историја измена ове странице.",
"currentrev": "Тренутна измена",
- "currentrev-asof": "Ð\9fоÑ\81ледÑ\9aа веÑ\80зиÑ\98а на датум $2 у $3",
- "revisionasof": "Ð\98змена од $2 у $3",
- "revision-info": "Ð\98змена од $1 коÑ\98Ñ\83 Ñ\98е {{GENDER:$6|Ñ\83Ñ\80едио $2|Ñ\83Ñ\80едила $2}}$7",
+ "currentrev-asof": "Ð\9fоÑ\81ледÑ\9aа измена на датум $2 у $3",
+ "revisionasof": "Ð\98змена на даÑ\82Ñ\83м $2 у $3",
+ "revision-info": "Ð\98змена од $1 од Ñ\81Ñ\82Ñ\80ане {{GENDER:$6|коÑ\80иÑ\81ника $2|коÑ\80иÑ\81ниÑ\86е $2}}$7",
"previousrevision": "← Старија измена",
"nextrevision": "Новија измена →",
"currentrevisionlink": "Тренутна измена",
"default": "подразумевана",
"prefs-files": "Датотеке",
"prefs-custom-css": "прилагођени CSS",
+ "prefs-custom-json": "Прилагођени JSON",
"prefs-custom-js": "прилагођени Јаваскрипт",
- "prefs-common-config": "Дељени CSS/Јаваскрипт за све теме:",
+ "prefs-common-config": "Дељени CSS/JSON/Јаваскрипт за све теме:",
"prefs-reset-intro": "Можете користити ову страницу да поништите своја подешавања на подразумеване вредности.\nОва радња се не може вратити.",
"prefs-emailconfirm-label": "Потврда имејла:",
"youremail": "Имејл:",
"grant-createaccount": "Отварање налога",
"grant-createeditmovepage": "Прављење, уређивање и премештање страница",
"grant-delete": "Брисање страница, измена и уноса у дневницима",
- "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JavaScript страница",
- "grant-editmycssjs": "Уређивање вашег CSS/JavaScript-а",
+ "grant-editinterface": "Уређивање Медијавики именског простора и корисничких CSS/JSON/Јаваскрипт страница",
+ "grant-editmycssjs": "Уређивање вашег CSS/JSON/Јаваскрипта",
"grant-editmyoptions": "Уређивање ваших подешавања",
"grant-editmywatchlist": "Уређивање вашег списка надгледања",
"grant-editpage": "Уређивање постојећих страница",
"recentchanges-network": "Због техничког проблема не могу да учитам резултате. Покушајте поновно да учитате страницу.",
"recentchanges-notargetpage": "Унесите назив странице како бисте видели сродне измене.",
"recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
- "recentchanges-label-newpage": "Ð\9dова страница",
- "recentchanges-label-minor": "Ð\9cања измена",
- "recentchanges-label-bot": "Ð\91оÑ\82овÑ\81ка измена",
- "recentchanges-label-unpatrolled": "Ð\9dепаÑ\82Ñ\80олиÑ\80ана измена",
+ "recentchanges-label-newpage": "Ð\9eвом изменом Ñ\98е напÑ\80авÑ\99ена нова страница",
+ "recentchanges-label-minor": "Ð\9eво Ñ\98е мања измена",
+ "recentchanges-label-bot": "Ð\9eвÑ\83 изменÑ\83 Ñ\98е наÑ\87инио боÑ\82",
+ "recentchanges-label-unpatrolled": "Ð\9eва измена Ñ\98оÑ\88 ниÑ\98е паÑ\82Ñ\80олиÑ\80ана",
"recentchanges-label-plusminus": "Промена величине странице у бајтовима",
"recentchanges-legend-heading": "<strong>Легенда:</strong>",
- "recentchanges-legend-newpage": "[[w:sr:Посебно:НовеСтране|<u>Н</u>ова страница]]",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
"recentchanges-submit": "Прикажи",
"rcfilters-tag-remove": "Уклоните филтер „$1”",
"rcfilters-legend-heading": "<strong>Списак скраћеница:</strong>",
"rcfilters-liveupdates-button-title-on": "Искључите ажурирања уживо",
"rcfilters-liveupdates-button-title-off": "Прикажи нове измене уживо",
"rcfilters-watchlist-markseen-button": "Означи све измене као погледане",
- "rcfilters-watchlist-edit-watchlist-button": "Промените Ваш списак надгледаних страница",
+ "rcfilters-watchlist-edit-watchlist-button": "Промени списак надгледаних страница",
"rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
"rcfilters-preference-label": "Сакриј побољшану верзију скорашњих измена",
"rcfilters-preference-help": "Поништава редизајн интерфејса из 2017. и све алатке додате тада и после.",
"recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
"recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
"autochange-username": "Медијавики аутоматска измена",
- "upload": "Ð\9eÑ\82пÑ\80еми даÑ\82оÑ\82екÑ\83",
+ "upload": "Ð\9eÑ\82пÑ\80емаÑ\9aе даÑ\82оÑ\82еке",
"uploadbtn": "Отпреми датотеку",
"reuploaddesc": "Назад на образац за отпремање",
"upload-tryagain": "Пошаљи измењени опис датотеке",
"nopagetext": "Тражена страница не постоји.",
"pager-newer-n": "{{PLURAL:$1|новији 1|новија $1|новијих $1}}",
"pager-older-n": "{{PLURAL:$1|старији 1|старија $1|старијих $1}}",
- "suppress": "СакÑ\80иÑ\98",
+ "suppress": "Ð\9fоÑ\82иÑ\81ни",
"querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
"apihelp": "API помоћ",
"apihelp-no-such-module": "Модул „$1“ није пронађен.",
"deletedcontributions": "Обрисани кориснички доприноси",
"deletedcontributions-title": "Обрисани кориснички доприноси",
"sp-deletedcontributions-contribs": "доприноси",
- "linksearch": "Ð\9fÑ\80еÑ\82Ñ\80ажи Ñ\81поÑ\99аÑ\88Ñ\9aе везе",
+ "linksearch": "Ð\9fÑ\80еÑ\82Ñ\80ага Ñ\81поÑ\99аÑ\88Ñ\9aиÑ\85 веза",
"linksearch-pat": "Образац претраге:",
"linksearch-ns": "Именски простор:",
"linksearch-ok": "Претражи",
"rollback-success-notify": "Враћене измене корисника $1;\nвраћено на последњу измену корисника $2. [$3 Прикажи измене]",
"sessionfailure-title": "Сесија је окончана",
"sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.",
- "changecontentmodel": "Ð\9fÑ\80омени модел садржаја странице",
+ "changecontentmodel": "Ð\9fÑ\80омена модела садржаја странице",
"changecontentmodel-legend": "Промени модел садржаја",
"changecontentmodel-title-label": "Наслов странице",
"changecontentmodel-model-label": "Нови модел садржаја",
"tooltip-pt-userpage": "{{GENDER:|Ваша}} корисничка страница",
"tooltip-pt-anonuserpage": "Корисничка страница за ИП адресу с које уређујете",
"tooltip-pt-mytalk": "{{GENDER:|Ваша}} страница за разговор",
- "tooltip-pt-anontalk": "Разговор о изменама с ове ИП адресе",
+ "tooltip-pt-anontalk": "Разговор о изменама са ове IP адресе",
"tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
"tooltip-pt-watchlist": "Списак страница које надгледате",
"tooltip-pt-mycontris": "Списак {{GENDER:|Ваших}} доприноса",
"tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
- "tooltip-pt-login": "Ð\9fÑ\80епоÑ\80Ñ\83Ñ\87Ñ\83Ñ\98емо вам да Ñ\81е пÑ\80иÑ\98авиÑ\82е, иако Ñ\82о ниÑ\98е обавезно.",
+ "tooltip-pt-login": "Ð\9fÑ\80епоÑ\80Ñ\83Ñ\87Ñ\83Ñ\98емо Ð\92ам да Ñ\81е пÑ\80иÑ\98авиÑ\82е, иако Ñ\82о ниÑ\98е обавезно",
"tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
"tooltip-pt-logout": "Одјавите се",
- "tooltip-pt-createaccount": "Ð\9eÑ\85Ñ\80абÑ\80Ñ\83Ñ\98емо ваÑ\81 да оÑ\82воÑ\80иÑ\82е налог и пÑ\80иÑ\98авиÑ\82е Ñ\81е али то није обавезно",
+ "tooltip-pt-createaccount": "Ð\9fÑ\80епоÑ\80Ñ\83Ñ\87иÑ\98емо Ð\92ам да оÑ\82воÑ\80иÑ\82е налог и пÑ\80иÑ\98авиÑ\82е Ñ\81е, иако то није обавезно",
"tooltip-ca-talk": "Разговор о страници са садржајем",
"tooltip-ca-edit": "Уредите ову страницу",
"tooltip-ca-addsection": "Започните нови одељак",
"tooltip-ca-move": "Премести ову страницу",
"tooltip-ca-watch": "Додајте ову страницу на списак надгледања",
"tooltip-ca-unwatch": "Уклони ову страницу са списка надгледања",
- "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ажи",
+ "tooltip-search": "Ð\9fÑ\80еÑ\82Ñ\80ага",
"tooltip-search-go": "Идите на страницу с овим именом, ако постоји",
"tooltip-search-fulltext": "Претражите странице с овим текстом",
"tooltip-p-logo": "Посетите главну страну",
"duplicate-defaultsort": "<strong>Упозорење:</strong> Подразумевани кључ сврставања „$2“ мења ранији подразумевани кључ сврставања „$1“.",
"duplicate-displaytitle": "<strong>Упозорење:</strong> наслов за приказ „$2“ замениће постојећи „$1“.",
"restricted-displaytitle": "<strong>Упозорење:</strong> Наслов за приказ „$1” је игнорисан пошто није еквивалентан стварном наслову странице.",
- "version": "Ð\98здаÑ\9aе",
+ "version": "Ð\92еÑ\80зиÑ\98а",
"version-extensions": "Инсталирана проширења",
"version-skins": "Инсталиране теме",
"version-specialpages": "Посебне странице",
"version-entrypoints-header-url": "Адреса",
"version-libraries": "Инсталиране библиотеке",
"version-libraries-library": "Библиотека",
- "version-libraries-version": "Ð\98здаÑ\9aе",
+ "version-libraries-version": "Ð\92еÑ\80зиÑ\98а",
"version-libraries-license": "Лиценца",
"version-libraries-description": "Опис",
"version-libraries-authors": "Аутори",
"tags-delete-reason": "Разлог:",
"tags-delete-submit": "Неповратно обриши ову ознаку",
"tags-delete-not-found": "Ознака „$1“ не постоји.",
+ "tags-delete-too-many-uses": "Ознака „$1” је примењена на више од $2 {{PLURAL:$2|измене|изменa}}, што значи да се не може обрисати.",
"tags-delete-no-permission": "Немате дозволу да бришете ознаке за измену.",
"tags-activate-title": "Активирање ознака",
"tags-activate-question": "Активирате ознаку „$1“.",
"tags-deactivate-reason": "Разлог:",
"tags-deactivate-not-allowed": "Није могуће деактивирати ознаку „$1“.",
"tags-deactivate-submit": "Декативирај",
+ "tags-update-no-permission": "Немате дозволу за додавање или уклањање ознаке измена из засебних измена или уноса у дневнику.",
+ "tags-update-blocked": "Не можете додавати нити уклањати ознаке измена док {{GENDER:$1|сте}} блокирани.",
+ "tags-update-add-not-allowed-one": "Није дозвољено да се ознака „$1” додаје ручно.",
"tags-edit-title": "Уреди ознаке",
"tags-edit-manage-link": "Управљај ознакама",
"tags-edit-existing-tags": "Постојеће ознаке:",
"diff-form-oldid": "ID старе измене (необавезно)",
"diff-form-revid": "ID измене или разлике",
"diff-form-submit": "Прикажи разлике",
- "permanentlink": "СÑ\82ална веза",
+ "permanentlink": "ТÑ\80аÑ\98на веза",
"permanentlink-revid": "ID измене",
"permanentlink-submit": "Иди на измену",
"dberr-problems": "Дошло је до техничких проблема.",
"feedback-thanks": "Хвала! Ваша повратна информација је постављена на страницу „[$2 $1]“.",
"feedback-thanks-title": "Хвала вам!",
"feedback-useragent": "Кориснички агент:",
- "searchsuggest-search": "Претражи",
+ "searchsuggest-search": "Претражи пројекат {{SITENAME}}",
"searchsuggest-containing": "садржи...",
"api-error-badtoken": "Унутрашња грешка: неисправан жетон.",
"api-error-emptypage": "Стварање нових празних страница није дозвољено.",
"nopagetext": "Tražena stranica ne postoji.",
"pager-newer-n": "{{PLURAL:$1|noviji 1|novija $1|novijih $1}}",
"pager-older-n": "{{PLURAL:$1|stariji 1|starijih $1}}",
- "suppress": "Revizija",
+ "suppress": "Potisni",
"querypage-disabled": "Ova posebna stranica je onemogućena radi poboljšanja performansi.",
"apihelp": "API pomoć",
"apihelp-no-such-module": "Modul „$1“ nije pronađen.",
"cascadeprotected": "Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med \"kaskaderande\"-inställningen aktiverad:\n$2",
"namespaceprotected": "Du har inte behörighet att redigera sidor i namnrymden <strong>$1</strong>.",
"customcssprotected": "Du har inte behörighet att redigera denna CSS-sida eftersom den innehåller en annan användares personliga inställningar.",
+ "customjsonprotected": "Du har inte behörighet att redigera denna JSON-sida eftersom den innehåller en annan användares personliga inställningar.",
"customjsprotected": "Du har inte behörighet att redigera denna JavaScript-sida eftersom den innehåller en annan användares personliga inställningar.",
"mycustomcssprotected": "Du har inte behörighet att redigera denna CSS-sida.",
+ "mycustomjsonprotected": "Du har inte behörighet att redigera denna JSON-sida.",
"mycustomjsprotected": "Du har inte behörighet att redigera denna JavaScript-sida.",
"myprivateinfoprotected": "Du har inte behörighet att redigera din privata information.",
"mypreferencesprotected": "Du har inte behörighet att redigera dina inställningar.",
"wrongpasswordempty": "Lösenordet som angavs var tomt. Var god försök igen.",
"passwordtooshort": "Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.",
"passwordtoolong": "Lösenord kan inte vara längre än {{PLURAL:$1|1 tecken|$1 tecken}}.",
- "passwordtoopopular": "Vanliga lösenord kan inte användas. Välj ett mer unikt lösenord.",
+ "passwordtoopopular": "Vanliga lösenord kan inte användas. Välj ett lösenord som är svårare att gissa.",
"password-name-match": "Ditt lösenord måste vara olikt ditt användarnamn.",
"password-login-forbidden": "Användningen av dessa användarnamn och lösenord har förbjudits.",
"mailmypassword": "Återställ lösenord",
"savechanges": "Spara ändringar",
"publishpage": "Publicera sida",
"publishchanges": "Publicera ändringar",
+ "savearticle-start": "Spara sida…",
+ "savechanges-start": "Spara ändringar…",
+ "publishpage-start": "Publicera sida…",
+ "publishchanges-start": "Publicera ändringar…",
"preview": "Förhandsgranska",
"showpreview": "Visa förhandsgranskning",
"showdiff": "Visa ändringar",
"blocked-notice-logextract": "Användaren är blockerad.\nOrsaken till senaste blockeringen kan ses nedan:",
"clearyourcache": "<strong>OBS:</strong> Efter du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.\n*<strong>Firefox / Safari:</strong> Håll ned <em>Skift</em> och klicka på <em>Uppdatera sidan</em> eller tryck antingen <em>Ctrl-F5</em> eller <em>Ctrl-R</em> (<em>⌘-R</em> på Mac)\n*<strong>Google Chrome:</strong> Tryck <em>Ctrl-Skift-R</em> (<em>⌘-Shift-R</em> på Mac)\n*<strong>Internet Explorer:</strong> Håll ned <em>Ctrl</em> och klicka på <em>Uppdatera</em> eller tryck <em>Ctrl-F5</em>\n*<strong>Opera:</strong> Gå till <em>Meny → Inställningar</em> (<em>Opera → Inställningar</em> på en Mac) och sedan på <em>Sekretess & säkerhet → Rensa webbläsardata → Hämtade bilder och filer</em>.",
"usercssyoucanpreview": "'''Tips:''' Använd knappen \"{{int:showpreview}}\" för att testa din nya CSS innan du sparar.",
+ "userjsonyoucanpreview": "<strong>Tips:</strong> Använd knappen \"{{int:showpreview}}\" för att testa din nya JSON innan du sparar.",
"userjsyoucanpreview": "'''Tips:''' Använd knappen \"{{int:showpreview}}\" för att testa ditt nya JavaScript innan du sparar.",
- "usercsspreview": "'''Kom ihåg att du bara förhandsgranskar din användar-CSS.'''\n'''Den har inte sparats än!'''",
- "userjspreview": "'''Kom ihåg att du bara testar/förhandsgranskar ditt JavaScript.'''\n'''Det har inte sparats än!'''",
- "sitecsspreview": "'''Kom ihåg att du bara förhandsgranskar detta CSS.''' \n'''Det har ännu inte sparats!'''",
- "sitejspreview": "'''Kom ihåg att du bara förhandsgranskar denna JavaScript-kod.'''\n'''Det har ännu inte sparats!'''",
- "userinvalidconfigtitle": "'''Varning:''' Utseendet \"$1\" finns inte. Kom ihåg att .css- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/vector.css i stället för {{ns:user}}:Foo/Vector.css.",
+ "usercsspreview": "<strong>Kom ihåg att du bara förhandsgranskar din användardefinierade CSS-kod.\nDen har ännu inte sparats!</strong>",
+ "userjsonpreview": "<strong>Kom ihåg att du bara testar/förhandsgranskar din användardefinierade JSON-konfiguration.\nDen har ännu inte sparats!</strong>",
+ "userjspreview": "<strong>Kom ihåg att du bara testar/förhandsgranskar din användardefinierade JavaScript-kod.\nDen har ännu inte sparats!</strong>",
+ "sitecsspreview": "<strong>Kom ihåg att du bara förhandsgranskar denna CSS-kod.\nDet har ännu inte sparats!</strong>",
+ "sitejsonpreview": "<strong>Kom ihåg att du bara förhandsgranskar denna JSON-konfiguration.\nDen har ännu inte sparats!</strong>",
+ "sitejspreview": "<strong>Kom ihåg att du bara förhandsgranskar denna JavaScript-kod.\nDet har ännu inte sparats!</strong>",
+ "userinvalidconfigtitle": "'''Varning:''' Utseendet \"$1\" finns inte. Kom ihåg att .css-, .json- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/vector.css i stället för {{ns:user}}:Foo/Vector.css.",
"updated": "(Uppdaterad)",
"note": "'''Obs!'''",
"previewnote": "'''Kom ihåg att detta bara är en förhandsvisning.'''\nDina ändringar har ännu inte sparats!",
"default": "ursprungsinställning",
"prefs-files": "Filer",
"prefs-custom-css": "Personlig CSS",
+ "prefs-custom-json": "Anpassad JSON",
"prefs-custom-js": "Personligt JavaScript",
- "prefs-common-config": "Delad CSS/JS för alla utseenden:",
+ "prefs-common-config": "Delad CSS/JSON/JavaScript för alla utseenden:",
"prefs-reset-intro": "Du kan använda den här sidan till att återställa dina inställningar till webbplatsens standardinställningar.\nDetta kan inte återställas.",
"prefs-emailconfirm-label": "E-postbekräftelse:",
"youremail": "E-post:",
"right-editcontentmodel": "Ändra innehållsmodellen för en sida",
"right-editinterface": "Redigera användargränssnittet",
"right-editusercss": "Redigera andra användares CSS-filer",
+ "right-edituserjson": "Redigera andra användares JSON-filer",
"right-edituserjs": "Redigera andra användares JavaScript-filer",
"right-editmyusercss": "Redigera din egen användares CSS-filer",
+ "right-editmyuserjson": "Redigera dina egna JSON-filer",
"right-editmyuserjs": "Redigera din egen användares JavaScript-filer",
"right-viewmywatchlist": "Visa din egen bevakningslista",
"right-editmywatchlist": "Redigera din egen bevakningslista. Observera att en del åtgärder kommer fortfarande lägga till sidor även utan denna rättighet.",
"grant-createaccount": "Skapa konton",
"grant-createeditmovepage": "Skapa, redigera och flytta sidor",
"grant-delete": "Radera sidor, revideringar och loggposter",
- "grant-editinterface": "Redigera MediaWiki-namnrymden och CSS/Javascript för användaren",
- "grant-editmycssjs": "Redigera din CSS/JavaScript för användare",
+ "grant-editinterface": "Redigera CSS/JSON/Javascript för MediaWiki-namnrymden och -användare",
+ "grant-editmycssjs": "Redigera din egen CSS/JSON/JavaScript",
"grant-editmyoptions": "Redigera dina användarinställningar",
"grant-editmywatchlist": "Redigera din bevakningslista",
"grant-editpage": "Redigera befintliga sidor",
"group-bot.css": "/* CSS som placeras här kommer bara att påverka robotar */",
"group-sysop.css": "/* CSS som placeras här kommer bara att påverka administratörer */",
"group-bureaucrat.css": "/* CSS som placeras här kommer bara att påverka byråkrater */",
+ "common.json": "/* JSON som skrivs här körs för alla användare varje gång en sida laddar. */",
"common.js": "/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */",
"group-autoconfirmed.js": "/* JavaScript här kommer att laddas för bekräftade användare */",
"group-user.js": "/* JavaScript här kommer att laddas för registrerade användare */",
"unlinkaccounts-success": "Kontot avlänkades.",
"authenticationdatachange-ignored": "Ändringen av autentiseringsdata hanterades inte. Kanske ingen tillhandahållare har konfigurerats?",
"userjsispublic": "Observera: JavaScript-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
+ "userjsonispublic": "OBS: JSON-undersidor bör inte innehålla privat information eftersom de kan läsas av andra användare.",
"usercssispublic": "Observera: CSS-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
"restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
"restrictionsfield-label": "Tillåtna IP-intervall:",
"rcfilters-group-results-by-page": "ఫలితాలను పేజీవారీగా గుదిగుచ్చు",
"rcfilters-activefilters": "సచేతనమైన వడపోతలు",
"rcfilters-advancedfilters": "ఉన్నత వడపోతలు",
- "rcfilters-limit-title": "à°\9aà±\82పిà°\82à°\9aాలà±\8dసిన మారà±\8dà°ªà±\81లు",
+ "rcfilters-limit-title": "à°\9aà±\82పిà°\82à°\9aాలà±\8dసిన ఫలితాలు",
"rcfilters-days-title": "ఇటీవలి రోజులు",
"rcfilters-hours-title": "ఇటీవలి గంటలు",
"rcfilters-days-show-days": "$1 {{PLURAL:$1|రోజు|రోజులు}}",
"rcfilters-days-show-hours": "$1 {{PLURAL:$1|గంట|గంటలు}}",
"rcfilters-highlighted-filters-list": "హైలైటు చేసినవి: $1",
"rcfilters-quickfilters": "భద్రపరచిన వడపోతలు",
- "rcfilters-quickfilters-placeholder-title": "à°\87à°\82à°\95à°¾ లిà°\82à°\95à±\81à°²à±\81 à°µà±\87à°\9fà°¿à°¨ీ భద్రపరచలేదు",
+ "rcfilters-quickfilters-placeholder-title": "à°\87à°\82à°\95à°¾ వడపà±\8bతలà±\87à°®ీ భద్రపరచలేదు",
"rcfilters-quickfilters-placeholder-description": "మీ వడపోత సెట్టింగులను భద్రపరచి తరువాత వాడుకోవాలంటే, కింద ఉన్న యాక్టివ్ ఫిల్టర్ ఏరియా లోని పేజీక (బుక్మార్కు) ఐకన్ను నొక్కండి.",
"rcfilters-savedqueries-defaultlabel": "భద్రపరచిన వడపోతలు",
"rcfilters-savedqueries-rename": "పేరుమార్చు",
"rcfilters-liveupdates-button-title-off": "కొత్త మార్పులు, జరుగుతూండగానే చూపించు",
"rcfilters-watchlist-markseen-button": "మార్పులన్నీ చూసినట్లుగా గుర్తించు",
"rcfilters-watchlist-edit-watchlist-button": "మీ వీక్షణ జాబితాను సవరించండి",
+ "rcfilters-watchlist-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దుగా''' మరియు నింపిన గుండ్రని గుర్తుల ద్వారా చూపించబడ్డాయి.",
"rcnotefrom": "<strong>$3, $4</strong> తరువాత జరిగిన {{PLURAL:$5|మార్పు|మార్పులు}} కింద ఇచ్చాం (<strong>$1</strong> దాకా చూపించాం).",
"rclistfromreset": "తేదీ ఎంపికను రీసెట్ చెయ్యి",
"rclistfrom": "$3, $2 తో మొదలుపెట్టి ఆ తరువాత జరిగిన మార్పులను చూపించు",
"enotif_body_intro_restored": "{{SITENAME}} $1 పేజీని $PAGEEDITDATE న $2 {{GENDER:$2|పునస్థాపించారు}}, ప్రస్తుత కూర్పు కోసం $3 చూడండి.",
"enotif_body_intro_changed": "{{SITENAME}} $1 పేజీని $PAGEEDITDATE న $2 {{GENDER:$2|మార్చారు}}, ప్రస్తుత కూర్పు కోసం $3 చూడండి.",
"enotif_lastvisited": "మీ గత సందర్శన తరువాత జరిగిన మార్పుల కొరకు $1 చూడండి.",
- "enotif_lastdiff": "ఈ మార్పు చూసేందుకు $1 కు వెళ్ళండి.",
+ "enotif_lastdiff": "ఈ మార్పును చూసేందుకు, $1కు వెళ్ళండి.",
"enotif_anon_editor": "అజ్ఞాత వాడుకరి $1",
"enotif_body": "ప్రియమైన $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nచేర్పరి సారాంశం: $PAGESUMMARY $PAGEMINOREDIT\n\nచేర్పరిని సంప్రదించండి:\nమెయిలు: $PAGEEDITOR_EMAIL\nవికీ: $PAGEEDITOR_WIKI\n\nమీరు లాగినై ఈ పేజీకి వెళ్తే తప్ప ఇక ముందు జరిగే కార్యకలాపాల గురించిన వార్తలను మీకు పంపించము. మీ వీక్షణజాబితా లోని అన్ని పేజీలకు ఉన్న గమనింపు జెండాలను మార్చుకోవచ్చు.\n\nమీ స్నేహపూర్వక {{SITENAME}} గమనింపుల వ్యవస్థ\n\n--\nమీ ఈమెయిలు గమనింపుల అమరికలను మార్చుకునేందుకు, చూడండి\n{{canonicalurl:{{#special:Preferences}}}}\n\nమీ వీక్షణ జాబితా అమరికలను మార్చుకునేందుకు, చూడండి\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nమీ వీక్షణ జాబితా నుండి పేజీని తొలగించేందుకు, చూడండి\n$UNWATCHURL\n\nఫీడుబ్యాకుకు, ఇతర సహాయం కోసం:\n$HELPPAGE",
+ "enotif_minoredit": "ఇది ఒక చిన్న మార్పు",
"created": "సృష్టించారు",
"changed": "మార్చారు",
"deletepage": "పేజీని తొలగించు",
"unblocked-id": "$1 అనే నిరోధాన్ని తొలగించాం",
"unblocked-ip": "[[Special:Contributions/$1|$1]] పైనున్న నిరోధాన్ని ఎత్తివేసాం.",
"blocklist": "నిరోధిత వాడుకరులు",
+ "autoblocklist-submit": "వెతుకు",
"ipblocklist": "నిరోధించబడిన వాడుకరులు",
"ipblocklist-legend": "నిరోధించబడిన వాడుకరిని వెతకండి",
"blocklist-userblocks": "ఖాతా నిరోధాలను దాచు",
"compare-invalid-title": "మీరు ఇచ్చిన శీర్షిక చెల్లనిది.",
"compare-title-not-exists": "మీరు పేర్కొన్న శీర్షిక లేనే లేదు.",
"compare-revision-not-exists": "మీరు పేర్కొన్న కూర్పు లేనే లేదు.",
- "diff-form": "à°\92à°\95 '''ఫారà°\82'''",
+ "diff-form": "à°¤à±\87డాలà±\81",
"dberr-problems": "క్షమించండి! ఈ సైటు సాంకేతిక సమస్యలని ఎదుర్కొంటుంది.",
"dberr-again": "కొన్ని నిమిషాలాగి మళ్ళీ ప్రయత్నించండి.",
"dberr-info": "(డేటాబేసును చేరలేకున్నాం: $1)",
]
},
"tog-underline": "การขีดเส้นใต้ลิงก์:",
- "tog-hideminor": "à¸\8bà¹\88à¸à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢à¹\83à¸\99หà¸\99à¹\89าà¸\9bรัà¸\9aà¸\9bรุงล่าสุด",
+ "tog-hideminor": "à¸\8bà¹\88à¸à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\80ลà¹\87à¸\81à¸\99à¹\89à¸à¸¢à¹\83à¸\99หà¸\99à¹\89าà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลงล่าสุด",
"tog-hidepatrolled": "ซ่อนการแก้ไขที่ตรวจสอบแล้วในหน้าปรับปรุงล่าสุด",
"tog-newpageshidepatrolled": "ซ่อนหน้าที่ตรวจสอบแล้วในรายการหน้าใหม่",
"tog-hidecategorization": "ซ่อนการจัดหมวดหมู่หน้า",
"filereadonlyerror": "ไม่สามารถแก้ไขไฟล์ \"$1\" เพราะที่เก็บไฟล์ \"$2\" อยู่ในภาวะอ่านอย่างเดียว\n\nผู้ดูแลระบบที่ล็อกให้คำอธิบายว่า: \"$3\"",
"invalidtitle-knownnamespace": "ชื่อเรื่องที่มีเนมสเปซ \"$2\" กับข้อความ \"$3\" ไม่ถูกต้อง",
"invalidtitle-unknownnamespace": "ชื่อเรื่องที่ไม่ทราบเนมสเปซหมายเลข $1 กับข้อความ \"$2\" ไม่ถูกต้อง",
- "exception-nologin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "exception-nologin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88à¸à¹\80à¸\82à¹\89าระà¸\9aà¸\9a",
"exception-nologin-text": "โปรดล็อกอินเพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้",
"exception-nologin-text-manual": "โปรด$1เพื่อสามารถเข้าถึงหน้าหรือปฏิบัติการนี้",
"virus-badscanner": "โครงแบบผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: <em>$1</em>",
"yourpasswordagain": "พิมพ์รหัสผ่านอีกครั้ง:",
"createacct-yourpasswordagain": "ยืนยันรหัสผ่าน",
"createacct-yourpasswordagain-ph": "กรอกรหัสผ่านอีกครั้ง",
- "userlogin-remembermypassword": "à¹\83หà¹\89à¸\89ัà¸\99à¸à¸¢à¸¹à¹\88à¹\83à¸\99ระà¸\9aà¸\9aà¸\95à¹\88à¸",
+ "userlogin-remembermypassword": "à¹\83หà¹\89à¸\89ัà¸\99à¸\84à¸\87à¸à¸¢à¸¹à¹\88à¹\83à¸\99ระà¸\9aà¸\9aà¸\95à¹\88à¸à¹\84à¸\9b",
"userlogin-signwithsecure": "ใช้การเชื่อมต่อที่ปลอดภัย",
"cannotlogin-title": "ไม่สามารถเข้าสู่ระบบได้",
"cannotlogin-text": "ไม่สามารถเข้าสู่ระบบได้",
"yourdomainname": "โดเมนของคุณ:",
"password-change-forbidden": "คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้",
"externaldberror": "มีข้อผิดพลาดของฐานข้อมูลการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ",
- "login": "ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "login": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
"login-security": "ยืนยันตัวตนของคุณ",
"nav-login-createaccount": "ล็อกอิน / สร้างบัญชี",
- "logout": "ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c",
- "userlogout": "ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c",
- "notloggedin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "logout": "à¸à¸à¸\81à¸\88าà¸\81ระà¸\9aà¸\9a",
+ "userlogout": "à¸à¸à¸\81à¸\88าà¸\81ระà¸\9aà¸\9a",
+ "notloggedin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88à¸à¹\80à¸\82à¹\89าระà¸\9aà¸\9a",
"userlogin-noaccount": "ไม่มีบัญชีหรือ",
"userlogin-joinproject": "เข้าร่วมกับ{{SITENAME}}",
"createaccount": "สร้างบัญชี",
"userlogin-resetpassword-link": "ลืมรหัสผ่านหรือ",
- "userlogin-helplink2": "วิà¸\98ีà¹\83à¸\8aà¹\89à¹\80รืà¹\88à¸à¸\87à¸\81ารลà¹\87à¸à¸\81à¸à¸´à¸\99",
- "userlogin-loggedin": "à¸\84ุà¸\93ลà¹\87à¸à¸\81à¸à¸´à¸\99à¹\83à¸\99à¸\8aืà¹\88ภ{{GENDER:$1|$1}} à¹\81ลà¹\89ว\nà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88à¸à¸¥à¹\87à¸à¸\81à¸à¸´à¸\99เป็นอีกผู้ใช้หนึ่ง",
+ "userlogin-helplink2": "à¸\84ำà¸à¸\98ิà¸\9aายà¹\80รืà¹\88à¸à¸\87à¸\81ารà¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
+ "userlogin-loggedin": "à¸\84ุà¸\93à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aà¹\83à¸\99à¸\8aืà¹\88ภ{{GENDER:$1|$1}} à¹\81ลà¹\89ว\nà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88à¸à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aเป็นอีกผู้ใช้หนึ่ง",
"userlogin-reauth": "คุณต้องเข้าสู่ระบบอีกครั้งเพื่อยืนยันว่าคุณคือ{{GENDER:$1|$1}}",
"userlogin-createanother": "สร้างอีกบัญชี",
"createacct-emailrequired": "ที่อยู่อีเมล",
"nocookiesfornew": "บัญชีผู้ใช้ไม่ถูกสร้าง เนื่องจากเราไม่สามารถยืนยันต้นทาง\nกรุณาทำให้แน่ใจว่าคุณได้เปิดใช้งานคุกกี้ โหลดหน้านี้ใหม่และลองอีกครั้ง",
"createacct-loginerror": "บัญชีผู้ใช้ถูกสร้างสำเร็จแล้ว แต่คุณไม่สามารถเข้าสู่ระบบได้โดยอัตโนมัติ โปรด[[Special:UserLogin|เข้าสู่ระบบด้วยตนเอง]]",
"noname": "คุณไม่ได้ใส่ชื่อผู้ใช้ที่ถูกต้อง",
- "loginsuccesstitle": "ลà¹\87à¸à¸\81à¸à¸´à¸\99สำเร็จ",
+ "loginsuccesstitle": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9aสำเร็จ",
"loginsuccess": "<strong>ขณะนี้คุณล็อกอินสู่ {{SITENAME}} ในชื่อ \"$1\"</strong>",
"nosuchuser": "ไม่มีผู้ใช้ชื่อ \"$1\"\nชื่อผู้ใช้นั้นไวต่ออักษรใหญ่เล็ก\nกรุณาตรวจการสะกดอีกครั้ง หรือ[[Special:CreateAccount|สร้างบัญชีใหม่]]",
"nosuchusershort": "ไม่มีผู้ใช้ชื่อ \"$1\" \nกรุณาตรวจสอบการสะกด",
"loginlanguagelabel": "ภาษา: $1",
"suspicious-userlogout": "คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
"createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
- "pt-login": "ลà¹\87à¸à¸\81à¸à¸´à¸\99",
- "pt-login-button": "ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "pt-login": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
+ "pt-login-button": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
"pt-login-continue-button": "ทำการเข้าสู่ระบบต่อไป",
"pt-createaccount": "สร้างบัญชี",
- "pt-userlogout": "ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c",
+ "pt-userlogout": "à¸à¸à¸\81à¸\88าà¸\81ระà¸\9aà¸\9a",
"php-mail-error-unknown": "เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี",
"user-mail-no-addy": "พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล",
"user-mail-no-body": "พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล",
"nosuchsectiontitle": "ไม่พบส่วน",
"nosuchsectiontext": "คุณพยายามแก้ไขส่วนที่ไม่มีอยู่ \nส่วนดังกล่าวอาจถูกย้ายหรือลบขณะที่คุณดูหน้าอยู่",
"loginreqtitle": "ต้องล็อกอิน",
- "loginreqlink": "ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "loginreqlink": "à¹\80à¸\82à¹\89าสูà¹\88ระà¸\9aà¸\9a",
"loginreqpagetext": "กรุณา$1เพื่อดูหน้าอื่น",
"accmailtitle": "ส่งรหัสผ่านแล้ว",
"accmailtext": "ส่งรหัสผ่านแบบสุ่มของ [[User talk:$1|$1]] ไป $2 แล้ว สามารถเปลี่ยนรหัสผ่านในหน้า<em>[[Special:ChangePassword|เปลี่ยนรหัสผ่าน]]</em> หลังล็อกอิน",
"prefs-labs": "คุณสมบัติทดลอง",
"prefs-user-pages": "หน้าผู้ใช้",
"prefs-personal": "โพรไฟล์ผู้ใช้",
- "prefs-rc": "เปลี่ยนแปลงล่าสุด",
+ "prefs-rc": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94",
"prefs-watchlist": "รายการเฝ้าดู",
"prefs-editwatchlist": "แก้ไขรายการเฝ้าดู",
"prefs-editwatchlist-label": "แก้ไขหน่วยในรายการเฝ้าดูของคุณ:",
"nchanges": "$1 การเปลี่ยนแปลง",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ตั้งแต่การเยี่ยมชมครั้งสุดท้าย}}",
"enhancedrc-history": "ประวัติ",
- "recentchanges": "เปลี่ยนแปลงล่าสุด",
+ "recentchanges": "à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87ลà¹\88าสุà¸\94",
"recentchanges-legend": "ตัวเลือกการเปลี่ยนแปลงล่าสุด",
"recentchanges-summary": "ติดตามการเปลี่ยนแปลงล่าสุดบนวิกินี้ได้ทางหน้านี้",
"recentchanges-noresult": "ไม่มีการเปลี่ยนแปลงในช่วงที่กำหนดซึ่งตรงกับเกณฑ์เหล่านี้",
"reuploaddesc": "ยกเลิกการอัปโหลดและกลับไปแบบอัปโหลด",
"upload-tryagain": "ส่งคำอธิบายไฟล์ที่ดัดแปรแล้ว",
"upload-tryagain-nostash": "ส่งไฟล์ที่อัปโหลดใหม่และคำอธิบายที่ดัดแปรแล้ว",
- "uploadnologin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "uploadnologin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88à¸à¹\80à¸\82à¹\89าระà¸\9aà¸\9a",
"uploadnologintext": "โปรด$1เพื่ออัปโหลดไฟล์",
"upload_directory_missing": "สารบบอัปโหลด ($1) หาย และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้",
"upload_directory_read_only": "เว็บเซิร์ฟเวอร์ไม่สามารถเขียนสารบบอัปโหลด ($1)",
"watchlistfor2": "สำหรับ $1 $2",
"nowatchlist": "ไม่มีรายการในรายการเฝ้าดูของคุณ",
"watchlistanontext": "กรุณาล็อกอินเพื่อดูหรือแก้ไขรายการในรายการเฝ้าดูของคุณ",
- "watchnologin": "ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¹\87à¸à¸\81à¸à¸´à¸\99",
+ "watchnologin": "à¹\84มà¹\88à¹\84à¸\94à¹\89ลà¸\87à¸\8aืà¹\88à¸à¹\80à¸\82à¹\89าระà¸\9aà¸\9a",
"addwatch": "เพิ่มเข้ารายการเฝ้าดู",
"addedwatchtext": "เพิ่มหน้า \"[[:$1]]\" และหน้าอภิปรายเข้า[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว",
"addedwatchtext-talk": "เพิ่ม \"[[:$1]]\" และหน้าที่สัมพันธ์เข้า[[Special:Watchlist|รายการเฝ้าดู]]ของคุณแล้ว",
"namespace_association": "เนมสเปซที่เกี่ยวข้อง",
"tooltip-namespace_association": "เลือกกล่องนี้เพื่อรวมเนมสเปซคุยหรือเรื่องที่เกี่ยวข้องกับเนมสเปซที่เลือกด้วย",
"blanknamespace": "(หลัก)",
- "contributions": "à¹\80รืà¹\88à¸à¸\87à¸\97ีà¹\88{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}à¸\99ีà¹\89à¹\80à¸\82ียà¸\99",
+ "contributions": "à¹\80รืà¹\88à¸à¸\87à¸\97ีà¹\88{{GENDER:$1|à¸\9cูà¹\89à¹\83à¸\8aà¹\89}}มีสà¹\88วà¸\99รà¹\88วม",
"contributions-title": "เรื่องที่มีส่วนร่วมโดย $1",
"mycontris": "เรื่องที่มีส่วนร่วม",
"anoncontribs": "เรื่องที่มีส่วนร่วม",
"nolinkshere": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong>",
"nolinkshere-ns": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong> ในเนมสเปซที่เลือก",
"isredirect": "หน้าเปลี่ยนทาง",
- "istemplate": "ใช้แม่แบบ",
+ "istemplate": "à¹\82à¸\94ยà¹\83à¸\8aà¹\89à¹\81มà¹\88à¹\81à¸\9aà¸\9a",
"isimage": "ลิงก์ไฟล์",
"whatlinkshere-prev": "{{PLURAL:$1|ก่อนหน้า|ก่อนหน้า $1}}",
"whatlinkshere-next": "{{PLURAL:$1|ถัดไป|ถัดไป $1}}",
"blocklink": "บล็อก",
"unblocklink": "ปลดบล็อก",
"change-blocklink": "เปลี่ยนการบล็อก",
- "contribslink": "ส่วนร่วม",
+ "contribslink": "มีสà¹\88วà¸\99รà¹\88วม",
"emaillink": "ส่งอีเมล",
"autoblocker": "ถูกบล็อกอัตโนมัติเนื่องจาก \"[[User:$1|$1]]\" ใช้เลขที่อยู่ไอพีของคุณเมื่อเร็ว ๆ นี้\nเหตุผลที่ให้แก่การบล็อก $1 คือ: \"$2\"",
"blocklogpage": "ปูมการบล็อก",
"tooltip-pt-anoncontribs": "รายการการแก้ไขจากเลขที่อยู่ไอพีนี้",
"tooltip-pt-login": "สนับสนุนให้คุณล็อกอิน แต่ไม่บังคับ",
"tooltip-pt-login-private": "คุณต้องล็อกอินจึงจะใช้วิกินี้ได้",
- "tooltip-pt-logout": "ลà¹\87à¸à¸\81à¹\80à¸à¸²à¸\95à¹\8c",
+ "tooltip-pt-logout": "à¸à¸à¸\81à¸\88าà¸\81ระà¸\9aà¸\9a",
"tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
"tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
"tooltip-ca-edit": "แก้ไขหน้านี้",
"cascadeprotected": "Сторінка захищена від редагувань, оскільки вона включена на {{PLURAL:$1|1=сторінці|сторінках}}, де встановлено каскадний захист: $2",
"namespaceprotected": "У вас нема дозволу редагувати сторінки в просторі назв «$1».",
"customcssprotected": "У вас немає дозволу на редагування цієї CSS-сторінки, бо вона містить особисті налаштування іншого користувача.",
+ "customjsonprotected": "У Вас немає прав на редагування цієї JSON-сторінки, оскільки вона містить персональні налаштування іншого користувача.",
"customjsprotected": "У вас немає дозволу на редагування цієї JavaScript-сторінки, бо вона містить особисті налаштування іншого користувача.",
"mycustomcssprotected": "У вас немає дозволу для редагування цієї CSS сторінки.",
+ "mycustomjsonprotected": "У Вас немає прав на редагування цієї JSON-сторінки.",
"mycustomjsprotected": "Ви не маєте дозволу для редагування цієї сторінки JavaScript.",
"myprivateinfoprotected": "У вас немає дозволу на редагування своєї приватної інформації.",
"mypreferencesprotected": "У вас немає дозволу на редагування своїх налаштувань.",
"wrongpasswordempty": "Ви не ввели пароль. Будь ласка, спробуйте ще раз.",
"passwordtooshort": "Ваш пароль закороткий, він має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}.",
"passwordtoolong": "Пароль не може бути довшим ніж {{PLURAL:$1|1 символ|$1 символи|$1 символів}}.",
- "passwordtoopopular": "Ð\9fаÑ\80олÑ\96, Ñ\89о Ñ\87аÑ\81Ñ\82о обиÑ\80аÑ\8eÑ\82Ñ\8cÑ\81Ñ\8f, не можÑ\83Ñ\82Ñ\8c бÑ\83Ñ\82и викоÑ\80иÑ\81Ñ\82анÑ\96. Ð\91Ñ\83дÑ\8c лаÑ\81ка, обеÑ\80Ñ\96Ñ\82Ñ\8c бÑ\96лÑ\8cÑ\88 Ñ\83нÑ\96калÑ\8cний паÑ\80олÑ\8c.",
+ "passwordtoopopular": "Ð\9fоÑ\88иÑ\80енÑ\96 паÑ\80олÑ\96 викоÑ\80иÑ\81Ñ\82овÑ\83ваÑ\82и не можна. Ð\91Ñ\83дÑ\8c лаÑ\81ка, обеÑ\80Ñ\96Ñ\82Ñ\8c паÑ\80олÑ\8c, Ñ\8fкий бÑ\83ло б Ñ\81кладнÑ\96Ñ\88е вгадаÑ\82и.",
"password-name-match": "Ваш пароль має відрізнятися від імені користувача.",
"password-login-forbidden": "Використання цього імені користувача і пароля заборонено.",
"mailmypassword": "Перевстановити пароль",
"savechanges": "Зберегти зміни",
"publishpage": "Зберегти сторінку",
"publishchanges": "Зберегти зміни",
+ "savearticle-start": "Зберегти сторінку...",
+ "savechanges-start": "Зберегти зміни...",
+ "publishpage-start": "Опублікувати сторінку...",
+ "publishchanges-start": "Опублікувати зміни...",
"preview": "Попередній перегляд",
"showpreview": "Попередній перегляд",
"showdiff": "Показати зміни",
"blocked-notice-logextract": "{{GENDER:$1|Цей користувач|Ця користувачка}} наразі {{GENDER:$1|заблокований|заблокована}}.\nОстанній запис у журналі блокувань такий:",
"clearyourcache": "<strong>Увага:</strong> Після збереження слід очистити кеш оглядача, щоб побачити зміни.\n* <strong>Firefox / Safari:</strong> тримайте <em>Shift</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em> чи <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Apple Mac)\n* <strong>Google Chrome:</strong> натисніть <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Apple Mac)\n* <strong>Internet Explorer:</strong> тримайте <em>Ctrl</em>, коли натискаєте <em>Оновити</em>, або натисніть <em>Ctrl-F5</em>\n* <strong>Opera:</strong> очистіть кеш за допомогою <em>Інструменти → Налаштування</em> (<em>Opera → Побажання</em> на Apple Mac) та перейдіть на <em>Приватність & безпека → очистити дані браузера → кеш</em>",
"usercssyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
+ "userjsonyoucanpreview": "<strong>Підказка:</strong> використовуйте кнопку «{{int:showpreview}}», щоб протестувати Ваш новий код JSON перед збереженням.",
"userjsyoucanpreview": "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
"usercsspreview": "'''Пам'ятайте, що це лише попередній перегляд вашого css-файлу.'''\n'''Його ще не збережено!'''",
+ "userjsonpreview": "<strong>Пам'ятайте, що Ви лише тестуєте/попередньо переглядаєте Ваші користувацькі налаштування JSON.\nЇх ще не збережено!</strong>",
"userjspreview": "'''Пам'ятайте, що це тільки попередній перегляд вашого JavaScript-файлу і він поки-що не збережений!'''",
"sitecsspreview": "'''Пам'ятайте, що це тільки попередній перегляд цього CSS.'''\n'''Його ще не збережено!'''",
+ "sitejsonpreview": "<strong>Пам'ятайте, що Ви лише попередньо переглядаєте ці JSON-налаштування.\nЇх ще не збережено!</strong>",
"sitejspreview": "'''Пам'ятайте, що це лише попередній перегляд вашого JavaScript-коду.'''\n'''Його ще не збережено!'''",
- "userinvalidconfigtitle": "'''Увага:''' тема оформлення «$1» не знайдена.\nПам'ятайте, що користувацькі .css та .js сторінки повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».",
+ "userinvalidconfigtitle": "<strong>Увага:</strong> теми оформлення «$1» не знайдено.\nПам'ятайте, що користувацькі сторінки .css, .json та .js повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».",
"updated": "(Оновлена)",
"note": "'''Зауваження:'''",
"previewnote": "'''Це лише попередній перегляд.'''\nВаші зміни ще не збережено!",
"expansion-depth-exceeded-warning": "На сторінці перевищено межу глибини вкладеності",
"parser-unstrip-loop-warning": "Виявлено незакритий тег (такий, як <pre>)",
"unstrip-depth-warning": "Перевищено межу вкладеної рекурсії ($1) для парсера.",
+ "unstrip-depth-category": "Сторінки, на яких перевищено граничну глибину Unstrip",
+ "unstrip-size-warning": "Перевищено граничний розмір Unstrip ($1)",
+ "unstrip-size-category": "Сторінки, на яких перевищено граничний розмір Unstrip",
"converter-manual-rule-error": "Помилка в ручному правилі перетворення мови",
"undo-success": "Редагування може бути скасовано.\nБудь ласка, перевірте порівняння нижче, щоб впевнитись, що це те, що ви хочете зробити, а потім збережіть зміни, щоб закінчити скасування редагування.",
"undo-failure": "Неможливо скасувати редагування через несумісність проміжних змін.",
"stub-threshold-disabled": "Вимкнений",
"recentchangesdays": "За скільки днів показувати нові редагування:",
"recentchangesdays-max": "(максимум $1 {{PLURAL:$1|день|дні|днів}})",
- "recentchangescount": "Кількість редагувань для показу за замовчуванням:",
- "prefs-help-recentchangescount": "Це Ñ\81Ñ\82оÑ\81Ñ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f новиÑ\85 Ñ\80едагÑ\83ванÑ\8c, Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96й Ñ\81Ñ\82оÑ\80Ñ\96нок Ñ\96 жÑ\83Ñ\80налÑ\96в.",
+ "recentchangescount": "Кількість редагувань для показу за замовчуванням на сторінках нових редагувань, історій сторінок та в журналах:",
+ "prefs-help-recentchangescount": "Ð\9cакÑ\81ималÑ\8cна кÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8c: 1000",
"prefs-help-watchlist-token2": "Це секретний ключ до веб-каналу вашого списку спостереження.\nБудь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.\nЯкщо вам потрібно, [[Special:ResetTokens|ви можете скинути його]].",
"savedprefs": "Ваші налаштування збережено.",
"savedrights": "Групи {{GENDER:$1|користувача $1|користувачки $1}} було збережено.",
"default": "за замовчуванням",
"prefs-files": "Файли",
"prefs-custom-css": "Власний CSS",
+ "prefs-custom-json": "Власний JSON",
"prefs-custom-js": "Власний JS",
- "prefs-common-config": "CSS/JS спільні для всіх тем оформлення:",
+ "prefs-common-config": "CSS/JSON/JavaScript, спільні для всіх тем оформлення:",
"prefs-reset-intro": "Ця сторінка може бути використана для зміни ваших налаштувань на стандартні.\nПісля виконання цієї дії ви не зможете відкотити зміни.",
"prefs-emailconfirm-label": "Підтвердження адреси:",
"youremail": "Адреса електронної пошти:",
"right-editcontentmodel": "Редагувати модель вмісту сторінки",
"right-editinterface": "редагування інтерфейсу користувача",
"right-editusercss": "редагування CSS-файлів інших користувачів",
+ "right-edituserjson": "редагування JSON-файлів інших користувачів",
"right-edituserjs": "редагування JS-файлів інших користувачів",
"right-editmyusercss": "редагування власних CSS-файлів користувача",
+ "right-editmyuserjson": "редагування власних JSON-файлів користувача",
"right-editmyuserjs": "редагування власних JavaScript-файлів користувача",
"right-viewmywatchlist": "перегляд власного списку спостереження",
"right-editmywatchlist": "редагування власного списку спостереження; зверніть увагу, що деякі дії будуть додавати сторінки навіть без такого права.",
"grant-createaccount": "Створювати облікові записи",
"grant-createeditmovepage": "Створювати, редагувати та перейменовувати сторінки",
"grant-delete": "Вилучати сторінки, версії і записи журналів",
- "grant-editinterface": "Редагувати простір назв MediaWiki та CSS/JavaScript користувача",
- "grant-editmycssjs": "Редагувати Ваш користувацький CSS/JavaScript",
+ "grant-editinterface": "Редагувати простір назв MediaWiki та CSS/JSON/JavaScript користувача",
+ "grant-editmycssjs": "Редагувати Ваш користувацький CSS/JSON/JavaScript",
"grant-editmyoptions": "Редагувати Ваші налаштування користувача",
"grant-editmywatchlist": "Редагувати Ваш список спостереження",
"grant-editpage": "Редагувати наявні сторінки",
"rcfilters-activefilters": "Активні фільтри",
"rcfilters-advancedfilters": "Розширені фільтри",
"rcfilters-limit-title": "Результати, які треба показати",
- "rcfilters-limit-and-date-label": "{{PLURAL:$1|одна зміна|$1 змін}}, $2",
+ "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|зміна|зміни|змін}}, $2",
"rcfilters-date-popup-title": "Період часу для пошуку",
"rcfilters-days-title": "Останні дні",
"rcfilters-hours-title": "Останні години",
"rcfilters-view-tags-tooltip": "Фільтрувати результати, використовуючи мітки до редагувань",
"rcfilters-view-return-to-default-tooltip": "Повернутися до головного меню фільтра",
"rcfilters-view-tags-help-icon-tooltip": "Дізнайтесь більше про редагування з мітками",
- "rcfilters-liveupdates-button": "Ð\9eновленнÑ\8f наживо",
- "rcfilters-liveupdates-button-title-on": "Ð\92имкнÑ\83Ñ\82и оновленнÑ\8f наживо",
+ "rcfilters-liveupdates-button": "Ð\90вÑ\82омаÑ\82иÑ\87не оновленнÑ\8f",
+ "rcfilters-liveupdates-button-title-on": "Ð\92имкнÑ\83Ñ\82и авÑ\82омаÑ\82иÑ\87не оновленнÑ\8f",
"rcfilters-liveupdates-button-title-off": "Показувати нові зміни одразу ж після їх здійснення",
"rcfilters-watchlist-markseen-button": "Позначити всі зміни як переглянуті",
"rcfilters-watchlist-edit-watchlist-button": "Редагувати Ваш список спостереження",
"rcfilters-filter-showlinkedfrom-option-label": "<strong>Сторінки, на які є посилання з</strong> обраної сторінки",
"rcfilters-filter-showlinkedto-label": "Показати зміни на сторінках, що посилаються сюди",
"rcfilters-filter-showlinkedto-option-label": "<strong>Сторінки, що посилаються на</strong> обрану сторінку",
- "rcfilters-target-page-placeholder": "Уведіть назву сторінки",
+ "rcfilters-target-page-placeholder": "Уведіть назву сторінки (чи категорії)",
"rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
"rclistfromreset": "Скинути вибір дати",
"rclistfrom": "Показати редагування починаючи з $3 $2.",
"lockmanager-fail-closelock": "Не вдалося закрити файл блокування для \"$1\".",
"lockmanager-fail-deletelock": "Не вдалось вилучити файл блокування для \"$1\".",
"lockmanager-fail-acquirelock": "Не вдалося блокувати \"$1\".",
- "lockmanager-fail-openlock": "Не вдалося відкрити файл блокування для \"$1\".",
+ "lockmanager-fail-openlock": "Не вдалося відкрити файл блокування для «$1». Впевніться, що Ваш каталог завантаження налаштовано належним чином, і що Ваш веб-сервер має дозвіл на здійснення змін в цьому каталозі. Див. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory, щоб дізнатись більше.",
"lockmanager-fail-releaselock": "Не вдалось розблокувати \"$1\".",
"lockmanager-fail-db-bucket": "Не вдається зв'язатися з достатньою кількістю баз блокувань в сегменті $1.",
"lockmanager-fail-db-release": "Не вдалось зняти блокування бази даних $1.",
"doubleredirects": "Подвійні перенаправлення",
"doubleredirectstext": "На цій сторінці наведено список перенаправлень на інші перенаправлення.\nКожен рядок містить посилання на перше та друге перенаправлення, а також перший рядок тексту другого перенаправлення, що зазвичай містить «реальне» перенаправлення на необхідну сторінку, куди повинно вказувати й перше перенаправлення.\n<del>Закреслені</del> записи були виправлені.",
"double-redirect-fixed-move": "Сторінка «[[$1]]» була переміщена.\nВона автоматично оновлена і тепер є перенаправленням на «[[$2]]»",
- "double-redirect-fixed-maintenance": "Автоматичне виправлення подвійного перенаправлення з [[$1]] на [[$2]] в роботі по технічному обслуговуванню.",
+ "double-redirect-fixed-maintenance": "Автоматичне виправлення подвійного перенаправлення з [[$1]] на [[$2]] в роботі по технічному обслуговуванню",
"double-redirect-fixer": "Redirect fixer",
"brokenredirects": "Розірвані перенаправлення",
"brokenredirectstext": "Такі перенаправлення вказують на неіснуючі сторінки:",
"rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
"rollback-success-notify": "Відкинуті редагування користувача $1; \nповернено до останньої версії користувача $2. [$3 Показати зміни]",
"sessionfailure-title": "Помилка сеансу",
- "sessionfailure": "Ð\97даÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f, виникли пÑ\80облеми з поÑ\82оÑ\87ним Ñ\81еанÑ\81ом Ñ\80обоÑ\82и;\nÑ\86Ñ\8f дÑ\96Ñ\8f бÑ\83ла Ñ\81каÑ\81ована з меÑ\82оÑ\8e попеÑ\80едиÑ\82и «заÑ\85опленнÑ\8f Ñ\81еанÑ\81Ñ\83».\nÐ\91Ñ\83дÑ\8c лаÑ\81ка, наÑ\82иÑ\81нÑ\96Ñ\82Ñ\8c кнопкÑ\83 «Ð\9dазад» Ñ\96 пеÑ\80езаванÑ\82ажÑ\82е Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83, з Ñ\8fкоÑ\97 ви пÑ\80ийÑ\88ли.",
+ "sessionfailure": "Ð\97даÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f, виникли пÑ\80облеми з поÑ\82оÑ\87ним Ñ\81еанÑ\81ом Ñ\80обоÑ\82и;\nÑ\86Ñ\8e дÑ\96Ñ\8e Ñ\81каÑ\81овано, Ñ\89об запобÑ\96гÑ\82и «заÑ\85опленнÑ\8e Ñ\81еанÑ\81Ñ\83».\nÐ\91Ñ\83дÑ\8c лаÑ\81ка, надÑ\96Ñ\88лÑ\96Ñ\82Ñ\8c Ñ\84оÑ\80мÑ\83 Ñ\89е Ñ\80аз.",
"changecontentmodel": "Змінити модель вмісту сторінки",
"changecontentmodel-legend": "Змінити модель вмісту",
"changecontentmodel-title-label": "Назва сторінки",
"thumbnail_dest_directory": "Неможливо створити цільову директорію",
"thumbnail_image-type": "Тип зображення не підтримується",
"thumbnail_gd-library": "Неповна конфігурація бібліотеки GD, відсутня функція $1",
+ "thumbnail_image-size-zero": "Схоже, що розмір файлу зображення є нульовим.",
"thumbnail_image-missing": "Очевидно, відсутній файл $1",
"thumbnail_image-failure-limit": "Там було дуже багато недавніх невдалих спроб ($1 або більше) для візуалізації цього ескізу. Будь ласка, спробуйте ще раз пізніше.",
"import": "Імпорт статей",
"group-bot.css": "/* Розміщений тут CSS-код буде використаний тільки для ботів */",
"group-sysop.css": "/* Розміщений тут CSS-код буде використаний тільки для адміністраторів */",
"group-bureaucrat.css": "/* Розміщений тут CSS-код буде використаний тільки для бюрократів */",
+ "common.json": "/* Будь-який JSON тут завантажуватиметься для всіх користувачів при кожному завантаженні сторінки. */",
"common.js": "/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */",
"group-autoconfirmed.js": "/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */",
"group-bot.js": "/* Розміщений тут код JavaScript буде завантажений тільки для ботів */",
"pageinfo-category-subcats": "Кількість підкатегорій",
"pageinfo-category-files": "Кількість файлів",
"pageinfo-user-id": "ID користувача",
+ "pageinfo-file-hash": "Хеш-значення",
"markaspatrolleddiff": "Позначити як перевірену",
"markaspatrolledtext": "Позначити цю сторінку як перевірену",
"markaspatrolledtext-file": "Позначити цю версію файлу як відпатрульовану",
"watchlistedit-clear-titles": "Сторінки:",
"watchlistedit-clear-submit": "Очистити список спостереження (це незворотно!)",
"watchlistedit-clear-done": "Ваш список спостереження було очищено.",
+ "watchlistedit-clear-jobqueue": "Триває очищення Вашого списку спостереження. Це може зайняти трохи часу!",
"watchlistedit-clear-removed": "Було видалено {{PLURAL:$1|1 запис|$1 записів|$1 записи}}:",
"watchlistedit-too-many": "Забагато сторінок для відображення тут.",
"watchlisttools-clear": "Очистити список спостереження",
"version-poweredby-others": "інші",
"version-poweredby-translators": "перекладачі translatewiki.net",
"version-credits-summary": "Нам хотілося б відзначити наступних осіб, що зробили внесок у [[Special:Version|MediaWiki]].",
- "version-license-info": "MediaWiki є вільним програмним забезпеченням, ви можете розповсюджувати та/або модифікувати його відповідно до умов GNU General Public License, яка опублікованя фондом вільного програмного забезпечення; або версії 2 Ліцензії, або (на Ваш розсуд) будь-якої наступної версії. \n\nMediaWiki поширюється в надії, що вона буде корисною, але БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, навіть без неявної гарантії КОМЕРЦІЙНОЇ ПРИДАТНОСТІ чи ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ. Дивіться GNU General Public License для більш докладної інформації. \n\nВи повинні були отримати [{{SERVER}}{{SCRIPTPATH}}/COPYING копію GNU General Public License] разом з цією програмою, якщо немає, напишіть у Free Software Foundation, Inc 51 Franklin Street, Fifth Floor , Boston, MA 02110-1301, США або [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитайте її онлайн].",
+ "version-license-info": "MediaWiki є вільним програмним забезпеченням; Ви можете поширювати та/або модифікувати його відповідно до умов GNU General Public License в редакції, опублікованій Фондом вільного програмного забезпечення; або версії 2 Ліцензії, або (на Ваш розсуд) будь-якої наступної версії. \n\nMediaWiki поширюється в надії, що вона буде корисною, але <em>БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ</em>, навіть без неявної гарантії <strong>КОМЕРЦІЙНОЇ ПРИДАТНОСТІ</strong> чи <strong>ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ</strong>. Див. GNU General Public License, щоб дізнатись подробиці. \n\nВи повинні були отримати [{{SERVER}}{{SCRIPTPATH}}/COPYING копію GNU General Public License] разом з цією програмою; якщо її немає, пишіть до Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA або [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочитайте її онлайн].",
"version-software": "Установлене програмне забезпечення",
"version-software-product": "Продукт",
"version-software-version": "Версія",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байти|байтів}}",
"limitreport-expansiondepth": "Найвища глибина розширення",
"limitreport-expensivefunctioncount": "Число дорогої функції аналізатора",
+ "limitreport-unstrip-depth": "Глибина рекурсії Unstrip",
+ "limitreport-unstrip-size": "Розмір Unstrip після розгортання",
+ "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|байт|байти|байтів}}",
"expandtemplates": "Розгортання шаблонів",
- "expand_templates_intro": "Ця спеціальна сторінка перетворює текст, рекурсивно розгортаючи всі шаблони в ньому.\nТакож розгортаються всі функції парсера\n<nowiki>{{</nowiki>#language:...}} і змінні типу\n<nowiki>{{</nowiki>CURRENTDAY}}.\nФактично, усе всередині подвійних фігурних дужок.",
+ "expand_templates_intro": "Ця спеціальна сторінка перетворює вікірозмітку, рекурсивно розгортаючи всі шаблони в ній.\nТакож розгортаються всі парсерні функції на кшталт\n<nowiki>{{</nowiki>#language:...}} і змінні типу\n<nowiki>{{</nowiki>CURRENTDAY}}.\nФактично, усе всередині подвійних фігурних дужок.",
"expand_templates_title": "Заголовок сторінки для {{FULLPAGENAME}} тощо:",
- "expand_templates_input": "Ð\92Ñ\85Ñ\96дний Ñ\82екÑ\81Ñ\82:",
+ "expand_templates_input": "Ð\92Ñ\85Ñ\96дна вÑ\96кÑ\96Ñ\80озмÑ\96Ñ\82ка:",
"expand_templates_output": "Результат",
"expand_templates_xml_output": "XML-вивід",
"expand_templates_html_output": "Сирий вивід HTML",
"expand_templates_preview": "Попередній перегляд",
"expand_templates_preview_fail_html": "<em>Оскільки {{SITENAME}} має ввімкнений сирий HTML і відбулася втрата даних сесії, попередній перегляд прихований як захід безпеки від JavaScript-атак.</em>\n\n<strong>Якщо це правомірна спроба попереднього перегляду, будь ласка, спробуйте знову.</strong>\nЯкщо це далі не працює, спробуйте [[Special:UserLogout|вийти із системи]] і знову ввійти, та перевірте, чи Ваш браузер дозволяє куки з цього сайту.",
"expand_templates_preview_fail_html_anon": "<em>Оскільки {{SITENAME}} має ввімкненим сирий HTML, а Ви не ввійшли до системи, попередній перегляд прихований як захід безпеки від JavaScript-атак.</em>\n\n<strong>Якщо це правомірна спроба попереднього перегляду, будь ласка, [[Special:UserLogin|увійдіть до системи]] та спробуйте знову.</strong>",
- "expand_templates_input_missing": "Ð\92и повиннÑ\96 надаÑ\82и пÑ\80инаймнÑ\96 деÑ\8fкий вÑ\85Ñ\96дний Ñ\82екÑ\81Ñ\82.",
+ "expand_templates_input_missing": "Ð\92и повиннÑ\96 вказаÑ\82и пÑ\80инаймнÑ\96 Ñ\8fкÑ\83Ñ\81Ñ\8c вÑ\85Ñ\96днÑ\83 вÑ\96кÑ\96Ñ\80озмÑ\96Ñ\82кÑ\83.",
"pagelanguage": "Змінити мову сторінки",
"pagelang-name": "Сторінка",
"pagelang-language": "Мова",
"unlinkaccounts-success": "Обліковий запис було відв'язано.",
"authenticationdatachange-ignored": "Неопрацьована зміна облікових даних. Можливо, жоден з провайдерів не був налаштований?",
"userjsispublic": "Будь ласка, зверніть увагу: підсторінки JavaScript не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
+ "userjsonispublic": "Будь ласка, зверніть увагу: підсторінки JSON не повинні містити конфіденційних даних, адже їх можуть бачити інші користувачі.",
"usercssispublic": "Будь ласка, зверніть увагу: підсторінки CSS не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
"restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
"restrictionsfield-label": "Дозволені діапазони IP-адрес:",
"Saraiki",
"BukhariSaeed",
"Zainab Meher",
- "Sayam Asjad"
+ "Sayam Asjad",
+ "Abdulq"
]
},
"tog-underline": "ربط کی خط کشیدگی:",
"cascadeprotected": "درج ذیل محفوظ کردہ {{PLURAL:$1|صفحہ|صفحات}} کی «آبشاری» حفاظت میں شامل ہونے کی وجہ سے یہ صفحہ بھی محفوظ ہے:\n$2",
"namespaceprotected": "آپ کو '''$1''' نام فضا کے صفحات میں ترمیم کی اجازت نہیں۔",
"customcssprotected": "آپ کو اس سی ایس ایس میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
+ "customjsonprotected": "آپ کو اس JSON میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
"customjsprotected": "آپ کو اس جاوا اسکرپٹ میں ترمیم کرنے کی اجازت نہیں کیونکہ اس میں کسی دوسرے صارف کی ذاتی ترتیبات موجود ہیں۔",
"mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
"mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
"savechanges": "تبدیلیاں محفوظ کریں",
"publishpage": "شائع کریں",
"publishchanges": "تبدیلیاں شائع کریں",
+ "savearticle-start": "صفحہ محفوظ کریں",
+ "savechanges-start": "تبدیلیاں محفوظ کریں",
+ "publishpage-start": "صفحہ شائع کریں",
+ "publishchanges-start": "تبدیلیاں شائع کریں",
"preview": "نمائش",
"showpreview": "نمائش",
"showdiff": "تبدیلیاں دکھائیں",
"hidden-category-category": "ⵜⴰⴳⴳⴰⵢⵉⵏ ⵉⵜⵜⵓⵏⵜⴰⵍⵏ",
"category-subcat-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ ⵖⴰⵙ ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ.|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ {{PLURAL:$1|ⴰⴷⵓⵙⵎⵉⵍ ⴰⴷ |$1 ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ}}, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
"category-article-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⵢⵓⵎⴰ ⵖⴰⵙ ⵜⴰⵙⵏⴰ ⴰⴷ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵍⵍⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵍⵍⴰⵏⵜ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
+ "listingcontinuesabbrev": "ⴹⴼⵓⵔ",
"about": "ⵅⴼ",
"article": "ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵎⴰⵢⵜ",
"newwindow": "(ⴰⴷ ⵉⵏⵏⵓⵔⵥⵎ ⴳ ⵓⵙⴽⵙⵍ ⴰⵎⴰⵢⵏⵓ)",
"searchprofile-everything-tooltip": "ⵔⵣⵓ ⴳ ⵜⵓⵎⴰⵢⵜ ⴰⴽⴽⵯ (ⵓⵍⴰ ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ)",
"searchprofile-advanced-tooltip": "ⵔⵣⵓ ⴳ ⵜⵉⵔⵉⵡⵉⵏ ⵏ ⵉⵙⵎⴰⵡⵏ ⵉⵜⵡⴰⵏⵉⵎⴰⵏ",
"search-result-size": "$1 ({{PLURAL:$2|1 ⵜⴳⵓⵔⵉ|$2 ⵜⴳⵓⵔⵉⵡⵉⵏ}})",
+ "search-redirect": "(ⵓⵖⵓⵍ ⵙⴳ $1)",
"search-suggest": "ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ: $1",
"search-interwiki-more": "(ⵓⴳⴳⴰⵔ)",
"searchall": "ⴰⴽⴽ",
"recentchanges-label-newpage": "ⵉⵙⵏⴼⵍⵓⵍ ⵓⵙⵏⴼⵍ ⴰ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵜⴰⵎⴰⵢⵏⵓⵜ",
"recentchanges-label-minor": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
"recentchanges-label-bot": "ⴰⵙⵏⴼⵍ ⴰⴷ ⵉⵜⵡⴰⵙⴽⴰⵔ ⵙ ⵓⴱⵓⵜ",
+ "recentchanges-label-unpatrolled": "ⴰⵙⵏⴼⵍ ⴰⴷ ⵓⵔⵜⴰ ⵉⵜⵜⵡⴰⵣⵣⵔⵉ",
"recentchanges-label-plusminus": "ⵜⴰⵙⵎⴽⵜⴰ ⵏ ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵙⵙⵏⴼⵍ ⵙ ⵓⵎⴹⴰⵏ ⴰⴷ ⵏ ⵉⴱⴰⵢⵜⵏ",
"recentchanges-legend-heading": "<strong>ⴰⵙⵙⴼⵔⵓ:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ⵥⵔ ⴰⵍⵜⵓ [[Special:NewPages|ⵜⴰⵍⴳⴰⵎⵜ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵉⵎⴰⵢⵏⵓⵜⵉⵏ]])",
"nolinkstoimage": "ⵓⵔ ⵍⵍⵉⵏⵜ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⴰ.",
"sharedupload-desc-here": "ⴰⵙⴷⴰⵡ ⴰⴷ ⵙⴳ $1 ⵉⵥⴹⴰⵔ ⴰ ⵉⵜⵜⵡⴰⵙⵎⵔⵙ ⴳ ⵉⵙⵏⵜⴰⵢⵏ ⵢⴰⴹⵏ.\nⴰⵙⵏⵓⵎⵎⵍ ⵏⵙ ⴳ [$2 ⵜⴰⵙⵏⴰ ⵏⵙ ⵏ ⵓⵙⵏⵓⵎⵎⵍ] ⵜⵡⴰⵙⵎⴰⵍ ⵙⴰⴷⵓ.",
"filepage-nofile": "ⵓⵔ ⵓⴼⴰⵢⵍⵓ ⵙ ⵢⵉⵙⵎ ⴰ.",
+ "upload-disallowed-here": "ⵓⵔ ⵜⵓⴼⵉⵜ ⴰ ⵜⵙⵎⵎⵙⴽⵍⴷ ⴰⵙⴷⴰⵡ ⴰⴷ.",
"filerevert-comment": "ⵜⴰⵎⵏⵜⵉⵍⵜ:",
"filedelete": "ⴽⴽⵙ $1",
"filedelete-legend": "ⴽⴽⵙ ⴰⴼⴰⵢⵍⵓ",
"tooltip-ca-nstab-category": "ⵙⴽⵏ ⴰⵏⴰⵡ ⵏ ⵜⴰⵙⵏⴰ",
"tooltip-minoredit": "ⵕⵛⵎ ⵓⵢⴰ ⴰⵎ ⴰⵙⵏⴼⵍ ⵎⵥⵥⵉⵢⵏ",
"tooltip-save": "ⵃⴹⵓ ⵉⵙⵏⴼⴰⵍ ⵏⵏⴽ",
+ "tooltip-preview": "ⵣⵔ ⵣⵡⴰⵔ ⵉⵙⵏⴼⵍⵏ ⵏⴽ. ⴼⴰⴷ ⴰⴷ ⵜⵏ ⵜⵙⵓⵙⵔⴷ.",
"tooltip-diff": "ⵙⴽⵏ ⵎⴰⵏ ⵉⵙⵏⴼⴰⵍ ⵜⴳⴳⵉⴷ ⵉ ⵓⴹⵔⵉⵙ",
"tooltip-watch": "ⵔⵏⵓ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}}",
"tooltip-rollback": "\"ⵔⴰⵔ\" ⵙⵙⵔ ⴰⵙⵏⴼⵍ ⵏⵖ ⵉⵙⵏⴼⴰⵍⵏ ⵏ ⵓⵎⴰⴷⵔⴰⵡ ⴰⵎⴳⴳⴰⵔⵓ ⴳ ⵜⴰⵙⵏⴰ ⴷ ⵙ ⵢⴰⵏ ⵓⴽⵍⵉⴽ",
"tooltip-summary": "ⴰⵔⴰ ⴽⵔⴰ ⵏ ⵓⵙⴳⵣⵍ ⵎⵥⵥⵉⵢⵏ",
+ "simpleantispam-label": "ⵜⵉⵎⵏⵥⵉⵜ ⵎⴳⵍ-ⴳⴰⵔⴰⵙⵎⵔⴰⵔⴰ.\nⴰⴷ <strong>ⵓⵔ</strong> ⵜⵣⵎⵎⴻⵎⴷ ⴰⵎⵢⴰ ⴳ ⵖⵉ!",
"pageinfo-title": "ⵉⵏⵖⵎⵉⵙⵏ ⵖⴼ $1",
"pageinfo-header-edits": "ⵙⵏⴼⵍ ⴰⵎⵣⵔⵓⵢ",
"pageinfo-header-restrictions": "ⴰⴼⵔⴰⴳ ⵏ ⵜⴰⵙⵏⴰ",
"cascadeprotected": "本页面已经受到保护,不能编辑,因为它被嵌入于以下被“连锁保护”的{{PLURAL:$1|页面}}:\n$2",
"namespaceprotected": "您没有权限编辑<strong>$1</strong>名字空间内的页面。",
"customcssprotected": "您没有权限编辑此CSS页面,因为它包含另一位用户的个人设置。",
+ "customjsonprotected": "您没有权限编辑此JSON页面,因为它包含另一位用户的个人设置。",
"customjsprotected": "您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。",
"mycustomcssprotected": "您没有权限编辑这个 CSS 页面。",
+ "mycustomjsonprotected": "您没有权限编辑这个JSON页面。",
"mycustomjsprotected": "您没有权限编辑这个 JavaScript 页面。",
"myprivateinfoprotected": "您没有权限编辑您的私人信息。",
"mypreferencesprotected": "您没有权限来编辑您的个人设置。",
"savechanges": "保存更改",
"publishpage": "发布页面",
"publishchanges": "发布更改",
+ "savearticle-start": "保存页面…",
+ "savechanges-start": "保存更改…",
+ "publishpage-start": "发布页面…",
+ "publishchanges-start": "发布更改…",
"preview": "预览",
"showpreview": "显示预览",
"showdiff": "显示更改",
"blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
"clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后<em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
"usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
+ "userjsonyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的JSON。",
"userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
"usercsspreview": "<strong>请记住您现在只是在预览您的用户CSS。它尚未保存!</strong>",
+ "userjsonpreview": "<strong>请记住您现在只是在测试/预览您的用户JSON配置。它尚未保存!</strong>",
"userjspreview": "<strong>请记住您现在只是在测试/预览您的用户JavaScript。它尚未保存!</strong>",
"sitecsspreview": "<strong>请记住您现在只是在预览该CSS。它尚未保存!</strong>",
+ "sitejsonpreview": "<strong>请记住您现在只是在预览该JSON配置。它尚未保存!</strong>",
"sitejspreview": "<strong>请记住您现在只是在预览该JavaScript代码。它尚未保存!</strong>",
- "userinvalidconfigtitle": "<strong>警告:</strong>不存在皮肤“$1”。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
+ "userinvalidconfigtitle": "<strong>警告:</strong>不存在皮肤“$1”。自定义的.css、.json和.js页面应使用小写标题,例如,{{ns:user}}:Foo/vector.css而不是{{ns:user}}:Foo/Vector.css。",
"updated": "(已更新)",
"note": "<strong>注意:</strong>",
"previewnote": "<strong>请记住这只是预览。</strong>您的更改尚未保存!",
"default": "默认",
"prefs-files": "文件",
"prefs-custom-css": "自定义CSS",
+ "prefs-custom-json": "自定义JSON",
"prefs-custom-js": "自定义JavaScript",
- "prefs-common-config": "所有皮肤共用的CSS/JavaScript:",
+ "prefs-common-config": "所有皮肤共用的CSS/JSON/JavaScript:",
"prefs-reset-intro": "可以通过本页面将系统设置重置为网站默认值。该操作无法撤销。",
"prefs-emailconfirm-label": "电子邮件确认:",
"youremail": "电子邮件:",
"right-editcontentmodel": "编辑页面的内容模型",
"right-editinterface": "编辑用户界面",
"right-editusercss": "编辑其他用户的CSS文件",
+ "right-edituserjson": "编辑其他用户的JSON文件",
"right-edituserjs": "编辑其他用户的JavaScript文件",
"right-editmyusercss": "编辑您的用户CSS文件",
+ "right-editmyuserjson": "编辑您的用户JSON文件",
"right-editmyuserjs": "编辑您的用户JavaScript文件",
"right-viewmywatchlist": "查看您的监视列表",
"right-editmywatchlist": "编辑您的监视列表。请留意即使缺少此权限,某些操作仍将添加页面至监视列表。",
"grant-createaccount": "创建账户",
"grant-createeditmovepage": "创建、编辑和移动页面",
"grant-delete": "删除页面、修订和日志记录",
- "grant-editinterface": "编辑MediaWiki名字空间和用户CSS/JavaScript",
- "grant-editmycssjs": "编辑您的用户CSS/JavaScript",
+ "grant-editinterface": "编辑MediaWiki名字空间和用户CSS/JSON/JavaScript",
+ "grant-editmycssjs": "编辑您的用户CSS/JSON/JavaScript",
"grant-editmyoptions": "编辑您的用户参数设置",
"grant-editmywatchlist": "编辑您的监视列表",
"grant-editpage": "编辑存在的页面",
"group-bot.css": "/* 这里放置的CSS将只影响机器人 */",
"group-sysop.css": "/* 这里放置的CSS将只影响管理员 */",
"group-bureaucrat.css": "/* 这里放置的CSS将只影响行政员 */",
+ "common.json": "/* 这里的任何JSON将为所有用户在每次页面载入时加载。 */",
"common.js": "/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */",
"group-autoconfirmed.js": "/* 这里的任何JavaScript将只为自动确认用户加载 */",
"group-user.js": "/* 这里的任何JavaScript将只为注册用户加载 */",
"unlinkaccounts-success": "账户已取消链接。",
"authenticationdatachange-ignored": "身份验证数据更改未处理。也许没有配置的提供者?",
"userjsispublic": "请注意:JavaScript子页面不应包含机密数据,因为它们可以被其他用户查看。",
+ "userjsonispublic": "请注意:JSON子页面不应包含保密数据,因为它们可被其他用户看到。",
"usercssispublic": "请注意:CSS子页面不应包含机密数据,因为它们可以被其他用户查看。",
"restrictionsfield-badip": "无效的IP地址或段:$1",
"restrictionsfield-label": "允许的IP段:",
"蘭斯特",
"机智的小鱼君",
"Wbxshiori",
- "Laundry Machine"
+ "Laundry Machine",
+ "和平至上"
]
},
"tog-underline": "底線標示連結:",
"permissionserrors": "權限錯誤",
"permissionserrorstext": "由於下列{{PLURAL:$1|原因}},您沒有權限進行目前的動作:",
"permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
- "contentmodelediterror": "您無法編輯此修訂,因此修訂使用的內容模型為 <code>$1</code> 與目前使用的頁面內容模型 <code>$2</code> 不同。",
+ "contentmodelediterror": "您無法編輯此修訂,因為它的內容模型為<code>$1</code>,與目前使用的頁面內容模型<code>$2</code>不同。",
"recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
"moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除、保護和移動日誌以便參考。",
"moveddeleted-notice-recent": "對不起,此頁面剛剛被刪除(在最近24小時內)。頁面的刪除、保護和移動日誌在下方提供以供參考。",
"feedback-terms": "我了解我的使用者代理資訊包含完整的瀏覽器與作業系統版本資訊,且該資訊將會與意見回饋一同公開共享。",
"feedback-termsofuse": "我同意依照使用條款提供意見回饋。",
"feedback-thanks": "感謝!您的意見回饋已發佈到頁面 \"[$2 $1]\"。",
- "feedback-thanks-title": "感謝您!",
+ "feedback-thanks-title": "感謝您!",
"feedback-useragent": "使用者代理:",
"searchsuggest-search": "搜尋 {{SITENAME}}",
"searchsuggest-containing": "包含...",
NS_TALK => 'Razgovor',
NS_USER => 'Korisnik',
NS_USER_TALK => 'Razgovor_s_korisnikom',
- NS_PROJECT_TALK => 'Razgovor_{{grammar:instrumental|$1}}',
+ NS_PROJECT_TALK => 'Razgovor_o_{{grammar:lokativ|$1}}',
NS_FILE => 'Datoteka',
NS_FILE_TALK => 'Razgovor_o_datoteci',
NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_razgovor',
+ NS_MEDIAWIKI_TALK => 'Razgovor_o_MediaWikiju',
NS_TEMPLATE => 'Šablon',
NS_TEMPLATE_TALK => 'Razgovor_o_šablonu',
NS_HELP => 'Pomoć',
'Razgovor_o_datoteci' => NS_FILE_TALK,
'MedijaViki' => NS_MEDIAWIKI,
'Razgovor_o_MedijaVikiju' => NS_MEDIAWIKI_TALK,
+ 'MediaWiki_razgovor' => NS_MEDIAWIKI_TALK,
+ 'Razgovor_{{grammar:instrumental|$1}}' => NS_PROJECT_TALK,
];
$specialPageAliases = [
'AllMyUploads' => [ 'כל_ההעלאות_שלי' ],
'Allpages' => [ 'כל_הדפים' ],
'ApiHelp' => [ 'עזרת_API' ],
+ 'ApiSandbox' => [ 'ארגז_חול_של_API' ],
'Ancientpages' => [ 'דפים_מוזנחים' ],
'Badtitle' => [ 'כותרת_שגויה' ],
'Blankpage' => [ 'דף_ריק' ],
--- /dev/null
+-- T182678: Make ar_rev_id not nullable
+ALTER TABLE /*_*/archive
+ CHANGE COLUMN ar_rev_id ar_rev_id int unsigned NOT NULL;
--- /dev/null
+--
+-- patch-image-img_description_id.sql
+--
+-- T188132. Add `img_description_id` to the `image` table.
+
+ALTER TABLE /*_*/image
+ ADD COLUMN img_description_id bigint unsigned NOT NULL DEFAULT 0 AFTER img_description;
--- /dev/null
+ALTER TABLE /*_*/site_stats
+ ALTER ss_total_edits SET DEFAULT NULL,
+ ALTER ss_good_articles SET DEFAULT NULL,
+ MODIFY COLUMN ss_total_pages bigint unsigned DEFAULT NULL,
+ MODIFY COLUMN ss_users bigint unsigned DEFAULT NULL,
+ MODIFY COLUMN ss_active_users bigint unsigned DEFAULT NULL,
+ MODIFY COLUMN ss_images bigint unsigned DEFAULT NULL;
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Remove autopatrol logs in the logging table.
+ *
+ * @ingroup Maintenance
+ */
+class DeleteAutoPatrolLogs extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Remove autopatrol logs in the logging table' );
+ $this->addOption( 'dry-run', 'Print debug info instead of actually deleting' );
+ $this->addOption(
+ 'check-old',
+ 'Check old patrol logs (for deleting old format autopatrols).' .
+ 'Note that this will not delete rows older than 2011 (MediaWiki 1.18).'
+ );
+ $this->addOption(
+ 'before',
+ 'Timestamp to delete only before that time, all MediaWiki timestamp formats are accepted',
+ false,
+ true
+ );
+ $this->addOption(
+ 'from-id',
+ 'First row (log id) to start updating from',
+ false,
+ true
+ );
+ $this->addOption(
+ 'sleep',
+ 'Sleep time (in seconds) between every batch',
+ false,
+ true
+ );
+ $this->setBatchSize( 1000 );
+ }
+
+ public function execute() {
+ $this->setBatchSize( $this->getOption( 'batch-size', $this->getBatchSize() ) );
+
+ $sleep = (int)$this->getOption( 'sleep', 10 );
+ $fromId = $this->getOption( 'from-id', null );
+ $this->countDown( 5 );
+ while ( true ) {
+ if ( $this->hasOption( 'check-old' ) ) {
+ $rowsData = $this->getRowsOld( $fromId );
+ // We reached end of the table
+ if ( !$rowsData ) {
+ break;
+ }
+ $rows = $rowsData['rows'];
+ $fromId = $rowsData['lastId'];
+
+ // There is nothing to delete in this batch
+ if ( !$rows ) {
+ continue;
+ }
+ } else {
+ $rows = $this->getRows( $fromId );
+ if ( !$rows ) {
+ break;
+ }
+ $fromId = end( $rows );
+ }
+
+ if ( $this->hasOption( 'dry-run' ) ) {
+ $this->output( 'These rows will get deleted: ' . implode( ', ', $rows ) . "\n" );
+ } else {
+ $this->deleteRows( $rows );
+ $this->output( 'Processed up to row id ' . end( $rows ) . "\n" );
+ }
+
+ if ( $sleep > 0 ) {
+ sleep( $sleep );
+ }
+ }
+ }
+
+ private function getRows( $fromId ) {
+ $dbr = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection(
+ DB_REPLICA
+ );
+ $before = $this->getOption( 'before', false );
+
+ $conds = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ ];
+
+ if ( $fromId ) {
+ $conds[] = 'log_id > ' . $dbr->addQuotes( $fromId );
+ }
+
+ if ( $before ) {
+ $conds[] = 'log_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $before ) );
+ }
+
+ return $dbr->selectFieldValues(
+ 'logging',
+ 'log_id',
+ $conds,
+ __METHOD__,
+ [ 'LIMIT' => $this->getBatchSize() ]
+ );
+ }
+
+ private function getRowsOld( $fromId ) {
+ $dbr = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection(
+ DB_REPLICA
+ );
+ $batchSize = $this->getBatchSize();
+ $before = $this->getOption( 'before', false );
+
+ $conds = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ ];
+
+ if ( $fromId ) {
+ $conds[] = 'log_id > ' . $dbr->addQuotes( $fromId );
+ }
+
+ if ( $before ) {
+ $conds[] = 'log_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $before ) );
+ }
+
+ $result = $dbr->select(
+ 'logging',
+ [ 'log_id', 'log_params' ],
+ $conds,
+ __METHOD__,
+ [ 'LIMIT' => $batchSize ]
+ );
+
+ $last = null;
+ $autopatrolls = [];
+ foreach ( $result as $row ) {
+ $last = $row->log_id;
+ Wikimedia\suppressWarnings();
+ $params = unserialize( $row->log_params );
+ Wikimedia\restoreWarnings();
+
+ // Skipping really old rows, before 2011
+ if ( !is_array( $params ) || !array_key_exists( '6::auto', $params ) ) {
+ continue;
+ }
+
+ $auto = $params['6::auto'];
+ if ( $auto ) {
+ $autopatrolls[] = $row->log_id;
+ }
+ }
+
+ if ( $last === null ) {
+ return null;
+ }
+
+ return [ 'rows' => $autopatrolls, 'lastId' => $last ];
+ }
+
+ private function deleteRows( array $rows ) {
+ $dbw = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer()->getConnection(
+ DB_MASTER
+ );
+
+ $dbw->delete(
+ 'logging',
+ [ 'log_id' => $rows ],
+ __METHOD__
+ );
+
+ MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->waitForReplication();
+ }
+
+}
+
+$maintClass = DeleteAutoPatrolLogs::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
}
$ext = pathinfo( $file, PATHINFO_EXTENSION );
if ( $ext == 'php' || $ext == 'php5' ) {
- # Execute php files
- # We use require and return true here because when you return false
- # the php webserver will discard post data and things like login
- # will not function in the dev environment.
- require $file;
-
- return true;
+ return false;
}
$mime = false;
// Borrow mime type file from MimeAnalyzer
ismodsince
ismulti
isnew
-ispermalink
isroot
isself
isset
*
* @since 1.25
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Daniel Kinzler
*/
class ExportSites extends Maintenance {
require_once __DIR__ . '/Maintenance.php';
/**
- * Maintenance script that migrates archive.ar_text and ar_flags to modern storage
+ * Maintenance script that migrates archive.ar_text and ar_flags to text storage
*
* @ingroup Maintenance
* @since 1.31
public function __construct() {
parent::__construct();
$this->addDescription(
- 'Migrates comments from pre-1.5 ar_text and ar_flags columns to modern storage'
+ 'Migrates content from pre-1.5 ar_text and ar_flags columns to text storage'
);
$this->addOption(
'replace-missing',
--- /dev/null
+ALTER TABLE /*_*/archive ALTER COLUMN ar_rev_id INT NOT NULL;
--- /dev/null
+--
+-- patch-image-img_description_id.sql
+--
+-- T188132. Add `img_description_id` to the `image` table.
+
+ALTER TABLE /*_*/image ADD img_description_id bigint NOT NULL CONSTRAINT DF_img_description_id DEFAULT 0 CONSTRAINT FK_img_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id);
--- /dev/null
+DECLARE @cname sysname;--
+
+SELECT @cname = dc.name
+FROM sys.default_constraints dc
+JOIN sys.columns c
+ ON c.object_id = dc.parent_object_id
+ AND c.column_id = dc.parent_column_id
+WHERE
+ c.name = 'rc_patrolled'
+ AND c.object_id = OBJECT_ID('/*_*/recentchanges', 'U');--
+
+IF @cname IS NOT NULL
+BEGIN;--
+ DECLARE @sql nvarchar(max);--
+ SET @sql = N'ALTER TABLE /*_*/recentchanges DROP CONSTRAINT ' + @cname;--
+ EXEC sp_executesql @sql;--
+END;--
+
+DROP INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges;--
+ALTER TABLE /*_*/recentchanges ALTER COLUMN rc_patrolled tinyint NOT NULL;--
+ALTER TABLE /*_*/recentchanges ADD CONSTRAINT DF_rc_patrolled DEFAULT 0 FOR rc_patrolled;--
+CREATE INDEX /*i*/rc_name_type_patrolled_timestamp ON /*_*/recentchanges (rc_namespace, rc_type, rc_patrolled, rc_timestamp);
\ No newline at end of file
--- /dev/null
+/* Delete old default constraints */
+DECLARE @sql nvarchar(max)
+SET @sql=''
+
+/* IMHO: A DBMS where you have to do THIS to change a default value sucks. */
+SELECT @sql= @sql + 'ALTER TABLE site_stats DROP CONSTRAINT ' + df.name + '; '
+FROM sys.default_constraints df
+JOIN sys.columns c
+ ON c.object_id = df.parent_object_id
+ AND c.column_id = df.parent_column_id
+WHERE
+ df.parent_object_id = OBJECT_ID('site_stats');--
+
+EXEC sp_executesql @sql;
+
+/* Change data type of ss_images from int to bigint.
+ * All other fields (except ss_row_id) already are bigint.
+ * This MUST happen before adding new constraints. */
+ALTER TABLE site_stats ALTER COLUMN ss_images bigint;
+
+/* Add new default constraints.
+ * Don't ask me why I have to repeat ALTER TABLE site_stats
+ * instead of using commas, for some reason SQL Server 2016
+ * didn't accept it in any other way. Maybe I just don't know
+ * enough about mssql, but this works.
+ */
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_total_edits DEFAULT NULL FOR ss_total_edits;
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_good_article DEFAULT NULL FOR ss_good_articles;
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_total_pages DEFAULT NULL FOR ss_total_pages;
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_users DEFAULT NULL FOR ss_users;
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_active_users DEFAULT NULL FOR ss_active_users;
+ALTER TABLE site_stats ADD CONSTRAINT col_ss_images DEFAULT NULL FOR ss_images;
ar_timestamp varchar(14) NOT NULL default '',
ar_minor_edit BIT NOT NULL DEFAULT 0,
ar_flags NVARCHAR(255) NOT NULL,
- ar_rev_id INT NULL, -- NOT a FK, the row gets deleted from revision and moved here
+ ar_rev_id INT NOT NULL, -- NOT a FK, the row gets deleted from revision and moved here
ar_text_id INT CONSTRAINT ar_text_id__old_id__fk FOREIGN KEY REFERENCES /*_*/text(old_id) ON DELETE CASCADE,
ar_deleted TINYINT NOT NULL DEFAULT 0,
ar_len INT,
ss_row_id int NOT NULL CONSTRAINT /*i*/ss_row_id PRIMARY KEY,
-- Total number of edits performed.
- ss_total_edits bigint default 0,
+ ss_total_edits bigint default NULL,
- -- An approximate count of pages matching the following criteria:
- -- * in namespace 0
- -- * not a redirect
- -- * contains the text '[['
- -- See Article::isCountable() in includes/Article.php
- ss_good_articles bigint default 0,
+ -- See SiteStatsInit::articles().
+ ss_good_articles bigint default NULL,
- -- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
- ss_total_pages bigint default '-1',
+ -- Total pages, theoretically equal to SELECT COUNT(*) FROM page.
+ ss_total_pages bigint default NULL,
- -- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
- ss_users bigint default '-1',
+ -- Number of users, theoretically equal to SELECT COUNT(*) FROM user.
+ ss_users bigint default NULL,
- -- Number of users that still edit
- ss_active_users bigint default '-1',
+ -- Number of users that still edit.
+ ss_active_users bigint default NULL,
- -- Number of images, equivalent to SELECT COUNT(*) FROM image
- ss_images int default 0
+ -- Number of images, equivalent to SELECT COUNT(*) FROM image.
+ ss_images bigint default NULL
);
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
img_description nvarchar(255) NOT NULL CONSTRAINT DF_img_description DEFAULT '',
+ img_description_id bigint NOT NULL CONSTRAINT DF_img_description_id DEFAULT 0 CONSTRAINT FK_img_description_id FOREIGN KEY REFERENCES /*_*/comment(comment_id),
-- user_id and user_name of uploader.
img_user int REFERENCES /*_*/mwuser(user_id) ON DELETE SET NULL,
-- If the Recent Changes Patrol option is enabled,
-- users may mark edits as having been reviewed to
-- remove a warning flag on the RC list.
- -- A value of 1 indicates the page has been reviewed.
- rc_patrolled bit NOT NULL default 0,
+ -- A value of 1 indicates the page has been reviewed manually.
+ -- A value of 2 indicates the page has been automatically reviewed.
+ rc_patrolled tinyint NOT NULL CONSTRAINT DF_rc_patrolled DEFAULT 0
-- Recorded IP address the edit was made from, if the
-- $wgPutIPinRC option is enabled.
--- /dev/null
+-- T182678: Make ar_rev_id not nullable
+
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive MODIFY ar_rev_id NUMBER NOT NULL;
--- /dev/null
+--
+-- patch-image-img_description_id.sql
+--
+-- T188132. Add `img_description_id` to the `image` table.
+
+ALTER TABLE &mw_prefix.image ADD ( img_description_id NUMBER DEFAULT 0 NOT NULL );
+ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.oldimage_fk2 FOREIGN KEY (img_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
--- /dev/null
+ALTER TABLE /*_*/site_stats
+ ALTER ss_total_edits SET DEFAULT NULL,
+ ALTER ss_good_articles SET DEFAULT NULL,
+ ALTER ss_total_pages SET DEFAULT NULL,
+ ALTER ss_users SET DEFAULT NULL,
+ ALTER ss_active_users SET DEFAULT NULL,
+ ALTER ss_images SET DEFAULT NULL;
ar_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL,
ar_minor_edit CHAR(1) DEFAULT '0' NOT NULL,
ar_flags VARCHAR2(255),
- ar_rev_id NUMBER,
+ ar_rev_id NUMBER NOT NULL,
ar_text_id NUMBER,
ar_deleted CHAR(1) DEFAULT '0' NOT NULL,
ar_len NUMBER,
CREATE TABLE &mw_prefix.site_stats (
ss_row_id NUMBER NOT NULL PRIMARY KEY,
- ss_total_edits NUMBER DEFAULT 0,
- ss_good_articles NUMBER DEFAULT 0,
- ss_total_pages NUMBER DEFAULT -1,
- ss_users NUMBER DEFAULT -1,
- ss_active_users NUMBER DEFAULT -1,
- ss_images NUMBER DEFAULT 0
+ ss_total_edits NUMBER DEFAULT NULL,
+ ss_good_articles NUMBER DEFAULT NULL,
+ ss_total_pages NUMBER DEFAULT NULL,
+ ss_users NUMBER DEFAULT NULL,
+ ss_active_users NUMBER DEFAULT NULL,
+ ss_images NUMBER DEFAULT NULL
);
CREATE SEQUENCE ipblocks_ipb_id_seq;
img_major_mime VARCHAR2(32) DEFAULT 'unknown',
img_minor_mime VARCHAR2(100) DEFAULT 'unknown',
img_description VARCHAR2(255),
+ img_description_id NUMBER DEFAULT 0 NOT NULL,
img_user NUMBER DEFAULT 0 NOT NULL,
img_user_text VARCHAR2(255) NULL,
img_actor NUMBER DEFAULT 0 NOT NULL,
);
ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_pk PRIMARY KEY (img_name);
ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk1 FOREIGN KEY (img_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE &mw_prefix.image ADD CONSTRAINT &mw_prefix.image_fk2 FOREIGN KEY (img_description_id) REFERENCES &mw_prefix."COMMENT"(comment_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.image_i01 ON &mw_prefix.image (img_user_text,img_timestamp);
CREATE INDEX &mw_prefix.image_i02 ON &mw_prefix.image (img_size);
CREATE INDEX &mw_prefix.image_i03 ON &mw_prefix.image (img_timestamp);
--- /dev/null
+<?php
+/**
+ * Populate ar_rev_id in pre-1.5 rows
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use Wikimedia\Rdbms\IDatabase;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that populares archive.ar_rev_id in old rows
+ *
+ * @ingroup Maintenance
+ * @since 1.31
+ */
+class PopulateArchiveRevId extends LoggedUpdateMaintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Populate ar_rev_id in pre-1.5 rows' );
+ $this->setBatchSize( 100 );
+ }
+
+ protected function getUpdateKey() {
+ return __CLASS__;
+ }
+
+ protected function doDBUpdates() {
+ $this->output( "Populating ar_rev_id...\n" );
+ $dbw = $this->getDB( DB_MASTER );
+
+ // Quick exit if there are no rows needing updates.
+ $any = $dbw->selectField(
+ 'archive',
+ 'ar_id',
+ [ 'ar_rev_id' => null ],
+ __METHOD__
+ );
+ if ( !$any ) {
+ $this->output( "Completed ar_rev_id population, 0 rows updated.\n" );
+ return true;
+ }
+
+ $rev = $this->makeDummyRevisionRow( $dbw );
+ $count = 0;
+ while ( true ) {
+ wfWaitForSlaves();
+
+ $arIds = $dbw->selectFieldValues(
+ 'archive',
+ 'ar_id',
+ [ 'ar_rev_id' => null ],
+ __METHOD__,
+ [ 'LIMIT' => $this->getBatchSize(), 'ORDER BY' => [ 'ar_id' ] ]
+ );
+ if ( !$arIds ) {
+ $this->output( "Completed ar_rev_id population, $count rows updated.\n" );
+ return true;
+ }
+
+ try {
+ $updates = $dbw->doAtomicSection( __METHOD__, function ( $dbw, $fname ) use ( $arIds, $rev ) {
+ // Create new rev_ids by inserting dummy rows into revision and then deleting them.
+ $dbw->insert( 'revision', array_fill( 0, count( $arIds ), $rev ), $fname );
+ $revIds = $dbw->selectFieldValues(
+ 'revision',
+ 'rev_id',
+ [ 'rev_timestamp' => $rev['rev_timestamp'] ],
+ $fname
+ );
+ if ( !is_array( $revIds ) ) {
+ throw new UnexpectedValueException( 'Failed to insert dummy revisions' );
+ }
+ if ( count( $revIds ) !== count( $arIds ) ) {
+ throw new UnexpectedValueException(
+ 'Tried to insert ' . count( $arIds ) . ' dummy revisions, but found '
+ . count( $revIds ) . ' matching rows.'
+ );
+ }
+ $dbw->delete( 'revision', [ 'rev_id' => $revIds ], $fname );
+
+ return array_combine( $arIds, $revIds );
+ } );
+ } catch ( UnexpectedValueException $ex ) {
+ $this->fatalError( $ex->getMessage() );
+ }
+
+ foreach ( $updates as $arId => $revId ) {
+ $dbw->update(
+ 'archive',
+ [ 'ar_rev_id' => $revId ],
+ [ 'ar_id' => $arId, 'ar_rev_id' => null ],
+ __METHOD__
+ );
+ $count += $dbw->affectedRows();
+ }
+
+ $min = min( array_keys( $updates ) );
+ $max = max( array_keys( $updates ) );
+ $this->output( " ... $min-$max\n" );
+ }
+ }
+
+ /**
+ * Construct a dummy revision table row to use for reserving IDs
+ *
+ * The row will have a wildly unlikely timestamp, and possibly a generic
+ * user and comment, but will otherwise be derived from a revision on the
+ * wiki's main page.
+ *
+ * @param IDatabase $dbw
+ * @return array
+ */
+ private function makeDummyRevisionRow( IDatabase $dbw ) {
+ $ts = $dbw->timestamp( '11111111111111' );
+ $mainPage = Title::newMainPage();
+ if ( !$mainPage ) {
+ $this->fatalError( 'Main page does not exist' );
+ }
+ $pageId = $mainPage->getArticleId();
+ if ( !$pageId ) {
+ $this->fatalError( $mainPage->getPrefixedText() . ' has no ID' );
+ }
+ $rev = $dbw->selectRow(
+ 'revision',
+ '*',
+ [ 'rev_page' => $pageId ],
+ __METHOD__,
+ [ 'ORDER BY' => 'rev_timestamp ASC' ]
+ );
+ if ( !$rev ) {
+ $this->fatalError( $mainPage->getPrefixedText() . ' has no revisions' );
+ }
+ unset( $rev->rev_id );
+ $rev = (array)$rev;
+ $rev['rev_timestamp'] = $ts;
+ if ( isset( $rev['rev_user'] ) ) {
+ $rev['rev_user'] = 0;
+ $rev['rev_user_text'] = '0.0.0.0';
+ }
+ if ( isset( $rev['rev_comment'] ) ) {
+ $rev['rev_comment'] = 'Dummy row';
+ }
+
+ $any = $dbw->selectField(
+ 'revision',
+ 'rev_id',
+ [ 'rev_timestamp' => $ts ],
+ __METHOD__
+ );
+ if ( $any ) {
+ $this->fatalError( "... Why does your database contain a revision dated $ts?" );
+ }
+
+ return $rev;
+ }
+}
+
+$maintClass = "PopulateArchiveRevId";
+require_once RUN_MAINTENANCE_IF_MAIN;
--- /dev/null
+-- T182678: Make ar_rev_id not nullable
+ALTER TABLE archive
+ ALTER COLUMN ar_rev_id SET NOT NULL;
--- /dev/null
+ALTER TABLE /*_*/site_stats
+ ALTER ss_total_edits SET DEFAULT NULL,
+ ALTER ss_good_articles SET DEFAULT NULL,
+ ALTER ss_total_pages SET DEFAULT NULL,
+ ALTER ss_users SET DEFAULT NULL,
+ ALTER ss_active_users SET DEFAULT NULL,
+ ALTER ss_images SET DEFAULT NULL;
ar_timestamp TIMESTAMPTZ NOT NULL,
ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
ar_flags TEXT,
- ar_rev_id INTEGER,
+ ar_rev_id INTEGER NOT NULL,
ar_text_id INTEGER,
ar_deleted SMALLINT NOT NULL DEFAULT 0,
ar_len INTEGER NULL,
CREATE TABLE site_stats (
ss_row_id INTEGER NOT NULL PRIMARY KEY DEFAULT 0,
- ss_total_edits INTEGER DEFAULT 0,
- ss_good_articles INTEGER DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
+ ss_total_edits INTEGER DEFAULT NULL,
+ ss_good_articles INTEGER DEFAULT NULL,
+ ss_total_pages INTEGER DEFAULT NULL,
+ ss_users INTEGER DEFAULT NULL,
+ ss_active_users INTEGER DEFAULT NULL,
+ ss_admins INTEGER DEFAULT NULL,
+ ss_images INTEGER DEFAULT NULL
);
img_major_mime TEXT DEFAULT 'unknown',
img_minor_mime TEXT DEFAULT 'unknown',
img_description TEXT NOT NULL DEFAULT '',
+ img_description_id INTEGER NOT NULL DEFAULT 0,
img_user INTEGER NOT NULL DEFAULT 0 REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
img_user_text TEXT NOT NULL DEFAULT '',
img_actor INTEGER NOT NULL DEFAULT 0,
* @file
* @ingroup Maintenance
* @author Rob Church <robchur@gmail.com>
- * @licence GNU General Public Licence 2.0 or later
+ * @license GNU General Public Licence 2.0 or later
*/
use Wikimedia\Rdbms\IDatabase;
# WikimediaUI LESS variables for sharing
cp ./node_modules/oojs-ui/dist/wikimedia-ui-base.less "$REPO_DIR/$TARGET_DIR"
+# Misc stuff
+cp ./node_modules/oojs-ui/dist/AUTHORS.txt "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/History.md "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/LICENSE-MIT "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/README.md "$REPO_DIR/$TARGET_DIR"
+
# Clean up temporary area
rm -rf "$NPM_DIR"
img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
img_minor_mime varbinary(100) NOT NULL default "unknown",
img_description varbinary(767) NOT NULL default '',
+ img_description_id bigint unsigned NOT NULL DEFAULT 0,
img_user int unsigned NOT NULL default 0,
img_user_text varchar(255) binary NOT NULL DEFAULT '',
img_actor bigint unsigned NOT NULL DEFAULT 0,
INSERT OR IGNORE INTO /*_*/image_tmp (
img_name, img_size, img_width, img_height, img_metadata, img_bits,
- img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
- img_user_text, img_timestamp, img_sha1)
+ img_media_type, img_major_mime, img_minor_mime, img_description,
+ img_description_id, img_user, img_user_text, img_timestamp, img_sha1)
SELECT
img_name, img_size, img_width, img_height, img_metadata, img_bits,
- img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
- img_user_text, img_timestamp, img_sha1
+ img_media_type, img_major_mime, img_minor_mime, img_description,
+ img_description_id, img_user, img_user_text, img_timestamp, img_sha1
FROM /*_*/image;
DROP TABLE /*_*/image;
--- /dev/null
+-- T182678: Make ar_rev_id not nullable
+
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+CREATE TABLE /*_*/archive_tmp (
+ ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ ar_namespace int NOT NULL default 0,
+ ar_title varchar(255) binary NOT NULL default '',
+ ar_text mediumblob NOT NULL,
+ ar_comment varbinary(767) NOT NULL default '',
+ ar_comment_id bigint unsigned NOT NULL DEFAULT 0,
+ ar_user int unsigned NOT NULL default 0,
+ ar_user_text varchar(255) binary NOT NULL DEFAULT '',
+ ar_actor bigint unsigned NOT NULL DEFAULT 0,
+ ar_timestamp binary(14) NOT NULL default '',
+ ar_minor_edit tinyint NOT NULL default 0,
+ ar_flags tinyblob NOT NULL,
+ ar_rev_id int unsigned NOT NULL,
+ ar_text_id int unsigned,
+ ar_deleted tinyint unsigned NOT NULL default 0,
+ ar_len int unsigned,
+ ar_page_id int unsigned,
+ ar_parent_id int unsigned default NULL,
+ ar_sha1 varbinary(32) NOT NULL default '',
+ ar_content_model varbinary(32) DEFAULT NULL,
+ ar_content_format varbinary(64) DEFAULT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+ ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_comment_id, ar_user,
+ ar_user_text, ar_actor, ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id,
+ ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id, ar_sha1,
+ ar_content_model, ar_content_format)
+ SELECT
+ ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_comment_id, ar_user,
+ ar_user_text, ar_actor, ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id,
+ ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id, ar_sha1,
+ ar_content_model, ar_content_format
+ FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+
+COMMIT;
--- /dev/null
+--
+-- patch-image-img_description_id.sql
+--
+-- T188132. Add `img_description_id` to the `image` table.
+
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/image_tmp;
+CREATE TABLE /*_*/image_tmp (
+ img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
+ img_size int unsigned NOT NULL default 0,
+ img_width int NOT NULL default 0,
+ img_height int NOT NULL default 0,
+ img_metadata mediumblob NOT NULL,
+ img_bits int NOT NULL default 0,
+ img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+ img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+ img_minor_mime varbinary(100) NOT NULL default "unknown",
+ img_description varbinary(767) NOT NULL default '',
+ img_description_id bigint unsigned NOT NULL DEFAULT 0,
+ img_user int unsigned NOT NULL default 0,
+ img_user_text varchar(255) binary NOT NULL default '',
+ img_timestamp varbinary(14) NOT NULL default '',
+ img_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+
+INSERT OR IGNORE INTO /*_*/image_tmp (
+ img_name, img_size, img_width, img_height, img_metadata, img_bits,
+ img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
+ img_user_text, img_timestamp, img_sha1)
+ SELECT
+ img_name, img_size, img_width, img_height, img_metadata, img_bits,
+ img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
+ img_user_text, img_timestamp, img_sha1
+ FROM /*_*/image;
+
+DROP TABLE /*_*/image;
+ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+
+COMMIT;
--- /dev/null
+DROP TABLE IF EXISTS /*_*/site_stats_tmp;
+
+-- Create the temporary table. The following part
+-- is copied & pasted from the changed tables.sql
+-- file besides having an other table name.
+CREATE TABLE /*_*/site_stats_tmp (
+ ss_row_id int unsigned NOT NULL PRIMARY KEY,
+ ss_total_edits bigint unsigned default NULL,
+ ss_good_articles bigint unsigned default NULL,
+ ss_total_pages bigint unsigned default NULL,
+ ss_users bigint unsigned default NULL,
+ ss_active_users bigint unsigned default NULL,
+ ss_images bigint unsigned default NULL
+) /*$wgDBTableOptions*/;
+
+-- Move the data from the old to the new table
+INSERT OR IGNORE INTO /*_*/site_stats_tmp (
+ ss_row_id,
+ ss_total_edits,
+ ss_good_articles,
+ ss_total_pages,
+ ss_active_users,
+ ss_images
+) SELECT
+ ss_row_id,
+ ss_total_edits,
+ ss_good_articles,
+ ss_total_pages,
+ ss_active_users,
+ ss_images
+FROM /*_*/site_stats;
+
+DROP TABLE /*_*/site_stats;
+
+ALTER TABLE /*_*/site_stats_tmp RENAME TO /*_*/site_stats;
-- It's possible for multiple revisions to use the same text,
-- for instance revisions where only metadata is altered
-- or a rollback to a previous version.
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = rev_id
+ -- exist, this field should be ignored (and may be 0) in favor of the
+ -- corresponding data from the slots and content tables
rev_text_id int unsigned NOT NULL default 0,
-- Text comment summarizing the change. Deprecated in favor of
rev_sha1 varbinary(32) NOT NULL default '',
-- content model, see CONTENT_MODEL_XXX constants
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = rev_id
+ -- exist, this field should be ignored (and may be NULL) in favor of the
+ -- corresponding data from the slots and content tables
rev_content_model varbinary(32) DEFAULT NULL,
-- content format, see CONTENT_FORMAT_XXX constants
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = rev_id
+ -- exist, this field should be ignored (and may be NULL).
rev_content_format varbinary(64) DEFAULT NULL
) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
--
--- Holding area for deleted articles, which may be viewed
--- or restored by admins through the Special:Undelete interface.
--- The fields generally correspond to the page, revision, and text
--- fields, with several caveats.
+-- Archive area for deleted pages and their revisions.
+-- These may be viewed (and restored) by admins through the Special:Undelete interface.
--
CREATE TABLE /*_*/archive (
-- Primary key
ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+ -- Copied from page_namespace
ar_namespace int NOT NULL default 0,
+ -- Copied from page_title
ar_title varchar(255) binary NOT NULL default '',
- -- Newly deleted pages will not store text in this table,
- -- but will reference the separately existing text rows.
- -- This field is retained for backwards compatibility,
- -- so old archived pages will remain accessible after
- -- upgrading from 1.4 to 1.5.
- -- Text may be gzipped or otherwise funky.
+ -- Copied from text.old_text, for pages deleted before MediaWiki 1.5.
+ -- This row may contain the raw revision text, possibly compressed.
+ -- Newer MediaWiki versions use ar_text_id instead.
+ -- This field is retained for backwards compatibility, so that
+ -- old archived pages will remain accessible.
+ -- See migrateArchiveText.php for migrating values to text storage.
ar_text mediumblob NOT NULL,
-- Basic revision stuff...
ar_timestamp binary(14) NOT NULL default '',
ar_minor_edit tinyint NOT NULL default 0,
- -- See ar_text note.
+ -- Copied from text.old_flags, for pages deleted before MediaWiki 1.5.
+ -- Otherwise empty string.
+ -- See also note for ar_text.
ar_flags tinyblob NOT NULL,
- -- When revisions are deleted, their unique rev_id is stored
- -- here so it can be retained after undeletion. This is necessary
- -- to retain permalinks to given revisions after accidental delete
- -- cycles or messy operations like history merges.
+ -- Copied from rev_id.
--
- -- Old entries from 1.4 will be NULL here, and a new rev_id will
- -- be created on undeletion for those revisions.
- ar_rev_id int unsigned,
-
- -- For newly deleted revisions, this is the text.old_id key to the
- -- actual stored text. To avoid breaking the block-compression scheme
- -- and otherwise making storage changes harder, the actual text is
- -- *not* deleted from the text table, merely hidden by removal of the
- -- page and revision entries.
+ -- @since 1.5 Entries from 1.4 will be NULL here. When restoring
+ -- archive rows from before 1.5, a new rev_id is created.
+ ar_rev_id int unsigned NOT NULL,
+
+ -- Copied from rev_text_id, references text.old_id.
+ -- To avoid breaking the block-compression scheme and otherwise making
+ -- storage changes harder, the actual text is *not* deleted from the
+ -- text storage. Instead, it is merely hidden from public view, by removal
+ -- of the page and revision entries.
--
- -- Old entries deleted under 1.2-1.4 will have NULL here, and their
- -- ar_text and ar_flags fields will be used to create a new text
- -- row upon undeletion.
+ -- @since 1.5 Entries from 1.2-1.4 will have NULL here. When restoring
+ -- archive rows without this, ar_text and ar_flags are used instead.
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = ar_rev_id
+ -- exist, this field should be ignored (and may be NULL or 0) in favor of the
+ -- corresponding data from the slots and content tables
ar_text_id int unsigned,
- -- rev_deleted for archives
+ -- Copied from rev_deleted. Although this may be raised during deletion.
+ -- Users with the "suppressrevision" right may "archive" and "suppress"
+ -- content in a single action.
+ -- @since 1.10
ar_deleted tinyint unsigned NOT NULL default 0,
- -- Length of this revision in bytes
+ -- Copied from rev_len, length of this revision in bytes.
+ -- @since 1.10
ar_len int unsigned,
- -- Reference to page_id. Useful for sysadmin fixing of large pages
- -- merged together in the archives, or for cleanly restoring a page
- -- at its original ID number if possible.
+ -- Copied from page_id. Restoration will attempt to use this as page ID if
+ -- no current page with the same name exists. Otherwise, the revisions will
+ -- be restored under the current page. Can be used for manual undeletion by
+ -- developers if multiple pages by the same name were archived.
--
- -- Will be NULL for pages deleted prior to 1.11.
+ -- @since 1.11 Older entries will have NULL.
ar_page_id int unsigned,
- -- Original previous revision
+ -- Copied from rev_parent_id.
+ -- @since 1.13
ar_parent_id int unsigned default NULL,
- -- SHA-1 text content hash in base-36
+ -- Copied from rev_sha1, SHA-1 text content hash in base-36
+ -- @since 1.19
ar_sha1 varbinary(32) NOT NULL default '',
- -- content model, see CONTENT_MODEL_XXX constants
+ -- Copied from rev_content_model, see CONTENT_MODEL_XXX constants
+ -- @since 1.21
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = ar_rev_id
+ -- exist, this field should be ignored (and may be NULL) in favor of the
+ -- corresponding data from the slots and content tables
ar_content_model varbinary(32) DEFAULT NULL,
- -- content format, see CONTENT_FORMAT_XXX constants
+ -- Copied from rev_content_format, see CONTENT_FORMAT_XXX constants
+ -- @since 1.21
+ -- @deprecated since 1.31. If rows in the slots table with slot_revision_id = ar_rev_id
+ -- exist, this field should be ignored (and may be NULL).
ar_content_format varbinary(64) DEFAULT NULL
) /*$wgDBTableOptions*/;
--
CREATE TABLE /*_*/slots (
- -- reference to rev_id
+ -- reference to rev_id or ar_rev_id
slot_revision_id bigint unsigned NOT NULL,
-- reference to role_id
-- Nominal hash of the content object (not necessarily of the serialized blob)
content_sha1 varbinary(32) NOT NULL,
- -- reference to model_id
+ -- reference to model_id. Note the content format isn't specified; it should
+ -- be assumed to be in the default format for the model unless auto-detected
+ -- otherwise.
content_model smallint unsigned NOT NULL,
-- URL-like address of the content blob
ss_row_id int unsigned NOT NULL PRIMARY KEY,
-- Total number of edits performed.
- ss_total_edits bigint unsigned default 0,
+ ss_total_edits bigint unsigned default NULL,
- -- An approximate count of pages matching the following criteria:
- -- * in namespace 0
- -- * not a redirect
- -- * contains the text '[['
- -- See Article::isCountable() in includes/Article.php
- ss_good_articles bigint unsigned default 0,
+ -- See SiteStatsInit::articles().
+ ss_good_articles bigint unsigned default NULL,
- -- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
- ss_total_pages bigint default '-1',
+ -- Total pages, theoretically equal to SELECT COUNT(*) FROM page.
+ ss_total_pages bigint unsigned default NULL,
- -- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
- ss_users bigint default '-1',
+ -- Number of users, theoretically equal to SELECT COUNT(*) FROM user.
+ ss_users bigint unsigned default NULL,
- -- Number of users that still edit
- ss_active_users bigint default '-1',
+ -- Number of users that still edit.
+ ss_active_users bigint unsigned default NULL,
- -- Number of images, equivalent to SELECT COUNT(*) FROM image
- ss_images int default 0
+ -- Number of images, equivalent to SELECT COUNT(*) FROM image.
+ ss_images bigint unsigned default NULL
) /*$wgDBTableOptions*/;
--
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
- -- Deprecated in favor of image_comment_temp.imgcomment_description_id.
+ -- Deprecated in favor of img_description_id.
img_description varbinary(767) NOT NULL default '',
+ img_description_id bigint unsigned NOT NULL DEFAULT 0, -- ("DEFAULT 0" is temporary, signaling that img_description should be used)
+
-- user_id and user_name of uploader.
-- Deprecated in favor of img_actor.
img_user int unsigned NOT NULL default 0,
"selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
},
"devDependencies": {
+ "bluebird": "3.5.1",
"deepmerge": "1.3.2",
"eslint": "4.9.0",
"eslint-config-wikimedia": "0.5.0",
--- /dev/null
+Principal Authors (major contributors, alphabetically)
+
+Bartosz Dziewoński <matma.rex@gmail.com>
+Ed Sanders <esanders@wikimedia.org>
+James D. Forrester <jforrester@wikimedia.org>
+Kirsten Menger-Anderson <kmenger@wikimedia.org>
+Kunal Mehta <legoktm@gmail.com>
+Moriel Schottlender <moriel@gmail.com>
+Prateek Saxena <prtksxna@gmail.com>
+Roan Kattouw <roan@wikimedia.org>
+Rob Moen <rmoen@wikimedia.org>
+Timo Tijhof <krinklemail@gmail.com>
+Trevor Parscal <trevor@wikimedia.org>
+Volker E. <volker.e@wikimedia.org>
+
+Patch Contributors (minor contributors, alphabetically)
+
+Alangi Derick <alangiderick@gmail.com>
+Alex Monk <krenair@wikimedia.org>
+Amir E. Aharoni <aaharoni@wikimedia.org>
+Amir Sarabadani <Ladsgroup@gmail.com>
+Andrew Garrett <agarrett@wikimedia.org>
+Andrew Green <andrew.green.df@gmail.com>
+Antoine Musso <hashar@free.fr>
+Brad Jorsch <bjorsch@wikimedia.org>
+Brion Vibber <brion@users.mediawiki.org>
+C. Scott Ananian <cscott@cscott.net>
+Chad Horohoe <chadh@wikimedia.org>
+codynguyen1116 <samanthanguyen1116@gmail.com>
+David Lynch <dlynch@wikimedia.org>
+Derk-Jan Hartman <hartman.wiki@gmail.com>
+eranroz <eranroz89@gmail.com>
+Erick Guan <fantasticfears@gmail.com>
+Erik Moeller <erik@wikimedia.org>
+Florian <florian.schmidt.stargatewissen@gmail.com>
+Geoffrey Mon <geofbot@gmail.com>
+Gilles Dubuc <gdubuc@wikimedia.org>
+Huji Lee <huji.huji@gmail.com>
+Inez Korczyński <inez@wikia-inc.com>
+IvanFon <ivanfonseca55@gmail.com>
+Jon Robson <jrobson@wikimedia.org>
+Juliusz Gonera <jgonera@wikimedia.org>
+Kartik Mistry <kartik.mistry@gmail.com>
+Kyle Florence <kflorence@wikia-inc.com>
+Leszek Manicki <leszek.manicki@wikimedia.de>
+Marc A. Pelletier <marc@uberbox.org>
+Mark Holmquist <mtraceur@member.fsf.org>
+Matthew Flaschen <mflaschen@wikimedia.org>
+May Tee-Galloway <mgalloway@wikimedia.org>
+Mr. Stradivarius <misterstrad@gmail.com>
+Niklas Laxström <nlaxstrom@wikimedia.org>
+Nirzar Pangarkar <nirzardp@gmail.com>
+Ori Livneh <ori@wikimedia.org>
+Paladox <thomasmulhall410@yahoo.com>
+Pau Giner <pau.giner@gmail.com>
+Ricordisamoa <ricordisamoa@openmailbox.org>
+rillke <rillke@wikipedia.de>
+Ryan Kaldari <rkaldari@wikimedia.org>
+Sam Reed <reedy@wikimedia.org>
+Stephane Bisson <sbisson@wikimedia.org>
+Sucheta Ghoshal <sghoshal@wikimedia.org>
+Thalia Chan <thalia.e.chan@googlemail.com>
+Victor Barbu <victorbarbu08@gmail.com>
+Wei-Ko Kao <othree@gmail.com>
+Željko Filipin <zeljko.filipin@gmail.com>
--- /dev/null
+# OOUI Release History
+## v0.26.1 / 2018-03-23
+### Deprecations
+* [DEPRECATING CHANGE] icons: Flag 'comment' as to be removed (James D. Forrester)
+* [DEPRECATING CHANGE] icons: Rename 'clip'/'unClip' to 'bookmark'/'bookmarkOutline' (Volker E.)
+
+### Styles
+* ButtonElement (framed): Remove `padding` on icon + indicator variant (Volker E.)
+* WikimediaUI theme: Reduce distance of Tools in BarToolGroup (Volker E.)
+* WikimediaUI theme: Reduce necessary widths for narrow toolbar elements (Volker E.)
+* WikimediaUI icons: Amend 'help' icon to address feedback (Volker E.)
+* WikimediaUI icons: Fix 'speechBubbles' icons (Volker E.)
+* WikimediaUI icons: Fix 'underline-a' icon to be an 'a', not a 'u' (Ed Sanders)
+* WikimediaUI icons: Slightly adapted size of 'clip'/'unClip' for algnment to other icons (Volker E.)
+* WikimediaUI icons: Swap 'advanced' and 'settings' icons (Volker E.)
+
+### Code
+* WikimediaUI theme: Remove unused RTL variants of alignLeft/Right icons (Ed Sanders)
+* WikimediaUI theme: Fix/remove unused icon files (Bartosz Dziewoński)
+* demos: Add alert popout to toolbars demos (Volker E.)
+* demos: Add specialCharacter terminal tool to toolbars demos (James D. Forrester)
+* docs: Add Demos to JSDuck navigation menu (Timo Tijhof)
+* build: Replace grunt-image with grunt-imagemin (James D. Forrester)
+* icons: Re-crush SVGs (James D. Forrester)
+
+## v0.26.0 / 2018-03-20
+### Breaking changes
+* [BREAKING CHANGE] WikimediaUI: Unify available variants across icon packs (Ed Sanders)
+* [BREAKING CHANGE] icons: Remove 'alignCentre', renamed in v0.24.2 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'arrowLast', deprecated since v0.25.0 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'bellOn', deprecated in v0.25.0 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'quotesAdd', deprecated in v0.24.4 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'redirect', renamed in v0.24.4 (James D. Forrester)
+* [BREAKING CHANGE] indicators: Remove 'next' and 'previous', deprecated in v0.25.0 (James D. Forrester)
+
+### Features
+* FieldLayout: Use better icons for warning/error messages (Bartosz Dziewoński)
+* MenuTagMultiselectWidget: Check for empty inputValue in addTagFromInput (Prateek Saxena)
+* TagMultiselectWidget: Handle disabled items (Moriel Schottlender)
+
+### Styles
+* WikimediaUI theme: Add additional 'interactions' & 'media' pack icons (Volker E.)
+* WikimediaUI theme: Align refined WikimediaUI icons in size and position (Volker E.)
+* WikimediaUI theme: Apply `translateZ` hack to full canvas icons (Volker E.)
+* WikimediaUI theme: Fix regression on accelerator key alignment (Volker E.)
+* WikimediaUI theme: Fix toolbar buttonGroup (Ed Sanders)
+* WikimediaUI theme: Harmonize `padding` on FieldLayout messages (Volker E.)
+* WikimediaUI theme: Unify and refine WikimediaUI icons (Volker E.)
+* WikimediaUI theme: Use `14px` base font size & amend positioning/sizing (Volker E.)
+* Apex theme: Fix toolbar buttonGroup (Ed Sanders)
+* Apex theme: Make Apex also use 20px canvas icons (Bartosz Dziewoński)
+
+### Code
+* Use theme rules to define which tools should get blue icons, not flags (Ed Sanders)
+* build: Make the copy task for the WikimediaUI less vars less confusing (James D. Forrester)
+* build: Stop using 'grunt-image' for optimising PNGs, at least for now (James D. Forrester)
+* build: Switch SVG optimization to 'grunt-svgmin' (Volker E.)
+* build: Temporarily disable running unit tests in Firefox due to timeouts (James D. Forrester)
+* build: Update devDependencies to latest (James D. Forrester)
+* build: Updating jakub-onderka/php-parallel-lint to 1.0.0 (libraryupgrader)
+* build: Acknowledge in package.json that grunt-exec 3.0.0 exists, but we don't want it (Bartosz Dziewoński)
+* demos: Include editor switch menu in toolbars menu (Volker E.)
+* demos: Increase base `font-size` to `14px` (Volker E.)
+* demos: Re-enable bigger base size on mobile breakpoint (Volker E.)
+* demos: Use `0.8em` body font size for Apex (Bartosz Dziewoński)
+* dist: Distribute History.md so people can see what's changed (James D. Forrester)
+
+
+## v0.25.3 / 2018-03-06
+### Features
+* DropdownInputWidget: Extract menu item creation (Gabriel Birke)
+* MenuTagMultiselectWidget: Highlight first item when filtering (Moriel Schottlender)
+* demos: Use individual oojs-ui-* JS files for sourcemap support (Moriel Schottlender)
+
+### Styles
+* WikimediaUI theme: Align action toolbar primary button focus state (Volker E.)
+* WikimediaUI theme: Align toolbar items' focus to widgets elsewhere (Volker E.)
+
+### Code
+* Imply `inline-block` on toolbar item labels (Volker E.)
+* CheckboxMultiselectInputWidget: Fix handling of 'name' config option in JS (Bartosz Dziewoński)
+* TagMultiselectWidget: Only apply `onMouseDown` if not in input (Moriel Schottlender)
+* Gruntfile: Remove reference to long-absent at-ease PHP library (James D. Forrester)
+* build: Add jakub-onderka/php-console-highlighter (Umherirrender)
+* build: Adding MinusX (Kunal Mehta)
+* build: Updating mediawiki/mediawiki-codesniffer to 16.0.1 (libraryupgrader)
+* build: Updating phpunit/phpunit to 4.8.36 || ^6.5 (libraryupgrader)
+* build: pass --ansi --no-progress to composer (Antoine Musso)
+* demos: Add monospace hack for `code` element (Volker E.)
+* demos: Only claim ARIA `main` role on the first toolbar demo (Volker E.)
+* demos: Replace “Save” by “Publish changes” (Volker E.)
+
+
+## v0.25.2 / 2018-02-06
+### Deprecations
+* [DEPRECATING CHANGE] icons: Flag indicator 'alert' as to be removed (Volker E.)
+
+### Features
+* Element: Fix infusion edge case (Bartosz Dziewoński)
+* InputWidget and subclasses: Remember original value when creating the widget (Bartosz Dziewoński)
+* MultilineTextInputWidget: Emit 'enter' for Ctrl+Enter (Ed Sanders)
+* MenuTagMultiselectWidget: Erase the input when a menu option is chosen (Prateek Saxena)
+* OptionWidget: Option is still selectable/highlightable/pressable if its parent is disabled (Bartosz Dziewoński)
+* RadioSelectInputWidget: Prevent exceptions when trying to set unavailable options (Bartosz Dziewoński)
+
+### Styles
+* FieldLayout: Fix help icon negative margin in Apex (Ed Sanders)
+* LabelElement: Switch `box-sizing` to `border-box` (srishakatux)
+* ListToolGroup: Correctly point the collapse/expand icon on bottom toolbars (Volker E.)
+* RadioSelectInputWidget, CheckboxMultiselectInputWidget: Fix spacing between options in PHP (Apex theme) (Bartosz Dziewoński)
+
+### Code
+* Avoid having to call `.setValue()` in some widgets' constructors multiple times (Bartosz Dziewoński)
+* CheckboxMultiselectInputWidget: Turn inline event handler into a method (Bartosz Dziewoński)
+* DraggableElement: Replace 'OOjs-UI' with 'OOUI' for code hygiene (Volker E.)
+* TextInputWidget: Move previously forgotten methods to Multiline (Bartosz Dziewoński)
+* Follow-up b28e99712: Remove `mediawiki/at-ease` dependancy (Sam Reed)
+* Reduce code duplication between `#setValue` and `#setOptions` (Bartosz Dziewoński)
+* Remove duplicate documentation between TextInputWidget and Multiline (Bartosz Dziewoński)
+* TextInputWidget: Document that 'maxLength' counts UTF-16 code units (Bartosz Dziewoński)
+* Toolbars: Replace `$.width` with `clientWidth`/`offsetWidth` (Ed Sanders)
+* Use child selectors for menuLayout (Ed Sanders)
+* build: Don't lint a generated JSON file for validity before it's rebuilt (James D. Forrester)
+* build: Update Rubocop config for deprecations (Bartosz Dziewoński)
+* demos, docs: Replace 'alert' indicator, as it's deprecated (Volker E.)
+* demos: Bring “Word processor toolbar” demos closer to VE (Volker E.)
+* demos: Provide more space at bottom of page (Volker E.)
+* tests: Do not use obviously fake data when testing infusion (Bartosz Dziewoński)
+* testsuitegenerator: Test some 'value' parameters that match 'options' parameters (Bartosz Dziewoński)
+
+
+## v0.25.1 / 2018-01-16
+### Code
+* Allow other stuff to handle the event when we call `simulateLabelClick()` (Bartosz Dziewoński)
+* Follow-Up I0f1d9c1f: Update usages of `getSelectedItem` -> `findSelectedItem` (Ed Sanders)
+* PanelLayout: Remove buggy `translateZ` performance hack (Volker E.)
+* PopupToolGroup: Revert "Fix popup direction changing…" (Bartosz Dziewoński)
+* Rename prefixes of unique IDs to not mention "OOjs" (Bartosz Dziewoński)
+* build, demos, docs: Use “OOUI” as unified name (Volker E.)
+* demos: Use MultilineTextInputWidget in PHP demos (Ed Sanders)
+* docs: Clarify `required` true handling with `indicator: 'required'` (Volker E.)
+* docs: Use “OOUI” as unified name in code comments (Volker E.)
+
+
+## v0.25.0 / 2018-01-09
+### Breaking changes
+* [BREAKING CHANGE] Drop the `constructive` flag entirely (James D. Forrester)
+* [BREAKING CHANGE] Remove `BookletLayout#getClosestPage` (James D. Forrester)
+* [BREAKING CHANGE] SelectWidget: Remove `getFirstSelectableItem` (Prateek Saxena)
+* [BREAKING CHANGE] SelectWidget: Remove `getHighlightedItem` (Prateek Saxena)
+* [BREAKING CHANGE] SelectWidget: Remove `getRelativeSelectableItem` (Prateek Saxena)
+* [BREAKING CHANGE] icons: Drop 'watchlist', deprecated in v0.23.1 (James D. Forrester)
+
+### Deprecations
+* [DEPRECATING CHANGE] GroupElement: Rename getItem(s)FromData to findItem(s)FromData (Prateek Saxena)
+* [DEPRECATING CHANGE] MultiSelectWidget: Rename getters (Prateek Saxena)
+* [DEPRECATING CHANGE] SelectWidget: Rename `getSelectedItem` to `findSelectedItem` (Prateek Saxena)
+* [DEPRECATING CHANGE] icons: Flag indicators 'previous' & 'next' as to be removed (Volker E.)
+* [DEPRECATING CHANGE] icons: Rename 'arrowLast' to 'arrowPrevious' (James D. Forrester)
+
+### Features
+* MenuTagMultiselectWidget: Erase the input when tag is selected if filtering (Moriel Schottlender)
+
+### Styles
+* Add `margin-bottom` for widgets which are part of OOUI HorizontalLayout (Phantom42)
+* FieldLayout: Improve alignment of multiline labels with 'help' button (Bartosz Dziewoński)
+* WikimediaUI theme: Align 'transparency' icon to WikimedaUI color palette (Volker E.)
+* WikimediaUI theme: Remove obsolete global flag for 'layout' icon pack (Volker E.)
+* WikimediaUI theme: Remove obsolete icon flags (Volker E.)
+* Apex theme: Align readonly TextInputWidget across themes (Volker E.)
+* Apex theme: Apply `opacity` button transition and ensure Chrome support (Volker E.)
+* Apex theme: Remove unused, obsolete 'logo-wikimediaDiscovery' icon (Volker E.)
+* icons: Remove obsolete 'bookmark' icon remainders (Volker E.)
+* icons: Remove obsolete 'watchlist' icon remainders (Volker E.)
+* icons: Shorten 'accessibility' pack invert hex color (Volker E.)
+
+### Code
+* Clarify `.oo-ui-force-gpu-composite-layer()` mixin comment (Volker E.)
+* Fix blurry text on PanelLayout promoted to GPU in Safari (Volker E.)
+* Fix popup direction changing when the "anchor" is partially offscreen (Bartosz Dziewoński)
+* MenuTagMultiselectWidget: Don't use overlay for `$autoCloseIgnore` (Moriel Schottlender)
+* MultilineTextInputWidget: Correct documentation for `config.maxRows` (Roan Kattouw)
+* PHP TextInputWidget: Remove remaining type 'search' specific code (Volker E.)
+* Use findItem(s)FromData instead of getItem(s)FromData (Prateek Saxena)
+* demos: Override OO.ui.getViewportSpacing in infused PHP demo too (Bartosz Dziewoński)
+* demos: Promote icons page IndicatorWidget to GPU layer (Volker E.)
+* docs: Bump copyright year (James D. Forrester)
+* docs: TagMultiselectWidget: Remove wrong link to MediaWiki documentation (Prateek Saxena)
+* build: Update .gitattributes for .phpcs.xml file move (Kunal Mehta)
+* build: Add rake to Gemfile (Antoine Musso)
+* build: Don't include Gemfile* in composer zipballs (Kunal Mehta)
+* build: Update RuboCop Ruby gem (Željko Filipin)
+* build: Updating mediawiki/mediawiki-codesniffer to 15.0.0 (libraryupgrader)
+* build: Use SVGO option of 'grunt-image' for distribution (Volker E.)
+
+
+## v0.24.4 / 2017-12-20 special release
+### Deprecations
+* [DEPRECATING CHANGE] icons: Flag unused 'bellOn' icon as to be removed (Volker E.)
+* [DEPRECATING CHANGE] icons: Flag unused 'quotesAdd' & 'redirect' as to be removed (Volker E.)
+
+### Features
+* Introduce `OO.ui.getDefaultOverlay` (Bartosz Dziewoński)
+* Put menus/popups of infused PHP widgets into the default overlay (Bartosz Dziewoński)
+
+### Styles
+* icons: Add 'lightbulb' icon (Prateek Saxena)
+* icons: Add 'stop' icon to Apex theme (Volker E.)
+
+### Code
+* ClippableElement: Fix JS error when Floatable is mixed in but disabled (Roan Kattouw)
+* DropdownWidget: Remove stray use of `this.$()` (Bartosz Dziewoński)
+
+
+## v0.24.3 / 2017-11-28
+### Features
+* Allow adding virtual viewport spacing (Bartosz Dziewoński)
+* ClippableElement: Allow clipping with top or left edge (Bartosz Dziewoński)
+* DropdownInputWidget: Generate a hidden `<select>` in JS (Bartosz Dziewoński)
+* FieldsetLayout: Hide header when there is no icon or label (Bartosz Dziewoński)
+* MenuSelectWidget, PopupWidget: Automatically change popup direction if there is no space (Bartosz Dziewoński)
+* PopupToolGroup: Set clipping edges to fix clipping edge (heh) cases (Bartosz Dziewoński)
+* TextInputWidget: support spellcheck attribute (David Lynch)
+
+### Styles
+* themes: Fix PHP ComboboxInputWidget indicator position (Volker E.)
+* WikimediaUI theme: Restore `:hover:focus` border color on TextInputWidgets (Volker E.)
+* oo-ui-background-image: Drop `-o-linear-gradient` fallback (James D. Forrester)
+* oo-ui-background-image: Drop `-webkit-linear-gradient` fallback (James D. Forrester)
+
+### Code
+* PHP DropdownInputWidget: Workaround for Firefox 57 ignoring attr selector with whitespace (Volker E.)
+* DraggableGroupElement: Don't try to access non-existent property (Bartosz Dziewoński)
+* DropdownInputWidget: Remove duplicate TitledElement mixin (Bartosz Dziewoński)
+* README: Add "Community" section (Prateek Saxena)
+* README: Re-arrange intro section (Prateek Saxena)
+* build: Bump wikimedia-ui-base (Volker E.)
+* git.wikimedia.org -> phab (Zach)
+
+
+## v0.24.2 / 2017-11-07
+### Deprecations
+* [DEPRECATING CHANGE] Use en-US spelling for icon names for consistency (Ed Sanders)
+
+### Code
+* README: Consistently refer to OOUI as library (Volker E.)
+* README: Fix Doxygen rendering (Volker E.)
+* README: Simplify “Quick start” and “Contributing” section (Volker E.)
+* demos: Correct and simplify SimpleWidget styles (Bartosz Dziewoński)
+* docs: onMenuToggle: `isVisible` is the state of the menu (Prateek Saxena)
+
+
+## v0.24.1 / 2017-10-31
+### Features
+* DropdownWidget: Allow pressing Space to close the widget, as well as open (Bartosz Dziewoński)
+
+### Styles
+* WikimediaUI theme: Visually improve MenuSectionOptionWidget MenuOptions (Volker E.)
+
+### Code
+* ComboBoxInputWidget: Add `.oo-ui-comboBoxInputWidget-open` class to widget (Volker E.)
+* Generate clover.xml with code coverage results (Kunal Mehta)
+* WikimediaUI theme: Use child selectors for styling toolbar action buttons (Bartosz Dziewoński)
+* README: Simplify and move “Versioning” section (Volker E.)
+* README: Simplify “Contributing” section slightly and add LESS lint hint (Volker E.)
+* build: Bump stylelint devDependencies (James D. Forrester)
+* build: Bump various devDependencies to latest (James D. Forrester)
+* build: Downgrade 'grunt-exec' to 1.0.1 (again) (Bartosz Dziewoński)
+* build: Update grunt-image to version 4.0.0 (Ed Sanders)
+* build: Update mediawiki/mediawiki-codesniffer to 14.1.0 (libraryupgrader)
+* icons: Unify SVG markup (Volker E.)
+
+
+## v0.24.0 / 2017-10-17
+### Breaking changes
+* [BREAKING CHANGE] Drop 'MediaWiki' backwards-compatibility theme (James D. Forrester)
+* [BREAKING CHANGE] icons: Drop 'stripeSideMenu', renamed in v0.22.2 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'eye'/'eyeClosed' icons, deprecated in v0.23.0 (Volker E.)
+* [BREAKING CHANGE] icons: Remove 'signature' icon, deprecated in v0.23.0 (Volker E.)
+* [BREAKING CHANGE] icons: Remove 'sun', deprecated in v0.23.0 (James D. Forrester)
+
+### Styles
+* themes: Unify icon/indicator visibility (Volker E.)
+* WikimediaUI theme: Ensure hover feedback on TextInputWidget & descendants (Volker E.)
+
+### Code
+* Fix `.oo-ui-selectable()` mixin to actually undo `.oo-ui-unselectable()` (Bartosz Dziewoński)
+* WikimediaUI theme: Fix selector in PopupWidget styles (Bartosz Dziewoński)
+
+
+## v0.23.5 / 2017-10-12
+### Code
+* PHP MultilineTextInputWidget, SearchInputWidget: Remove duplicate `use` statements (Bartosz Dziewoński)
+* PHP Theme: Fix check for IconElement/IndicatorElement for inherited traits (Bartosz Dziewoński)
+
+
+## v0.23.4 / 2017-10-11
+### Styles
+* IndexLayout: Handle long lists of tabs (Bartosz Dziewoński)
+* icons: Provide a 'reload' icon in the 'interactions' pack (Ed Sanders)
+* Apex theme: Fix PopupToolGroup active box size (Volker E.)
+* Apex theme: Fix SelectFileWidget (no browser support) `padding` (Volker E.)
+* Generalize icon and indicator positioning & visibility (Volker E.)
+* WikimediaUI theme: Reduce Checkbox*- & RadioSelectInputWidget vertical space (Volker E.)
+* WikimediaUI theme: Reduce FieldLayout `margin-top` slightly (Volker E.)
+* WikimediaUI theme: Streamlining icon/indicator visibility (Volker E.)
+
+### Code
+* Only store initialConfig in demo mode (Ed Sanders)
+* SearchInputWidget: Prevent extra `oo-ui-textInputWidget-type-text` class (Bartosz Dziewoński)
+* TextInputWidget: Use child selector for icons/indicators/labels (Ed Sanders)
+* Do not call `.offset()` on `$( 'html' )` (Bartosz Dziewoński)
+* PHP: Implement MultilineTextInputWidget, deprecate multiline option (Prateek Saxena)
+* PHP: Implement SearchInputWidget, deprecate search option (Bartosz Dziewoński)
+* build: Downgrade 'grunt-exec' to 1.0.1 (Bartosz Dziewoński)
+* demos: Adding missing `:hover` (Volker E.)
+
+
+## v0.23.3 / 2017-10-03
+### Styles
+* PopupToolGroup: Move accelerator keys `padding` to themes (Volker E.)
+* WikimediaUI theme: Align PopupToolGroup header styles (Volker E.)
+* WikimediaUI theme: Fix border on narrow bottom toolbars (Volker E.)
+* WikimediaUI theme: Fix flagged elements' icon `opacity` (Volker E.)
+* WikimediaUI theme: Improve PopupToolGroup's indicator vertical alignment (Volker E.)
+* WikimediaUI theme: Make toolbar active element highlights visually equal (Volker E.)
+* WikimediaUI theme: Remove `box-shadow` not in design (Volker E.)
+* WikimediaUI theme: Replace BookletLayout menu `border-color` (Volker E.)
+* WikimediaUI theme: Unify positioning and sizing of tools, toolgroups and menus (Volker E.)
+* WindowManager: Remove `overflow: hidden` to enhance styling flexibility (Volker E.)
+
+### Code
+* Follow-up I576f3175: highlightQuery: Handle case when query is not found (Ed Sanders)
+* IndexLayout, BookletLayout: Don't scroll panels if not scrollable (Bartosz Dziewoński)
+* LabelElement: Add tests for setHighlightedQuery (Ed Sanders)
+* SelectWidget: Allow focussing things inside OptionWidget labels (Bartosz Dziewoński)
+* WikimediaUI theme: Simplify action toolbar buttons selectors (Volker E.)
+* demos: Remove unnecessary button demo widgets (Volker E.)
+
+
+## v0.23.2 / 2017-09-26
+### Deprecations
+* [DEPRECATING CHANGE]: Apex theme: Begin killing `constructive` flag (James D. Forrester)
+
+### Features
+* LabelElement#highlightQuery: Support locale comparison (Ed Sanders)
+* MenuLayout, BookletLayout, IndexLayout: Support `expanded: false` (Bartosz Dziewoński)
+* WindowManager: Set `aria-hidden` by default and change toggleAriaIsolation behavior (Prateek Saxena)
+
+### Code
+* MenuLayout: Rewrite support for `expanded: false` (Bartosz Dziewoński)
+* TextInputWidget: Reduce CSS output by enhancing unselectable behaviour (Volker E.)
+* themes: Align DropdownWidget `&-handle` selectors for code hygiene (Volker E.)
+* Apex theme: Simplify Radio- & Checkbox*optionWidget label rules (Volker E.)
+* Remove duplicated `outline` property (Volker E.)
+* Remove LESS vars covered by WikimediaUI Base (Volker E.)
+* demos: Expand long dialog title to actually test things (James D. Forrester)
+* demos: Restrict `opacity` to non-flagged icons only (Volker E.)
+
+
+## v0.23.1 / 2017-09-19
+### Deprecations
+* [DEPRECATING CHANGE] SelectWidget: Rename `getFirstSelectableItem` to `findFirstSelectableItem` (Prateek Saxena)
+* [DEPRECATING CHANGE] SelectWidget: Rename `getHighlightedItem` to `findHighlightedItem` (Prateek Saxena)
+* [DEPRECATING CHANGE] SelectWidget: Rename `getRelativeSelectableItem` to `findRelativeSelectableItem` (Prateek Saxena)
+* [DEPRECATING CHANGE] icons: Flag unused 'watchlist' icon as to be removed (Volker E.)
+
+### Styles
+* RadioOptionWidget, CheckboxMultioptionWidget: Support very long labels (Bartosz Dziewoński)
+* WikimediaUI theme: Harmonize toolbar icon/indicator opacity (Volker E.)
+* WikimediaUI theme: Improve ListToolGroup's color and opacity handling (Volker E.)
+* WikimediaUI theme: Simplify disabled tool opacity rules (Volker E.)
+
+### Code
+* BookletLayout#getClosestPage: Fix version number of deprecation (Prateek Saxena)
+* HtmlSnippet: Throw exception if given non-string content (Bartosz Dziewoński)
+* Use `findFirstSelectableItem` instead of `getFirstSelectableItem` (Prateek Saxena)
+* Use `findHighlightedItem` instead of `getHighlightedItem` (Prateek Saxena)
+* Use `findRelativeSelectableItem` instead of `getRelativeSelectableItem` (Prateek Saxena)
+* WikimediaUI theme: Concatenate constructive & progressive selectors (Volker E.)
+* WikimediaUI theme: Remove unnecessary properties (Volker E.)
+* demos: Add examples of FieldLayout with very long labels (Bartosz Dziewoński)
+* demos: Avoid menu's `box-shadow` from lurkin into toolbar (Volker E.)
+
+
+## v0.23.0 / 2017-09-05
+### Breaking changes
+* [BREAKING CHANGE] Remove CardLayout and references in IndexLayout (Volker E.)
+* [BREAKING CHANGE] Remove FloatingMenuSelectWidget (Volker E.)
+* [BREAKING CHANGE] Remove back-compat `OO.ui` prefix assumption in infusion code (Prateek Saxena)
+* [BREAKING CHANGE] icons: Remove 'caret' icons, deprecated in v0.21.3 (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove 'wikitrail' icon, renamed in v0.20.1 (James D. Forrester)
+
+### Deprecations
+* [DEPRECATING CHANGE] BookletLayout: Rename `getClosestPage()` to `findClosestPage()` (Prateek Saxena)
+* [DEPRECATING CHANGE] icons: Flag unused 'sun' icon as to be removed (James D. Forrester)
+* [DEPRECATING CHANGE] icons: Move 'eye'/'eyeClosed' to 'accessibility' (Volker E.)
+* [DEPRECATING CHANGE] icons: Move 'signature' to 'editing-advanced' (Volker E.)
+
+### Features
+* Element: Improve error message when the widget being infused is missing (Bartosz Dziewoński)
+
+### Styles
+* Apex theme: Only apply `margin` to label if visible (Ed Sanders)
+* WikimediaUI theme: Fix frameless indicator combination buttons' appearance (Volker E.)
+* ButtonInputWidget: Fix Safari-specific intrinsic `margin` (Volker E.)
+
+### Code
+* Ensure only options belonging to the SelectWidget can be clicked (Ed Sanders)
+* SelectFileWidget: Rename `getTargetItem()` to `findTargetItem()` (Prateek Saxena)
+* Toolgroup: Rename `getTargetTool()` to `findTargetTool()` (Prateek Saxena)
+* WikimediaUI theme: Simplify `transition` code and remove obsolete (Volker E.)
+* build: Add 'accessibility' icon pack in Apex to build module definition (Volker E.)
+* build: Update eslint-config-wikimedia 0.4->0.5 (Ed Sanders)
+* build: Updating mediawiki/mediawiki-codesniffer to 0.12.0 (libraryupgrader)
+* tests: Make MockWidget filename match class name (Kunal Mehta)
+
+
+## v0.22.5 / 2017-08-22
+### Features
+* Add `title` attribute to the 'remove' button in TagItemWidget (Moriel Schottlender)
+
+### Styles
+* WikimediaUI theme: Fix regression on disabled border (Volker E.)
+
+### Code
+* Align vars to WikimediaUI Base and remove them as OOjs UI vars (Volker E.)
+* DraggableElement: Make toggling draggability consistent (Bartosz Dziewoński)
+* Follow-up 022f532: Don't crash if TitledElement initializes before AccessKeyedElement (Roan Kattouw)
+* WikimediaUI theme: Make checkbox/radio code leaner (Volker E.)
+* WikimediaUI theme: Remove unnecessary selector in CheckboxInputWidget (Volker E.)
+* docs: Align code comment references to Phabricator tasks (Volker E.)
+* build: Upgrade devDependencies to latest and make pass (James D. Forrester)
+* build: Update mediawiki-codesniffer to v0.10.1 and fix issues (WMDE-Fisch)
+* build: Update mediawiki-codesniffer to v0.11.0 and fix issues (WMDE-Fisch)
+* tests: Prepare for qunit 2.x (James D. Forrester)
+
+
+## v0.22.4 / 2017-08-01
+### Features
+* CheckboxMultiselectInputWidget: setValue when CheckboxMultiselect changes (Prateek Saxena)
+* FieldLayout: Show widget's accesskey in our title (Bartosz Dziewoński)
+* TextInputWidget: When positioning label, don't clear padding if we will set it again (Bartosz Dziewoński)
+* TitledElement: When an AccessKeyedElement, show access key in the title (Bartosz Dziewoński)
+
+### Styles
+* icons: Vertically align 'play' & 'stop' icons (Volker E.)
+* Apex theme: Add focus styles to Tag-/CapsuleMultiselectWidget (Volker E.)
+* Apex theme: Add focus styles to frameless buttons (Volker E.)
+* Apex theme: Add play icon (copied from WikimediaUI theme) (Roan Kattouw)
+* Apex theme: Align ButtonGroup-/ButtonSelectWidget focus logic to WikimediaUI (Volker E.)
+* Apex theme: Align Dropdown*Widget's focus state with other widgets (Volker E.)
+* Apex theme: Align TextInputWidget focus to variablized way (Volker E.)
+* Apex theme: Align ToggleSwitchWidget focus style to other widgets (Volker E.)
+* Apex theme: Improve alignment of TextInputWidget and its elements (Volker E.)
+* Apex theme: Introduce framed button focus indication (Volker E.)
+* Apex theme: Replace and unify `border-radius` with variables (Volker E.)
+* WikimediaUI theme: Set ButtonElement's height per default (Volker E.)
+* WikimediaUI theme: Work around a Firefox rendering bug for checkboxes and radios (Bartosz Dziewoński)
+
+### Code
+* DraggableGroupElement: Remove ARIA roles & attributes (Volker E.)
+* FieldsetLayout: Use `<legend>` now that Chrome 55 bug is less important (James D. Forrester)
+* Apex theme: Align remaining values to coding convention (Volker E.)
+* WikimediaUI theme: Align `*-fallback` var with notation elsewhere (Volker E.)
+* WikimediaUI theme: Code comment hygiene (Volker E.)
+* WikimediaUI theme: Directly use the Less values rather than via copy-paste (James D. Forrester)
+* demos: Add examples of TextInputWidget with dynamic label (Bartosz Dziewoński)
+* demos: Demo.DraggableItemWidget should not inherit from OO.ui.OptionWidget (Bartosz Dziewoński)
+* demos: Show example link on `:focus` (Volker E.)
+* docs: Fix some PHPDoc `@return` tags (Ricordisamoa)
+* build: Add a script to print the dependency tree of everything (Bartosz Dziewoński)
+
+
+## v0.22.3 / 2017-07-11
+### Features
+* Tag-/CapsuleMultiselectWidget: Avoid visual focusTrap feedback (Volker E.)
+* WindowManager: Avoid inconsistent state due to asynchronous promise resolution (Bartosz Dziewoński)
+* WindowManager: fix closing promise state check (David Lynch)
+
+### Styles
+* icons: Align ongoingConversation to grid (Ed Sanders)
+* icons: Replace the puzzle icon, using the one from VisualEditor (James D. Forrester)
+* icons: Vertically center mapPin icon (Volker E.)
+* Apex theme: Add 'article' icon, copied from WikimediaUI (Moriel Schottlender)
+
+### Code
+* DropdownWidget, MenuSelectWidget: Set `aria-expanded` attribute (Prateek Saxena)
+* FieldLayout: Add `role='alert'` for error messages (Prateek Saxena)
+* FieldLayout: Set `aria-describedby` on the fieldWidget (Prateek Saxena)
+* PopupWidget: Update function name in a comment (Bartosz Dziewoński)
+* TagMultiselectWidget: Skip `updateInputSize()` for invisible inputs (Roan Kattouw)
+* Toolbar: Add comment for greppability of dynamic CSS classes (Bartosz Dziewoński)
+* themes: Align read-only variable names to pseudo-class selector scheme (Volker E.)
+* themes: Align variable names to WikimediaUI Base scheme (Volker E.)
+* WikimediaUI theme: Align `@opacity-icon*` variable names to WikimediaUI Base (Volker E.)
+* WikimediaUI theme: Align checked variable names to pseudo-class scheme (Volker E.)
+* WikimediaUI theme: Align disabled variable names to pseudo-class scheme (Volker E.)
+* WikimediaUI theme: Align variable pseudo classes names to WikimediaUI Base (Volker E.)
+* WikimediaUI theme: Replace `@color-base-light` with `@color-base--inverted` (Volker E.)
+* WikimediaUI theme: Variablize PopupWidget values (Volker E.)
+* WikimediaUI theme: Pull in the upstream WikimediaUI package (James D. Forrester)
+* build: Updating mediawiki/mediawiki-codesniffer to 0.10.0 (Kunal Mehta)
+* phpcs: Enable more rules, or document why they are disabled (Bartosz Dziewoński)
+* testsuitegenerator: Blacklist deprecated `multiline` config option (Bartosz Dziewoński)
+
+
+## v0.22.2 / 2017-06-28
+### Deprecations
+* [DEPRECATING CHANGE] TextInputWidget: Move multi-line support out (Prateek Saxena)
+* [DEPRECATING CHANGE] icons: Move and rename 'stripeSideMenu' to 'draggable' (Volker E.)
+
+### Features
+* DropdownInputWidget: Unbreak setting 'value' via config options (Bartosz Dziewoński)
+* Element: Work around browsers that set fractional scrollTop values (Roan Kattouw)
+
+### Styles
+* BookletLayout: Workaround for horizontal scrollbars on menu when editable (Bartosz Dziewoński)
+* icons: Let's stop referring to removed icons, hmm? (James D. Forrester)
+* Rewrite all styling for "outline controls" (Bartosz Dziewoński)
+* Apex theme: Align appearance of tags' close icon to WikimediaUI theme (Volker E.)
+* Apex theme: Fix HorizontalLayout containing FieldLayouts (Bartosz Dziewoński)
+* WikimediaUI theme: Remove default DraggableElement styling (Ed Sanders)
+* WikimediaUI theme: Use icon instead of indicator in Tag-/CapsuleItemWidget (Volker E.)
+* WikimediaUI: Strengthen Radio*Widget's `:checked` state (Volker E.)
+
+### Code
+* MenuSelectWidget: Fix item hiding when menu contents change (Roan Kattouw)
+* MultilineTextInputWidget: Fix autosizing (Bartosz Dziewoński)
+* PopupWidget: Replace CSS with Less comments for smaller dist (Volker E.)
+* SearchInputWidget: Fix ability to clear the input (Bartosz Dziewoński)
+* TabIndexedElement: Fix validation and make consistent in PHP and JS (Bartosz Dziewoński)
+* Use javascript-stringify instead of JSON.stringify (Ed Sanders)
+* Apex theme: Fix order of selectors for :first-child FieldLayout (Bartosz Dziewoński)
+* demos: Add links to documentation from code examples (Prateek Saxena)
+* demos: Allow linking to specific widgets (Bartosz Dziewoński)
+* demos: Indicate code toggle clearer (Volker E.)
+* demos: Pull out all links to docs/sources to the top of the code (Bartosz Dziewoński)
+* demos: Simplify code generation, now that we use javascript-stringify (Bartosz Dziewoński)
+* demos: Use URL 'query' part for linking to demo sections rather than URL 'fragment' (Bartosz Dziewoński)
+* docs: Fix some typos in documentation (Bartosz Dziewoński)
+* docparser: Fix handling for fake trait constructors (Bartosz Dziewoński)
+* docparser: Make matching '(default: ...)' case-insensitive (Bartosz Dziewoński)
+* docparser: Tighter check for 'use' statements in PHP (Bartosz Dziewoński)
+
+
+## v0.22.1 / 2017-05-31
+### Code
+* WindowManager: Do not use return value of `#closeWindow` as promise (Bartosz Dziewoński)
+* WindowManager: Fix check for a window already closing (Bartosz Dziewoński)
+* WindowManager: Fix error handling for `#openWindow` with string argument (Bartosz Dziewoński)
+* WindowManager: Fix important typo in deprecation warning (Bartosz Dziewoński)
+* WindowManager: Fix incorrect checks for promise state (Bartosz Dziewoński)
+* WindowManager: Provide other `jQuery.Promise` methods on the b/c promise too (Bartosz Dziewoński)
+* demos: Clarify code comment (Bartosz Dziewoński)
+* demos: Clean up the global window manager too when destroying (Bartosz Dziewoński)
+* demos: Load icon packs in the PHP demo (Bartosz Dziewoński)
+* demos: Replace abandoned icon name 'remove' to current one 'trash' (Volker E.)
+
+## v0.22.0 / 2017-05-30
+### Breaking changes
+* [BREAKING CHANGE] TextInputWidget: Remove search related methods (Prateek Saxena)
+* [BREAKING CHANGE] icons: Drop the core icon pack (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove unused 'bookmark' icon (Volker E.)
+* [BREAKING CHANGE] Depend on OOjs v2.1.0, up from v2.0.0 (James D. Forrester)
+
+### Deprecations
+* [DEPRECATING CHANGE] Rename the 'MediaWiki' theme to 'WikimediaUI' (James D. Forrester)
+* [DEPRECATING CHANGE] WindowManager: Deprecate using `openWindow`/`closeWindow` returns as promises (Bartosz Dziewoński)
+
+### Features
+* Add HiddenInputWidget to generate hidden input (Victor Barbu)
+* InputWidget: Introduce `#setInputId` and `inputId` config option (Bartosz Dziewoński)
+* MenuTagMultiselectWidget: Clear text field after adding an item from it (Bartosz Dziewoński)
+* MenuTagMultiselectWidget: Handle the 'selected' config option (Bartosz Dziewoński)
+* NumberInputWidget: Use icons instead of labels (Volker E.)
+* PopupButtonWidget: Handle empty configuration (Bartosz Dziewoński)
+* PopupWidget: Position close button in head absolutely (David Lynch)
+* PopupWidget: Sensibly position anchor-less popups (Roan Kattouw)
+* WindowManager: Add `WindowInstance` - a Promise-based lifecycle object (Timo Tijhof)
+* WindowManager: Handle errors better in `#closeWindow` (Bartosz Dziewoński)
+
+* Allow *even more* widgets to be focussed programatically (Bartosz Dziewoński)
+* Only cancel mouse down event if tool in toolgroup clicked on (Ed Sanders)
+* Re-introduce `.simulateLabelClick()` as a separate method from .focus() (Bartosz Dziewoński)
+
+### Styles
+* themes: Field*Layout help position perfectly aligned (Volker E.)
+* themes: Improve frameless button in size and behaviour (Volker E.)
+* themes: Increase FieldsetLayout header's `font-size` (Volker E.)
+* Apex theme: Ensure vertical centering of ButtonElement's icon (Volker E.)
+* Apex theme: Make OptionWidget icon override more specific (Moriel Schottlender)
+* Apex theme: Start Apex's 'user' icon pack, with just 'userAvatar' for now (Ed Sanders)
+* WikimediaUI theme: Align `@background-color-destructive` to WikimediaUI Base (Volker E.)
+* WikimediaUI theme: Align ButtonInputWidget's `line-height` to ButtonWidget (Volker E.)
+* WikimediaUI theme: Align inline label's position (Volker E.)
+* WikimediaUI theme: Ensure icon aligns in dropdown menu (Volker E.)
+* WikimediaUI theme: Remove incorrect comments (Volker E.)
+
+### Code
+* MenuTagMultiselectWidget: Add test for 'selected' config option (Bartosz Dziewoński)
+* windows: Add tests for OO.ui.alert/confirm/prompt (Timo Tijhof)
+* AUTHORS: Update for the past two years' work (James D. Forrester)
+* build: Add the README/AUTHORS/LICENCE files to dist (James D. Forrester)
+* demos: Add TextInputWidget examples with inline labels but no indicators (Ed Sanders)
+* demos: Add viewport meta tag to PHP demo too (Volker E.)
+* demos: Avoid inline CSS for the overlay (Bartosz Dziewoński)
+* demos: Fix code generation for more complicated cases (Bartosz Dziewoński)
+* demos: Fix up a couple of minor things in demo widgets (Bartosz Dziewoński)
+* demos: Fix `z-index` with fixed demo header (Volker E.)
+* demos: Increase and strengthen responsive support (Volker E.)
+* demos: Indicate widgets clearer by sections (Volker E.)
+* demos: Make disabled progress bar in demo determinate (Ed Sanders)
+* demos: Show code that can be used to create the widget (Prateek Saxena)
+* testsuitegenerator: Handle classes with no constructor (Bartosz Dziewoński)
+
+
+## v0.21.4 / 2017-05-16
+### Features
+* Allow more widgets to be focussed programatically (Bartosz Dziewoński)
+* Generalize `.getInputId()` for all widgets (Bartosz Dziewoński)
+* Use `.focus()` method when possible instead of looking inside widgets (Bartosz Dziewoński)
+* TagMultiselectWidget: Fix `Ctrl`+`Backspace` to delete last item (Bartosz Dziewoński)
+* TagMultiselectWidget: Fix order of checks for `allowArbitrary`/`allowDuplicates` (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Separate two active ToggleButton siblings visually (Volker E)
+
+### Code
+* LabelWidget: Fix label click handling (Bartosz Dziewoński)
+* RadioSelectInputWidget: When generating a unique 'name', don't make it random (Bartosz Dziewoński)
+* Use glaringly wrong tags for elements that are supposed to be unused (Bartosz Dziewoński)
+* README: Clarify and simplify descriptions (Volker E)
+* build: Upgrade eslint-config-wikimedia from 0.3.0 to 0.4.0 and make pass (James D. Forrester)
+* demos: Add ARIA roles (Volker E)
+* demos: Clean up the window manager when destroying the dialogs demo (Bartosz Dziewoński)
+* demos: Preserve scroll position when changing non-page options (Bartosz Dziewoński)
+* demos: Rename deprecated Card to current TabPanel (Volker E)
+* demos: Tame buggy mobile browser behaviour on `position: fixed` (Volker E)
+* demos: Turn the menu into a fixed header (Bartosz Dziewoński)
+* docs: Fix `OO.ui.IndexLayout` example (Volker E)
+* tests: Order the `attributes` object keys, for less noisy diffs (Bartosz Dziewoński)
+
+
+## v0.21.3 / 2017-05-09
+### Deprecations
+* [DEPRECATING CHANGE] Merge functionality of FloatingMenuSelectWidget into MenuSelectWidget (Bartosz Dziewoński)
+* [DEPRECATING CHANGE] Rename CardLayout to TabPanelLayout (Prateek Saxena)
+* [DEPRECATING CHANGE] icons: Deprecate 'bookmark' icon (Volker E)
+* [DEPRECATING CHANGE] icons: Merge 'caret' into regular movement icons (James D. Forrester)
+
+### Styles
+* OptionWidget: Use parent selector for icon/indicator/label styles (Roan Kattouw)
+* Apex theme: Follow same FieldLayout `margin` logic as MediaWiki theme (Volker E)
+* MediaWiki theme: Bring styling to design spec in Safari/iOS (Volker E)
+* MediaWiki theme: Fix ButtonInputWidget appearance in Saf/iOS (Volker E)
+* MediaWiki theme: Fix `padding` for frameless buttons in ProcessDialogs (Ed Sanders)
+* MediaWiki theme: Provide focus indicator to TagMultiselectWidget (Volker E)
+* MediaWiki theme: Unify and harmonize `padding`/position of Tag*Widgets (Volker E)
+
+### Code
+* Fix some errors flagged by ESLint's 'valid-jsdoc' option (Bartosz Dziewoński)
+* NumberInputWidget: Followup db801c55f0 – clean up backward compat vars (Moriel Schottlender)
+* MenuSectionOptionWidget: Remove unsupported ARIA attribute (Volker E)
+* MenuSelectWidget: Scroll to the top if filtering and no exact match (David Lynch)
+* MenuSelectWidgets: Don't unconditionally hide all descendant inputs (Roan Kattouw)
+* TagMultiselectWidget: Actually use the focus trapping element (Bartosz Dziewoński)
+* TagMultiselectWidget: Fix `#addTag` return value to match docs (Bartosz Dziewoński)
+* TagMultiselectWidget: Fix keyboard navigation between items (Bartosz Dziewoński)
+* ToggleButtonWidget: Remove misleading `aria-checked` attribute (Volker E)
+* Unbreak FloatingMenuSelectWidget when `$container` is not given (Bartosz Dziewoński)
+* build: Fix invalid ecmaVersion setting (Timo Tijhof)
+* build: Use source maps in coverage report (James D. Forrester)
+* icons: Add first/last to complement previous/next in movement pack (Ed Sanders)
+* icons: Provide 'clip', 'unClip', and 'pushPin' in moderation (James D. Forrester)
+* tests: Do not set `QUnit.config.requireExpects = true` (Bartosz Dziewoński)
+
+
+## v0.21.2 / 2017-04-25
+### Features
+* Element: New method `#getElementId` (Bartosz Dziewoński)
+* NumberInputWidget: Remake as an actual TextInputWidget child (Moriel Schottlender)
+
+### Styles
+* ProgressBarWidget: Switch to `box-sizing: border-box` (Volker E)
+* TabOptionWidget: Cleanup & align paddings/position to dialog environment (Volker E)
+* MediaWiki theme: Decrease selector specificity and fix invalid appearance (Volker E)
+* MediaWiki theme: Fix IE 7 oversized buttons (Volker E)
+* MediaWiki theme: Improve SearchWidget design (Volker E)
+
+### Code
+* Do not use `role=menu`/`menuitem` for MenuSelectWidget/MenuOptionWidget (Bartosz Dziewoński)
+* PopupTagMultiselectWidget: Update popup position on resize (Prateek Saxena)
+* ProcessDialog: Display error messages on top of footer action buttons (Bartosz Dziewoński)
+* SelectWidget/MenuSelectWidget: Maintain `aria-activedescendant` attribute on focus owner (Bartosz Dziewoński)
+* Set ARIA `role=combobox` on DropdownWidget and LookupElement too (Bartosz Dziewoński)
+* Set `aria-owns` for everything with a dropdown list (ARIA `role=combobox`) (Bartosz Dziewoński)
+* Follow-up d22d23311: Don't reference OO.ui.ToolGroup blindly (James D. Forrester)
+* build: Bump grunt-stylelint, bring in stylelint explicitly (James D. Forrester)
+* demos: Add some more examples with 'accessKey' (Bartosz Dziewoński)
+* docs: Document Window#$overlay property (Bartosz Dziewoński)
+* tests: Drop unnecessary hints to qunit about the number of tests (James D. Forrester)
+
+
+## v0.21.1 / 2017-04-18
+### Styles
+* PopupWidget: Do not leave space for anchor if there's no anchor (Bartosz Dziewoński)
+* MediaWiki theme: Ensure WCAG level AA contrast on unsupported SelectFileWidget (Volker E)
+* MediaWiki theme: Fit icon/indicator & label in DecoratedOptionWidget (Volker E)
+* MediaWiki theme: Fix standalone, disabled sibling ButtonWidgets (Volker E)
+* MediaWiki theme: Fix white `border-color` of frameless buttons (Volker E)
+* MediaWiki theme: Make readonly TextInputWidget appearance clearer (Volker E)
+* MediaWiki theme: TagMultiselectWidget outlined UI improvements (Volker E)
+* MenuOptionWidget: Remove theme-independent 'check' icon (Prateek Saxena)
+
+### Code
+* environment: Upgrade jQuery from 1.11.3 to 3.2.1 (James D. Forrester)
+* DropdownInput-/RadioSelectInputWidget: Remove unnecessary ARIA attributes (Volker E)
+* Element: Use `JSON.parse` rather than the deprecated `$.parseJSON` (James D. Forrester)
+* Fix typo in frameless button mixin (David Lynch)
+* FloatingMenuSelectWidget: Add 'ready' event after menu is clipped (Moriel Schottlender)
+* MediaWiki theme: Clarify `@min-height-widget-default` usage (Volker E)
+* PopupToolGroup: Mixin flaggable (David Lynch)
+* TagMultiselectWidget: Allow preset InputWidget (Moriel Schottlender)
+* TagMultiselectWidget: Redo data validation for Tag* and Menu* (Moriel Schottlender)
+* themes: Align `@size-*-min` variable to naming scheme and rename (Volker E)
+* build: Drop the csscomb task (James D. Forrester)
+* docs: Fix numbering in Quick start (Kartik Mistry)
+* demos: Polish demo labels, styles and add frameless button tests (Volker E)
+* tests: Update OO.ui.Process tests for jQuery 3 compatibility (Bartosz Dziewoński)
+
+
+## v0.21.0 / 2017-04-11
+### Breaking changes
+* [BREAKING CHANGE] ActionWidget: Remove resize event (IvanFon)
+* [BREAKING CHANGE] dependencies: Drop support for ES3 browsers via es5-shim (James D. Forrester)
+
+### Features
+* Create a TagMultiselectWidget (Moriel Schottlender)
+* FloatingMenuSelectWidget: Add `width` config option (Moriel Schottlender)
+* MenuSelectWidget: Add `config.$autoCloseIgnore` (Roan Kattouw)
+
+### Styles
+* PopupWidget: Center the anchor for vertical (above/below) popups too (Bartosz Dziewoński)
+* MediaWiki theme: Add separator when toolbar items break on narrow (Volker E)
+* MediaWiki theme: Fix IE < 11 icon/indicator position in SelectFileWidget (Volker E)
+* MediaWiki theme: Fix overflow ellipsis on small DropdownWidget sizes (Volker E)
+* MediaWiki theme: Fix selector regression on DraggableElement (Volker E)
+* MediaWiki theme: Fix Toolbars containing ButtonGroups (David Lynch)
+* MediaWiki theme: Replace arrows with chevrons and increase contrast (Volker E)
+* MediaWiki theme: Unify `padding` across widgets and variablize (Volker E)
+* MediaWiki theme: Unify `padding` on ButtonElement (Volker E)
+* MediaWiki theme: Unify `padding` on DecoratedOptionWidget and descendants (Volker E)
+* Follow-up eceb6f20: MediaWiki theme: Remove unused indicator flags (Volker E)
+
+### Code
+* Remove remnants of PHP-5.3-style `array()` literals (Bartosz Dziewoński)
+* ClippableElement: Fix progressive width loss bug (Roan Kattouw)
+* ComboBoxInputWidget: Fix minor JS/PHP differences (Bartosz Dziewoński)
+* ComboBoxInputWidget: Redo the 'down' indicator in PHP (Bartosz Dziewoński)
+* DraggableElement: Only apply focus when widget is not disabled (Moriel Schottlender)
+* DraggableElement: Toggle style on `$handle`, not `$element` (Andrew Green)
+* DropdownInputWidget: Only allow setting values actually in the dropdown (Bartosz Dziewoński)
+* MenuSelectWidget: Highlight the first result when searching (Moriel Schottlender)
+* MessageDialog: Accept proposed size dialog on `getSetupProcess` (Ebrahim Byagowi)
+* TextInputWidget: Reduce unnecessary duplicated CSS output (Volker E)
+* TextInputWidget: Use `.prop()` rather than `.attr()` for 'required' (Bartosz Dziewoński)
+* Apex theme: Align coding style to conventions (Volker E)
+* Apex theme: Simplify color usage through Less variables (Volker E)
+* demos: Remove scaling restrictions (Volker E)
+* docparser: Improve trait/mixin handling (Bartosz Dziewoński)
+* docparser: Properly handle default values in PHP (Bartosz Dziewoński)
+* docs: Add detail to documentation of core.js utilities (Ed Sanders)
+* docs: Minor documentation tweaks (Bartosz Dziewoński)
+* tests: Comparison tests for infusing previously untestable classes (Bartosz Dziewoński)
+
+
+## v0.20.2 / 2017-03-30
+### Styles
+* DraggableElement: Fix regression on selectors (Volker E)
+
+### Code
+* GroupElement: Fix insertion bugs (Bartosz Dziewoński)
+* icons: Drop unused 'invert' variant from Apex 'icons-interactions' pack (Bartosz Dziewoński)
+* build: Add exec:composer and add it to `_ci` (Prateek Saxena)
+
+
+## v0.20.1 / 2017-03-28
+### Deprecations
+* [DEPRECATING CHANGE] icons: Deprecate and/or move all the core icons (James D. Forrester)
+* [DEPRECATING CHANGE] icons: Rename 'wikitrail' to 'mapTrail' (Volker E)
+* Follow-up b12205ac: Add deprecation notices to icons moved in v0.16.2 (James D. Forrester)
+* Follow-up da8d99af: Add deprecation notice to icon moved in v0.14.0 (James D. Forrester)
+
+### Features
+* DraggableGroupElement: Make draggable conditional (Moriel Schottlender)
+* build: Implement `grunt add-theme` task to ease theme creation (Bartosz Dziewoński)
+
+### Styles
+* ButtonElement: Normalize appearance in Firefox (Volker E)
+* Blank theme: Fix up the 'blank' theme (Bartosz Dziewoński)
+* MediaWiki theme: Position PopupToolGroup indicator similar to other widgets (Volker E)
+
+### Code
+* Element: Add special case for document root in getClosestScrollableContainer (Bartosz Dziewoński)
+* FloatableElement: Abort positioning if no longer attached (David Lynch)
+* GroupElement: Transform to be an OO.EmitterList mixin (Moriel Schottlender)
+* MenuOptionWidget: Remove inherited, duplicated property (Volker E)
+* OO.ui.isFocusableElement: Update for jQuery 3 deprecations (Bartosz Dziewoński)
+* PopupWidget: Add 'ready' event when the popup is ready (Moriel Schottlender)
+* Use Node.DOCUMENT_NODE rather than magic number (Bartosz Dziewoński)
+* Follow-up 4bc67351c5: Unbreak FloatableElement positioning (Roan Kattouw)
+* Follow-up Iaa7dffc13: *Actually* allow `$returnFocusTo` to be `null` (Ed Sanders)
+* themes: Reorder Less rules alphabetically (Volker E)
+* MediaWiki theme: Remove obsolete ButtonOptionWidget styles (Volker E)
+* MediaWiki theme: Remove unnecessary OptionWiget `border` property (Volker E)
+* build: Add a new jenkins script (Prateek Saxena)
+* build: Bump grunt-cssjanus to master (Volker E)
+* build: Match file order between tests/index and karma (Timo Tijhof)
+* build/demos: Generalize demos and build so that it's easier to add new themes (Bartosz Dziewoński)
+
+
+## v0.20.0 / 2017-03-15
+### Breaking changes
+* [BREAKING CHANGE] Element#scrollIntoView: Drop `complete` config option (James D. Forrester)
+* [BREAKING CHANGE] Element#scrollIntoView: Remove deprecated `complete` config parameter (James D. Forrester)
+* [BREAKING CHANGE] LabelElement: Remove deprecated `fitLabel` function (James D. Forrester)
+* [BREAKING CHANGE] MessageDialog: Drop the deprecated '`verbose`' flag (James D. Forrester)
+* [BREAKING CHANGE] PopupWidget#setAlignment: Remove backwards-compatibility (James D. Forrester)
+* [BREAKING CHANGE] Remove CapsuleMultiSelectWidget (James D. Forrester)
+* [BREAKING CHANGE] Remove TextInputMenuSelectWidget (James D. Forrester)
+* [BREAKING CHANGE] TextInputWidget: Remove `type=date`/`month` support (Geoffrey Mon)
+* [BREAKING CHANGE] icons: Drop '…Undo' icons, deprecated in 0.18.3 (James D. Forrester)
+* [BREAKING CHANGE] icons: Drop 'beta' and 'ribbonPrize', deprecated in 0.18.3 (James D. Forrester)
+* [BREAKING CHANGE] icons: Drop 'betaLaunch', deprecated in 0.18.3 (James D. Forrester)
+* [BREAKING CHANGE] icons: Drop status flags from Wikimedia (logos) icon pack (Volker E)
+
+### Deprecations
+* [DEPRECATING CHANGE] ActionWidget/Set: Warn for methods using the `resize` event (Prateek Saxena)
+
+### Features
+* Use `<span>` rather than `<div>` for inline-ish widgets (Bartosz Dziewoński)
+* CapsuleMultiselectWidget: Call `updateInputSize` when adding, removing items (Prateek Saxena)
+* DropdownInputWidget: Add support for `optgroup` (Prateek Saxena)
+* FieldLayout: Use `<span>` rather than `<div>` when possible (Bartosz Dziewoński)
+
+### Styles
+* DropdownInputWidget: Tweak PHP widget's disabled styling (Bartosz Dziewoński)
+* NumberInputWidget: Set input to 100% height (Volker E)
+* MediaWiki theme: Add unit to `line-height` for Chrome (Volker E)
+* MediaWiki theme: Align “framed” ButtonWidgets cross-browser (Volker E)
+* MediaWiki theme: Ensure theme color in disabled TextInputWidget on Safari (Volker E)
+* MediaWiki theme: Ensure vertical alignment of dialog top bar items (Volker E)
+* MediaWiki theme: Fix TextInputWidget's IconElement `max-height` (Volker E)
+* MediaWiki theme: Fix appearance of ComboBoxInputWidget PHP (Volker E)
+* MediaWiki theme: Use color palette color for dialog top bar (Volker E)
+* MediaWiki theme: Vertically align label in SelectFileWidget (Volker E)
+
+### Code
+* DropdownInputWidget: Remove accidental patterned background in PHP (Bartosz Dziewoński)
+* MediaWiki theme: Align WindowManager to CSS Coding Guidelines (Volker E)
+* MediaWiki theme: Indicators shouldn't provide global `progressive` flag (Volker E)
+* MediaWiki theme: Simplify Radio- & Checkbox…optionWidget label rules (Volker E)
+* build: Bump various devDependencies to master (James D. Forrester)
+* build: Exclude demos/vendor from composer test too (James D. Forrester)
+* demos: Add ButtonGroupWidget (icon and text) demo (Volker E)
+* demos: Add disabled DropdownInputWidget demo (Bartosz Dziewoński)
+
+
+## v0.19.5 / 2017-03-07
+### Deprecations
+* [DEPRECATING CHANGE] icons: Move 'add' from core to 'interactions' pack (James D. Forrester)
+
+### Features
+* FloatableElement: Add config for `hideWhenOutOfView` (Moriel Schottlender)
+
+### Styles
+* MediaWiki theme: Add visual feedback on focussed Outlined Booklet Dialog (Volker E)
+* OutlinedBookletDialog: Bring visual order into levels (Volker E)
+* icons: Add 'highlight' to 'editing-styling' pack (Moriel Schottlender)
+* icons: Add 'substract' icon, in interactions pack (Volker E)
+* icons: Fix vertical alignment of 'journal' (Volker E)
+* icons: Remove 'teardrop' from MediaWiki theme 'close' icon (Volker E)
+
+### Code
+* CapsuleMultiselectWidget: Update popup position if height changed (Prateek Saxena)
+* ComboBoxInputWidget: Improve documentation example (Bartosz Dziewoński)
+* ListToolGroup: Re-clip when expanding/collapsing (Roan Kattouw)
+* MenuSelectWidget#filterFromInput: Clear MenuSectionOptionWidgets if empty (Roan Kattouw)
+* PopupElement: Set `$floatableContainer` to `this.$element` by default (Roan Kattouw)
+* PopupTool: For bottom toolbars, make the popup go up, like toolgroups (Bartosz Dziewoński)
+* PopupWidget: Make popups able to actually pop *up*, as well as sideways (Roan Kattouw)
+* PopupWidget: Position anchor relative to popup, not popup relative to anchor (Roan Kattouw)
+* TextInputWidget: Fix documentation for 'maxRows' type (Bartosz Dziewoński)
+* Use `options` in ComboBoxInputWidget demo (Moriel Schottlender)
+* Follow-up 442ffe73, 7f21350d, 9dfa5dd5: Mention in icon definitions they're deprecated (James D. Forrester)
+* demos: Make demo consoles LTR, even in the RTL demo (Roan Kattouw)
+* demos: Add demo/test for PopupWidget/PopupButtonWidget placements (Bartosz Dziewoński)
+* demos: Add sections to dialogs demo (Bartosz Dziewoński)
+* demos: Extract widgets, dialogs and layouts from dialogs.js (Bartosz Dziewoński)
+* demos: Reuse some widgets in the dialogs demo (Bartosz Dziewoński)
+* styles: Replace stylelint block with inline comments everywhere (Volker E)
+
+
+## v0.19.4 / 2017-02-28
+### Features
+* Add `OO.ui.Element.static.getScrollLeft` (Bartosz Dziewoński)
+* FloatableElement: Support positioning relative to all edges (Roan Kattouw)
+
+### Styles
+* MediaWiki theme: Align DraggableElement focus with standard appearance (Volker E)
+* MediaWiki theme: Align appearance of PHP DropdownInputWidget to JS (Volker E)
+* MediaWiki theme: Fix TextInputWidget inline label misalignment (Volker E)
+* MediaWiki theme: Fix ToolGroupTool's label alignment (Volker E)
+* MediaWiki theme: Fix button layout in ButtonGroup-/SelectWidgets in IE 9 (Volker E)
+* MediaWiki theme: Fix styling for FieldLayout inside HorizontalLayout (Bartosz Dziewoński)
+* styles: Improve vertical alignment of elements' & widgets' icons (Ed Sanders/Volker E)
+* icons: Add 'feedback' icon, in interactions pack (Roan Kattouw)
+* icons: Add 'searchDiacritic' icon, in editing-advanced pack (Ed Sanders)
+
+### Code
+* Make generic placeholder pseudo-class browser-prefix mixin (Ed Sanders)
+* BookletLayout: When continuous, properly make the inner PageLayouts non-scrollable (Bartosz Dziewoński)
+* Element: Fix `scrollLeft()` for body/html/window (Roan Kattouw)
+* OutlineOptionWidget: Remove unused and misplaced values (Volker E)
+* PopupWidget: Remove `left: 0;` breaking floatable popups (Roan Kattouw)
+* MediaWiki theme: Remove obsolete ComboBoxInputWidget selectors (Volker E)
+* README: Encourage direct release in the instructions (James D. Forrester)
+* build: Test the 'minify' task in CI (James D. Forrester)
+* demos: Add 'label' to ToolGroupTool example (Bartosz Dziewoński)
+* demos: Extract ButtonStyleShowcaseWidget from the demo code (Bartosz Dziewoński)
+* demos: Extract CapsuleNumberPopupMultiselectWidget from the demo code (Bartosz Dziewoński)
+* demos: Extract remaining widgets from widgets.js (Bartosz Dziewoński)
+
+
+## v0.19.3 / 2017-02-21
+### Features
+* FieldLayout, FieldsetLayout: Add support for `$overlay` for help popups (Bartosz Dziewoński)
+* MenuSelectWidget: Add config option to not close on choose (Roan Kattouw)
+
+### Styles
+* MediaWiki theme: Make CapsuleItemWidget behave similar to other widgets (Volker E)
+* MediaWiki theme: SelectFileWidget drop target aligned to UX patterns (Volker E)
+
+### Code
+* BookletLayout: Remove unnecessary overrides (Bartosz Dziewoński)
+* Element#getClosestScrollableContainer: Update code comment (Bartosz Dziewoński)
+* FieldLayout, LabelWidget: If input has no ID, focus on element on label click (Prateek Saxena)
+* PopupWidget (and similar): Document why it is unwise to show unattached widgets, and emit warnings (Bartosz Dziewoński)
+* build: Bump stylelint and make pass (James D. Forrester)
+* demos: Add DropdownWidget (with MenuSectionOptionWidget) (Prateek Saxena)
+* demos: Further improve responsive layout (Volker E)
+* demos: Minor tweaks for button style showcase code (Bartosz Dziewoński)
+* demos: Rename OO.ui.Demo to just Demo (Bartosz Dziewoński)
+* demos: Replace `table` in button style showcase with responsive layout (Volker E)
+* demos: Set the default page in demo.js (Bartosz Dziewoński)
+
+
+## v0.19.2 / 2017-02-14
+### Features
+* CapsuleMultiselectWidget: Make labels work (Prateek Saxena)
+* FloatableElement, PopupWidget: Do positioning from the right in RTL (Roan Kattouw)
+* TextInputWidget: getValidity: Check browser validation first (Prateek Saxena)
+
+### Styles
+* icons: Fix vertical alignment of eye icon (Ed Sanders)
+
+### Code
+* core: Do not clear unrelated flags when clearing 'progressive' (Bartosz Dziewoński)
+* ActionWidget: Remove event listening code for widget's 'resize' event (Prateek Saxena)
+* ClippableElement: Order matters (inexplicably) (Bartosz Dziewoński)
+* demos: Use longer text in popup in $overlay demo (Bartosz Dziewoński)
+
+
+## v0.19.1 / 2017-02-07
+### Features
+* Dialog: Support meta as well as ctrl for modifier on enter key (David Lynch)
+
+### Styles
+* FieldLayout: Fix styling for disabled widgets in PHP (Bartosz Dziewoński)
+* MediaWiki theme: Align tab navigation to color palette (Volker E)
+* MediaWiki theme: Fix RTL version of largerText icon to be, well, RTL (James D. Forrester)
+* MediaWiki theme: Fix direction of shadow on position:bottom toolbars (Ed Sanders)
+* MediaWiki theme: Use correct `border-color` on PopupWidget anchor (Volker E)
+* Mediawiki theme: Fix focus inset to overlap scrollbars (Volker E)
+* icons: Provide a 'halfStar' vertical split star (codynguyen1116)
+
+### Code
+* CheckboxMultiselectInputWidget: Allow disabling specific options (Huji Lee)
+* DraggableGroupElement: Add mandatory ARIA role (Volker E)
+* FieldLayout: Move `<label>` from `$body` to `$label` (Bartosz Dziewoński)
+* FieldLayout: Remove the need for `simulateLabelClick` (Prateek Saxena)
+* InputWidget: Fix 'id' attribute setting for `<label>` (Bartosz Dziewoński)
+* LabelWidget: Remove the need for `simulateLabelClick` (Prateek Saxena)
+* Toolbar: Make toolbar position selectors more specific (Ed Sanders)
+* WindowManager: Clarify `#addWindows` documentation (Bartosz Dziewoński)
+* Windows: Use the "recommended" `WindowManager#addWindows` usage (Bartosz Dziewoński)
+* Apex theme: Get rid of toolbar-shadow div (only used by Apex) (Ed Sanders)
+* MediaWiki theme: Remove unnecessary `font-weight` property (Volker E)
+* build: Bump various dev dependencies to latest (James D. Forrester)
+* colorize-svg: Colorize using a method compatible with rsvg (Bartosz Dziewoński)
+* demos: Load icons stylesheets with correct directionality (LTR/RTL) (Bartosz Dziewoński)
+* demos: Follow-up a02979ad: Load the icons-content pack in the PHP demo (James D. Forrester)
+* demos: Remove 'Constructive' button from the icons page (Prateek Saxena)
+* demos: Add link to documentation (Prateek Saxena)
+* demos: Fix regression on toolbars demo (Volker E)
+* docs: Add quotes around `PROJECT_NAME` setting (Ricordisamoa)
+* docs: Document for JSDuck various overridden inherited properties (Bartosz Dziewoński)
+* docs: Fix `OO.ui.prompt()` documentation (Bartosz Dziewoński)
+* docs: Set `.static.name` in all dialog examples that need it (Bartosz Dziewoński)
+
+
+## v0.19.0 / 2017-01-31
+### Breaking changes
+* [BREAKING CHANGE] ButtonWidget: Switch `box-sizing` over to `border-box` (Volker E)
+* [BREAKING CHANGE] LabelElement: Drop no-op fitLabel() method. (James D. Forrester)
+* [BREAKING CHANGE] WindowManager: Error if `.static.name` is not defined when adding a window (Bartosz Dziewoński)
+
+### Features
+* PopupButtonWidget: Add `$overlay` config option (Bartosz Dziewoński)
+* SelectWidget: Allow OptionWidget subclasses to provide custom match text (Roan Kattouw)
+* Toolbar: Support `position:bottom` (Ed Sanders)
+
+### Styles
+* CapsuleMultiselectWidget: Fix focussing when inside BookletLayout with popup (Bartosz Dziewoński)
+* CapsuleMultiselectWidget: Styling tweaks related to popups (Bartosz Dziewoński)
+* MenuSelectWidget: Override ClippableElement's `min-height` (Bartosz Dziewoński)
+* PopupWidgets: Unify paddings and line-height (Bartosz Dziewoński)
+* TextInputWidget/MediaWiki theme: Revert "Improve Less code and align labels" (Bartosz Dziewoński)
+* PanelLayout/Apex theme: Revert regression (Volker E)
+
+### Code
+* CapsuleMultiSelectWidget: Call correct parent constructor (Ricordisamoa)
+* CapsuleMultiselectWidget: Make popup really work with $overlay (Bartosz Dziewoński)
+* FieldsetLayout: Swap 'max-width' and 'width' (Bartosz Dziewoński)
+* FloatableElement: More correctly decide if we need custom position (Bartosz Dziewoński)
+* MenuSelectWidget: Hide menu if all items are hidden (Bartosz Dziewoński)
+* ProcessDialog: Account for `config.flags` being undefined (Ed Sanders)
+* Follow-up 1dc6a45: {Booklet,Index}Layout: Avoid deprecated `config.complete` (Roan Kattouw)
+* Follow-up d21cf8a: unbreak popups with no $floatableContainer (Roan Kattouw)
+* PHP: Avoid unique ID conflicts between PHP and JS code (Bartosz Dziewoński)
+* demos: Failing demo for DropdownWidget with an overlay (Roan Kattouw)
+* demos: Fix vertical spacing in icons demo (Bartosz Dziewoński)
+* demos: Improve layout on mobile and fix various glitches (Volker E)
+* demos: Make the icon page easier to use (Prateek Saxena)
+* demos: Use longer text in PopupWidgets to showcase line wrapping (Bartosz Dziewoński)
+
+
+## v0.18.4 / 2017-01-17
+### Deprecations
+* [DEPRECATING CHANGE] MessageDialog: Default 'verbose' option to true (James D. Forrester)
+* Follow-up 1dc6a45: Emit deprecations from Element#scrollIntoView callback (James D. Forrester)
+* Follow-up 4518bcf: Emit deprecation warnings for LabelElement#fitLabel (James D. Forrester)
+* Follow-up 574fd34: Emit deprecations for use of CapsuleMultiSelectWidget (James D. Forrester)
+* Follow-up ea9a4ac: Throw deprecation warnings for TextInputMenuSelectWidget (James D. Forrester)
+* Follow-up f69a2ad: Emit deprecations for old PopupWidget#setAlignment values (James D. Forrester)
+
+### Features
+* CapsuleMultiSelectWidget: Add allowDuplicates option (Brad Jorsch)
+* CapsuleMultiSelectWidget: Remove onFocusForPopup, call focus directly (Roan Kattouw)
+* ClippableElement: Add `min-height` for usability in edge cases (Volker E)
+* TextInputWidget: Disable hiding focus when clicking indicator/label (Volker E)
+
+### Styles
+* ActionFieldLayout: Limit the 'max-width: 50em' to align: top (Bartosz Dziewoński)
+* ButtonGroupWidget: Limit default cursor to active ButtonWidgets (Volker E)
+* FieldLayout, FieldsetLayout: Limit width of label+help to 50em (Bartosz Dziewoński)
+* FieldLayout: Correct styling regressions for align: 'inline' (Bartosz Dziewoński)
+* FieldLayout: Fix positioning of 'help' with align: left/right (Bartosz Dziewoński)
+* MediaWiki theme: Unify box-shadows to one visual appearance (Volker E)
+* PanelLayout: Remove 3D appearance of framed panels and harmonise padding (Volker E)
+* PopupWidget: Change margins to prevent click blocking (Ed Sanders)
+
+### Code
+* ClippableElement: Also clean up `maxWidth`, `maxHeight` when turning clipping off (Bartosz Dziewoński)
+* Element#updateThemeClasses: Batch `setTimeout()` calls (Bartosz Dziewoński)
+* MediaWiki theme: Use variable for disabled ProgressBar (Volker E)
+* PopupWidget#setAlignment: Tweak docs to indicate default parameter value (James D. Forrester)
+* PHP: Add method Tag::generateElementId() to match JS OO.ui.generateElementId() (Bartosz Dziewoński)
+* styles: Improve and clarify GPU composite layer mixin (Volker E)
+* demos: Add a LabelWidget that has a corresponding TextInputWidget (Prateek Saxena)
+* demos: Add lots more FieldLayout demos (Bartosz Dziewoński)
+* demos: Add test for ClippableElements at the bottom of their containers (Prateek Saxena)
+* docs: Use 'an' instead of 'a' before 'HTML' (Prateek Saxena)
+* docs: Include an i18n example in OO.ui.msg documentation (David Lynch)
+* tests: Improve ignoring expected differences in JS/PHP comparison tests (Bartosz Dziewoński)
+* tests: Tweaks to the display of failed tests (Bartosz Dziewoński)
+* testsuitegenerator: Allow testing LabelWidget's 'input' (Bartosz Dziewoński)
+* testsuitegenerator: Specify sensible values to test for 'align' (Bartosz Dziewoński)
+* testsuitegenerator: Test FieldLayout etc. also with TextInputWidget (Bartosz Dziewoński)
+
+
+## v0.18.3 / 2017-01-03
+### Deprecations
+* [DEPRECATING CHANGE] icons: Deprecate the 'beta' and 'ribbonPrize' icons (James D. Forrester)
+* [DEPRECATING CHANGE] icons: Rename '*Undo' to 'un*' (James D. Forrester)
+* [DEPRECATING CHANGE] icons: Rename 'betaLaunch' to 'logoWikimediaDiscovery', move pack (James D. Forrester)
+
+### Features
+* ComboBoxInputWidget: Make it impossible to set `multiline` to true (Prateek Saxena)
+* Introduce `OO.ui.isMobile()` (Ed Sanders)
+* Provide `OO.ui.prompt()` method to complement `confirm()`/`alert()` (Ed Sanders)
+
+### Styles
+* FloatableElement: Replace superfluous class with general one (Volker E)
+* MediaWiki theme: Change custom error border color to `destructive` (Volker E)
+* MediaWiki theme: Change error/invalid color to alias of `destructive` (Volker E)
+* MediaWiki theme: Fix PHP CheckboxMultiselectInputWidget/RadioSelectInputWidget option spacing (Bartosz Dziewoński)
+* MediaWiki theme: Indicate normal, flagged ButtonWidgets' `:hover` clearer (Volker E)
+* MediaWiki theme: Set `line-height` explicitly on legends and labels (Volker E)
+
+### Code
+* BarToolGroup: Remove obsolete CSS selectors (Volker E)
+* ClippableElement: Compatibility with jQuery 3 (Bartosz Dziewoński)
+* Element: Do not try to scroll invisible/unattached elements into view (Bartosz Dziewoński)
+* LabelWidget: Properly hide labels if they are set to null (Ed Sanders)
+* NumberInputWidget: Avoid bitwise tricks when checking for integers (Bartosz Dziewoński)
+* PopupButtonWidget: Remove unnecessary CSS property (Volker E)
+* ProgressBarWidget: Use CSS transforms for indeterminate widget (Bartosz Dziewoński)
+* TextInputWidget: Do nothing in `#adjustSize`/`#positionLabel` if not attached (Bartosz Dziewoński)
+* TextInputWidget: Only call `#onElementAttach` on focus if it wasn't called (Bartosz Dziewoński)
+* TextInputWidget: Use `Element#isElementAttached` (Bartosz Dziewoński)
+* styles: Replace `transform` with dedicated mixin (Volker E)
+* MediaWiki theme: Make `box-shadow` LESS vars follow naming scheme (Volker E)
+* MediaWiki theme: Simplify frameless ButtonWidget selectors (Volker E)
+* performance: Apply webkit GPU hack to scrollable panels (Ed Sanders)
+* demos: Add disabled Progress bar (Volker E)
+* demos: Add examples for `OO.ui.alert()`/`confirm()`/`prompt()` (Bartosz Dziewoński)
+* demos: Avoid using 'required' as a test indicator (Ed Sanders)
+* build: Bump file copyright notices for 2017 (James D. Forrester)
+* docs: Fix small typo (Amir Sarabadani)
+
+
+## v0.18.2 / 2016-12-06
+### Styles
+* MediaWiki theme: Address sub-pixel rendering issues of RadioInputWidgets (Volker E)
+* MediaWiki theme: Improve `:active:focus` states on ButtonElements (Volker E)
+* MediaWiki theme: Reduce MapPin icons' hole for better recognisability (Volker E)
+
+### Code
+* FieldsetLayout: Temporarily remove use of `<legend>` due to Chrome 55 bug (Bartosz Dziewoński)
+* TextInputWidget/MediaWiki theme: Improve Less code and align labels (Volker E)
+
+
+## v0.18.1 / 2016-11-29
+### Features
+* PopupElement: Allow $autoCloseIgnore to be overridden (Roan Kattouw)
+* WindowManager: Allow $returnFocusTo to be null (Ed Sanders)
+
+### Styles
+* MediaWiki theme: Reduce, align `margin` and `padding` of form elements (Volker E)
+* MediaWiki theme: Replace color function with palette color (Volker E)
+* MediaWiki theme: Standard placeholder colours for CapsuleMultiselectWidget too (Bartosz Dziewoński)
+* MediaWiki theme: Tweak destructive red for background-independent contrast (Volker E)
+
+### Code
+* Field & Fieldset: Make help popup code consistent (Ed Sanders)
+* PopupWidget: Consistently use OO.ui.contains() for auto-closing (Roan Kattouw)
+* build: Bump eslint-config-wikimedia to v0.3.0 and make pass (James D. Forrester)
+* eslint: Re-enable wrap-iife and partially enable dot-notation (Ed Sanders)
+
+
+## v0.18.0 / 2016-11-08
+### Breaking changes
+* [BREAKING CHANGE] ComboBoxWidget: Remove this deprecated alias for ComboBoxInputWidget (James D. Forrester)
+* [BREAKING CHANGE] core: Remove {add|remove}CaptureEventListener (James D. Forrester)
+* [BREAKING CHANGE] icons: Remove deprecated alias 'photoGallery' (Ed Sanders)
+* [BREAKING CHANGE] InputWidget: Remove deprecated #setRTL function (James D. Forrester)
+* [BREAKING CHANGE] MediaWiki theme: Remove deprecated `constructive` variables (Volker E)
+* [BREAKING CHANGE] TextInputWidget: remove isValid() method, deprecated since v0.12.3 (Ricordisamoa)
+
+### Deprecations
+* [DEPRECATING CHANGE] Break out parts of TextInputWidget into a new SearchInputWidget (Prateek Saxena)
+
+### Features
+* ButtonElement: Add `role="button"` only when needed (Prateek Saxena)
+* ButtonWidget: Remove code to not let the button get focus after clicking (Prateek Saxena)
+* CapsuleMultiselectWidget: Add placeholder option (Prateek Saxena)
+* CapsuleMultiselectWidget: Don't discard current input value when editing an item (Bartosz Dziewoński)
+* ComboBoxInputWidget: Hide dropdown indicator when there is no dropdown (Volker E)
+* TextInputWidget: Add methods #setRequired / #isRequired (Bartosz Dziewoński)
+* TextInputWidget: Allow type="month" (Geoffrey Mon)
+* WindowManager: Add a $returnFocusTo property (Prateek Saxena)
+* Add OO.ui.warnDeprecation method (Prateek Saxena)
+
+### Styles
+* ButtonElement: Normalize `:focus` appearance in Firefox (Volker E)
+* ButtonGroupWidget: Change `cursor` on `.oo-ui-buttonElement-active` (Volker E)
+* CapsuleItemWidget: Make interactivity of label clearer (Volker E)
+* ComboBoxInputWidget: Align to design specification (Volker E)
+* PopupToolGroup: Fix border colour (Ed Sanders)
+* MessageDialog: Improve `-actions` buttons by resetting `border-radius` (Volker E)
+* SelectFileWidget: Don't show action-indicating cursor on empty state (Volker E)
+* MediaWiki theme: Fix border colours in toolbar (Ed Sanders)
+* MediaWiki theme: Address subpixel rendering errors in buttoned widgets (Volker E)
+* MediaWiki theme: Align readonly TextInputWidget to overhauled color palette (Volker E)
+* MediaWiki theme: Fix `:hover` in ComboBoxInput- & CapsuleMultiselectWidget (Volker E)
+* MediaWiki theme: Fix ButtonElement's `:active:focus` state visually (Volker E)
+* MediaWiki theme: Fix FieldsetLayouts' icon position (Volker E)
+* MediaWiki theme: Fix SelectFileWidget's label visibility in IE11 (Volker E)
+* MediaWiki theme: Fix visual glitch CheckboxInputWidget's `:active` state (Volker E)
+* MediaWiki theme: Fix visual glitch on `:active:focus` widgets state (Volker E)
+* MediaWiki theme: Fix wrong colored `box-shadow` on ToggleSwitchWidget (Volker E)
+* MediaWiki theme: Make colors follow color palette (Volker E)
+* MediaWiki theme: Make placeholder follow WCAG 2.0 level AA contrast ratio (Volker E)
+* MediaWiki theme: Replace abandoned color from early palette iteration (Volker E)
+* MediaWiki theme: Use `@color-progressive` for progress bar (Volker E)
+* MediaWiki theme: Use `color-progressive` for switched-on binary inputs (Volker E)
+* icons: Replace bigger/smaller with more obvious forms (Ed Sanders)
+
+### Code
+* CapsuleMultiSelectWidget: Always keep input as wide as placeholder text (Prateek Saxena)
+* CapsuleMultiselectWidget: Fix crash on right-click when no input (Moriel Schottlender)
+* OutlineOptionWidget: Follow-up de9058299f: don't duplicate parent's logic (Roan Kattouw)
+* Toolbar: Defer computation of the narrow threshold (Roan Kattouw)
+* Window: Update `-content` CSS so that child elements can give it focus (Prateek Saxena)
+* Window#withoutSizeTransitions: Build transition property using sub-properties (Prateek Saxena)
+* WindowManager: Warn if .static.name is not defined when adding a window (Bartosz Dziewoński)
+* Tag: Generate valid HTML for self-closing tags (Bartosz Dziewoński)
+* OO.ui.warnDeprecation: Fix how we use getProp (Prateek Saxena)
+* MediaWiki theme: Add W3C Standards Notation for placeholder pseudo class (Volker E)
+* MediaWiki theme: Clarify usage of `@max-width-*` Less variables (Volker E)
+* MediaWiki theme: Refactor z-index inside ButtonSelectWidget/ButtonGroupWidget (Bartosz Dziewoński)
+* demo: Add FieldsetLayout with icon (Bartosz Dziewoński)
+* demo: Align to color palette (Volker E)
+* demo: Fix for IE 9 (Bartosz Dziewoński)
+* demo: Remove deprecated TextInputWidget (type=search) (Volker E)
+* demo: Fix PHP demo directionality (Bartosz Dziewoński)
+* demo: Remove PHP 5.3 compatibility, version check and PHPCS exception (Bartosz Dziewoński)
+* build: Make MediaWiki the default theme in doc live previews (Ed Sanders)
+* build: Remove obsolete csscomb rules (Volker E)
+* build: Remove upstreamed rules and fix documentation (Ed Sanders)
+* build: Update eslint-config-wikimedia to v0.2.0 (Ed Sanders)
+
+## v0.17.10 / 2016-10-03 (special release)
+### Styles
+* FieldsetLayout: Styling fixes for `<legend>` labels (Bartosz Dziewoński)
+* FieldsetLayout: Work around positioning problems in Firefox (Bartosz Dziewoński)
+
+## v0.17.9 / 2016-09-13
+### Features
+* DropdownWidget: Add CSS class to widgets with open dropdown menus (Volker E)
+* SelectFileWidget: Remove MIME type information (Volker E)
+* TextInputWidget: Make disabled fields' inner labels unselectable (Volker E)
+
+### Styles
+* ActionToolGroup: Show left border, instead of right (Ed Sanders)
+* ButtonElement: Centralize styling properties (Volker E)
+* ButtonOptionWidget: Make active state carry default cursor (Volker E)
+* Radio- and CheckboxInputWidget: Fix visual disabled state on labels (Volker E)
+* ToggleButtonWidget: Use inverted variant when initially active (Leszek Manicki)
+
+* MediaWiki theme: Adjust CheckboxInputWidget to match M30 design (Volker E)
+* MediaWiki theme: Adjust RadioInputWidget to match M29 design (Volker E)
+* MediaWiki theme: Align Dropdown- & CapsuleMultiSelectWidget `:focus` state (Volker E)
+* MediaWiki theme: Align disabled text contrast to WCAG compliance (Volker E)
+* MediaWiki theme: Enhance button styles and align them to new color palette (Volker E)
+* MediaWiki theme: Fix ButtonElement-active on flagged & primary buttons (Volker E)
+* MediaWiki theme: Fix `:hover` state of ComboBoxInputWidget (Volker E)
+* MediaWiki theme: Fix regression on `border` of active (selected) buttons (Volker E)
+* MediaWiki theme: Improve appearance of CapsuleMultiselectWidget with child (Volker E)
+* MediaWiki theme: Make ToggleSwitchWidget's disabled state follow enabled (Volker E)
+* MediaWiki theme: Make colors' contrast compliant to WCAG 2.0 level AA (Volker E)
+* MediaWiki theme: Toolbar: Use progressive colors for active and active-hover (Prateek Saxena)
+* MediaWiki theme: Unify `-pressed` and `-emphasized` color var (Volker E)
+* MediaWiki theme: Unify different widgets' selected menu state (Volker E)
+* MediaWiki theme: Use a solid border for disabled SelectFile drop target (Volker E)
+
+### Code
+* FieldsetLayout: Make use of `<fieldset>` and `<legend>` tags (Volker E)
+* NumberInputWidget: Clean-up Less code & remove style properties (Volker E)
+* NumberInputWidget: Simplify CSS selectors & fix button text alignment (Volker E)
+* TextInputWidget: Treat `rows: 0` the same in PHP and in JS (Bartosz Dziewoński)
+* Toolbar: Simplify and concatenate selectors (Volker E)
+* MediaWiki theme: Align tools' variables to common vars naming convention (Volker E)
+* MediaWiki theme: Clean-up unnecessary properties in ToolGroup (Volker E)
+* build: Align csscomb configuration with CSS coding conventions (Volker E)
+* build: Introduce eslint to replace jshint and jscs (James D. Forrester)
+* build: Limit the file list of jsonlint (Ed Sanders)
+* build: Remove jshint and jscs, now done in eslint (James D. Forrester)
+* docs: IndexLayout: Fix ReferenceError in code sample (Prateek Saxena)
+* git: Add .idea directory to .gitignore (Florian)
+* testsuitegenerator: Also support 'int' and 'bool' (Bartosz Dziewoński)
+* testsuitegenerator: Simplify code generating all possible config options (Bartosz Dziewoński)
+
+
+## v0.17.8 / 2016-08-16
+### Features
+* ProgressBarWidget: Do not make zero progress indeterminate (Leszek Manicki)
+* ProgressBarWidget: Add PHP version (Leszek Manicki)
+* TextInputWidget: Show state as valid (no matter the case) on focus (Prateek Saxena)
+
+### Styles
+* ButtonElement: Fix 'active' state icon variants in MediaWiki theme (Bartosz Dziewoński)
+* FieldLayout: Use saner line-height for errors/notices (Bartosz Dziewoński)
+* SelectFileWidget: Improve thumbnail appearance (Volker E)
+* styles: Inherit specific `font` properties, not all (Volker E)
+* MediaWiki theme: Clear border on selected framed buttons (Volker E)
+* MediaWiki theme: Fix ButtonWidget (frameless, indicator) `:focus` appearance (Volker E)
+* MediaWiki theme: Fix ToggleSwitchWidget's sub-pixel rounding errors (Volker E)
+
+
+### Code
+* MediaWiki theme: Improve CapsuleMultiselectWidget Less code and behaviour (Volker E)
+* MediaWiki theme: Improve DropdownWidget Less code and behaviour (Volker E)
+* MediaWiki theme: Removing never applied styles on BarToolGroup (Volker E)
+* MediaWiki theme: Simplify ToolGroup selectors (Volker E)
+* testsuitegenerator: Specify sensible values to test for 'progress' (Bartosz Dziewoński)
+
+
+## v0.17.7 / 2016-08-03
+### Styles
+* MediaWiki theme: Apply `border-color` on `:hover` to textInputWidgets (Volker E)
+* MediaWiki theme: Decrease `margin`/`padding` on `legend` replacement (Volker E)
+* MediaWiki theme: Decrease distance between label and Checkbox*-/Radio*Widget (Volker E)
+* MediaWiki theme: Improve UX on ToggleSwitchWidget (Volker E)
+* icons: Fix vertical alignment of 'bell' by moving up 1px (Ed Sanders)
+* icons: Provide a 'tray' icon in alerts pack (James D. Forrester)
+* icons: Provide the alerts pack for Apex theme too (James D. Forrester)
+
+### Code
+* CheckboxMultiselectWidget: Rewrite Shift-clicking code (Bartosz Dziewoński)
+* NumberInputWidget: Merge object literals being passed as config for buttons (Prateek Saxena)
+* SelectFileWidget: Reduce div soup when 'showDropTarget' is enabled (Prateek Saxena)
+* styles: Replace unprefixed `box-sizing` property with mixin (Volker E)
+* MediaWiki theme: Disable vendor UI extensions on every `type=number` input (Volker E)
+* MediaWiki theme: Remove unnecessary toolGroup selector (Volker E)
+* MediaWiki theme: Replace `border` property values with Less variables (Volker E)
+* MediaWiki theme: Replace static `color` value with Less variable (Volker E)
+* build: Add 'prep-test' task to be run before running tests in the browser (Prateek Saxena)
+* build: Align to stylelint-config-wikimedia for `!important` (James D. Forrester)
+* build: Align to stylelint-config-wikimedia for string quotes (James D. Forrester)
+* build: Bump stylelint-related devDependencies to latest (James D. Forrester)
+* build: Downgrade grunt-jscs to 2.8.0 to avoid cst bug (James D. Forrester)
+* docs: Correct some code comments in PHP mixins (Bartosz Dziewoński)
+* standalone tests: Correct error message (Bartosz Dziewoński)
+
+
+## v0.17.6 / 2016-07-12
+### Features
+* CapsuleMultiselectWidget: Allow ignoring user input for 'allowArbitrary' widgets (Bartosz Dziewoński)
+* Dialog: Set the 'title' attribute on the title LabelWidget (Prateek Saxena)
+* ToolFactory: Allow '\*' as an item in a toolgroup include list (Ed Sanders)
+* Window: make the focus trap smarter (David Lynch)
+
+### Styles
+* Add aria-hidden to several Layouts (David Lynch)
+* Add dialog transition duration to theme JS file (Ed Sanders)
+* ButtonGroupWidget: Fix border on button's CSS states (Volker E)
+* MediaWiki theme: Normalize [placeholder] appearance x-browser and ensure a11y (Volker E)
+* MediaWiki theme: Unify ButtonWidget focus `border-radius` values (Volker E)
+* styles: Set `line-height` to unitless values to follow best practice (Volker E)
+* icons: Give "Stop" a filled background, aligned with others in the pack (Volker E)
+* icons: Unify cross-out lines direction to top-left/bottom-right (Volker E)
+
+### Code
+* README: Replace git.wikimedia.org URL with Phabricator one (Paladox)
+* build: Bump stylelint devDependencies to latest (James D. Forrester)
+* build: Update karma and karma-coverage to latest (Paladox)
+* demo: Dialogs: Removing title from SimpleDialog as it'll never show (Prateek Saxena)
+* docs: Remove self-closing tag syntax in comments and demos (Volker E)
+* docs: LabelWidget: Add TitledElement mixin (Prateek Saxena)
+* package: Replace git.wikimedia.org url with diffusion url (Paladox)
+
+
+## v0.17.5 / 2016-06-19
+### Styles
+* Dropdown,SelectFileWidget: Improve user experience on disabled widgets (Volker E)
+* MediaWiki theme: Fix ToggleSwitchWidget's grip circle shape (Volker E)
+* MediaWiki theme: Fix focus states of ActionWidget's buttons (Volker E)
+* MediaWiki theme: Improve focus states of primary buttons & ToggleSwitchWidget (Volker E)
+
+### Code
+* DraggableGroupWidget: Remove unnecessary `cursor` property (Volker E)
+* GroupElement#removeItems: Fix to actually unbind events (Ed Sanders)
+* ProcessDialog: Change DOM ordering of actions (David Lynch)
+* MediaWiki theme: Remove `line-height` from TextInputWidget `input` (Volker E)
+* MediaWiki theme: Remove obsolete `color` property, which never gets applied (Volker E)
+* build: Bump devDependencies to latest and make pass (James D. Forrester)
+* composer: Exclude copied demo PHP from phpcs test (James D. Forrester)
+* demos: Add descriptive hints on navigation types to dialog names (Volker E)
+
+
+## v0.17.4 / 2016-05-31
+### Features
+* DropdownWidget: Handle type-to-search when menu is not expanded (Bartosz Dziewoński)
+* Implement MultiselectWidget, CheckboxMultiselectWidget and CheckboxMultiselectInputWidget (Bartosz Dziewoński)
+* SelectWidget: Improve focus behaviour (Bartosz Dziewoński)
+
+### Styles
+* icons: Use B/I/S/U icons for British and Candian English variants (Ed Sanders)
+* MediaWiki theme: Provide an adjacent disabled ButtonGroup/SelectWidget button border (Volker E)
+* MediaWiki theme: Make iconed and non-iconed buttons have the same height (Roan Kattouw)
+
+### Code
+* ButtonElement: Remove unnecessary inheritance duplication of `display` (Volker E)
+* GroupWidget: Mix in GroupElement, rather than inherit from it (Bartosz Dziewoński)
+* LookupElement: Add missing `@mixins` documentation (Bartosz Dziewoński)
+* SelectWidget: Implement `#getFirstSelectableItem` in terms of `#getRelativeSelectableItem` (Bartosz Dziewoński)
+* SelectWidget: Optimize `#getRelativeSelectableItem` without filter (Bartosz Dziewoński)
+* styles: Remove unnecessary CSS rules on disabled buttons (Volker E)
+* styles: Simplify disabled `.oo-ui-tool-link` rules (Volker E)
+
+
+## v0.17.3 / 2016-05-24
+### Deprecations
+* [DEPRECATING CHANGE] CapsuleMultiSelectWidget: Rename to CapsuleMultiselectWidget (Bartosz Dziewoński)
+
+### Features
+* SelectWidget/OptionWidget: Implement selecting by accesskey (Bartosz Dziewoński)
+* TextInputWidget: Stop returning 'multiline' from 'getSaneType' (Prateek Saxena)
+
+### Styles
+* SelectFileWidget: Improve consistency to other widgets (Volker E)
+* MediaWiki theme: Align styles of normal and not-supported SelectFileWidgets (Volker E)
+
+### Code
+* CapsuleMultiselectWidget: Prefer Array#map to jQuery.map (Bartosz Dziewoński)
+* CapsuleMultiselectWidget: Use OO.ui.findFocusable() (Bartosz Dziewoński)
+* dependencies: Update es5-shim to v4.5.8 (James D. Forrester)
+* build: Bump grunt-stylelint to v0.3.0 (James D. Forrester)
+* build: Bump various devDependencies to latest (James D. Forrester)
+* build: Fix watch path for css (Ed Sanders)
+* build: Remove grunt-cli (Ed Sanders)
+* build: Upgrade stylelint-config-wikimedia to 0.2.0 and make pass (James D. Forrester)
+* build: Use stylelint instead of csslint (Volker E)
+* docs: Add some missing @mixins documentation (Bartosz Dziewoński)
+* stylelint: Add `@` whitespace and name case rules (Volker E)
+* stylelint: Add `@media` whitespace rules (Volker E)
+* stylelint: Add block formatting rules (Volker E)
+* stylelint: Add font rules (Volker E)
+* stylelint: Add no duplicate property rule (Volker E)
+* stylelint: Add selector whitespace (Volker E)
+* stylelint: Add whitespace rules (Volker E)
+* stylelint: Change to use central Wikimedia configuration (Volker E)
+* stylelint: Use null instead of false to disable rules (Ed Sanders)
+
+
+## v0.17.2 / 2016-05-10
+### Features
+* ButtonWidget: Implement, document and demonstrate the 'active' config option (Bartosz Dziewoński)
+
+### Styles
+* ToggleSwitchWidget: Align focus state with other widgets (Volker E)
+* MediaWiki theme: Remove `border-radius` from disabled numberInputWidget buttons (Volker E)
+
+### Code
+* TextInputWidget: Remove proprietary `<input results>` attribute styles (Volker E)
+* MediaWiki theme: Align `input` & `textarea` coding style to Less way (Volker E)
+
+
+## v0.17.1 / 2016-05-03
+### Styles
+* CapsuleMultiSelectWidget: Fix cross-browser inconsistencies and improve UX (Volker E)
+* SelectFileWidget: Add `no-drop` cursor where it belongs (Volker E)
+* MediaWiki theme: Align focus state of capsuleItemWidget with other widgets (Volker E)
+* MediaWiki theme: Custom `:focus` state for SelectWidgets (Bartosz Dziewoński)
+* MediaWiki theme: Standardize `:focus` states of ButtonWidgets (Volker E)
+
+### Code
+* DraggableGroupElement: Simplify and improve drag logic (Ed Sanders)
+
+
+## v0.17.0 / 2016-04-26
+### Breaking changes
+* [BREAKING CHANGE] PHP: Use traits instead of custom mixin system (Kunal Mehta)
+* [BREAKING CHANGE] TitledElement.php: Remove $element::$title fallback (Kunal Mehta)
+
+### Styles
+* MenuToolGroup: Correct display of checkmarks (Bartosz Dziewoński)
+* OutlineOptionWidget: Correct the size of the icons (David Lynch)
+* OutlineOptionWidget: Don't apply italics to "placeholder" status (James D. Forrester)
+* SelectFileWidget: Fix UI glitches on over-long filenames (Volker E)
+* TabOptionWidget: Disabled OptionWidget should receive default cursor (Volker E)
+* styles: Add fullScreen icon to media group (Ed Sanders)
+
+### Code
+* ButtonElement.php: Fix toggleFramed() to actually be chainable (Bartosz Dziewoński)
+* GroupElement::$targetPropertyName: Remove, no longer needed (Kunal Mehta)
+* IconElement.php: Rename protected "icon" property (Kunal Mehta)
+* IndicatorElement.php: Rename protected "indicator" property (Kunal Mehta)
+* LabelElement.php: Rename protected "label" property (Kunal Mehta)
+* build: Update grunt-svg2png to v0.2.7-wmf.1 (Paladox)
+* demos: Split off demos.php from widgets.php (Bartosz Dziewoński)
+* docparser: Remove commented-out line of code (Bartosz Dziewoński)
+* styles: Factor out `max-width-input-default` variable (Volker E)
+
+
+## v0.16.6 / 2016-04-19
+### Features
+* ButtonOptionWidget: Inherit OptionWidget, not DecoratedOptionWidget (Bartosz Dziewoński)
+* ClippableElement: Gracefully handle failure to call clip() after natural height change (Roan Kattouw)
+* NumberInputWidget: Disable onWheel action unless the widget has focus (Bartosz Dziewoński)
+* NumberInputWidget: Disable onWheel action when the widget is disabled (Prateek Saxena)
+* NumberInputWidget: Use input type="number" (Prateek Saxena)
+* TextInputWidget: Allow type="number" (Prateek Saxena)
+* TextInputWidget: Set step to 'any' if the type is set to 'number' (Prateek Saxena)
+* styles: Give icons, indicators `min-width/-height` for cross-browser support (Volker E)
+
+### Styles
+* Apex, MediaWiki themes: Properly center PopupButtonWidget anchors (Roan Kattouw)
+* MediaWiki theme: Use disabled color variable for disabled label (Volker E)
+* styles: Use transparent rather than white in icons (Bartosz Dziewoński)
+
+### Code
+* SelectFileWidget: Merge identical CSS rules (Volker E)
+* SelectFileWidget: Simplify CSS selector specificity (Volker E)
+* TextInputWidget: Clarify comment about affected browsers (Volker E)
+* TextInputWidget: Consolidate selectors with the same property rules (Volker E)
+* TextInputWidget: Stop claiming to fire non existent events in the documentation (Prateek Saxena)
+* styles: Centralise the width/height properties of icons and indicators (Volker E)
+* Apex theme: Change variable names to match MediaWiki theme (Bartosz Dziewoński)
+* README: Update with new build process (Matthew Flaschen)
+* typo: texfield -> textfield (Derk-Jan Hartman)
+
+
+## v0.16.5 / 2016-04-07
+### Styles
+* Prevent modal windows from exceeding available height on Firefox (Bartosz Dziewoński)
+* Apex, MediaWiki themes: Add "articles" icon (Marc A. Pelletier)
+* DropdownInputWidget: Give un-infused widget cursor:pointer (Ed Sanders)
+* RadioSelectInputWidget: Match PHP styling to JS (Bartosz Dziewoński)
+
+### Code
+* ComboBoxInputWidget: Disable autocomplete by default (James D. Forrester)
+* GroupElement: Add change event (Prateek Saxena)
+* GroupElement.php: Use strict mode in array_search (James D. Forrester)
+* styles: Lower specifity of CSS type attribute selectors (Volker E)
+* styles: Minor cleanup and unification of values and comments (Volker E)
+* styles: Remove unnecessary `resize` property from `select` (Volker E)
+* MediaWiki theme: Exchange `rgba()` with hex CSS colors to support IE 8 (Volker E)
+* MediaWiki theme: Replace fixed CSS property values with variables (Volker E)
+* RadioSelectInputWidget: Don't try to reuse DOM when infusing (Bartosz Dziewoński)
+* TextInputWidget: Use getValidity in demos (Ricordisamoa)
+* Window: Correct documentation (Bartosz Dziewoński)
+* build: Add browserNoActivityTimeout to karma (Paladox)
+* build: For grunt-svg2png use a tag instead of git hash (Paladox)
+* build: Update demos script to also run grunt publish-build (Paladox)
+* build: Use a version of grunt-svg2png without a rate-limited CDN (Paladox)
+
+
+## v0.16.4 / 2016-03-22
+### Features
+* NumberInputWidget: Optionally don't show the increment buttons (Thalia Chan)
+
+### Styles
+* NumberInputWidget: Fix rounded corners when showButtons=false (Ed Sanders)
+
+### Code
+* core: Add tests for throttle (David Lynch)
+* Tag: Allow appendContent and prependContent to accept an array (Moriel Schottlender)
+* LabelElement: Cast label to string before check if it is empty (Florian)
+* README.md: Add note about needing composer, clean up more generally (James D. Forrester)
+* build: Bump grunt-karma to 0.12.2 (Paladox)
+* build: Drop the 'npm prepublish' task which runs pre-install as well (James D. Forrester)
+* demos: Restore constructive widgets (James D. Forrester)
+* rubocop: Re-run todos, upgrade to newer rule names (James D. Forrester)
+* rubocop: Review todos (Bartosz Dziewoński)
+
+
+## v0.16.3 / 2016-03-16
+### Features
+* core: Add `#throttle` to complement `#debounce` (David Lynch)
+* ClippableElement: Never exceed the dimensions of the browser viewport (Bartosz Dziewoński)
+* FloatableElement: Hide if the anchor element is outside viewport (Bartosz Dziewoński)
+
+### Styles
+* Apex, MediaWiki themes: Fix vertical alignment of close icon (Ed Sanders)
+* MediaWiki theme: Disabled ButtonElement icon should not be colored (Bartosz Dziewoński)
+
+### Code
+* ButtonInputWidget: Actually disallow non-plaintext labels in 'useInputTag' mode (Bartosz Dziewoński)
+* Element: Preserve `OOUI\HtmlSnippet( '' )` when infusing (Bartosz Dziewoński)
+* InputWidget: Actually reuse parts of the DOM when infusing (Bartosz Dziewoński)
+* MediaWiki theme: Remove broken remnant of d6b05bc0 (Bartosz Dziewoński)
+* TextInputWidget: Treat empty placeholder the same in PHP and JS (Bartosz Dziewoński)
+* TitledElement: Treat empty title the same in PHP and JS (Bartosz Dziewoński)
+* build: Bump devDependencies to latest (James D. Forrester)
+* build: Bump devDependencies to latest (Paladox)
+* build: Update grunt-svg2png to commit 2fe1dad07eaec4b655263f8b487a672df4b668b4 (Paladox)
+* demo: Expand the dialog $overlay demo for testing scrolling things off-screen (Bartosz Dziewoński)
+* tests: Emulated setTimeout for unit testing (David Chan)
+* testsuitegenerator: Always test empty values for 'string' type, not just for 'label' (Bartosz Dziewoński)
+* testsuitegenerator: Change values tested for 'flags' config options (Bartosz Dziewoński)
+* testsuitegenerator: Test 'HtmlSnippet' type (mostly for labels) (Bartosz Dziewoński)
+
+
+## v0.16.2 / 2016-03-08
+### Deprecations
+* [DEPRECATING CHANGE] MediaWiki theme: Scrap `constructive` flag (Volker E)
+* [DEPRECATING CHANGE] Move some editing icons from core to editing-* (James D. Forrester)
+
+### Features
+* Dialog: trigger the primary action with ctrl-enter (David Lynch)
+* TextInputWidget: Allow type="date" (Geoffrey Mon)
+
+### Styles
+* Apex, MediaWiki themes: Add markup '<>' icon in editing-advanced (Ed Sanders)
+* Apex, MediaWiki themes: Drop padding from buttons in MessageDialogs (James D. Forrester)
+* editing-styling pack: Have uk fallback to use ru bold and italic icons (Paladox)
+* styles: Remove superflous pseudo-class and unitize comments (Volker E)
+
+### Code
+* CapsuleMultiSelectWidget: Emit 'resize' when widget height changes (Bartosz Dziewoński)
+* TextInputWidget: Prevent uncaught errors when using #selectRange in IE (Ed Sanders)
+* TextInputWidget: Update comment about Blink height miscalculation (Bartosz Dziewoński)
+* Follow-up I0667fbc: Fix draggable element CSS (Ed Sanders)
+* Add Element::configFromHtmlAttributes() helper method (Bartosz Dziewoński)
+* Clean-up duplicate properties across widgets (Volker E)
+* docs: Clarify the lack of `.oo-ui-box-shadow()` mixin (Volker E)
+
+
+## v0.16.1 / 2016-03-01
+### Styles
+* CapsuleItemWidget: Revert regression on "remove" button in Firefox (Volker E)
+
+### Code
+* ActionFieldLayout: Add max-width: 50em; (Florian)
+* DraggableGroupElement: Don't emit reorder event when action is a no-op (Ed Sanders)
+* Element: Fix #gatherPreInfuseState called incorrectly, causing TypeErrors (Thiemo Mättig)
+* NumberInputWidget: fix example (Ricordisamoa)
+* SelectWidget: fix incorrect `@return` that should be `@param` (Ricordisamoa)
+* build: Compress PNGs with Zopfli etc. after they are built (James D. Forrester)
+* build: Enable all passing jscs jsDoc rules (Ricordisamoa)
+* build: Enable jscs jsDoc rule 'checkAnnotations' and make pass (Ricordisamoa)
+* build: Enable jscs jsDoc rule 'checkParamNames' and make pass (Ricordisamoa)
+* build: Enable jscs jsDoc rule 'checkTypes' and make pass (Ricordisamoa)
+* build: Enable jscs jsDoc rule 'requireNewlineAfterDescription' and make pass (Ricordisamoa)
+* build: Enable jscs jsDoc rule 'requireReturnTypes' and make pass (Ricordisamoa)
+* demos: Display a nicer error message on old PHP versions (Kunal Mehta)
+
+
+## v0.16.0 / 2016-02-22
+### Breaking changes
+* [BREAKING CHANGE] DraggableGroupElement: Add default implementation of reorder (Ed Sanders)
+* [BREAKING CHANGE] Remove 'noimages' distribution (Bartosz Dziewoński)
+* [BREAKING CHANGE] Require PHP 5.5.9+; drop old array syntax (James D. Forrester)
+* [BREAKING CHANGE] SelectFileWidget: Remove deprecated config 'dragDropUI' (Prateek Saxena)
+
+### Deprecations
+* [DEPRECATING CHANGE] MenuOptionsWidgets: Drop jQuery autoEllipsis support (Bartosz Dziewoński)
+
+### Features
+* core#debounce: If an immediate timeout is already waiting, don't re-set it (Bartosz Dziewoński)
+* LabelElement: Bring in highlightQuery method from VE (Ed Sanders)
+* DraggableElement: Defer adding of -dragging class so it isn't applied to copy (Ed Sanders)
+* DraggableElement: Introduce $handle config option (Ed Sanders)
+* DraggableGroupElement: Live reorder list while dragging (Ed Sanders)
+* DraggableGroupElement: Only show meaningful drop positions (Ed Sanders)
+
+### Styles
+* CapsuleItemWidget: Tweak styles for the "remove" button (Bartosz Dziewoński)
+* MenuSelectWidget: Bring some sanity styling when inside different widgets (Bartosz Dziewoński)
+* NumberInputWidget: Apex: Round the correct corners in the disabled state (Prateek Saxena)
+* styles: Use block rather than inline-block to avoid line height issues (Bartosz Dziewoński)
+* MediaWiki theme: Restore non-broken version of eye.svg (Bartosz Dziewoński)
+
+### Code
+* Avoid parsing HTML when creating <input> nodes (Bartosz Dziewoński)
+* tests: Actually run core test suite in standalone mode (Bartosz Dziewoński)
+* Compress PNGs with zopflipng (Ori Livneh)
+* DraggableGroupElement: Cache directionality (Ed Sanders)
+* DraggableGroupElement: Fix offset calculation (Ed Sanders)
+* DraggableGroupElement: Reduce flicker when dragging (Ed Sanders)
+* TextInputWidget: Don't call #updatePosition if there's no label to position (Bartosz Dziewoński)
+* PHP: Take advantage of PHP 5.5 understanding ( new Foo )->foo (Bartosz Dziewoński)
+* README: Update Phabricator URL broken by upgrade (James D. Forrester)
+* build: Bump grunt-svg2png to a newer (still personal) version; lots faster (James D. Forrester)
+
+## v0.15.4 / 2016-02-16
+### Deprecations
+* [DEPRECATING CHANGE] Element#scrollIntoView: Replace callback with promise (Ed Sanders)
+
+### Features
+* SelectWidget: Prevent mouse highlighting while typing-to-select (Bartosz Dziewoński)
+
+### Styles
+* PHP DropdownInputWidget: Match height of <option> to JS MenuOptionWidget (Bartosz Dziewoński)
+
+### Code
+* DraggableElement: Remove 'HACK' comment, this isn't a hack (Bartosz Dziewoński)
+* Element: Expand variable names in scrollIntoView (Ed Sanders)
+* Element, ListToolGroup: Add some missing documentation (Ed Sanders)
+* Element#scrollIntoView: Make the promise version actually work (Bartosz Dziewoński)
+* PopupWidget: Only build head and footer if we're going to use it (Bartosz Dziewoński)
+* PopupWidget: Tweak some comments (Bartosz Dziewoński)
+* styles: Remove initial value `ease` from `transition` (Volker E)
+
+## v0.15.3 / 2016-02-09
+### Features
+* CapsuleItemWidget: Let user tab through items, edit and delete them (Prateek Saxena)
+* CapsuleMultiSelectWidget: Edit instead of remove on backspace (Prateek Saxena)
+* CapsuleWidgets: Edit on click and remove on Ctrl+Backspace (Prateek Saxena)
+* CapsuleWidgets: Toggle through capsules and the input with arrow keys (Prateek Saxena)
+* DropdownWidget: Open menu on up and down arrow keys (Prateek Saxena)
+* MenuSelectWidget: Ensure currently selected element is visible when menu opens (Bartosz Dziewoński)
+* SelectFileWidget: Show thumbnail when dropTarget is shown (Prateek Saxena)
+* Really preserve dynamic state of widgets when infusing (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki, Apex themes: Replace 'language' icon with tweaked version (Mun May Tee)
+
+### Code
+* CapsuleItemWidget: Use Button instead of an Indicator (Prateek Saxena)
+* CapsuleMultiSelectWidget: Extend config instead of when setting property (Prateek Saxena)
+* InputWidget: Remove the 'setAccessKey' method (Prateek Saxena)
+* SelectWidget: Really prevent default action during type-to-select (Bartosz Dziewoński)
+* Put '@keyframes' rules inside a mixin to avoid duplicating them (Bartosz Dziewoński)
+* Apex theme: Remove unnecessary '@keyframes' prefixing (Bartosz Dziewoński)
+* Mediawiki theme: Align button mixins/states to CSS guidelines/standard (Volker E)
+* Correct code using plain DOM events documented as jQuery events (Bartosz Dziewoński)
+* demo: Add a long DropdownInputWidget demo (Bartosz Dziewoński)
+* demo: In PHP demo, load oojs-ui-core only instead of whole oojs-ui (Bartosz Dziewoński)
+* demo: Measure time needed to construct the demo (Bartosz Dziewoński)
+* demo: widgets: OO.ui.CapsuleMultiSelectWidget: Remove non-existent 'values' config (Prateek Saxena)
+* docparser: Recognize and ignore '@uses' (Bartosz Dziewoński)
+* docs: OO.ui.CapsuleMultiSelectWidget: Config options (Prateek Saxena)
+* docs: OO.ui.CapsuleMultiSelectWidget: Link to the widget it uses (Prateek Saxena)
+* docs: OO.ui.SelectFileWidget: Minor language change (Prateek Saxena)
+
+
+## v0.15.2 / 2016-02-02
+### Features
+* DropdownWidget: Prevent label from overflowing the handle (Bartosz Dziewoński)
+
+### Styles
+* Ensure gradient filter rendering on IE 8&9 (Bartosz Dziewoński)
+* Remove unused CSS classes .oo-ui-ltr and .oo-ui-rtl (Bartosz Dziewoński)
+* Update `.oo-ui-vertical-gradient` mixin to modern times (Volker E)
+
+### Code
+* Unify SVG icon color values to CSS/Less coding standards (Volker E)
+* ComboBoxInputWidget: Don't make the 'datalist' infusable (Bartosz Dziewoński)
+* Move OO.ui.alert and OO.ui.confirm methods to separate file (Bartosz Dziewoński)
+* README: Add "Loading the library" wherein we apologise for the mess that is the dist/ directory (Bartosz Dziewoński)
+* build: Actually check that all required files are not missing (Bartosz Dziewoński)
+* build: Add intro.js.txt and outro.js.txt to all distribution JS files (Bartosz Dziewoński)
+* build: De-duplicate per-theme modules lists (Bartosz Dziewoński)
+* build: Only define one 'less' task, not one per-distribution (Bartosz Dziewoński)
+* build: Remove unused 'ieCompat' options from 'less' (Bartosz Dziewoński)
+* build: Remove unused 'report' options from 'less' (Bartosz Dziewoński)
+* build: Small modules.yaml tweaks (Bartosz Dziewoński)
+* build: Split the library into four parts (Bartosz Dziewoński)
+* build: Switch modules.json to YAML to document some of the weird stuff we've put in there (Bartosz Dziewoński)
+* build: Unbreak `grunt build --graphics=vector` (Bartosz Dziewoński)
+* build: Update phpunit/phpunit to 4.8 (Paladox)
+* docparser: Parse '@class Foo' annotations, not just '@class' (Bartosz Dziewoński)
+
+
+## v0.15.1 / 2016-01-26
+### Features
+* Really filter out unsafe URLs, but don't throw silly exceptions (Bartosz Dziewoński)
+* ClippableElement: Try to prevent unnecessary scrollbars (Bartosz Dziewoński)
+* Dialog: Don't set `overflow:hidden;` on `.oo-ui-window-body` elements (Alex Monk)
+* TextInputWidget: Don't fail if 'validate' function returns null (Bartosz Dziewoński)
+
+### Styles
+* WindowManager: Only apply `top: 1em; bottom: 1em;` to non-fullscreen windows (Bartosz Dziewoński)
+* Align mixin whitespace to CSS/Less coding guidelines (Volker E)
+* Enable `cursor: pointer` just on enabled widgets (Volker E)
+* Apex, MediaWiki themes: Fix size of templateAdd icon (Ed Sanders)
+* Apex, MediaWiki themes: Quotes icon fixes (Ed Sanders)
+* Apex, MediaWiki themes: Re-crush SVGs, removing useless ID values and empty groups (James D. Forrester)
+* Apex theme: Fix FieldLayout padding in inline mode (Ed Sanders)
+* Apex theme: NumberInputWidget: Fix width of +/- buttons (Ed Sanders)
+* MediaWiki theme: Add invert variant to 'accessibility' icon pack icons (Bartosz Dziewoński)
+* MediaWiki theme: Align `@input-*` vars to coding guidelines (Volker E)
+* MediaWiki theme: Align `rgba()` values to CSS/Less guidelines (Volker E)
+* MediaWiki theme: Align size variables to CSS/Less guidelines (Volker E)
+* MediaWiki theme: Consolidate emphasized color values into variable (Volker E)
+* MediaWiki theme: Establish new `@border-default` variable (Volker E)
+* MediaWiki theme: Make icon variants actually work for all icons (Bartosz Dziewoński)
+* MediaWiki theme: Make transition of text input fields smoother (Volker E)
+* MediaWiki theme: Merge `@oo-ui-toolbar-bar-text` & `@color-default` vars (Volker E)
+* MediaWiki theme: Replace fixed & consolidate disabled values with vars (Volker E)
+* MediaWiki theme: Update avatar icon (Pau Giner)
+
+### Code
+* NumberInputWidget: Replace `box-sizing` property with mixin as anywhere else (Volker E)
+* SelectFileWidget: Order name and type spans in the order they are shown (Prateek Saxena)
+* TextInputWidget: Simplify `#getValidity` (Bartosz Dziewoński)
+* README: Add a 'Contributing' section (James D. Forrester)
+* build: Don't generate .min.js and .min.css files by default (Bartosz Dziewoński)
+* build: Only build one graphics distribution (mixed/vector/raster), not all (Bartosz Dziewoński)
+* build: Update jakub-onderka/php-parallel-lint to 0.9.2 (Paladox)
+* build: Update mediawiki/mediawiki-codesniffer to 0.5.1 (Paladox)
+* demo: Extend compounded form in widget.js demo (Volker E)
+
+## v0.15.0 / 2016-01-12
+### Breaking changes
+* [BREAKING CHANGE] Drop Internet Explorer 8 support from JavaScript code (Ricordisamoa)
+* [BREAKING CHANGE] Delete deprecated aliases 'picture' and 'insert' (Ed Sanders)
+
+### Deprecations
+* [DEPRECATING CHANGE] Create single icon for language/translation (Ed Sanders)
+* [DEPRECATING CHANGE] Move 'redirect' icon to 'articleRedirect' and cleanup (Ed Sanders)
+* [DEPRECATING CHANGE] core: Deprecate add/removeCaptureEventListener (Bartosz Dziewoński)
+
+### Features
+* Send escape key cancel events through action handler (Alex Monk)
+
+### Styles
+* MediaWiki theme: Align variable values & properties to CSS/Less guidelines (Volker E)
+* MediaWiki theme: Align `@neutral-button-border` to CSS/Less guidelines (Volker E)
+* MediaWiki theme: Align `transition` variables with coding guidelines (Volker E)
+* MediaWiki theme: Change color value to Less variable (Volker E)
+* MediaWiki theme: Clarify `@active` variable by renaming it (Volker E)
+* MediaWiki theme: Clarify `@background` var by renaming it (Volker E)
+* MediaWiki theme: Clarify `@select` variable by renaming it (Volker E)
+* MediaWiki theme: Clarify `@text` variable by renaming it (Volker E)
+* MediaWiki theme: Consolidate stray `margin` and `padding` properties (Volker E)
+* MediaWiki theme: Remove unnecessary `@-ms-keyframes` vendor rule (Volker E)
+* MediaWiki theme: Replace fixed `invalid` color value with variable (Volker E)
+* MediaWiki theme: Unify `border` property values (Volker E)
+* MediaWiki theme: Unify `border-radius` values (Volker E)
+* MediaWiki theme: Unify `-disabled` variables usage (Volker E)
+
+### Code
+* core: Add constants for MouseEvent.which button codes (Ed Sanders)
+* demo: Remove IE 8 support (Bartosz Dziewoński)
+* build: Fix typos ("overridden") (Ed Sanders)
+* build: Bump file copyright notices for 2016 (James D. Forrester)
+* build: Update most devDependencies to latest (James D. Forrester)
+* build: Updating development dependencies (Kunal Mehta)
+
+## v0.14.1 / 2015-12-08
+
+### Features
+* Implement OO.ui.alert() and OO.ui.confirm() (Bartosz Dziewoński)
+
+### Styles
+* CapsuleMultiSelectWidget: Interface tweaks (Bartosz Dziewoński)
+* CapsuleMultiSelectWidget: Make the text field span all available area (Bartosz Dziewoński)
+* CapsuleMultiSelectWidget: Update menu position when typing (Bartosz Dziewoński)
+* HorizontalLayout: Synchronise behaviour between themes (Bartosz Dziewoński)
+* Apex theme: Enlarge 'search' icon (Bartosz Dziewoński)
+* MediaWiki theme: Correct text color in MessageDialog, TabOptionWidget (Volker E)
+
+### Code
+* Tool*: Consolidate and cross-link some documentation (Bartosz Dziewoński)
+* Tool*: Expand, correct docs for #onUpdateState and the related event (Bartosz Dziewoński)
+* core.js: Extract a large chunk of the file incorrectly in a closure (Bartosz Dziewoński)
+* Apex, MediaWiki themes: Standardize XML structure for various 'search' images (Bartosz Dziewoński)
+* MediaWiki theme: Add missing theme mixin placeholder (no-op) (Bartosz Dziewoński)
+* build: Test PHP documentation with Doxygen via composer and make pass (James D. Forrester)
+* demo: Quit using the 'image' icon in documentation examples (Bartosz Dziewoński)
+
+## v0.14.0 / 2015-11-24
+### Breaking changes
+* [BREAKING CHANGE] Depend on OOjs v1.1.10, up from v1.1.9 (James D. Forrester)
+* [BREAKING CHANGE] TextInputWidget: Remove old deprecated alias #setPosition (Ed Sanders)
+
+### Deprecations
+* [DEPRECATING CHANGE] De-duplicate 'trash' and 'remove' icons (James D. Forrester)
+
+### Features
+* TextInputWidget: Add insertContent method (Thalia Chan)
+* TextInputWidget: Add encapsulateContent method to insert new content around a selection (Thalia Chan)
+
+### Styles
+* Apex theme: Provide the 'interactions' icon pack (James D. Forrester)
+* MediaWiki theme: Make dialog and panel box-shadows outset rather than inset (Ed Sanders)
+
+### Code
+* FlaggedElement.php: Fix type hint (Reedy)
+* SelectFileWidget: Remove sometimes-incorrect 'title' on the <input> (Bartosz Dziewoński)
+* SelectFileWidget: Use i18n string for button label (Ed Sanders)
+* TextInputWidget: Fix documentation of insertContent method (Thalia Chan)
+* \*.php: Replace `@chainable` jsduck-ism with `@return` $this (Reedy)
+* .gitattributes: Ignore both `/doc` and `/docs` directories (James D. Forrester)
+* AUTHORS: Update for the past few months' work (James D. Forrester)
+* build: Added Rakefile (Željko Filipin)
+
+## v0.13.3 / 2015-11-17
+### Deprecations
+* [DEPRECATING CHANGE] Duplicate icons: Unify 'picture' and 'image' (Ed Sanders)
+
+### Features
+* RequestManager: Introduce a mixin for widgets that need to do API calls (David Lynch)
+* TextInputWidget: Add getRange method (Ed Sanders)
+* WindowManager: Allow getSetup/ReadyProcess to reject (Ed Sanders)
+* WindowManager: Fade in overlay after 'setup' not 'ready' (Ed Sanders)
+
+### Styles
+* MediaWiki, Apex themes: Remove small 0.1em vertical margin from buttons (Bartosz Dziewoński)
+* MediaWiki theme: Add destructive variant to the 'cancel' icon (James D. Forrester)
+* MediaWiki theme: Reduce whitespace between FieldLayouts (Bartosz Dziewoński)
+
+### Code
+* TitledElement: Behave like its docs say it should (David Lynch)
+* Use null for abstract methods and correct documentation (Ed Sanders)
+* demo: Make button style showcase a table (Bartosz Dziewoński)
+
+## v0.13.2 / 2015-11-10
+### Deprecations
+* [DEPRECATING CHANGE] ComboBoxWidget: Refactor into ComboBoxInputWidget (Bartosz Dziewoński)
+* [DEPRECATING CHANGE] MediaWiki, Apex themes: Unify add/insert icons (Ed Sanders)
+
+### Features
+* ComboBoxInputWidget: Implement PHP version (Bartosz Dziewoński)
+* LookupElement: Make auto-highlighting the first term configurable (Florian)
+
+### Styles
+* Add some missing white backgrounds and use variables when possible (Bartosz Dziewoński)
+* MediaWiki theme: Make the menu icon identical to Apex's (Ed Sanders)
+* MediaWiki theme: Specify 'line-height' for DropdownWidget's handle (Bartosz Dziewoński)
+* WikiText icon: Make slightly narrower (Ed Sanders)
+
+### Code
+* Apex theme: Remove dead styles for ComboBoxWidget (Bartosz Dziewoński)
+* build: Make copy:fastcomposerdemos work again (Bartosz Dziewoński)
+
+## v0.13.1 / 2015-11-03
+### Deprecations
+* [DEPRECATING CHANGE] InputWidget: Replace `#setRTL` with `#setDir` (Ed Sanders)
+
+### Features
+* Allow widgets to re-use parts of the DOM when infusing; use for InputWidget's `$input` (Bartosz Dziewoński)
+* FieldLayout: Allow setting errors and notices dynamically (Bartosz Dziewoński)
+* InputWidget: Add '`dir`' to config (Ed Sanders)
+
+### Styles
+* TextInputWidget: Account for scroll bar width when positioning indicators/labels (Ed Sanders)
+* TextInputWidget: Ensure icon+indicator+label are top aligned in multi-line mode (Ed Sanders)
+
+### Code
+* FieldLayout: Mark `#makeMessage` as `@protected` (Bartosz Dziewoński)
+* History.md: wrap `<select>` tag in backticks (Ricordisamoa)
+* tests: Refactor property->attribute copying (Ed Sanders)
+
+## v0.13.0 / 2015-10-27
+### Breaking changes
+* [BREAKING CHANGE] Remove aliases for OO.ui.mixins, deprecated in 0.11.4 (C. Scott Ananian)
+* [BREAKING CHANGE] Turn Element#gatherPreInfuseState into a static method (Bartosz Dziewoński)
+
+### Features
+* Update outline widget when current item is scrolled out of view (Ed Sanders)
+* TextInputWidget: Emit 'resize' events (Ed Sanders)
+* TextInputWidget: Fix scrollbars in `<textarea>`s in IE8-11 (Ed Sanders)
+* TextInputWidget: Improve selection API (Ed Sanders)
+
+### Styles
+* MediaWiki theme: Adjust ToggleSwitchWidget to match M61 design (Volker E)
+* Follow-up I54f1e3c92: Fix placement of cursors on checkbox/radio widgets (Volker E)
+* Follow-up I598e7b25a: Apply MenuToolGroup missing styles fix to Apex theme (Ed Sanders)
+
+### Code
+* Consistently use '`//`' rather than '`/* */`' for Less comments (Bartosz Dziewoński)
+* Remove obsolete Opera<12.1 vendor prefixes (Volker E)
+* Remove unnecessary IE10beta vendor-prefixes from OOjs UI (Volker E)
+* build: Switch back to upstream version of grunt-contrib-concat (Timo Tijhof)
+* build: Updating development dependencies (Kunal Mehta)
+* build: Use my Gmail address for attribution (Timo Tijhof)
+
+## v0.12.12 / 2015-10-13
+### Features
+* CapsuleMultiSelectWidget: When 'allowArbitrary' is true, don't require 'Enter' to confirm (Bartosz Dziewoński)
+* SelectFileWidget: Add a focus method (Ed Sanders)
+
+### Styles
+* CapsuleMultiSelectWidget: Set 'background-color' rather than 'background' (Bartosz Dziewoński)
+* DropdownWidget: Fix vertical alignment of handle's text (Volker E)
+* MediaWiki theme: Get transitions on ButtonWidget's `:hover` states in sync (Volker E)
+* MediaWiki theme: Unbreak checkbox/radio 'cursor: pointer' (Bartosz Dziewoński)
+* MediaWiki theme: Use inverted icon for 'active' buttons (Ed Sanders)
+
+### Code
+* ButtonElement: Actually use 'active' property and add getter (Ed Sanders)
+* Element: Document $element config option (Thalia)
+* composer.json: Add author names & e-mails (Alangi Derick)
+* demo: Correct some typos (Bartosz Dziewoński)
+
+## v0.12.11 / 2015-10-06
+### Styles
+* MediaWiki theme: Make shadows translucent black instead of light grey (Ed Sanders)
+* MediaWiki theme: Make PHP DropdownInputWidget look closer to JS version (Bartosz Dziewoński)
+
+### Code
+* Follow-up I4acbe69420: BookletLayout: Fix focus of page switching (Ed Sanders)
+* IndexLayout: Fix focus of panel switching (Ed Sanders)
+* TextInputWidget: Remove 'autocomplete' attribute on page navigation (Bartosz Dziewoński)
+* build: Bump es5-shim and various devDependencies to master (James D. Forrester)
+
+## v0.12.10 / 2015-09-29
+### Styles
+* Fix icon/indicator padding on TextInputWidget/SelectFileWidget (Ed Sanders)
+
+### Code
+* CapsuleItemWidget: Remove 'click' event preventing (Bartosz Dziewoński)
+* FloatableElement: Don't try unbinding events before we bind them (Bartosz Dziewoński)
+* SelectWidget: Ensure 'choose' never emits null (Ed Sanders)
+* Remove old textInputWidget-decorated classes (Ed Sanders)
+* build: Upgrade MediaWiki-Codesniffer to 0.4.0 (Kunal Mehta)
+
+## v0.12.9 / 2015-09-22
+### Features
+* BookletLayout, IndexLayout: Make autoFocus and focussing more reliable (Bartosz Dziewoński)
+* CapsuleMultiSelectWidget: Allow using CapsuleItemWidget subclasses (Bartosz Dziewoński)
+* CardLayout: Add a 'label' config option (Ed Sanders)
+* FloatableElement: Introduce mixin (Bartosz Dziewoński)
+* FloatingMenuSelectWidget: Update position of menus within overlay while scrolling (Bartosz Dziewoński)
+* IndexLayout: Add 'expanded' option, passed through to StackLayout (Ed Sanders)
+* MenuLayout: Use child selectors to allow nesting menus (Ed Sanders)
+* Re-attempt I31ab2bace4: Try to stop user from tabbing outside of open dialog box (Ed Sanders)
+
+### Styles
+* SelectFileWidget: Move file type over to the right in secondary text colour (Ed Sanders)
+* Fix focus styles on disabled widgets (Volker E)
+* Apex, MediaWiki themes: Make most borders on table icon thinner (Ed Sanders)
+* Apex, MediaWiki themes: Make picture icon border thinner (Ed Sanders)
+* MediaWiki theme: Alter buttons' padding and position icons absolutely (nirzar)
+* MediaWiki theme: Fix height of IndexLayout tab widget (Ed Sanders)
+* MediaWiki theme: Unify box-shadows for PopupWidget and DropdownWidget (Volker E)
+
+### Code
+* #isFocusableElement: Rewrite for performance and correctness (Ed Sanders)
+* BookletLayout: Remove unnecessary JSHint override (Bartosz Dziewoński)
+* DropdownWidget: Update example doc to show #getMenu usage (Ed Sanders)
+* Follow-up bf1497be: Fix PopupToolGroup use of renamed Clippable property (Ed Sanders)
+* PopupWidget: Add missing `@mixins` doc entry (Bartosz Dziewoński)
+* SelectFileWidget: Fix DOM order of file type label (Ed Sanders)
+* Widget: Fix docs for disable event (Ed Sanders)
+* docs: Remove excess empty lines in comments (Bartosz Dziewoński)
+* docs: Add quotes around PROJECT_BRIEF setting (Timo Tijhof)
+
+## v0.12.8.1 / 2015-09-18 (special release)
+### Code
+* build: Update version requirement for mediawiki/at-ease: 1.0.0 → 1.1.0 (Ori Livneh)
+
+## v0.12.8 / 2015-09-08
+### Styles
+* SelectFileWidget: Overflow and ellipsis for label (Ed Sanders)
+* Apex theme: Move transition timing to common variables (Prateek Saxena)
+* MediaWiki theme: Move window transition to `@medium-ease` variable (Prateek Saxena)
+* MediaWiki theme: Add missing `width` and `height` attributes to icons (Ed Sanders)
+* Clean up CSS values in .oo-ui-transition calls (Timo Tijhof)
+* Use 'ease' instead of 'ease-in-out' for CSS transitions (Timo Tijhof)
+
+### Code
+* Toolbar: Prevent double initialization (Roan Kattouw)
+* build: Bump grunt-contrib-jshint from 0.11.2 to 0.11.3 to fix upstream issue (James D. Forrester)
+* build: Upgrade grunt-banana-checker to v0.3.0 (James D. Forrester)
+
+## v0.12.7 / 2015-09-01
+### Deprecations
+* [DEPRECATING CHANGE] SelectFileWidget: Re-design to use a clearly clickable button (Ed Sanders)
+
+### Styles
+* FieldLayout: Don't add `margin-bottom` when in a HorizontalLayout (Florian)
+* SelectFileWidget: Use gray for hover and `@progressive-fade` for drop active (Prateek Saxena)
+* Apex, MediaWiki themes: Fix scale of external link icon (Ed Sanders)
+* Apex, MediaWiki themes: Re-crush all SVG files with SVGO (James D. Forrester)
+* Apex, MediaWiki themes: Reduce size of 'close' icon by 1px (Ed Sanders)
+* Apex, MediaWiki themes: Remove Inkscape-ism from SVG files (James D. Forrester)
+* Apex, MediaWiki themes: Standardise XML prolog for SVG files (Bartosz Dziewoński)
+* MediaWiki theme: Fix viewBox of arrow indicators (Ed Sanders)
+* MediaWiki theme: Fix viewBox of several icons (James D. Forrester)
+
+### Code
+* LookupElement: Really disallow editing of `readOnly` TextInputWidgets (Bartosz Dziewoński)
+* SelectFileWidget: Fix drop and drop hover exception in Firefox (Ed Sanders)
+* SelectFileWidget: Improve type checking (Ed Sanders)
+
+## v0.12.6 / 2015-08-25
+### Features
+* AccessKeyedElement: Introduce (Florian)
+* ButtonOptionWidget: Mixin TitledElement (Bartosz Dziewoński)
+* ClippableElement: Allow $clippableContainer to be different from $clippable (Roan Kattouw)
+* Dialog: Listen for Escape key on $element, not document (Roan Kattouw)
+* InputWidget: Add TitledElement and AccessKeyedElement mixins (Florian)
+* PopupWidget: Make it possible to add static footers (Moriel Schottlender)
+* SelectFileWidget: Add drag drop UI as a config (Prateek Saxena)
+* TextInputWidget: Add moveCursorToEnd() (Roan Kattouw)
+
+### Styles
+* MenuToolGroup: Add some missing styles for tools' 'check' icons (Bartosz Dziewoński)
+* PopupWidget: don't apply header styles to footer (Roan Kattouw)
+* SelectFileWidget: Mute the drag and drop design (Ed Sanders)
+* Add colour to neutral state of MW frameless buttons (Ed Sanders)
+* Editing-advanced icon pack: Add 'calendar' (Bartosz Dziewoński)
+
+### Code
+* DropdownInputWidget: Allow users to pass config options to DropdownWidget (Alex Monk)
+* Theme: Add theme classes to $icon and $indicator only (Bartosz Dziewoński)
+* Use OO.ui.debounce() for Element#updateThemeClasses (Roan Kattouw)
+* Document browser-specific code with support comments (Timo Tijhof)
+* Update OOjs to v1.1.9 (James D. Forrester)
+* Fix file permissions (Southparkfan)
+* Fix inArray test in drag handler (Ed Sanders)
+* Prefer ES5 over jQuery methods (Bartosz Dziewoński)
+* build: Enable jscs rule 'requireSpacesInsideBrackets' and make pass (James D. Forrester)
+* build: Enable jscs rule 'requireVarDeclFirst' and make pass (James D. Forrester)
+* build: Make `quick-build` build the 'mixed' distribution (James D. Forrester)
+* build: Update jscs devDependency from 1.8.0 to 2.1.0 (James D. Forrester)
+* build: Update various devDependencies to latest (James D. Forrester)
+* core: Remove spurious "[description]" placeholder from documentation (Timo Tijhof)
+* demos, tests: Use es5-shim for IE8 compatibility (Bartosz Dziewoński)
+* phpcs.xml: Ignore JS demo files in the PHP distribution (James D. Forrester)
+* testsuitegenerator: Do not generate nonsensical tests for 'maxLength' (Bartosz Dziewoński)
+
+## v0.12.5 / 2015-08-18
+### Features
+* CapsuleMultiSelectWidget: Unbreak $overlay config option (Bartosz Dziewoński)
+* FloatingMenuSelectWidget: Introduce, based on TextInputMenuSelectWidget (Bartosz Dziewoński)
+* FieldLayout: Throw an error if no widget is provided (Prateek Saxena)
+* MessageDialog: Focus primary action button when the dialog opens (Prateek Saxena)
+
+### Styles
+* DropdownWidget: Remove additional vertical margin, for consistency (Bartosz Dziewoński)
+* FieldLayout: Correct rendering of multiline messages in MediaWiki theme (Bartosz Dziewoński)
+* Move base icon/indicator styles out of themes (Roan Kattouw)
+* MediaWiki theme: Correct styling of nested buttons (Bartosz Dziewoński)
+
+### Code
+* DropdownWidget: Add $overlay config option (Bartosz Dziewoński)
+* IconElement, IndicatorElement: Apply base styles to the right selector (Bartosz Dziewoński)
+* Add background-repeat: no-repeat; to default icon/indicator styles (Roan Kattouw)
+* Remove redundant background rules for icons/indicators (Roan Kattouw)
+* Revert "TextInputWidget: Update doc'ed requirements for validate function" (Prtksxna)
+* Don't directly use #addEventListener for compatibility with IE 8 (Bartosz Dziewoński)
+* demos: Add a demo of the $overlay config option of various widgets (Bartosz Dziewoński)
+
+## v0.12.4 / 2015-08-13
+### Styles
+* CapsuleMultiSelectWidget: Style tweaks (Ed Sanders)
+
+### Code
+* MenuSelectWidget: Call #updateItemVisibility in more cases (Bartosz Dziewoński)
+* PopupWidget: Remove 'focusout' handling again, limit to CapsuleMultiSelectWidget (Bartosz Dziewoński)
+
+## v0.12.3 / 2015-08-11
+### Deprecations
+* [DEPRECATING CHANGE] TextInputWidget: Add getValidity function, deprecate isValid (Prateek Saxena)
+
+### Features
+* Add OO.ui.isSafeUrl() to make sure url targets are safe client-side (Kunal Mehta)
+* CapsuleMultiSelectWidget: Introduce (Brad Jorsch)
+* FieldLayout: Allow displaying errors or notices next to fields (Bartosz Dziewoński)
+* HorizontalLayout: Introduce (Bartosz Dziewoński)
+* If ProcessDialog#fitLabel is called before dialog is open, defer (Ed Sanders)
+* Mixin TitledElement into DropdownInputWidget and FieldLayout (Florian)
+* Preserve dynamic state of widgets when infusing (Bartosz Dziewoński)
+* TextInputWidget: Don't forget to positionLabel() after it's been unset (Bartosz Dziewoński)
+
+### Styles
+* FieldLayout: Kill 'list-style-image' too for messages list (Bartosz Dziewoński)
+* PopupToolGroup: Handle popup position on very narrow screens (Ed Sanders)
+* ToggleSwitchWidget: Update according to spec (Prateek Saxena)
+* MediaWiki, Apex themes: Fix height of frameless toolbar button (Ed Sanders)
+* Apex theme: Correct disabled iconed button tool's text colour (Ed Sanders)
+* Revert "Dialog: Increase z-index of .oo-ui-dialog to 1000+" (Ed Sanders)
+
+### Code
+* ButtonOptionWidget: Make it more difficult to set an inappropriate 'tabIndex' (Bartosz Dziewoński)
+* TextInputWidget: Update doc'ed requirements for validate function (Prateek Saxena)
+* TextInputWidget: Use getValidity in setValidityFlag (Prateek Saxena)
+* Element: DWIM when repeatedly infusing the same node (Bartosz Dziewoński)
+* Element: Preserve 'classes' config option through infusion (Bartosz Dziewoński)
+* demo: Make compatible with IE 8 (Bartosz Dziewoński)
+* build: Exclude irrelevant files from Composer PHP package (Timo Tijhof)
+* build: Move phpcs config from composer.json to phpcs.xml (Timo Tijhof)
+* build: Output doxygen to "doc" for consistency with other PHP libraries (Kunal Mehta)
+* build: Switch svg2png to personal build which fixes long lines (James D. Forrester)
+* demos, tests: Use `.parent` instead of `.super` (Bartosz Dziewoński)
+* docparser: Add rudimentary error handling (Bartosz Dziewoński)
+* doxygen: Use default directory for HTML_OUTPUT (Kunal Mehta)
+* tests: Twist the time in comparison tests in a different manner (Bartosz Dziewoński)
+* testsuitegenerator: Output the number of generated test cases (Bartosz Dziewoński)
+
+## v0.12.2 / 2015-07-28
+
+### Styles
+* Dialog: Increase z-index of .oo-ui-dialog to 1000+ (Prateek Saxena)
+* MediaWiki theme: Create new 'accessibility' icon pack (Violetto)
+
+### Code
+* SelectWidget: Fix @mixins documentation (Roan Kattouw)
+* Update OOjs to v1.1.8 (James D. Forrester)
+
+## v0.12.1 / 2015-07-22
+
+### Features
+* PendingElement: Make this actually useful (Roan Kattouw)
+* TextInputWidget: Handle required: true better (Bartosz Dziewoński)
+* TextInputWidget: Handle type: 'search' better (Bartosz Dziewoński)
+
+### Styles
+* PanelLayout: Add some vertical margin when 'padded' and 'framed' (Bartosz Dziewoński)
+* MediaWiki, Apex themes: Add 'clear' indicator (Bartosz Dziewoński)
+* MediaWiki theme: Align colour of toolbar and dropdown buttons (Prateek Saxena)
+
+### Code
+* Window: Compute directionality only when needed (Roan Kattouw)
+* Standardise some common comments (Bartosz Dziewoński)
+* build: Add clean:demos task (Bartosz Dziewoński)
+* build: Add clean:tests task (Bartosz Dziewoński)
+* build: Have copyright header reference "OOjs UI" team (Kunal Mehta)
+* build: Use new grunt-tyops package rather than local original (James D. Forrester)
+* Gruntfile: Fix 'pgk' to 'pkg' and add to typos list (James D. Forrester)
+* package.json: Use proper SPDX license notation (Derk-Jan Hartman)
+
+## v0.12.0 / 2015-07-13
+### Breaking changes
+* [BREAKING CHANGE] SearchWidget: Remove deprecated event re-emission (Ed Sanders)
+
+### Features
+* Allow infusion of widgets in other namespaces (Kunal Mehta)
+* Only allow construction of classes that extend OO.ui.Element in infusion (Kunal Mehta)
+* ButtonInputWidget: Disable generating `<label>` elements (Bartosz Dziewoński)
+* FieldLayout: Support HTML help messages through HtmlSnippet (Kunal Mehta)
+* RadioSelectWidget: Improve accessibility (Bartosz Dziewoński)
+* SelectWidget: Call #chooseItem instead of #selectItem when enter is pressed (Ed Sanders)
+
+### Styles
+* MediaWiki, Apex themes: Add a 'notice' icon, same as the 'alert' indicator (James D. Forrester)
+* MediaWiki, Apex themes: Re-crush with svgo 0.5.3 (James D. Forrester)
+* PopupWidget: Use child selectors to apply rules correctly (Ed Sanders)
+* TextInputWidget: Use 'text' cursor for icon/indicator rather than 'pointer' (Bartosz Dziewoński)
+* Set Scots to use bold-b and italic-i (baud/italeec) (Ed Sanders)
+
+### Code
+* ClippableElement: Fix horizontal clipping in nested scrollable elements (Roan Kattouw)
+* ClippableElement: Only call reconsiderScrollbars() if we actually *stopped* clipping (Roan Kattouw)
+* Follow-up 3ddb3603: unbreak nesting of autosizing or labeled TextInputWidgets (Roan Kattouw)
+* InputWidget: Add additional `<span/>` only for subclasses that need it (Bartosz Dziewoński)
+* LookupElement: Disallow editing of readOnly TextInputWidgets (Bartosz Dziewoński)
+* History: Re-write into new B/D/F/S/C format and clean up (James D. Forrester)
+* build: Don't run phpcs over demos/php (Kunal Mehta)
+* build: Update development dependencies (James D. Forrester)
+* build: Update watch rules (Kunal Mehta)
+
+## v0.11.8 / 2015-07-07
+### Features
+* DropdownInputWidget, RadioSelectInputWidget: Consistently call `#cleanUpValue` (Bartosz Dziewoński)
+* TextInputWidget: Allow setting the HTML autocomplete attribute (Florian)
+* TextInputWidget: Support `rows` option when in multiline mode (Kunal Mehta)
+* Make scroll into view work in scrollable divs in Firefox (Roan Kattouw)
+
+### Styles
+* MediaWiki theme: Remove support for frameless primary buttons (Bartosz Dziewoński)
+
+### Code
+* Use at-ease instead of PHP's @ (Kunal Mehta)
+* Use composer's autoloader in exec:phpGenerateJSPHPForKarma (Kunal Mehta)
+* build: Don't lint demos/{dist,node_modules,vendor} (Kunal Mehta)
+* build: Build demos as part of `grunt build` too (Kunal Mehta)
+* build: Build demos as part of `grunt quick-build` (Kunal Mehta)
+* build: Only build test files (`build-tests` task) when going to run tests (Bartosz Dziewoński)
+* demos: Make self-contained in demos/ directory (Kunal Mehta)
+* tests: Provide better output when running infusion test under Karma (Bartosz Dziewoński)
+
+## v0.11.7 / 2015-07-01
+### Features
+* Element.php: Strip all namespaces from infused PHP widgets (Kunal Mehta)
+* OptionWidget: Explicitly set aria-selected to `false` on init (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Add support for frameless primary buttons (Ed Sanders)
+* MediaWiki theme: Align and center the advanced icon (Roan Kattouw)
+* MediaWiki, Apex themes: Fix styling for frameless process dialog actions (Ed Sanders)
+
+### Code
+* Element.php: Add test case to verify class name in infused widgets (Kunal Mehta)
+* Element.php: Only variables may be passed by reference (Kunal Mehta)
+* Theme.php: Actually make abstract in PHP (Kunal Mehta)
+* Theme.php: Add missing doc comments (Kunal Mehta)
+* documentation: Use bold in comments instead of h4 (Ed Sanders)
+
+## v0.11.6 / 2015-06-23
+### Features
+* NumberInputWidget: Don't use `Math.sign()` (Brad Jorsch)
+* SelectWidget: Fix invalid escape sequence `\s` (Roan Kattouw)
+
+### Styles
+* DropdownWidget: Add white background in MediaWiki theme (Prateek Saxena)
+* SelectFileWidget: Add white background in MediaWiki theme (Prateek Saxena)
+* MediaWiki theme: Add constructive variants for star and unStar icons (Roan Kattouw)
+* MediaWiki theme: Add invert variant to all icons (Roan Kattouw)
+* MediaWiki theme: Add progressive variant to ongoingConversation icon (Stephane Bisson)
+
+### Code
+* Use `.parent` instead of `.super` (Stephane Bisson)
+* build: Updating development dependencies (Kunal Mehta)
+
+## v0.11.5 / 2015-06-16
+### Features
+* ButtonInputWidget: Render frameless button correctly (Bartosz Dziewoński)
+* ComboBoxWidget: Add a getter method for text inputs (Mr. Stradivarius)
+* FieldsetLayout: Make rule for disabled label color more precise (Bartosz Dziewoński)
+* MenuSelectWidget: Explain what the widget config option is for (Roan Kattouw)
+* RadioSelectInputWidget: Unbreak form submission in JS version (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Add destructive variant to check icon (Matthew Flaschen)
+* MediaWiki, Apex themes: Add ongoingConversation icon (Matthew Flaschen)
+
+### Code
+* build: Configure jsonlint (Kunal Mehta)
+
+## v0.11.4 / 2015-06-09
+### Deprecations
+* [DEPRECATING CHANGE] Introduce oo.ui.mixin namespace for mixins, and put them src/mixins (C. Scott Ananian)
+
+### Features
+* ActionFieldLayout: Add PHP version (Bartosz Dziewoński)
+* ButtonWidget: Fix not having tabindex updated when enabled/disabled (Brad Jorsch)
+* ClippableElement: Fix behavior of clippables in nested scrollables (Bartosz Dziewoński)
+* ClippableElement: Fix behavior of long clippables (Bartosz Dziewoński)
+* Dialog: Label in aria terms (Prateek Saxena)
+* DropdownWidget: Adjust height to other widgets (Bartosz Dziewoński)
+* DropdownWidget: Blank widget when no item is selected (Brad Jorsch)
+* Element#reconsiderScrollbars: Preserve scroll position (Bartosz Dziewoński)
+* GroupElement: pass correct event name to disconnect() from aggregate() (Roan Kattouw)
+* NumberInputWidget: Create, for numeric input (Brad Jorsch)
+* NumberInputWidget: Use keydown, not keypress (Brad Jorsch)
+* ProcessDialog: Don't center the title label if there's not enough space (Bartosz Dziewoński)
+* RadioOptionWidget: Control focus more strictly (Bartosz Dziewoński)
+* RadioSelectInputWidget: Create (Bartosz Dziewoński)
+* SelectFileWidget: Create (Brad Jorsch)
+* SelectWidget: Listen to keypresses and jump to matching items (Brad Jorsch)
+* TextInputWidget: Adjust height to other widgets (Bartosz Dziewoński)
+* Widget: Add `#supportsSimpleLabel` static property to control `<label>` usage (Bartosz Dziewoński)
+* Window: Clear margins for actions in horizontal/vertical groups (Ed Sanders)
+* `OOUI\Tag`: Avoid 'Potentially unsafe "href" attribute value' exceptions for relative URLs (Bartosz Dziewoński)
+
+### Styles
+* MessageDialog: Remove unintentional action button margin (Bartosz Dziewoński)
+* styles: Change gradient mixin syntax to W3C standards' syntax (Volker E)
+* styles: Remove obsolete "-ms-linear-gradient" declaration (Volker E)
+* Apex theme: Use matching 'lock' and 'unLock' icons (Bartosz Dziewoński)
+* MediaWiki and Apex themes: Force background color of `<select>` to white (Ed Sanders)
+* MediaWiki and Apex themes: Re-crush SVG files (James D. Forrester)
+
+### Code
+* ActionFieldLayout: Dead code removal and cleanup (Bartosz Dziewoński)
+* BarToolGroup: Add description and example (Kirsten Menger-Anderson)
+* ButtonInputWidget and TextInputWidget: Document and enforce allowed types (Bartosz Dziewoński)
+* DropdownInputWidget: Tweak documentation (Bartosz Dziewoński)
+* InputWidget#getInputElement: Mark as `@protected`, not `@private` (Bartosz Dziewoński)
+* ListToolGroup: Add description and example (Kirsten Menger-Anderson)
+* MenuToolGroup: Add description, example and mark private method (Kirsten Menger-Anderson)
+* PendingElement: Add description (Kirsten Menger-Anderson)
+* PopupTool: Add description and example (Kirsten Menger-Anderson)
+* PopupToolGroup: Add description and mark protected methods (Kirsten Menger-Anderson)
+* Tool: Add description (Kirsten Menger-Anderson)
+* ToolFactory: Add description (Kirsten Menger-Anderson)
+* ToolGroup: Add description and mark protected methods (Kirsten Menger-Anderson)
+* ToolGroupFactory: Add description (Kirsten Menger-Anderson)
+* ToolGroupTool: Add description and example (Kirsten Menger-Anderson)
+* Toolbar: Add description (Kirsten Menger-Anderson)
+* `OOUI\Element::mixins`: Improve doc comment (Kunal Mehta)
+* `OOUI\Tag`: Add basic phpunit tests (Kunal Mehta)
+* build: Update MediaWiki codesniffer to 0.2.0 (Kunal Mehta)
+* build: Updating development dependencies (James D. Forrester)
+* demo: Add 'layout' variable to the consoles (Bartosz Dziewoński)
+* demo: Link JS and PHP demos (Bartosz Dziewoński)
+* docs: Update name of upstream OOjs project in jsduck documentation (C. Scott Ananian)
+* mailmap: Add an additional e-mail for Bartosz per request (James D. Forrester)
+* test: Use -p option to phpcs instead of -v (Kunal Mehta)
+
+## v0.11.3 / 2015-05-12
+### Features
+* BarToolGroup: Don't use "pointer" cursor for disabled tools in enabled toolgroups (Bartosz Dziewoński)
+* Tool: Support icon+label in bar tool groups (Bartosz Dziewoński)
+* ToolGroupTool: Correct opacity of disabled nested tool group handle (Bartosz Dziewoński)
+* ToolGroupTool: Synchronize inner ToolGroup disabledness state (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Add a powerful default text color for tools (Trevor Parscal)
+* MediaWiki theme: Adjust quotes icon to match other icons (nirzar)
+* MediaWiki theme: Give names to some more toolbar colours (Bartosz Dziewoński)
+* MediaWiki theme: Provide all variants of the 'tag' icon (James D. Forrester)
+* MediaWiki theme: Rejigger some toolbar coloring (Bartosz Dziewoński)
+* MediaWiki theme: Remove box-shadow from nested toolbars (Bartosz Dziewoński)
+* MediaWiki theme: Remove unusued toolbar shadow (Trevor Parscal)
+* MediaWiki theme: Update button specification (nirzar)
+
+## v0.11.2 / 2015-05-11
+### Features
+* Don't select lookup items on initialize (Ed Sanders)
+* ListToolGroup, MenuToolGroup: Set accelTooltips = false (Bartosz Dziewoński)
+* PopupWidget: Add setAlignment (Moriel Schottlender)
+* Simplify default action prevention in buttons and forms (Bartosz Dziewoński)
+* TextInputWidget: Allow override of #setValidityFlag (Ed Sanders)
+* TextInputWidget: Use aria-required along with the required attribute (Prateek Saxena)
+
+### Styles
+* TabOptionWidget: Fix disabled styles to not react to hover/select (Ed Sanders)
+* Toolbar: Fix shadow styling (Bartosz Dziewoński)
+* Toolbar: Remove some useless code from the example (Bartosz Dziewoński)
+* Toolbar: Rework example and add 'menu' tool group example (Bartosz Dziewoński)
+* MediaWiki theme: Change highlight color for selected menu option (nirzar)
+* MediaWiki theme: Polish the toolbar design (nirzar)
+* MediaWiki theme: Remove accidentally duplicated styles for SelectWidget (Bartosz Dziewoński)
+
+### Code
+* SelectWidget: Mark as @abstract, which it is (Bartosz Dziewoński)
+* Toolbar: Move some tweaks from demo to actual implementation (Bartosz Dziewoński)
+
+## v0.11.1 / 2015-05-04
+### Features
+* Add IndexLayout (Trevor Parscal)
+* SelectWidget: Add #selectItemByData method (Moriel Schottlender)
+* TextInputWidget: Annotate input validation with aria-invalid (Prateek Saxena)
+* TextInputWidget: Don't set 'invalid' flag on first focus, even if invalid (Bartosz Dziewoński)
+* TextInputWidget: Support 'required' config option in PHP (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Add 'destructive' variant to block icon (Moriel Schottlender)
+* MediaWiki theme: Better vertical alignment of 'search' icon (Ed Sanders)
+* MediaWiki theme: Tweak 'search' icon size (Ed Sanders)
+* MediaWiki theme: Use variable for transition time and easing function (Prateek Saxena)
+* MediaWiki theme: input: Use variable for transition time and easing function (Prateek Saxena)
+* MediaWiki theme: radio/checkbox: Use variable for transition time and easing function (Prateek Saxena)
+* MediaWiki, Apex themes: Switch icons: clear → cancel, closeInput → clear (Bartosz Dziewoński)
+* MediaWiki, Apex themes: Switch over 'magnifyingGlass' icon to be 'search' (James D. Forrester)
+
+### Code
+* CardLayout: Fix typo (Kirsten Menger-Anderson)
+* LabelElement: Document that label config option can take an HtmlSnippet (Roan Kattouw)
+* PopupButtonWidget: Update align config in example (Kirsten Menger-Anderson)
+* Remove GridLayout remnants (Bartosz Dziewoński)
+* TabOptionWidget: Change link to card layout (Kirsten Menger-Anderson)
+* build: Add clean:doc task (Bartosz Dziewoński)
+* build: Bump grunt-jscs to latest version (James D. Forrester)
+* core: Add OO.ui.debounce() utility (Roan Kattouw)
+* demo: Add icons with variants to icons demo (Bartosz Dziewoński)
+
+## v0.11.0 / 2015-04-29
+### Breaking changes
+* [BREAKING CHANGE] Do not set font-size: 0.8em anywhere in the library (Bartosz Dziewoński)
+
+### Deprecations
+* [DEPRECATING CHANGE] Create rtl-ready alignments in PopupWidget (Moriel Schottlender)
+
+### Features
+* MediaWiki theme: Adding variants to several icons (Moriel Schottlender)
+* TextInputWidget: Allow functions to be passed as 'validate' config option (Bartosz Dziewoński)
+
+### Styles
+* TextInputWidget: Styles for 'invalid' flag (Bartosz Dziewoński)
+
+### Code
+* Update OOjs to v1.1.7 (James D. Forrester)
+* Update jQuery from v1.11.1 to v1.11.3 (James D. Forrester)
+* build: Use jquery and oojs from npm instead of embedded lib (Timo Tijhof)
+
+## v0.10.1 / 2015-04-27
+### Features
+* Correct `tabindex` attribute setting (Bartosz Dziewoński)
+* Make toolbars keyboard-accessible (Bartosz Dziewoński)
+
+### Code
+* ToggleButtonWidget: Unbreak horizontal alignment (Bartosz Dziewoński)
+
+## v0.10.0 / 2015-04-22
+### Breaking changes
+* [BREAKING CHANGE] ButtonWidget: remove deprecated `nofollow` option alias (C. Scott Ananian)
+* [BREAKING CHANGE] Convert ToggleWidget from a mixin to an abstract class (Bartosz Dziewoński)
+* [BREAKING CHANGE] MenuLayout: Reimplement without inline styles (Bartosz Dziewoński)
+
+### Deprecations
+
+### Features
+* BarToolGroup: Allow tools with labels instead of icons (Bartosz Dziewoński)
+* BookletLayout: Find first focusable element and add focusable utility (Moriel Schottlender)
+* ButtonWidget: Remove href to make unclickable when disabled (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki, Apex themes: Add viewCompact, viewDetails, visionSimulator icons (Mun May Tee)
+
+### Code
+* ButtonInputWidget: Don't double-mixin FlaggedElement (Bartosz Dziewoński)
+* ButtonWidget: Remove pointless #isHyperlink property (Bartosz Dziewoński)
+* FormLayout: Better document how this works with InputWidgets (Bartosz Dziewoński)
+* MenuLayout: Add example (Kirsten Menger-Anderson)
+* MenuLayout: Fix initialization order (Bartosz Dziewoński)
+* PHP: More useful debugging information on unsafe tag attributes (Chad Horohoe)
+* SelectWidget#getTargetItem: Simplify (Ed Sanders)
+* Toolbar: Add example (Bartosz Dziewoński)
+* demo: Remove VisualEditor references from toolbar demo, use generic icons (Ed Sanders)
+* demo: Remove outline controls from outlined BookletLayout demo (Bartosz Dziewoński)
+* demo: Simplify ButtonGroupWidget and ButtonSelectWidget examples (Bartosz Dziewoński)
+
+## v0.9.8 / 2015-04-12
+### Features
+* BookletLayout: Allow focus on any item (Moriel Schottlender)
+
+### Styles
+* Apex theme: Correctly position popups in RTL; follows-up v0.9.5 (Moriel Schottlender)
+* Apex, MediaWiki themes: Correct or delete unused SVG files (James D. Forrester)
+
+### Code
+* Error: Add description (Kirsten Menger-Anderson)
+* ProcessDialog: Remove stray `this.$` from documentation code example (Roan Kattouw)
+* ProgressBarWidget: Remove spurious styles from CSS output (Bartosz Dziewoński)
+
+* build: Add explicit dependency upon grunt-cli (Kunal Mehta)
+* build: Move coverage output from "/dist/coverage" to "/coverage" (Timo Tijhof)
+* build: Run lint before build in grunt-test (Timo Tijhof)
+* colorize-svg: Generate language-specific rules for images even if equal to default ones (Bartosz Dziewoński)
+* colorize-svg: Sprinkle `/* @noflip */` on language-specific rules (Bartosz Dziewoński)
+* demo: Change html dir property when direction changes (Moriel Schottlender)
+
+## v0.9.7 / 2015-04-03
+### Code
+* build: Generate correct paths to fallback images (Bartosz Dziewoński)
+
+## v0.9.5 / 2015-04-02
+### Deprecations
+* [DEPRECATING CHANGE] Deprecate search widget event re-emission (Ed Sanders)
+
+### Features
+* Process: Allow rejecting with single Error (Matthew Flaschen)
+* Correctly position popups in RTL (Moriel Schottlender)
+
+### Styles
+* ButtonElement: Increase specificity of icon and indicator styles (Bartosz Dziewoński)
+* DecoratedOptionWidget: Fix opacity of icons/indicators when disabled (Ed Sanders)
+
+* Balance padding now that focus highlight is balanced (Ed Sanders)
+* Remove line height reset for windows (Ed Sanders)
+* Restore font family definitions to form elements (Ed Sanders)
+
+* Apex theme: Tweak `check.svg` syntax (Bartosz Dziewoński)
+* MediaWiki, Apex themes: Bring in remaining VisualEditor icons (James D. Forrester)
+* MediaWiki, Apex themes: Provide an RTL variant for the help icon (James D. Forrester)
+* MediaWiki theme: Add vertical spacing to RadioSelectWidget (Ed Sanders)
+* MediaWiki theme: Allow intention flags for non-buttons (Andrew Garrett)
+* MediaWiki theme: Fix icon opacity for disabled ButtonOptionWidgets (Bartosz Dziewoński)
+* MediaWiki theme: Revert "Syncing some button styles with MediaWiki UI" (Bartosz Dziewoński)
+* MediaWiki theme: Use checkbox icon per mockups (Bartosz Dziewoński)
+
+### Code
+* ActionFieldLayout: Add description and example (Kirsten Menger-Anderson)
+* BookletLayout: Add description and example (Kirsten Menger-Anderson)
+* IconWidget: Mix in FlaggedElement (Bartosz Dziewoński)
+* MenuLayout: Correct documentation (Bartosz Dziewoński)
+* OutlineOption: Add description (Kirsten Menger-Anderson)
+* PageLayout: Add description (Kirsten Menger-Anderson)
+* Process: Add description (Kirsten Menger-Anderson)
+* StackLayout: Add description and example (Kirsten Menger-Anderson)
+* Choose can't emit with a null item (Ed Sanders)
+* Refactor icon handling again (Bartosz Dziewoński)
+* build: Add a 'generated automatically' banner to demo.rtl.css (Bartosz Dziewoński)
+* build: Generate prettier task names for 'colorizeSvg' (Bartosz Dziewoński)
+* build: Have separate 'cssjanus' target for demo.rtl.css (Bartosz Dziewoński)
+* build: Make colorize-svg.js actually work more often (Bartosz Dziewoński)
+* build: Properly support LTR/RTL icon versions in colorize-svg.js (Bartosz Dziewoński)
+* build: Simplify 'fileExists' task configuration (Bartosz Dziewoński)
+* build: Support (poorly) per-language icon versions in colorize-svg.js (Bartosz Dziewoński)
+* build: Update grunt-banana-checker to v0.2.1 (James D. Forrester)
+
+## v0.9.4 / 2015-03-25
+### Breaking changes
+
+### Deprecations
+
+### Features
+* ProcessDialog#executeAction: Don't eat parent's return value (Roan Kattouw)
+* Compensate for loss of margin when opening modals (Ed Sanders)
+* Make outline controls' abilities configurable (Trevor Parscal)
+
+### Styles
+* MediaWiki theme: Reduce thickness of toolbar border (Ed Sanders)
+
+### Code
+* ButtonElement: Clarify description (Kirsten Menger-Anderson)
+* ButtonElement: Disable line wrapping on buttons (Ed Sanders)
+* FieldLayout: Clarify description and mark private methods (Kirsten Menger-Anderson)
+* FieldsetLayout: Add description and example (Kirsten Menger-Anderson)
+* FormLayout: Add description, example, and mark private method (Kirsten Menger-Anderson)
+* Layout: Add description (Kirsten Menger-Anderson)
+* LookupElement: Add description and mark private and protected methods (Kirsten Menger-Anderson)
+* LookupElement: Fix typo in docs (Bartosz Dziewoński)
+* MenuLayout: Reorder styles (Bartosz Dziewoński)
+* MenuSectionOptionWidget: Add description and example (Kirsten Menger-Anderson)
+* PanelLayout: Add description and example (Kirsten Menger-Anderson)
+* SearchWidget: Add description and mark private methods (Kirsten Menger-Anderson)
+* TabIndexElement: Mark private method (Kirsten Menger-Anderson)
+
+## v0.9.3 / 2015-03-19
+### Features
+* LookupElement: Add optional config field for suggestions when empty (Matthew Flaschen)
+* ProcessDialog: send an array to showErrors in failed executeAction (Moriel Schottlender)
+
+### Code
+* Dialog: Fix links to static properties (Kirsten Menger-Anderson)
+* DraggableGroupElement: Clarify description and mark private methods (Kirsten Menger-Anderson)
+* Fix code style in `@examples` (Ed Sanders)
+* FlaggedElement: Add example and clarify description (Kirsten Menger-Anderson)
+* GroupElement: Clarify description (Kirsten Menger-Anderson)
+* IndicatorElement: Clarify description (Kirsten Menger-Anderson)
+* MenuSelectWidget: Clarify description (Kirsten Menger-Anderson)
+* TabIndexedElement: Clarify description (Kirsten Menger-Anderson)
+* TitledElement: Clarify description (Kirsten Menger-Anderson)
+* Widget: Clarify description (Kirsten Menger-Anderson)
+* Window: Clarify description of setDimensions method (Kirsten Menger-Anderson)
+* WindowManager: Clarify description and mark private methods (Kirsten Menger-Anderson)
+* Update OOjs to v1.1.6 (James D. Forrester)
+* Add .mailmap file (Roan Kattouw)
+* Add Kirsten to AUTHORS.txt (Roan Kattouw)
+* demo: Add one more toolbars demo (Bartosz Dziewoński)
+
+## v0.9.2 / 2015-03-12
+### Styles
+* Toolbar: Be less aggressive with `white-space: nowrap` (Bartosz Dziewoński)
+
+### Code
+* Window: Revert changes from 521061dd (Bartosz Dziewoński)
+
+## v0.9.1 / 2015-03-11
+### Features
+* PanelLayout: Add `framed` config option (Bartosz Dziewoński)
+* TextInputWidget: Use MutationObserver for #onElementAttach support (Bartosz Dziewoński)
+* Only prevent default for handled keypresses (Brad Jorsch)
+
+### Styles
+* Toolbar: Tighten whitespace on narrow displays (Bartosz Dziewoński)
+* MediaWiki theme: Add the progressive variant to the check icon (Prateek Saxena)
+* MediaWiki theme: Add warning variant to icon set (Mark Holmquist)
+* MediaWiki theme: Add "Wikicon" icons (Mun May Tee)
+* MediaWiki theme: Synchronise button styles between OOJS and MW (nirzar)
+* MediaWiki theme: Syncing some button styles with MediaWiki UI (kaldari)
+* MediaWiki theme: textInputWidget: Update focus state (Prateek Saxena)
+
+### Code
+* ActionSet: Add description for events and clarify method descriptions (Kirsten Menger-Anderson)
+* ActionSet: Clarify description (Kirsten Menger-Anderson)
+* ActionWidget: Clarify description and mark private method (Kirsten Menger-Anderson)
+* ActionWidget: Fix bad copy-paste in documentation (Bartosz Dziewoński)
+* ButtonElement: Use #setButtonElement correctly (Bartosz Dziewoński)
+* ButtonInputWidget: Clarify description of configs and methods (Kirsten Menger-Anderson)
+* Dialog: Mark private methods and add description of methods and configs (Kirsten Menger-Anderson)
+* InputWidget: Clarify description (Kirsten Menger-Anderson)
+* MessageDialog: Add description, example, and mark private methods (Kirsten Menger-Anderson)
+* OutlineControlsWidget: Add description (Kirsten Menger-Anderson)
+* OutlineSelectWidget: Add description (Kirsten Menger-Anderson)
+* ProcessDialog: Add description and example and mark private methods (Kirsten Menger-Anderson)
+* TextInputMenuSelectWidget: Add description and mark private methods (Kirsten Menger-Anderson)
+* TextInputWidget: Adjust size and label on first focus, too (Bartosz Dziewoński)
+* Window: Clarify descriptions of methods and configs (Kirsten Menger-Anderson)
+* WindowManager: Documentation typo (Ed Sanders)
+* Icon width should only be applied if there is an icon (Moriel Schottlender)
+* Remove half-baked touch event handling (Bartosz Dziewoński)
+* Remove remnants of window isolation (Bartosz Dziewoński)
+* AUTHORS: Add Derk-Jan Hartman (Derk-Jan Hartman)
+* build: Implement basic image flipping support in colorize-svg (Bartosz Dziewoński)
+* build: Move pre/post 'doc' task into package.json (Timo Tijhof)
+* build: Remove obsolete 'build' task from grunt-doc (Timo Tijhof)
+* build: Set 'generateExactDuplicates: true' for CSSJanus (Bartosz Dziewoński)
+* demo: Fix typo in toolbars demo (Bartosz Dziewoński)
+* demo: Load styles before building demo widgets (not asynchronously) (Bartosz Dziewoński)
+* demo: Simplify `@media` styles (Bartosz Dziewoński)
+* demo: Use popup with head in the toolbars demo (Bartosz Dziewoński)
+* jsduck: Add MouseEvent and KeyboardEvent to externals (Timo Tijhof)
+* jsduck: Set --processes=0 to fix warnings-exit-nonzero (Timo Tijhof)
+* package.json: Bump grunt-svg2png to 0.2.7 (Bartosz Dziewoński)
+
+## v0.9.0 / 2015-03-04
+### Breaking changes
+* [BREAKING CHANGE] Remove innerOverlay (Ed Sanders)
+* [BREAKING CHANGE] TextInputWidget: Remove `icon` and `indicator` events (Bartosz Dziewoński)
+* [BREAKING CHANGE] Remove deprecated LookupInputWidget (Bartosz Dziewoński)
+* [BREAKING CHANGE] Remove deprecated GridLayout (Bartosz Dziewoński)
+
+### Features
+* Move `OO.ui.infuse` to `OO.ui.Element.static.infuse`. (C. Scott Ananian)
+* Fake toolbar group nesting (Bartosz Dziewoński)
+* Infer retry button action flags from symbolic name (Trevor Parscal)
+* InputWidget: Focus checkboxes and radios, too, when the label is clicked (Bartosz Dziewoński)
+* ProcessDialog: Dismiss errors on teardown (Moriel Schottlender)
+
+### Styles
+* Make icon and indicator container sizes consistent (Ed Sanders)
+* Restore previous toolbar items margins and padding (Bartosz Dziewoński)
+* Use the correct color for gray buttons (Prateek Saxena)
+
+### Code
+* CheckboxInputWidget: Add description and example (Kirsten Menger-Anderson)
+* ComboBoxWidget: Add description, example, and mark private methods (Kirsten Menger-Anderson)
+* DecoratedOptionWidget: Add description and example (Kirsten Menger-Anderson)
+* DropdownInputWidget: Add description, example, and mark private method (Kirsten Menger-Anderson)
+* FieldLayout: Fix display of documentation's bulleted list (Kirsten Menger-Anderson)
+* GroupWidget and ItemWidget: Mark `private` (Kirsten Menger-Anderson)
+* IndicatorWidget: Add description and example (Kirsten Menger-Anderson)
+* LabelElement: Don't call constructor twice for ActionFieldLayouts (Roan Kattouw)
+* LabelWidget: Add description, example, and mark private method (Kirsten Menger-Anderson)
+* PopupElement: Add description (Kirsten Menger-Anderson)
+* PopupTool: Tool constructor takes a toolGroup, not a toolbar (Bartosz Dziewoński)
+* PopupWidget: Add description, example, and mark private methods (Kirsten Menger-Anderson)
+* PopupWidget: Add keydown listener and hide popup on ESC (Prateek Saxena)
+* ProgressBar: Add description and example (Kirsten Menger-Anderson)
+* RadioInputWidget: Add description and example (Kirsten Menger-Anderson)
+* SelectWidget: Add example and link to decorated option widget (Kirsten Menger-Anderson)
+* SelectWidget: Marked protected methods and clarified choose/press descriptions (Kirsten Menger-Anderson)
+* TextInputWidget: Add description, example, and mark private methods (Kirsten Menger-Anderson)
+* ToggleButtonWidget: Add description, example, and mark private method (Kirsten Menger-Anderson)
+* ToggleSwitchWidget: Add description, example, and mark private methods (Kirsten Menger-Anderson)
+* ToggleWidget: Add description (Kirsten Menger-Anderson)
+* Fix invalid use of border shorthand syntax (Timo Tijhof)
+* Only modify body class when first/last window opens/closes (Ed Sanders)
+* Use only two variables each for each semantic color (Prateek Saxena)
+* build: Add disconnect tolerance to karma config (James D. Forrester)
+* build: Remove footer override from jsduck (Timo Tijhof)
+* demo: Add PopupTool to toolbar demo (Bartosz Dziewoński)
+* demo: Call Toolbar#initialize in toolbar demo (Bartosz Dziewoński)
+* tests: Add infusion tests (Bartosz Dziewoński)
+* tests: Run JS/PHP tests for widgets with required parameters, too (Bartosz Dziewoński)
+
+## v0.8.3 / 2015-02-26
+### Features
+* Revert "Unbreak form submission in JavaScript" (Bartosz Dziewoński)
+
+## v0.8.2 / 2015-02-26
+### Features
+* PHP TitledElement: Actually set $this->title (Bartosz Dziewoński)
+* PHP PanelLayout: Fix getConfig() for `expanded` config option (Bartosz Dziewoński)
+
+### Code
+* testsuitegenerator: Exclude 'text' parameter from tests, like 'content' (Bartosz Dziewoński)
+* WindowManager: Don't pass `this` to window factory method (Bartosz Dziewoński)
+
+## v0.8.1 / 2015-02-25
+### Deprecations
+* [DEPRECATING CHANGE] Rename setPosition to setLabelPosition (Ed Sanders)
+
+### Features
+* Allow passing positional parameters inside the config object (Bartosz Dziewoński)
+* ComboBox: Use combobox role (Derk-Jan Hartman)
+* Element.php: Add "data" property (C. Scott Ananian)
+* Element.php: Add "text" configuration option (C. Scott Ananian)
+* Element: Add `content` config option, matching PHP side. (C. Scott Ananian)
+* FormLayout: Allow adding child layouts via config (Bartosz Dziewoński)
+* Implement OO.ui.infuse to reconstitute PHP widgets in client-side JS (C. Scott Ananian)
+* Serialize PHP widget state into data-ooui attribute (C. Scott Ananian)
+* TextInputWidget: Fix appearance of icons and labels when disabled (Ed Sanders)
+* Unbreak form submission in JavaScript (Bartosz Dziewoński)
+
+### Styles
+* Set proper spacing between interleaved FieldsetLayouts and FormLayouts (Bartosz Dziewoński)
+* MediaWiki theme: Drop unnecessary pseudo-element of CheckboxInputWidget (Timo Tijhof)
+* MediaWiki theme: Drop unnecessary pseudo-element of RadioInputWidget (Timo Tijhof)
+* MediaWiki theme: Simplify spacing of checkboxes/radios in FieldLayouts (Bartosz Dziewoński)
+
+### Code
+* ButtonOptionWidget: Add description (Kirsten Menger-Anderson)
+* ButtonSelectWidget: Add description and example (Kirsten Menger-Anderson)
+* DraggableElement: Mark private methods and add description to events (Kirsten Menger-Anderson)
+* Element.php: Tweak docs (Bartosz Dziewoński)
+* Element: Add description for configs and static property (Kirsten Menger-Anderson)
+* Error: Fix function name (Bartosz Dziewoński)
+* Fix typo: contian → contain (Bartosz Dziewoński)
+* FlaggedElement: Add description of event and config option (Kirsten Menger-Anderson)
+* Follow-up bade83bfdfc: actually remove ../ (Roan Kattouw)
+* IconElement: Add description for config options (Kirsten Menger-Anderson)
+* IconElement: Add description of methods (Kirsten Menger-Anderson)
+* IndicatorElement: Add description for configs and static properties (Kirsten Menger-Anderson)
+* LabelElement: Add description, config description, static property description (Kirsten Menger-Anderson)
+* MenuOptionWidget: Add description (Kirsten Menger-Anderson)
+* MenuSelectWidget: Add description and mark protected method (Kirsten Menger-Anderson)
+* Move toggle() from Widget to Element (Moriel Schottlender)
+* OptionWidget: Add description and descriptions of methods (Kirsten Menger-Anderson)
+* PopupButtonWidget: Add description and example and mark private method (Kirsten Menger-Anderson)
+* Prefer OO.isPlainObject to $.isPlainObject (Bartosz Dziewoński)
+* RadioOptionWidget: Add description (Kirsten Menger-Anderson)
+* RadioOptionWidget: Make disabling single options work (Bartosz Dziewoński)
+* RadioSelectWidget: Add description and example (Kirsten Menger-Anderson)
+* Remove '$: this.$' from code examples (Bartosz Dziewoński)
+* Remove loop length check (Ed Sanders)
+* SelectWidget: Add description for config, methods, events (Kirsten Menger-Anderson)
+* TabIndexelement: Add description, example, and mark private method (Kirsten Menger-Anderson)
+* TitledElement: Add description and config and static descriptions (Kirsten Menger-Anderson)
+* Update OOjs to v1.1.5 (James D. Forrester)
+* Work around Safari 8 mis-rendering checkboxes in SVG-only distribution (Bartosz Dziewoński)
+* build: Give docparser.rb Ruby 1.9.3 compatibility (Bartosz Dziewoński)
+* build: Include 'lib' and 'dist' in jsduck output (Timo Tijhof)
+* build: Teach docparser about `@member`, `@see`, and PHP pass-by-reference (`&$foo`). (C. Scott Ananian)
+* build: Unbreak docparser.rb (Bartosz Dziewoński)
+* build: Use grunt-contrib-copy instead of custom 'copy' task (Timo Tijhof)
+* composer.json: Add description field (Kunal Mehta)
+* demo: Add disabled RadioInputWidget to demo (Bartosz Dziewoński)
+* tests: Add "composer test" command to lint PHP files and run phpcs (Kunal Mehta)
+* tests: Reduce timeout in Process test from 100 to 10 (Timo Tijhof)
+* tests: Run JS/PHP comparison tests using karma (Bartosz Dziewoński)
+
+## v0.8.0 / 2015-02-18
+### Breaking changes
+* [BREAKING CHANGE] Make default distribution provide SVG with PNG fallback (Bartosz Dziewoński)
+
+### Deprecations
+* [DEPRECATING CHANGE] ButtonWidget: Rename nofollow config option to noFollow (C. Scott Ananian)
+* [DEPRECATING CHANGE] TextInputWidget: Deprecate `icon` and `indicator` events (Bartosz Dziewoński)
+
+### Features
+* TabIndexedElement: Allow tabIndex property to be null (C. Scott Ananian)
+* TextInputWidget: Allow maxLength of 0 in JS (matching PHP) (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Add focus state for frameless button (Prateek Saxena)
+* MediaWiki theme: Fix border width for frameless buttons' focus state (Prateek Saxena)
+* MediaWiki theme: Resynchronize PHP with JS (Bartosz Dziewoński)
+* MediaWiki theme: Use white icons for disabled buttons (Bartosz Dziewoński)
+
+### Code
+* ActionSet: Add `@private` to onActionChange method (Kirsten Menger-Anderson)
+* ActionSet: Add description and example (Kirsten Menger-Anderson)
+* ActionSet: Add description for specialFlags property (Kirsten Menger-Anderson)
+* ActionWidget: Add description (Kirsten Menger-Anderson)
+* Add missing ButtonInputWidget.less and corresponding mixin (Bartosz Dziewoński)
+* ButtonElement: Add description (Kirsten Menger-Anderson)
+* ButtonElement: add `protected` to event handlers (Kirsten Menger-Anderson)
+* ButtonGroupWidget: Add description and example (Kirsten Menger-Anderson)
+* ButtonInputWidget: Add description and example (Kirsten Menger-Anderson)
+* ButtonWidget: Add example and link (Kirsten Menger-Anderson)
+* Dialog: Add description and example (Kirsten Menger-Anderson)
+* DraggableElement: Add description (Kirsten Menger-Anderson)
+* DraggableGroupElement: Add description (Kirsten Menger-Anderson)
+* DropdownWidget: Add `@private` to private methods (Kirsten Menger-Anderson)
+* DropdownWidget: Add description and example (Kirsten Menger-Anderson)
+* DropdownWidget: Simplify redundant code (Bartosz Dziewoński)
+* Element: Add description (Kirsten Menger-Anderson)
+* FieldLayout: Add description (Kirsten Menger-Anderson)
+* FieldLayout: Clean up and remove lies (Bartosz Dziewoński)
+* FlaggedElement: Add description (Kirsten Menger-Anderson)
+* Follow-up 6a6bb90ab: Update CSS file path in eg-iframe.html (Roan Kattouw)
+* Follow-up c762da42: fix ProcessDialog error handling (Roan Kattouw)
+* GroupElement: Add description (Kirsten Menger-Anderson)
+* IconElement: Add description (Kirsten Menger-Anderson)
+* IconElement: Add description and fix display of static properties (Kirsten Menger-Anderson)
+* IconWidget: Add description and example (Kirsten Menger-Anderson)
+* IndicatorElement: Add description (Kirsten Menger-Anderson)
+* InputWidget: Add description (Kirsten Menger-Anderson)
+* PHP: Remove redundant documentation for getInputElement() (Bartosz Dziewoński)
+* Refactor keyboard accessibility of SelectWidgets (Bartosz Dziewoński)
+* SelectWidget: Add description (Kirsten Menger-Anderson)
+* Some documentation tweaks (Bartosz Dziewoński)
+* TextInputWidget: Add missing LabelElement mixin documentation (Ed Sanders)
+* TextInputWidget: Don't add label position classes when there's no label (Bartosz Dziewoński)
+* TextInputWidget: Hide mixin components when unused (Ed Sanders)
+* TextInputWidget: Only put $label in the DOM if needed (Bartosz Dziewoński)
+* TextInputWidget: Use margins for moving the label (Ed Sanders)
+* Update PHP widgets for accessibility-related changes in JS widgets (Bartosz Dziewoński)
+* Use Array.isArray instead of $.isArray (C. Scott Ananian)
+* Various fixes to the PHP implementation (C. Scott Ananian)
+* Widget: Add description (Kirsten Menger-Anderson)
+* Window: Add description (Kirsten Menger-Anderson)
+* WindowManager: Add description (Kirsten Menger-Anderson)
+* build: Pass RuboCop, customize settings (Bartosz Dziewoński)
+* demo: Add horizontal alignment test (Bartosz Dziewoński)
+* PHP demo: Correct path to CSS files (Bartosz Dziewoński)
+* tests: Update JS/PHP comparison test suite (Bartosz Dziewoński)
+* docparser: Add support for `protected` methods (Bartosz Dziewoński)
+* docs: Make `@example` documentation tag work (Roan Kattouw)
+* tests: Fix the check for properties (Bartosz Dziewoński)
+* testsuitegenerator: Only test every pair of config options rather than every triple (Bartosz Dziewoński)
+
+## v0.7.0 / 2015-02-11
+### Breaking changes
+* [BREAKING CHANGE] Remove window isolation (Trevor Parscal)
+
+### Deprecations
+* [DEPRECATING CHANGE] GridLayout should no longer be used, instead use MenuLayout (Bartosz Dziewoński)
+
+### Features
+* ButtonWidget: Add `nofollow` option (C. Scott Ananian)
+* ButtonWidget: Better handle non-string parameters in setHref/setTarget (C. Scott Ananian)
+* PopupWidget: Set $clippable only once, correctly (Bartosz Dziewoński)
+* SelectWidget: `listbox` wrapper role, `aria-selected` state on contents (Derk-Jan Hartman)
+* TabIndexedElement: Actually allow tabIndex of -1 (Bartosz Dziewoński)
+* TextInputWidget: Add required attribute on the basis of required config (Prateek Saxena)
+* TextInputWidget: Use aria-hidden for extra autosize textarea (Prateek Saxena)
+* ToggleSwitchWidget: Accessibility improvements (Bartosz Dziewoński)
+
+### Styles
+* FieldsetLayout: Tweak positioning of help icon (Bartosz Dziewoński)
+* Fade in window frames separately from window overlays (Ed Sanders)
+* MediaWiki theme: Consistent toggle button `active` state (Bartosz Dziewoński)
+* MediaWiki theme: Correct flagged primary button text color when pressed (Bartosz Dziewoński)
+* MediaWiki theme: Fix background color for disabled buttons (Prateek Saxena)
+* MediaWiki theme: Fix non-clickability of radios and checkboxes (Bartosz Dziewoński)
+* MediaWiki theme: Rename `@active` to `@pressed` in button mixins (Prateek Saxena)
+* MediaWiki theme: Rename `@highlight` to `@active` (Prateek Saxena)
+* MediaWiki theme: Rename active-* variables to pressed-* (Prateek Saxena)
+* MediaWiki theme: Use darker color for frameless buttons (Prateek Saxena)
+* MediaWiki theme: Use distribution's image type for backgrounds (Bartosz Dziewoński)
+
+### Code
+* ButtonWidget: Add documentation (Kirsten Menger-Anderson)
+* {Checkbox,Radio}InputWidget: Add missing configuration initialization (Bartosz Dziewoński)
+* DraggableGroupElement: Cleanup unreachable code (Moriel Schottlender)
+* DraggableGroupElement: Make sure it supports button widgets (Moriel Schottlender)
+* DraggableGroupElement: Unset dragged item when dropped (Moriel Schottlender)
+* Delete unused src/themes/apex/{raster,vector}.less (Bartosz Dziewoński)
+* DropdownInputWidget: Fix undefined variable in PHP (Bartosz Dziewoński)
+* DropdownWidget, ComboBoxWidget: Make keyboard-accessible (Bartosz Dziewoński)
+* Fix initialisation of window visible (Ed Sanders)
+* Fix text input auto-height calculation (Ed Sanders)
+* ListToolGroup: Remove hack for jQuery's .show()/.hide() (Bartosz Dziewoński)
+* MenuSelectWidget: Codify current behavior of Tab closing the menu (Bartosz Dziewoński)
+* MenuSelectWidget: Don't clobber other events when unbinding (Bartosz Dziewoński)
+* MenuSelectWidget: Remove dead code (Bartosz Dziewoński)
+* OptionWidgets: Make better use of `scrollIntoViewOnSelect` (Bartosz Dziewoński)
+* PopupElement: Correct documentation (Bartosz Dziewoński)
+* RadioOptionWidget: Make it a `<label />` (Bartosz Dziewoński)
+* Refactor clickability of buttons (Bartosz Dziewoński)
+* Remove usage of `this.$` and `config.$` (Trevor Parscal)
+* Stop treating ApexTheme class unfairly and make it proper (Bartosz Dziewoński)
+* TextInputMenuSelectWidget: Correct documentation (Bartosz Dziewoński)
+* build: Bump various devDependencies (James D. Forrester)
+* demo: Add button style showcase from PHP demo (Bartosz Dziewoński)
+* demo: Reorder widgets into somewhat logical groupings (Bartosz Dziewoński)
+* demo: Stop inline consoles from generating white space (Bartosz Dziewoński)
+* demo: Use properties instead of attributes for `<link>` (Timo Tijhof)
+* PHP demo: Add Vector/Raster and MediaWiki/Apex controls (Bartosz Dziewoński)
+* PHP demo: Just echo the autoload error message, don't trigger_error() (Bartosz Dziewoński)
+* PHP demo: Resynchronize with JS demo (Bartosz Dziewoński)
+* History: Fix date typos (James D. Forrester)
+* tests: Just echo the autoload error message, don't trigger_error() (Bartosz Dziewoński)
+* tools.less: Use distribution's image type and path for background (Prateek Saxena)
+
+## v0.6.6 / 2015-02-04
+### Features
+* BookletLayout#toggleOutline: Fix to use MenuLayout method (Ed Sanders)
+* Remove disabled elements from keyboard navigation flow (Derk-Jan Hartman)
+* TextInputWidget: Mostly revert "Don't try adjusting size when detached" (Bartosz Dziewoński)
+* Use CSS overriding trick to support RTL in menu layouts (Ed Sanders)
+
+### Styles
+* Use standard border colours for progress bars (Ed Sanders)
+
+### Code
+* Use css class instead of jQuery .show()/hide()/toggle() (Moriel Schottlender)
+* build: Use karma to v0.12.31 (Timo Tijhof)
+
+## v0.6.5 / 2015-02-01
+### Code
+* ButtonElement: Unbreak 'pressed' state (Bartosz Dziewoński)
+* Make BookletLayout inherit from MenuLayout instead of embedding a GridLayout (Ed Sanders)
+
+## v0.6.4 / 2015-01-30
+### Features
+* Add inline labels to text widgets (Ed Sanders)
+* BookletLayout: Make sure there is a page before focusing (Moriel Schottlender)
+* DropdownInputWidget: Introduce (Bartosz Dziewoński)
+* InputWidget: Resynchronize our internal .value with DOM .value in #getValue (eranroz)
+* Seriously work around the Chromium scrollbar bug for good this time (Bartosz Dziewoński)
+* TabIndexedElement: Introduce and use (Bartosz Dziewoński)
+* TextInputWidget: Accept `maxLength` configuration option (Bartosz Dziewoński)
+* MenuLayout: Introduce (Ed Sanders)
+* Window#updateSize: Add simpler API (Ed Sanders)
+
+### Styles
+* ActionFieldLayout: Add `nowrap` to the button (Moriel Schottlender)
+* FieldsetLayout: Add help icon (Moriel Schottlender)
+* Fix opening/closing animation on windows (Roan Kattouw)
+* OptionWidget: Unbreak 'pressed' state (Bartosz Dziewoński)
+* Provide default margins for buttons and other widgets (Bartosz Dziewoński)
+* MenuSelectWidget and OptionWidget: Remove the 'flash' feature (Bartosz Dziewoński)
+* MediaWiki theme: Adjust ButtonSelectWidget, ButtonGroupWidget highlights (Prateek Saxena)
+* MediaWiki theme: Adjust MenuOptionWidget selected state (Bartosz Dziewoński)
+* MediaWiki theme: Fix background issues with disabled buttons (Roan Kattouw)
+* MediaWiki theme: Reduce size of checkboxes and radio buttons by 20% (Ed Sanders)
+* MediaWiki theme: Remove SearchWidget's border now dialogs have outline (Ed Sanders)
+* MediaWiki theme: Tweak some more border-radii (Bartosz Dziewoński)
+* MediaWiki theme: Unbreak disabled buttons (Bartosz Dziewoński)
+
+### Code
+* ButtonOptionWidget: Add the TabIndexedElement mixin (Derk-Jan Hartman)
+* InputWidget: Clarify documentation of #getInputElement (Bartosz Dziewoński)
+* PopupButtonWidget: Set aria-haspopup to true (Prateek Saxena)
+* Remove labelPosition check (Ed Sanders)
+* Set input direction in html prop rather than css rule (Moriel Schottlender)
+* TextInputWidget: Don't try adjusting size when detached (Bartosz Dziewoński)
+* TextInputWidget: Remove superfluous role=textbox (Derk-Jan Hartman)
+* ToggleButtonWidget: Set aria-pressed when changing value (Derk-Jan Hartman)
+* ToggleWidget: Use aria-checked (Prateek Saxena)
+* Twiddle things (Ed Sanders)
+* Update OOjs to v1.1.4 and switch to the jQuery-optimised version (James D. Forrester)
+* Widget: Set aria-disabled too in #setDisabled (Derk-Jan Hartman)
+* AUTHORS: Update for the last six months' work (James D. Forrester)
+* build: Bump devDependencies and fix up (James D. Forrester)
+* demo: Have multiline text in multiline widgets (Bartosz Dziewoński)
+* demo: Remove nonexistent 'align' config option for a DropdownWidget (Bartosz Dziewoński)
+
+## v0.6.3 / 2015-01-14
+### Deprecations
+* [DEPRECATING CHANGE] LookupInputWidget should no longer be used, instead use LookupElement
+
+### Features
+* Add an ActionFieldLayout (Moriel Schottlender)
+* Replace old&busted LookupInputWidget with new&hot LookupElement (Bartosz Dziewoński)
+
+### Styles
+* dialog: Provide a 'larger' size for things for which 'large' isn't enough (James D. Forrester)
+* Synchronize ComboBoxWidget and DropdownWidget styles (Bartosz Dziewoński)
+* MediaWiki theme: Adjust toolbar popups' border and shadows (Bartosz Dziewoński)
+* MediaWiki theme: Don't use 'box-shadow' to produce thin grey lines in dialogs (Bartosz Dziewoński)
+
+### Code
+* Toolbar: Update #initialize docs (Bartosz Dziewoński)
+* demo: Switch the default theme from 'Apex' to 'MediaWiki' (Ricordisamoa)
+
+## v0.6.2 / 2015-01-09
+### Features
+* Clear windows when destroying window manager (Ed Sanders)
+* Element: Add support for 'id' config option (Bartosz Dziewoński)
+* TextInputWidget: Add support for 'autofocus' config option (Bartosz Dziewoński)
+
+### Styles
+* Add 'lock' icon (Trevor Parscal)
+* Make `@anchor-size` a LESS variable and calculate borders from it (Ed Sanders)
+* MediaWiki theme: Slightly reduce size of indicator arrows (Ed Sanders)
+* MediaWiki theme: Remove text-shadow on button (Prateek Saxena)
+* MediaWiki theme: Fix focus state for buttons (Prateek Saxena)
+* MediaWiki theme: Add state change transition to checkbox (Prateek Saxena)
+* MediaWiki theme: Fix disabled state of buttons (Prateek Saxena)
+* MediaWiki theme: Fix overlap between hover and active states (Prateek Saxena)
+
+### Code
+* Don't test abstract classes (Bartosz Dziewoński)
+* PHP LabelElement: Actually allow non-plaintext labels (Bartosz Dziewoński)
+* Synchronize `@abstract` class annotations between PHP and JS (Bartosz Dziewoński)
+* WindowManager#removeWindows: Documentation fix (Ed Sanders)
+* tests: Don't overwrite 'id' attribute (Bartosz Dziewoński)
+* testsuitegenerator.rb: Handle inheritance chains (Bartosz Dziewoński)
+
+## v0.6.1 / 2015-01-05
+### Styles
+* FieldsetLayout: Shrink size of label and bump the weight to compensate (James D. Forrester)
+
+### Code
+* Remove use of `Math.round()` for offset and position pixel values (Bartosz Dziewoński)
+* ButtonElement: Inherit all 'font' styles, not only 'font-family' (Bartosz Dziewoński)
+* IndicatorElement: Fix 'indicatorTitle' config option (Bartosz Dziewoński)
+* Error: Unmark as `@abstract` (Bartosz Dziewoński)
+* JSPHP-suite.json: Update (Bartosz Dziewoński)
+* build: Update various devDependencies (James D. Forrester)
+* readme: Update badges (Timo Tijhof)
+* readme: No need to put the same heading in twice (James D. Forrester)
+
+## v0.6.0 / 2014-12-16
+### Breaking changes
+* [BREAKING CHANGE] PopupToolGroup and friends: Pay off technical debt (Bartosz Dziewoński)
+
+### Features
+* Prevent parent window scroll in modal mode using overflow hidden (Ed Sanders)
+* ClippableElement: Handle clipping with left edge (Bartosz Dziewoński)
+
+### Styles
+* ButtonGroupWidget: Remove weird margin-bottom: -1px; from theme styles (Bartosz Dziewoński)
+* MediaWiki theme: RadioInputWidget tweaks (Bartosz Dziewoński)
+
+### Code
+* Sprinkle some child selectors around in BookletLayout styles (Roan Kattouw)
+
+## v0.5.0 / 2014-12-12
+### Breaking changes
+* [BREAKING CHANGE] FieldLayout: Handle 'inline' alignment better (Bartosz Dziewoński)
+* [BREAKING CHANGE] Split primary flag into primary and progressive (Trevor Parscal)
+* [BREAKING CHANGE] CheckboxInputWidget: Allow setting HTML 'value' attribute (Bartosz Dziewoński)
+
+### Features
+* Element.getClosestScrollableContainer: Use 'body' or 'documentElement' based on browser (Prateek Saxena)
+* Give non-isolated windows a tabIndex for selection holding (Ed Sanders)
+* Call .off() correctly in setButtonElement() (Roan Kattouw)
+
+### Styles
+* FieldLayout: In styles, don't assume that label is given (Bartosz Dziewoński)
+* PopupWidget: Remove box-shadow rule that generates invisible shadow (Bartosz Dziewoński)
+* TextInputWidget: Set vertical-align: middle, like buttons (Bartosz Dziewoński)
+* MediaWiki theme: Add hover state to listToolGroup (Trevor Parscal)
+* MediaWiki theme: Add radio buttons (Prateek Saxena)
+* MediaWiki theme: Add state transition to radio buttons (Prateek Saxena)
+* MediaWiki theme: Add thematic border to the bottom of toolbars (Bartosz Dziewoński)
+* MediaWiki theme: Copy .theme-oo-ui-outline{Controls,Option}Widget from Apex (Bartosz Dziewoński)
+* MediaWiki theme: Extract @active-color variable (Bartosz Dziewoński)
+* MediaWiki theme: Improve search widget styling (Trevor Parscal)
+* MediaWiki theme: Make button sizes match Apex (Trevor Parscal)
+* MediaWiki theme: Use gray instead of blue for select and highlight (Trevor Parscal)
+* MediaWiki theme: checkbox: Fix states according to spec (Prateek Saxena)
+
+### Code
+* Account for `<html>` rather than `<body>` being the scrollable root in Chrome (Bartosz Dziewoński)
+* ClippableElement: 7 is a better number than 10 (Bartosz Dziewoński)
+* Don't set line-height of unset button labels (Bartosz Dziewoński)
+* FieldLayout: Synchronise PHP with JS (Bartosz Dziewoński)
+* FieldLayout: Use `<label>` for this.$body, not this.$element (Bartosz Dziewoński)
+* Fix primary button description text (Niklas Laxström)
+* GridLayout: Don't round to 1% (Bartosz Dziewoński)
+* Kill the escape keydown event after handling a window close (Ed Sanders)
+* RadioInputWidget: Remove documentation lies (Bartosz Dziewoński)
+* Temporarily remove position:absolute on body when resizing (Ed Sanders)
+* build: Use String#slice instead of discouraged String#substr (Timo Tijhof)
+* testsuitegenerator: Actually filter out non-unique combinations (Bartosz Dziewoński)
+* README.md: Drop localisation update auto-commits from release notes (James D. Forrester)
+* README.md: Point to Phabricator, not Bugzilla (James D. Forrester)
+
+## v0.4.0 / 2014-12-05
+### Breaking changes
+* [BREAKING CHANGE] Remove deprecated Element#onDOMEvent and #offDOMEvent (Bartosz Dziewoński)
+* [BREAKING CHANGE] Make a number of Element getters static (Bartosz Dziewoński)
+* [BREAKING CHANGE] Rename BookletLayout#getPageName → #getCurrentPageName (Bartosz Dziewoński)
+
+### Features
+* IconElement: Add missing #getIconTitle (Bartosz Dziewoński)
+
+### Styles
+* Follow-up I859ff276e: Add cursor files to repo (Trevor Parscal)
+
+### Code
+* SelectWidget: Rewrite #getRelativeSelectableItem (Bartosz Dziewoński)
+* demo: Don't put buttons in a FieldsetLayout without FieldLayouts around them (Bartosz Dziewoński)
+
+## v0.3.0 / 2014-12-04
+### Breaking changes
+* [BREAKING CHANGE] ButtonWidget: Don't default 'target' to 'blank' (Bartosz Dziewoński)
+
+### Features
+* InputWidget: Update DOM value before firing 'change' event (Bartosz Dziewoński)
+
+### Styles
+* MediaWiki theme: Reduce indentation in theme-oo-ui-checkboxInputWidget (Prateek Saxena)
+
+### Code
+* Adding DraggableGroupElement and DraggableElement mixins (Moriel Schottlender)
+* Remove window even if closing promise rejects (Ed Sanders)
+* TextInputWidget: Reuse a single clone instead of appending and removing new ones (Prateek Saxena)
+* Fix lies in documentation (Trevor Parscal)
+* build: Have grunt watch run 'quick-build' instead of 'build' (Prateek Saxena)
+
+## v0.2.4 / 2014-12-02
+### Features
+* MessageDialog: Fit actions again when the dialog is resized (Bartosz Dziewoński)
+* Window: Avoid height flickering when resizing dialogs (Bartosz Dziewoński)
+
+### Code
+* TextInputWidget: Use .css( propertyName, value ) instead of .css( properties) for single property (Prateek Saxena)
+* TextInputWidget: Stop adjustSize if the value of the textarea is the same (Prateek Saxena)
+
+## v0.2.3 / 2014-11-26
+### Features
+* BookletLayout: Make #focus not crash when there are zero pages or when there is no outline (Roan Kattouw)
+* Dialog: Only handle escape events when open (Alex Monk)
+* Pass original event with TextInputWidget#enter (Ed Sanders)
+* MessageDialog: Add Firefox hack for scrollbars when sizing dialogs (Bartosz Dziewoński)
+* MessageDialog: Actually correctly calculate and set height (Bartosz Dziewoński)
+* Window: Disable transitions when changing window height to calculate content height (Bartosz Dziewoński)
+
+### Code
+* Add missing documentation to ToolFactory (Ed Sanders)
+* Fix RadioOptionWidget demos (Trevor Parscal)
+* RadioOptionWidget: Remove lies from documentation (Trevor Parscal)
+* RadioOptionWidget: Increase rule specificity to match OptionWidget (Bartosz Dziewoński)
+
+## v0.2.2 / 2014-11-25
+### Features
+* MessageDialog: Fit actions after updating window size, not before (Bartosz Dziewoński)
+* ProcessDialog, MessageDialog: Support iconed actions (Bartosz Dziewoński)
+
+### Styles
+* Remove padding from undecorated option widgets (Ed Sanders)
+
+### Code
+* LabelWidget: Add missing documentation for input configuration option (Ed Sanders)
+* MessageDialog: Use the right superclass (Bartosz Dziewoński)
+* build: Add .npmignore (Timo Tijhof)
+
+## v0.2.1 / 2014-11-24
+
+### Features
+* Add focus method to BookletLayout (Roan Kattouw)
+* Start the window opening transition before ready, not after (Roan Kattouw)
+
+### Code
+* LabelElement: Kill inline styles (Bartosz Dziewoński)
+* Add missing History.md file now we're a proper repo (James D. Forrester)
+* readme: Update introduction, badges, advice (James D. Forrester)
+* composer: Rename package to 'oojs-ui' and require php 5.3.3 (Timo Tijhof)
+
+## v0.2.0 / 2014-11-17
+* First versioned release
+
+## v0.1.0 / 2013-11-13
+* Initial export of repo
--- /dev/null
+Copyright 2011-2018 OOUI Team and other contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null
+[![npm](https://img.shields.io/npm/v/oojs-ui.svg?style=flat)](https://www.npmjs.com/package/oojs-ui) [![Packagist](https://img.shields.io/packagist/v/oojs/oojs-ui.svg?style=flat)](https://packagist.org/packages/oojs/oojs-ui) [![David](https://img.shields.io/david/dev/wikimedia/oojs-ui.svg?style=flat)](https://david-dm.org/wikimedia/oojs-ui#info=devDependencies)
+
+OOUI
+=================
+
+OOUI is a component-based JavaScript UI library. Key features:
+
+* Common widgets, layouts, and dialogs
+* Classes, elements, and mixins to create custom interfaces
+* Internationalization and localization, like right-to-left (RTL) languages support
+* Theme-ability
+* Built-in icons
+* Accessibility features
+
+It is the standard library for Web products at the Wikimedia Foundation, having been originally created for use by [VisualEditor](https://www.mediawiki.org/wiki/VisualEditor).
+
+
+Quick start
+----------
+
+The library is available on [npm](https://www.npmjs.com/package/oojs-ui). To install:
+
+<pre lang="bash">
+$ npm install oojs-ui
+</pre>
+
+Once installed, include the following scripts and styles to get started:
+
+<pre lang="html">
+<script src="node_modules/jquery/dist/jquery.min.js"></script>
+<script src="node_modules/oojs/dist/oojs.min.js"></script>
+
+<script src="node_modules/oojs-ui/dist/oojs-ui.min.js"></script>
+<script src="node_modules/oojs-ui/dist/oojs-ui-wikimediaui.min.js"></script>
+<link rel="stylesheet" href="node_modules/oojs-ui/dist/oojs-ui-wikimediaui.min.css">
+</pre>
+
+
+Loading the library
+-------------------
+
+While the distribution directory is chock-full of files, you will normally load only the following three:
+
+* `oojs-ui.js`, containing the full library;
+* One of `oojs-ui-wikimediaui.css` or `oojs-ui-apex.css`, containing theme-specific styles; and
+* One of `oojs-ui-wikimediaui.js` or `oojs-ui-apex.js`, containing theme-specific code
+
+You can load additional icon packs from files named `oojs-ui-wikimediaui-icons-*.css` or `oojs-ui-apex-icons-*.css`.
+
+The remaining files make it possible to load only parts of the whole library.
+
+Furthermore, every CSS file has a right-to-left (RTL) version available, to be used on pages using right-to-left languages if your environment doesn't automatically flip them as needed.
+
+
+Issue tracker
+-------------
+
+Found a bug or missing feature? Please report it in our [issue tracker Phabricator](https://phabricator.wikimedia.org/maniphest/task/edit/form/1/?projects=PHID-PROJ-dgmoevjqeqlerleqzzx5)!
+
+
+Contributing
+------------
+
+We are always delighted when people contribute patches. To setup your development environment:
+
+
+1. Clone the repo: `$ git clone https://phabricator.wikimedia.org/diffusion/GOJU/oojs-ui.git oojs-ui`
+
+2. Move into the library directory:<br>`$ cd oojs-ui`
+
+3. Install [composer](https://getcomposer.org/download/) and make sure running `composer` will execute it (*e.g.* add it to `$PATH` in POSIX environments).
+
+4. Install dev dependencies:<br>`$ npm install`
+
+5. Build the library (you can alternatively use `grunt quick-build` if you don't need to rebuild the PNGs):<br>`$ grunt build`
+
+6. You can see a suite of demos in `/demos` by executing:<br>`$ npm run-script demos`
+
+7. You can also copy the distribution files from the dist directory into your project.
+
+
+We use [Gerrit](https://gerrit.wikimedia.org/) for code review, and [Phabricator](https://phabricator.wikimedia.org) to track issues. To contribute patches or join discussions all you need is a [developer account](https://wikitech.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Help%3AGetting+Started).
+
+* If you've found a bug, or wish to request a feature [raise a ticket on Phabricator](https://phabricator.wikimedia.org/maniphest/task/edit/form/1/?projects=PHID-PROJ-dgmoevjqeqlerleqzzx5).
+* To submit your patch, follow [the "getting started" quick-guide](https://www.mediawiki.org/wiki/Gerrit/Getting_started). We try to review patches within a week.
+* We automatically lint and style-check changes to JavaScript, PHP, LESS/CSS, Ruby and JSON files. You can test these yourself with `npm test` and `composer test` locally before pushing changes. SVG files should be squashed in advance of committing with [SVGO](https://github.com/svg/svgo) using `svgo --pretty --disable=removeXMLProcInst --disable=cleanupIDs <filename>`.
+
+A new version of the library is released most weeks on Tuesdays.
+
+Community
+---------
+
+Get updates, ask questions and join the discussion with maintainers and contributors:
+
+* Join the Wikimedia Developers mailing list, [wikitech-l](https://lists.wikimedia.org/mailman/listinfo/wikitech-l).
+* Chat with the maintainers on `#wikimedia-dev` on `irc.freenode.net`.
+* Ask questions on [StackOverflow](https://stackoverflow.com/tags/oojs-ui/info).
+* Watchlist the [documentation](https://www.mediawiki.org/wiki/OOUI) on MediaWiki to stay updated.
+
+
+Versioning
+----------
+
+We use the [Semantic Versioning guidelines](http://semver.org/).
+
+Releases will be numbered in the following format:
+
+`<major>.<minor>.<patch>`
+
+
+Release
+----------
+
+Release process:
+<pre lang="bash">
+
+ $ cd path/to/oojs-ui/
+ $ git remote update
+ $ git checkout -B release -t origin/master
+
+ # Ensure tests pass
+ $ npm install && composer update && npm test && composer test
+
+ # Avoid using "npm version patch" because that creates
+ # both a commit and a tag, and we shouldn't tag until after
+ # the commit is merged.
+
+ # Update release notes
+ # Copy the resulting list into a new section at the top of History.md and edit
+ # into five sub-sections, in order:
+ # * Breaking changes
+ # * Deprecations
+ # * Features
+ # * Styles
+ # * Code
+ $ git log --format='* %s (%aN)' --no-merges --reverse v$(node -e 'console.log(require("./package.json").version);')...HEAD | grep -v "Localisation updates from" | sort
+ $ edit History.md
+
+ # Update the version number
+ $ edit package.json
+
+ $ git add -p
+ $ git commit -m "Tag vX.X.X"
+ $ git review
+
+ # After merging:
+ $ git remote update
+ $ git checkout origin/master
+ $ git tag "vX.X.X"
+ $ npm run publish-build && git push --tags && npm publish
+
+</pre>
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
.oo-ui-element-hidden {
display: none !important;
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
/**
* WikimediaUI Base v0.10.0
.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
right: 1.07142857em;
}
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button,
-.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement > .oo-ui-buttonElement-button {
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button {
padding-right: 2.28571429em;
}
.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
/**
* WikimediaUI Base v0.10.0
padding-top: 3em;
padding-left: 3em;
}
+.oo-ui-toolbar-narrow .oo-ui-tool .oo-ui-tool-link {
+ padding-left: 2.85714286em;
+}
.oo-ui-tool-with-label .oo-ui-tool-link {
padding: 1em 0.85714286em 0.92857143em 2.64285714em;
}
display: block;
left: 0.78571429em;
}
+.oo-ui-toolbar-narrow .oo-ui-tool.oo-ui-iconElement .oo-ui-iconElement-icon {
+ left: 0.71428571em;
+}
.oo-ui-tool .oo-ui-tool-title {
line-height: 1.07142857em;
}
.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.iconElement > .oo-ui-tool-link > .oo-ui-iconElement-icon {
display: block;
}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool + .oo-ui-tool {
+ margin-left: -2px;
+}
.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool:not( .oo-ui-toolGroupTool ).oo-ui-widget-enabled:hover {
background-color: #eaecf0;
}
.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
text-align: right;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup {
+ min-width: 2.85714286em;
+}
.oo-ui-popupToolGroup.oo-ui-indicatorElement:not( .oo-ui-labelElement ):not( .oo-ui-iconElement ) {
min-width: 1.85714286em;
}
.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
left: 0.78571429em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+ left: 0.71428571em;
+}
.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
background-position: center 52%;
right: 0.57142857em;
.oo-ui-popupToolGroup.oo-ui-iconElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle {
padding-left: 3em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-iconElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle {
+ padding-left: 2.85714286em;
+}
.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle {
padding: 1em 0.85714286em 0.92857143em;
}
.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
line-height: 1.07142857em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle {
+ padding-left: 0.71428571em;
+ padding-right: 0.71428571em;
+}
.oo-ui-popupToolGroup.oo-ui-iconElement.oo-ui-labelElement .oo-ui-popupToolGroup-handle {
padding-left: 2.64285714em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-iconElement.oo-ui-labelElement .oo-ui-popupToolGroup-handle {
+ padding-left: 2.5em;
+}
.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle {
padding-right: 1.85714286em;
}
font-weight: bold;
line-height: 2.28571429em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup-header {
+ padding: 0 0.71428571em;
+}
.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
margin: 0 -1px;
border: 1px solid #c8ccd1;
.oo-ui-popupToolGroup .oo-ui-tool-link {
padding: 1em 0.85714286em 0.92857143em 2.64285714em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup .oo-ui-tool-link {
+ padding-left: 0.71428571em;
+ padding-right: 2.5em;
+}
.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
color: #222;
}
.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not( :empty ) {
padding-left: 1.28571429em;
}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not( :empty ) {
+ padding-left: 1.14285714em;
+}
.oo-ui-popupToolGroup.oo-ui-widget-enabled > .oo-ui-popupToolGroup-handle {
-webkit-transition: background-color 100ms, box-shadow 100ms;
-moz-transition: background-color 100ms, box-shadow 100ms;
display: block;
}
.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
- min-width: 10em;
+ min-width: 140px;
}
.oo-ui-toolbar-narrow .oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
- min-width: 8.125em;
+ min-width: 100px;
}
.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
left: 0.78571429em;
}
+.oo-ui-toolbar-narrow .oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+ left: 0.71428571em;
+}
.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
background-image: url('themes/wikimediaui/images/icons/check-progressive.png');
background-image: linear-gradient(transparent, transparent), /* @embed */ url('themes/wikimediaui/images/icons/check-progressive.svg');
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
cursor: move;
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
/**
* WikimediaUI Base v0.10.0
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:57Z
+ * Date: 2018-03-23T23:42:37Z
*/
/**
* WikimediaUI Base v0.10.0
/*!
- * OOUI v0.26.0
+ * OOUI v0.26.1
* https://www.mediawiki.org/wiki/OOUI
*
* Copyright 2011–2018 OOUI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2018-03-21T00:00:53Z
+ * Date: 2018-03-23T23:42:32Z
*/
( function ( OO ) {
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="2 2 20 20"><path fill-rule="evenodd" d="M5 21l7-6 7 6V3H5z"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="2 2 20 20"><path fill-rule="evenodd" d="M17.5 4.5v13.2L12 13.5l-5.5 4.2V4.5zM5 21l7-6 7 6V3H5z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>advanced</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>advanced</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>advanced</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>advanced</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>advanced</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>advanced</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>align left</title><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>align left</title><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align left</title><path d="M1 15h18v2H1zm11-8h7v2h-7zm0 4h7v2h-7zM1 3h18v2H1z"/><rect width="8" height="6" x="1" y="7" rx="1" ry="1"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>align right</title><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>align right</title><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>align right</title><path d="M1 15h18v2H1zm0-8h7v2H1zm0 4h7v2H1zm0-8h18v2H1z"/><rect width="8" height="6" x="11" y="7" rx="1" ry="1"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>article</title><path d="M3 3v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2zm12 2h-5V4h5zm0 2h-5V6h5zm0 2h-5V8h5zM5 14h10v1H5zm0-2h10v1H5zm0-2h10v1H5zm0-6h4v5H5z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>article</title><path d="M3 3v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2zm12 2h-5V4h5zm0 2h-5V6h5zm0 2h-5V8h5zM5 14h10v1H5zm0-2h10v1H5zm0-2h10v1H5zm0-6h4v5H5z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>article</title><path d="M3 3v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2zm12 2h-5V4h5zm0 2h-5V6h5zm0 2h-5V8h5zM5 14h10v1H5zm0-2h10v1H5zm0-2h10v1H5zm0-6h4v5H5z"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>bookmark</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>bookmark</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>bookmark</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2z"/></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>bookmark outlined</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2zm0 14.25l-5-3.5-5 3.5V3h10z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>bookmark outlined</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2zm0 14.25l-5-3.5-5 3.5V3h10z"/></g></svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>bookmark outlined</title><path d="M15 1H5a2 2 0 0 0-2 2v16l7-5 7 5V3a2 2 0 0 0-2-2zm0 14.25l-5-3.5-5 3.5V3h10z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>help</title><path d="M10 0a10 10 0 1 0 10 10A10 10 0 0 0 10 0zm1 16H9v-2h2zm2.71-7.6a2.63 2.63 0 0 1-.34.74 3.06 3.06 0 0 1-.48.55l-.54.48c-.21.18-.41.35-.59.52a3 3 0 0 0-.47.56A2.49 2.49 0 0 0 11 12a4.12 4.12 0 0 0-.11 1H9.08a8.68 8.68 0 0 1 .08-1.25 3.54 3.54 0 0 1 .24-.9 2.81 2.81 0 0 1 .41-.68 4.63 4.63 0 0 1 .58-.58l.51-.44a3 3 0 0 0 .44-.45 1.92 1.92 0 0 0 .3-.54 2.13 2.13 0 0 0 .11-.72 1.94 1.94 0 0 0-.18-.86 1.79 1.79 0 0 0-.43-.58 1.69 1.69 0 0 0-.54-.32 1.55 1.55 0 0 0-.5-.1 1.77 1.77 0 0 0-1.53.68 3 3 0 0 0-.49 1.82H6.16a4.84 4.84 0 0 1 .28-1.68 3.57 3.57 0 0 1 .8-1.29 3.62 3.62 0 0 1 1.27-.83A4.52 4.52 0 0 1 10.18 4a4.42 4.42 0 0 1 1.43.23 3.48 3.48 0 0 1 1.16.65 3 3 0 0 1 .78 1.06 3.49 3.49 0 0 1 .28 1.44 3.63 3.63 0 0 1-.12 1.02z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>help</title><path d="M10 0a10 10 0 1 0 10 10A10 10 0 0 0 10 0zm1 16H9v-2h2zm2.71-7.6a2.63 2.63 0 0 1-.34.74 3.06 3.06 0 0 1-.48.55l-.54.48c-.21.18-.41.35-.59.52a3 3 0 0 0-.47.56A2.49 2.49 0 0 0 11 12a4.12 4.12 0 0 0-.11 1H9.08a8.68 8.68 0 0 1 .08-1.25 3.54 3.54 0 0 1 .24-.9 2.81 2.81 0 0 1 .41-.68 4.63 4.63 0 0 1 .58-.58l.51-.44a3 3 0 0 0 .44-.45 1.92 1.92 0 0 0 .3-.54 2.13 2.13 0 0 0 .11-.72 1.94 1.94 0 0 0-.18-.86 1.79 1.79 0 0 0-.43-.58 1.69 1.69 0 0 0-.54-.32 1.55 1.55 0 0 0-.5-.1 1.77 1.77 0 0 0-1.53.68 3 3 0 0 0-.49 1.82H6.16a4.84 4.84 0 0 1 .28-1.68 3.57 3.57 0 0 1 .8-1.29 3.62 3.62 0 0 1 1.27-.83A4.52 4.52 0 0 1 10.18 4a4.42 4.42 0 0 1 1.43.23 3.48 3.48 0 0 1 1.16.65 3 3 0 0 1 .78 1.06 3.49 3.49 0 0 1 .28 1.44 3.63 3.63 0 0 1-.12 1.02z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M10 0a10 10 0 1 0 10 10A10 10 0 0 0 10 0zm1 16H9v-2h2zm2.71-7.6a2.63 2.63 0 0 1-.34.74 3.06 3.06 0 0 1-.48.55l-.54.48c-.21.18-.41.35-.59.52a3 3 0 0 0-.47.56A2.49 2.49 0 0 0 11 12a4.12 4.12 0 0 0-.11 1H9.08a8.68 8.68 0 0 1 .08-1.25 3.54 3.54 0 0 1 .24-.9 2.81 2.81 0 0 1 .41-.68 4.63 4.63 0 0 1 .58-.58l.51-.44a3 3 0 0 0 .44-.45 1.92 1.92 0 0 0 .3-.54 2.13 2.13 0 0 0 .11-.72 1.94 1.94 0 0 0-.18-.86 1.79 1.79 0 0 0-.43-.58 1.69 1.69 0 0 0-.54-.32 1.55 1.55 0 0 0-.5-.1 1.77 1.77 0 0 0-1.53.68 3 3 0 0 0-.49 1.82H6.16a4.84 4.84 0 0 1 .28-1.68 3.57 3.57 0 0 1 .8-1.29 3.62 3.62 0 0 1 1.27-.83A4.52 4.52 0 0 1 10.18 4a4.42 4.42 0 0 1 1.43.23 3.48 3.48 0 0 1 1.16.65 3 3 0 0 1 .78 1.06 3.49 3.49 0 0 1 .28 1.44 3.63 3.63 0 0 1-.12 1.02z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>help</title><path d="M10.06 1C13 1 15 2.89 15 5.53a4.59 4.59 0 0 1-2.29 4.08c-1.42.92-1.82 1.53-1.82 2.71V13H8.38v-.81a3.84 3.84 0 0 1 2-3.84c1.34-.9 1.79-1.53 1.79-2.71a2.1 2.1 0 0 0-2.08-2.14h-.17a2.3 2.3 0 0 0-2.38 2.22v.17H5A4.71 4.71 0 0 1 9.51 1a5 5 0 0 1 .55 0zM8 17a1.89 1.89 0 0 1 1.77-2H10a1.87 1.87 0 0 1 2 1.73 1.22 1.22 0 0 1 0 .27 1.87 1.87 0 0 1-1.73 2 1.22 1.22 0 0 1-.27 0 1.88 1.88 0 0 1-2-1.75A1 1 0 0 1 8 17z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>settings</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>settings</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>settings</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>settings</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>settings</title><path d="M10 2.5a7.5 7.5 0 1 0 7.5 7.5A7.5 7.5 0 0 0 10 2.5zm0 11a3.5 3.5 0 1 1 3.5-3.5 3.5 3.5 0 0 1-3.5 3.5z"/><path d="M12 3.29L11.5 0h-3L8 3.29a7 7 0 0 1 4 0zM8 16.71L8.5 20h3l.5-3.29a7 7 0 0 1-4 0zm8.16-10.04l2-2.68L16 1.87l-2.68 2a7 7 0 0 1 2.83 2.83zM3.84 13.33L1.87 16 4 18.13l2.68-2a7 7 0 0 1-2.83-2.83zM16.71 12l3.29-.5v-3L16.71 8a7 7 0 0 1 0 4zM3.29 8L0 8.5v3l3.29.5a7 7 0 0 1 0-4zm10.04 8.16l2.68 2L18.13 16l-2-2.68a7 7 0 0 1-2.83 2.83zM6.67 3.84L4 1.87 1.87 4l2 2.68a7 7 0 0 1 2.8-2.84z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>settings</title><circle cx="10" cy="10" r="1.75"/><path d="M15 1H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm0 9.75l-1.37.25a3.73 3.73 0 0 1-.38.93l.82 1.07L13 14.07l-1.12-.82a3.73 3.73 0 0 1-.93.38l-.2 1.37h-1.5L9 13.63a3.73 3.73 0 0 1-.93-.38L7 14.07 5.93 13l.82-1.12a3.73 3.73 0 0 1-.38-.88L5 10.75v-1.5L6.37 9a3.72 3.72 0 0 1 .38-.93L5.93 7 7 5.93l1.12.82A3.73 3.73 0 0 1 9 6.37L9.25 5h1.5L11 6.37a3.74 3.74 0 0 1 .93.38L13 5.93 14.07 7l-.82 1.12a3.73 3.73 0 0 1 .38.93l1.37.2z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>speech bubbles</title><path d="M17 1H3a2 2 0 0 0-2 2v16l4-4h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>speech bubbles</title><path d="M18 4h-1v7a2 2 0 0 1-2 2H4v1a2 2 0 0 0 2 2h10l4 4V6a2 2 0 0 0-2-2z"/><path d="M14 0H2a2 2 0 0 0-2 2v14l4-4h10a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>speech bubbles</title><path d="M17 1H3a2 2 0 0 0-2 2v16l4-4h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>speech bubbles</title><path d="M18 4h-1v7a2 2 0 0 1-2 2H4v1a2 2 0 0 0 2 2h10l4 4V6a2 2 0 0 0-2-2z"/><path d="M14 0H2a2 2 0 0 0-2 2v14l4-4h10a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>speech bubbles</title><path d="M17 1H3a2 2 0 0 0-2 2v16l4-4h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>speech bubbles</title><path d="M18 4h-1v7a2 2 0 0 1-2 2H4v1a2 2 0 0 0 2 2h10l4 4V6a2 2 0 0 0-2-2z"/><path d="M14 0H2a2 2 0 0 0-2 2v14l4-4h10a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>speech bubbles</title><path d="M1 3v10c0 1.1.9 2 2 2h12l4 4V3c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>speech bubbles</title><path d="M0 6v14l4-4h10c1.1 0 2-.9 2-2v-1H5c-1.1 0-2-.9-2-2V4H2C.9 4 0 4.9 0 6z"/><path d="M4 2v8c0 1.1.9 2 2 2h10l4 4V2c0-1.1-.9-2-2-2H6C4.9 0 4 .9 4 2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>speech bubbles</title><path d="M1 3v10c0 1.1.9 2 2 2h12l4 4V3c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>speech bubbles</title><path d="M0 6v14l4-4h10c1.1 0 2-.9 2-2v-1H5c-1.1 0-2-.9-2-2V4H2C.9 4 0 4.9 0 6z"/><path d="M4 2v8c0 1.1.9 2 2 2h10l4 4V2c0-1.1-.9-2-2-2H6C4.9 0 4 .9 4 2z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>speech bubbles</title><path d="M1 3v10c0 1.1.9 2 2 2h12l4 4V3c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>speech bubbles</title><path d="M0 6v14l4-4h10c1.1 0 2-.9 2-2v-1H5c-1.1 0-2-.9-2-2V4H2C.9 4 0 4.9 0 6z"/><path d="M4 2v8c0 1.1.9 2 2 2h10l4 4V2c0-1.1-.9-2-2-2H6C4.9 0 4 .9 4 2z"/></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>underline</title><path d="M3 18h14v2H3zm7-4.1a4.92 4.92 0 0 0 2-.37 4.09 4.09 0 0 0 1.45-1 4.51 4.51 0 0 0 .91-1.58 6.25 6.25 0 0 0 .31-2V1H17v7.9a8 8 0 0 1-.48 2.82A6.56 6.56 0 0 1 15.13 14a6.34 6.34 0 0 1-2.2 1.49A7.56 7.56 0 0 1 10 16a7.56 7.56 0 0 1-2.92-.54A6.4 6.4 0 0 1 4.88 14a6.5 6.5 0 0 1-1.39-2.25A8 8 0 0 1 3 8.9V1h2.37v7.88a6.27 6.27 0 0 0 .31 2 4.51 4.51 0 0 0 .91 1.58 4.15 4.15 0 0 0 1.46 1 4.89 4.89 0 0 0 1.95.44z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#fff"><title>underline</title><path d="M3 17h14v2H3zM7.704 10.274L10 3.731l2.296 6.543zM14.322 16H17L11.5 2h-3L3 16h2.678l1.418-3.995h5.808z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>underline</title><path d="M3 18h14v2H3zm7-4.1a4.92 4.92 0 0 0 2-.37 4.09 4.09 0 0 0 1.45-1 4.51 4.51 0 0 0 .91-1.58 6.25 6.25 0 0 0 .31-2V1H17v7.9a8 8 0 0 1-.48 2.82A6.56 6.56 0 0 1 15.13 14a6.34 6.34 0 0 1-2.2 1.49A7.56 7.56 0 0 1 10 16a7.56 7.56 0 0 1-2.92-.54A6.4 6.4 0 0 1 4.88 14a6.5 6.5 0 0 1-1.39-2.25A8 8 0 0 1 3 8.9V1h2.37v7.88a6.27 6.27 0 0 0 .31 2 4.51 4.51 0 0 0 .91 1.58 4.15 4.15 0 0 0 1.46 1 4.89 4.89 0 0 0 1.95.44z"/></g></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="#36c"><title>underline</title><path d="M3 17h14v2H3zM7.704 10.274L10 3.731l2.296 6.543zM14.322 16H17L11.5 2h-3L3 16h2.678l1.418-3.995h5.808z"/></g></svg>
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>underline</title><path d="M3 18h14v2H3zm7-4.1a4.92 4.92 0 0 0 2-.37 4.09 4.09 0 0 0 1.45-1 4.51 4.51 0 0 0 .91-1.58 6.25 6.25 0 0 0 .31-2V1H17v7.9a8 8 0 0 1-.48 2.82A6.56 6.56 0 0 1 15.13 14a6.34 6.34 0 0 1-2.2 1.49A7.56 7.56 0 0 1 10 16a7.56 7.56 0 0 1-2.92-.54A6.4 6.4 0 0 1 4.88 14a6.5 6.5 0 0 1-1.39-2.25A8 8 0 0 1 3 8.9V1h2.37v7.88a6.27 6.27 0 0 0 .31 2 4.51 4.51 0 0 0 .91 1.58 4.15 4.15 0 0 0 1.46 1 4.89 4.89 0 0 0 1.95.44z"/></svg>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><title>underline</title><path d="M3 17h14v2H3zM7.704 10.274L10 3.731l2.296 6.543zM14.322 16H17L11.5 2h-3L3 16h2.678l1.418-3.995h5.808z"/></svg>
\ No newline at end of file
* When the user right-clicks in a heading, it will open the
* edit screen.
*/
-jQuery( function ( $ ) {
- // Select all h1-h6 elements that contain editsection links
- // Don't use the ":has:(.mw-editsection a)" selector because it performs very bad.
- // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
+( function ( $ ) {
+ // Trigger this when a contextmenu click on the page targets an h1-h6 element.
+ // This uses a delegate handler which 1) starts immediately instead of blocking
+ // response on dom-ready, and 2) selects and binds once instead of N times.
$( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
+ // Don't use ":has:(.mw-editsection a)" in the selector because it's slow.
var $edit = $( this ).find( '.mw-editsection a' );
if ( !$edit.length ) {
return;
$edit.get( 0 ).click();
}
} );
-} );
+}( jQuery ) );
position: absolute;
top: 50%;
.transform( translateY( -50% ) );
-
- // HACK: Following overrides help icon size and centers it
- &.oo-ui-widget.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
- box-sizing: content-box;
- padding: 0;
-
- .oo-ui-icon-help {
- min-width: initial;
- min-height: initial;
- width: 1.4em;
- height: 1.4em;
- margin-top: 0.2375em;
- }
- }
}
&-header {
$label.append(
$( '<div>' )
.addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-title' )
- .append( this.$label )
+ .append( $( '<bdi>' ).append( this.$label ) )
);
if ( this.itemModel.getDescription() ) {
$label.append(
$( '<div>' )
.addClass( 'mw-rcfilters-ui-itemMenuOptionWidget-label-desc' )
- .text( this.itemModel.getDescription() )
+ .append( $( '<bdi>' ).text( this.itemModel.getDescription() ) )
);
}
// Parent
mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( {
framed: false,
- icon: 'unClip',
+ icon: 'bookmark',
title: mw.msg( 'rcfilters-savedqueries-add-new-title' ),
popup: {
classes: [ 'mw-rcfilters-ui-saveFiltersPopupButtonWidget-popup' ],
}
}, config ) );
// // HACK: Add an icon to the popup head label
- this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'unClip' } ) ).$element );
+ this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'bookmark' } ) ).$element );
this.input = new OO.ui.TextInputWidget( {
placeholder: mw.msg( 'rcfilters-savedqueries-new-name-placeholder' )
this.placeholderItem = new OO.ui.DecoratedOptionWidget( {
classes: [ 'mw-rcfilters-ui-savedLinksListWidget-placeholder' ],
label: $labelNoEntries,
- icon: 'unClip'
+ icon: 'bookmark'
} );
this.menu = new mw.rcfilters.ui.GroupWidget( {
this.button = new OO.ui.PopupButtonWidget( {
classes: [ 'mw-rcfilters-ui-savedLinksListWidget-button' ],
label: mw.msg( 'rcfilters-quickfilters' ),
- icon: 'unClip',
+ icon: 'bookmark',
indicator: 'down',
$overlay: this.$overlay,
popup: {
+@import 'mediawiki.mixins';
+
// OOUIHTMLForm styles
+@ooui-font-size-browser: 16; // assumed browser default of `16px`
+@ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
+
+@ooui-spacing-medium: 12 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.8571429em`≈`12px`
+@ooui-spacing-large: 16 / @ooui-font-size-browser / @ooui-font-size-base; // equals `1.1428571em`≈`16px`
+
.mw-htmlform-ooui-wrapper.oo-ui-panelLayout-padded {
- padding: 1em 1.25em 1.25em;
+ padding: @ooui-spacing-medium @ooui-spacing-large @ooui-spacing-large;
}
.mw-htmlform-ooui {
line-height: 1.4; // Override MediaWiki's default of `1.6`
.oo-ui-fieldLayout.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
- line-height: 1.143; // equals `16px`
+ line-height: 16 / @ooui-font-size-browser / @ooui-font-size-base;
}
.mw-htmlform-field-HTMLCheckMatrix {
td {
padding: 0.35em 0.7em;
- -webkit-transition: background-color 250ms;
- -moz-transition: background-color 250ms;
- transition: background-color 250ms;
+ .transition( background-color 250ms );
}
tbody tr:nth-child( even ) td {
.mw-htmlform-flatlist .oo-ui-radioOptionWidget,
.mw-htmlform-flatlist .oo-ui-checkboxMultioptionWidget {
display: inline-block;
- margin-right: 1em;
+ margin-right: @ooui-spacing-medium;
}
.mw-htmlform-ooui .htmlform-tip,
.mw-htmlform-ooui .mw-htmlform-submit-buttons {
- margin-top: 1em;
+ margin-top: @ooui-spacing-medium;
}
*/
/* global Uint32Array */
( function ( mw, $ ) {
- var userInfoPromise;
+ var userInfoPromise, stickyRandomSessionId;
/**
* Get the current user's groups or rights
// Support: IE 11
crypto = window.crypto || window.msCrypto;
- if ( crypto && crypto.getRandomValues ) {
+ if ( crypto && crypto.getRandomValues && typeof Uint32Array === 'function' ) {
// Fill an array with 2 random values, each of which is 32 bits.
// Note that Uint32Array is array-like but does not implement Array.
rnds = new Uint32Array( 2 );
return hexRnds.join( '' );
},
+ /**
+ * A sticky generateRandomSessionId for the current JS execution context,
+ * cached within this class.
+ *
+ * @return {string} 64 bit integer in hex format, padded
+ */
+ stickyRandomId: function () {
+ if ( !stickyRandomSessionId ) {
+ stickyRandomSessionId = mw.user.generateRandomSessionId();
+ }
+
+ return stickyRandomSessionId;
+ },
+
/**
* Get the current user's database id
*
'DummyContentForTesting' => "$testDir/phpunit/mocks/content/DummyContentForTesting.php",
'DummyNonTextContentHandler' => "$testDir/phpunit/mocks/content/DummyNonTextContentHandler.php",
'DummyNonTextContent' => "$testDir/phpunit/mocks/content/DummyNonTextContent.php",
+ 'DummySerializeErrorContentHandler' =>
+ "$testDir/phpunit/mocks/content/DummySerializeErrorContentHandler.php",
'ContentHandlerTest' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
'JavaScriptContentTest' => "$testDir/phpunit/includes/content/JavaScriptContentTest.php",
'TextContentTest' => "$testDir/phpunit/includes/content/TextContentTest.php",
'MediaWiki\\Session\\DummySessionBackend'
=> "$testDir/phpunit/mocks/session/DummySessionBackend.php",
'DummySessionProvider' => "$testDir/phpunit/mocks/session/DummySessionProvider.php",
+ 'MockMessageLocalizer' => "$testDir/phpunit/mocks/MockMessageLocalizer.php",
# tests/suites
'ParserTestFileSuite' => "$testDir/phpunit/suites/ParserTestFileSuite.php",
<?php
/**
- * @large
+ * @group large
* @covers CurlHttpRequest
*/
class CurlHttpRequestTest extends MWHttpRequestTestCase {
<?php
/**
- * @large
+ * @group large
* @covers PhpHttpRequest
*/
class PhpHttpRequestTest extends MWHttpRequestTestCase {
* Meant to run on vagrant, although will probably work on other setups
* as long as firejail and sudo has similar config.
*
- * @large
+ * @group large
* @group Shell
* @covers FirejailCommand
*/
// Set content language. This invalidates the magic word cache and title services
$lang = Language::factory( $langCode );
+ $lang->resetNamespaces();
$setup['wgContLang'] = $lang;
$reset = function () {
MagicWord::clearCache();
:<ruby>東<rb>京</rb><rp>(</rp><rt>とう</rt><rt>きょう</rt><rp>)</rp></ruby>
;Double-sided ruby
:<ruby><rb>旧</rb><rb>金</rb><rb>山</rb><rt>jiù</rt><rt>jīn</rt><rt>shān</rt><rtc>San Francisco</rtc></ruby>
+
<ruby>
<rb>♥</rb><rtc><rt>Heart</rt></rtc><rtc lang="fr"><rt>Cœur</rt></rtc>
<rb>☘</rb><rtc><rt>Shamrock</rt></rtc><rtc lang="fr"><rt>Trèfle</rt></rtc>
Definition list with empty definition and following paragraph
!! wikitext
;term:
+
Paragraph text
!! html
<dl><dt>term</dt>
</p>
!! end
+!! test
+Definition Lists: Hacky use to indent tables (with content following table)
+!! wikitext
+:{|
+|foo
+|bar
+|} <!--c1--> this text should be part of the dl
+!! html/php+tidy
+<dl><dd><table>
+<tbody><tr>
+<td>foo
+</td>
+<td>bar
+</td></tr></tbody></table> this text should be part of the dl</dd></dl>
+!! html/parsoid
+<dl><dd><table>
+<tbody><tr>
+<td>foo
+</td>
+<td>bar
+</td></tr></tbody></table> <!--c1--> this text should be part of the dl</dd></dl>
+!! end
+
!! test
Definition Lists: Hacky use to indent tables, with comments (T65979)
!! wikitext
:{|
|-
|a
+
*b
|-
|c
+
*d
|}
!! html
http://[2404:130:0:1000::187:2]/index.php
Examples from RFC 2373, section 2.2:
+
*http://[1080::8:800:200C:417A]/unicast
*http://[FF01::101]/multicast
*http://[::1]/loopback
*http://[::FFFF:129.144.52.38]/ipv4compat
Examples from RFC 2732, section 2:
+
*http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html
*http://[1080:0:0:0:8:800:200C:417A]/index.html
*http://[3ffe:2a00:100:7031::1]
*http://[::192.9.5.5]/ipng
*http://[::FFFF:129.144.52.38]:80/index.html
*http://[2010:836B:4179::836B:4179]
-
!! html/php
<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
[http://[2404:130:0:1000::187:2]/index.php test]
Examples from RFC 2373, section 2.2:
+
*[http://[1080::8:800:200C:417A] unicast]
*[http://[FF01::101] multicast]
*[http://[::1]/ loopback]
*[http://[::FFFF:129.144.52.38] ipv4compat]
Examples from RFC 2732, section 2:
+
*[http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html 1]
*[http://[1080:0:0:0:8:800:200C:417A]/index.html 2]
*[http://[3ffe:2a00:100:7031::1] 3]
*[http://[::192.9.5.5]/ipng 5]
*[http://[::FFFF:129.144.52.38]:80/index.html 6]
*[http://[2010:836B:4179::836B:4179] 7]
-
!! html/php
<p><a rel="nofollow" class="external text" href="http://[2404:130:0:1000::187:2]/index.php">test</a>
</p><p>Examples from <a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc2373">RFC 2373</a>, section 2.2:
Redirect syntax under text isn't considered a redirect
!! wikitext
some text
+
#redirect [[Main Page]]
!! html/parsoid
<p>some text</p>
!! end
+# the switch from level 3 to ordered should not introduce a newline between
!! test
Mixed list
!! wikitext
!! wikitext
#foo
##bar
+
*foo
**bar
+
:foo
::bar
!! html
<h4 id="Level_4_Heading" data-parsoid='{}'>Level 4 Heading</h4>
<h5 id="Level_5_Heading" data-parsoid='{}'>Level 5 Heading</h5>
<h6 id="Level_6_Heading" data-parsoid='{}'>Level 6 Heading</h6>
-<h6 id="=Level_7_Heading=" data-parsoid='{}'><span id=".3D_Level_7_Heading.3D" typeof="mw:FallbackId"></span>=Level 7 Heading=</h6>
-<h6 id="==Level_8_Heading==" data-parsoid='{}'><span id=".3D.3D_Level_8_Heading.3D.3D" typeof="mw:FallbackId"></span>==Level 8 Heading==</h6>
-<h6 id="===Level_9_Heading===" data-parsoid='{}'><span id=".3D.3D.3D_Level_9_Heading.3D.3D.3D" typeof="mw:FallbackId"></span>===Level 9 Heading===</h6>
-<h6 id="====Level_10_Heading====" data-parsoid='{}'><span id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D" typeof="mw:FallbackId"></span>====Level 10 Heading====</h6>
+<h6 id="=Level_7_Heading=" data-parsoid='{}'><span id=".3DLevel_7_Heading.3D" typeof="mw:FallbackId"></span>=Level 7 Heading=</h6>
+<h6 id="==Level_8_Heading==" data-parsoid='{}'><span id=".3D.3DLevel_8_Heading.3D.3D" typeof="mw:FallbackId"></span>==Level 8 Heading==</h6>
+<h6 id="===Level_9_Heading===" data-parsoid='{}'><span id=".3D.3D.3DLevel_9_Heading.3D.3D.3D" typeof="mw:FallbackId"></span>===Level 9 Heading===</h6>
+<h6 id="====Level_10_Heading====" data-parsoid='{}'><span id=".3D.3D.3D.3DLevel_10_Heading.3D.3D.3D.3D" typeof="mw:FallbackId"></span>====Level 10 Heading====</h6>
!! end
!! test
<h1><span class="mw-headline" id="Header_1">Header 1</span></h1>
<h2><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
<h2><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
-<h1><span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h1><span class="mw-headline" id="Header_2">Header 2
+</span></h1>
<h2><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
<h2><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
* a
*
* b
+
{|
|-
|-
}}
!! end
+!! test
+New list is serialized on newlines
+!! options
+parsoid=html2wt
+!! html/parsoid
+<p>The quick brown fox jumps over the lazy dog.</p><ul>
+<li>Yesterday</li>
+<li>Today</li>
+<li>Tomorrow</li>
+</ul><p>The quick onyx goblin jumps over the lazy dwarf.</p>
+!! wikitext
+The quick brown fox jumps over the lazy dog.
+
+* Yesterday
+* Today
+* Tomorrow
+
+The quick onyx goblin jumps over the lazy dwarf.
+!! end
+
+!! test
+New lists in formatting elements serialized w/o newlines
+!! options
+parsoid=html2wt
+!! html/parsoid
+<small>
+
+<ul>
+<li>123</li>
+</ul>
+
+</small>
+
+<small><ul><li>hi</li></ul></small>
+!! wikitext
+<small>
+* 123
+</small>
+
+<small>
+* hi
+</small>
+!! end
+
+!! test
+New list in table doesn't need newlines
+!! options
+parsoid=html2wt
+!! html/parsoid
+<table><tr><td><ul><li>test</li><li>123</li></td></tr></table>
+!! wikitext
+{|
+|
+* test
+* 123
+|}
+!! end
+
# ---------------------------------------------------
# End of tests spec'ing wikitext serialization norms |
# ---------------------------------------------------
Trim whitespace in wikitext headings, list items, table captions, headings, and cells
!! wikitext
__NOTOC__
-== <!--c1--> <!--c2--> Heading <!--c3--> <!--c4--> ==
+== <!--c1--> <!--c2--> Spaces <!--c3--> <!--c4--> ==
+== <!--c2--> <!--c2--> Tabs <!--c3--><!--c4--> ==
* <!--c1--> <!--c2--> List item <!--c3--> <!--c4-->
; <!--term to define--> term : <!--term's definition--> definition
{|
| <!--c1--> <!--c2--> Table Cell 1 <!--c3--> <!--c4--> || Table Cell 2 <!--c5-->
|} foo <!--c1-->
!! html/php+tidy
-<h2><span class="mw-headline" id="Heading">Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Spaces">Spaces</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=1" title="Edit section: Spaces">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Tabs">Tabs</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&action=edit&section=2" title="Edit section: Tabs">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
<ul><li>List item</li></ul>
<dl><dt>term </dt>
<dd>definition</dd></dl>
Do not trim whitespace in HTML headings, list items, table captions, headings, and cells
!! wikitext
__NOTOC__
-<h2> <!--c1--> <!--c2--> Heading <!--c3--> <!--c4--> <h2>
+<h2> <!--c1--> <!--c2--> Heading <!--c3--> <!--c4--> </h2>
<ul><li> <!--c1--> <!--c2--> List item <!--c3--> <!--c4--> </li></ul>
<table>
<tr><th> <!--c1--> <!--c2--> Table Heading <!--c3--> <!--c4--> <th></tr>
<tr><td> <!--c1--> <!--c2--> Table Cell <!--c3--> <!--c4--> <th></tr>
</table>
!! html/php+tidy
-<h2> Heading </h2><h2>
+<h2><span class="mw-headline" id="Heading"> Heading </span></h2>
<ul><li> List item </li></ul>
<table>
<tbody><tr><th> Table Heading </th><th></th></tr>
<tr><td> Table Cell </td><th></th></tr>
</tbody></table>
-</h2>
!! end
!! test
<a href="/wiki/Foo" title="Foo"> some text </a>
</p>
!! end
+
+!! test
+Remove p tags surrounding a single element in a figcaption
+!! options
+parsoid=html2wt
+!! wikitext
+[[File:Foobar.jpg|right|200x200px|Caption]]
+!! html/parsoid
+<figure class="mw-halign-right" typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="23" width="200"/></a><figcaption><p>Caption</p></figcaption></figure>
+!! end
+
+!! test
+Selser preserves lack of newline before list and allows newline after the list
+!! options
+parsoid={
+ "modes": ["selser"],
+ "scrubWikitext": true,
+ "changes": [
+ [ "ul", "after", "<p>footer</p>" ]
+ ]
+}
+!! wikitext
+header
+*foo
+*bar
+!! wikitext/edited
+header
+*foo
+*bar
+
+footer
+!! end
+
+
+!! test
+Selser does not introduce newlines between unedited paragraph preceding the list
+!! options
+parsoid={
+ "modes": ["selser"],
+ "changes": [
+ [ "table tbody tr td p:last-child", "empty" ]
+ ]
+}
+!! wikitext
+{|
+|
+header
+*foo
+*bar
+footer
+|}
+!! wikitext/edited
+{|
+|
+header
+*foo
+*bar
+
+|}
+!! end
+
+!! test
+Selser does not introduce newlines between unedited paragraph following the list
+!! options
+parsoid={
+ "modes": ["selser"],
+ "changes": [
+ [ "table tbody tr td p:first-child", "empty" ]
+ ]
+}
+!! wikitext
+{|
+|
+header
+*foo
+*bar
+footer
+|}
+!! wikitext/edited
+{|
+|
+
+*foo
+*bar
+footer
+|}
+!! end
+
+!! test
+Remove a list item but do not insert newline above list
+!! options
+parsoid={
+ "modes": ["selser"],
+ "changes": [
+ [ "ul li:last-child", "remove" ]
+ ]
+}
+!! wikitext
+header
+*foo
+*bar
+footer
+!! wikitext/edited
+header
+*foo
+footer
+!! end
}
}
+ private static $schemaOverrideDefaults = [
+ 'scripts' => [],
+ 'create' => [],
+ 'drop' => [],
+ 'alter' => [],
+ ];
+
/**
* Stub. If a test suite needs to test against a specific database schema, it should
* override this method and return the appropriate information from it.
*
- * @return [ $tables, $scripts ] A tuple of two lists, with $tables being a list of tables
- * that will be re-created by the scripts, and $scripts being a list of SQL script
- * files for creating the tables listed.
+ * @param IMaintainableDatabase $db The DB connection to use for the mock schema.
+ * May be used to check the current state of the schema, to determine what
+ * overrides are needed.
+ *
+ * @return array An associative array with the following fields:
+ * - 'scripts': any SQL scripts to run. If empty or not present, schema overrides are skipped.
+ * - 'create': A list of tables created (may or may not exist in the original schema).
+ * - 'drop': A list of tables dropped (expected to be present in the original schema).
+ * - 'alter': A list of tables altered (expected to be present in the original schema).
*/
- protected function getSchemaOverrides() {
- return [ [], [] ];
+ protected function getSchemaOverrides( IMaintainableDatabase $db ) {
+ return [];
+ }
+
+ /**
+ * Undoes the dpecified schema overrides..
+ * Called once per test class, just before addDataOnce().
+ *
+ * @param IMaintainableDatabase $db
+ * @param array $oldOverrides
+ */
+ private function undoSchemaOverrides( IMaintainableDatabase $db, $oldOverrides ) {
+ $this->ensureMockDatabaseConnection( $db );
+
+ $oldOverrides = $oldOverrides + self::$schemaOverrideDefaults;
+ $originalTables = $this->listOriginalTables( $db );
+
+ // Drop tables that need to be restored or removed.
+ $tablesToDrop = array_merge( $oldOverrides['create'], $oldOverrides['alter'] );
+
+ // Restore tables that have been dropped or created or altered,
+ // if they exist in the original schema.
+ $tablesToRestore = array_merge( $tablesToDrop, $oldOverrides['drop'] );
+ $tablesToRestore = array_intersect( $originalTables, $tablesToRestore );
+
+ if ( $tablesToDrop ) {
+ $this->dropMockTables( $db, $tablesToDrop );
+ }
+
+ if ( $tablesToRestore ) {
+ $this->recloneMockTables( $db, $tablesToRestore );
+ }
}
/**
- * Applies any schema changes requested by calling setDbSchema().
+ * Applies the schema overrides returned by getSchemaOverrides(),
+ * after undoing any previously applied schema overrides.
* Called once per test class, just before addDataOnce().
*/
private function setUpSchema( IMaintainableDatabase $db ) {
- list( $tablesToAlter, $scriptsToRun ) = $this->getSchemaOverrides();
+ // Undo any active overrides.
+ $oldOverrides = isset( $db->_schemaOverrides ) ? $db->_schemaOverrides
+ : self::$schemaOverrideDefaults;
+
+ if ( $oldOverrides['alter'] || $oldOverrides['create'] || $oldOverrides['drop'] ) {
+ $this->undoSchemaOverrides( $db, $oldOverrides );
+ }
+
+ // Determine new overrides.
+ $overrides = $this->getSchemaOverrides( $db ) + self::$schemaOverrideDefaults;
+
+ $extraKeys = array_diff(
+ array_keys( $overrides ),
+ array_keys( self::$schemaOverrideDefaults )
+ );
- if ( $tablesToAlter && !$scriptsToRun ) {
+ if ( $extraKeys ) {
throw new InvalidArgumentException(
- 'No scripts supplied for applying the database schema.'
+ 'Schema override contains extra keys: ' . var_export( $extraKeys, true )
);
}
- if ( !$tablesToAlter && $scriptsToRun ) {
+ if ( !$overrides['scripts'] ) {
+ // no scripts to run
+ return;
+ }
+
+ if ( !$overrides['create'] && !$overrides['drop'] && !$overrides['alter'] ) {
throw new InvalidArgumentException(
- 'No tables declared to be altered by schema scripts.'
+ 'Schema override scripts given, but no tables are declared to be '
+ . 'created, dropped or altered.'
);
}
$this->ensureMockDatabaseConnection( $db );
- $previouslyAlteredTables = isset( $db->_alteredMockTables ) ? $db->_alteredMockTables : [];
-
- if ( !$tablesToAlter && !$previouslyAlteredTables ) {
- return; // nothing to do
- }
-
- $tablesToDrop = array_merge( $previouslyAlteredTables, $tablesToAlter );
- $tablesToRestore = array_diff( $previouslyAlteredTables, $tablesToAlter );
+ // Drop the tables that will be created by the schema scripts.
+ $originalTables = $this->listOriginalTables( $db );
+ $tablesToDrop = array_intersect( $originalTables, $overrides['create'] );
if ( $tablesToDrop ) {
$this->dropMockTables( $db, $tablesToDrop );
}
- if ( $tablesToRestore ) {
- $this->recloneMockTables( $db, $tablesToRestore );
- }
-
- foreach ( $scriptsToRun as $script ) {
+ // Run schema override scripts.
+ foreach ( $overrides['scripts'] as $script ) {
$db->sourceFile(
$script,
null,
);
}
- $db->_alteredMockTables = $tablesToAlter;
+ $db->_schemaOverrides = $overrides;
}
private function mungeSchemaUpdateQuery( $cmd ) {
}
}
+ /**
+ * Lists all tables in the live database schema.
+ *
+ * @param IMaintainableDatabase $db
+ * @return array
+ */
+ private function listOriginalTables( IMaintainableDatabase $db ) {
+ if ( !isset( $db->_originalTablePrefix ) ) {
+ throw new LogicException( 'No original table prefix know, cannot list tables!' );
+ }
+
+ $originalTables = $db->listTables( $db->_originalTablePrefix, __METHOD__ );
+ return $originalTables;
+ }
+
/**
* Re-clones the given mock tables to restore them based on the live database schema.
+ * The tables listed in $tables are expected to currently not exist, so dropMockTables()
+ * should be called first.
*
* @param IMaintainableDatabase $db
* @param array $tables
throw new LogicException( 'No original table prefix know, cannot restore tables!' );
}
- $originalTables = $db->listTables( $db->_originalTablePrefix, __METHOD__ );
+ $originalTables = $this->listOriginalTables( $db );
$tables = array_intersect( $tables, $originalTables );
$dbClone = new CloneDatabase( $db, $tables, $db->tablePrefix(), $db->_originalTablePrefix );
continue;
}
+ if ( !$db->tableExists( $tbl ) ) {
+ continue;
+ }
+
if ( $truncate ) {
$db->query( 'TRUNCATE TABLE ' . $db->tableName( $tbl ), __METHOD__ );
} else {
);
}
- private function getSlotRecord( $role, $contentString ) {
- return SlotRecord::newUnsaved( $role, new TextContent( $contentString ) );
- }
-
public function provideHasSameContent() {
/**
* @param SlotRecord[] $slots
[ 'User:Foo', false ],
[ 'User:Foo.js', false ],
[ 'User:Foo/bar.js', false ],
+ [ 'User:Foo/bar.json', false ],
[ 'User:Foo/bar.css', false ],
[ 'User:Foo/bar.JS', false ],
+ [ 'User:Foo/bar.JSON', false ],
[ 'User:Foo/bar.CSS', false ],
[ 'User talk:Foo/bar.css', false ],
[ 'User:Foo/bar.js.xxx', false ],
[ 'User:Foo/bar.xxx', false ],
[ 'MediaWiki:Foo.js', true ],
+ [ 'MediaWiki:Foo.json', true ],
[ 'MediaWiki:Foo.css', true ],
[ 'MediaWiki:Foo.JS', false ],
+ [ 'MediaWiki:Foo.JSON', false ],
[ 'MediaWiki:Foo.CSS', false ],
[ 'MediaWiki:Foo/bar.css', true ],
[ 'MediaWiki:Foo.css.xxx', false ],
[ 'User:Foo.js', false ],
[ 'User:Foo/bar.js', true ],
[ 'User:Foo/bar.JS', false ],
+ [ 'User:Foo/bar.json', true ],
+ [ 'User:Foo/bar.JSON', false ],
[ 'User:Foo/bar.css', true ],
[ 'User:Foo/bar.CSS', false ],
[ 'User talk:Foo/bar.css', false ],
[ 'User:Foo/bar.js.xxx', false ],
[ 'User:Foo/bar.xxx', false ],
[ 'MediaWiki:Foo.js', false ],
+ [ 'MediaWiki:Foo.json', false ],
[ 'MediaWiki:Foo.css', false ],
[ 'MediaWiki:Foo.JS', false ],
+ [ 'MediaWiki:Foo.JSON', false ],
[ 'MediaWiki:Foo.CSS', false ],
[ 'MediaWiki:Foo.css.xxx', false ],
[ 'TEST-JS:Foo', false ],
[ 'Help:Foo.css', false ],
[ 'User:Foo', false ],
[ 'User:Foo.js', false ],
+ [ 'User:Foo.json', false ],
[ 'User:Foo.css', false ],
[ 'User:Foo/bar.js', false ],
+ [ 'User:Foo/bar.json', false ],
[ 'User:Foo/bar.css', true ],
];
}
[ 'User:Foo', true ],
[ 'User:Foo.js', true ],
[ 'User:Foo/bar.js', false ],
+ [ 'User:Foo/bar.json', false ],
[ 'User:Foo/bar.css', false ],
[ 'User talk:Foo/bar.css', true ],
[ 'User:Foo/bar.js.xxx', true ],
[ 'User:Foo/bar.xxx', true ],
[ 'MediaWiki:Foo.js', false ],
[ 'User:Foo/bar.JS', true ],
+ [ 'User:Foo/bar.JSON', true ],
[ 'User:Foo/bar.CSS', true ],
+ [ 'MediaWiki:Foo.json', false ],
[ 'MediaWiki:Foo.css', false ],
[ 'MediaWiki:Foo.JS', true ],
+ [ 'MediaWiki:Foo.JSON', true ],
[ 'MediaWiki:Foo.CSS', true ],
[ 'MediaWiki:Foo.css.xxx', true ],
[ 'TEST-JS:Foo', false ],
$this->runConfigEditPermissions(
[ [ 'badaccess-group0' ], [ 'mycustomjsprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'mycustomjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'mycustomjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ] ]
);
}
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ * @covers Title::checkUserConfigPermissions
+ */
+ public function testJsonConfigEditPermissions() {
+ $this->setUser( $this->userName );
+
+ $this->setTitle( NS_USER, $this->userName . '/test.json' );
+ $this->runConfigEditPermissions(
+ [ [ 'badaccess-group0' ], [ 'mycustomjsonprotected', 'bogus' ] ],
+
+ [ [ 'badaccess-group0' ], [ 'mycustomjsonprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomjsonprotected', 'bogus' ] ],
+
+ [ [ 'badaccess-group0' ], [ 'mycustomjsonprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomjsonprotected', 'bogus' ] ]
+ );
+ }
+
/**
* @todo This test method should be split up into separate test methods and
* data providers
[ [ 'badaccess-group0' ] ],
[ [ 'badaccess-group0' ], [ 'mycustomcssprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'mycustomcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'mycustomcssprotected', 'bogus' ] ]
);
}
$this->runConfigEditPermissions(
[ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customjsprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ] ]
);
}
+ /**
+ * @todo This test method should be split up into separate test methods and
+ * data providers
+ * @covers Title::checkUserConfigPermissions
+ */
+ public function testOtherJsonConfigEditPermissions() {
+ $this->setUser( $this->userName );
+
+ $this->setTitle( NS_USER, $this->altUserName . '/test.json' );
+ $this->runConfigEditPermissions(
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ],
+
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ],
+
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'customjsonprotected', 'bogus' ] ]
+ );
+ }
+
/**
* @todo This test method should be split up into separate test methods and
* data providers
$this->runConfigEditPermissions(
[ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ],
+ [ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ],
[ [ 'badaccess-group0' ], [ 'customcssprotected', 'bogus' ] ]
);
}
$this->runConfigEditPermissions(
[ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ] ],
[ [ 'badaccess-group0' ] ],
[ [ 'badaccess-group0' ] ],
+ [ [ 'badaccess-group0' ] ],
[ [ 'badaccess-group0' ] ],
[ [ 'badaccess-group0' ] ]
);
protected function runConfigEditPermissions(
$resultNone,
$resultMyCss,
+ $resultMyJson,
$resultMyJs,
$resultUserCss,
+ $resultUserJson,
$resultUserJs
) {
$this->setUserPerm( '' );
$result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
$this->assertEquals( $resultMyCss, $result );
+ $this->setUserPerm( 'editmyuserjson' );
+ $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
+ $this->assertEquals( $resultMyJson, $result );
+
$this->setUserPerm( 'editmyuserjs' );
$result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
$this->assertEquals( $resultMyJs, $result );
$result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
$this->assertEquals( $resultUserCss, $result );
+ $this->setUserPerm( 'edituserjson' );
+ $result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
+ $this->assertEquals( $resultUserJson, $result );
+
$this->setUserPerm( 'edituserjs' );
$result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
$this->assertEquals( $resultUserJs, $result );
- $this->setUserPerm( [ 'edituserjs', 'editusercss' ] );
+ $this->setUserPerm( [ 'edituserjs', 'edituserjson', 'editusercss' ] );
$result = $this->title->getUserPermissionsErrors( 'bogus', $this->user );
$this->assertEquals( [ [ 'badaccess-group0' ] ], $result );
}
* @group Action
* @group Database
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Thiemo Kreuz
*/
class ActionTest extends MediaWikiTestCase {
* @covers ApiBlock
*/
class ApiBlockTest extends ApiTestCase {
+ protected $mUser = null;
+
protected function setUp() {
parent::setUp();
$this->doLogin();
+
+ $this->mUser = $this->getMutableTestUser()->getUser();
}
protected function tearDown() {
- $block = Block::newFromTarget( 'UTApiBlockee' );
+ $block = Block::newFromTarget( $this->mUser->getName() );
if ( !is_null( $block ) ) {
$block->delete();
}
return $this->getTokenList( self::$users['sysop'] );
}
- function addDBDataOnce() {
- $user = User::newFromName( 'UTApiBlockee' );
-
- if ( $user->getId() == 0 ) {
- $user->addToDatabase();
- TestUser::setPasswordForUser( $user, 'UTApiBlockeePassword' );
-
- $user->saveSettings();
- }
- }
-
/**
- * This test has probably always been broken and use an invalid token
- * Bug tracking brokenness is https://phabricator.wikimedia.org/T37646
- *
- * Root cause is https://gerrit.wikimedia.org/r/3434
- * Which made the Block/Unblock API to actually verify the token
- * previously always considered valid (T36212).
+ * @param array $extraParams Extra API parameters to pass to doApiRequest
+ * @param User $blocker User to do the blocking, null to pick
+ * arbitrarily
*/
- public function testMakeNormalBlock() {
- $tokens = $this->getTokens();
+ private function doBlock( array $extraParams = [], User $blocker = null ) {
+ if ( $blocker === null ) {
+ $blocker = self::$users['sysop']->getUser();
+ }
- $user = User::newFromName( 'UTApiBlockee' );
+ $tokens = $this->getTokens();
- if ( !$user->getId() ) {
- $this->markTestIncomplete( "The user UTApiBlockee does not exist" );
- }
+ $this->assertNotNull( $this->mUser, 'Sanity check' );
+ $this->assertNotSame( 0, $this->mUser->getId(), 'Sanity check' );
- if ( !array_key_exists( 'blocktoken', $tokens ) ) {
- $this->markTestIncomplete( "No block token found" );
- }
+ $this->assertArrayHasKey( 'blocktoken', $tokens, 'Sanity check' );
- $this->doApiRequest( [
+ $params = [
'action' => 'block',
- 'user' => 'UTApiBlockee',
+ 'user' => $this->mUser->getName(),
'reason' => 'Some reason',
- 'token' => $tokens['blocktoken'] ], null, false, self::$users['sysop']->getUser() );
+ 'token' => $tokens['blocktoken'],
+ ];
+ if ( array_key_exists( 'userid', $extraParams ) ) {
+ // Make sure we don't have both user and userid
+ unset( $params['user'] );
+ }
+ $ret = $this->doApiRequest( array_merge( $params, $extraParams ), null,
+ false, $blocker );
- $block = Block::newFromTarget( 'UTApiBlockee' );
+ $block = Block::newFromTarget( $this->mUser->getName() );
$this->assertTrue( !is_null( $block ), 'Block is valid' );
- $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
- $this->assertEquals( 'Some reason', $block->mReason );
- $this->assertEquals( 'infinity', $block->mExpiry );
+ $this->assertSame( $this->mUser->getName(), (string)$block->getTarget() );
+ $this->assertSame( 'Some reason', $block->mReason );
+
+ return $ret;
+ }
+
+ /**
+ * Block by username
+ */
+ public function testNormalBlock() {
+ $this->doBlock();
}
/**
* Block by user ID
*/
- public function testMakeNormalBlockId() {
- $tokens = $this->getTokens();
- $user = User::newFromName( 'UTApiBlockee' );
+ public function testBlockById() {
+ $this->doBlock( [ 'userid' => $this->mUser->getId() ] );
+ }
- if ( !$user->getId() ) {
- $this->markTestIncomplete( "The user UTApiBlockee does not exist." );
- }
+ /**
+ * A blocked user can't block
+ */
+ public function testBlockByBlockedUser() {
+ $this->setExpectedException( ApiUsageException::class,
+ 'You cannot block or unblock other users because you are yourself blocked.' );
+
+ $blocked = $this->getMutableTestUser( [ 'sysop' ] )->getUser();
+ $block = new Block( [
+ 'address' => $blocked->getName(),
+ 'by' => self::$users['sysop']->getUser()->getId(),
+ 'reason' => 'Capriciousness',
+ 'timestamp' => '19370101000000',
+ 'expiry' => 'infinity',
+ ] );
+ $block->insert();
+
+ $this->doBlock( [], $blocked );
+ }
- if ( !array_key_exists( 'blocktoken', $tokens ) ) {
- $this->markTestIncomplete( "No block token found" );
- }
+ public function testBlockOfNonexistentUser() {
+ $this->setExpectedException( ApiUsageException::class,
+ 'There is no user by the name "Nonexistent". Check your spelling.' );
- $data = $this->doApiRequest( [
- 'action' => 'block',
- 'userid' => $user->getId(),
- 'reason' => 'Some reason',
- 'token' => $tokens['blocktoken'] ], null, false, self::$users['sysop']->getUser() );
+ $this->doBlock( [ 'user' => 'Nonexistent' ] );
+ }
+
+ public function testBlockOfNonexistentUserId() {
+ $id = 948206325;
+ $this->setExpectedException( ApiUsageException::class,
+ "There is no user with ID $id." );
+
+ $this->assertFalse( User::whoIs( $id ), 'Sanity check' );
+
+ $this->doBlock( [ 'userid' => $id ] );
+ }
+
+ public function testBlockWithTag() {
+ ChangeTags::defineTag( 'custom tag' );
+
+ $this->doBlock( [ 'tags' => 'custom tag' ] );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $this->assertSame( 'custom tag', $dbw->selectField(
+ [ 'change_tag', 'logging' ],
+ 'ct_tag',
+ [ 'log_type' => 'block' ],
+ __METHOD__,
+ [],
+ [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
+ ) );
+ }
+
+ public function testBlockWithProhibitedTag() {
+ $this->setExpectedException( ApiUsageException::class,
+ 'You do not have permission to apply change tags along with your changes.' );
+
+ ChangeTags::defineTag( 'custom tag' );
+
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'user' => [ 'applychangetags' => true ] ] );
+
+ $this->doBlock( [ 'tags' => 'custom tag' ] );
+ }
+
+ public function testBlockWithHide() {
+ global $wgGroupPermissions;
+ $newPermissions = $wgGroupPermissions['sysop'];
+ $newPermissions['hideuser'] = true;
+ $this->mergeMwGlobalArrayValue( 'wgGroupPermissions',
+ [ 'sysop' => $newPermissions ] );
+
+ $res = $this->doBlock( [ 'hidename' => '' ] );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $this->assertSame( '1', $dbw->selectField(
+ 'ipblocks',
+ 'ipb_deleted',
+ [ 'ipb_id' => $res[0]['block']['id'] ],
+ __METHOD__
+ ) );
+ }
+
+ public function testBlockWithProhibitedHide() {
+ $this->setExpectedException( ApiUsageException::class,
+ "You don't have permission to hide user names from the block log." );
+
+ $this->doBlock( [ 'hidename' => '' ] );
+ }
+
+ public function testBlockWithEmailBlock() {
+ $res = $this->doBlock( [ 'noemail' => '' ] );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $this->assertSame( '1', $dbw->selectField(
+ 'ipblocks',
+ 'ipb_block_email',
+ [ 'ipb_id' => $res[0]['block']['id'] ],
+ __METHOD__
+ ) );
+ }
+
+ public function testBlockWithProhibitedEmailBlock() {
+ $this->setExpectedException( ApiUsageException::class,
+ "You don't have permission to block users from sending email through the wiki." );
+
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'sysop' => [ 'blockemail' => true ] ] );
+
+ $this->doBlock( [ 'noemail' => '' ] );
+ }
+
+ public function testBlockWithExpiry() {
+ $res = $this->doBlock( [ 'expiry' => '1 day' ] );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $expiry = $dbw->selectField(
+ 'ipblocks',
+ 'ipb_expiry',
+ [ 'ipb_id' => $res[0]['block']['id'] ],
+ __METHOD__
+ );
+
+ // Allow flakiness up to one second
+ $this->assertLessThanOrEqual( 1,
+ abs( wfTimestamp( TS_UNIX, $expiry ) - ( time() + 86400 ) ) );
+ }
- $block = Block::newFromTarget( 'UTApiBlockee' );
+ public function testBlockWithInvalidExpiry() {
+ $this->setExpectedException( ApiUsageException::class, "Expiry time invalid." );
- $this->assertTrue( !is_null( $block ), 'Block is valid.' );
- $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
- $this->assertEquals( 'Some reason', $block->mReason );
- $this->assertEquals( 'infinity', $block->mExpiry );
+ $this->doBlock( [ 'expiry' => '' ] );
}
/**
$this->doApiRequest(
[
'action' => 'block',
- 'user' => 'UTApiBlockee',
+ 'user' => $this->mUser->getName(),
'reason' => 'Some reason',
],
null,
}
public function testDelete() {
- $name = 'Help:ApiDeleteTest_testDelete';
-
- // test non-existing page
- try {
- $this->doApiRequestWithToken( [
- 'action' => 'delete',
- 'title' => $name,
- ] );
- $this->fail( "Should have raised an ApiUsageException" );
- } catch ( ApiUsageException $e ) {
- $this->assertTrue( self::apiExceptionHasCode( $e, 'missingtitle' ) );
- }
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
// create new page
$this->editPage( $name, 'Some text' );
$apiResult = $this->doApiRequestWithToken( [
'action' => 'delete',
'title' => $name,
- ] );
- $apiResult = $apiResult[0];
+ ] )[0];
$this->assertArrayHasKey( 'delete', $apiResult );
$this->assertArrayHasKey( 'title', $apiResult['delete'] );
- // Normalized $name is used
- $this->assertSame(
- 'Help:ApiDeleteTest testDelete',
- $apiResult['delete']['title']
- );
+ $this->assertSame( $name, $apiResult['delete']['title'] );
$this->assertArrayHasKey( 'logid', $apiResult['delete'] );
$this->assertFalse( Title::newFromText( $name )->exists() );
}
+ public function testDeleteNonexistent() {
+ $this->setExpectedException( ApiUsageException::class,
+ "The page you specified doesn't exist." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'delete',
+ 'title' => 'This page deliberately left nonexistent',
+ ] );
+ }
+
public function testDeletionWithoutPermission() {
- $name = 'Help:ApiDeleteTest_testDeleteWithoutPermission';
+ $this->setExpectedException( ApiUsageException::class,
+ 'The action you have requested is limited to users in the group:' );
+
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
// create new page
$this->editPage( $name, 'Some text' );
'title' => $name,
'token' => $user->getEditToken(),
], null, null, $user );
- $this->fail( "Should have raised an ApiUsageException" );
- } catch ( ApiUsageException $e ) {
- $this->assertTrue( self::apiExceptionHasCode( $e, 'permissiondenied' ) );
+ } finally {
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testDeleteWithTag() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ ChangeTags::defineTag( 'custom tag' );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'delete',
+ 'title' => $name,
+ 'tags' => 'custom tag',
+ ] );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $this->assertSame( 'custom tag', $dbw->selectField(
+ [ 'change_tag', 'logging' ],
+ 'ct_tag',
+ [
+ 'log_namespace' => NS_HELP,
+ 'log_title' => ucfirst( __FUNCTION__ ),
+ ],
+ __METHOD__,
+ [],
+ [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
+ ) );
+ }
+
+ public function testDeleteWithoutTagPermission() {
+ $this->setExpectedException( ApiUsageException::class,
+ 'You do not have permission to apply change tags along with your changes.' );
+
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ ChangeTags::defineTag( 'custom tag' );
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'user' => [ 'applychangetags' => true ] ] );
+
+ $this->editPage( $name, 'Some text' );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'delete',
+ 'title' => $name,
+ 'tags' => 'custom tag',
+ ] );
+ } finally {
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testDeleteAbortedByHook() {
+ $this->setExpectedException( ApiUsageException::class,
+ 'Deletion aborted by hook. It gave no explanation.' );
+
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->setTemporaryHook( 'ArticleDelete',
+ function () {
+ return false;
+ }
+ );
+
+ try {
+ $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name ] );
+ } finally {
+ $this->assertTrue( Title::newFromText( $name )->exists() );
}
+ }
+
+ public function testDeleteWatch() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $user = self::$users['sysop']->getUser();
+
+ $this->editPage( $name, 'Some text' );
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ $this->assertFalse( $user->isWatched( Title::newFromText( $name ) ) );
+
+ $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name, 'watch' => '' ] );
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ $this->assertTrue( $user->isWatched( Title::newFromText( $name ) ) );
+ }
+
+ public function testDeleteUnwatch() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $user = self::$users['sysop']->getUser();
+
+ $this->editPage( $name, 'Some text' );
$this->assertTrue( Title::newFromText( $name )->exists() );
+ $user->addWatch( Title::newFromText( $name ) );
+ $this->assertTrue( $user->isWatched( Title::newFromText( $name ) ) );
+
+ $this->doApiRequestWithToken( [ 'action' => 'delete', 'title' => $name, 'unwatch' => '' ] );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ $this->assertFalse( $user->isWatched( Title::newFromText( $name ) ) );
}
}
$wgContentHandlers["testing"] = 'DummyContentHandlerForTesting';
$wgContentHandlers["testing-nontext"] = 'DummyNonTextContentHandler';
+ $wgContentHandlers["testing-serialize-error"] =
+ 'DummySerializeErrorContentHandler';
MWNamespace::clearCaches();
$wgContLang->resetNamespaces(); # reset namespace cache
// Validate API result data
$this->assertArrayHasKey( 'edit', $apiResult );
$this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+ $this->assertSame( 'Success', $apiResult['edit']['result'] );
$this->assertArrayHasKey( 'new', $apiResult['edit'] );
$this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
'text' => 'some text',
] );
- $this->assertEquals( 'Success', $data[0]['edit']['result'] );
+ $this->assertSame( 'Success', $data[0]['edit']['result'] );
$this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
$this->assertArrayHasKey( 'nochange', $data[0]['edit'] );
'text' => 'different text'
] );
- $this->assertEquals( 'Success', $data[0]['edit']['result'] );
+ $this->assertSame( 'Success', $data[0]['edit']['result'] );
$this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
$this->assertArrayNotHasKey( 'nochange', $data[0]['edit'] );
'title' => $name,
'text' => $text, ] );
- $this->assertEquals( 'Success', $re['edit']['result'] ); // sanity
+ $this->assertSame( 'Success', $re['edit']['result'] ); // sanity
}
// -- try append/prepend --------------------------------------------
'title' => $name,
$op . 'text' => $append, ] );
- $this->assertEquals( 'Success', $re['edit']['result'] );
+ $this->assertSame( 'Success', $re['edit']['result'] );
// -- validate -----------------------------------------------------
$page = new WikiPage( Title::newFromText( $name ) );
$text = $content->getNativeData();
- $this->assertEquals( $expected, $text );
+ $this->assertSame( $expected, $text );
}
/**
'section' => '1',
'text' => "==section 1==\nnew content 1",
] );
- $this->assertEquals( 'Success', $re['edit']['result'] );
+ $this->assertSame( 'Success', $re['edit']['result'] );
$newtext = WikiPage::factory( Title::newFromText( $name ) )
->getContent( Revision::RAW )
->getNativeData();
- $this->assertEquals( "==section 1==\nnew content 1\n\n==section 2==\ncontent2", $newtext );
+ $this->assertSame( "==section 1==\nnew content 1\n\n==section 2==\ncontent2", $newtext );
// Test that we raise a 'nosuchsection' error
try {
'summary' => 'header',
] );
- $this->assertEquals( 'Success', $re['edit']['result'] );
+ $this->assertSame( 'Success', $re['edit']['result'] );
// Check the page text is correct
$text = WikiPage::factory( Title::newFromText( $name ) )
->getContent( Revision::RAW )
->getNativeData();
- $this->assertEquals( "== header ==\n\ntest", $text );
+ $this->assertSame( "== header ==\n\ntest", $text );
// Now on one that does
$this->assertTrue( Title::newFromText( $name )->exists() );
'summary' => 'header',
] );
- $this->assertEquals( 'Success', $re2['edit']['result'] );
+ $this->assertSame( 'Success', $re2['edit']['result'] );
$text = WikiPage::factory( Title::newFromText( $name ) )
->getContent( Revision::RAW )
->getNativeData();
- $this->assertEquals( "== header ==\n\ntest\n\n== header ==\n\ntest", $text );
+ $this->assertSame( "== header ==\n\ntest\n\n== header ==\n\ntest", $text );
}
/**
'redirect' => true,
], null, self::$users['sysop']->getUser() );
- $this->assertEquals( 'Success', $re['edit']['result'],
+ $this->assertSame( 'Success', $re['edit']['result'],
"no problems expected when following redirect" );
}
'section' => 'new',
], null, self::$users['sysop']->getUser() );
- $this->assertEquals( 'Success', $re['edit']['result'],
+ $this->assertSame( 'Success', $re['edit']['result'],
"no edit conflict expected here" );
}
'redirect' => true,
], null, self::$users['sysop']->getUser() );
- $this->assertEquals( 'Success', $re['edit']['result'],
+ $this->assertSame( 'Success', $re['edit']['result'],
"no edit conflict expected here" );
}
// Validate API result data
$this->assertArrayHasKey( 'edit', $apiResult );
$this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+ $this->assertSame( 'Success', $apiResult['edit']['result'] );
$this->assertArrayHasKey( 'new', $apiResult['edit'] );
$this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
// validate resulting revision
$page = WikiPage::factory( Title::newFromText( $name ) );
- $this->assertEquals( "testing-nontext", $page->getContentModel() );
- $this->assertEquals( $data, $page->getContent()->serialize() );
+ $this->assertSame( "testing-nontext", $page->getContentModel() );
+ $this->assertSame( $data, $page->getContent()->serialize() );
}
/**
// Check success
$this->assertArrayHasKey( 'edit', $apiResult );
$this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+ $this->assertSame( 'Success', $apiResult['edit']['result'] );
$this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] );
// Content model is wikitext
- $this->assertEquals( 'wikitext', $apiResult['edit']['contentmodel'] );
+ $this->assertSame( 'wikitext', $apiResult['edit']['contentmodel'] );
// Convert the page to JSON
$apiResult = $this->doApiRequestWithToken( [
// Check success
$this->assertArrayHasKey( 'edit', $apiResult );
$this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+ $this->assertSame( 'Success', $apiResult['edit']['result'] );
$this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] );
- $this->assertEquals( 'json', $apiResult['edit']['contentmodel'] );
+ $this->assertSame( 'json', $apiResult['edit']['contentmodel'] );
$apiResult = $this->doApiRequestWithToken( [
'action' => 'edit',
// Check success
$this->assertArrayHasKey( 'edit', $apiResult );
$this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
+ $this->assertSame( 'Success', $apiResult['edit']['result'] );
$this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] );
// Check that the contentmodel is back to wikitext now.
- $this->assertEquals( 'wikitext', $apiResult['edit']['contentmodel'] );
+ $this->assertSame( 'wikitext', $apiResult['edit']['contentmodel'] );
+ }
+
+ // The tests below are mostly not commented because they do exactly what
+ // you'd expect from the name.
+
+ public function testCorrectContentFormat() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'some text',
+ 'contentmodel' => 'wikitext',
+ 'contentformat' => 'text/x-wiki',
+ ] );
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+
+ public function testUnsupportedContentFormat() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'Unrecognized value for parameter "contentformat": nonexistent format.' );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'some text',
+ 'contentformat' => 'nonexistent format',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testMismatchedContentFormat() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The requested format text/plain is not supported for content ' .
+ "model wikitext used by $name." );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'some text',
+ 'contentmodel' => 'wikitext',
+ 'contentformat' => 'text/plain',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testUndoToInvalidRev() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $revId = $this->editPage( $name, 'Some text' )->value['revision']
+ ->getId();
+ $revId++;
+
+ $this->setExpectedException( ApiUsageException::class,
+ "There is no revision with ID $revId." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId,
+ ] );
+ }
+
+ /**
+ * Tests what happens if the undo parameter is a valid revision, but
+ * the undoafter parameter doesn't refer to a revision that exists in the
+ * database.
+ */
+ public function testUndoAfterToInvalidRev() {
+ // We can't just pick a large number for undoafter (as in
+ // testUndoToInvalidRev above), because then MediaWiki will helpfully
+ // assume we switched around undo and undoafter and we'll test the code
+ // path for undo being invalid, not undoafter. So instead we delete
+ // the revision from the database. In real life this case could come
+ // up if a revision number was skipped, e.g., if two transactions try
+ // to insert new revision rows at once and the first one to succeed
+ // gets rolled back.
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $titleObj = Title::newFromText( $name );
+
+ $revId1 = $this->editPage( $name, '1' )->value['revision']->getId();
+ $revId2 = $this->editPage( $name, '2' )->value['revision']->getId();
+ $revId3 = $this->editPage( $name, '3' )->value['revision']->getId();
+
+ // Make the middle revision disappear
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'revision', [ 'rev_id' => $revId2 ], __METHOD__ );
+ $dbw->update( 'revision', [ 'rev_parent_id' => $revId1 ],
+ [ 'rev_id' => $revId3 ], __METHOD__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "There is no revision with ID $revId2." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId3,
+ 'undoafter' => $revId2,
+ ] );
+ }
+
+ /**
+ * Tests what happens if the undo parameter is a valid revision, but
+ * undoafter is hidden (rev_deleted).
+ */
+ public function testUndoAfterToHiddenRev() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $titleObj = Title::newFromText( $name );
+
+ $this->editPage( $name, '0' );
+
+ $revId1 = $this->editPage( $name, '1' )->value['revision']->getId();
+
+ $revId2 = $this->editPage( $name, '2' )->value['revision']->getId();
+
+ // Hide the middle revision
+ $list = RevisionDeleter::createList( 'revision',
+ RequestContext::getMain(), $titleObj, [ $revId1 ] );
+ $list->setVisibility( [
+ 'value' => [ Revision::DELETED_TEXT => 1 ],
+ 'comment' => 'Bye-bye',
+ ] );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "There is no revision with ID $revId1." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId2,
+ 'undoafter' => $revId1,
+ ] );
+ }
+
+ /**
+ * Test undo when a revision with a higher id has an earlier timestamp.
+ * This can happen if importing an old revision.
+ */
+ public function testUndoWithSwappedRevisions() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $titleObj = Title::newFromText( $name );
+
+ $this->editPage( $name, '0' );
+
+ $revId2 = $this->editPage( $name, '2' )->value['revision']->getId();
+
+ $revId1 = $this->editPage( $name, '1' )->value['revision']->getId();
+
+ // Now monkey with the timestamp
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update(
+ 'revision',
+ [ 'rev_timestamp' => wfTimestamp( TS_MW, time() - 86400 ) ],
+ [ 'rev_id' => $revId1 ],
+ __METHOD__
+ );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId2,
+ 'undoafter' => $revId1,
+ ] );
+
+ $text = ( new WikiPage( $titleObj ) )->getContent()->getNativeData();
+
+ // This is wrong! It should be 1. But let's test for our incorrect
+ // behavior for now, so if someone fixes it they'll fix the test as
+ // well to expect 1. If we disabled the test, it might stay disabled
+ // even once the bug is fixed, which would be a shame.
+ $this->assertSame( '2', $text );
+ }
+
+ public function testUndoWithConflicts() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The edit could not be undone due to conflicting intermediate edits.' );
+
+ $this->editPage( $name, '1' );
+
+ $revId = $this->editPage( $name, '2' )->value['revision']->getId();
+
+ $this->editPage( $name, '3' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId,
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )->getContent()
+ ->getNativeData();
+ $this->assertSame( '3', $text );
+ }
+
+ /**
+ * undoafter is supposed to be less than undo. If not, we reverse their
+ * meaning, so that the two are effectively interchangeable.
+ */
+ public function testReversedUndoAfter() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, '0' );
+ $revId1 = $this->editPage( $name, '1' )->value['revision']->getId();
+ $revId2 = $this->editPage( $name, '2' )->value['revision']->getId();
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'undo' => $revId1,
+ 'undoafter' => $revId2,
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )->getContent()
+ ->getNativeData();
+ $this->assertSame( '1', $text );
+ }
+
+ public function testUndoToRevFromDifferentPage() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( "$name-1", 'Some text' );
+ $revId = $this->editPage( "$name-1", 'Some more text' )
+ ->value['revision']->getId();
+
+ $this->editPage( "$name-2", 'Some text' );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "r$revId is not a revision of $name-2." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => "$name-2",
+ 'undo' => $revId,
+ ] );
+ }
+
+ public function testUndoAfterToRevFromDifferentPage() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $revId1 = $this->editPage( "$name-1", 'Some text' )
+ ->value['revision']->getId();
+
+ $revId2 = $this->editPage( "$name-2", 'Some text' )
+ ->value['revision']->getId();
+
+ $this->setExpectedException( ApiUsageException::class,
+ "r$revId1 is not a revision of $name-2." );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => "$name-2",
+ 'undo' => $revId2,
+ 'undoafter' => $revId1,
+ ] );
+ }
+
+ public function testMd5Text() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'md5' => md5( 'Some text' ),
+ ] );
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+
+ public function testMd5PrependText() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'prependtext' => 'Alert: ',
+ 'md5' => md5( 'Alert: ' ),
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+ $this->assertSame( 'Alert: Some text', $text );
+ }
+
+ public function testMd5AppendText() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => ' is nice',
+ 'md5' => md5( ' is nice' ),
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+ $this->assertSame( 'Some text is nice', $text );
+ }
+
+ public function testMd5PrependAndAppendText() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'prependtext' => 'Alert: ',
+ 'appendtext' => ' is nice',
+ 'md5' => md5( 'Alert: is nice' ),
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+ $this->assertSame( 'Alert: Some text is nice', $text );
+ }
+
+ public function testIncorrectMd5Text() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The supplied MD5 hash was incorrect.' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'md5' => md5( '' ),
+ ] );
+ }
+
+ public function testIncorrectMd5PrependText() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The supplied MD5 hash was incorrect.' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'prependtext' => 'Some ',
+ 'appendtext' => 'text',
+ 'md5' => md5( 'Some ' ),
+ ] );
+ }
+
+ public function testIncorrectMd5AppendText() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The supplied MD5 hash was incorrect.' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'prependtext' => 'Some ',
+ 'appendtext' => 'text',
+ 'md5' => md5( 'text' ),
+ ] );
+ }
+
+ public function testCreateOnly() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The article you tried to create has been created already.' );
+
+ $this->editPage( $name, 'Some text' );
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some more text',
+ 'createonly' => '',
+ ] );
+ } finally {
+ // Validate that content was not changed
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( 'Some text', $text );
+ }
+ }
+
+ public function testNoCreate() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "The page you specified doesn't exist." );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'nocreate' => '',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ /**
+ * Appending/prepending is currently only supported for TextContent. We
+ * test this right now, and when support is added this test should be
+ * replaced by tests that the support is correct.
+ */
+ public function testAppendWithNonTextContentHandler() {
+ $name = 'MediaWiki:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "Can't append to pages using content model testing-nontext." );
+
+ $this->setTemporaryHook( 'ContentHandlerDefaultModelFor',
+ function ( Title $title, &$model ) use ( $name ) {
+ if ( $title->getPrefixedText() === $name ) {
+ $model = 'testing-nontext';
+ }
+ return true;
+ }
+ );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => 'Some text',
+ ] );
+ }
+
+ public function testAppendInMediaWikiNamespace() {
+ $name = 'MediaWiki:' . ucfirst( __FUNCTION__ );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => 'Some text',
+ ] );
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+
+ public function testAppendInMediaWikiNamespaceWithSerializationError() {
+ $name = 'MediaWiki:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'Content serialization failed: Could not unserialize content' );
+
+ $this->setTemporaryHook( 'ContentHandlerDefaultModelFor',
+ function ( Title $title, &$model ) use ( $name ) {
+ if ( $title->getPrefixedText() === $name ) {
+ $model = 'testing-serialize-error';
+ }
+ return true;
+ }
+ );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => 'Some text',
+ ] );
+ }
+
+ public function testAppendNewSection() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Initial content' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => '== New section ==',
+ 'section' => 'new',
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( "Initial content\n\n== New section ==", $text );
+ }
+
+ public function testAppendNewSectionWithInvalidContentModel() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'Sections are not supported for content model text.' );
+
+ $this->editPage( $name, 'Initial content' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => '== New section ==',
+ 'section' => 'new',
+ 'contentmodel' => 'text',
+ ] );
+ }
+
+ public function testAppendNewSectionWithTitle() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Initial content' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'sectiontitle' => 'My section',
+ 'appendtext' => 'More content',
+ 'section' => 'new',
+ ] );
+
+ $page = new WikiPage( Title::newFromText( $name ) );
+
+ $this->assertSame( "Initial content\n\n== My section ==\n\nMore content",
+ $page->getContent()->getNativeData() );
+ $this->assertSame( '/* My section */ new section',
+ $page->getRevision()->getComment() );
+ }
+
+ public function testAppendNewSectionWithSummary() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Initial content' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => 'More content',
+ 'section' => 'new',
+ 'summary' => 'Add new section',
+ ] );
+
+ $page = new WikiPage( Title::newFromText( $name ) );
+
+ $this->assertSame( "Initial content\n\n== Add new section ==\n\nMore content",
+ $page->getContent()->getNativeData() );
+ // EditPage actually assumes the summary is the section name here
+ $this->assertSame( '/* Add new section */ new section',
+ $page->getRevision()->getComment() );
+ }
+
+ public function testAppendNewSectionWithTitleAndSummary() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Initial content' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'sectiontitle' => 'My section',
+ 'appendtext' => 'More content',
+ 'section' => 'new',
+ 'summary' => 'Add new section',
+ ] );
+
+ $page = new WikiPage( Title::newFromText( $name ) );
+
+ $this->assertSame( "Initial content\n\n== My section ==\n\nMore content",
+ $page->getContent()->getNativeData() );
+ $this->assertSame( 'Add new section',
+ $page->getRevision()->getComment() );
+ }
+
+ public function testAppendToSection() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, "== Section 1 ==\n\nContent\n\n" .
+ "== Section 2 ==\n\nFascinating!" );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => ' and more content',
+ 'section' => '1',
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( "== Section 1 ==\n\nContent and more content\n\n" .
+ "== Section 2 ==\n\nFascinating!", $text );
+ }
+
+ public function testAppendToFirstSection() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, "Content\n\n== Section 1 ==\n\nFascinating!" );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => ' and more content',
+ 'section' => '0',
+ ] );
+
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( "Content and more content\n\n== Section 1 ==\n\n" .
+ "Fascinating!", $text );
+ }
+
+ public function testAppendToNonexistentSection() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class, 'There is no section 1.' );
+
+ $this->editPage( $name, 'Content' );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'appendtext' => ' and more content',
+ 'section' => '1',
+ ] );
+ } finally {
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( 'Content', $text );
+ }
+ }
+
+ public function testEditMalformedSection() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The "section" parameter must be a valid section ID or "new".' );
+ $this->editPage( $name, 'Content' );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Different content',
+ 'section' => 'It is unlikely that this is valid',
+ ] );
+ } finally {
+ $text = ( new WikiPage( Title::newFromText( $name ) ) )
+ ->getContent()->getNativeData();
+
+ $this->assertSame( 'Content', $text );
+ }
+ }
+
+ public function testEditWithStartTimestamp() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $this->setExpectedException( ApiUsageException::class,
+ 'The page has been deleted since you fetched its timestamp.' );
+
+ $startTime = MWTimestamp::convert( TS_MW, time() - 1 );
+
+ $this->editPage( $name, 'Some text' );
+
+ $pageObj = new WikiPage( Title::newFromText( $name ) );
+ $pageObj->doDeleteArticle( 'Bye-bye' );
+
+ $this->assertFalse( $pageObj->exists() );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Different text',
+ 'starttimestamp' => $startTime,
+ ] );
+ } finally {
+ $this->assertFalse( $pageObj->exists() );
+ }
+ }
+
+ public function testEditMinor() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->editPage( $name, 'Some text' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Different text',
+ 'minor' => '',
+ ] );
+
+ $revisionStore = \MediaWiki\MediaWikiServices::getInstance()->getRevisionStore();
+ $revision = $revisionStore->getRevisionByTitle( Title::newFromText( $name ) );
+ $this->assertTrue( $revision->isMinor() );
+ }
+
+ public function testEditRecreate() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $startTime = MWTimestamp::convert( TS_MW, time() - 1 );
+
+ $this->editPage( $name, 'Some text' );
+
+ $pageObj = new WikiPage( Title::newFromText( $name ) );
+ $pageObj->doDeleteArticle( 'Bye-bye' );
+
+ $this->assertFalse( $pageObj->exists() );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Different text',
+ 'starttimestamp' => $startTime,
+ 'recreate' => '',
+ ] );
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ }
+
+ public function testEditWatch() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $user = self::$users['sysop']->getUser();
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'watch' => '',
+ ] );
+
+ $this->assertTrue( Title::newFromText( $name )->exists() );
+ $this->assertTrue( $user->isWatched( Title::newFromText( $name ) ) );
+ }
+
+ public function testEditUnwatch() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+ $user = self::$users['sysop']->getUser();
+ $titleObj = Title::newFromText( $name );
+
+ $user->addWatch( $titleObj );
+
+ $this->assertFalse( $titleObj->exists() );
+ $this->assertTrue( $user->isWatched( $titleObj ) );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'unwatch' => '',
+ ] );
+
+ $this->assertTrue( $titleObj->exists() );
+ $this->assertFalse( $user->isWatched( $titleObj ) );
+ }
+
+ public function testEditWithTag() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ ChangeTags::defineTag( 'custom tag' );
+
+ $revId = $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'tags' => 'custom tag',
+ ] )[0]['edit']['newrevid'];
+
+ $dbw = wfGetDB( DB_MASTER );
+ $this->assertSame( 'custom tag', $dbw->selectField(
+ 'change_tag', 'ct_tag', [ 'ct_rev_id' => $revId ], __METHOD__ ) );
+ }
+
+ public function testEditWithoutTagPermission() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'You do not have permission to apply change tags along with your changes.' );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+
+ ChangeTags::defineTag( 'custom tag' );
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'user' => [ 'applychangetags' => true ] ] );
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'tags' => 'custom tag',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testEditAbortedByHook() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The modification you tried to make was aborted by an extension.' );
+
+ $this->hideDeprecated( 'APIEditBeforeSave hook (used in ' .
+ 'hook-APIEditBeforeSave-closure)' );
+
+ $this->setTemporaryHook( 'APIEditBeforeSave',
+ function () {
+ return false;
+ }
+ );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testEditAbortedByHookWithCustomOutput() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->hideDeprecated( 'APIEditBeforeSave hook (used in ' .
+ 'hook-APIEditBeforeSave-closure)' );
+
+ $this->setTemporaryHook( 'APIEditBeforeSave',
+ function ( $unused1, $unused2, &$r ) {
+ $r['msg'] = 'Some message';
+ return false;
+ } );
+
+ $result = $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ Wikimedia\restoreWarnings();
+
+ $this->assertSame( [ 'msg' => 'Some message', 'result' => 'Failure' ],
+ $result[0]['edit'] );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+
+ public function testEditAbortedByEditPageHookWithResult() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setTemporaryHook( 'EditFilterMergedContent',
+ function ( $unused1, $unused2, Status $status ) {
+ $status->apiHookResult = [ 'msg' => 'A message for you!' ];
+ return false;
+ } );
+
+ $res = $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ $this->assertSame( [ 'edit' => [ 'msg' => 'A message for you!',
+ 'result' => 'Failure' ] ], $res[0] );
+ }
+
+ public function testEditAbortedByEditPageHookWithNoResult() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The modification you tried to make was aborted by an extension.' );
+
+ $this->setTemporaryHook( 'EditFilterMergedContent',
+ function () {
+ return false;
+ }
+ );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ } finally {
+ $this->assertFalse( Title::newFromText( $name )->exists() );
+ }
+ }
+
+ public function testEditWhileBlocked() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'You have been blocked from editing.' );
+
+ $block = new Block( [
+ 'address' => self::$users['sysop']->getUser()->getName(),
+ 'by' => self::$users['sysop']->getUser()->getId(),
+ 'reason' => 'Capriciousness',
+ 'timestamp' => '19370101000000',
+ 'expiry' => 'infinity',
+ ] );
+ $block->insert();
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ } finally {
+ $block->delete();
+ self::$users['sysop']->getUser()->clearInstanceCache();
+ }
+ }
+
+ public function testEditWhileReadOnly() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The wiki is currently in read-only mode.' );
+
+ $svc = \MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode();
+ $svc->setReason( "Read-only for testing" );
+
+ try {
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ } finally {
+ $svc->setReason( false );
+ }
+ }
+
+ public function testCreateImageRedirectAnon() {
+ $name = 'File:' . ucfirst( __FUNCTION__ );
+
+ // @todo When ApiTestCase supports anonymous users, this exception
+ // should no longer be thrown, and the test can then be updated to test
+ // for the actual expected behavior.
+ $this->setExpectedException( ApiUsageException::class,
+ 'Invalid CSRF token.' );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'logout',
+ ] );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => '#REDIRECT [[File:Other file.png]]',
+ ] );
+ }
+
+ public function testCreateImageRedirectLoggedIn() {
+ $name = 'File:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "You don't have permission to create image redirects." );
+
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'user' => [ 'upload' => true ] ] );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => '#REDIRECT [[File:Other file.png]]',
+ ] );
+ }
+
+ public function testTooBigEdit() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ 'The content you supplied exceeds the article size limit of 1 kilobyte.' );
+
+ $this->setMwGlobals( 'wgMaxArticleSize', 1 );
+
+ $text = str_repeat( '!', 1025 );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => $text,
+ ] );
+ }
+
+ public function testProhibitedAnonymousEdit() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ // @todo See comment in testCreateImageRedirectAnon
+ $this->setExpectedException( ApiUsageException::class,
+ 'Invalid CSRF token.' );
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ '*' => [ 'edit' => true ] ] );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'logout',
+ ] );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ ] );
+ }
+
+ public function testProhibitedChangeContentModel() {
+ $name = 'Help:' . ucfirst( __FUNCTION__ );
+
+ $this->setExpectedException( ApiUsageException::class,
+ "You don't have permission to change the content model of a page." );
+
+ $this->setMwGlobals( 'wgRevokePermissions',
+ [ 'user' => [ 'editcontentmodel' => true ] ] );
+
+ $this->doApiRequestWithToken( [
+ 'action' => 'edit',
+ 'title' => $name,
+ 'text' => 'Some text',
+ 'contentmodel' => 'json',
+ ] );
}
}
$this->assertEquals( 'Success', $a );
}
+ public function testLoginWithNoSameOriginSecurity() {
+ $this->setTemporaryHook( 'RequestHasSameOriginSecurity',
+ function () {
+ return false;
+ }
+ );
+
+ $result = $this->doApiRequest( [
+ 'action' => 'login',
+ ] )[0]['login'];
+
+ $this->assertSame( [
+ 'result' => 'Aborted',
+ 'reason' => 'Cannot log in when the same-origin policy is not applied.',
+ ], $result );
+ }
}
use MediaWiki\MediaWikiServices;
/**
- * @medium
+ * @group medium
* @group API
* @group Database
*
'type' => 'new',
'patrolled' => true,
'unpatrolled' => false,
+ 'autopatrolled' => false,
]
],
$this->getItemsFromApiResponse( $result )
'type' => 'new',
'patrolled' => true,
'unpatrolled' => false,
+ 'autopatrolled' => false,
]
],
$this->getItemsFromApiResponse( $resultPatrolled )
private static $allcategories = [
[ 'list' => 'allcategories', 'acprefix' => 'AQBT-' ],
[ 'allcategories' => [
- [ '*' => 'AQBT-Cat' ],
+ [ 'category' => 'AQBT-Cat' ],
] ]
];
$this->check( self::$allpages );
$this->check( self::$alllinks );
$this->check( self::$alltransclusions );
- // This test is temporarily disabled until a sqlite bug is fixed
- // Confirmed still broken 15-nov-2013
- // $this->check( self::$allcategories );
+ $this->check( self::$allcategories );
$this->check( self::$backlinks );
$this->check( self::$embeddedin );
$this->check( self::$categorymembers );
}
/**
- * @medium
+ * @group medium
*/
public function testA() {
$this->mVerbose = false;
/**
* Test smart continue - list=allpages
- * @medium
+ * @group medium
*/
public function test1List() {
$this->mVerbose = false;
/**
* Test smart continue - list=allpages|alltransclusions
- * @medium
+ * @group medium
*/
public function test2Lists() {
$this->mVerbose = false;
/**
* Test smart continue - generator=allpages, prop=links
- * @medium
+ * @group medium
*/
public function testGen1Prop() {
$this->mVerbose = false;
/**
* Test smart continue - generator=allpages, prop=links|templates
- * @medium
+ * @group medium
*/
public function testGen2Prop() {
$this->mVerbose = false;
/**
* Test smart continue - generator=allpages, prop=links, list=alltransclusions
- * @medium
+ * @group medium
*/
public function testGen1Prop1List() {
$this->mVerbose = false;
/**
* Test smart continue - generator=allpages, prop=links|templates,
* list=alllinks|alltransclusions, meta=siteinfo
- * @medium
+ * @group medium
*/
public function testGen2Prop2List1Meta() {
$this->mVerbose = false;
/**
* Test smart continue - generator=templates, prop=templates
- * @medium
+ * @group medium
*/
public function testSameGenAndProp() {
$this->mVerbose = false;
/**
* Test smart continue - generator=allpages, list=allpages
- * @medium
+ * @group medium
*/
public function testSameGenList() {
$this->mVerbose = false;
/**
* @covers HTMLForm
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Gergő Tisza
* @author Thiemo Mättig
*/
* Integration test that checks import success and
* LinkCache integration.
*
- * @large
+ * @group large
* @group Database
* @covers ImportStreamSource
* @covers ImportReporter
*
* @group JobQueue
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Thiemo Kreuz
*/
class JobQueueMemoryTest extends PHPUnit\Framework\TestCase {
* @group JobQueue
* @group Database
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Addshore
*/
class CategoryMembershipChangeJobTest extends MediaWikiTestCase {
* @group JobQueue
* @group Database
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Addshore
*/
class ClearUserWatchlistJobTest extends MediaWikiTestCase {
use MediaWikiCoversValidator;
- private $search;
-
/**
* @covers ArrayUtils::findLowerBound
* @dataProvider provideFindLowerBound
* Consecutive calls to the memoized callable with the same arguments
* should result in just one invocation of the underlying callable.
*
- * @requires function apc_store/apcu_store
+ * @requires extension apcu
*/
public function testCallableMemoized() {
$observer = $this->getMockBuilder( stdClass::class )
$db->listViews( '' ) );
}
- /**
- * @covers Wikimedia\Rdbms\MySQLMasterPos
- */
public function testBinLogName() {
$pos = new MySQLMasterPos( "db1052.2424/4643", 1 );
- $this->assertEquals( "db1052", $pos->getLogName() );
+ $this->assertEquals( "db1052", $pos->binlog );
$this->assertEquals( "db1052.2424", $pos->getLogFile() );
- $this->assertEquals( [ 2424, 4643 ], $pos->getLogPosition() );
+ $this->assertEquals( [ 2424, 4643 ], $pos->pos );
}
/**
],
// MySQL GTID style
[
- new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:1-23', $now ),
- new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:5-24', $now ),
+ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:23', $now ),
+ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:24', $now ),
true,
false
],
[
- new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:5-99', $now ),
- new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:1-100', $now ),
+ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
+ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
true,
false
],
[
- new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:1-99', $now ),
- new MySQLMasterPos( '1E11FA47-71CA-11E1-9E33-C80AA9429562:1-100', $now ),
+ new MySQLMasterPos( '3E11FA47-71CA-11E1-9E33-C80AA9429562:99', $now ),
+ new MySQLMasterPos( '1E11FA47-71CA-11E1-9E33-C80AA9429562:100', $now ),
false,
false
],
],
[
new MySQLMasterPos(
- '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-5,' .
- '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-99,' .
- '7E11FA47-71CA-11E1-9E33-C80AA9429562:1-30',
+ '2E11FA47-71CA-11E1-9E33-C80AA9429562:5,' .
+ '3E11FA47-71CA-11E1-9E33-C80AA9429562:99,' .
+ '7E11FA47-71CA-11E1-9E33-C80AA9429562:30',
1
),
new MySQLMasterPos(
- '1E11FA47-71CA-11E1-9E33-C80AA9429562:30-100,' .
- '3E11FA47-71CA-11E1-9E33-C80AA9429562:30-66',
+ '1E11FA47-71CA-11E1-9E33-C80AA9429562:100,' .
+ '3E11FA47-71CA-11E1-9E33-C80AA9429562:66',
1
),
- [ '3E11FA47-71CA-11E1-9E33-C80AA9429562:20-99' ]
+ [ '3E11FA47-71CA-11E1-9E33-C80AA9429562:99' ]
]
];
}
];
}
- /**
- * @dataProvider provideGtidData
- * @covers Wikimedia\Rdbms\MySQLMasterPos
- * @covers Wikimedia\Rdbms\DatabaseMysqlBase::getReplicaPos
- * @covers Wikimedia\Rdbms\DatabaseMysqlBase::getMasterPos
- */
- public function testServerGtidTable( $gtable, $rBLtable, $mBLtable, $rGTIDs, $mGTIDs ) {
- $db = $this->getMockBuilder( DatabaseMysqli::class )
- ->disableOriginalConstructor()
- ->setMethods( [
- 'useGTIDs',
- 'getServerGTIDs',
- 'getServerRoleStatus',
- 'getServerId',
- 'getServerUUID'
- ] )
- ->getMock();
-
- $db->method( 'useGTIDs' )->willReturn( true );
- $db->method( 'getServerGTIDs' )->willReturn( $gtable );
- $db->method( 'getServerRoleStatus' )->willReturnCallback(
- function ( $role ) use ( $rBLtable, $mBLtable ) {
- if ( $role === 'SLAVE' ) {
- return $rBLtable;
- } elseif ( $role === 'MASTER' ) {
- return $mBLtable;
- }
-
- return null;
- }
- );
- $db->method( 'getServerId' )->willReturn( 1 );
- $db->method( 'getServerUUID' )->willReturn( '2E11FA47-71CA-11E1-9E33-C80AA9429562' );
-
- if ( is_array( $rGTIDs ) ) {
- $this->assertEquals( $rGTIDs, $db->getReplicaPos()->getGTIDs() );
- } else {
- $this->assertEquals( false, $db->getReplicaPos() );
- }
- if ( is_array( $mGTIDs ) ) {
- $this->assertEquals( $mGTIDs, $db->getMasterPos()->getGTIDs() );
- } else {
- $this->assertEquals( false, $db->getMasterPos() );
- }
- }
-
- public static function provideGtidData() {
- return [
- // MariaDB
- [
- [
- 'gtid_domain_id' => 100,
- 'gtid_current_pos' => '100-13-77',
- 'gtid_binlog_pos' => '100-13-77',
- 'gtid_slave_pos' => null // master
- ],
- [],
- [
- 'File' => 'host.1600',
- 'Pos' => '77'
- ],
- [ '100' => '100-13-77' ],
- [ '100' => '100-13-77' ]
- ],
- [
- [
- 'gtid_domain_id' => 100,
- 'gtid_current_pos' => '100-13-77',
- 'gtid_binlog_pos' => '100-13-77',
- 'gtid_slave_pos' => '100-13-77' // replica
- ],
- [
- 'Relay_Master_Log_File' => 'host.1600',
- 'Exec_Master_Log_Pos' => '77'
- ],
- [],
- [ '100' => '100-13-77' ],
- [ '100' => '100-13-77' ]
- ],
- [
- [
- 'gtid_current_pos' => '100-13-77',
- 'gtid_binlog_pos' => '100-13-77',
- 'gtid_slave_pos' => '100-13-77' // replica
- ],
- [
- 'Relay_Master_Log_File' => 'host.1600',
- 'Exec_Master_Log_Pos' => '77'
- ],
- [],
- [ '100' => '100-13-77' ],
- [ '100' => '100-13-77' ]
- ],
- // MySQL
- [
- [
- 'gtid_executed' => '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-77'
- ],
- [
- 'Relay_Master_Log_File' => 'host.1600',
- 'Exec_Master_Log_Pos' => '77'
- ],
- [], // only a replica
- [ '2E11FA47-71CA-11E1-9E33-C80AA9429562'
- => '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-77' ],
- // replica/master use same var
- [ '2E11FA47-71CA-11E1-9E33-C80AA9429562'
- => '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-77' ],
- ],
- [
- [
- 'gtid_executed' => '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-49,' .
- '2E11FA47-71CA-11E1-9E33-C80AA9429562:51-77'
- ],
- [
- 'Relay_Master_Log_File' => 'host.1600',
- 'Exec_Master_Log_Pos' => '77'
- ],
- [], // only a replica
- [ '2E11FA47-71CA-11E1-9E33-C80AA9429562'
- => '2E11FA47-71CA-11E1-9E33-C80AA9429562:51-77' ],
- // replica/master use same var
- [ '2E11FA47-71CA-11E1-9E33-C80AA9429562'
- => '2E11FA47-71CA-11E1-9E33-C80AA9429562:51-77' ],
- ],
- [
- [
- 'gtid_executed' => null // not enabled?
- ],
- [
- 'Relay_Master_Log_File' => 'host.1600',
- 'Exec_Master_Log_Pos' => '77'
- ],
- [], // only a replica
- [], // binlog fallback
- false
- ],
- [
- [
- 'gtid_executed' => null // not enabled?
- ],
- [], // no replication
- [], // no replication
- false,
- false
- ]
- ];
- }
-
/**
* @covers Wikimedia\Rdbms\MySQLMasterPos
*/
* Note: the following groups are not used by PHPUnit.
* The list in ParserTestFileSuite::__construct() is used instead.
*
- * @large
+ * @group large
* @group Database
* @group Parser
* @group ParserTests
<?php
/**
- * @medium
+ * @group medium
* @group Database
* @covers FormattedRCFeed
* @covers RecentChange
$this->assertEquals( $expected, $client->getHeadHtml() );
}
+ /**
+ * Confirm that 'target' is passed down to the startup module's load url.
+ *
+ * @covers ResourceLoaderClientHtml::getHeadHtml
+ */
+ public function testGetHeadHtmlWithTarget() {
+ $client = new ResourceLoaderClientHtml(
+ self::makeContext(),
+ [ 'target' => 'example' ]
+ );
+
+ // phpcs:disable Generic.Files.LineLength
+ $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
+ . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&skin=fallback&target=example"></script>';
+ // phpcs:enable
+
+ $this->assertEquals( $expected, $client->getHeadHtml() );
+ }
+
+ /**
+ * Confirm that a null 'target' is the same as no target.
+ *
+ * @covers ResourceLoaderClientHtml::getHeadHtml
+ */
+ public function testGetHeadHtmlWithNullTarget() {
+ $client = new ResourceLoaderClientHtml(
+ self::makeContext(),
+ [ 'target' => null ]
+ );
+
+ // phpcs:disable Generic.Files.LineLength
+ $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
+ . '<script async="" src="/w/load.php?debug=false&lang=nl&modules=startup&only=scripts&skin=fallback"></script>';
+ // phpcs:enable
+
+ $this->assertEquals( $expected, $client->getHeadHtml() );
+ }
+
/**
* @covers ResourceLoaderClientHtml::getBodyHtml
* @covers ResourceLoaderClientHtml::getLoad
<?php
/**
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Addshore
*
* @covers SpecialBlankpage
*
* @since 1.26
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @author Daniel Kinzler
* @author Addshore
*
* @since 1.30
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
*/
class SpecialShortpagesTest extends MediaWikiTestCase {
// We'll add several pages, revision and texts. The following variables hold the
// corresponding ids.
- private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
- private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
+ private $pageId1, $pageId2, $pageId3, $pageId4;
+ private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4;
private $revId1_1, $textId1_1;
private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
--- /dev/null
+<?php
+
+namespace MediaWiki\Tests\Maintenance;
+
+use DeleteAutoPatrolLogs;
+
+/**
+ * @group Database
+ * @covers DeleteAutoPatrolLogs
+ */
+class DeleteAutoPatrolLogsTest extends MaintenanceBaseTestCase {
+
+ public function getMaintenanceClass() {
+ return DeleteAutoPatrolLogs::class;
+ }
+
+ public function setUp() {
+ parent::setUp();
+ $this->tablesUsed = [ 'logging' ];
+
+ $this->cleanLoggingTable();
+ $this->insertLoggingData();
+ }
+
+ private function cleanLoggingTable() {
+ wfGetDB( DB_MASTER )->delete( 'logging', '*' );
+ }
+
+ private function insertLoggingData() {
+ $logs = [];
+
+ // Manual patrolling
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => 7251,
+ 'log_params' => '',
+ 'log_timestamp' => 20041223210426
+ ];
+
+ // Autopatrol #1
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => 7252,
+ 'log_params' => '',
+ 'log_timestamp' => 20051223210426
+ ];
+
+ // Block
+ $logs[] = [
+ 'log_type' => 'block',
+ 'log_action' => 'block',
+ 'log_user' => 7253,
+ 'log_params' => '',
+ 'log_timestamp' => 20061223210426
+ ];
+
+ // Very old/ invalid patrol
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => 7253,
+ 'log_params' => 'nanana',
+ 'log_timestamp' => 20061223210426
+ ];
+
+ // Autopatrol #2
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => 7254,
+ 'log_params' => '',
+ 'log_timestamp' => 20071223210426
+ ];
+
+ // Autopatrol #3 old way
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => 7255,
+ 'log_params' => serialize( [ '6::auto' => true ] ),
+ 'log_timestamp' => 20081223210426
+ ];
+
+ // Manual patrol #2 old way
+ $logs[] = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => 7256,
+ 'log_params' => serialize( [ '6::auto' => false ] ),
+ 'log_timestamp' => 20091223210426
+ ];
+
+ wfGetDB( DB_MASTER )->insert( 'logging', $logs );
+ }
+
+ public function runProvider() {
+ $allRows = [
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => '7251',
+ ],
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => '7252',
+ ],
+ (object)[
+ 'log_type' => 'block',
+ 'log_action' => 'block',
+ 'log_user' => '7253',
+ ],
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => '7253',
+ ],
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => '7254',
+ ],
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => '7255',
+ ],
+ (object)[
+ 'log_type' => 'patrol',
+ 'log_action' => 'patrol',
+ 'log_user' => '7256',
+ ],
+ ];
+
+ $cases = [
+ 'dry run' => [
+ $allRows,
+ [ '--sleep', '0', '--dry-run', '-q' ]
+ ],
+ 'basic run' => [
+ [
+ $allRows[0],
+ $allRows[2],
+ $allRows[3],
+ $allRows[5],
+ $allRows[6],
+ ],
+ [ '--sleep', '0', '-q' ]
+ ],
+ 'run with before' => [
+ [
+ $allRows[0],
+ $allRows[2],
+ $allRows[3],
+ $allRows[4],
+ $allRows[5],
+ $allRows[6],
+ ],
+ [ '--sleep', '0', '--before', '20060123210426', '-q' ]
+ ],
+ 'run with check-old' => [
+ [
+ $allRows[0],
+ $allRows[1],
+ $allRows[2],
+ $allRows[3],
+ $allRows[4],
+ $allRows[6],
+ ],
+ [ '--sleep', '0', '--check-old', '-q' ]
+ ],
+ ];
+
+ foreach ( $cases as $key => $case ) {
+ yield $key . '-batch-size-1' => [
+ $case[0],
+ array_merge( $case[1], [ '--batch-size', '1' ] )
+ ];
+ yield $key . '-batch-size-5' => [
+ $case[0],
+ array_merge( $case[1], [ '--batch-size', '5' ] )
+ ];
+ yield $key . '-batch-size-1000' => [
+ $case[0],
+ array_merge( $case[1], [ '--batch-size', '1000' ] )
+ ];
+ }
+ }
+
+ /**
+ * @dataProvider runProvider
+ */
+ public function testRun( $expected, $args ) {
+ $this->maintenance->loadWithArgv( $args );
+
+ $this->maintenance->execute();
+
+ $remainingLogs = wfGetDB( DB_REPLICA )->select(
+ [ 'logging' ],
+ [ 'log_type', 'log_action', 'log_user' ],
+ [],
+ __METHOD__,
+ [ 'ORDER BY' => 'log_id' ]
+ );
+
+ $this->assertEquals( $expected, iterator_to_array( $remainingLogs, false ) );
+ }
+
+ public function testFromId() {
+ $fromId = wfGetDB( DB_REPLICA )->selectField(
+ 'logging',
+ 'log_id',
+ [ 'log_params' => 'nanana' ]
+ );
+
+ $this->maintenance->loadWithArgv( [ '--sleep', '0', '--from-id', strval( $fromId ), '-q' ] );
+
+ $this->maintenance->execute();
+
+ $remainingLogs = wfGetDB( DB_REPLICA )->select(
+ [ 'logging' ],
+ [ 'log_type', 'log_action', 'log_user' ],
+ [],
+ __METHOD__,
+ [ 'ORDER BY' => 'log_id' ]
+ );
+
+ $deleted = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => '7254',
+ ];
+ $notDeleted = [
+ 'log_type' => 'patrol',
+ 'log_action' => 'autopatrol',
+ 'log_user' => '7252',
+ ];
+
+ $remainingLogs = array_map(
+ function ( $val ) {
+ return (array)$val;
+ },
+ iterator_to_array( $remainingLogs, false )
+ );
+
+ $this->assertNotContains( $deleted, $remainingLogs );
+ $this->assertContains( $notDeleted, $remainingLogs );
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * A simple {@link MessageLocalizer} implementation for use in tests.
+ * By default, it sets the message language to 'qqx',
+ * to make the tests independent of the wiki configuration.
+ *
+ * @author Lucas Werkmeister
+ * @license GPL-2.0-or-later
+ */
+class MockMessageLocalizer implements MessageLocalizer {
+
+ /**
+ * @var string|null
+ */
+ private $languageCode;
+
+ /**
+ * @param string|null $languageCode The language code to use for messages by default.
+ * You can specify null to use the user language,
+ * but this is not recommended as it may make your tests depend on the wiki configuration.
+ */
+ public function __construct( $languageCode = 'qqx' ) {
+ $this->languageCode = $languageCode;
+ }
+
+ /**
+ * Get a Message object.
+ * Parameters are the same as {@link wfMessage()}.
+ *
+ * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
+ * or a MessageSpecifier.
+ * @param mixed $args,...
+ * @return Message
+ */
+ public function msg( $key ) {
+ $args = func_get_args();
+
+ /** @var Message $message */
+ $message = call_user_func_array( 'wfMessage', $args );
+
+ if ( $this->languageCode !== null ) {
+ $message->inLanguage( $this->languageCode );
+ }
+
+ return $message;
+ }
+
+}
class DummyContentHandlerForTesting extends ContentHandler {
- public function __construct( $dataModel ) {
- parent::__construct( $dataModel, [ DummyContentForTesting::MODEL_ID ] );
+ public function __construct( $dataModel, $formats = [ DummyContentForTesting::MODEL_ID ] ) {
+ parent::__construct( $dataModel, $formats );
}
/**
--- /dev/null
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * A dummy content handler that will throw on an attempt to serialize content.
+ */
+class DummySerializeErrorContentHandler extends DummyContentHandlerForTesting {
+
+ public function __construct( $dataModel ) {
+ parent::__construct( $dataModel, [ "testing-serialize-error" ] );
+ }
+
+ /**
+ * @see ContentHandler::unserializeContent
+ *
+ * @param string $blob
+ * @param string $format
+ *
+ * @return Content
+ */
+ public function unserializeContent( $blob, $format = null ) {
+ throw new MWContentSerializationException( 'Could not unserialize content' );
+ }
+
+ /**
+ * @see ContentHandler::supportsDirectEditing
+ *
+ * @return bool
+ *
+ * @todo Should this be in the parent class?
+ */
+ public function supportsDirectApiEditing() {
+ return true;
+ }
+
+}
protected function setUp() {
global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
$wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
- $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection,
- $parserMemc;
+ $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection;
$tmpDir = $this->getNewTempDirectory();
$tmpGlobals = [];
parent::tearDown();
}
- /**
- * Delete the specified files, if they exist.
- *
- * @param array $files Full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- *
- * @param array $dirs Full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- *
- * @return string The directory
- */
- private function setupUploadDir() {
- global $IP;
-
- $dir = $this->getNewTempDirectory();
-
- wfDebug( "Creating upload directory $dir\n" );
-
- wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
- copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
-
- wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
- copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
- return $dir;
- }
-
public static function suite() {
// Hack to invoke the autoloader required to get phpunit to recognize
// the UploadFromUrlTest class
<?php
+use Wikimedia\Rdbms\IMaintainableDatabase;
/**
* @covers MediaWikiTestCase
public static $hasRun = false;
- public function getSchemaOverrides() {
+ public function getSchemaOverrides( IMaintainableDatabase $db ) {
return [
- [ 'imagelinks', 'MediaWikiTestCaseTestTable' ],
- [ __DIR__ . '/MediaWikiTestCaseSchemaTest.sql' ]
+ 'create' => [ 'MediaWikiTestCaseTestTable', 'imagelinks' ],
+ 'drop' => [ 'oldimage' ],
+ 'alter' => [ 'pagelinks' ],
+ 'scripts' => [ __DIR__ . '/MediaWikiTestCaseSchemaTest.sql' ]
];
}
$this->assertTrue( self::$hasRun );
}
- public function testSchemaExtension() {
- // make sure we can use the MediaWikiTestCaseTestTable table
-
- $input = [ 'id' => '5', 'name' => 'Test' ];
-
- $this->db->insert(
- 'MediaWikiTestCaseTestTable',
- $input
- );
-
- $output = $this->db->selectRow( 'MediaWikiTestCaseTestTable', array_keys( $input ), [] );
- $this->assertEquals( (object)$input, $output );
+ public function testTableWasCreated() {
+ // Make sure MediaWikiTestCaseTestTable was created.
+ $this->assertTrue( $this->db->tableExists( 'MediaWikiTestCaseTestTable' ) );
}
- public function testSchemaOverride() {
- // make sure we can use the il_frobniz field
-
- $input = [
- 'il_from' => '7',
- 'il_from_namespace' => '0',
- 'il_to' => 'Foo.jpg',
- 'il_frobniz' => 'Xyzzy',
- ];
+ public function testTableWasDropped() {
+ // Make sure oldimage was dropped
+ $this->assertFalse( $this->db->tableExists( 'oldimage' ) );
+ }
- $this->db->insert(
- 'imagelinks',
- $input
- );
+ public function testTableWasOverriden() {
+ // Make sure imagelinks was overwritten
+ $this->assertTrue( $this->db->tableExists( 'imagelinks' ) );
+ $this->assertTrue( $this->db->fieldExists( 'imagelinks', 'il_frobnitz' ) );
+ }
- $output = $this->db->selectRow( 'imagelinks', array_keys( $input ), [] );
- $this->assertEquals( (object)$input, $output );
+ public function testTableWasAltered() {
+ // Make sure pagelinks was altered
+ $this->assertTrue( $this->db->tableExists( 'pagelinks' ) );
+ $this->assertTrue( $this->db->fieldExists( 'pagelinks', 'pl_frobnitz' ) );
}
}
$this->assertTrue( MediaWikiTestCaseSchema1Test::$hasRun );
}
- public function testSchemaExtension() {
+ public function testCreatedTableWasRemoved() {
// Make sure MediaWikiTestCaseTestTable created by MediaWikiTestCaseSchema1Test
// was dropped before executing MediaWikiTestCaseSchema2Test.
$this->assertFalse( $this->db->tableExists( 'MediaWikiTestCaseTestTable' ) );
}
- public function testSchemaOverride() {
- // Make sure imagelinks modified by MediaWikiTestCaseSchema1Test
+ public function testDroppedTableWasRestored() {
+ // Make sure oldimage that was dropped by MediaWikiTestCaseSchema1Test
+ // was restored before executing MediaWikiTestCaseSchema2Test.
+ $this->assertTrue( $this->db->tableExists( 'oldimage' ) );
+ }
+
+ public function testOverridenTableWasRestored() {
+ // Make sure imagelinks overwritten by MediaWikiTestCaseSchema1Test
// was restored to the original schema before executing MediaWikiTestCaseSchema2Test.
$this->assertTrue( $this->db->tableExists( 'imagelinks' ) );
- $this->assertFalse( $this->db->fieldExists( 'imagelinks', 'il_frobniz' ) );
+ $this->assertFalse( $this->db->fieldExists( 'imagelinks', 'il_frobnitz' ) );
+ }
+
+ public function testAlteredTableWasRestored() {
+ // Make sure pagelinks altered by MediaWikiTestCaseSchema1Test
+ // was restored to the original schema before executing MediaWikiTestCaseSchema2Test.
+ $this->assertTrue( $this->db->tableExists( 'pagelinks' ) );
+ $this->assertFalse( $this->db->fieldExists( 'pagelinks', 'pl_frobnitz' ) );
}
}
il_from int NOT NULL DEFAULT 0,
il_from_namespace int NOT NULL DEFAULT 0,
il_to varchar(127) NOT NULL DEFAULT '',
- il_frobniz varchar(127) NOT NULL DEFAULT 'FROB',
+ il_frobnitz varchar(127) NOT NULL DEFAULT 'FROB',
PRIMARY KEY (il_from,il_to)
) /*$wgDBTableOptions*/;
+
+ALTER TABLE /*_*/pagelinks
+ADD pl_frobnitz varchar(127) NOT NULL DEFAULT 'FROB';
+
+DROP TABLE /*_*/oldimage;
api.uploadWithIframe( $( '<input>' )[ 0 ], { filename: 'Testing API upload.jpg' } );
- $iframe = $( 'iframe' );
+ $iframe = $( 'iframe:last-child' );
$form = $( 'form.mw-api-upload-form' );
$input = $form.find( 'input[name=filename]' );
- assert.ok( $form.length > 0 );
- assert.ok( $input.length > 0 );
- assert.ok( $iframe.length > 0 );
- assert.strictEqual( $form.prop( 'target' ), $iframe.prop( 'id' ) );
- assert.strictEqual( $input.val(), 'Testing API upload.jpg' );
+ assert.ok( $form.length > 0, 'form' );
+ assert.ok( $input.length > 0, 'input' );
+ assert.ok( $iframe.length > 0, 'frame' );
+ assert.strictEqual( $form.prop( 'target' ), $iframe.prop( 'id' ), 'form.target and frame.id ' );
+ assert.strictEqual( $input.val(), 'Testing API upload.jpg', 'input value' );
} );
}( mediaWiki, jQuery ) );
assert.notEqual( result, result2, 'different when called multiple times' );
} );
+ QUnit.test( 'stickyRandomId', function ( assert ) {
+ var result = mw.user.stickyRandomId(),
+ result2 = mw.user.stickyRandomId();
+ assert.equal( typeof result, 'string', 'type' );
+ assert.strictEqual( /^[a-f0-9]{16}$/.test( result ), true, '16 HEX symbols string' );
+ assert.equal( result2, result, 'sticky' );
+ } );
+
QUnit.test( 'sessionId', function ( assert ) {
var result = mw.user.sessionId(),
result2 = mw.user.sessionId();
}
exports.config = {
-
- //
- // ======
- //
// ======
// Custom
// ======
// Enables colors for log output.
coloredLogs: true,
//
+ // Warns when a deprecated command is used
+ deprecationWarnings: true,
+ //
+ // If you only want to run your tests until a specific amount of tests have failed use
+ // bail (default is 0 - don't bail, run all tests).
+ bail: 0,
+ //
// Saves a screenshot to a given path if a command fails.
screenshotPath: './log/',
//
- // Set a base URL in order to shorten url command calls. If your url parameter starts
- // with "/", then the base url gets prepended.
+ // Set a base URL in order to shorten url command calls. If your `url` parameter starts
+ // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
+ // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
+ // gets prepended directly.
baseUrl: (
process.env.MW_SERVER === undefined ?
'http://127.0.0.1:8080' :
// WebdriverRTC: https://github.com/webdriverio/webdriverrtc
// Browserevent: https://github.com/webdriverio/browserevent
// plugins: {
- // webdrivercss: {
- // screenshotRoot: 'my-shots',
- // failedComparisonsRoot: 'diffs',
- // misMatchTolerance: 0.05,
- // screenWidth: [320,480,640,1024]
- // },
- // webdriverrtc: {},
- // browserevent: {}
+ // webdrivercss: {
+ // screenshotRoot: 'my-shots',
+ // failedComparisonsRoot: 'diffs',
+ // misMatchTolerance: 0.05,
+ // screenWidth: [320,480,640,1024]
+ // },
+ // webdriverrtc: {},
+ // browserevent: {}
// },
//
// Test runner services
// Make sure you have the wdio adapter package for the specific framework installed
// before running any tests.
framework: 'mocha',
-
+ //
// Test reporter for stdout.
// The only one supported by default is 'dot'
// see also: http://webdriver.io/guide/testrunner/reporters.html
// it and to build services around it. You can either apply a single function or an array of
// methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
// resolved to continue.
- //
- // Gets executed once before all workers get launched.
- // onPrepare: function ( config, capabilities ) {
- // }
- //
- // Gets executed before test execution begins. At this point you can access all global
- // variables, such as `browser`. It is the perfect place to define custom commands.
+ /**
+ * Gets executed once before all workers get launched.
+ * @param {Object} config wdio configuration object
+ * @param {Array.<Object>} capabilities list of capabilities details
+ */
+ // onPrepare: function (config, capabilities) {
+ // },
+ /**
+ * Gets executed just before initialising the webdriver session and test framework. It allows you
+ * to manipulate configurations depending on the capability or spec.
+ * @param {Object} config wdio configuration object
+ * @param {Array.<Object>} capabilities list of capabilities details
+ * @param {Array.<String>} specs List of spec file paths that are to be run
+ */
+ // beforeSession: function (config, capabilities, specs) {
+ // },
+ /**
+ * Gets executed before test execution begins. At this point you can access to all global
+ * variables like `browser`. It is the perfect place to define custom commands.
+ * @param {Array.<Object>} capabilities list of capabilities details
+ * @param {Array.<String>} specs List of spec file paths that are to be run
+ */
// before: function (capabilities, specs) {
// },
- //
- // Hook that gets executed before the suite starts
- // beforeSuite: function (suite) {
+ /**
+ * Runs before a WebdriverIO command gets executed.
+ * @param {String} commandName hook command name
+ * @param {Array} args arguments that command would receive
+ */
+ // beforeCommand: function (commandName, args) {
// },
- //
- // Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
- // beforeEach in Mocha)
- // beforeHook: function () {
+ /**
+ * Hook that gets executed before the suite starts
+ * @param {Object} suite suite details
+ */
+ // beforeSuite: function (suite) {
// },
- //
- // Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
- // afterEach in Mocha)
- //
- // Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+ /**
+ * Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+ * @param {Object} test test details
+ */
// beforeTest: function (test) {
// },
- //
- // Runs before a WebdriverIO command gets executed.
- // beforeCommand: function (commandName, args) {
+ /**
+ * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
+ * beforeEach in Mocha)
+ */
+ // beforeHook: function () {
// },
- //
- // Runs after a WebdriverIO command gets executed
- // afterCommand: function (commandName, args, result, error) {
+ /**
+ * Hook that gets executed _after_ a hook within the suite ends (e.g. runs after calling
+ * afterEach in Mocha)
+ */
+ // afterHook: function () {
// },
- //
- // Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+ /**
+ * Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) ends.
+ * @param {Object} test test details
+ */
// from https://github.com/webdriverio/webdriverio/issues/269#issuecomment-306342170
afterTest: function ( test ) {
var filename, filePath;
console.log( '\n\tScreenshot location:', filePath, '\n' );
}
//
- // Hook that gets executed after the suite has ended
+ /**
+ * Hook that gets executed after the suite has ended
+ * @param {Object} suite suite details
+ */
// afterSuite: function (suite) {
// },
- //
- // Gets executed after all tests are done. You still have access to all global variables from
- // the test.
+ /**
+ * Runs after a WebdriverIO command gets executed
+ * @param {String} commandName hook command name
+ * @param {Array} args arguments that command would receive
+ * @param {Number} result 0 - command success, 1 - command error
+ * @param {Object} error error object if any
+ */
+ // afterCommand: function (commandName, args, result, error) {
+ // },
+ /**
+ * Gets executed after all tests are done. You still have access to all global variables from
+ * the test.
+ * @param {Number} result 0 - test pass, 1 - test fail
+ * @param {Array.<Object>} capabilities list of capabilities details
+ * @param {Array.<String>} specs List of spec file paths that ran
+ */
// after: function (result, capabilities, specs) {
// },
- //
- // Gets executed after all workers got shut down and the process is about to exit. It is not
- // possible to defer the end of the process using a promise.
- // onComplete: function(exitCode) {
+ /**
+ * Gets executed right after terminating the webdriver session.
+ * @param {Object} config wdio configuration object
+ * @param {Array.<Object>} capabilities list of capabilities details
+ * @param {Array.<String>} specs List of spec file paths that ran
+ */
+ // afterSession: function (config, capabilities, specs) {
+ // },
+ /**
+ * Gets executed after all workers got shut down and the process is about to exit.
+ * @param {Object} exitCode 0 - success, 1 - fail
+ * @param {Object} config wdio configuration object
+ * @param {Array.<Object>} capabilities list of capabilities details
+ */
+ // onComplete: function(exitCode, config, capabilities) {
// }
};