{
"extends": "stylelint-config-wikimedia",
"rules": {
- "declaration-no-important": null,
-
"no-descending-specificity": null,
- "selector-no-id": null,
- "selector-pseudo-element-colon-notation": null,
-
- "string-quotes": null,
-
- "value-keyword-case": null
+ "selector-no-id": null
}
}
source 'https://rubygems.org'
-gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.4'
+gem 'mediawiki_selenium', '~> 1.8'
gem 'rake', '~> 11.1', '>= 11.1.1'
gem 'rubocop', '~> 0.32.1', require: false
ast (2.0.0)
astrolabe (1.3.0)
parser (>= 2.2.0.pre.3, < 3.0)
- builder (3.2.2)
- childprocess (0.5.9)
+ builder (3.2.3)
+ childprocess (0.6.2)
ffi (~> 1.0, >= 1.0.11)
cucumber (1.3.20)
builder (>= 2.1.2)
data_magic (1.0)
faker (>= 1.1.2)
yml_reader (>= 0.6)
- diff-lcs (1.2.5)
- domain_name (0.5.20161129)
+ diff-lcs (1.3)
+ domain_name (0.5.20170223)
unf (>= 0.0.5, < 1.0.0)
- faker (1.7.1)
+ faker (1.7.3)
i18n (~> 0.5)
- faraday (0.10.0)
+ faraday (0.11.0)
multipart-post (>= 1.2, < 3)
faraday-cookie_jar (0.0.6)
faraday (>= 0.7.4)
http-cookie (~> 1.0.0)
- faraday_middleware (0.10.1)
+ faraday_middleware (0.11.0.1)
faraday (>= 0.7.4, < 1.0)
- ffi (1.9.14)
+ ffi (1.9.17)
gherkin (2.12.2)
multi_json (~> 1.3)
headless (2.3.1)
http-cookie (1.0.3)
domain_name (~> 0.5)
- i18n (0.7.0)
- json (2.0.2)
- mediawiki_api (0.7.0)
+ i18n (0.8.1)
+ json (2.0.3)
+ mediawiki_api (0.7.1)
faraday (~> 0.9, >= 0.9.0)
faraday-cookie_jar (~> 0.0, >= 0.0.6)
faraday_middleware (~> 0.10, >= 0.10.0)
- mediawiki_selenium (1.7.4)
+ mediawiki_selenium (1.8.0)
cucumber (~> 1.3, >= 1.3.20)
headless (~> 2.0, >= 2.1.0)
json (~> 2.0, >= 2.0.2)
mediawiki_api (~> 0.7, >= 0.7.0)
- page-object (~> 1.0)
+ page-object (~> 2.0)
rest-client (~> 1.6, >= 1.6.7)
rspec-core (~> 2.14, >= 2.14.4)
rspec-expectations (~> 2.14, >= 2.14.4)
- selenium-webdriver (< 3)
+ selenium-webdriver (~> 3.1.0)
syntax (~> 1.2, >= 1.2.0)
thor (~> 0.19, >= 0.19.1)
mime-types (2.99.3)
multipart-post (2.0.0)
net-http-persistent (2.9.4)
netrc (0.11.0)
- page-object (1.2.2)
+ page-object (2.0.0)
net-http-persistent (~> 2.9.4)
page_navigation (>= 0.9)
- selenium-webdriver (>= 2.53.0)
- watir-webdriver (>= 0.6.11, < 0.9.9)
+ selenium-webdriver (~> 3.0)
+ watir (~> 6.0)
page_navigation (0.10)
data_magic (>= 0.22)
parser (2.2.2.6)
rainbow (>= 1.99.1, < 3.0)
ruby-progressbar (~> 1.4)
ruby-progressbar (1.7.5)
- rubyzip (1.2.0)
- selenium-webdriver (2.53.4)
+ rubyzip (1.2.1)
+ selenium-webdriver (3.1.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
websocket (~> 1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.2)
- watir-webdriver (0.9.3)
- selenium-webdriver (>= 2.46.2)
- websocket (1.2.3)
+ watir (6.2.0)
+ selenium-webdriver (~> 3.0)
+ websocket (1.2.4)
yml_reader (0.7)
PLATFORMS
ruby
DEPENDENCIES
- mediawiki_selenium (~> 1.7, >= 1.7.4)
+ mediawiki_selenium (~> 1.8)
rake (~> 11.1, >= 11.1.1)
rubocop (~> 0.32.1)
BUNDLED WITH
- 1.13.7
+ 1.14.5
=== External library changes in 1.29 ===
==== Upgraded external libraries ====
+* Added wikimedia/timestamp v1.0.0.
* Updated QUnit from v1.22.0 to v1.23.1.
* Updated cssjanus from v1.1.2 to 1.1.3.
* Updated psr/log from v1.0.0 to v1.0.2.
* Added action=validatepassword to validate passwords for the account creation
and password change forms.
* action=purge now requires a POST.
+* There is a new `languagevariants` siprop for action=query&meta=siteinfo,
+ which returns a list of languages with active LanguageConverter instances.
=== Action API internal changes in 1.29 ===
* New methods were added to ApiBase to handle errors and warnings using i18n
try {
/* Construct an ApiMain with the arguments passed via the URL. What we get back
* is some form of an ApiMain, possibly even one that produces an error message,
- * but we don't care here, as that is handled by the ctor.
+ * but we don't care here, as that is handled by the constructor.
*/
$processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
'ActiveUsersPager' => __DIR__ . '/includes/specials/pagers/ActiveUsersPager.php',
'ActivityUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/ActivityUpdateJob.php',
'AddRFCAndPMIDInterwiki' => __DIR__ . '/maintenance/addRFCandPMIDInterwiki.php',
+ 'AddSite' => __DIR__ . '/maintenance/addSite.php',
'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
'AllMessagesTablePager' => __DIR__ . '/includes/specials/pagers/AllMessagesTablePager.php',
'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
- 'ConvertibleTimestamp' => __DIR__ . '/includes/libs/time/ConvertibleTimestamp.php',
'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
'CookieJar' => __DIR__ . '/includes/libs/CookieJar.php',
'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
- 'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+ 'FixT22757' => __DIR__ . '/maintenance/storage/fixT22757.php',
'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+ 'InitUserPreference' => __DIR__ . '/maintenance/initUserPreference.php',
'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
'Installer' => __DIR__ . '/includes/installer/Installer.php',
'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php',
'MediaWiki\\Auth\\UsernameAuthenticationRequest' => __DIR__ . '/includes/auth/UsernameAuthenticationRequest.php',
'MediaWiki\\Diff\\ComplexityException' => __DIR__ . '/includes/diff/ComplexityException.php',
'MediaWiki\\Diff\\WordAccumulator' => __DIR__ . '/includes/diff/WordAccumulator.php',
+ 'MediaWiki\\HeaderCallback' => __DIR__ . '/includes/HeaderCallback.php',
'MediaWiki\\Interwiki\\ClassicInterwikiLookup' => __DIR__ . '/includes/interwiki/ClassicInterwikiLookup.php',
'MediaWiki\\Interwiki\\InterwikiLookup' => __DIR__ . '/includes/interwiki/InterwikiLookup.php',
'MediaWiki\\Interwiki\\InterwikiLookupAdapter' => __DIR__ . '/includes/interwiki/InterwikiLookupAdapter.php',
'MovePage' => __DIR__ . '/includes/MovePage.php',
'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
- 'MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
'Protect' => __DIR__ . '/maintenance/protect.php',
'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
'ProtectLogFormatter' => __DIR__ . '/includes/logging/ProtectLogFormatter.php',
- 'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+ 'ProtectedPagesPager' => __DIR__ . '/includes/specials/pagers/ProtectedPagesPager.php',
'ProtectedTitlesPager' => __DIR__ . '/includes/specials/pagers/ProtectedTitlesPager.php',
'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
'ProxyLookup' => __DIR__ . '/includes/ProxyLookup.php',
'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
'PurgeJobUtils' => __DIR__ . '/includes/jobqueue/utils/PurgeJobUtils.php',
'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+ 'PurgeModuleDeps' => __DIR__ . '/maintenance/purgeModuleDeps.php',
'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
- 'TimestampException' => __DIR__ . '/includes/libs/time/TimestampException.php',
'Timing' => __DIR__ . '/includes/libs/Timing.php',
'Title' => __DIR__ . '/includes/Title.php',
'TitleArray' => __DIR__ . '/includes/TitleArray.php',
'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
+ 'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
'Wikimedia\\Rdbms\\LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
'Wikimedia\\Rdbms\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
+ 'Wikimedia\\Rdbms\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
'Wikimedia\\Rdbms\\MySQLField' => __DIR__ . '/includes/libs/rdbms/field/MySQLField.php',
'Wikimedia\\Rdbms\\MySQLMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/MySQLMasterPos.php',
'Wikimedia\\Rdbms\\PostgresBlob' => __DIR__ . '/includes/libs/rdbms/encasing/PostgresBlob.php',
'Wikimedia\\Rdbms\\PostgresField' => __DIR__ . '/includes/libs/rdbms/field/PostgresField.php',
+ 'Wikimedia\\Rdbms\\ResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/ResultWrapper.php',
'Wikimedia\\Rdbms\\SQLiteField' => __DIR__ . '/includes/libs/rdbms/field/SQLiteField.php',
'Wikimedia\\Rdbms\\SessionConsistentConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php',
'Wikimedia\\Rdbms\\TransactionProfiler' => __DIR__ . '/includes/libs/rdbms/TransactionProfiler.php',
"ext-xml": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.19.2",
+ "oojs/oojs-ui": "0.19.4",
"oyejorge/less.php": "1.7.0.10",
"php": ">=5.5.9",
"psr/log": "1.0.2",
"wikimedia/running-stat": "1.1.0",
"wikimedia/scoped-callback": "1.0.0",
"wikimedia/utfnormal": "1.1.0",
+ "wikimedia/timestamp": "1.0.0",
"wikimedia/wait-condition-loop": "1.0.1",
"wikimedia/wrappedstring": "2.2.0",
"zordius/lightncandy": "0.23"
"autoload": {
"psr-0": {
"ComposerHookHandler": "includes/composer"
- }
+ },
+ "files": [
+ "includes/compat/Timestamp.php"
+ ]
},
"autoload-dev": {
"files": [
/** second table. Try to emulate child selector */
table.childemu th,
- table.childemu td {
+ table.childemu td {
border: 1px red solid;
background-color:white;
padding:1em;
$path = "/" . $path;
}
- // Check for bug 28235: QUERY_STRING overriding the correct extension
+ // Check for T30235: QUERY_STRING overriding the correct extension
$whitelist = [];
$extension = FileBackend::extensionFromPath( $path, 'rawcase' );
if ( $extension != '' ) {
}
# Be aware that the != '' check is explicit, since empty values will be
- # passed by some callers (bug 29116)
+ # passed by some callers (T31116)
if ( $vagueTarget != '' ) {
list( $target, $type ) = self::parseTarget( $vagueTarget );
switch ( $type ) {
if ( $end === null ) {
$end = $start;
}
- # Per bug 14634, we want to include relevant active rangeblocks; for
+ # Per T16634, we want to include relevant active rangeblocks; for
# rangeblocks, we want to include larger ranges which enclose the given
# range. We know that all blocks must be smaller than $wgBlockCIDRLimit,
# so we can improve performance by filtering on a LIKE clause
$affected = $dbw->affectedRows();
if ( $this->isAutoblocking() ) {
- // update corresponding autoblock(s) (bug 48813)
+ // update corresponding autoblock(s) (T50813)
$dbw->update(
'ipblocks',
$this->getAutoblockUpdateArray(),
} elseif ( $target === null && $vagueTarget == '' ) {
# We're not going to find anything useful here
# Be aware that the == '' check is explicit, since empty values will be
- # passed by some callers (bug 29116)
+ # passed by some callers (T31116)
return null;
} elseif ( in_array(
* Get all blocks that match any IP from an array of IP addresses
*
* @param array $ipChain List of IPs (strings), usually retrieved from the
- * X-Forwarded-For header of the request
+ * X-Forwarded-For header of the request
* @param bool $isAnon Exclude anonymous-only blocks if false
* @param bool $fromMaster Whether to query the master or replica DB
* @return array Array of Blocks
*
* @param array $blocks Array of Block objects
* @param array $ipChain List of IPs (strings). This is used to determine how "close"
- * a block is to the server, and if a block matches exactly, or is in a range.
- * The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
- * local-squid, ...)
+ * a block is to the server, and if a block matches exactly, or is in a range.
+ * The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+ * local-squid, ...)
* @throws MWException
* @return Block|null The "best" block from the list
*/
$this->mSubcats = $row->cat_subcats;
$this->mFiles = $row->cat_files;
- # (bug 13683) If the count is negative, then 1) it's obviously wrong
+ # (T15683) If the count is negative, then 1) it's obviously wrong
# and should not be kept, and 2) we *probably* don't have to scan many
# rows to obtain the correct figure, so let's risk a one-time recount.
if ( $this->mPages < 0 || $this->mSubcats < 0 || $this->mFiles < 0 ) {
* to reduce disk usage, limits can only be selected from a list.
* The user preference is saved as an array offset in the database, by default
* the offset is set with $wgDefaultUserOptions['imagesize']. Make sure you
- * change it if you alter the array (see bug 8858).
+ * change it if you alter the array (see T10858).
* This is the list of settings the user can choose from:
*/
$wgImageLimits = [
* Default parameters for the "<gallery>" tag
*/
$wgGalleryOptions = [
- 'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
- 'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
- 'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
- 'captionLength' => true, // Deprecated @since 1.28
- // Length to truncate filename to in caption when using "showfilename".
- // A value of 'true' will truncate the filename to one line using CSS
- // and will be the behaviour after deprecation.
- 'showBytes' => true, // Show the filesize in bytes in categories
+ // Default number of images per-row in the gallery. 0 -> Adapt to screensize
+ 'imagesPerRow' => 0,
+ // Width of the cells containing images in galleries (in "px")
+ 'imageWidth' => 120,
+ // Height of the cells containing images in galleries (in "px")
+ 'imageHeight' => 120,
+ // Length to truncate filename to in caption when using "showfilename".
+ // A value of 'true' will truncate the filename to one line using CSS
+ // and will be the behaviour after deprecation.
+ // @deprecated since 1.28
+ 'captionLength' => true,
+ // Show the filesize in bytes in categories
+ 'showBytes' => true,
'mode' => 'traditional',
];
*
* Currently this appears to work fine in all browsers, but it's disabled by
* default because it normalizes id's a bit too aggressively, breaking preexisting
- * content (particularly Cite). See bug 27733, bug 27694, bug 27474.
+ * content (particularly Cite). See T29733, T29694, T29474.
*/
$wgExperimentalHtmlIds = false;
* Attempting to create a redirect to any of the pages in this array
* will make the redirect fail.
* Userlogout is hard-coded, so it does not need to be listed here.
- * (bug 10569) Disallow Mypage and Mytalk as well.
+ * (T12569) Disallow Mypage and Mytalk as well.
*
* As of now, this only checks special pages. Redirects to pages in
* other namespaces cannot be invalidated by this variable.
],
// Linking during login is experimental, enable at your own risk - T134952
// MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
- // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
- // 'sort' => 100,
+ // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
+ // 'sort' => 100,
// ],
MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
'class' => MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
/**
* An array of preferences to not show for the user
*/
-$wgHiddenPrefs = [
- 'rcenhancedfilters',
-];
+$wgHiddenPrefs = [];
/**
* Characters to prevent during new account creations.
/**
* Port where you have HTTPS running
* Supports HTTPS on non-standard ports
- * @see bug 65184
+ * @see T67184
* @since 1.24
*/
$wgHttpsPort = 443;
*/
require_once __DIR__ . '/libs/mime/defines.php';
-require_once __DIR__ . '/libs/time/defines.php';
require_once __DIR__ . '/libs/rdbms/defines.php';
require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
$this->recreate = false;
// When creating a new section, we can preload a section title by passing it as the
- // preloadtitle parameter in the URL (Bug 13100)
+ // preloadtitle parameter in the URL (T15100)
if ( $this->section == 'new' && $request->getVal( 'preloadtitle' ) ) {
$this->sectiontitle = $request->getVal( 'preloadtitle' );
// Once wpSummary isn't being use for setting section titles, we should delete this.
// Don't save a new page if it's blank or if it's a MediaWiki:
// message with content equivalent to default (allow empty pages
- // in this case to disable messages, see bug 50124)
+ // in this case to disable messages, see T52124)
$defaultMessageText = $this->mTitle->getDefaultMessageText();
if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
$defaultText = $defaultMessageText;
}
# Give a notice if the user is editing a deleted/moved page...
if ( !$this->mTitle->exists() ) {
+ $dbr = wfGetDB( DB_REPLICA );
+
LogEventsList::showLogExtract( $wgOut, [ 'delete', 'move' ], $this->mTitle,
'',
[
'lim' => 10,
- 'conds' => [ "log_action != 'revision'" ],
+ 'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
'showIfEmpty' => false,
'msgKey' => [ 'recreate-moveddeleted-warn' ]
]
return;
}
- $this->showHeader();
+ $this->showHeader();
$wgOut->addHTML( $this->editFormPageTop );
if ( $this->hasPresetSummary ) {
// If a summary has been preset using &summary= we don't want to prompt for
// a different summary. Only prompt for a summary if the summary is blanked.
- // (Bug 17416)
+ // (T19416)
$this->autoSumm = md5( '' );
}
}
}
- private function incrementConflictStats() {
+ protected function incrementConflictStats() {
$stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
$stats->increment( 'edit.failures.conflict' );
// Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
}
if ( $oldid ) {
-
- # $diffText = $de->getDiff( wfMessage( 'revisionasof',
- # $wgLang->timeanddate( $timestamp ),
- # $wgLang->date( $timestamp ),
- # $wgLang->time( $timestamp ) )->text(),
- # wfMessage( 'currentrev' )->text() );
-
$diffText = '';
// Don't bother generating the diff if we won't be able to show it
if ( $wgFeedDiffCutoff > 0 ) {
if ( $html === null ) {
- // Omit large new page diffs, bug 29110
+ // Omit large new page diffs, T31110
// Also use diff link for non-textual content
$diffText = self::getDiffLink( $title, $newid );
} else {
/**
* Merge arrays in the style of getUserPermissionsErrors, with duplicate removal
* e.g.
- * wfMergeErrorArrays(
- * [ [ 'x' ] ],
- * [ [ 'x', '2' ] ],
- * [ [ 'x' ] ],
- * [ [ 'y' ] ]
- * );
+ * wfMergeErrorArrays(
+ * [ [ 'x' ] ],
+ * [ [ 'x', '2' ] ],
+ * [ [ 'x' ] ],
+ * [ [ 'y' ] ]
+ * );
* returns:
- * [
- * [ 'x', '2' ],
- * [ 'x' ],
- * [ 'y' ]
- * ]
+ * [
+ * [ 'x', '2' ],
+ * [ 'x' ],
+ * [ 'y' ]
+ * ]
*
* @param array $array1,...
* @return array
$wgOut->sendCacheControl();
}
+ MediaWiki\HeaderCallback::warnIfHeadersSent();
header( 'Content-type: text/html; charset=utf-8' );
print '<!DOCTYPE html>' .
'<html><head><title>' .
* @param string $script MediaWiki cli script path
* @param array $parameters Arguments and options to the script
* @param array $options Associative array of options:
- * 'php': The path to the php executable
- * 'wrapper': Path to a PHP wrapper to handle the maintenance script
+ * 'php': The path to the php executable
+ * 'wrapper': Path to a PHP wrapper to handle the maintenance script
* @return string
*/
function wfShellWikiCmd( $script, array $parameters = [], array $options = [] ) {
--- /dev/null
+<?php
+
+namespace MediaWiki;
+
+class HeaderCallback {
+ private static $headersSentException;
+ private static $messageSent = false;
+
+ /**
+ * Register a callback to be called when headers are sent. There can only
+ * be one of these handlers active, so all relevant actions have to be in
+ * here.
+ */
+ public static function register() {
+ header_register_callback( [ __CLASS__, 'callback' ] );
+ }
+
+ /**
+ * The callback, which is called by the transport
+ */
+ public static function callback() {
+ // Prevent caching of responses with cookies (T127993)
+ $headers = [];
+ foreach ( headers_list() as $header ) {
+ list( $name, $value ) = explode( ':', $header, 2 );
+ $headers[strtolower( trim( $name ) )][] = trim( $value );
+ }
+
+ if ( isset( $headers['set-cookie'] ) ) {
+ $cacheControl = isset( $headers['cache-control'] )
+ ? implode( ', ', $headers['cache-control'] )
+ : '';
+
+ if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i',
+ $cacheControl )
+ ) {
+ header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
+ header( 'Cache-Control: private, max-age=0, s-maxage=0' );
+ \MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
+ 'Cookies set on {url} with Cache-Control "{cache-control}"', [
+ 'url' => \WebRequest::getGlobalRequestURL(),
+ 'cookies' => $headers['set-cookie'],
+ 'cache-control' => $cacheControl ?: '<not set>',
+ ]
+ );
+ }
+ }
+
+ // Save a backtrace for logging in case it turns out that headers were sent prematurely
+ self::$headersSentException = new \Exception( 'Headers already sent from this point' );
+ }
+
+ /**
+ * Log a warning message if headers have already been sent. This can be
+ * called before flushing the output.
+ */
+ public static function warnIfHeadersSent() {
+ if ( headers_sent() && !self::$messageSent ) {
+ self::$messageSent = true;
+ \MWDebug::warning( 'Headers already sent, should send headers earlier than ' .
+ wfGetCaller( 3 ) );
+ $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'headers-sent' );
+ $logger->error( 'Warning: headers were already sent from the location below', [
+ 'exception' => self::$headersSentException,
+ 'detection-trace' => new \Exception( 'Detected here' ),
+ ] );
+ }
+ }
+}
/**
* Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
- * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
+ * the bytes backwards and initialised with 0 instead of 1. See T36428.
*
* @param string $s
* @return string|bool False if the hash extension is not available
* Identical to rawElement(), but HTML-escapes $contents (like
* Xml::element()).
*
- * @param string $element
- * @param array $attribs
+ * @param string $element Name of the element, e.g., 'a'
+ * @param array $attribs Associative array of attributes, e.g., [
+ * 'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+ * further documentation.
* @param string $contents
*
* @return string
* Identical to rawElement(), but has no third parameter and omits the end
* tag (and the self-closing '/' in XML mode for empty elements).
*
- * @param string $element
- * @param array $attribs
+ * @param string $element Name of the element, e.g., 'a'
+ * @param array $attribs Associative array of attributes, e.g., [
+ * 'href' => 'https://www.mediawiki.org/' ]. See expandAttributes() for
+ * further documentation.
*
* @return string
*/
*
* @param array $attribs Associative array of attributes, e.g., [
* 'href' => 'https://www.mediawiki.org/' ]. Values will be HTML-escaped.
- * A value of false means to omit the attribute. For boolean attributes,
+ * A value of false or null means to omit the attribute. For boolean attributes,
* you can omit the key, e.g., [ 'checked' ] instead of
* [ 'checked' => 'checked' ] or such.
*
$attribs['name'] = $name;
if ( substr( $value, 0, 1 ) == "\n" ) {
- // Workaround for bug 12130: browsers eat the initial newline
+ // Workaround for T14130: browsers eat the initial newline
// assuming that it's just for show, but they do keep the later
// newlines, which we may want to preserve during editing.
// Prepending a single newline
# ThumbnailImage::toHtml() already adds page= onto the end of DjVu URLs
# So we don't need to pass it here in $query. However, the URL for the
- # zoom icon still needs it, so we make a unique query for it. See bug 14771
+ # zoom icon still needs it, so we make a unique query for it. See T16771
$url = $title->getLocalURL( $query );
if ( $page ) {
$url = wfAppendQuery( $url, [ 'page' => $page ] );
if ( $altUserName === false ) {
$altUserName = IP::prettifyIP( $userName );
}
- $classes .= ' mw-anonuserlink'; // Separate link class for anons (bug 43179)
+ $classes .= ' mw-anonuserlink'; // Separate link class for anons (T45179)
} else {
$page = Title::makeTitle( NS_USER, $userName );
}
) {
# Sanitize text a bit:
$comment = str_replace( "\n", " ", $comment );
- # Allow HTML entities (for bug 13815)
+ # Allow HTML entities (for T15815)
$comment = Sanitizer::escapeHtmlAllowEntities( $comment );
# Render autocomments and make links:
$section = str_replace( '[[', '', $section );
$section = str_replace( ']]', '', $section );
- $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+ $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # T24784
if ( $local ) {
$sectionTitle = Title::newFromText( '#' . $section );
} else {
} else {
$suffix = '';
}
- # bug 7425
+ # T9425
$target = trim( $target );
# Look at the first character
if ( $target != '' && $target[0] === '/' ) {
if ( $context->getRequest()->getBool( 'bot' ) ) {
$query['bot'] = '1';
- $query['hidediff'] = '1'; // bug 15999
+ $query['hidediff'] = '1'; // T17999
}
$disableRollbackEditCount = false;
* @since 1.20
* @author Tyler Romeo, 2012
*/
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* Library for creating and parsing MW-style timestamps. Based on the JS
* $magicWords = [];
*
* $magicWords['en'] = [
- * 'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
- * 'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
+ * 'magicwordkey' => [ 0, 'case_insensitive_magic_word' ],
+ * 'magicwordkey2' => [ 1, 'CASE_sensitive_magic_word2' ],
* ];
* @endcode
*
# multiple matched parts (variable match); some will be empty because of
# synonyms. The variable will be the second non-empty one so remove any
# blank elements and re-sort the indices.
- # See also bug 6526
+ # See also T8526
$matches = array_values( array_filter( $matches ) );
if ( $request->getCheck( 'search' ) ) {
// Compatibility with old search URLs which didn't use Special:Search
// Just check for presence here, so blank requests still
- // show the search page when using ugly URLs (bug 8054).
+ // show the search page when using ugly URLs (T10054).
$ret = SpecialPage::getTitleFor( 'Search' );
} elseif ( $curid ) {
// URLs like this are generated by RC, because rc_title isn't always accurate
$unused = null; // To pass it by reference
Hooks::run( 'BeforeInitialize', [ &$title, &$unused, &$output, &$user, $request, $this ] );
- // Invalid titles. Bug 21776: The interwikis must redirect even if the page name is empty.
+ // Invalid titles. T23776: The interwikis must redirect even if the page name is empty.
if ( is_null( $title ) || ( $title->getDBkey() == '' && !$title->isExternal() )
|| $title->isSpecial( 'Badtitle' )
) {
? [] // relies on HMAC key signature alone
: $title->getUserPermissionsErrors( 'read', $user );
if ( count( $permErrors ) ) {
- // Bug 32276: allowing the skin to generate output with $wgTitle or
+ // T34276: allowing the skin to generate output with $wgTitle or
// $this->context->title set to the input title would allow anonymous users to
// determine whether a page exists, potentially leaking private data. In fact, the
// curid and oldid request parameters would allow page titles to be enumerated even
try {
$this->main();
} catch ( ErrorPageError $e ) {
- // Bug 62091: while exceptions are convenient to bubble up GUI errors,
+ // T64091: while exceptions are convenient to bubble up GUI errors,
// they are not internal application faults. As with normal requests, this
// should commit, print the output, do deferred updates, jobs, and profiling.
$this->doPreOutputCommit();
*
* @file
*/
+use Wikimedia\Timestamp\TimestampException;
/**
* Handles the backend logic of merging the histories of two
$defaultContentModelChanging = ( $oldDefault !== $newDefault
&& $oldDefault === $contentModel );
- // bug 57084: log_page should be the ID of the *moved* page
+ // T59084: log_page should be the ID of the *moved* page
$oldid = $this->oldTitle->getArticleID();
$logTitle = clone $this->oldTitle;
);
if ( !$redirectContent ) {
- // Clean up the old title *before* reset article id - bug 45348
+ // Clean up the old title *before* reset article id - T47348
WikiPage::onArticleDelete( $this->oldTitle );
}
$this->oldTitle->resetArticleID( 0 ); // 0 == non existing
$nt->resetArticleID( $oldid );
- $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
+ $newpage->loadPageData( WikiPage::READ_LOCKING ); // T48397
$newpage->updateRevisionOn( $dbw, $nullRevision );
# Recreate the redirect, this time in the other direction.
if ( $redirectContent ) {
$redirectArticle = WikiPage::factory( $this->oldTitle );
- $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
+ $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // T48397
$newid = $redirectArticle->insertOn( $dbw );
if ( $newid ) { // sanity
$this->oldTitle->resetArticleID( $newid );
* @file
*/
-# bug 30219 : can not use pathinfo() on URLs since slashes do not match
+# T32219 : can not use pathinfo() on URLs since slashes do not match
$matches = [];
$ext = 'php';
$path = '/';
'epoch' => $config->get( 'CacheEpoch' )
];
if ( $config->get( 'UseSquid' ) ) {
- // bug 44570: the core page itself may not change, but resources might
+ // T46570: the core page itself may not change, but resources might
$modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $config->get( 'SquidMaxage' ) );
}
Hooks::run( 'OutputPageCheckLastModified', [ &$modifiedTimes, $this ] );
ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
);
- // Site-wide styles are controlled by a config setting, see bug 71621
+ // Site-wide styles are controlled by a config setting, see T73621
// for background on why. User styles are never allowed.
if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
$styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
) {
$displayReturnto = null;
- # Due to bug 32276, if a user does not have read permissions,
+ # Due to T34276, if a user does not have read permissions,
# $this->getTitle() will just give Special:Badtitle, which is
# not especially useful as a returnto parameter. Use the title
# from the request instead, if there was one.
$curRevisionId = 0;
$articleId = 0;
- $canonicalSpecialPageName = false; # bug 21115
+ $canonicalSpecialPageName = false; # T23115
$title = $this->getTitle();
$ns = $title->getNamespace();
$sk = $this->getSkin();
// Get the relevant title so that AJAX features can use the correct page name
- // when making API requests from certain special pages (bug 34972).
+ // when making API requests from certain special pages (T36972).
$relevantTitle = $sk->getRelevantTitle();
$relevantUser = $sk->getRelevantUser();
* $wgOut->addWikiText( "<div class='error'>\n"
* . wfMessage( 'some-error' )->plain() . "\n</div>" );
*
- * The newline after the opening div is needed in some wikitext. See bug 19226.
+ * The newline after the opening div is needed in some wikitext. See T21226.
*
* @param string $wrap
*/
* @return $this
*/
function checkRequiredPHPVersion() {
- if ( !function_exists( 'version_compare' )
- || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
+ if (
+ !function_exists( 'version_compare' )
+ || version_compare( $this->getPHPImplVersion(), $this->minimumVersionPHP ) < 0
) {
$shortText = "MediaWiki $this->mwVersion requires at least PHP version"
- . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
+ . " $this->minimumVersionPHP, you are using PHP {$this->getPHPImplVersion()}.";
$longText = "Error: You might be using on older PHP version. \n"
- . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
- . "Check if you have a newer php executable with a different name, "
- . "such as php5.\n\n";
+ . "MediaWiki $this->mwVersion needs PHP $this->minimumVersionPHP or higher.\n\n"
+ . "Check if you have a newer php executable with a different name, "
+ . "such as php5.\n\n";
$longHtml = <<<HTML
Please consider <a href="http://www.php.net/downloads.php">upgrading your copy of PHP</a>.
$shortText = "Installing some external dependencies (e.g. via composer) is required.";
$longText = "Error: You are missing some external dependencies. \n"
- . "MediaWiki now also has some external dependencies that need to be installed\n"
- . "via composer or from a separate git repo. Please see\n"
- . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
- . "for help on installing the required components.";
+ . "MediaWiki now also has some external dependencies that need to be installed\n"
+ . "via composer or from a separate git repo. Please see\n"
+ . "https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries\n"
+ . "for help on installing the required components.";
$longHtml = <<<HTML
MediaWiki now also has some external dependencies that need to be installed via
foreach ( $missingExtensions as $ext ) {
$missingExtText .= " * $ext <$baseUrl/$ext>\n";
$missingExtHtml .= "<li><b>$ext</b> "
- . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
+ . "(<a href=\"$baseUrl/$ext\">more information</a>)</li>";
}
$cliText = "Error: Missing one or more required components of PHP.\n"
- . "You are missing a required extension to PHP that MediaWiki needs.\n"
- . "Please install:\n" . $missingExtText;
+ . "You are missing a required extension to PHP that MediaWiki needs.\n"
+ . "Please install:\n" . $missingExtText;
$longHtml = <<<HTML
You are missing a required extension to PHP that MediaWiki
}
$encLogo =
htmlspecialchars( str_replace( '//', '/', $dirname . '/' ) .
- 'resources/assets/mediawiki.png' );
+ 'resources/assets/mediawiki.png' );
$shortHtml = htmlspecialchars( $shortText );
header( 'Content-type: text/html; charset=UTF-8' );
}
}
- # # Make sure that form fields have their parent set. See bug 41337.
+ # # Make sure that form fields have their parent set. See T43337.
$dummyForm = new HTMLForm( [], $context );
$disable = !$user->isAllowed( 'editmyoptions' );
if ( $dateopts ) {
if ( !in_array( 'default', $dateopts ) ) {
- $dateopts[] = 'default'; // Make sure default is always valid
- // Bug 19237
+ $dateopts[] = 'default'; // Make sure default is always valid T21237
}
// FIXME KLUGE: site default might not be valid for user language
}
}
- # normalize searchKey, so aliases with spaces can be found - bug 25675
+ # normalize searchKey, so aliases with spaces can be found - T27675
$searchKey = str_replace( ' ', '_', $searchKey );
$searchKey = $wgContLang->caseFold( $searchKey );
}
foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
- if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# bug 20885
+ if ( !in_array( $page, SpecialPageFactory::getNames() ) ) {# T22885
continue;
}
$matches = [];
foreach ( $keys as $pageKey => $page ) {
if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
- // bug 27671: Don't use SpecialPage::getTitleFor() here because it
+ // T29671: Don't use SpecialPage::getTitleFor() here because it
// localizes its input leading to searches for e.g. Special:All
// returning Spezial:MediaWiki-Systemnachrichten and returning
// Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
*/
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
/**
* @todo document
// Pre-1.5 ar_text row
$attribs['text'] = self::getRevisionText( $row, 'ar_' );
if ( $attribs['text'] === false ) {
- throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+ throw new MWException( 'Unable to load text from archive row (possibly T24624)' );
}
}
return new self( $attribs );
*
* @param Title $title
* @param int $id
+ * @param int $flags
* @return string|bool False if not found
*/
static function getTimestampFromId( $title, $id, $flags = 0 ) {
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* List for revision table items for a single page
$space = '[\x09\x0a\x0c\x0d\x20]';
self::$attribsRegex =
"/(?:^|$space)({$attribFirst}{$attrib}*)
- ($space*=$space*
+ ($space*=$space*
(?:
- # The attribute value: quoted or alone
- \"([^\"]*)(?:\"|\$)
- | '([^']*)(?:'|\$)
- | (((?!$space|>).)*)
+ # The attribute value: quoted or alone
+ \"([^\"]*)(?:\"|\$)
+ | '([^']*)(?:'|\$)
+ | (((?!$space|>).)*)
)
)?(?=$space|\$)/sx";
}
$badtag = true;
} elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
$badtag = true;
- # Is it a self closed htmlpair ? (bug 5487)
+ # Is it a self closed htmlpair ? (T7487)
} elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
// Eventually we'll just remove the self-closing
// slash, in order to be consistent with HTML5
// Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
$value = preg_replace_callback(
- '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (bug 58088)
+ '/[!-[]-z]/u', // U+FF01 to U+FF5A, excluding U+FF3C (T60088)
function ( $matches ) {
$cp = UtfNormal\Utils::utf8ToCodepoint( $matches[0] );
if ( $cp === false ) {
/**
* Decode any character references, numeric or named entities,
- * in the next and normalize the resulting string. (bug 14952)
+ * in the next and normalize the resulting string. (T16952)
*
* This is useful for page titles, not for text to be displayed,
* MediaWiki allows HTML entities to escape normalization as a feature.
* 3.5.
*
* This function is an implementation of the specification as requested in
- * bug 22449.
+ * T24449.
*
* Client-side forms will use the same standard validation rules via JS or
* HTML 5 validation; additional restrictions can be enforced server-side
// Please note strings below are enclosed in brackets [], this make the
// hyphen "-" a range indicator. Hence it is double backslashed below.
- // See bug 26948
+ // See T28948
$rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
$rfc1034_ldh_str = "a-z0-9\\-";
$wgUseEnotif = $wgEnotifUserTalk || $wgEnotifWatchlist;
} else {
// Disable all other email settings automatically if $wgEnableEmail
- // is set to false. - bug 63678
+ // is set to false. - T65678
$wgAllowHTMLEmail = false;
$wgEmailAuthentication = false; // do not require auth if you're not sending email anyway
$wgEnableUserEmail = false;
// is complete.
define( 'MW_SERVICE_BOOTSTRAP_COMPLETE', 1 );
-// Install a header callback to prevent caching of responses with cookies (T127993)
-if ( !$wgCommandLineMode ) {
- header_register_callback( function () {
- $headers = [];
- foreach ( headers_list() as $header ) {
- list( $name, $value ) = explode( ':', $header, 2 );
- $headers[strtolower( trim( $name ) )][] = trim( $value );
- }
-
- if ( isset( $headers['set-cookie'] ) ) {
- $cacheControl = isset( $headers['cache-control'] )
- ? implode( ', ', $headers['cache-control'] )
- : '';
-
- if ( !preg_match( '/(?:^|,)\s*(?:private|no-cache|no-store)\s*(?:$|,)/i', $cacheControl ) ) {
- header( 'Expires: Thu, 01 Jan 1970 00:00:00 GMT' );
- header( 'Cache-Control: private, max-age=0, s-maxage=0' );
- MediaWiki\Logger\LoggerFactory::getInstance( 'cache-cookies' )->warning(
- 'Cookies set on {url} with Cache-Control "{cache-control}"', [
- 'url' => WebRequest::getGlobalRequestURL(),
- 'cookies' => $headers['set-cookie'],
- 'cache-control' => $cacheControl ?: '<not set>',
- ]
- );
- }
- }
- } );
-}
-
MWExceptionHandler::installHandler();
require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
/**
* @var int Namespace index when there is no namespace. Don't change the
- * following default, NS_MAIN is hardcoded in several places. See bug 696.
+ * following default, NS_MAIN is hardcoded in several places. See T2696.
* Zero except in {{transclusion}} tags.
*/
public $mDefaultNamespace = NS_MAIN;
}
}
- // Convert things like é ā or 〗 into normalized (bug 14952) text
+ // Convert things like é ā or 〗 into normalized (T16952) text
$filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
$t = new Title();
}
$newPageName = preg_replace(
'#^' . preg_quote( $this->getDBkey(), '#' ) . '#',
- StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+ StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
$oldSubpage->getDBkey() );
if ( $oldSubpage->isTalkPage() ) {
$newNs = $nt->getTalkPage()->getNamespace();
} else {
$newNs = $nt->getSubjectPage()->getNamespace();
}
- # Bug 14385: we need makeTitleSafe because the new page names may
+ # T16385: we need makeTitleSafe because the new page names may
# be longer than 255 characters.
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
* categories' names.
*
* @return array Array of parents in the form:
- * $parent => $currentarticle
+ * $parent => $currentarticle
*/
public function getParentCategories() {
global $wgContLang;
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* The TitleArray class only exists to provide the newFromResult method at pre-
* sent.
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
class TitleArrayFromResult extends TitleArray implements Countable {
/** @var ResultWrapper */
public $res;
if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) {
if ( $db->getType() === 'mysql' ) {
// This is an index optimization for mysql
- $conds[] = "rc_timestamp > ''";
+ $conds[] = 'rc_timestamp > ' . $db->addQuotes( '' );
}
}
$conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] );
}
- // Avoid brute force searches (bug 17342)
+ // Avoid brute force searches (T19342)
$bitmask = 0;
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$bitmask = Revision::DELETED_USER;
<?php
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Extension mechanism for WatchedItemQueryService
*
$host = $parts[0];
if ( $wgAssumeProxiesUseDefaultProtocolPorts && isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) ) {
- // Bug 70021: Assume that upstream proxy is running on the default
+ // T72021: Assume that upstream proxy is running on the default
// port based on the protocol. We have no reliable way to determine
// the actual port in use upstream.
$port = $stdPort;
* available variant URLs.
*/
public function interpolateTitle() {
- // bug 16019: title interpolation on API queries is useless and sometimes harmful
+ // T18019: title interpolation on API queries is useless and sometimes harmful
if ( defined( 'MW_API' ) ) {
return;
}
if (
IP::isPublic( $ipchain[$i + 1] ) ||
$wgUsePrivateIPs ||
- $proxyLookup->isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+ $proxyLookup->isConfiguredProxy( $curIP ) // T50919; treat IP as sane
) {
// Follow the next IP according to the proxy
$nextIP = IP::canonicalize( $ipchain[$i + 1] );
* @param null|int $http_response_code Forces the HTTP response code to the specified value.
*/
public function header( $string, $replace = true, $http_response_code = null ) {
- if ( headers_sent() ) {
- MWDebug::warning( 'Headers already sent, should send headers earlier than ' . wfGetCaller() );
- }
+ \MediaWiki\HeaderCallback::warnIfHeadersSent();
if ( $http_response_code ) {
header( $string, $replace, $http_response_code );
} else {
die( 'MediaWiki does not support installations where mbstring.func_overload is non-zero.' );
}
-# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
+# T17461: Make IE8 turn off content sniffing. Everybody else should ignore this
# We're adding it here so that it's *always* set, even for alternate entry
# points and when $wgOut gets disabled or overridden.
header( 'X-Content-Type-Options: nosniff' );
die( 1 );
}
+# Install a header callback
+MediaWiki\HeaderCallback::register();
+
if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
# Use a callback function to configure MediaWiki
call_user_func( MW_CONFIG_CALLBACK );
* Given an array of ('attributename' => 'value'), it generates the code
* to set the XML attributes : attributename="value".
* The values are passed to Sanitizer::encodeAttribute.
- * Return null if no attributes given.
- * @param array $attribs Array of attributes for an XML element
+ * Returns null or empty string if no attributes given.
+ * @param array|null $attribs Array of attributes for an XML element
* @throws MWException
* @return null|string
*/
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
/**
* This class handles printing the history page for an article. In order to
$out->setStatusCode( 404 );
}
$out->addWikiMsg( 'nohistory' );
+
+ $dbr = wfGetDB( DB_REPLICA );
+
# show deletion/move log if there is an entry
LogEventsList::showLogExtract(
$out,
$this->getTitle(),
'',
[ 'lim' => 10,
- 'conds' => [ "log_action != 'revision'" ],
+ 'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
'showIfEmpty' => false,
'msgKey' => [ 'moveddeleted-notice' ]
]
* @return array
*/
public function extractRequestParams( $parseLimit = true ) {
- // Cache parameters, for performance and to avoid bug 24564.
+ // Cache parameters, for performance and to avoid T26564.
if ( !isset( $this->mParamCache[$parseLimit] ) ) {
$params = $this->getFinalParams();
$results = [];
}
if ( !$allowMultiple && count( $valuesList ) != 1 ) {
- // Bug 33482 - Allow entries with | in them for non-multiple values
+ // T35482 - Allow entries with | in them for non-multiple values
if ( in_array( $value, $allowedValues, true ) ) {
return $value;
}
$this->requireOnlyOneParameter( $params, 'user', 'userid' );
- # bug 15810: blocked admins should have limited access here
+ # T17810: blocked admins should have limited access here
if ( $user->isBlocked() ) {
$status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
if ( $status !== true ) {
} else {
$target = User::newFromName( $params['user'] );
- // Bug 38633 - if the target is a user (not an IP address), but it
+ // T40633 - if the target is a user (not an IP address), but it
// doesn't exist or is unusable, error.
if ( $target instanceof User &&
( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) )
$this->getMain()->setCacheMode( 'public' );
if ( !$this->getMain()->getParameter( 'smaxage' ) ) {
- // bug 63249: This page gets hit a lot, cache at least 15 seconds.
+ // T65249: This page gets hit a lot, cache at least 15 seconds.
$this->getMain()->setCacheMaxAge( 15 );
}
$this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
- // Set X-Frame-Options API results (bug 39180)
+ // Set X-Frame-Options API results (T41180)
$apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
if ( $apiFrameOptions ) {
$this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
false, FormatJson::ALL_OK
);
- // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+ // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
// Flash, but what it does isn't friendly for the API, so we need to
// work around it.
if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
$data = $this->getResult()->getResultData( null, $transform );
$json = FormatJson::encode( $data, $this->getIsHtml(), $opt );
- // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+ // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
// Flash, but what it does isn't friendly for the API, so we need to
// work around it.
if ( preg_match( '/\<\s*cross-domain-policy(?=\s|\>)/i', $json ) ) {
if ( isset( $params['callback'] ) ) {
$callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $params['callback'] );
# Prepend a comment to try to avoid attacks against content
- # sniffers, such as bug 68187.
+ # sniffers, such as T70187.
$this->printText( "/**/$callback($json)" );
} else {
$this->printText( $json );
}
$text = serialize( $this->getResult()->getResultData( null, $transforms ) );
- // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+ // T68776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
// Flash, but what it does isn't friendly for the API. There's nothing
// we can do here that isn't actively broken in some manner, so let's
// just be broken in a useful manner.
case 'Aborted':
$result['reason'] = 'Authentication requires user interaction, ' .
- 'which is not supported by action=login.';
+ 'which is not supported by action=login.';
if ( $this->getConfig()->get( 'EnableBotPasswords' ) ) {
$result['reason'] .= ' To be able to login with action=login, see [[Special:BotPasswords]].';
$result['reason'] .= ' To continue using main-account login, see action=clientlogin.';
*/
use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Timestamp\TimestampException;
/**
* This is the main API class, used for both external and internal processing.
* @param Exception $e
*/
protected function handleException( Exception $e ) {
- // Bug 63145: Rollback any open database transactions
+ // T65145: Rollback any open database transactions
if ( !( $e instanceof ApiUsageException || $e instanceof UsageException ) ) {
// UsageExceptions are intentional, so don't rollback if that's the case
try {
$ret = $this->getRequest()->getVal( $name );
if ( $ret === null ) {
if ( $this->getRequest()->getArray( $name ) !== null ) {
- // See bug 10262 for why we don't just implode( '|', ... ) the
+ // See T12262 for why we don't just implode( '|', ... ) the
// array.
$this->addWarning( [ 'apiwarn-unsupportedarray', $name ] );
}
// a redirect to the new title. This is not safe, but what we did before was
// even worse: we just determined whether a redirect should have been created,
// and reported that it was created if it should have, without any checks.
- // Also note that isRedirect() is unreliable because of bug 37209.
+ // Also note that isRedirect() is unreliable because of T39209.
$r['redirectcreated'] = $fromTitle->exists();
$r['moveoverredirect'] = $toTitleExists;
* @file
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* This class contains a list of pages that the client has requested.
private $mMissingPageIDs = [];
private $mRedirectTitles = [];
private $mSpecialTitles = [];
+ private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
private $mNormalizedTitles = [];
private $mInterwikiTitles = [];
/** @var Title[] */
* @return LinkBatch
*/
private function getRedirectTargets() {
- $lb = new LinkBatch();
+ $titlesToResolve = [];
$db = $this->getDB();
$res = $db->select(
unset( $this->mPendingRedirectIDs[$rdfrom] );
if ( $to->isExternal() ) {
$this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
- } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
- $lb->add( $row->rd_namespace, $row->rd_title );
+ } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+ $titlesToResolve[] = $to;
}
$this->mRedirectTitles[$from] = $to;
}
// What the hell. Let's just ignore this
continue;
}
- $lb->addObj( $rt );
+ if ( $rt->isExternal() ) {
+ $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+ } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+ $titlesToResolve[] = $rt;
+ }
$from = $title->getPrefixedText();
$this->mResolvedRedirectTitles[$from] = $title;
$this->mRedirectTitles[$from] = $rt;
}
}
- return $lb;
+ return $this->processTitlesArray( $titlesToResolve );
}
/**
$titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
} catch ( MalformedTitleException $ex ) {
// Handle invalid titles gracefully
- $this->mAllPages[0][$title] = $this->mFakePageId;
- $this->mInvalidTitles[$this->mFakePageId] = [
- 'title' => $title,
- 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
- ];
- $this->mFakePageId--;
+ if ( !isset( $this->mAllPages[0][$title] ) ) {
+ $this->mAllPages[0][$title] = $this->mFakePageId;
+ $this->mInvalidTitles[$this->mFakePageId] = [
+ 'title' => $title,
+ 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+ ];
+ $this->mFakePageId--;
+ }
continue; // There's nothing else we can do
}
} else {
if ( $titleObj->getNamespace() < 0 ) {
// Handle Special and Media pages
$titleObj = $titleObj->fixSpecialName();
- $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
- $this->mFakePageId--;
+ $ns = $titleObj->getNamespace();
+ $dbkey = $titleObj->getDBkey();
+ if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+ $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+ $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+ $this->mFakePageId--;
+ }
} else {
// Regular page
$linkBatch->addObj( $titleObj );
* @return array
*/
private static function getPositiveIntegers( $array ) {
- // bug 25734 API: possible issue with revids validation
+ // T27734 API: possible issue with revids validation
// It seems with a load of revision rows, MySQL gets upset
// Remove any < 0 integers, as they can't be valid
foreach ( $array as $i => $int ) {
}
if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
// (shouldn't be able to get here without 'deletedhistory', but
// check it again just in case)
if ( !$user->isAllowed( 'deletedhistory' ) ) {
}
if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
$bitmask = Revision::DELETED_USER;
} elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
],
] ] );
- // Actually count the actions using a subquery (bug 64505 and bug 64507)
+ // Actually count the actions using a subquery (T66505 and T66507)
$timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $activeUserSeconds );
$this->addFields( [
'recentactions' => '(' . $db->selectSQLText(
if ( $this->params['filterredir'] == 'redirects' ) {
$this->addWhereFld( 'page_is_redirect', 1 );
} elseif ( $this->params['filterredir'] == 'nonredirects' && !$this->redirect ) {
- // bug 22245 - Check for !redirect, as filtering nonredirects, when
+ // T24245 - Check for !redirect, as filtering nonredirects, when
// getting what links to them is contradictory
$this->addWhereFld( 'page_is_redirect', 0 );
}
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* This is a base class for all Query modules.
* It provides some common functionality such as constructing various SQL
}
if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
// (shouldn't be able to get here without 'deletedhistory', but
// check it again just in case)
if ( !$user->isAllowed( 'deletedhistory' ) ) {
}
if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
// (shouldn't be able to get here without 'deletedhistory', but
// check it again just in case)
if ( !$user->isAllowed( 'deletedhistory' ) ) {
if ( $mto && !$mto->isError() ) {
$vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
- // bug 23834 - If the URL's are the same, we haven't resized it, so shouldn't give the wanted
+ // T25834 - If the URLs are the same, we haven't resized it, so shouldn't give the wanted
// thumbnail sizes for the thumbnail actual size
if ( $mto->getUrl() !== $file->getUrl() ) {
$vals['thumbwidth'] = intval( $mto->getWidth() );
$this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
}
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
if ( $params['namespace'] !== null || !is_null( $title ) || !is_null( $user ) ) {
if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
$titleBits = LogPage::DELETED_ACTION;
/* Build our basic query. Namely, something along the lines of:
* SELECT * FROM recentchanges WHERE rc_timestamp > $start
- * AND rc_timestamp < $end AND rc_namespace = $namespace
+ * AND rc_timestamp < $end AND rc_namespace = $namespace
*/
$this->addTables( 'recentchanges' );
$this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
$this->addWhereFld( 'ct_tag', $params['tag'] );
}
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$bitmask = Revision::DELETED_USER;
}
}
if ( $params['user'] !== null || $params['excludeuser'] !== null ) {
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
if ( !$this->getUser()->isAllowed( 'deletedhistory' ) ) {
$bitmask = Revision::DELETED_USER;
} elseif ( !$this->getUser()->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
case 'languages':
$fit = $this->appendLanguages( $p );
break;
+ case 'languagevariants':
+ $fit = $this->appendLanguageVariants( $p );
+ break;
case 'skins':
$fit = $this->appendSkins( $p );
break;
return $this->getResult()->addValue( 'query', $property, $data );
}
+ // Export information about which page languages will trigger
+ // language conversion. (T153341)
+ public function appendLanguageVariants( $property ) {
+ $langNames = LanguageConverter::$languagesWithVariants;
+ if ( $this->getConfig()->get( 'DisableLangConversion' ) ) {
+ // Ensure result is empty if language conversion is disabled.
+ $langNames = [];
+ }
+ sort( $langNames );
+
+ $data = [];
+ foreach ( $langNames as $langCode ) {
+ $lang = Language::factory( $langCode );
+ if ( $lang->getConverter() instanceof FakeConverter ) {
+ // Only languages which do not return instances of
+ // FakeConverter implement language conversion.
+ continue;
+ }
+ $data[$langCode] = [];
+ ApiResult::setIndexedTagName( $data[$langCode], 'variant' );
+ ApiResult::setArrayType( $data[$langCode], 'kvp', 'code' );
+
+ $variants = $lang->getVariants();
+ sort( $variants );
+ foreach ( $variants as $v ) {
+ $fallbacks = $lang->getConverter()->getVariantFallbacks( $v );
+ if ( !is_array( $fallbacks ) ) {
+ $fallbacks = [ $fallbacks ];
+ }
+ $data[$langCode][$v] = [
+ 'fallbacks' => $fallbacks,
+ ];
+ ApiResult::setIndexedTagName(
+ $data[$langCode][$v]['fallbacks'], 'variant'
+ );
+ }
+ }
+ ApiResult::setIndexedTagName( $data, 'lang' );
+ ApiResult::setArrayType( $data, 'kvp', 'code' );
+
+ return $this->getResult()->addValue( 'query', $property, $data );
+ }
+
public function appendSkins( $property ) {
$data = [];
$allowed = Skin::getAllowedSkins();
}
public function appendProtocols( $property ) {
- // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+ // Make a copy of the global so we don't try to set the _element key of it - T47130
$protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
ApiResult::setArrayType( $protocols, 'BCarray' );
ApiResult::setIndexedTagName( $protocols, 'p' );
'rightsinfo',
'restrictions',
'languages',
+ 'languagevariants',
'skins',
'extensiontags',
'functionhooks',
}
}
if ( is_array( $value ) ) {
- // Work around PHP bug 45959 by copying to a temporary
+ // Work around https://bugs.php.net/bug.php?id=45959 by copying to a temporary
// (in this case, foreach gets $k === "1" but $tmp[$k] assigns as if $k === 1)
$tmp = [];
foreach ( $value as $k => $v ) {
if ( !$user->isAllowed( 'block' ) ) {
$this->dieWithError( 'apierror-permissiondenied-unblock', 'permissiondenied' );
}
- # bug 15810: blocked admins should have limited access here
+ # T17810: blocked admins should have limited access here
if ( $user->isBlocked() ) {
$status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
if ( $status !== true ) {
"apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
"apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
"api-format-title": "MediaWiki-API-Ergebnis",
- "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+ "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
"api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.",
"api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
"api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
"apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
"apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
"apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
+ "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
"apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
"apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
"apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
"apierror-invalidexpiry": "Invalid expiry time \"$1\".",
"apierror-invalid-file-key": "Not a valid file key.",
"apierror-invalidlang": "Invalid language code for parameter <var>$1</var>.",
- "apierror-invalidoldimage": "The oldimage parameter has invalid format.",
+ "apierror-invalidoldimage": "The <var>oldimage</var> parameter has an invalid format.",
"apierror-invalidparammix-cannotusewith": "The <kbd>$1</kbd> parameter cannot be used with <kbd>$2</kbd>.",
"apierror-invalidparammix-mustusewith": "The <kbd>$1</kbd> parameter may only be used with <kbd>$2</kbd>.",
"apierror-invalidparammix-parse-new-section": "<kbd>section=new</kbd> cannot be combined with the <var>oldid</var>, <var>pageid</var> or <var>page</var> parameters. Please use <var>title</var> and <var>text</var>.",
"apierror-invalidparammix": "The {{PLURAL:$2|parameters}} $1 can not be used together.",
- "apierror-invalidsection": "The section parameter must be a valid section ID or <kbd>new</kbd>.",
+ "apierror-invalidsection": "The <var>section</var> parameter must be a valid section ID or <kbd>new</kbd>.",
"apierror-invalidsha1base36hash": "The SHA1Base36 hash provided is not valid.",
"apierror-invalidsha1hash": "The SHA1 hash provided is not valid.",
"apierror-invalidtitle": "Bad title \"$1\".",
"apiwarn-redirectsandrevids": "Redirect resolution cannot be used together with the <var>revids</var> parameter. Any redirects the <var>revids</var> point to have not been resolved.",
"apiwarn-tokennotallowed": "Action \"$1\" is not allowed for the current user.",
"apiwarn-tokens-origin": "Tokens may not be obtained when the same-origin policy is not applied.",
- "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>: the limit is $2.",
+ "apiwarn-toomanyvalues": "Too many values supplied for parameter <var>$1</var>. The limit is $2.",
"apiwarn-truncatedresult": "This result was truncated because it would otherwise be larger than the limit of $1 bytes.",
"apiwarn-unclearnowtimestamp": "Passing \"$2\" for timestamp parameter <var>$1</var> has been deprecated. If for some reason you need to explicitly specify the current time without calculating it client-side, use <kbd>now</kbd>.",
"apiwarn-unrecognizedvalues": "Unrecognized {{PLURAL:$3|value|values}} for parameter <var>$1</var>: $2.",
"apihelp-query+recentchanges-param-limit": "Cuántos cambios en total se devolverán.",
"apihelp-query+recentchanges-param-type": "Cuántos tipos de cambios se mostrarán.",
"apihelp-query+recentchanges-param-toponly": "Enumerar solo las modificaciones que sean las últimas revisiones.",
+ "apihelp-query+recentchanges-param-generaterevisions": "Cuando se utilice como generador, genera identificadores de revisión en lugar de títulos. Las entradas en la lista de cambios recientes que no tengan identificador de revisión asociado (por ejemplo, la mayoría de las entradas de registro) no generarán nada.",
"apihelp-query+recentchanges-example-simple": "Lista de cambios recientes.",
"apihelp-query+recentchanges-example-generator": "Obtener información de página de cambios recientes no patrullados.",
"apihelp-query+redirects-description": "Devuelve todas las redirecciones a las páginas dadas.",
"apihelp-xmlfm-description": "Producir los datos de salida en formato XML (con resaltado sintáctico en HTML).",
"api-format-title": "Resultado de la API de MediaWiki",
"api-format-prettyprint-header": "Esta es la representación en HTML del formato $1. HTML es adecuado para realizar tareas de depuración, pero no para utilizarlo en aplicaciones.\n\nUtiliza el parámetro <var>format</var> para modificar el formato de salida. Para ver la representación no HTML del formato $1, emplea <kbd>format=$2</kbd>.\n\nPara obtener más información, consulta la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|ayuda de API]].",
+ "api-format-prettyprint-header-only-html": "Esta es una representación en HTML destinada a la depuración, y no es adecuada para el uso de la aplicación.\n\nVéase la [[mw:API|documentación completa]] o la [[Special:ApiHelp/main|página de ayuda de la API]] para más información.",
"api-format-prettyprint-status": "Esta respuesta se devolvería con el estado HTTP $1 $2.",
"api-pageset-param-titles": "Una lista de títulos en los que trabajar.",
"api-pageset-param-pageids": "Una lista de identificadores de páginas en las que trabajar.",
"api-pageset-param-generator": "Obtener la lista de páginas en las que trabajar mediante la ejecución del módulo de consulta especificado.\n\n<strong>Nota:</strong> Los nombres de los parámetros del generador deben prefijarse con una «g», véanse los ejemplos.",
"api-pageset-param-redirects-generator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var>, y <var>$1revids</var> y en las páginas devueltas por <var>$1generator</var>.",
"api-pageset-param-redirects-nogenerator": "Resolver automáticamente las redirecciones en <var>$1titles</var>, <var>$1pageids</var> y <var>$1revids</var>.",
+ "api-pageset-param-converttitles": "Convertir los títulos a otras variantes, si es necesario. Solo funciona si el idioma del contenido del wiki admite la conversión entre variantes. La conversión entre variantes está habilitada en idiomas tales como $1.",
"api-help-title": "Ayuda de la API de MediaWiki",
"api-help-lead": "Esta es una página de documentación autogenerada de la API de MediaWiki.\n\nDocumentación y ejemplos: https://www.mediawiki.org/wiki/API",
"api-help-main-header": "Módulo principal",
"apierror-changeauth-norequest": "No se ha podido crear la petición de modificación.",
"apierror-compare-inputneeded": "Se necesita un título, un identificador de página o un número de revisión tanto para el parámetro <var>from</var> como para el parámetro <var>to</var>.",
"apierror-contentserializationexception": "La serialización de contenido falló: $1",
+ "apierror-contenttoobig": "El contenido que has suministrado supera el tamaño máximo de archivo de $1 {{PLURAL:$1|kilobytes|kilobytes}}.",
"apierror-create-titleexists": "Los títulos existentes no se pueden proteger con <kbd>create</kbd>.",
"apierror-csp-report": "Error de procesamiento del informe CSP: $1.",
"apierror-databaseerror": "[$1] Error en la consulta de la base de datos.",
"apihelp-query-param-exportnowrap": "Renvoyer le XML exporté sans l’inclure dans un résultat XML (même format que [[Special:Export]]). Utilisable uniquement avec $1export.",
"apihelp-query-param-iwurl": "S’il faut obtenir l’URL complète si le titre est un lien interwiki.",
"apihelp-query-param-rawcontinue": "Renvoyer les données <samp>query-continue</samp> brutes pour continuer.",
- "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Page principale</kbd>.",
+ "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Main Page</kbd>.",
"apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par <kbd>API/</kbd>.",
"apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
"apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
"apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
"apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
"apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
- "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
+ "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec le contenu (mode 1).",
"apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
"apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
"apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
"apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Ajoute la profondeur de bits de la version.",
"apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
"apihelp-query+imageinfo-paramvalue-prop-badfile": "Ajoute l'indication que le fichier est sur [[MediaWiki:Bad image list]]",
- "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
+ "apihelp-query+imageinfo-param-limit": "Combien de révisions de fichier renvoyer par fichier.",
"apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
"apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
"apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
"apihelp-query+imageinfo-param-extmetadatalanguage": "Quelle langue pour analyser extmetadata. Cela affecte à la fois quelle traduction analyser, s’il y en a plusieurs, et comment les choses comme les nombres et d’autres valeurs sont mises en forme.",
"apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
"apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
- "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
+ "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètres spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser <kbd>page15-100px</kbd>. <var>$1urlwidth</var> doit être utilisé et être cohérent avec <var>$1urlparam</var>.",
"apihelp-query+imageinfo-param-badfilecontexttitle": "Si <kbd>$2prop=badfile</kbd> est positionné, il s'agit du titre de la page utilisé pour évaluer la [[MediaWiki:Bad image list]]",
"apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
"apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]].",
"apihelp-query+info-param-testactions": "Tester si l’utilisateur actuel peut effectuer certaines actions sur la page.",
"apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
"apihelp-query+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
- "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur la page <kbd>Main Page</kbd>.",
- "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
+ "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page <kbd>Main Page</kbd>.",
+ "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».",
"apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
"apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1blprefix</var>.",
"apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
"apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ajoute le préfixe de l’interwiki.",
"apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ajoute le titre de l’interwiki.",
"apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
- "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
- "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+ "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages qui ont un lien vers [[wikibooks:Test]].",
+ "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages qui ont un lien vers [[wikibooks:Test]].",
"apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
- "apihelp-query+iwlinks-param-url": "S&il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
+ "apihelp-query+iwlinks-param-url": "S'il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
"apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
"apihelp-query+iwlinks-paramvalue-prop-url": "Ajoute l’URL complète.",
"apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
"apihelp-query+langbacklinks-paramvalue-prop-lllang": "Ajoute le code de langue du lien de langue.",
"apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Ajoute le titre du lien de langue.",
"apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
- "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[:fr:Test]]",
- "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
+ "apihelp-query+langbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[:fr:Test]].",
+ "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]].",
"apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
"apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
"apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec <var>$1prop</var>).",
"apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
"apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
"apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
- "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte",
+ "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte.",
"apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
"apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
"apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
"apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.",
- "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
+ "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de noms.",
"apihelp-query+search-param-what": "Quel type de recherche effectuer.",
"apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
"apihelp-query+search-param-prop": "Quelles propriétés renvoyer :",
"apiwarn-redirectsandrevids": "La résolution de la redirection ne peut pas être utilisée avec le paramètre <var>revids</var>. Toutes les redirections vers lesquelles pointent <var>revids</var> n’ont pas été résolues.",
"apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
"apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
- "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>: la limite est $2.",
+ "apiwarn-toomanyvalues": "Trop de valeurs fournies pour le paramètre <var>$1</var>. La limite est $2.",
"apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
"apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now</kbd>.",
"apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre <var>$1</var> : $2.",
"Macofe",
"MojoMann",
"Mikey641",
- "Esh77"
+ "Esh77",
+ "שמזן"
]
},
"apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|תיעוד]]\n* [[mw:API:FAQ|שו\"ת]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api רשימת דיוור]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce הודעות על API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R באגים ובקשות]\n</div>\n<strong>מצב:</strong> כל האפשרויות שמוצגות בדף הזה אמורות לעבוד, אבל ה־API עדיין בפיתוח פעיל, ויכול להשתנות בכל זמן. עשו מינוי ל[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ רשימת הדיוור mediawiki-api-announce] להודעות על עדכונים.\n\n<strong>בקשות שגויות:</strong> כשבקשות שגויות נשלחות ל־API, תישלח כותרת HTTP עם המפתח \"MediaWiki-API-Error\" ואז גם הערך של הכותרת וגם קוד השגיאה יוגדרו לאותו ערך. למידע נוסף ר' [[mw:API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
"apihelp-setpagelanguage-description": "שנה את השפה של דף",
"apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
"apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1pageid</var>.",
+ "apihelp-setpagelanguage-param-pageid": "מזהה הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1title</var>.",
+ "apihelp-setpagelanguage-param-lang": "קוד השפה של השפה שאליה צריך לשנות את הדף. יש להשתמש ב־<kbd>default</kbd> כדי לאתחל את הדף לשפת בררת המחדל של הוויקי.",
"apihelp-setpagelanguage-param-reason": "הסיבה לשינוי.",
"apihelp-setpagelanguage-param-tags": "אילו תגי שינוי להחיל על העיול ביומן שמתבצע כתוצאה מהפעולה הזאת.",
"apihelp-setpagelanguage-example-language": "שינוי השפה של <kbd>Main Page</kbd> לבסקית.",
"apihelp-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.",
"apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.",
"apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.",
- "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94×\97ת×\99×\9b×\94 ×\91×\91×\99×\99×\98ים.",
+ "apihelp-upload-param-offset": "×\94×\99ס×\98 ×\94פ×\9c×\97 ×\91×\91תים.",
"apihelp-upload-param-chunk": "תוכן החתיכה.",
"apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.",
"apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.",
"apihelp-userrights-param-user": "שם משתמש.",
"apihelp-userrights-param-userid": "מזהה משתמש.",
"apihelp-userrights-param-add": "הוספת המשתמש לקבוצות האלו, ואם הוא כבר חבר, עדכון זמן התפוגה של החברות בקבוצה הזאת.",
+ "apihelp-userrights-param-expiry": "חותמי־זמן תפוגה. יכולים להיות יחסיים (למשל <kbd>5 months</kbd> או <kbd>2 weeks</kbd>) או מוחלטים (למשל <kbd>2014-09-18T12:34:56Z</kbd>). אם מוגדר רק חותם־זמן אחד, הוא ישמש לכל הקבוצות שהועברו לפרמטר <var>$1add</var>. יש להשתמש ב־<kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, או <kbd>never</kbd> בשביל קבוצת משתמשים שאינה פגה לעולם.",
"apihelp-userrights-param-remove": "הסרת משתמש מהקבוצות האלו.",
"apihelp-userrights-param-reason": "סיבה לשינוי.",
"apihelp-userrights-param-tags": "לשנות את התגים שיוחלו על העיול ביומן הרשאות המשתמש.",
"apihelp-userrights-example-user": "הוספת המשתמש <kbd>FooBot</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
"apihelp-userrights-example-userid": "הוספת המשתמש עם המזהה <kbd>123</kbd> לקבוצה <kbd>bot</kbd> והסרתו מהקבוצות <kbd>sysop</kbd> ו־<kbd>bureaucrat</kbd>.",
+ "apihelp-userrights-example-expiry": "להוסיף את <kbd>SometimeSysop</kbd> לקבוצה <kbd>sysop</kbd> לחודש אחד.",
"apihelp-validatepassword-description": "לבדוק תקינות ססמה אל מול מדיניות הססמאות של הוויקי.\n\nהתקינות מדווחת כ־<samp>Good</samp> אם הססמה קבילה, <samp>Change</samp> אם הססמה יכולה לשמש לכניסה, אבל צריכה להשתנות, או <samp>Invalid</samp> אם הססמה אינה שמישה.",
"apihelp-validatepassword-param-password": "ססמה שתקינותה תיבדק.",
"apihelp-validatepassword-param-user": "שם משתמש, לשימוש בעת בדיקת יצירת חשבון. המשתמש ששמו ניתן צריך לא להיות קיים.",
"apierror-blockedfrommail": "נחסמת משליחת דוא״ל.",
"apierror-blocked": "נחסמת מעריכה.",
"apierror-botsnotsupported": "הממשק הזה לא נתמך עבור בוטים.",
+ "apierror-cannot-async-upload-file": "הפרמטרים <var>async</var> ו־<var>file</var> אינם יכולים להיות משולבים. אם ברצונך לבצע עיבוד אסינכרוני של הקובץ המועלה שלך, יש להעלות אותו תחילה לסליק (באמצעות הפרמטר <var>stash</var>) ואז לפרסם את הקובץ המוסלק באופן אסינכרוני (באמצעות <var>filekey</var> ו־<var>async</var>).",
"apierror-cannotreauthenticate": "הפעולה הזאת אינה זמינה, כי הזהות שלך לא יכולה להיות מאומתת.",
"apierror-cannotviewtitle": "אין לך הרשאה להציג את $1.",
"apierror-cantblock-email": "אין לך הרשאה לחסום משתמשים משליחת דואר אלקטרוני דרך הוויקי.",
"apierror-integeroutofrange-abovemax": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3) עבור משתמשים.",
"apierror-integeroutofrange-belowminimum": "<var>$1</var> אינו יכול להיות גדול מ־$2 (עכשיו מוגדר $3).",
"apierror-invalidcategory": "שם הקטגוריה שהזנת אינו תקין.",
+ "apierror-invalid-chunk": "ההיסט בתוספת הפלח הנוכחי גדולים מגודל הקובץ כפי שנטען.",
"apierror-invalidexpiry": "זמן תפוגה בלתי־תקין \"$1\".",
"apierror-invalid-file-key": "לא מפתח קובץ תקין.",
+ "apierror-invalidlang": "קוד שפה בלתי־תקין לפרמטר <var>$1</var>.",
+ "apierror-invalidoldimage": "הפרמטר oldimage נשלח בתסדיר בלתי־תקין.",
+ "apierror-invalidparammix-cannotusewith": "הפרמטר <kbd>$1</kbd> אינו יכול לשמש עם <kbd>$2</kbd>.",
+ "apierror-invalidparammix-mustusewith": "הפרמטר <kbd>$1</kbd> יכול לשמש רק עם <kbd>$2</kbd>.",
+ "apierror-invalidparammix-parse-new-section": "לא ניתן לשלב את <kbd>section=new</kbd> עם הפרמטרים <var>oldid</var>, <var>pageid</var> או <var>page</var>. נא להשתמש ב־<var>title</var> ו־<var>text</var>.",
+ "apierror-invalidparammix": "{{PLURAL:$2|הפרמטרים}} $1 אינם יכולים לשמש יחדיו.",
+ "apierror-invalidsection": "הפרמטר section חייב להיות מזהה מקטע תקין או <kbd>new</kbd>.",
+ "apierror-invalidsha1base36hash": "גיבוב ה־SHA1Base36 שסופק אינו תקין.",
+ "apierror-invalidsha1hash": "גיבוב ה־SHA1 שסופק אינו תקין.",
"apierror-invalidtitle": "כותרת רעה \"$1\".",
+ "apierror-invalidurlparam": "ערך בלתי־תקין עבור <var>$1urlparam</var> (ערך: <kbd>$2=$3</kbd>).",
"apierror-invaliduser": "שם משתמש בלתי־תקין \"$1\".",
+ "apierror-invaliduserid": "מזהה המשתמש <var>$1</var> אינו תקין.",
+ "apierror-maxlag-generic": "ממתין לשרת מסד נתונים: עיכוב של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
"apierror-maxlag": "ממתין ל־$2: שיהוי של {{PLURAL:$1|שנייה אחת|$1 שניות}}.",
+ "apierror-mimesearchdisabled": "חיפוש MIME כבוי במצב קמצן.",
+ "apierror-missingcontent-pageid": "תוכן חסר עבור מזהה הדף $1.",
+ "apierror-missingparam-at-least-one-of": "דרוש {{PLURAL:$2|הפרמטר|לפחות אחד מהפרמטרים}} $1.",
+ "apierror-missingparam-one-of": "דרוש {{PLURAL:$2|הפרמטר|אחד מהפרמטרים}} $1.",
+ "apierror-missingparam": "הפרמטר <var>$1</var> צריך להיות מוגדר.",
+ "apierror-missingrev-pageid": "אין גרסה נוכחית של דף עם המזהה $1.",
+ "apierror-missingtitle-createonly": "כותרות חסרות יכולות להיות מוגנות עם <kbd>create</kbd>.",
+ "apierror-missingtitle": "הדף שנתת אינו קיים.",
+ "apierror-missingtitle-byname": "הדף $1 אינו קיים.",
+ "apierror-moduledisabled": "המודול <kbd>$1</kbd> כובה.",
+ "apierror-multival-only-one-of": "{{PLURAL:$3|רק הערך|רק אחד מתוך הערכים}} $2 מותר עבור הפרמטר <var>$1</var>.",
+ "apierror-multival-only-one": "רק ערך אחד מותר עבור הפרמטר <var>$1</var>.",
+ "apierror-multpages": "<var>$1</var> יכול לשמש רק בדף בודד.",
+ "apierror-mustbeloggedin-changeauth": "יש להיכנס לחשבון כדי לשנות נתוני אימות.",
"apierror-mustbeloggedin-generic": "חובה להיכנס.",
"apierror-mustbeloggedin-linkaccounts": "חובה להיכנס לחשבון כדי לקשר חשבונות.",
"apierror-mustbeloggedin-removeauth": "חובה להיכנס לחשבון כדי להסיר מידע אימות.",
"apierror-mustbeloggedin-uploadstash": "סליק ההעלאה זמין רק למשתמשים שנכנסו לחשבון.",
"apierror-mustbeloggedin": "חובה להיכנס לחשבון כדי $1.",
+ "apierror-mustbeposted": "המודול <kbd>$1</kbd> דורש בקשת POST.",
+ "apierror-mustpostparams": "{{PLURAL:$2|הפרמטר הבא|הפרמטרים הבאים}} נמצאו במחרוזת השאילתה, אבל חייבים להיות ב־POST בגוף: $1.",
+ "apierror-noapiwrite": "עריכת הוויקי הזה דרך ה־API כובתה. נא לוודא שהמשפט <code dir=\"ltr\">$wgEnableWriteAPI=true;</code> כלול בקובץ <code>LocalSettings.php</code> של הוויקי.",
"apierror-nochanges": "לא התבקשו שינויים.",
"apierror-nodeleteablefile": "אין גרסה ישנה כזאת של הקובץ.",
"apierror-no-direct-editing": "עריכה ישירה דרך ה־API אינה נתמכת עבור דגם התוכן $1 שמשמש ב{{GRAMMAR:תחילית|$2}}.",
"apierror-noedit-anon": "משתמשים אלמוניים אינם יכולים לערוך דפים.",
+ "apierror-noedit": "אין לך הרשאה לערוך דפים.",
+ "apierror-noimageredirect-anon": "משתמשים אלמוניים אינם יכולים ליצור הפניות לתמונות.",
+ "apierror-noimageredirect": "אין לך הרשאה ליצור הפניות לתמונות.",
"apierror-nosuchlogid": "אין רשומה ביומן עם המזהה $1.",
+ "apierror-nosuchpageid": "אין דף עם המזהה $1.",
+ "apierror-nosuchrcid": "לא נעשה לאחרונה שינוי עם המזהה $1.",
+ "apierror-nosuchrevid": "אין גרסה עם המזהה $1.",
+ "apierror-nosuchsection": "לא קיים מקטע $1.",
+ "apierror-nosuchsection-what": "אין מקטע $1 ב{{GRAMMAR:תחילית|$2}}.",
+ "apierror-nosuchuserid": "אין משתמש עם המזהה $1.",
+ "apierror-notarget": "לא נתת יעד תקין לפעולה הזאת.",
+ "apierror-notpatrollable": "לא ניתן לנטר את הגרסה $1 כי היא ישנה מדי.",
+ "apierror-nouploadmodule": "לא הוגדר מודול העלאה.",
+ "apierror-opensearch-json-warnings": "לא ניתן לייצג את האזהרות בתסדיר JSON של OpenSearch.",
+ "apierror-pagecannotexist": "מרחב השם אינו מתיר דפים אמתיים.",
+ "apierror-pagedeleted": "הדף הזה נמחק מאז שאחזרת את חותם הזמן שלו.",
+ "apierror-pagelang-disabled": "שינוי שפת הדף אסור בוויקי הזה.",
+ "apierror-paramempty": "הפרמטר <var>$1</var> אינו יכול להיות ריק.",
+ "apierror-parsetree-notwikitext": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext).",
+ "apierror-parsetree-notwikitext-title": "<kbd>prop=parsetree</kbd> נתמך רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+ "apierror-pastexpiry": "זמן התפוגה \"$1\" בעבר.",
+ "apierror-permissiondenied": "אין לך הרשאה $1.",
+ "apierror-permissiondenied-generic": "ההרשאה נדחתה.",
+ "apierror-permissiondenied-patrolflag": "עליך להחזיק בהרשאות <code>patrol</code> או <code>patrolmarks</code> כדי לבקש דגל מנוטר.",
+ "apierror-permissiondenied-unblock": "אין לך הרשאה לשחרר חסימה של משתמשים.",
+ "apierror-prefixsearchdisabled": "חיפוש תחילית כבוי במצב קמצן.",
+ "apierror-promised-nonwrite-api": "כותר <code>Promise-Non-Write-API-Action</code> של HTTP אינו יכול להישלח למודולי API שפועלים במצב כתיבה.",
+ "apierror-protect-invalidaction": "סוג הגנה בלתי־תקין \"$1\".",
+ "apierror-protect-invalidlevel": "קמת הגנה בלתי־תקינה \"$1\".",
+ "apierror-ratelimited": "עברת את מכסת הקצב שלך. נא להמתין זמן־מה ונסות שוב.",
+ "apierror-readapidenied": "יש צורך בהרשאת קריאה כדי להשתמש במודול הזה.",
+ "apierror-readonly": "הוויקי הזה במצב לקריאה בלבד עכשיו.",
+ "apierror-reauthenticate": "לא עברת אימות לאחרונה בשיחה הזאת, נא להתאמת מחדש.",
+ "apierror-redirect-appendonly": "ניסית לערוך במצב מעבר־אחר־הפניות (redirect-following), שצריך לשמש יחד עם <kbd>section=new</kbd>, <var>prependtext</var>, או <var>appendtext</var>.",
+ "apierror-revdel-mutuallyexclusive": "אותו השדה אינו יכול לשמש עם <var>hide</var> ועם <var>show</var>.",
+ "apierror-revdel-needtarget": "כותרת יעד נחוצה בשביל סוג ה־RevDel הזה.",
+ "apierror-revdel-paramneeded": "לפחות ערך אחד נחוץ בשביל <var>hide</var> או <var>show</var>.",
+ "apierror-revisions-norevids": "הפרמטר <var>revids</var> אינו יכול לשמש עם אפשרויות הרשימה (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, ו־<var>$1end</var>).",
+ "apierror-revisions-singlepage": "<var>titles</var>, <var>pageids</var> או מחולל שימשו לאספקת דפים מרובים, אבל הפרמטרים <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var>, ו־<var>$1end</var> יכולים לשמש רק בדף בודד.",
+ "apierror-revwrongpage": "הגרסה $1 אינה גרסה של $2.",
+ "apierror-searchdisabled": "חיפוש <var>$1</var> כבוי.",
+ "apierror-sectionreplacefailed": "לא היה אפשר למזג את המקטע המעודכן.",
+ "apierror-sectionsnotsupported": "מקטעים אינם נתמכים במודל התוכן $1.",
+ "apierror-sectionsnotsupported-what": "מקטעים אינם נתמכים ב־$1.",
+ "apierror-show": "פרמטר לא נכון – אי־אפשר לספק ערכים שמבטלים זה את זה.",
+ "apierror-siteinfo-includealldenied": "לא ניתן להציג את המידע של כל השרתים אלא אם <var dir=\"ltr\">$wgShowHostNames</var> מוגדר להיות true.",
+ "apierror-sizediffdisabled": "ההבדל בגודל כבוי במצב קמצן.",
+ "apierror-spamdetected": "העריכה שלך סורבה כי הכילה חלק ספאם: <code>$1</code>.",
+ "apierror-specialpage-cantexecute": "אין לך הרשאה להציג את התוצאות של הדף המיוחד הזה.",
+ "apierror-stashedfilenotfound": "לא היה אפשר למצור את הקובץ בסליק: $1.",
+ "apierror-stashedit-missingtext": "לא נמצא טקסט מוסלק עם הגיבוב שניתן.",
+ "apierror-stashfailed-complete": "העלאה מפולחת הושלמה, יש לבדוק את המצב בשביל לראות פרטים.",
+ "apierror-stashfailed-nosession": "אין שיחת העלאה מפולחת עם המפתח הזה.",
+ "apierror-stashfilestorage": "לא היה אפשר לאחסן את ההעלאה בסליק: $1",
"apierror-stashinvalidfile": "קובץ מוסלק בלתי־תקין.",
"apierror-stashnosuchfilekey": "אין מפתח קובץ כזה: $1.",
"apierror-stashpathinvalid": "מפתח קובץ מתסדיר בלתי־הולם או בלתי־תקין באופן אחר: $1.",
"apierror-stashwrongowner": "בעלים בלתי־תקין: $1",
"apierror-stashzerolength": "קובץ באורך אפס, ואל יכול משוחזר בסליק: $1.",
"apierror-systemblocked": "נחסמת אוטומטית על־ידי מדיה־ויקי.",
+ "apierror-templateexpansion-notwikitext": "הרחבת תבניות נתמכת רק בתוכן קוד ויקי (wikitext). $1 משתמש במודל התוכן $2.",
+ "apierror-toofewexpiries": "{{PLURAL:$1|ניתן חותם זמן תפוגה אחד|ניתנו $1 חותמי זמן תפוגה}} כאשר {{PLURAL:$2|היה נחוץ אחד|היו נחוצים $1}}.",
+ "apierror-unknownaction": "הפעולה שניתנה, <kbd>$1</kbd>, אינה מוכרת.",
+ "apierror-unknownerror-editpage": "שגיאת EditPage בלתי־ידועה: $1.",
"apierror-unknownerror-nocode": "שגיאה בלתי־ידועה.",
"apierror-unknownerror": "שגיאה בלתי ידועה: \"$1\".",
"apierror-unknownformat": "תסדיר בלתי־ידוע \"$1\".",
+ "apierror-unrecognizedparams": "{{PLURAL:$2|פרמטר בלתי־מוכר|פרמטרים בלתי־מוכרים}}: $1.",
+ "apierror-unrecognizedvalue": "לפרמטר <var>$1</var> יש ערך בלתי־מוכר: $2.",
+ "apierror-unsupportedrepo": "מאגר קבצים מקומי אינו תומך בשאילתה לכל התמונות.",
"apierror-upload-filekeyneeded": "חובה לספק <var>filekey</var> כאשר <var>offset</var> אינו אפס.",
"apierror-upload-filekeynotallowed": "לא ניתן לספק <var>filekey</var> כאשר <var>offset</var> הוא 0.",
+ "apierror-upload-inprogress": "העלאה מתוך סליק כבר התחילה.",
"apierror-upload-missingresult": "אין תוצאות בנתוני מצב.",
+ "apierror-urlparamnormal": "לא היה אפשר לנרמל את פרמטרי התמונה עבור $1.",
"apierror-writeapidenied": "אין לך הרשאה לערוך את הוויקי הזה דרך ה־API.",
"apiwarn-alldeletedrevisions-performance": "לביצועים טובים יותר בעת יצירת כותרת, יש להשתמש ב־<kbd>$1dir=newer</kbd>.",
"apiwarn-badurlparam": "לא היה אפשר לפענח את <var>$1urlparam</var> עבור $2. משתמשים רק ב־width ו־height.",
"apiwarn-deprecation-expandtemplates-prop": "מכיוון שלא ניתנו ערכים לפרמטר <var>prop</var>, תסדיר מיושן ישמש לפלט. התסדיר הזה מיושן, ובעתיד יינתן ערך בררת מחדל לפרמטר <var>prop</var>, כך שתמיד ישמש התסדיר החדש.",
"apiwarn-deprecation-httpsexpected": "משמש HTTP כשהיה צפוי HTTPS.",
"apiwarn-deprecation-login-botpw": "כניסה לחשבון עיקרי (main-account) דרך <kbd>action=login</kbd> מיושנת ועלולה להפסיק לעבוד ללא אזהרה נוספת. כדי להמשיך להיכנס עם <kbd>action=login</kbd>, ר' [[Special:BotPasswords]]. כדי להמשיך באופן מאובטח באמצעות חשבון עיקרי, ר' <kbd>action=clientlogin</kbd>.",
+ "apiwarn-deprecation-login-nobotpw": "כניסה בחשבון ראשי עם <kbd>action=login</kbd> מיושנת ויכולה להפסיק לעבוד ללא אזהרה. כדי להיכנס באופן מאובטח, ר' <kbd>action=clientlogin</kbd>.",
"apiwarn-deprecation-login-token": "אחזור אסימון דרך <kbd>action=login</kbd> מיושן. נא להשתמש ב־<kbd>action=query&meta=tokens&type=login</kbd> במקום זה.",
"apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
"apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
"apiwarn-redirectsandrevids": "פתרון הפניות לא יכול לשמש יחד עם הפרמטר <var>revids</var>. הפניות ש־<var>revids</var> מצביע אליהן לא נפתרו.",
"apiwarn-tokennotallowed": "הפעולה \"$1\" אינה מותרת למשתמש הנוכחי.",
"apiwarn-tokens-origin": "לא ניתן לקבל אסימונים כשמדיניות המקור הזהה אינה חלה.",
- "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>: המגבלה היא $2.",
+ "apiwarn-toomanyvalues": "יותר מדי ערכים סופקו לפרמטר <var>$1</var>. המגבלה היא $2.",
"apiwarn-truncatedresult": "התוצאה נחתכה כי אחרת היא הייתה ארוכה מהמגבלה של $1 בתים.",
"apiwarn-unclearnowtimestamp": "העברת \"$2\" בתור פרמטר חותם־זמן <var>$1</var> הוצהרה בתור מיושנת. אם מסיבה כלשהי אתם צריכים להגדיר במפורש את הזמן הנוכחי ללא חישובו בצד הלקוח, יש להשתמש ב־<kbd>now</kbd>.",
"apiwarn-unrecognizedvalues": "לפרמטר <var>$1</var> היתנ ג{{PLURAL:$3|ניתן ערך בלתי־ידוע|ניתנו ערכים בלתי־ידועים}}: $2.",
"apihelp-main-param-maxage": "Задајте му олку секунди на заглавието за контрола HTTP-меѓускладот <code>s-maxage</code>. Грешките никогаш не се чуваат во меѓускладот.",
"apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено <kbd>user</kbd> или дали го има корисничкото право на бот, ако е зададено <kbd>bot</kbd>.",
"apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
- "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
- "apihelp-main-param-curtimestamp": "Ð\91клÑ\83Ñ\87и Ñ\82ековно вÑ\80еме и вÑ\80еме и даÑ\82Ñ\83м во Ñ\80езÑ\83лÑ\82аÑ\82от.",
+ "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во исходот.",
+ "apihelp-main-param-curtimestamp": "Ð\92клÑ\83Ñ\87и Ñ\82ековно вÑ\80еме и вÑ\80еме и даÑ\82Ñ\83м во иÑ\81Ñ\85одот.",
"apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како <kbd>https://mk.wikipedia.org</kbd> or <kbd>https://meta.wikimedia.org</kbd>. Ако овој параметар не се совпаѓа со заглавието <code>Origin</code>:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе заглавието <code>Access-Control-Allow-Origin</code>.",
"apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> со <kbd>siprop=languages</kbd> или укажете <kbd>user</kbd> за да го користите тековно зададениот јазик корисникот, или пак укажете <kbd>content</kbd> за да го користите јазикот на содржината на ова вики.",
"apihelp-block-description": "Блокирај корисник.",
"apihelp-expandtemplates-param-title": "Наслов на страница.",
"apihelp-expandtemplates-param-text": "Викитекст за претворање.",
"apihelp-expandtemplates-param-revid": "Назнака на преработката, за <nowiki>{{REVISIONID}}</nowiki> и слични променливи.",
- "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+ "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n\nИмајте на ум дека ако не изберете никаква вредност, исходот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
"apihelp-expandtemplates-paramvalue-prop-wikitext": "Проширениот викитекст.",
"apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
"apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
"apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
"apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
"apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+ "apihelp-feedcontributions-param-hideminor": "Сокриј ситни уредувања.",
"apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
"apihelp-feedcontributions-example-simple": "Покажувај придонеси на <kbd>Пример</kbd>.",
"apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
"apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
- "apihelp-feedrecentchanges-param-namespace": "Ð\9dа коÑ\98 именÑ\81ки пÑ\80оÑ\81Ñ\82оÑ\80 да Ñ\81е огÑ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82иÑ\82е.",
+ "apihelp-feedrecentchanges-param-namespace": "Ð\9dа коÑ\98 именÑ\81ки пÑ\80оÑ\81Ñ\82оÑ\80 да Ñ\81е огÑ\80аниÑ\87и иÑ\81Ñ\85одоÑ\82.",
"apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
"apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
- "apihelp-feedrecentchanges-param-days": "Ð\9dа кои денови да Ñ\81е огÑ\80аниÑ\87аÑ\82 Ñ\80езÑ\83лÑ\82аÑ\82ите.",
+ "apihelp-feedrecentchanges-param-days": "Ð\9dа кои денови да Ñ\81е огÑ\80аниÑ\87аÑ\82 Ñ\81Ñ\82авките.",
"apihelp-feedrecentchanges-param-limit": "Највеќе ставки во исходот за прикажување.",
"apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
"apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
"apihelp-feedrecentchanges-param-hideliu": "Скриј ги промените направени од регистрирани корисници.",
"apihelp-feedrecentchanges-param-hidepatrolled": "Скриј ги испатролираните промени.",
"apihelp-feedrecentchanges-param-hidemyself": "Скриј ги промените на тековниот корисник.",
+ "apihelp-feedrecentchanges-param-hidecategorization": "Сокриј префрлања во други категории.",
"apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
"apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
"apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
+ "apihelp-feedrecentchanges-param-categories": "Прикажи само промени на страниците во сите овие категории.",
+ "apihelp-feedrecentchanges-param-categories_any": "Прикажи само промени на страниците во било која од категориите.",
"apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
"apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
"apihelp-feedwatchlist-description": "Дава канал од набљудуваните.",
"apihelp-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
"apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
"apihelp-help-example-main": "Помош за главниот модул",
+ "apihelp-help-example-submodules": "Помош за <kbd>action=query</kbd> и сите негови подмодули.",
"apihelp-help-example-recursive": "Сета помош на една страница",
"apihelp-help-example-help": "Помош за самиот помошен модул",
"apihelp-help-example-query": "Помош за два подмодула за барања",
"apihelp-imagerotate-description": "Сврти една или повеќе слики.",
"apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+ "apihelp-imagerotate-param-tags": "Ознаки за примена врз ставката во дневникот на подигања.",
"apihelp-imagerotate-example-simple": "Сврти ја <kbd>Податотека:Пример.png</kbd> за <kbd>90</kbd> степени.",
"apihelp-imagerotate-example-generator": "Сврти ги сите слики во <kbd>Категорија:Некоја</kbd> за <kbd>180</kbd> степени.",
"apihelp-import-description": "Увези страница од друго вики или од XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот <var>xml</var>.",
- "apihelp-import-param-summary": "Увези опис.",
+ "apihelp-import-param-summary": "Ð\9eпиÑ\81 на Ñ\83возоÑ\82 на дневниÑ\87ки запис.",
"apihelp-import-param-xml": "Подигната XML-податотека.",
"apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
"apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
"apihelp-move-example-move": "Премести го <kbd>Badtitle</kbd> на <kbd>Goodtitle</kbd>, неоставајќи пренасочување",
"apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
"apihelp-opensearch-param-search": "Низа за пребарување.",
- "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\80езÑ\83лÑ\82аÑ\82и за прикажување.",
+ "apihelp-opensearch-param-limit": "Ð\9dаÑ\98веÑ\9cе Ñ\81Ñ\82авки за прикажување.",
"apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
"apihelp-opensearch-param-suggest": "Не прави ништо ако <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> е неточно.",
- "apihelp-opensearch-param-redirects": "Ð\9aако да Ñ\81е Ñ\80абоÑ\82и Ñ\81о пÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 го Ñ\81амоÑ\82о пÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже да даде помалкÑ\83 од $1limit Ñ\80езÑ\83лÑ\82аÑ\82и.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
+ "apihelp-opensearch-param-redirects": "Ð\9aако да Ñ\81е Ñ\80абоÑ\82и Ñ\81о пÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aа:\n;return: Ð\94аÑ\98 го Ñ\81амоÑ\82о пÑ\80енаÑ\81оÑ\87Ñ\83ваÑ\9aе.\n;resolve: Ð\94аÑ\98 Ñ\98а Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а. Ð\9cоже да даде помалкÑ\83 од $1limit Ñ\81Ñ\82авки.\nОд историски причини, по основно е „return“ за $1format=json и „resolve“ за други формати.",
"apihelp-opensearch-param-format": "Формат на изводот.",
"apihelp-opensearch-example-te": "Најди страници што почнуваат со <kbd>Те</kbd>.",
"apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката <code>userjs-</code> (предвиден за употреба од кориснички скрипти).",
"apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на <kbd>Главна страница</kbd> кои се направени од корисникот „зададен од МедијаВики“ (<kbd>MediaWiki default</kbd>)",
"apihelp-query+search-example-simple": "Побарај <kbd>meaning</kbd>.",
"apihelp-query+search-example-text": "Побарај го <kbd>meaning</kbd> по текстовите.",
- "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на <kbd>meaning</kbd>.",
+ "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во исходот од пребарувањето на <kbd>meaning</kbd>.",
"apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
"apihelp-upload-param-filename": "Целно име на податотеката.",
"apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано <var>$1text</var>.",
"apihelp-xml-param-xslt": "Ако е укажано, ја додава именуваната страница како XSL-стилска страница. Вредноста мора да биде наслов во именскиот простор „{{ns:MediaWiki}}“ што ќе завршува со <code>.xsl</code>.",
"apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
"apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
- "api-format-title": "РезÑ\83лÑ\82аÑ\82 од Извршникот на МедијаВики",
+ "api-format-title": "Ð\98Ñ\81Ñ\85од од Извршникот на МедијаВики",
"api-format-prettyprint-header": "Ова е HTML-претстава на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреба во извршник.\n\nУкажете го параметарот <var>format</var> за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте <kbd>format=$2</kbd>.\n\nПовеќе информации ќе најдете на [[mw:API|целосната документација]], или пак [[Special:ApiHelp/main|помош со извршникот]].",
"api-pageset-param-titles": "Список на наслови на кои ќе се работи",
"api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
"api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
"api-help-param-token-webui": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.",
"api-help-param-disabled-in-miser-mode": "Исклучено поради [[mw:Manual:$wgMiserMode|скржавиот режим]].",
- "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> резултати пред да продолжите; во крајни случаи може да не добиете ниеден резултат.",
+ "api-help-param-limited-in-miser-mode": "<strong>Напомена:</strong> Бидејќи сте во [[mw:Manual:$wgMiserMode|скржав режим]], користејќи го ова може да добиете помалку од <var>$1limit</var> исходни ставки пред да продолжите; во крајни случаи може да не добиете ниедна ставка.",
"api-help-param-direction": "Во која насока да се набројува:\n;понови:Прво најстарите. Напомена: $1start мора да биде пред $1end.\n;постари:Прво најновите (по основно). Напомена: $1start мора да биде подоцна од $1end.",
"api-help-param-continue": "Употребете го ова за да продолжите кога има повеќе расположиви ставки.",
"api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
"apihelp-main-param-smaxage": "Stelt de <code>s-maxage</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
"apihelp-main-param-maxage": "Stelt de <code>max-age</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
"apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als <kbd>user</kbd> is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als <kbd>bot</kbd> is meegegeven.",
+ "apihelp-main-param-assertuser": "Bevestig dat de huidige gebruiker de genoemde gebruiker is.",
"apihelp-main-param-requestid": "Elke waarde die hier gegeven wordt, wordt aan het antwoord toegevoegd. Dit kan gebruikt worden om verzoeken te onderscheiden.",
"apihelp-main-param-servedby": "Voeg de hostnaam van de server die de aanvraag heeft afgehandeld toe aan het antwoord.",
"apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
"apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
"apihelp-block-param-noemail": "Gebruiker weerhouden van het sturen van e-mail. (Vereist het <code>blockemail</code> recht).",
"apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het <code>hideuser</code> recht).",
+ "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
"apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
"apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.",
"apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.",
"apiwarn-invalidcategory": "„$1” nie jest kategorią.",
"apiwarn-invalidtitle": "„$1” nie jest poprawnym tytułem.",
"apiwarn-notfile": "„$1” nie jest plikiem.",
+ "apiwarn-toomanyvalues": "Podano zbyt wiele wartości dla parametru <var>$1</var>. Ograniczenie do $2.",
"apiwarn-validationfailed": "Błąd walidacji dla <kbd>$1</kbd>: $2",
"api-feed-error-title": "Błąd ($1)",
"api-exception-trace": "$1 w $2($3)\n$4",
"apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "{{doc-apihelp-paramvalue|query+siteinfo|prop|rightsinfo}}",
"apihelp-query+siteinfo-paramvalue-prop-restrictions": "{{doc-apihelp-paramvalue|query+siteinfo|prop|restrictions}}",
"apihelp-query+siteinfo-paramvalue-prop-languages": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languages}}",
+ "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "{{doc-apihelp-paramvalue|query+siteinfo|prop|languagevariants}}",
"apihelp-query+siteinfo-paramvalue-prop-skins": "{{doc-apihelp-paramvalue|query+siteinfo|prop|skins}}",
"apihelp-query+siteinfo-paramvalue-prop-extensiontags": "{{doc-apihelp-paramvalue|query+siteinfo|prop|extensiontags}}",
"apihelp-query+siteinfo-paramvalue-prop-functionhooks": "{{doc-apihelp-paramvalue|query+siteinfo|prop|functionhooks}}",
"api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
"api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
"api-help-open-in-apisandbox": "Text for the link to open an API example in [[Special:ApiSandbox]].",
- "api-help-authmanager-general-usage": "Text giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
+ "api-help-authmanager-general-usage": "{{doc-important|Do not translate text that either quoted, or inside <nowiki><var></var></nowiki>, <nowiki><kbd></kbd></nowiki>, <nowiki><samp></samp></nowiki>, or <nowiki><code></code></nowiki> in this message.}}\nText giving a brief overview of how to use an AuthManager-using API module. Parameters:\n* $1 - Module parameter prefix, e.g. \"login\"\n* $2 - Module name, e.g. \"clientlogin\"\n* $3 - Module path, e.g. \"clientlogin\"\n* $4 - AuthManager action to use with this module.\n* $5 - Token type needed by the module.",
"api-help-authmanagerhelper-requests": "{{doc-apihelp-param|description=the \"requests\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
"api-help-authmanagerhelper-request": "{{doc-apihelp-param|description=the \"request\" parameter for AuthManager-using API modules|params=* $1 - AuthManager action used by this module|paramstart=2|noseealso=1}}",
"api-help-authmanagerhelper-messageformat": "{{doc-apihelp-param|description=the \"messageformat\" parameter for AuthManager-using API modules|noseealso=1}}",
"api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
"api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。",
"api-help-open-in-apisandbox": "<small>[在沙盒中打开]</small>",
- "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>或<samp>FAIL</samp>,您已经完成。操作要么成功,要么不成功。\n#* 如果您收到了<samp>UI</samp>,present the new fields to the user and obtain their submission. Then post to this module with <var>$1continue</var> and the relevant fields set, and repeat step 4.\n#* 如果您收到了<samp>REDIRECT</samp>,direct the user to the <samp>redirecttarget</samp> and wait for the return to <var>$1returnurl</var>. Then post to this module with <var>$1continue</var> and any fields passed to the return URL, and repeat step 4.\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证可以工作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
+ "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过<kbd>amirequestsfor=$4</kbd>取得来自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用字段,和来自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用户显示字段,并获得其提交的内容。\n# 发送(POST)至此模块,提供<var>$1returnurl</var>及任何相关字段。\n# 在响应中检查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失败),则认为操作结束。成功与否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用户显示新字段,并再次获取其提交的内容。然后再次使用<var>$1continue</var>,向本模块提交相关字段,并重复第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,将用户指向<samp>redirecttarget</samp>中的目标,等待其返回<var>$1returnurl</var>。然后再次使用<var>$1continue</var>,向本模块提交返回URL中提供的一切字段,并重复第四步。\n#* 如果您收到了<samp>RESTART</samp>,这意味着身份验证正常运作,但我们没有链接的用户账户。您可以将此看做<samp>UI</samp>或<samp>FAIL</samp>。",
"api-help-authmanagerhelper-requests": "只使用这些身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>,或来自此模块之前的响应。",
"api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的<samp>id</samp>与<kbd>amirequestsfor=$1</kbd>。",
"api-help-authmanagerhelper-messageformat": "返回消息使用的格式。",
"apiwarn-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
"apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
"apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
- "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值:上限为$2。",
+ "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值。上限为$2。",
"apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。",
"apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now</kbd>。",
"apiwarn-unrecognizedvalues": "参数<var>$1</var>有无法识别的{{PLURAL:$3|值}}:$2。",
"Zhxy 519",
"Macofe",
"Jasonzhuocn",
- "Winstonyin"
+ "Winstonyin",
+ "Arthur2e5",
+ "烈羽"
]
},
"apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|說明文件]]\n* [[mw:API:FAQ|常見問題]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵寄清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 報告錯誤及請求功能]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是API仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤的請求:</strong>當API收到錯誤的請求時,會發出以「MediaWiki-API-Error」為鍵的HTTP頭欄位,隨後頭欄位的值與錯誤碼將會被設為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。\n\n<strong>測試:</strong>要簡化API請求的測試過程,請見[[Special:ApiSandbox]]。",
"apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
"apihelp-feedcontributions-description": "回傳使用者貢獻 Feed。",
"apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
+ "apihelp-feedcontributions-param-hideminor": "隱藏小修改。",
"apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
"apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
"apihelp-feedrecentchanges-description": "返回最近變更摘要。",
"api-help-examples": "{{PLURAL:$1|範例}}:",
"api-help-permissions": "{{PLURAL:$1|權限}}:",
"api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2",
+ "api-help-authmanager-general-usage": "使用此模組的一般程式是:\n# 通過<kbd>amirequestsfor=$4</kbd>取得來自<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>的可用欄位,和來自<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>的<kbd>$5</kbd>令牌。\n# 向用戶顯示欄位,並獲得其提交的內容。\n# 提交(POST)至此模組,提供<var>$1returnurl</var>及任何相關欄位。\n# 在回应中檢查<samp>status</samp>。\n#* 如果您收到了<samp>PASS</samp>(成功)或<samp>FAIL</samp>(失敗),則認為操作結束。成功與否如上句所示。\n#* 如果您收到了<samp>UI</samp>,向用戶顯示新欄位,並再次獲取其提交的內容。然後再次使用<var>$1continue</var>,向本模組提交相關欄位,並重復第四步。\n#* 如果您收到了<samp>REDIRECT</samp>,將使用者指向<samp>redirecttarget</samp>中的目標,等待其返回<var>$1returnurl</var>。然後再次使用<var>$1continue</var>,向本模組提交返回URL中提供的一切欄位,並重復第四步。\n#* 如果您收到了<samp>RESTART</samp>,這意味著身份驗證正常運作,但我們沒有連結的使用者賬戶。您可以將此看做<samp>UI</samp>或<samp>FAIL</samp>。",
"api-credits-header": "製作群",
"api-credits": "API 開發人員:\n* Roan Kattouw (首席開發者 Sep 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (創立者,首席開發者 Sep 2006–Sep 2007)\n* Brad Jorsch (首席開發者 2013–present)\n\n請傳送您的評論、建議以及問題至 mediawiki-api@lists.wikimedia.org\n或者回報問題至 https://phabricator.wikimedia.org/。"
}
* @copyright © 2011, Antoine Musso
*/
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
+
/**
* Class for fetching backlink lists, approximate backlink counts and
* partitions. This is a shared cache.
// 4) ... finally fetch from the slow database :(
$cacheEntry = [ 'numRows' => 0, 'batches' => [] ]; // final result
- // Do the selects in batches to avoid client-side OOMs (bug 43452).
+ // Do the selects in batches to avoid client-side OOMs (T45452).
// Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
$selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
$start = false;
*/
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* Class representing a list of titles
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Feed to Special:RecentChanges and Special:RecentChangesLiked
*
if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
if ( $feedLastmodUnix < $lastmodUnix ) {
- $wgOut->setLastModified( $feedLastmod ); // bug 21916
+ $wgOut->setLastModified( $feedLastmod ); // T23916
}
return $cache->get( $key );
} else {
*/
use MediaWiki\Linker\LinkRenderer;
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
class ChangesList extends ContextSource {
/**
&& $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
) {
$tableClasses[] = 'mw-changeslist-line-watched';
- $tableClasses = array_merge( $tableClasses, $this->getHTMLClassesForFilters( $block[0] ) );
} else {
$tableClasses[] = 'mw-changeslist-line-not-watched';
}
if ( $rcObj->watched
&& $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
) {
- $classes[] = [ 'mw-enhanced-watched' ];
+ $classes[] = 'mw-enhanced-watched';
}
$classes = array_merge( $classes, $this->getHTMLClassesForFilters( $rcObj ) );
$links['total-changes'] = $this->linkRenderer->makeKnownLink(
$block0->getTitle(),
new HtmlArmor( $nchanges[$n] ),
- [],
+ [ 'class' => 'mw-changeslist-groupdiff' ],
$queryParams + [
'diff' => $currentRevision,
'oldid' => $last->mAttribs['rc_last_oldid'],
$links['total-changes-since-last'] = $this->linkRenderer->makeKnownLink(
$block0->getTitle(),
new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
- [],
+ [ 'class' => 'mw-changeslist-groupdiff' ],
$queryParams + [
'diff' => $currentRevision,
'oldid' => $unvisitedOldid,
$links['history'] = $this->linkRenderer->makeKnownLink(
$block0->getTitle(),
new HtmlArmor( $this->message['enhancedrc-history'] ),
- [],
+ [ 'class' => 'mw-changeslist-history' ],
$params
);
}
. $this->linkRenderer->makeKnownLink(
$pageTitle,
new HtmlArmor( $this->message['hist'] ),
- [],
+ [ 'class' => 'mw-changeslist-history' ],
$query
) )->escaped();
return $retVal;
public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
$classes = $this->getHTMLClasses( $rc, $watched );
- // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+ // use mw-line-even/mw-line-odd class only if linenumber is given (feature from T16468)
if ( $linenumber ) {
if ( $linenumber & 1 ) {
$classes[] = 'mw-line-odd';
$curLink = $curMessage;
} else {
$curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
- $curLink = "<a href=\"$curUrl\">$curMessage</a>";
+ $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
}
return $curLink;
return $diffMessage;
}
$diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
- $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+ $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
} else {
$diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
- $diffLink = "<a href=\"$diffUrl\">$diffMessage</a>";
+ $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
}
return $diffLink;
}
/**
+ * Builds the link to the previous version
+ *
* @param RecentChange $cacheEntry
* @param bool $showDiffLinks
*
$lastLink = $this->linkRenderer->makeKnownLink(
$cacheEntry->getTitle(),
new HtmlArmor( $lastMessage ),
- [],
+ [ 'class' => 'mw-changeslist-diff' ],
$this->buildDiffQueryParams( $cacheEntry )
);
}
*/
/**
- * Workaround for incorrect collation of Estonian language ('et') in ICU (bug 54168).
+ * Workaround for incorrect collation of Estonian language ('et') in ICU (T56168).
*
* 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
* Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
* can't be determined.
*
* The constant INTL_ICU_VERSION this function refers to isn't really
- * documented. It is available since PHP 5.3.7 (see PHP bug 54561).
- * This function will return false on older PHPs.
+ * documented. It is available since PHP 5.3.7 (see PHP 54561
+ * https://bugs.php.net/bug.php?id=54561). This function will return
+ * false on older PHPs.
+ *
+ * TODO: Remove the backwards-compatibility as MediaWiki now requires
+ * higher levels of PHP.
*
* @since 1.21
* @return string|bool
--- /dev/null
+<?php
+// This file is loaded by composer.json#autoload.files instead of autoload.php,
+// because PHP's class loader does not support autoloading an alias for a class that
+// isn't already loaded. See also AutoLoaderTest and ClassCollector.
+
+// By using an autoload file, this will trigger directly at runtime outside any class
+// loading context. This file will then register the alias and, as class_alias() does
+// by default, it will trigger a plain autoload for the destination class.
+
+// The below uses string concatenation for the alias to avoid being seen by ClassCollector,
+// which would insist on adding it to autoload.php, after which AutoLoaderTest will
+// complain about class_alias() not being in the target class file.
+
+/**
+ * @deprecated since 1.29
+ * @since 1.20
+ */
+class_alias( Wikimedia\Timestamp\TimestampException::class, 'Timestamp' . 'Exception' );
$onlyAuthor = $row->rev_user_text;
// Try to find a second contributor
foreach ( $res as $row ) {
- if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+ if ( $row->rev_user_text != $onlyAuthor ) { // T24999
$onlyAuthor = false;
break;
}
* @return array Map of name=>value for fields
* @since 1.28
*/
- public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
- SearchEngine $engine ) {
+ public function getDataForSearchIndex(
+ WikiPage $page,
+ ParserOutput $output,
+ SearchEngine $engine
+ ) {
$fieldData = [];
$content = $page->getContent();
return $fields;
}
- public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
- SearchEngine $engine ) {
+ public function getDataForSearchIndex(
+ WikiPage $page,
+ ParserOutput $parserOutput,
+ SearchEngine $engine
+ ) {
$fields = [];
$title = $page->getTitle();
*/
class TextContentHandler extends ContentHandler {
- // @codingStandardsIgnoreStart bug 57585
+ // @codingStandardsIgnoreStart T59585
public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) {
parent::__construct( $modelId, $formats );
}
return $fields;
}
- public function getDataForSearchIndex( WikiPage $page, ParserOutput $output,
- SearchEngine $engine ) {
+ public function getDataForSearchIndex(
+ WikiPage $page,
+ ParserOutput $output,
+ SearchEngine $engine
+ ) {
$fields = parent::getDataForSearchIndex( $page, $output, $engine );
$fields['language'] =
$this->getPageLanguage( $page->getTitle(), $page->getContent() )->getCode();
* @var string[] selectors to elements that are excluded entirely from search
*/
private $excludedElementSelectors = [
- 'audio', 'video', // "it looks like you don't have javascript enabled..."
- // do not need to index
- 'sup.reference', // The [1] for references
- '.mw-cite-backlink', // The ↑ next to references in the references section
- 'h1', 'h2', 'h3', // Headings are already indexed in their own field.
- 'h5', 'h6', 'h4',
- '.autocollapse', // Collapsed fields are hidden by default so we don't want them
- // showing up.
+ // "it looks like you don't have javascript enabled..." – do not need to index
+ 'audio', 'video',
+ // The [1] for references
+ 'sup.reference',
+ // The ↑ next to references in the references section
+ '.mw-cite-backlink',
+ // Headings are already indexed in their own field.
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+ // Collapsed fields are hidden by default so we don't want them showing up.
+ '.autocollapse',
];
/**
* @var string[] selectors to elements that are considered auxiliary to article text for search
*/
private $auxiliaryElementSelectors = [
- '.thumbcaption', // Thumbnail captions aren't really part of the text proper
- 'table', // Neither are tables
- '.rellink', // Common style for "See also:".
- '.dablink', // Common style for calling out helpful links at the top
- // of the article.
- '.searchaux', // New class users can use to mark stuff as auxiliary to searches.
+ // Thumbnail captions aren't really part of the text proper
+ '.thumbcaption',
+ // Neither are tables
+ 'table',
+ // Common style for "See also:".
+ '.rellink',
+ // Common style for calling out helpful links at the top of the article.
+ '.dablink',
+ // New class users can use to mark stuff as auxiliary to searches.
+ '.searchaux',
];
/**
$fields['opening_text'] =
$engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT );
- $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING |
- SearchIndexField::FLAG_NO_HIGHLIGHT );
+ $fields['opening_text']->setFlag(
+ SearchIndexField::FLAG_SCORING | SearchIndexField::FLAG_NO_HIGHLIGHT
+ );
// Until we have full first-class content handler for files, we invoke it explicitly here
$fields = array_merge( $fields, $this->getFileHandler()->getFieldsForSearchIndex( $engine ) );
return $fields;
}
- public function getDataForSearchIndex( WikiPage $page, ParserOutput $parserOutput,
- SearchEngine $engine ) {
+ public function getDataForSearchIndex(
+ WikiPage $page,
+ ParserOutput $parserOutput,
+ SearchEngine $engine
+ ) {
$fields = parent::getDataForSearchIndex( $page, $parserOutput, $engine );
$structure = new WikiTextStructure( $parserOutput );
}
// Normalize the key in case the user is passing gibberish
- // or has old preferences (bug 69566).
+ // or has old preferences (T71566).
$normalized = Skin::normalizeKey( $userSkin );
// Skin::normalizeKey will also validate it, so
foreach ( $this->tablesToClone as $tbl ) {
if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
// Shared tables don't work properly when cloning due to
- // how prefixes are handled (bug 65654)
+ // how prefixes are handled (T67654)
throw new RuntimeException( "Cannot clone shared table $tbl." );
}
# Clean up from previous aborted run. So that table escaping
* @ingroup Database
*/
use Wikimedia\Rdbms\Blob;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* @ingroup Database
| [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start
| (?<=[\x0-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle
| (?<![\xC2-\xDF]|[\xE0-\xEF]|[\xE0-\xEF][\x80-\xBF]|[\xF0-\xF4]
- |[\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
+ | [\xF0-\xF4][\x80-\xBF]|[\xF0-\xF4][\x80-\xBF]{2})[\x80-\xBF] # Overlong Sequence
| (?<=[\xE0-\xEF])[\x80-\xBF](?![\x80-\xBF]) # Short 3 byte sequence
| (?<=[\xF0-\xF4])[\x80-\xBF](?![\x80-\xBF]{2}) # Short 4 byte sequence
| (?<=[\xF0-\xF4][\x80-\xBF])[\x80-\xBF](?![\x80-\xBF]) # Short 4 byte sequence (2)
*
* Constructor options array arguments:
* * alias: map from monolog channel to kafka topic name. When no
- * alias exists the topic "monolog_$channel" will be used.
+ * alias exists the topic "monolog_$channel" will be used.
* * swallowExceptions: Swallow exceptions that occur while talking to
- * kafka. Defaults to false.
+ * kafka. Defaults to false.
* * logExceptions: Log exceptions talking to kafka here. Either null,
- * the name of a channel to log to, or an object implementing
- * FormatterInterface. Defaults to null.
+ * the name of a channel to log to, or an object implementing
+ * FormatterInterface. Defaults to null.
*
* Requires the nmred/kafka-php library, version >= 1.3.0
*
* LogstashFormatter squashes the base message array and the context and extras subarrays into one.
* This can result in unfortunately named context fields overwriting other data (T145133).
* This class modifies the standard LogstashFormatter to rename such fields and flag the message.
+ * Also changes exception JSON-ification which is done poorly by the standard class.
*
* Compatible with Monolog 1.x only.
*
}
return $fields;
}
+
+ /**
+ * Use a more user-friendly trace format than NormalizerFormatter
+ * @param \Exception|\Throwable $e
+ * @return array
+ */
+ protected function normalizeException( $e ) {
+ if ( !$e instanceof \Exception && !$e instanceof \Throwable ) {
+ throw new \InvalidArgumentException( 'Exception/Throwable expected, got '
+ . gettype( $e ) . ' / ' . get_class( $e ) );
+ }
+
+ $data = [
+ 'class' => get_class( $e ),
+ 'message' => $e->getMessage(),
+ 'code' => $e->getCode(),
+ 'file' => $e->getFile() . ':' . $e->getLine(),
+ 'trace' => \MWExceptionHandler::getRedactedTraceAsString( $e ),
+ ];
+
+ $previous = $e->getPrevious();
+ if ( $previous ) {
+ $data['previous'] = $this->normalizeException( $previous );
+ }
+
+ return $data;
+ }
}
return count( self::$preSendUpdates ) + count( self::$postSendUpdates );
}
+ /**
+ * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL)
+ * @since 1.29
+ */
+ public static function getPendingUpdates( $stage = self::ALL ) {
+ $updates = [];
+ if ( $stage === self::ALL || $stage === self::PRESEND ) {
+ $updates = array_merge( $updates, self::$preSendUpdates );
+ }
+ if ( $stage === self::ALL || $stage === self::POSTSEND ) {
+ $updates = array_merge( $updates, self::$postSendUpdates );
+ }
+ return $updates;
+ }
+
/**
* Clear all pending updates without performing them. Generally, you don't
* want or need to call this. Unit tests need it though.
# If the sortkey is longer then 255 bytes,
# it truncated by DB, and then doesn't get
# matched when comparing existing vs current
- # categories, causing bug 25254.
+ # categories, causing T27254.
# Also. substr behaves weird when given "".
if ( $sortkey !== '' ) {
$sortkey = substr( $sortkey, 0, 255 );
/**
* Set this to true to add debug info to the HTML output.
* Warning: this may cause RSS readers to spuriously mark articles as "new"
- * (bug 20601)
+ * (T22601)
*/
public $enableDebugComment = false;
private function flushGroup( $new_tag ) {
if ( $this->group !== '' ) {
if ( $this->tag == 'ins' ) {
- $this->line .= "<ins{$this->insClass}>" .
- htmlspecialchars( $this->group ) . '</ins>';
+ $this->line .= "<ins{$this->insClass}>" . htmlspecialchars( $this->group ) . '</ins>';
} elseif ( $this->tag == 'del' ) {
- $this->line .= "<del{$this->delClass}>" .
- htmlspecialchars( $this->group ) . '</del>';
+ $this->line .= "<del{$this->delClass}>" . htmlspecialchars( $this->group ) . '</del>';
} else {
$this->line .= htmlspecialchars( $this->group );
}
$this->msg = $msg;
$this->params = $params;
- // Bug 44111: Messages in the log files should be in English and not
+ // T46111: Messages in the log files should be in English and not
// customized by the local wiki. So get the default English version for
// passing to the parent constructor. Our overridden report() below
// makes sure that the page shown to the user is not forced to English.
$text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
} else {
// 'file' and 'line' are unset for calls via call_user_func
- // (bug 55634) This matches behaviour of
+ // (T57634) This matches behaviour of
// Exception::getTraceAsString to instead display "[internal
// function]".
$text .= "{$pad}#{$level} [internal function]: ";
* @par Example:
* @code
* if( $user->isAnon() ) {
- * throw new UserNotLoggedIn();
+ * throw new UserNotLoggedIn();
* }
* @endcode
*
* @par Example:
* @code
* if( $user->isAnon() ) {
- * throw new UserNotLoggedIn( 'action-require-loggedin' );
+ * throw new UserNotLoggedIn( 'action-require-loggedin' );
* }
* @endcode
*
- * @see bug 37627
+ * @see T39627
* @since 1.20
* @ingroup Exception
*/
* @defgroup Dump Dump
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* @ingroup SpecialPage Dump
*/
# query optimization for history stub dumps
if ( $this->text == WikiExporter::STUB && $orderRevs ) {
$tables = [ 'revision', 'page' ];
- $opts[] = 'STRAIGHT_JOIN';
+ $opts[] = 'STRAIGHT_JOIN';
$opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
$opts['USE INDEX']['revision'] = 'rev_page_id';
$join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
'dst' => $archivePath,
// We may have 2+ identical files being deleted,
// all of which will map to the same destination file
- 'overwriteSame' => true // also see bug 31792
+ 'overwriteSame' => true // also see T33792
];
}
* @ingroup FileRepo
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A repository that stores files in the local filesystem and registers them
* in the wiki's own database. This is the most commonly used repository class.
return $this->iconThumb();
}
$hp['width'] = $width;
- // be sure to ignore any height specification as well (bug 62258)
+ // be sure to ignore any height specification as well (T64258)
unset( $hp['height'] );
return $this->transform( $hp );
break; // not a bitmap or renderable image, don't try
}
- // Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
+ // Get the descriptionUrl to embed it as comment into the thumbnail. T21791.
$descriptionUrl = $this->getDescriptionUrl();
if ( $descriptionUrl ) {
$params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
$files[] = $file;
}
} catch ( FileBackendError $e ) {
- } // suppress (bug 54674)
+ } // suppress (T56674)
return $files;
}
}
}
- # (bug 34993) Note: $oldver can be empty here, if the previous
+ # (T36993) Note: $oldver can be empty here, if the previous
# version of the file was broken. Allow registration of the new
# version to continue anyway, because that's better than having
# an image that's not fixable by user operations.
$dbw = $this->repo->getMasterDB();
$makesTransaction = !$dbw->trxLevel();
$dbw->startAtomic( self::ATOMIC_SECTION_LOCK );
- // Bug 54736: use simple lock to handle when the file does not exist.
+ // T56736: use simple lock to handle when the file does not exist.
// SELECT FOR UPDATE prevents changes, not other SELECTs with FOR UPDATE.
// Also, that would cause contention on INSERT of similarly named rows.
$status = $this->acquireFileLock(); // represents all versions of the file
$status->failCount++;
}
$status->successCount += $oldRowCount;
- // Bug 34934: oldCount is based on files that actually exist.
+ // T36934: oldCount is based on files that actually exist.
// There may be more DB rows than such files, in which case $affected
// can be greater than $total. We use max() to avoid negatives here.
$status->failCount += max( 0, $this->oldCount - $oldRowCount );
*
* @param string|array|Status $elements The set of errors/warnings to process.
* @param string $elementsType Should warnings or errors be returned. This is meant
- * for Status objects, all other valid types are always considered as errors.
+ * for Status objects, all other valid types are always considered as errors.
* @return string
*/
public function getErrorsOrWarnings( $elements, $elementsType ) {
* - caInfo Provide CA information
* - maxRedirects Maximum number of redirects to follow (defaults to 5)
* - followRedirects Whether to follow redirects (defaults to false).
- * Note: this should only be used when the target URL is trusted,
- * to avoid attacks on intranet services accessible by HTTP.
+ * Note: this should only be used when the target URL is trusted,
+ * to avoid attacks on intranet services accessible by HTTP.
* - userAgent A user agent, if you want to override the default
* MediaWiki/$wgVersion
* - logger A \Psr\Logger\LoggerInterface instance for debug logging
foreach ( $members as $o ) {
if ( isset( $options[$o] ) ) {
// ensure that MWHttpRequest::method is always
- // uppercased. Bug 36137
+ // uppercased. T38137
if ( $o == 'method' ) {
$options[$o] = strtoupper( $options[$o] );
}
*
* Note that the multiple Location: headers are an artifact of
* CURL -- they shouldn't actually get returned this way. Rewrite
- * this when bug 29232 is taken care of (high-level redirect
+ * this when T31232 is taken care of (high-level redirect
* handling rewrite).
*
* @return string
public function doImport() {
// Calls to reader->read need to be wrapped in calls to
// libxml_disable_entity_loader() to avoid local file
- // inclusion attacks (bug 46932).
+ // inclusion attacks (T48932).
$oldDisable = libxml_disable_entity_loader( true );
$this->reader->read();
public function updateRowExists( $key ) {
$row = $this->db->selectRow(
'updatelog',
- # Bug 65813
+ # T67813
'1 AS X',
[ 'ul_key' => $key ],
__METHOD__
'_UpgradeKeySupplied' => false,
'_ExistingDBSettings' => false,
- // $wgLogo is probably wrong (bug 48084); set something that will work.
+ // $wgLogo is probably wrong (T50084); set something that will work.
// Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
'wgLogo' => '$wgResourceBasePath/resources/assets/wiki.png',
'wgAuthenticationTokenVersion' => 1,
);
}
// Unset everyone else's hooks. Lord knows what someone might be doing
- // in ParserFirstCallInit (see bug 27171)
+ // in ParserFirstCallInit (see T29171)
$GLOBALS['wgHooks'] = [ 'LoadExtensionSchemaUpdates' => $hooksWeWant ];
return Status::newGood();
/**
* Set page_random field to a random value where it is equals to 0.
*
- * @see bug 3946
+ * @see T5946
*/
protected function doPageRandomUpdate() {
$page = $this->db->tableName( 'page' );
$q = <<<END
SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
WHERE pg_class.relnamespace = pg_namespace.oid
- AND attrelid=pg_class.oid AND attnum > 0
- AND relname=%s AND nspname=%s
+ AND attrelid=pg_class.oid AND attnum > 0
+ AND relname=%s AND nspname=%s
END;
$res = $this->db->query( sprintf( $q,
$this->db->addQuotes( $table ),
$q = <<<END
SELECT indkey, indrelid FROM pg_namespace, pg_class, pg_index
WHERE nspname=%s
- AND pg_class.relnamespace = pg_namespace.oid
- AND relname=%s
- AND indexrelid=pg_class.oid
+ AND pg_class.relnamespace = pg_namespace.oid
+ AND relname=%s
+ AND indexrelid=pg_class.oid
END;
$res = $this->db->query(
sprintf(
$query = <<<END
SELECT attname FROM pg_class, pg_attribute
WHERE attrelid=$relid
- AND attnum=%d
- AND attrelid=pg_class.oid
+ AND attnum=%d
+ AND attrelid=pg_class.oid
END;
$r2 = $this->db->query( sprintf( $query, $rid ) );
if ( !$r2 ) {
$q = <<<END
SELECT confdeltype FROM pg_constraint, pg_namespace
WHERE connamespace=pg_namespace.oid
- AND nspname=%s
- AND conname=%s;
+ AND nspname=%s
+ AND conname=%s;
END;
$r = $this->db->query(
sprintf(
$q = <<<END
SELECT definition FROM pg_rules
WHERE schemaname = %s
- AND tablename = %s
- AND rulename = %s
+ AND tablename = %s
+ AND rulename = %s
END;
$r = $this->db->query(
sprintf(
protected function rebuildTextSearch() {
if ( $this->updateRowExists( 'patch-textsearch_bug66650.sql' ) ) {
- $this->output( "...bug 66650 already fixed or not applicable.\n" );
+ $this->output( "...T68650 already fixed or not applicable.\n" );
return;
};
$this->applyPatch( 'patch-textsearch_bug66650.sql', false,
- 'Rebuilding text search for bug 66650' );
+ 'Rebuilding text search for T68650' );
}
}
$sql =
<<<EOT
CREATE TABLE IF NOT EXISTS objectcache (
- keyname BLOB NOT NULL default '' PRIMARY KEY,
- value BLOB,
- exptime TEXT
+ keyname BLOB NOT NULL default '' PRIMARY KEY,
+ value BLOB,
+ exptime TEXT
)
EOT;
$conn->query( $sql );
foreach ( $varNames as $name ) {
$value = $this->request->getVal( $prefix . $name );
- // bug 30524, do not trim passwords
+ // T32524, do not trim passwords
if ( stripos( $name, 'password' ) === false ) {
$value = trim( $value );
}
$retVal = false;
}
// If they asked to subscribe to mediawiki-announce but didn't give
- // an e-mail, show an error. Bug 29332
+ // an e-mail, show an error. T31332
if ( !$email && $this->getVar( '_Subscribe' ) ) {
$this->parent->showError( 'config-subscribe-noemail' );
$retVal = false;
<div id="mw-panel">
<div class="portal" id="p-logo">
- <a style="background-image: url(images/installer-logo.png);"
- href="https://www.mediawiki.org/"
- title="Main Page"></a>
+ <a style="background-image: url(images/installer-logo.png);"
+ href="https://www.mediawiki.org/"
+ title="Main Page"></a>
</div>
<?php
$message = wfMessage( 'config-sidebar' )->plain();
}
if ( $continue ) {
- // Fake submit button for enter keypress (bug 26267)
+ // Fake submit button for enter keypress (T28267)
// Messages: config-continue, config-restart, config-regenerate
$s .= Xml::submitButton(
wfMessage( "config-$continue" )->text(),
if ( $result ) {
// If they're going to possibly regenerate LocalSettings, we
- // need to create the upgrade/secret keys. Bug 26481
+ // need to create the upgrade/secret keys. T28481
if ( !$this->getVar( '_ExistingDBSettings' ) ) {
$this->parent->generateKeys();
}
"config-admin-error-user": "Fazi diabarzh en ur grouiñ ur merer gant an anv \"<nowiki>$1</nowiki>\".",
"config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>",
"config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
- "config-subscribe": "Koumanantit da [https://lists.wikimedia.org/mailman/listinfo/mediawiki-listenn kemennadoù evit ar stummoù nevez].",
+ "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
"config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
"config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.",
"config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.",
"config-email-user": "Gweredekaat ar posteloù a implijer da implijer",
"config-email-user-help": "Aotren a ra an holl implijerien da gas posteloù an eil d'egile mard eo bet gweredekaet an arc'hwel ganto en ho penndibaboù.",
"config-email-usertalk": "Gweredekaat kemennadur pajennoù kaozeal an implijerien",
- "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennadennoù ma vez kemmet o fajennoù kaozeal, ma vez gweredekaet en o fenndibaboù.",
+ "config-email-usertalk-help": "Talvezout a ra d'an implijerien da resev kemennoù ma vez kemmet o fajennoù kaozeal, gant ma vo gweredekaet en o fenndibaboù.",
"config-email-watchlist": "Gweredekaat ar c'hemenn listenn evezhiañ",
- "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennadennoù diwar-benn ar pajennoù evezhiet ganto, ma vez gweredekaet en o fenndibaboù.",
+ "config-email-watchlist-help": "Talvezout a ra d'an implijerien da resev kemennoù diwar-benn ar pajennoù evezhiet ganto, gant ma vo gweredekaet en o fenndibaboù.",
"config-email-auth": "Gweredekaat an dilesadur dre bostel",
"config-email-sender": "Chomlec'h postel respont :",
"config-email-sender-help": "Merkit ar chomlec'h postel da vezañ implijet da chomlec'h distreiñ ar posteloù a ya er-maez.\nDi e vo kaset ar posteloù distaolet.\nNiverus eo ar servijerioù postel a c'houlenn da nebeutañ un [http://fr.wikipedia.org/wiki/Nom_de_domaine anv domani] reizh.",
"config-install-user-missing": "N'eus ket eus an implijer \"$1\"",
"config-install-user-missing-create": "N'eus ket eus an implijer \"$1\".\nMa fell deoc'h krouiñ anezhañ, klikit war ar voest \"krouiñ ur gont\" amañ dindan.",
"config-install-tables": "Krouiñ taolennoù",
- "config-install-tables-exist": "<strong>Kemenn :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'eo ket bet graet ar grouidigezh.",
+ "config-install-tables-exist": "<strong>Diwallit :</strong> An taolennoù MediaWiki zo anezho dija war a seblant.\nN'int ket bet adkrouet.",
"config-install-tables-failed": "'''Fazi :''' c'hwitet eo krouidigezh an daolenn gant ar fazi-mañ : $1",
"config-install-interwiki": "O leuniañ dre ziouer an daolenn etrewiki",
"config-install-interwiki-list": "Ne c'haller ket kavout ar restr <code>interwiki.list</code>.",
"authors": [
"Asoxor",
"Calak",
- "Muhammed taha"
+ "Muhammed taha",
+ "Lost Whispers"
]
},
"config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
"config-admin-password": "تێپەڕوشە:",
"config-admin-password-confirm": "دووبارە تێپەڕوشە:",
"config-admin-email": "ناونیشانی ئیمەیل:",
+ "config-admin-email-help": "ناونیشانی ئیمەیڵەکەت لێرەدا دابنێ بۆئەوەی بتوانیت ئیمەیڵت لە بەکارھێنەرانی ترەوە پێ بگات، تێپەڕ وشە ڕێک بخەیتەوە و ئاگادار بکرێیتەوە لەو گۆڕانکاریانەی کە لەو پەڕانەدا دەکرێن کە چاودێرییان دەکەیت. دەتوانیت ئەم بۆشاییە بە بەتاڵی جێبھێڵیت.",
+ "config-admin-error-bademail": "تۆ ناونیشانی ئیمەیڵێکی ھەڵەت داخڵ کردووە.",
"config-profile-wiki": "ویکیی کراوە",
"config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
"config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
"config-install-subscribe-fail": "قادر تصدیق اعلام مدیاویکی نیست:$1",
"config-install-subscribe-notpossible": "سییوآرال نصب نشدهاست و <code>allow_url_fopen</code> در دسترس نیست.",
"config-install-mainpage": "ایجاد صفحهٔ اصلی با محتوای پیشفرض",
+ "config-install-mainpage-exists": "صفحهٔ اصلی موجود است، رها شد",
"config-install-extension-tables": "ایجاد جداول برای افزونههای فعال",
"config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمیباشد:$1",
"config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصبکننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات میباشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شدهباشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر میتوانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما میتوانید '''[$2 وارد ویکی شوید]'''.",
"config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شدهاست؟",
"config-extension-link": "آیا میدانستید که ویکی شما [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی میکند؟\nشما میتوانید [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
"mainpagetext": "'''مدیاویکی با موفقیت نصب شد.'''",
- "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents]\nبرای اطلاعات بیشتر در مورد بهکارگیری نرمافزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسشهای متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخههای مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلیسازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روشهای مقابله با هرزنگاری در ویکی]"
+ "mainpagedocfooter": "از [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربری]\nبرای اطلاعات بیشتر در مورد بهکارگیری نرمافزار ویکی استفاده کنید.\n\n== آغاز به کار ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings فهرست تنظیمات پیکربندی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسشهای متداول مدیاویکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ایمیلی نسخههای مدیاویکی]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources محلیسازی مدیاویکی به زبان شما]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam یادگیری روشهای مقابله با هرزنگاری در ویکی]"
}
"Yona b",
"Rotemliss",
"Macofe",
- "Guycn2"
+ "Guycn2",
+ "שמזן"
]
},
"config-desc": "תכנית ההתקנה של מדיה־ויקי",
"config-type-mssql": "Microsoft SQL Server",
"config-support-info": "מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:\n\n$1\n\nאם אינך רואה את מסד הנתונים שלך ברשימה, יש לעקוב אחר ההוראות המקושרות לעיל כדי להפעיל את התמיכה.",
"config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] הוא היעד העיקרי עבור מדיה־ויקי ולו התמיכה הטובה ביותר. מדיה־ויקי עובדת גם עם [{{int:version-db-mariadb-url}} MariaDB] ועם [{{int:version-db-percona-url}} Percona Server], שתואמים ל־MySQL. (ר׳ [http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])",
- "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
+ "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL. (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]).",
"config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)",
"config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
"config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] הוא מסד נתונים עסקי מסחרי לחלונות. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
"config-cache-options": "הגדרות למטמון עצמים (object caching):",
"config-cache-help": "מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.\nלאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.",
"config-cache-none": "ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)",
- "config-cache-accel": "מטמון עצמים (object caching) של PHP‏ (APC‏, XCache או WinCache)",
+ "config-cache-accel": "מטמון עצמים (object caching) של PHP‏ (APC,‏ APCu,‏ XCache או WinCache)",
"config-cache-memcached": "להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)",
"config-memcached-servers": "שרתי Memcached:",
"config-memcached-help": "רשימת כתובות IP ש־Memcached ישתמש בהן.\nיש לרשום כתובת אחת בכל שורה ולציין את הפִּתְחָה (port), למשל:\n 127.0.0.1:11211\n 192.168.1.25:1234",
"config-install-subscribe-fail": "הרישום ל־mediawiki-announce לא הצליח: $1",
"config-install-subscribe-notpossible": "cURL אינה מותקנת ו־<code>allow_url_fopen</code> אינה זמינה.",
"config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי",
+ "config-install-mainpage-exists": "העמוד הראשי כבר קיים, לדלג",
"config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות",
"config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.",
"config-install-done": "<strong>מזל טוב!</strong>\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\n<strong>לתשומת לבך:</strong> אם ההורדה לא תבוצע כעת, קובץ ההגדרות <strong>לא</strong> יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך <strong>[$2 להיכנס לאתר הוויקי שלך]</strong>.",
"config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
"config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
"mainpagetext": "<strong>תוכנת מדיה־ויקי הותקנה בהצלחה.</strong>",
- "mainpagedocfooter": "היעזרו ב[https://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
+ "mainpagedocfooter": "היעזרו ב[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
}
"Vivek Rai",
"Phoenix303",
"संजीव कुमार",
- "Sahilrathod"
+ "Sahilrathod",
+ "Shyamal"
]
},
"config-desc": "साँचा लिए इंस्टॉलर",
"config-localsettings-key": "नवीनीकरण कुंजी",
"config-localsettings-badkey": "आपकी दी गई कुंजी ग़लत है।",
"config-your-language": "आपकी भाषा:",
+ "config-your-language-help": "स्थापन के लिए भाषा चुनें",
"config-wiki-language": "विकी भाषा:",
+ "config-wiki-language-help": "भाषा चुनें जिस में अधिकतर लेख लिखा जाएगा",
"config-back": "← वापस",
"config-continue": "आगे बढ़ें →",
"config-page-language": "भाषा",
"config-logo-help": "Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничникот.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
"config-instantcommons": "Овозможи Instant Commons",
"config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [https://commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
- "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
+ "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде лиценца.\nВнесете го името на лиценцата рачно.",
"config-cc-again": "Одберете повторно...",
"config-cc-not-chosen": "Одберете ја саканата лиценца од Криејтив комонс и стиснете на „proceed“.",
"config-advanced-settings": "Напредни нагодувања",
"config-profile-no-anon": "Account aanmaken verplicht",
"config-profile-fishbowl": "Alleen voor geautoriseerde bewerkers",
"config-profile-private": "Privéwiki",
- "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
+ "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}''' biedt extra verantwoordelijkheid, maar kan toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerken, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
"config-license": "Auteursrechten en licentie:",
"config-license-none": "Geen licentie in de voettekst",
"config-license-cc-by-sa": "Creative Commons Naamsvermelding-Gelijk delen",
"config-help": "помоћ",
"config-help-tooltip": "кликните да проширите",
"mainpagetext": "<strong>Медијавики је успешно инсталиран.</strong>",
- "mainpagedocfooter": "Погледајте [https://meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
+ "mainpagedocfooter": "Погледајте [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
}
continue; // try the other direction
}
} else { // table *may* have >= MAX_OFFSET rows
- // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+ // T44614: "ORDER BY job_random" with a job_random inequality causes high CPU
// in MySQL if there are many rows for some reason. This uses a small OFFSET
// instead of job_random for reducing excess claim retries.
$row = $dbw->selectRow( 'job', self::selectFields(), // find a random job
private function getGlobalKey( $name ) {
$parts = [ 'global', 'jobqueue', $name ];
foreach ( $parts as $part ) {
- if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
- throw new InvalidArgumentException( "Key part characters are out of range." );
- }
+ if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
+ throw new InvalidArgumentException( "Key part characters are out of range." );
+ }
}
return implode( ':', $parts );
wfDebug( __METHOD__ . " : skipping, already good\n" );
}
- // Preserve fragment (bug 14904)
+ // Preserve fragment (T16904)
$newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
$currentDest->getFragment(), $newTitle->getInterwiki() );
$seenTitles[$titleText] = true;
if ( $title->isExternal() ) {
- // If the target is interwiki, we have to break early (bug 40352).
+ // If the target is interwiki, we have to break early (T42352).
// Otherwise it will look up a row in the local page table
// with the namespace/page of the interwiki target which can cause
// unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
);
$this->setLastError( get_class( $e ) . ": " . $e->getMessage() );
// To prevent potential database referential integrity issues.
- // See bug 32551.
+ // See T34551.
MWExceptionHandler::rollbackMasterChangesAndLog( $e );
return false;
* - a) Recursive jobs to update links for backlink pages for a given title.
* These jobs have (recursive:true,table:<table>) set.
* - b) Jobs to update links for a set of pages (the job title is ignored).
- * These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ * These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
* - c) Jobs to update links for a single page (the job title)
* These jobs need no extra fields set.
*
* For example, if templates A and B are edited (at the same time) the queue will have:
* (A base, B base)
* When these jobs run, the queue will have per-title and remnant partition jobs:
- * (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ * (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
*
* This works best when the queue is FIFO, for several reasons:
* - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
'table' => $params['table'],
'range' => [
'start' => $ranges[1][0],
- 'end' => $ranges[count( $ranges ) - 1][1],
+ 'end' => $ranges[count( $ranges ) - 1][1],
'batchSize' => $realBSize,
'subranges' => array_slice( $ranges, 1 )
],
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
// * Otherwise remap the URL to work in generated stylesheets
// Guard against trailing slashes, because "some/remote/../foo.png"
- // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+ // resolves to "some/remote/foo.png" on (some?) clients (T29052).
if ( substr( $remote, -1 ) == '/' ) {
$remote = substr( $remote, 0, -1 );
}
* From http://eprint.iacr.org/2010/264.pdf:
*
* The scheme HKDF is specifed as:
- * HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+ * HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
* where the values K(i) are defined as follows:
- * PRK = HMAC(XTS, SKM)
- * K(1) = HMAC(PRK, CTXinfo || 0);
- * K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+ * PRK = HMAC(XTS, SKM)
+ * K(1) = HMAC(PRK, CTXinfo || 0);
+ * K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
* where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
* the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
* Note that the length of the HMAC output is the same as its key length and therefore
return false;
}
+ MediaWiki\HeaderCallback::warnIfHeadersSent();
if ( $version === null ) {
$version = isset( $_SERVER['SERVER_PROTOCOL'] ) &&
$_SERVER['SERVER_PROTOCOL'] === 'HTTP/1.0' ?
* @return string|null Valid dotted quad IPv4 address or null
*/
public static function canonicalize( $addr ) {
- // remove zone info (bug 35738)
+ // remove zone info (T37738)
$addr = preg_replace( '/\%.*/', '', $addr );
if ( self::isValid( $addr ) ) {
* defined as:
* [
* 0 => object(StatusValue) # the StatusValue with error messages, only
- * 1 => object(StatusValue) # The StatusValue with warning messages, only
+ * 1 => object(StatusValue) # The StatusValue with warning messages, only
* ]
*
* @return StatusValue[]
}
/**
- * Change operation resuklt
+ * Change operation result
*
* @param bool $ok Whether the operation completed
* @param mixed $value
* @ingroup FileBackend
* @author Aaron Schulz
*/
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* @brief Class for a file system (FS) based file backend.
* @ingroup FileBackend
* @author Aaron Schulz
*/
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* @brief Base class for all backends using particular storage medium.
*
* @file
*/
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* Functions related to the output of file content
// good
} elseif ( $rcode === 404 ) {
$status->fatal( 'backend-fail-stream', $params['src'] );
- // Per bug 41113, nasty things can happen if bad cache entries get
+ // Per T43113, nasty things can happen if bad cache entries get
// stuck in cache. It's also possible that this error can come up
// with simple race conditions. Clear out the stat cache to be safe.
$this->clearCache( [ $params['src'] ] );
application/x-director [OFFICE]
text/rtf [OFFICE]
-application/vnd.openxmlformats-officedocument.wordprocessingml.document [OFFICE]
+application/vnd.openxmlformats-officedocument.wordprocessingml.document [OFFICE]
application/vnd.openxmlformats-officedocument.wordprocessingml.template [OFFICE]
-application/vnd.ms-word.document.macroEnabled.12 [OFFICE]
+application/vnd.ms-word.document.macroEnabled.12 [OFFICE]
application/vnd.ms-word.template.macroEnabled.12 [OFFICE]
application/vnd.openxmlformats-officedocument.presentationml.template [OFFICE]
application/vnd.openxmlformats-officedocument.presentationml.slideshow [OFFICE]
protected function doGet( $key, $flags = 0 ) {
$req = [
'method' => 'GET',
- 'url' => $this->url . rawurlencode( $key ),
-
+ 'url' => $this->url . rawurlencode( $key ),
];
+
list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req );
if ( $rcode === 200 ) {
if ( is_string( $rbody ) ) {
*/
protected function serialize( $data ) {
// Serialize anything but integers so INCR/DECR work
- // Do not store integer-like strings as integers to avoid type confusion (bug 60563)
+ // Do not store integer-like strings as integers to avoid type confusion (T62563)
return is_int( $data ) ? $data : serialize( $data );
}
$result = wincache_ucache_set( $key, serialize( $value ), $expire );
/* wincache_ucache_set returns an empty array on success if $value
- was an array, bool otherwise */
+ * was an array, bool otherwise */
return ( is_array( $result ) && $result === [] ) || $result;
}
use Wikimedia\Rdbms\TransactionProfiler;
use Wikimedia\Rdbms\LikeMatch;
use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\ResultWrapper;
use Wikimedia\Rdbms\DBMasterPos;
use Wikimedia\Rdbms\Blob;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* Relational database abstraction object
}
// Add trace comment to the begin of the sql string, right after the operator.
- // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+ // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (T44598)
$commentedSql = preg_replace( '/\s|$/', " /* $fname {$this->agent} */ ", $sql, 1 );
# Start implicit transactions that wrap the request if DBO_TRX is enabled
private function handleSessionLoss() {
$this->mTrxLevel = 0;
- $this->mTrxIdleCallbacks = []; // bug 65263
- $this->mTrxPreCommitCallbacks = []; // bug 65263
+ $this->mTrxIdleCallbacks = []; // T67263
+ $this->mTrxPreCommitCallbacks = []; // T67263
$this->mSessionTempTables = [];
$this->mNamedLocksHeld = [];
try {
$preLimitTail .= $this->makeOrderBy( $options );
- // if (isset($options['LIMIT'])) {
- // $tailOpts .= $this->limitResult('', $options['LIMIT'],
- // isset($options['OFFSET']) ? $options['OFFSET']
- // : false);
- // }
-
if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
$postLimitTail .= ' FOR UPDATE';
}
use Wikimedia\Rdbms\Blob;
use Wikimedia\Rdbms\MssqlBlob;
use Wikimedia\Rdbms\MssqlField;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\MssqlResultWrapper;
/**
* @ingroup Database
use Wikimedia\Rdbms\DBMasterPos;
use Wikimedia\Rdbms\MySQLMasterPos;
use Wikimedia\Rdbms\MySQLField;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* Database abstraction object for MySQL.
* @ingroup Database
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Database abstraction object for PHP extension mysqli.
*
* @file
* @ingroup Database
*/
+use Wikimedia\Timestamp\ConvertibleTimestamp;
use Wikimedia\WaitConditionLoop;
use Wikimedia\Rdbms\Blob;
use Wikimedia\Rdbms\PostgresBlob;
use Wikimedia\Rdbms\PostgresField;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* @ingroup Database
/**
* Prepend our schema (e.g. 'mediawiki') in front
* of the search path
- * Fixes bug 15816
+ * Fixes T17816
*/
$search_path = $this->getSearchPath();
array_unshift( $search_path,
// Normal client
$this->numericVersion = $versionInfo['server'];
} else {
- // Bug 16937: broken pgsql extension from PHP<5.3
+ // T18937: broken pgsql extension from PHP<5.3
$this->numericVersion = pg_parameter_status( $conn, 'server_version' );
}
}
$q = <<<SQL
SELECT 1 FROM pg_class, pg_namespace, pg_trigger
WHERE relnamespace=pg_namespace.oid AND relkind='r'
- AND tgrelid=pg_class.oid
- AND nspname=%s AND relname=%s AND tgname=%s
+ AND tgrelid=pg_class.oid
+ AND nspname=%s AND relname=%s AND tgname=%s
SQL;
$res = $this->query(
sprintf(
$preLimitTail .= $this->makeOrderBy( $options );
- // if ( isset( $options['LIMIT'] ) ) {
- // $tailOpts .= $this->limitResult( '', $options['LIMIT'],
- // isset( $options['OFFSET'] ) ? $options['OFFSET']
- // : false );
- // }
-
if ( isset( $options['FOR UPDATE'] ) ) {
$postLimitTail .= ' FOR UPDATE OF ' .
implode( ', ', array_map( [ $this, 'tableName' ], $options['FOR UPDATE'] ) );
*/
use Wikimedia\Rdbms\Blob;
use Wikimedia\Rdbms\SQLiteField;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* @ingroup Database
use Wikimedia\Rdbms\LikeMatch;
use Wikimedia\Rdbms\DBMasterPos;
use Wikimedia\Rdbms\Field;
+use Wikimedia\Rdbms\IResultWrapper;
/**
* Basic database interface for live and lazy-loaded relation database handles
* member variables.
* If no more rows are available, false is returned.
*
- * @param ResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
+ * @param IResultWrapper|stdClass $res Object as returned from IDatabase::query(), etc.
* @return stdClass|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
* form. Fields are retrieved with $row['fieldname'].
* If no more rows are available, false is returned.
*
- * @param ResultWrapper $res Result object as returned from IDatabase::query(), etc.
+ * @param IResultWrapper $res Result object as returned from IDatabase::query(), etc.
* @return array|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
* @param bool $tempIgnore Whether to avoid throwing an exception on errors...
* maybe best to catch the exception instead?
* @throws DBError
- * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
+ * @return bool|IResultWrapper True for a successful write query, IResultWrapper object
* for a successful read query, or false on failure if $tempIgnore set
*/
public function query( $sql, $fname = __METHOD__, $tempIgnore = false );
*
* [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ]
*
- * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
+ * @return IResultWrapper|bool If the query returned no rows, a IResultWrapper
* with no rows in it will be returned. If there was a query error, a
* DBQueryError exception will be thrown, except if the "ignore errors"
* option was set, in which case false will be returned.
* for the format. Use $conds == "*" to delete all rows
* @param string $fname Name of the calling function
* @throws DBUnexpectedError
- * @return bool|ResultWrapper
+ * @return bool|IResultWrapper
*/
public function delete( $table, $conds, $fname = __METHOD__ );
* @param array $selectOptions Options for the SELECT part of the query, see
* IDatabase::select() for details.
*
- * @return ResultWrapper
+ * @return IResultWrapper
*/
public function insertSelect( $destTable, $srcTable, $varMap, $conds,
$fname = __METHOD__,
<?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
/**
* Overloads the relevant methods of the real ResultsWrapper so it
* doesn't go anywhere near an actual database.
return $this->fetchObject();
}
}
+
+class_alias( FakeResultWrapper::class, 'FakeResultWrapper' );
+
<?php
+
+namespace Wikimedia\Rdbms;
+
+use stdClass;
+
class MssqlResultWrapper extends ResultWrapper {
/** @var integer|null */
private $mSeekTo = null;
<?php
-use Wikimedia\Rdbms\IResultWrapper;
+namespace Wikimedia\Rdbms;
+
+use IDatabase;
+use stdClass;
+use RuntimeException;
/**
* Result wrapper for grabbing data queried from an IDatabase object
return $this->current() !== false;
}
}
+
+class_alias( ResultWrapper::class, 'ResultWrapper' );
$masterPositions = array_fill( 0, count( $lbs ), false );
foreach ( $lbs as $i => $lb ) {
if ( $lb->getServerCount() <= 1 ) {
- // Bug 27975 - Don't try to wait for replica DBs if there are none
+ // T29975 - Don't try to wait for replica DBs if there are none
// Prevents permission error when getting master position
continue;
} elseif ( $opts['ifWritesSince']
+++ /dev/null
-<?php
-/**
- * Creation, parsing, and conversion of timestamps.
- *
- * 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
- * @since 1.20
- * @author Tyler Romeo, 2012
- */
-
-/**
- * Library for creating, parsing, and converting timestamps. Based on the JS
- * library that does the same thing.
- *
- * @since 1.28
- */
-class ConvertibleTimestamp {
- /**
- * Standard gmdate() formats for the different timestamp types.
- */
- private static $formats = [
- TS_UNIX => 'U',
- TS_MW => 'YmdHis',
- TS_DB => 'Y-m-d H:i:s',
- TS_ISO_8601 => 'Y-m-d\TH:i:s\Z',
- TS_ISO_8601_BASIC => 'Ymd\THis\Z',
- TS_EXIF => 'Y:m:d H:i:s', // This shouldn't ever be used, but is included for completeness
- TS_RFC2822 => 'D, d M Y H:i:s',
- TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
- TS_POSTGRES => 'Y-m-d H:i:s',
- ];
-
- /**
- * The actual timestamp being wrapped (DateTime object).
- * @var DateTime
- */
- public $timestamp;
-
- /**
- * Make a new timestamp and set it to the specified time,
- * or the current time if unspecified.
- *
- * @param bool|string|int|float|DateTime $timestamp Timestamp to set, or false for current time
- */
- public function __construct( $timestamp = false ) {
- if ( $timestamp instanceof DateTime ) {
- $this->timestamp = $timestamp;
- } else {
- $this->setTimestamp( $timestamp );
- }
- }
-
- /**
- * Set the timestamp to the specified time, or the current time if unspecified.
- *
- * Parse the given timestamp into either a DateTime object or a Unix timestamp,
- * and then store it.
- *
- * @param string|bool $ts Timestamp to store, or false for now
- * @throws TimestampException
- */
- public function setTimestamp( $ts = false ) {
- $m = [];
- $da = [];
- $strtime = '';
-
- // We want to catch 0, '', null... but not date strings starting with a letter.
- if ( !$ts || $ts === "\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ) {
- $uts = time();
- $strtime = "@$uts";
- } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
- # TS_DB
- } elseif ( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
- # TS_EXIF
- } elseif ( preg_match( '/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D', $ts, $da ) ) {
- # TS_MW
- } elseif ( preg_match( '/^(-?\d{1,13})(\.\d+)?$/D', $ts, $m ) ) {
- # TS_UNIX
- $strtime = "@{$m[1]}"; // https://secure.php.net/manual/en/datetime.formats.compound.php
- } elseif ( preg_match( '/^\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}.\d{6}$/', $ts ) ) {
- # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
- $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
- str_replace( '+00:00', 'UTC', $ts ) );
- } elseif ( preg_match(
- '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
- $ts,
- $da
- ) ) {
- # TS_ISO_8601
- } elseif ( preg_match(
- '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
- $ts,
- $da
- ) ) {
- # TS_ISO_8601_BASIC
- } elseif ( preg_match(
- '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
- $ts,
- $da
- ) ) {
- # TS_POSTGRES
- } elseif ( preg_match(
- '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
- $ts,
- $da
- ) ) {
- # TS_POSTGRES
- } elseif ( preg_match(
- # Day of week
- '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
- # dd Mon yyyy
- '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
- # hh:mm:ss
- '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
- $ts
- ) ) {
- # TS_RFC2822, accepting a trailing comment.
- # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
- # The regex is a superset of rfc2822 for readability
- $strtime = strtok( $ts, ';' );
- } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
- # TS_RFC850
- $strtime = $ts;
- } elseif ( preg_match( '/^[A-Z][a-z]{2} [A-Z][a-z]{2} +\d{1,2} \d\d:\d\d:\d\d \d{4}/', $ts ) ) {
- # asctime
- $strtime = $ts;
- } else {
- throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
- }
-
- if ( !$strtime ) {
- $da = array_map( 'intval', $da );
- $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
- $strtime = call_user_func_array( "sprintf", $da );
- }
-
- try {
- $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
- } catch ( Exception $e ) {
- throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
- }
-
- if ( $final === false ) {
- throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
- }
-
- $this->timestamp = $final;
- }
-
- /**
- * Convert a timestamp string to a given format.
- *
- * @param int $style Constant Output format for timestamp
- * @param string $ts Timestamp
- * @return string|bool Formatted timestamp or false on failure
- */
- public static function convert( $style = TS_UNIX, $ts ) {
- try {
- $ct = new static( $ts );
- return $ct->getTimestamp( $style );
- } catch ( TimestampException $e ) {
- return false;
- }
- }
-
- /**
- * Get the current time in the given format
- *
- * @param int $style Constant Output format for timestamp
- * @return string
- */
- public static function now( $style = TS_MW ) {
- return static::convert( $style, time() );
- }
-
- /**
- * Get the timestamp represented by this object in a certain form.
- *
- * Convert the internal timestamp to the specified format and then
- * return it.
- *
- * @param int $style Constant Output format for timestamp
- * @throws TimestampException
- * @return string The formatted timestamp
- */
- public function getTimestamp( $style = TS_UNIX ) {
- if ( !isset( self::$formats[$style] ) ) {
- throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
- }
-
- $output = $this->timestamp->format( self::$formats[$style] );
-
- if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
- $output .= ' GMT';
- }
-
- if ( $style == TS_MW && strlen( $output ) !== 14 ) {
- throw new TimestampException( __METHOD__ . ': The timestamp cannot be represented in ' .
- 'the specified format' );
- }
-
- return $output;
- }
-
- /**
- * @return string
- */
- public function __toString() {
- return $this->getTimestamp();
- }
-
- /**
- * Calculate the difference between two ConvertibleTimestamp objects.
- *
- * @param ConvertibleTimestamp $relativeTo Base time to calculate difference from
- * @return DateInterval|bool The DateInterval object representing the
- * difference between the two dates or false on failure
- */
- public function diff( ConvertibleTimestamp $relativeTo ) {
- return $this->timestamp->diff( $relativeTo->timestamp );
- }
-
- /**
- * Set the timezone of this timestamp to the specified timezone.
- *
- * @param string $timezone Timezone to set
- * @throws TimestampException
- */
- public function setTimezone( $timezone ) {
- try {
- $this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
- } catch ( Exception $e ) {
- throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
- }
- }
-
- /**
- * Get the timezone of this timestamp.
- *
- * @return DateTimeZone The timezone
- */
- public function getTimezone() {
- return $this->timestamp->getTimezone();
- }
-
- /**
- * Format the timestamp in a given format.
- *
- * @param string $format Pattern to format in
- * @return string The formatted timestamp
- */
- public function format( $format ) {
- return $this->timestamp->format( $format );
- }
-}
+++ /dev/null
-<?php
-
-/**
- * @since 1.20
- */
-class TimestampException extends Exception {
-}
+++ /dev/null
-<?php
-
-/**
- * Unix time - the number of seconds since 1970-01-01 00:00:00 UTC
- */
-define( 'TS_UNIX', 0 );
-
-/**
- * MediaWiki concatenated string timestamp (YYYYMMDDHHMMSS)
- */
-define( 'TS_MW', 1 );
-
-/**
- * MySQL DATETIME (YYYY-MM-DD HH:MM:SS)
- */
-define( 'TS_DB', 2 );
-
-/**
- * RFC 2822 format, for E-mail and HTTP headers
- */
-define( 'TS_RFC2822', 3 );
-
-/**
- * ISO 8601 format with no timezone: 1986-02-09T20:00:00Z
- *
- * This is used by Special:Export
- */
-define( 'TS_ISO_8601', 4 );
-
-/**
- * An Exif timestamp (YYYY:MM:DD HH:MM:SS)
- *
- * @see http://exif.org/Exif2-2.PDF The Exif 2.2 spec, see page 28 for the
- * DateTime tag and page 36 for the DateTimeOriginal and
- * DateTimeDigitized tags.
- */
-define( 'TS_EXIF', 5 );
-
-/**
- * Oracle format time.
- */
-define( 'TS_ORACLE', 6 );
-
-/**
- * Postgres format time.
- */
-define( 'TS_POSTGRES', 7 );
-
-/**
- * ISO 8601 basic format with no timezone: 19860209T200000Z. This is used by ResourceLoader
- */
-define( 'TS_ISO_8601_BASIC', 9 );
private function endElementNested( $elm ) {
/* cur item must be the same as $elm, unless if in MODE_STRUCT
- in which case it could also be rdf:Description */
+ * in which case it could also be rdf:Description */
if ( $this->curItem[0] !== $elm
&& !( $elm === self::NS_RDF . ' Description'
&& $this->mode[0] === self::MODE_STRUCT )
if ( $elm === self::NS_RDF . ' Seq' ) {
array_unshift( $this->mode, self::MODE_LI );
} elseif ( $elm === self::NS_RDF . ' Bag' ) {
- # bug 27105
+ # T29105
$this->logger->info( __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending'
. ' it is a Seq, since some buggy software is known to screw this up.' );
array_unshift( $this->mode, self::MODE_LI );
'choices' => [ '1' => true, '2' => true ],
],
/********
- * Disable extracting this property (bug 31944)
+ * Disable extracting this property (T33944)
* Several files have a string instead of a Seq
* for this property. XMPReader doesn't handle
* mismatched types very gracefully (it marks
* the relavent prop). Since this prop
* doesn't communicate all that useful information
* just disable this prop for now, until such
- * XMPReader is more graceful (bug 32172)
+ * XMPReader is more graceful (T34172)
* 'YCbCrSubSampling' => array(
* 'map_group' => 'exif',
* 'mode' => XMPReader::MODE_SEQ,
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerAwareInterface;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* This contains some static methods for
* @param string $user The user who made the log entries
* @param array $param Associative Array with the following additional options:
* - lim Integer Limit of items to show, default is 50
- * - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+ * - conds Array Extra conditions for the query
+ * (e.g. 'log_action != ' . $dbr->addQuotes( 'revision' ))
* - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty
* if set to true (default), "No matching items in log" is displayed if loglist is empty
* - msgKey Array If you want a nice box with a message, set this to the key of the message.
/**
* Even uglier hack to maintain backwards compatibilty with IRC bots
- * (bug 34508).
+ * (T36508).
* @see getActionText()
* @return string Text
*/
/**
* Even uglier hack to maintain backwards compatibilty with IRC bots
- * (bug 34508).
+ * (T36508).
* @see getActionText()
* @return string Text
*/
} else {
$this->mConds['log_user'] = $userid;
}
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
$user = $this->getUser();
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
} else {
$this->mConds['log_title'] = $title->getDBkey();
}
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
$user = $this->getUser();
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
$pageTitle = $this->title->getPrefixedText();
if ( $this->oldid ) {
- // Always show a link to the diff which triggered the mail. See bug 32210.
+ // Always show a link to the diff which triggered the mail. See T34210.
$keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
$this->title->getCanonicalURL( [ 'diff' => 'next', 'oldid' => $this->oldid ] ) )
->inContentLanguage()->text();
Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
);
- # Replace this after transforming the message, bug 35019
+ # Replace this after transforming the message, T37019
$postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
// Now build message's subject and body
* @param string $subject Email's subject.
* @param string $body Email's text or Array of two strings to be the text and html bodies
* @param array $options:
- * 'replyTo' MailAddress
- * 'contentType' string default 'text/plain; charset=UTF-8'
- * 'headers' array Extra headers to set
+ * 'replyTo' MailAddress
+ * 'contentType' string default 'text/plain; charset=UTF-8'
+ * 'headers' array Extra headers to set
*
* @throws MWException
* @throws Exception
* @param string $subject Email's subject.
* @param string $body Email's text or Array of two strings to be the text and html bodies
* @param array $options:
- * 'replyTo' MailAddress
- * 'contentType' string default 'text/plain; charset=UTF-8'
- * 'headers' array Extra headers to set
+ * 'replyTo' MailAddress
+ * 'contentType' string default 'text/plain; charset=UTF-8'
+ * 'headers' array Extra headers to set
*
* @throws MWException
* @throws Exception
if ( $params['interlace'] ) {
$animation_post = [ '-interlace', 'JPEG' ];
}
- # Sharpening, see bug 6193
+ # Sharpening, see T8193
if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
/ ( $params['srcWidth'] + $params['srcHeight'] )
< $wgSharpenReductionThreshold
// be a total drag. :P
$scene = 0;
} elseif ( $this->isAnimatedImage( $image ) ) {
- // Coalesce is needed to scale animated GIFs properly (bug 1017).
+ // Coalesce is needed to scale animated GIFs properly (T3017).
$animation_pre = [ '-coalesce' ];
// We optimize the output, but -optimize is broken,
- // use optimizeTransparency instead (bug 11822)
+ // use optimizeTransparency instead (T13822)
if ( version_compare( $this->getMagickVersion(), "6.3.5" ) >= 0 ) {
$animation_post = [ '-fuzz', '5%', '-layers', 'optimizeTransparency' ];
}
&& $xcfMeta['colorType'] === 'greyscale-alpha'
&& version_compare( $this->getMagickVersion(), "6.8.9-3" ) < 0
) {
- // bug 66323 - Greyscale images not rendered properly.
+ // T68323 - Greyscale images not rendered properly.
// So only take the "red" channel.
$channelOnly = [ '-channel', 'R', '-separate' ];
$animation_pre = array_merge( $animation_pre, $channelOnly );
$im->readImage( $params['srcPath'] );
if ( $params['mimeType'] == 'image/jpeg' ) {
- // Sharpening, see bug 6193
+ // Sharpening, see T8193
if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
/ ( $params['srcWidth'] + $params['srcHeight'] )
< $wgSharpenReductionThreshold
// be a total drag. :P
$im->setImageScene( 0 );
} elseif ( $this->isAnimatedImage( $image ) ) {
- // Coalesce is needed to scale animated GIFs properly (bug 1017).
+ // Coalesce is needed to scale animated GIFs properly (T3017).
$im = $im->coalesceImages();
}
// GIF interlacing is only available since 6.3.4
$reg = <<<EOR
/\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
((?> # Text to match is composed of atoms of either:
- \\\\. # - any escaped character
- | # - any character different from " and \
- [^"\\\\]+
+ \\\\. # - any escaped character
+ | # - any character different from " and \
+ [^"\\\\]+
)*?)
"\s*\)
| # Or page can be empty ; in this case, djvutxt dumps ()
* @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification
* @file
*/
+use Wikimedia\Timestamp\TimestampException;
/**
* Format Image metadata values into a human readable form.
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
/* This used to use 0 (ExifBitmapHandler::OLD_BROKEN_FILE) for the cases
- * * No metadata in the file
- * * Something is broken in the file.
+ * * No metadata in the file
+ * * Something is broken in the file.
* However, if the metadata support gets expanded then you can't tell if the 0 is from
* a broken file, or just no props found. A broken file is likely to stay broken, but
* a file which had no props could have props once the metadata support is improved.
* @param string $cmd
*/
protected function logErrorForExternalProcess( $retval, $err, $cmd ) {
- # Keep error output limited (bug 57985)
+ # Keep error output limited (T59985)
$errMessage = trim( substr( $err, 0, self::MAX_ERR_LOG_SIZE ) );
wfDebugLog( 'thumbnail',
}
// Expand entities, since Adobe Illustrator uses them for xmlns
- // attributes (bug 31719). Note that libxml2 has some protection
+ // attributes (T33719). Note that libxml2 has some protection
// against large recursive entity expansions so this is not as
// insecure as it might appear to be. However, it is still extremely
// insecure. It's necessary to wrap any read() calls with
// libxml_disable_entity_loader() to avoid arbitrary local file
// inclusion, or even arbitrary code execution if the expect
- // extension is installed (bug 46859).
+ // extension is installed (T48859).
$oldDisable = libxml_disable_entity_loader( true );
$this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
$exptime = $this->convertExpiry( $exptime );
$encExpiry = $db->timestamp( $exptime );
}
- // (bug 24425) use a replace if the db supports it instead of
+ // (T26425) use a replace if the db supports it instead of
// delete/insert to avoid clashes with conflicting keynames
$db->update(
$tableName,
], __METHOD__, 'IGNORE' );
if ( $db->affectedRows() == 0 ) {
- // Race condition. See bug 28611
+ // Race condition. See T30611
$newValue = null;
}
} catch ( DBError $e ) {
$ns = $this->getTitle()->getNamespace();
- # Don't index user and user talk pages for blocked users (bug 11443)
+ # Don't index user and user talk pages for blocked users (T13443)
if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
$specificTarget = null;
$vagueTarget = null;
}
if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
- # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+ # (T16900) site config can override user-defined __INDEX__ or __NOINDEX__
$policy = array_merge(
$policy,
self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
$loggedIn = $this->getContext()->getUser()->isLoggedIn();
if ( $loggedIn || $cache->get( $key ) ) {
$logTypes = [ 'delete', 'move' ];
- $conds = [ "log_action != 'revision'" ];
+
+ $dbr = wfGetDB( DB_REPLICA );
+
+ $conds = [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ];
// Give extensions a chance to hide their (unrelated) log entries
Hooks::run( 'Article::MissingArticleConditions', [ &$conds, $logTypes ] );
LogEventsList::showLogExtract(
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Class for viewing MediaWiki file description pages
*
}
$out->addModuleStyles( [
- 'filepage', // always show the local local Filepage.css, bug 29277
+ 'filepage', // always show the local local Filepage.css, T31277
'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page
] );
}
// this will get messy.
// The dirmark, however, must not be immediately adjacent
// to the filename, because it can get copied with it.
- // See bug 25277.
+ // See T27277.
// @codingStandardsIgnoreStart Ignore long line
$out->addWikiText( <<<EOT
<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
} else {
# Image does not exist
if ( !$this->getId() ) {
+ $dbr = wfGetDB( DB_REPLICA );
+
# No article exists either
# Show deletion log to be consistent with normal articles
LogEventsList::showLogExtract(
$this->getTitle()->getPrefixedText(),
'',
[ 'lim' => 10,
- 'conds' => [ "log_action != 'revision'" ],
+ 'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
'showIfEmpty' => false,
'msgKey' => [ 'moveddeleted-notice' ]
]
* @file
*/
+use Wikimedia\Rdbms\FakeResultWrapper;
+
/**
* Special handling for file pages
*
use \MediaWiki\Logger\LoggerFactory;
use \MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\FakeResultWrapper;
/**
* Class representing a MediaWiki article and history.
* @return WikiPage|null
*/
public static function newFromID( $id, $from = 'fromdb' ) {
- // page id's are never 0 or negative, see bug 61166
+ // page ids are never 0 or negative, see T63166
if ( $id < 1 ) {
return null;
}
$this->mTimestamp = '';
$this->mIsRedirect = false;
$this->mLatest = false;
- // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+ // T59026: do not clear mPreparedEdit since prepareTextForEdit() already checks
// the requested rev ID and content against the cached one for equality. For most
// content types, the output should not change during the lifetime of this cache.
// Clearing it can cause extra parses on edit for no reason.
$this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
$this->mIsRedirect = intval( $data->page_is_redirect );
$this->mLatest = intval( $data->page_latest );
- // Bug 37225: $latest may no longer match the cached latest Revision object.
+ // T39225: $latest may no longer match the cached latest Revision object.
// Double-check the ID of any cached latest Revision object for consistency.
if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
$this->mLastRevision = null;
}
if ( $this->mDataLoadedFrom == self::READ_LOCKING ) {
- // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always
+ // T39225: if session S1 loads the page row FOR UPDATE, the result always
// includes the latest changes committed. This is true even within REPEATABLE-READ
// transactions, where S1 normally only sees changes committed before the first S1
// SELECT. Thus we need S1 to also gets the revision row FOR UPDATE; otherwise, it
$this->getContentHandler()->getModelID() );
}
- // Bug 30711: always use current version when adding a new section
+ // T32711: always use current version when adding a new section
if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
$oldContent = $this->getContent();
} else {
return $status;
} elseif ( !$oldContent ) {
- // Sanity check for bug 37225
+ // Sanity check for T39225
throw new MWException( "Could not find text for current revision {$oldid}." );
}
$dbw->endAtomic( __METHOD__ );
$this->mTimestamp = $now;
} else {
- // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+ // T34948: revision ID must be set to page {{REVISIONID}} and
// related variables correctly. Likewise for {{REVISIONUSER}} (T135261).
$revision->setId( $this->getLatest() );
$revision->setUserIdAndName(
$user = is_null( $user ) ? $wgUser : $user;
// XXX: check $user->getId() here???
- // Use a sane default for $serialFormat, see bug 57026
+ // Use a sane default for $serialFormat, see T59026
if ( $serialFormat === null ) {
$serialFormat = $content->getContentHandler()->getDefaultFormat();
}
// Update the links tables and other secondary data
if ( $content ) {
- $recursive = $options['changed']; // bug 50785
+ $recursive = $options['changed']; // T52785
$updates = $content->getSecondaryDataUpdates(
$this->getTitle(), null, $recursive, $editInfo->output
);
if ( $options['created'] ) {
self::onArticleCreate( $this->mTitle );
- } elseif ( $options['changed'] ) { // bug 50785
+ } elseif ( $options['changed'] ) { // T52785
self::onArticleEdit( $this->mTitle, $revision );
}
$dbw->onTransactionPreCommitOrIdle(
function () use ( $dbw, $logEntry, $logid ) {
- // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+ // T58776: avoid deadlocks (especially from FileDeleteForm)
$logEntry->publish( $logid );
},
__METHOD__
);
// Set patrolling and bot flag on the edits, which gets rollbacked.
- // This is done even on edit failure to have patrolling in that case (bug 62157).
+ // This is done even on edit failure to have patrolling in that case (T64157).
$set = [];
if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
// Mark all reverted edits as bot
* @ingroup Pager
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* IndexPager is an efficient pager which uses a (roughly unique) index in the
* data set to implement paging, rather than a "LIMIT offset,limit" clause.
* @file
* @ingroup Pager
*/
+use Wikimedia\Timestamp\TimestampException;
/**
* IndexPager with a formatted navigation bar
if ( $openMatch || $closeMatch ) {
$pendingPTag = false;
- # @todo bug 5718: paragraph closed
+ # @todo T7718: paragraph closed
$output .= $this->closeParagraph();
if ( $preOpenMatch && !$preCloseMatch ) {
$this->inPre = true;
}
}
}
- # somewhere above we forget to get out of pre block (bug 785)
+ # somewhere above we forget to get out of pre block (T2785)
if ( $preCloseMatch && $this->inPre ) {
$this->inPre = false;
}
}
/**
- * urlencodes a string according to one of three patterns: (bug 22474)
+ * urlencodes a string according to one of three patterns: (T24474)
*
* By default (for HTTP "query" strings), spaces are encoded as '+'.
* Or to encode a value for the HTTP "path", spaces are encoded as '%20'.
$this->targets[self::ISO2] = '[[y-m-d]]';
# Rules
- # pref source target
+ # pref source target
$this->rules[self::DMY][self::MD] = self::DM;
$this->rules[self::ALL][self::MD] = self::MD;
$this->rules[self::MDY][self::DM] = self::MD;
* Get a DateFormatter object
*
* @param Language|string|null $lang In which language to format the date
- * Defaults to the site content language
+ * Defaults to the site content language
* @return DateFormatter
*/
public static function getInstance( $lang = null ) {
$spdash = "(?:-|$space)"; # a dash or a non-newline space
$spaces = "$space++"; # possessive match of 1 or more spaces
$text = preg_replace_callback(
- '!(?: # Start cases
- (<a[ \t\r\n>].*?</a>) | # m[1]: Skip link text
- (<.*?>) | # m[2]: Skip stuff inside
- # HTML elements' . "
- (\b(?i:$prots)($addr$urlChar*)) | # m[3]: Free external links
- # m[4]: Post-protocol path
- \b(?:RFC|PMID) $spaces # m[5]: RFC or PMID, capture number
+ '!(?: # Start cases
+ (<a[ \t\r\n>].*?</a>) | # m[1]: Skip link text
+ (<.*?>) | # m[2]: Skip stuff inside HTML elements' . "
+ (\b # m[3]: Free external links
+ (?i:$prots)
+ ($addr$urlChar*) # m[4]: Post-protocol path
+ ) |
+ \b(?:RFC|PMID) $spaces # m[5]: RFC or PMID, capture number
([0-9]+)\b |
- \bISBN $spaces ( # m[6]: ISBN, capture number
+ \bISBN $spaces ( # m[6]: ISBN, capture number
(?: 97[89] $spdash? )? # optional 13-digit ISBN prefix
(?: [0-9] $spdash? ){9} # 9 digits with opt. delimiters
[0-9Xx] # check digit
// The edit section preference may not be the appropiate one in
// the ParserOutput, as we are not storing it in the parsercache
- // key. Force it here. See bug 31445.
+ // key. Force it here. See T33445.
$value->setEditSectionTokens( $popts->getEditSection() );
$wikiPage = method_exists( $article, 'getPage' )
* when the page is rendered based on the language of the user.
*
* @note When saving, this will return the default language instead of the user's.
- * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
+ * {{int: }} uses this which used to produce inconsistent link tables (T16404).
*
* @return Language
* @since 1.19
return false;
}
- // Important to parse with correct title (bug 31469)
+ // Important to parse with correct title (T33469)
$cat = wfMessage( $msg )
->title( $title )
->inContentLanguage()
* is to assume a direct page view.
*
* The generated DOM tree must depend only on the input text and the flags.
- * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+ * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
*
* Any flag added to the $flags parameter here, or any other parameter liable to cause a
* change in the DOM tree for a given text, must be passed through the section identifier
* included. Default is to assume a direct page view.
*
* The generated DOM tree must depend only on the input text and the flags.
- * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
+ * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of T6899.
*
* Any flag added to the $flags parameter here, or any other parameter liable to cause a
* change in the DOM tree for a given text, must be passed through the section identifier
return false;
}
- // Reduce effects of race conditions for slow parses (bug 46014)
+ // Reduce effects of race conditions for slow parses (T48014)
$cacheTime = wfTimestampNow();
$time = - microtime( true );
}
public function canUse() {
- # Do not log anything if database is readonly (bug 5375)
+ # Do not log anything if database is readonly (T7375)
return !wfReadOnly();
}
/**
* @return array With following keys:
- * 'globals' - variables to be set to $GLOBALS
- * 'defines' - constants to define
- * 'callbacks' - functions to be executed by the registry
- * 'credits' - metadata to be stored by registry
- * 'attributes' - registration info which isn't a global variable
+ * 'globals' - variables to be set to $GLOBALS
+ * 'defines' - constants to define
+ * 'callbacks' - functions to be executed by the registry
+ * 'credits' - metadata to be stored by registry
+ * 'attributes' - registration info which isn't a global variable
*/
public function getExtractedInfo();
* installed extensions in the $credits array.
*
* Example $extDependencies:
- * {
- * 'FooBar' => {
- * 'MediaWiki' => '>= 1.25.0',
- * 'extensions' => {
- * 'FooBaz' => '>= 1.25.0'
- * },
- * 'skins' => {
- * 'BazBar' => '>= 1.0.0'
- * }
- * }
- * }
+ * {
+ * 'FooBar' => {
+ * 'MediaWiki' => '>= 1.25.0',
+ * 'extensions' => {
+ * 'FooBaz' => '>= 1.25.0'
+ * },
+ * 'skins' => {
+ * 'BazBar' => '>= 1.0.0'
+ * }
+ * }
+ * }
*
* @param array $extDependencies All extensions that depend on other ones
* @return array
$module = $this->getModule( $name );
if ( $module ) {
// Do not allow private modules to be loaded from the web.
- // This is a security issue, see bug 34907.
+ // This is a security issue, see T36907.
if ( $module->getGroup() === 'private' ) {
$this->logger->debug( "Request for private module '$name' denied" );
$this->errors[] = "Cannot show private module \"$name\"";
* @return void
*/
protected function sendResponseHeaders( ResourceLoaderContext $context, $etag, $errors ) {
+ \MediaWiki\HeaderCallback::warnIfHeadersSent();
$rlMaxage = $this->config->get( 'ResourceLoaderMaxage' );
// Use a short cache expiry so that updates propagate to clients quickly, if:
// - No version specified (shared resources, e.g. stylesheets)
$styles = (array)$styles;
foreach ( $styles as $style ) {
$style = trim( $style );
- // Don't output an empty "@media print { }" block (bug 40498)
+ // Don't output an empty "@media print { }" block (T42498)
if ( $style !== '' ) {
// Transform the media type based on request params and config
// The way that this relies on $wgRequest to propagate request params is slightly evil
*/
public function getLessCompiler( $extraVars = [] ) {
// When called from the installer, it is possible that a required PHP extension
- // is missing (at least for now; see bug 47564). If this is the case, throw an
+ // is missing (at least for now; see T49564). If this is the case, throw an
// exception (caught by the installer) to prevent a fatal error later on.
if ( !class_exists( 'Less_Parser' ) ) {
throw new MWException( 'MediaWiki requires the less.php parser' );
// Special handling for the user group; because users might change their stuff
// on-wiki like user pages, or user preferences; we need to find the highest
// timestamp of these user-changeable modules so we can ensure cache misses on change
- // This should NOT be done for the site group (bug 27564) because anons get that too
+ // This should NOT be done for the site group (T29564) because anons get that too
// and we shouldn't be putting timestamps in CDN-cached HTML
if ( $group === 'user' ) {
// Must setModules() before makeVersionQuery()
if ( $this->direction === null ) {
$this->direction = $this->getRequest()->getRawVal( 'dir' );
if ( !$this->direction ) {
- // Determine directionality based on user language (bug 6100)
+ // Determine directionality based on user language (T8100)
$this->direction = Language::factory( $this->getLanguage() )->getDir();
}
}
&& substr( rtrim( $scripts ), -1 ) !== ';'
) {
// Append semicolon to prevent weird bugs caused by files not
- // terminating their statements right (bug 27054)
+ // terminating their statements right (T29054)
$scripts .= ";\n";
}
}
if ( $context->shouldIncludeStyles() ) {
$styles = [];
// Don't create empty stylesheets like [ '' => '' ] for modules
- // that don't *have* any stylesheets (bug 38024).
+ // that don't *have* any stylesheets (T40024).
$stylePairs = $this->getStyles( $context );
if ( count( $stylePairs ) ) {
// If we are in debug mode without &only= set, we'll want to return an array of URLs
'wgSearchType' => $conf->get( 'SearchType' ),
'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
// Force object to avoid "empty" associative array from
- // becoming [] instead of {} in JS (bug 34604)
+ // becoming [] instead of {} in JS (T36604)
'wgActionPaths' => (object)$conf->get( 'ActionPaths' ),
'wgServer' => $conf->get( 'Server' ),
'wgServerName' => $conf->get( 'ServerName' ),
return true;
}
- // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+ // T70488: For other modules (i.e. ones that are called in cached html output) only check
// page existance. This ensures that, if some pages in a module are temporarily blanked,
// we don't end omit the module's script or link tag on some pages.
return count( $revisions ) === 0;
* @ingroup RevisionDelete
*/
+use Wikimedia\Rdbms\FakeResultWrapper;
+
/**
* List for revision table items
*
public function merge( SearchIndexField $that ) {
// TODO: which definitions may be compatible?
if ( ( $that instanceof self ) && $this->type === $that->type &&
- $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
+ $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
) {
return $that;
}
<?php
+
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* This class is used for different SQL-based search engines shipped with MediaWiki
* @ingroup Search
*
* The return value is such that someone could theoretically do this:
* @code
- * foreach ( $provider->getVaryHeaders() as $header => $options ) {
- * $outputPage->addVaryHeader( $header, $options );
- * }
+ * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+ * $outputPage->addVaryHeader( $header, $options );
+ * }
* @endcode
*
* @return array
*
* The return value is such that someone could theoretically do this:
* @code
- * foreach ( $provider->getVaryHeaders() as $header => $options ) {
- * $outputPage->addVaryHeader( $header, $options );
- * }
+ * foreach ( $provider->getVaryHeaders() as $header => $options ) {
+ * $outputPage->addVaryHeader( $header, $options );
+ * }
* @endcode
*
* @protected For use by \MediaWiki\Session\SessionManager only
* @param string $languageCode
*/
public function setLanguageCode( $languageCode ) {
+ if ( !Language::isValidCode( $languageCode ) ) {
+ throw new InvalidArgumentException( "$languageCode is not a valid language code." );
+ }
$this->languageCode = $languageCode;
}
*
* If a "data" key is present, it must be an array, where the keys represent
* the data-xxx properties with their provided values. For example,
- * $item['data'] = [
- * 'foo' => 1,
- * 'bar' => 'baz',
- * ];
+ * $item['data'] = [
+ * 'foo' => 1,
+ * 'bar' => 'baz',
+ * ];
* will render as element properties:
- * data-foo='1' data-bar='baz'
+ * data-foo='1' data-bar='baz'
*
* @param array $options Can be used to affect the output of a link.
* Possible options are:
if ( $title->isSpecialPage() ) {
$type = 'ns-special';
- // bug 23315: provide a class based on the canonical special page name without subpages
+ // T25315: provide a class based on the canonical special page name without subpages
list( $canonicalName ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
if ( $canonicalName ) {
$type .= ' ' . Sanitizer::escapeClass( "mw-special-$canonicalName" );
$html = htmlspecialchars( $icon["alt"] );
}
if ( $url ) {
- $html = Html::rawElement( 'a', [ "href" => $url ], $html );
+ global $wgExternalLinkTarget;
+ $html = Html::rawElement( 'a',
+ [ "href" => $url, "target" => $wgExternalLinkTarget ],
+ $html );
}
}
return $html;
$line = array_map( 'trim', explode( '|', $line, 2 ) );
if ( count( $line ) !== 2 ) {
// Second sanity check, could be hit by people doing
- // funky stuff with parserfuncs... (bug 33321)
+ // funky stuff with parserfuncs... (T35321)
continue;
}
$attribs = [];
if ( !is_null( $tooltip ) ) {
- # Bug 25462: undo double-escaping.
+ # T27462: undo double-escaping.
$tooltip = Sanitizer::decodeCharReferences( $tooltip );
$attribs['title'] = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
->inLanguage( $lang )->text();
/* set up the default links for the personal toolbar */
$personal_urls = [];
- # Due to bug 32276, if a user does not have read permissions,
+ # Due to T34276, if a user does not have read permissions,
# $this->getTitle() will just give Special:Badtitle, which is
# not especially useful as a returnto parameter. Use the title
# from the request instead, if there was one.
'text' => $this->msg( 'pt-userlogout' )->text(),
'href' => self::makeSpecialUrl( 'Userlogout',
// userlogout link must always contain an & character, otherwise we might not be able
- // to detect a buggy precaching proxy (bug 17790)
+ // to detect a buggy precaching proxy (T19790)
$title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto ),
'active' => false
];
$content_navigation['namespaces']['special'] = [
'class' => 'selected',
'text' => $this->msg( 'nstab-special' )->text(),
- 'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510
+ 'href' => $request->getRequestURL(), // @see: T4457, T4510
'context' => 'subject'
];
* @ingroup SpecialPage
*/
use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* Special page which uses a ChangesList to show query results.
$operator = $opts['invert'] ? '!=' : '=';
$boolean = $opts['invert'] ? 'AND' : 'OR';
- // Namespace association (bug 2429)
+ // Namespace association (T4429)
if ( !$opts['associated'] ) {
$condition = "rc_namespace $operator $selectedNS";
} else {
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Variant of QueryPage which uses a gallery to output results, thus
* suited for reports generating images
# 1. When switching accounts, it sucks to get automatically logged out
# 2. Do not return to PasswordReset after a successful password change
- # but goto Wiki start page (Main_Page) instead ( bug 33997 )
+ # but goto Wiki start page (Main_Page) instead ( T35997 )
$returnToTitle = Title::newFromText( $this->mReturnTo );
if ( is_object( $returnToTitle )
&& ( $returnToTitle->isSpecial( 'Userlogout' )
*/
protected function getFakeTemplate( $msg, $msgType ) {
global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
- $wgSecureLogin, $wgPasswordResetRoutes;
+ $wgSecureLogin, $wgPasswordResetRoutes;
// make a best effort to get the value of fields which used to be fixed in the old login
// template but now might or might not exist depending on what providers are used
$user = $this->getUser();
$template = new FakeAuthTemplate();
- // Pre-fill username (if not creating an account, bug 44775).
+ // Pre-fill username (if not creating an account, T46775).
if ( $data->mUsername == '' && $this->isSignup() ) {
if ( $user->isLoggedIn() ) {
$data->mUsername = $user->getName();
$resetLink = $this->isSignup()
? null
: is_array( $wgPasswordResetRoutes )
- && in_array( true, array_values( $wgPasswordResetRoutes ), true );
+ && in_array( true, array_values( $wgPasswordResetRoutes ), true );
$template->set( 'header', '' );
$template->set( 'formheader', '' );
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Variant of QueryPage which formats the result as a simple link to the page
*
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* This is a class for doing query pages; since they're almost all the same,
* we factor out some of the functionality into a superclass, and let
$value = wfTimestamp( TS_UNIX,
$row->value );
} else {
- $value = intval( $row->value ); // @bug 14414
+ $value = intval( $row->value ); // T16414
}
} else {
$value = 0;
return [ null, null ];
}
- if ( !isset( $bits[1] ) ) { // bug 2087
+ if ( !isset( $bits[1] ) ) { // T4087
$par = null;
} else {
$par = $bits[1];
// @todo FIXME: Redirects broken due to this call
$bits = explode( '/', $title->getDBkey(), 2 );
$name = $bits[0];
- if ( !isset( $bits[1] ) ) { // bug 2087
+ if ( !isset( $bits[1] ) ) { // T4087
$par = null;
} else {
$par = $bits[1];
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Class definition for a wanted query page like
* WantedPages, WantedTemplates, etc
protected function checkExecutePermissions( User $user ) {
parent::checkExecutePermissions( $user );
- # bug 15810: blocked admins should have limited access here
+ # T17810: blocked admins should have limited access here
$status = self::checkUnblockSelf( $this->target, $user );
if ( $status !== true ) {
throw new ErrorPageError( 'badaccess', $status );
}
// If the username was hidden (ipb_deleted == 1), don't show the reason
- // unless this user also has rights to hideuser: Bug 35839
+ // unless this user also has rights to hideuser: T37839
if ( !$block->mHideName || $this->getUser()->isAllowed( 'hideuser' ) ) {
$fields['Reason']['default'] = $block->mReason;
} else {
$blockNotConfirmed = !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
&& $data['PreviousTarget'] !== $target );
- # Special case for API - bug 32434
+ # Special case for API - T34434
$reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
# Show form unless the user is already aware of this...
$logEntry->setComment( $data['Reason'][0] );
$logEntry->setPerformer( $performer );
$logEntry->setParameters( $logParams );
- # Relate log ID to block IDs (bug 25763)
+ # Relate log ID to block IDs (T27763)
$blockIds = array_merge( [ $status['id'] ], $status['autoIds'] );
$logEntry->setRelations( [ 'ipb_id' => $blockIds ] );
$logId = $logEntry->insert();
}
/**
- * bug 15810: blocked admins should not be able to block/unblock
+ * T17810: blocked admins should not be able to block/unblock
* others, and probably shouldn't be able to unblock themselves
* either.
* @param User|int|string $user
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page listing redirects to non existent page. Those should be
* fixed to point to an existing page.
[ 'page' => $userpage->getPrefixedText() ]
);
- # Suppression log link (bug 59120)
+ # Suppression log link (T61120)
if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
$tools['log-suppression'] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Log', 'suppress' ),
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page listing redirects to redirecting page.
* The software will automatically not follow double redirects, to prevent loops.
'conds' => [
'ra.rd_from = pa.page_id',
- // Filter out redirects where the target goes interwiki (bug 40353).
+ // Filter out redirects where the target goes interwiki (T42353).
// This isn't an optimization, it is required for correct results,
// otherwise a non-double redirect like Bar -> w:Foo will show up
// like "Bar -> Foo -> w:Foo".
* HTMLMultiSelectField throws validation errors if we get input data
* that doesn't match the data set in the form setup. This causes
* problems if something gets removed from the watchlist while the
- * form is open (bug 32126), but we know that invalid items will
+ * form is open (T34126), but we know that invalid items will
* be harmless so we can override it here.
*
* @param string $value The value the field was submitted with
$user = $this->getUser();
// To prevent cross-site scripting attacks, don't show the preview if raw HTML is
- // allowed and a valid edit token is not provided (bug 71111). However, MediaWiki
+ // allowed and a valid edit token is not provided (T73111). However, MediaWiki
// does not currently provide logged-out users with CSRF protection; in that case,
// do not show the preview unless anonymous editing is allowed.
if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
$pages = array_keys( $pageSet );
- // Normalize titles to the same format and remove dupes, see bug 17374
+ // Normalize titles to the same format and remove dupes, see T19374
foreach ( $pages as $k => $v ) {
$pages[$k] = str_replace( " ", "_", $v );
}
$exporter->allPages();
} else {
foreach ( $pages as $page ) {
- # Bug 8824: Only export pages the user can read
+ # T10824: Only export pages the user can read
$title = Title::newFromText( $page );
if ( is_null( $title ) ) {
// @todo Perhaps output an <error> tag or something.
* @author Brion Vibber
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Special:LinkSearch to search the external-links table.
* @ingroup SpecialPage
* @author Brian Wolff
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Special:ListDuplicatedFiles Lists all files where the current version is
* a duplicate of the current version of some other file.
* @author Rob Church <robchur@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Special:Listredirects - Lists all the redirects on the wiki.
* @ingroup SpecialPage
# Some log types are only for a 'User:' title but we might have been given
# only the username instead of the full title 'User:username'. This part try
- # to lookup for a user by that name and eventually fix user input. See bug 1697.
+ # to lookup for a user by that name and eventually fix user input. See T3697.
if ( in_array( $opts->getValue( 'type' ), self::getLogTypesOnUser() ) ) {
# ok we have a type of log which expect a user title.
$target = Title::newFromText( $opts->getValue( 'page' ) );
* @author Brian Wolff
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* @ingroup SpecialPage
*/
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page that list pages that have highest category count
*
* @author Umherirrender
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page that listed pages that have highest interwiki count
*
* @author Rob Church <robchur@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page to show pages ordered by the number of pages linking to them.
*
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A querypage to show categories ordered in descending order by the pages in them
*
* @author Rob Church <robchur@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Special page lists templates with a large number of
* transclusion links, i.e. "most used" templates
$request = $this->getRequest();
$target = !is_null( $par ) ? $par : $request->getVal( 'target' );
- // Yes, the use of getVal() and getText() is wanted, see bug 20365
+ // Yes, the use of getVal() and getText() is wanted, see T22365
$oldTitleText = $request->getVal( 'wpOldTitle', $target );
$this->oldTitle = Title::newFromText( $oldTitleText );
// a redirect to the new title. This is not safe, but what we did before was
// even worse: we just determined whether a redirect should have been created,
// and reported that it was created if it should have, without any checks.
- // Also note that isRedirect() is unreliable because of bug 37209.
+ // Also note that isRedirect() is unreliable because of T39209.
$msgName = 'movepage-moved-redirect';
} else {
$msgName = 'movepage-moved-noredirect';
$newPageName = preg_replace(
'#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
- StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
+ StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # T23234
$oldSubpage->getDBkey()
);
$newNs = $nt->getSubjectPage()->getNamespace();
}
- # Bug 14385: we need makeTitleSafe because the new page names may
+ # T16385: we need makeTitleSafe because the new page names may
# be longer than 255 characters.
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
if ( !$newSubpage ) {
$showme = $from;
}
- // Bug 27864: if transcluded, show all pages instead of the form.
+ // T29864: if transcluded, show all pages instead of the form.
if ( $this->including() || $showme != '' || $ns !== null ) {
$this->showPrefixChunk( $namespace, $showme, $from );
} else {
* @ingroup SpecialPage
*/
-use MediaWiki\Linker\LinkRenderer;
-
/**
* A special page that lists protected pages
*
return 'maintenance';
}
}
-
-/**
- * @todo document
- * @ingroup Pager
- */
-class ProtectedPagesPager extends TablePager {
- public $mForm, $mConds;
- private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
-
- /**
- * @var LinkRenderer
- */
- private $linkRenderer;
-
- /**
- * @param SpecialProtectedpages $form
- * @param array $conds
- * @param $type
- * @param $level
- * @param $namespace
- * @param string $sizetype
- * @param int $size
- * @param bool $indefonly
- * @param bool $cascadeonly
- * @param bool $noredirect
- * @param LinkRenderer $linkRenderer
- */
- function __construct( $form, $conds = [], $type, $level, $namespace,
- $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
- LinkRenderer $linkRenderer
- ) {
- $this->mForm = $form;
- $this->mConds = $conds;
- $this->type = ( $type ) ? $type : 'edit';
- $this->level = $level;
- $this->namespace = $namespace;
- $this->sizetype = $sizetype;
- $this->size = intval( $size );
- $this->indefonly = (bool)$indefonly;
- $this->cascadeonly = (bool)$cascadeonly;
- $this->noredirect = (bool)$noredirect;
- $this->linkRenderer = $linkRenderer;
- parent::__construct( $form->getContext() );
- }
-
- function preprocessResults( $result ) {
- # Do a link batch query
- $lb = new LinkBatch;
- $userids = [];
-
- foreach ( $result as $row ) {
- $lb->add( $row->page_namespace, $row->page_title );
- // field is nullable, maybe null on old protections
- if ( $row->log_user !== null ) {
- $userids[] = $row->log_user;
- }
- }
-
- // fill LinkBatch with user page and user talk
- if ( count( $userids ) ) {
- $userCache = UserCache::singleton();
- $userCache->doQuery( $userids, [], __METHOD__ );
- foreach ( $userids as $userid ) {
- $name = $userCache->getProp( $userid, 'name' );
- if ( $name !== false ) {
- $lb->add( NS_USER, $name );
- $lb->add( NS_USER_TALK, $name );
- }
- }
- }
-
- $lb->execute();
- }
-
- function getFieldNames() {
- static $headers = null;
-
- if ( $headers == [] ) {
- $headers = [
- 'log_timestamp' => 'protectedpages-timestamp',
- 'pr_page' => 'protectedpages-page',
- 'pr_expiry' => 'protectedpages-expiry',
- 'log_user' => 'protectedpages-performer',
- 'pr_params' => 'protectedpages-params',
- 'log_comment' => 'protectedpages-reason',
- ];
- foreach ( $headers as $key => $val ) {
- $headers[$key] = $this->msg( $val )->text();
- }
- }
-
- return $headers;
- }
-
- /**
- * @param string $field
- * @param string $value
- * @return string HTML
- * @throws MWException
- */
- function formatValue( $field, $value ) {
- /** @var $row object */
- $row = $this->mCurrentRow;
-
- switch ( $field ) {
- case 'log_timestamp':
- // when timestamp is null, this is a old protection row
- if ( $value === null ) {
- $formatted = Html::rawElement(
- 'span',
- [ 'class' => 'mw-protectedpages-unknown' ],
- $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
- );
- } else {
- $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
- $value, $this->getUser() ) );
- }
- break;
-
- case 'pr_page':
- $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if ( !$title ) {
- $formatted = Html::element(
- 'span',
- [ 'class' => 'mw-invalidtitle' ],
- Linker::getInvalidTitleDescription(
- $this->getContext(),
- $row->page_namespace,
- $row->page_title
- )
- );
- } else {
- $formatted = $this->linkRenderer->makeLink( $title );
- }
- if ( !is_null( $row->page_len ) ) {
- $formatted .= $this->getLanguage()->getDirMark() .
- ' ' . Html::rawElement(
- 'span',
- [ 'class' => 'mw-protectedpages-length' ],
- Linker::formatRevisionSize( $row->page_len )
- );
- }
- break;
-
- case 'pr_expiry':
- $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
- $value, /* User preference timezone */true ) );
- $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
- $changeProtection = $this->linkRenderer->makeKnownLink(
- $title,
- $this->msg( 'protect_change' )->text(),
- [],
- [ 'action' => 'unprotect' ]
- );
- $formatted .= ' ' . Html::rawElement(
- 'span',
- [ 'class' => 'mw-protectedpages-actions' ],
- $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
- );
- }
- break;
-
- case 'log_user':
- // when timestamp is null, this is a old protection row
- if ( $row->log_timestamp === null ) {
- $formatted = Html::rawElement(
- 'span',
- [ 'class' => 'mw-protectedpages-unknown' ],
- $this->msg( 'protectedpages-unknown-performer' )->escaped()
- );
- } else {
- $username = UserCache::singleton()->getProp( $value, 'name' );
- if ( LogEventsList::userCanBitfield(
- $row->log_deleted,
- LogPage::DELETED_USER,
- $this->getUser()
- ) ) {
- if ( $username === false ) {
- $formatted = htmlspecialchars( $value );
- } else {
- $formatted = Linker::userLink( $value, $username )
- . Linker::userToolLinks( $value, $username );
- }
- } else {
- $formatted = $this->msg( 'rev-deleted-user' )->escaped();
- }
- if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
- $formatted = '<span class="history-deleted">' . $formatted . '</span>';
- }
- }
- break;
-
- case 'pr_params':
- $params = [];
- // Messages: restriction-level-sysop, restriction-level-autoconfirmed
- $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
- if ( $row->pr_cascade ) {
- $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
- }
- $formatted = $this->getLanguage()->commaList( $params );
- break;
-
- case 'log_comment':
- // when timestamp is null, this is an old protection row
- if ( $row->log_timestamp === null ) {
- $formatted = Html::rawElement(
- 'span',
- [ 'class' => 'mw-protectedpages-unknown' ],
- $this->msg( 'protectedpages-unknown-reason' )->escaped()
- );
- } else {
- if ( LogEventsList::userCanBitfield(
- $row->log_deleted,
- LogPage::DELETED_COMMENT,
- $this->getUser()
- ) ) {
- $formatted = Linker::formatComment( $value !== null ? $value : '' );
- } else {
- $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
- }
- if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
- $formatted = '<span class="history-deleted">' . $formatted . '</span>';
- }
- }
- break;
-
- default:
- throw new MWException( "Unknown field '$field'" );
- }
-
- return $formatted;
- }
-
- function getQueryInfo() {
- $conds = $this->mConds;
- $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
- ' OR pr_expiry IS NULL';
- $conds[] = 'page_id=pr_page';
- $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
-
- if ( $this->sizetype == 'min' ) {
- $conds[] = 'page_len>=' . $this->size;
- } elseif ( $this->sizetype == 'max' ) {
- $conds[] = 'page_len<=' . $this->size;
- }
-
- if ( $this->indefonly ) {
- $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
- $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
- }
- if ( $this->cascadeonly ) {
- $conds[] = 'pr_cascade = 1';
- }
- if ( $this->noredirect ) {
- $conds[] = 'page_is_redirect = 0';
- }
-
- if ( $this->level ) {
- $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
- }
- if ( !is_null( $this->namespace ) ) {
- $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
- }
-
- return [
- 'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
- 'fields' => [
- 'pr_id',
- 'page_namespace',
- 'page_title',
- 'page_len',
- 'pr_type',
- 'pr_level',
- 'pr_expiry',
- 'pr_cascade',
- 'log_timestamp',
- 'log_user',
- 'log_comment',
- 'log_deleted',
- ],
- 'conds' => $conds,
- 'join_conds' => [
- 'log_search' => [
- 'LEFT JOIN', [
- 'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
- ]
- ],
- 'logging' => [
- 'LEFT JOIN', [
- 'ls_log_id = log_id'
- ]
- ]
- ]
- ];
- }
-
- protected function getTableClass() {
- return parent::getTableClass() . ' mw-protectedpages';
- }
-
- function getIndexField() {
- return 'pr_id';
- }
-
- function getDefaultSort() {
- return 'pr_id';
- }
-
- function isFieldSortable( $field ) {
- // no index for sorting exists
- return false;
- }
-}
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* A special page that lists last changes made to the wiki
$panel[] = $form;
$panelString = implode( "\n", $panel );
+ // Insert a placeholder for RCFilters
+ if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
+ $this->getOutput()->addHTML(
+ Html::element(
+ 'div',
+ [ 'class' => 'rcfilters-container' ]
+ )
+ );
+ }
+
$this->getOutput()->addHTML(
Xml::fieldset(
$this->msg( 'recentchanges-legend' )->text(),
parent::addModules();
$out = $this->getOutput();
$out->addModules( 'mediawiki.special.recentchanges' );
- if ( $this->getUser()->getOption(
- 'rcenhancedfilters',
- /*default=*/ null,
- /*ignoreHidden=*/ true
- )
- ) {
+ if ( $this->getUser()->getOption( 'rcenhancedfilters' ) ) {
$out->addModules( 'mediawiki.rcfilters.filters.ui' );
+ $out->addModuleStyles( 'mediawiki.rcfilters.filters.base.styles' );
}
}
function makeOptionsLink( $title, $override, $options, $active = false ) {
$params = $override + $options;
- // Bug 36524: false values have be converted to "0" otherwise
+ // T38524: false values have be converted to "0" otherwise
// wfArrayToCgi() will omit it them.
foreach ( $params as &$value ) {
if ( $value === false ) {
$title = new HtmlArmor( '<strong>' . htmlspecialchars( $title ) . '</strong>' );
}
- return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [], $params );
+ return $this->getLinkRenderer()->makeKnownLink( $this->getPageTitle(), $title, [
+ 'data-params' => json_encode( $override ),
+ 'data-keys' => implode( ',', array_keys( $override ) ),
+ ], $params );
}
/**
function filterOnUserExperienceLevel( &$tables, &$conds, &$join_conds, $opts ) {
global $wgLearnerEdits,
- $wgExperiencedUserEdits,
- $wgLearnerMemberSince,
- $wgExperiencedUserMemberSince;
+ $wgExperiencedUserEdits,
+ $wgLearnerMemberSince,
+ $wgExperiencedUserMemberSince;
$selectedExpLevels = explode( ',', strtolower( $opts['userExpLevel'] ) );
// remove values that are not recognized
* @ingroup SpecialPage
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* SpecialShortpages extends QueryPage. It is used to return the shortest
* pages in the database.
if ( !$msg->isDisabled() ) {
$descriptionHtml = $this->msg( 'parentheses' )->rawParams( $msg->parse() )
->escaped();
- $text .= "<br />" .
- Html::rawElement( 'small', [ 'class' => 'mw-statistic-desc' ],
- " $descriptionHtml" );
+ $text .= "<br />" . Html::rawElement(
+ 'small',
+ [ 'class' => 'mw-statistic-desc' ],
+ " $descriptionHtml"
+ );
}
}
return [ [ 'ipb_cant_unblock', $target ] ];
}
- # bug 15810: blocked admins should have limited access here. This
+ # T17810: blocked admins should have limited access here. This
# won't allow sysops to remove autoblocks on themselves, but they
# should have ipblock-exempt anyway
$status = SpecialBlock::checkUnblockSelf( $target, $performer );
* @ingroup SpecialPage
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* Used to show archived pages and eventually restore them.
# Does this page already exist? We'll have to update it...
$article = WikiPage::factory( $this->title );
- # Load latest data for the current page (bug 31179)
+ # Load latest data for the current page (T33179)
$article->loadPageData( 'fromdbmaster' );
$oldcountable = $article->isCountable();
}
/**
- * A should come before Z (bug 30907)
+ * A should come before Z (T32907)
* @return bool
*/
function sortDescending() {
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* A special page that displays a list of pages that are not on anyones watchlist.
*
$desiredTitleObj = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
$delNotice = ''; // empty by default
if ( $desiredTitleObj instanceof Title && !$desiredTitleObj->exists() ) {
+ $dbr = wfGetDB( DB_REPLICA );
+
LogEventsList::showLogExtract( $delNotice, [ 'delete', 'move' ],
$desiredTitleObj,
'', [ 'lim' => 10,
- 'conds' => [ "log_action != 'revision'" ],
+ 'conds' => [ 'log_action != ' . $dbr->addQuotes( 'revision' ) ],
'showIfEmpty' => false,
'msgKey' => [ 'upload-recreate-warning' ] ]
);
header( "Content-Type: $contentType", true );
header( 'Content-Transfer-Encoding: binary', true );
header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
- // Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
+ // T55032 - It shouldn't be a problem here, but let's be safe and not cache
header( 'Cache-Control: private' );
header( "Content-Length: $size", true );
}
function execute( $par ) {
/**
* Some satellite ISPs use broken precaching schemes that log people out straight after
- * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
+ * they're logged in (T19790). Luckily, there's a way to detect such requests.
*/
if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&' ) !== false ) {
wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
}
$targetUser = $this->mFetchedUser;
- if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
- $targetUser->clearInstanceCache(); // bug 38989
+ if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (T63252)
+ $targetUser->clearInstanceCache(); // T40989
}
if ( $request->getVal( 'conflictcheck-originalgroups' )
* KLUGE: The results may contain false positives for files
* that exist e.g. in a shared repo. Setting this at least
* keeps them from showing up as redlinks in the output, even
- * if it doesn't fix the real problem (bug 6220).
+ * if it doesn't fix the real problem (T8220).
*
* @note could also have existing links here from broken file
* redirects.
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
/**
* A special page that lists last changes made to the wiki,
* @ingroup Pager
*/
+use Wikimedia\Rdbms\FakeResultWrapper;
+
/**
* Use TablePager for prettified output. We have to pretend that we're
* getting data from a table when in fact not all of it comes from the database.
* @ingroup Pager
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
class BlockListPager extends TablePager {
* @ingroup Pager
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
class ContribsPager extends ReverseChronologicalPager {
$user = $this->getUser();
$conds = array_merge( $userCond, $this->getNamespaceCond() );
- // Paranoia: avoid brute force searches (bug 17342)
+ // Paranoia: avoid brute force searches (T19342)
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$conds[] = $this->mDb->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0';
} elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
if ( $row->rev_parent_id === null ) {
// For some reason rev_parent_id isn't populated for this row.
- // Its rumoured this is true on wikipedia for some revisions (bug 34922).
+ // Its rumoured this is true on wikipedia for some revisions (T36922).
// Next best thing is to have the total number of bytes.
$chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
$chardiff .= Linker::formatRevisionSize( $row->rev_len );
* @ingroup Pager
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
class DeletedContribsPager extends IndexPager {
list( $index, $userCond ) = $this->getUserCond();
$conds = array_merge( $userCond, $this->getNamespaceCond() );
$user = $this->getUser();
- // Paranoia: avoid brute force searches (bug 17792)
+ // Paranoia: avoid brute force searches (T19792)
if ( !$user->isAllowed( 'deletedhistory' ) ) {
$conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
} elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
* @ingroup Pager
*/
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
class ImageListPager extends TablePager {
$imgfile = $this->msg( 'imgfile' )->text();
}
- // Weird files can maybe exist? Bug 22227
+ // Weird files can maybe exist? T24227
$filePage = Title::makeTitleSafe( NS_FILE, $value );
if ( $filePage ) {
$link = $linkRenderer->makeKnownLink(
--- /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 Pager
+ */
+
+use \MediaWiki\Linker\LinkRenderer;
+
+/**
+ * @todo document
+ */
+class ProtectedPagesPager extends TablePager {
+ public $mForm, $mConds;
+ private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
+
+ /**
+ * @var LinkRenderer
+ */
+ private $linkRenderer;
+
+ /**
+ * @param SpecialProtectedpages $form
+ * @param array $conds
+ * @param $type
+ * @param $level
+ * @param $namespace
+ * @param string $sizetype
+ * @param int $size
+ * @param bool $indefonly
+ * @param bool $cascadeonly
+ * @param bool $noredirect
+ * @param LinkRenderer $linkRenderer
+ */
+ function __construct( $form, $conds = [], $type, $level, $namespace,
+ $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false, $noredirect = false,
+ LinkRenderer $linkRenderer
+ ) {
+ $this->mForm = $form;
+ $this->mConds = $conds;
+ $this->type = ( $type ) ? $type : 'edit';
+ $this->level = $level;
+ $this->namespace = $namespace;
+ $this->sizetype = $sizetype;
+ $this->size = intval( $size );
+ $this->indefonly = (bool)$indefonly;
+ $this->cascadeonly = (bool)$cascadeonly;
+ $this->noredirect = (bool)$noredirect;
+ $this->linkRenderer = $linkRenderer;
+ parent::__construct( $form->getContext() );
+ }
+
+ function preprocessResults( $result ) {
+ # Do a link batch query
+ $lb = new LinkBatch;
+ $userids = [];
+
+ foreach ( $result as $row ) {
+ $lb->add( $row->page_namespace, $row->page_title );
+ // field is nullable, maybe null on old protections
+ if ( $row->log_user !== null ) {
+ $userids[] = $row->log_user;
+ }
+ }
+
+ // fill LinkBatch with user page and user talk
+ if ( count( $userids ) ) {
+ $userCache = UserCache::singleton();
+ $userCache->doQuery( $userids, [], __METHOD__ );
+ foreach ( $userids as $userid ) {
+ $name = $userCache->getProp( $userid, 'name' );
+ if ( $name !== false ) {
+ $lb->add( NS_USER, $name );
+ $lb->add( NS_USER_TALK, $name );
+ }
+ }
+ }
+
+ $lb->execute();
+ }
+
+ function getFieldNames() {
+ static $headers = null;
+
+ if ( $headers == [] ) {
+ $headers = [
+ 'log_timestamp' => 'protectedpages-timestamp',
+ 'pr_page' => 'protectedpages-page',
+ 'pr_expiry' => 'protectedpages-expiry',
+ 'log_user' => 'protectedpages-performer',
+ 'pr_params' => 'protectedpages-params',
+ 'log_comment' => 'protectedpages-reason',
+ ];
+ foreach ( $headers as $key => $val ) {
+ $headers[$key] = $this->msg( $val )->text();
+ }
+ }
+
+ return $headers;
+ }
+
+ /**
+ * @param string $field
+ * @param string $value
+ * @return string HTML
+ * @throws MWException
+ */
+ function formatValue( $field, $value ) {
+ /** @var $row object */
+ $row = $this->mCurrentRow;
+
+ switch ( $field ) {
+ case 'log_timestamp':
+ // when timestamp is null, this is a old protection row
+ if ( $value === null ) {
+ $formatted = Html::rawElement(
+ 'span',
+ [ 'class' => 'mw-protectedpages-unknown' ],
+ $this->msg( 'protectedpages-unknown-timestamp' )->escaped()
+ );
+ } else {
+ $formatted = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+ $value, $this->getUser() ) );
+ }
+ break;
+
+ case 'pr_page':
+ $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+ if ( !$title ) {
+ $formatted = Html::element(
+ 'span',
+ [ 'class' => 'mw-invalidtitle' ],
+ Linker::getInvalidTitleDescription(
+ $this->getContext(),
+ $row->page_namespace,
+ $row->page_title
+ )
+ );
+ } else {
+ $formatted = $this->linkRenderer->makeLink( $title );
+ }
+ if ( !is_null( $row->page_len ) ) {
+ $formatted .= $this->getLanguage()->getDirMark() .
+ ' ' . Html::rawElement(
+ 'span',
+ [ 'class' => 'mw-protectedpages-length' ],
+ Linker::formatRevisionSize( $row->page_len )
+ );
+ }
+ break;
+
+ case 'pr_expiry':
+ $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
+ $value, /* User preference timezone */true ) );
+ $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+ if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+ $changeProtection = $this->linkRenderer->makeKnownLink(
+ $title,
+ $this->msg( 'protect_change' )->text(),
+ [],
+ [ 'action' => 'unprotect' ]
+ );
+ $formatted .= ' ' . Html::rawElement(
+ 'span',
+ [ 'class' => 'mw-protectedpages-actions' ],
+ $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped()
+ );
+ }
+ break;
+
+ case 'log_user':
+ // when timestamp is null, this is a old protection row
+ if ( $row->log_timestamp === null ) {
+ $formatted = Html::rawElement(
+ 'span',
+ [ 'class' => 'mw-protectedpages-unknown' ],
+ $this->msg( 'protectedpages-unknown-performer' )->escaped()
+ );
+ } else {
+ $username = UserCache::singleton()->getProp( $value, 'name' );
+ if ( LogEventsList::userCanBitfield(
+ $row->log_deleted,
+ LogPage::DELETED_USER,
+ $this->getUser()
+ ) ) {
+ if ( $username === false ) {
+ $formatted = htmlspecialchars( $value );
+ } else {
+ $formatted = Linker::userLink( $value, $username )
+ . Linker::userToolLinks( $value, $username );
+ }
+ } else {
+ $formatted = $this->msg( 'rev-deleted-user' )->escaped();
+ }
+ if ( LogEventsList::isDeleted( $row, LogPage::DELETED_USER ) ) {
+ $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+ }
+ }
+ break;
+
+ case 'pr_params':
+ $params = [];
+ // Messages: restriction-level-sysop, restriction-level-autoconfirmed
+ $params[] = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
+ if ( $row->pr_cascade ) {
+ $params[] = $this->msg( 'protect-summary-cascade' )->escaped();
+ }
+ $formatted = $this->getLanguage()->commaList( $params );
+ break;
+
+ case 'log_comment':
+ // when timestamp is null, this is an old protection row
+ if ( $row->log_timestamp === null ) {
+ $formatted = Html::rawElement(
+ 'span',
+ [ 'class' => 'mw-protectedpages-unknown' ],
+ $this->msg( 'protectedpages-unknown-reason' )->escaped()
+ );
+ } else {
+ if ( LogEventsList::userCanBitfield(
+ $row->log_deleted,
+ LogPage::DELETED_COMMENT,
+ $this->getUser()
+ ) ) {
+ $formatted = Linker::formatComment( $value !== null ? $value : '' );
+ } else {
+ $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
+ }
+ if ( LogEventsList::isDeleted( $row, LogPage::DELETED_COMMENT ) ) {
+ $formatted = '<span class="history-deleted">' . $formatted . '</span>';
+ }
+ }
+ break;
+
+ default:
+ throw new MWException( "Unknown field '$field'" );
+ }
+
+ return $formatted;
+ }
+
+ function getQueryInfo() {
+ $conds = $this->mConds;
+ $conds[] = 'pr_expiry > ' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
+ ' OR pr_expiry IS NULL';
+ $conds[] = 'page_id=pr_page';
+ $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
+
+ if ( $this->sizetype == 'min' ) {
+ $conds[] = 'page_len>=' . $this->size;
+ } elseif ( $this->sizetype == 'max' ) {
+ $conds[] = 'page_len<=' . $this->size;
+ }
+
+ if ( $this->indefonly ) {
+ $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+ $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
+ }
+ if ( $this->cascadeonly ) {
+ $conds[] = 'pr_cascade = 1';
+ }
+ if ( $this->noredirect ) {
+ $conds[] = 'page_is_redirect = 0';
+ }
+
+ if ( $this->level ) {
+ $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
+ }
+ if ( !is_null( $this->namespace ) ) {
+ $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+ }
+
+ return [
+ 'tables' => [ 'page', 'page_restrictions', 'log_search', 'logging' ],
+ 'fields' => [
+ 'pr_id',
+ 'page_namespace',
+ 'page_title',
+ 'page_len',
+ 'pr_type',
+ 'pr_level',
+ 'pr_expiry',
+ 'pr_cascade',
+ 'log_timestamp',
+ 'log_user',
+ 'log_comment',
+ 'log_deleted',
+ ],
+ 'conds' => $conds,
+ 'join_conds' => [
+ 'log_search' => [
+ 'LEFT JOIN', [
+ 'ls_field' => 'pr_id', 'ls_value = ' . $this->mDb->buildStringCast( 'pr_id' )
+ ]
+ ],
+ 'logging' => [
+ 'LEFT JOIN', [
+ 'ls_log_id = log_id'
+ ]
+ ]
+ ]
+ ];
+ }
+
+ protected function getTableClass() {
+ return parent::getTableClass() . ' mw-protectedpages';
+ }
+
+ function getIndexField() {
+ return 'pr_id';
+ }
+
+ function getDefaultSort() {
+ return 'pr_id';
+ }
+
+ function isFieldSortable( $field ) {
+ // no index for sorting exists
+ return false;
+ }
+}
* @return string
*/
function formatRow( $row ) {
- if ( $row->user_id == 0 ) { # Bug 16487
+ if ( $row->user_id == 0 ) { # T18487
return '';
}
* Regex borrowed from Tim Starling's "remex-html" project.
*/
const VALID_COMMENT_REGEX = "~ !--
- ( # 1. Comment match detector
+ ( # 1. Comment match detector
> | -> | # Invalid short close
( # 2. Comment contents
(?:
( # 3. Comment close
--> | # Normal close
--!> | # Comment end bang
- ( # 4. Indicate matches requiring EOF
- --! | # EOF in comment end bang state
- -- | # EOF in comment end state
- - | # EOF in comment end dash state
- # EOF in comment state
+ ( # 4. Indicate matches requiring EOF
+ --! | # EOF in comment end bang state
+ -- | # EOF in comment end state
+ - | # EOF in comment end dash state
+ (?#nothing) # EOF in comment state
)
)
)
- ([^<]*) \z # 5. Non-tag text after the comment
+ ([^<]*) \z # 5. Non-tag text after the comment
~xs";
/**
* @param string $srcPath The source path
* @return string|bool The real path if it was a virtual URL Returns false on failure
*/
- function getRealPath( $srcPath ) {
+ public function getRealPath( $srcPath ) {
$repo = RepoGroup::singleton()->getLocalRepo();
if ( $repo->isVirtualUrl( $srcPath ) ) {
/** @todo Just make uploads work with storage paths UploadFromStash
*
* @param array $entry
*/
- function zipEntryCallback( $entry ) {
+ public function zipEntryCallback( $entry ) {
$names = [ $entry['name'] ];
// If there is a null character, cut off the name at it, because JDK's
return $this->mTitle;
}
- // Windows may be broken with special characters, see bug 1780
+ // Windows may be broken with special characters, see T3780
if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
&& !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
) {
}
// Some browsers will interpret obscure xml encodings as UTF-8, while
- // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
+ // PHP/expat will interpret the given encoding in the xml declaration (T49304)
if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
if ( self::checkXMLEncodingMissmatch( $file ) ) {
return true;
[ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
);
if ( $check->wellFormed !== true ) {
- // Invalid xml (bug 58553)
- // But only when non-partial (bug 65724)
+ // Invalid xml (T60553)
+ // But only when non-partial (T67724)
return $partial ? false : [ 'uploadinvalidxml' ];
} elseif ( $check->filterMatch ) {
if ( $this->mSVGNSError ) {
* @return bool (true if the filter identified something bad)
*/
public static function checkSvgPICallback( $target, $data ) {
- // Don't allow external stylesheets (bug 57550)
+ // Don't allow external stylesheets (T59550)
if ( preg_match( '/xml-stylesheet/i', $target ) ) {
return [ 'upload-scripted-pi-callback' ];
}
list( $namespace, $strippedElement ) = $this->splitXmlNamespace( $element );
// We specifically don't include:
- // http://www.w3.org/1999/xhtml (bug 60771)
+ // http://www.w3.org/1999/xhtml (T62771)
static $validNamespaces = [
'',
'adobe:ns:meta/',
$firstUser = $users[0];
if ( !$firstUser instanceof User || !$firstUser->getId() ) {
- // Don't parse username as wikitext (bug 65501)
+ // Don't parse username as wikitext (T67501)
return StatusValue::newFatal( wfMessage( 'nosuchuser', wfEscapeWikiText( $username ) ) );
}
wfEscapeWikiText( $firstUser->getName() ) ) );
}
- // We need to have a valid IP address for the hook, but per bug 18347, we should
+ // We need to have a valid IP address for the hook, but per T20347, we should
// send the user's name if they're logged in.
$ip = $performingUser->getRequest()->getIP();
if ( !$ip ) {
// Ensure that the username isn't longer than 235 bytes, so that
// (at least for the builtin skins) user javascript and css files
- // will work. (bug 23080)
+ // will work. (T25080)
if ( strlen( $name ) > 235 ) {
wfDebugLog( 'username', __METHOD__ .
": '$name' invalid due to length" );
}
// Clean up name according to title rules,
- // but only when validation is requested (bug 12654)
+ // but only when validation is requested (T14654)
$t = ( $validate !== false ) ?
Title::newFromText( $name, NS_USER ) : Title::makeTitle( NS_USER, $name );
// Check for invalid titles
}
}
- // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+ // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
if ( !$block instanceof Block
&& $wgApplyIpBlocksToXff
&& $ip !== null
$found = false;
// @todo FIXME: IPv6 ??? (https://bugs.php.net/bug.php?id=33170)
if ( IP::isIPv4( $ip ) ) {
- // Reverse IP, bug 21255
+ // Reverse IP, T23255
$ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
foreach ( (array)$bases as $base ) {
*/
public function getExperienceLevel() {
global $wgLearnerEdits,
- $wgExperiencedUserEdits,
- $wgLearnerMemberSince,
- $wgExperiencedUserMemberSince;
+ $wgExperiencedUserEdits,
+ $wgLearnerMemberSince,
+ $wgExperiencedUserMemberSince;
if ( $this->isAnon() ) {
return false;
* }
* // do something with $user...
*
- * However, this was vulnerable to a race condition (bug 16020). By
+ * However, this was vulnerable to a race condition (T18020). By
* initialising the user object if the user exists, we aim to support this
* calling sequence as far as possible.
*
return $this->mBlock;
}
- # bug 13611: if the IP address the user is trying to create an account from is
+ # T15611: if the IP address the user is trying to create an account from is
# blocked with createaccount disabled, prevent new account creation there even
# when the user is logged in
if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
* @note Since these URLs get dropped directly into emails, using the
* short English names avoids insanely long URL-encoded links, which
* also sometimes can get corrupted in some browsers/mailers
- * (bug 6957 with Gmail and Internet Explorer).
+ * (T8957 with Gmail and Internet Explorer).
*
* @param string $page Special page
* @param string $token Token
# Note that the pattern requirement will always be satisfied if the
# input is empty, so we need required in all cases.
- # @todo FIXME: Bug 23769: This needs to not claim the password is required
+ # @todo FIXME: T25769: This needs to not claim the password is required
# if e-mail confirmation is being used. Since HTML5 input validation
# is b0rked anyway in some browsers, just return nothing. When it's
# re-enabled, fix this code to not output required for e-mail
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
abstract class UserArray implements Iterator {
/**
* @param ResultWrapper $res
/**
* @param array $ids
- * @return UserArrayFromResult
+ * @return UserArrayFromResult|ArrayIterator
*/
static function newFromIDs( $ids ) {
$ids = array_map( 'intval', (array)$ids ); // paranoia
/**
* @since 1.25
* @param array $names
- * @return UserArrayFromResult
+ * @return UserArrayFromResult|ArrayIterator
*/
static function newFromNames( $names ) {
$names = array_map( 'strval', (array)$names ); // paranoia
* @file
*/
+use Wikimedia\Rdbms\ResultWrapper;
+
class UserArrayFromResult extends UserArray implements Countable {
/** @var ResultWrapper */
public $res;
/** @var int */
public $key;
- /** @var bool|stdClass */
+ /** @var bool|User */
public $current;
/**
$this->classes[] = $this->alias['name'];
$this->alias = null;
$this->startToken = null;
+ } elseif ( !is_array( $token ) || (
+ $token[0] !== T_STRING &&
+ $token[0] !== T_DOUBLE_COLON &&
+ $token[0] !== T_CLASS &&
+ $token[0] !== T_WHITESPACE
+ ) ) {
+ // Ignore this call to class_alias() - compat/Timestamp.php
+ $this->alias = null;
+ $this->startToken = null;
}
}
break;
* `=` conditions while the final key uses a `>` condition
*
* Example output:
- * [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
+ * [ '( foo = 42 AND bar > 7 ) OR ( foo > 42 )' ]
*
* @return array The SQL conditions necessary to select the next set
* of rows in the batched query
* From http://eprint.iacr.org/2010/264.pdf:
*
* The scheme HKDF is specifed as:
- * HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
+ * HKDF(XTS, SKM, CTXinfo, L) = K(1) || K(2) || ... || K(t)
* where the values K(i) are defined as follows:
- * PRK = HMAC(XTS, SKM)
- * K(1) = HMAC(PRK, CTXinfo || 0);
- * K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
+ * PRK = HMAC(XTS, SKM)
+ * K(1) = HMAC(PRK, CTXinfo || 0);
+ * K(i+1) = HMAC(PRK, K(i) || CTXinfo || i), 1 <= i < t;
* where t = [L/k] and the value K(t) is truncated to its first d = L mod k bits;
* the counter i is non-wrapping and of a given fixed size, e.g., a single byte.
* Note that the length of the HMAC output is the same as its key length and therefore
* the date preference they're supposed to use, it should be used in
* all children.
*
- *<code>
- * function timeanddate([...], $format = true) {
- * $datePreference = $this->dateFormat($format);
- * [...]
- * }
- *</code>
+ * function timeanddate([...], $format = true) {
+ * $datePreference = $this->dateFormat($format);
+ * [...]
+ * }
*
* @param int|string|bool $usePrefs If true, the user's preference is used
* if false, the site/language default is used
public function parseFormattedNumber( $number ) {
$s = $this->digitTransformTable();
if ( $s ) {
- // eliminate empty array values such as ''. (bug 64347)
+ // eliminate empty array values such as ''. (T66347)
$s = array_filter( $s );
$number = strtr( $number, array_flip( $s ) );
}
$s = $this->separatorTransformTable();
if ( $s ) {
- // eliminate empty array values such as ''. (bug 64347)
+ // eliminate empty array values such as ''. (T66347)
$s = array_filter( $s );
$number = strtr( $number, array_flip( $s ) );
}
$string = $ellipsis . $string;
}
}
- # Do not truncate if the ellipsis makes the string longer/equal (bug 22181).
+ # Do not truncate if the ellipsis makes the string longer/equal (T24181).
# This check is *not* redundant if $adjustLength, due to the single case where
# LEN($ellipsis) > ABS($limit arg); $stringOriginal could be shorter than $string.
if ( strlen( $string ) < strlen( $stringOriginal ) ) {
// '+' add rules for alltext
// 'E' the gave flags is error
// these flags above are reserved for program
- 'A' => 'A', // add rule for convert code (all text convert)
- 'T' => 'T', // title convert
- 'R' => 'R', // raw content
- 'D' => 'D', // convert description (subclass implement)
- '-' => '-', // remove convert (not implement)
- 'H' => 'H', // add rule for convert code (but no display in placed code)
- 'N' => 'N' // current variant name
+ 'A' => 'A', // add rule for convert code (all text convert)
+ 'T' => 'T', // title convert
+ 'R' => 'R', // raw content
+ 'D' => 'D', // convert description (subclass implement)
+ '-' => '-', // remove convert (not implement)
+ 'H' => 'H', // add rule for convert code (but no display in placed code)
+ 'N' => 'N', // current variant name
];
$this->mFlags = array_merge( $defaultflags, $flags );
foreach ( $this->mVariants as $v ) {
}
/* we convert everything except:
- 1. HTML markups (anything between < and >)
- 2. HTML entities
- 3. placeholders created by the parser
- */
+ * 1. HTML markups (anything between < and >)
+ * 2. HTML entities
+ * 3. placeholders created by the parser
+ */
$marker = '|' . Parser::MARKER_PREFIX . '[\-a-zA-Z0-9]+';
// this one is needed when the text is inside an HTML markup
protected function applyManualConv( $convRule ) {
// Use syntax -{T|zh-cn:TitleCN; zh-tw:TitleTw}- to custom
// title conversion.
- // Bug 24072: $mConvRuleTitle was overwritten by other manual
+ // T26072: $mConvRuleTitle was overwritten by other manual
// rule(s) not for title, this breaks the title conversion.
$newConvRuleTitle = $convRule->getTitle();
if ( $newConvRuleTitle ) {
// text should be splited by ";" only if a valid variant
// name exist after the markup, for example:
// -{zh-hans:<span style="font-size:120%;">xxx</span>;zh-hant:\
- // <span style="font-size:120%;">yyy</span>;}-
+ // <span style="font-size:120%;">yyy</span>;}-
// we should split it as:
// [
- // [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
- // [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
- // [2] => ''
+ // [0] => 'zh-hans:<span style="font-size:120%;">xxx</span>'
+ // [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
+ // [2] => ''
// ]
$pat = '/;\s*(?=';
foreach ( $this->mVariants as $variant ) {
class LanguageAr extends Language {
/**
- * Temporary hack for bug 9413: replace Arabic presentation forms with their
+ * Temporary hack for T11413: replace Arabic presentation forms with their
* standard equivalents.
*
* @todo FIXME: This is language-specific for now only to avoid the negative
*
* Possible values for the type of genitive are:
* Sing, Iehr prepositioned genitive = possessive dative
- * Vun, Fon, -omitted- postpositioned genitive
- * = preposition "vun" with dative
+ * Vun, Fon, -omitted- postpositioned genitive = preposition "vun" with dative
*
* Values of case overrides & prepositions, in the order of preceedence:
* Sing, Iehr possessive dative = prepositioned genitive
- * Vun, Fon preposition "vun" with dative
- * = postpositioned genitive
+ * Vun, Fon preposition "vun" with dative = postpositioned genitive
* En, em preposition "en" with dative
*
* Values for object gender specifiers of the possessive dative, or
case 'genitive':
// only a few declensions, and even for those mostly the singular only
$in = [
- '/u[ms]$/', # 2nd declension singular
- '/ommunia$/', # 3rd declension neuter plural (partly)
- '/a$/', # 1st declension singular
+ '/u[ms]$/', # 2nd declension singular
+ '/ommunia$/', # 3rd declension neuter plural (partly)
+ '/a$/', # 1st declension singular
'/libri$/', '/nuntii$/', '/datae$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
];
$out = [
'i',
case 'accusative':
// only a few declensions, and even for those mostly the singular only
$in = [
- '/u[ms]$/', # 2nd declension singular
- '/a$/', # 1st declension singular
- '/ommuniam$/', # 3rd declension neuter plural (partly)
+ '/u[ms]$/', # 2nd declension singular
+ '/a$/', # 1st declension singular
+ '/ommuniam$/', # 3rd declension neuter plural (partly)
'/libri$/', '/nuntii$/', '/datam$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
];
$out = [
'um',
case 'ablative':
// only a few declensions, and even for those mostly the singular only
$in = [
- '/u[ms]$/', # 2nd declension singular
- '/ommunia$/', # 3rd declension neuter plural (partly)
- '/a$/', # 1st declension singular
- '/libri$/', '/nuntii$/', '/data$/', # 2nd declension plural (partly)
- '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
- '/es$/' # 5th declension singular
+ '/u[ms]$/', # 2nd declension singular
+ '/ommunia$/', # 3rd declension neuter plural (partly)
+ '/a$/', # 1st declension singular
+ '/libri$/', '/nuntii$/', '/data$/', # 2nd declension plural (partly)
+ '/tio$/', '/ns$/', '/as$/', # 3rd declension singular (partly)
+ '/es$/' # 5th declension singular
];
$out = [
'o',
* Temporary hack for the issue described at
* http://permalink.gmane.org/gmane.science.linguistics.wikipedia.technical/46396
* Convert Unicode 5.0 style Malayalam input to Unicode 5.1. Similar to
- * bug 9413. Also fixes miscellaneous problems due to mishandling of ZWJ,
- * e.g. bug 11162.
+ * T11413. Also fixes miscellaneous problems due to mishandling of ZWJ,
+ * e.g. T13162.
*
* @todo FIXME: This is language-specific for now only to avoid the negative
* performance impact of enabling it for all languages.
* Turkish has two different i, one with a dot and another without a dot. They
* are totally different letters in this language, so we have to override the
* ucfirst and lcfirst methods.
- * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I
- * and @bug 28040
+ * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040
* @ingroup Language
*/
class LanguageTr extends Language {
'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
'am' => 'አማርኛ', # Amharic
'an' => 'aragonés', # Aragonese
- 'ang' => 'Ænglisc', # Old English, bug 23283
+ 'ang' => 'Ænglisc', # Old English, T25283
'anp' => 'अङ्गिका', # Angika
'ar' => 'العربية', # Arabic
'arc' => 'ܐܪܡܝܐ', # Aramaic
'lus' => 'Mizo ţawng', # Mizo/Lushai
'luz' => 'لئری دوٙمینی', # Southern Luri
'lv' => 'latviešu', # Latvian
- 'lzh' => '文言', # Literary Chinese, bug 8217
+ 'lzh' => '文言', # Literary Chinese, T10217
'lzz' => 'Lazuri', # Laz
'mai' => 'मैथिली', # Maithili
'map-bms' => 'Basa Banyumasan', # Banyumasan
'mzn' => 'مازِرونی', # Mazanderani
'na' => 'Dorerin Naoero', # Nauruan
'nah' => 'Nāhuatl', # Nahuatl (not in ISO 639-3)
- 'nan' => 'Bân-lâm-gú', # Min-nan, bug 8217
- 'nap' => 'Napulitano', # Neapolitan, bug 43793
+ 'nan' => 'Bân-lâm-gú', # Min-nan, T10217
+ 'nap' => 'Napulitano', # Neapolitan, T45793
'nb' => 'norsk bokmål', # Norwegian (Bokmal)
'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
'olo' => 'Livvinkarjala', # Livvi-Karelian
'om' => 'Oromoo', # Oromo
'or' => 'ଓଡ଼ିଆ', # Oriya
- 'os' => 'Ирон', # Ossetic, bug 29091
+ 'os' => 'Ирон', # Ossetic, T31091
'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
'pag' => 'Pangasinan', # Pangasinan
'pam' => 'Kapampangan', # Pampanga
'za' => 'Vahcuengh', # Zhuang
'zea' => 'Zeêuws', # Zeeuws/Zeaws
'zh' => '中文', # (Zhōng Wén) - Chinese
- 'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
+ 'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see T10217)
'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
- 'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
+ 'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see T10217)
'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
- 'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
+ 'zh-yue' => '粵語', # Cantonese -- (see T10217)
'zu' => 'isiZulu' # Zulu
];
}
"Macofe",
"WhatamIdoing",
"Hogweard",
- "Amire80"
+ "Amire80",
+ "Pyscowicz"
]
},
"tog-underline": "Mearc under hlencan:",
"morenotlisted": "Þis getæl meaht bēon unfulfyled.",
"mypage": "Mīn tramet",
"mytalk": "Mīn mōtung",
- "anontalk": "Þisses IP naman mōtung",
+ "anontalk": "Mōtung",
"navigation": "Þurhfōr",
"and": " and",
"qbfind": "Findan",
"searcharticle": "Gān",
"history": "Trametes stǣr",
"history_short": "Stǣr",
+ "history_small": "stǣr",
"updatedmarker": "nīwod æfter mīnre lætestan sōcne",
"printableversion": "Ūtmǣlendlicu fadung",
"permalink": "Fæst hlenca",
"nstab-template": "Bysen",
"nstab-help": "Helpes tramet",
"nstab-category": "Flocc",
+ "mainpage-nstab": "Hēafodtramet",
"nosuchaction": "Swilc dǣd ne biþ nā",
"nosuchactiontext": "Sēo þe se nettfrumfinded wile dōn nis genge.\nÞū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.\nÞis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.",
"nosuchspecialpage": "Swilc syndrig tramet ne biþ nā",
"oldpassword": "Eald þafungword:",
"newpassword": "Nīwe þafungword:",
"retypenew": "Wrīt nīwe þafungword eft:",
+ "botpasswords-label-create": "Scieppan",
+ "botpasswords-label-update": "Nīƿa",
"resetpass-submit-loggedin": "Andwendan þafungword",
"resetpass-submit-cancel": "Undōn",
"passwordreset": "Settan þafungword eft",
"searchprofile-everything-tooltip": "Sēcan geond ealla innunga (ēac mōtungum)",
"searchprofile-advanced-tooltip": "Sēcan on mā namsteda",
"search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
- "search-redirect": "(edlǣded fram \"$1\")",
+ "search-redirect": "(edlǣded fram $1)",
"search-section": "(dǣl $1)",
"search-suggest": "Mǣnst þū: $1",
"search-interwiki-caption": "Sweostorweorc",
"contributions": "{{GENDER:$1|Brūcendes}} forðunga",
"contributions-title": "Brūcendes forðunga for $1",
"mycontris": "Mīna forðunga",
+ "anoncontribs": "forðunga",
"contribsub2": "For {{GENDER:$3|$1}} ($2)",
"uctop": "(genge)",
"month": "Fram mōnþe (and ǣr)",
"logentry-move-move": "$1 {{GENDER:$2|wæg}} þone tramet $3 tō $4",
"logentry-newusers-create": "Brūcendes grīma $1 wæs {{GENDER:$2|geworht}}",
"revdelete-summary": "ādihtscortnes",
- "searchsuggest-search": "Sēcan",
+ "searchsuggest-search": "Sēcan {{SITENAME}}",
"special-characters-group-latin": "Lǣden",
"special-characters-group-latinextended": "Ēacnod Lǣden",
"special-characters-group-symbols": "Tācnu",
"rcfilters-invalid-filter": "مرشح غير صحيح",
"rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
"rcfilters-filterlist-title": "مرشحات",
+ "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
+ "rcfilters-highlightbutton-title": "التعليم على النتائج",
+ "rcfilters-highlightmenu-title": "اختر لونًا",
"rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
"rcfilters-filtergroup-registration": "تسجيل المستخدم",
"rcfilters-filter-registered-label": "مسجل",
"editcomment": "ملخص التعديل كان:<em>$1</em>.",
"revertpage": "استرجع تعديلات [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]]) حتى آخر مراجعة ل[[User:$1|$1]]",
"revertpage-nouser": "استرجع تعديلات مستخدم مخفي حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "استرجع تعديلات $1؛\nاسترجع حتى آخر نسخة بواسطة $2.",
+ "rollback-success": "استرجع تعديلات {{GENDER:$3|$1}}؛\nاسترجع حتى آخر نسخة بواسطة {{GENDER:$4|$2}}.",
"rollback-success-notify": "تم استرجاع التعديلات بواسطة $1;\nتم التغيير إلى آخر مراجعة بواسطة $2. [$3 عرض التغييرات]",
"sessionfailure-title": "فشل في الجلسة",
"sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
"selfredirect": "<strong>Atención:</strong> Tas redirixendo esta páxina a ella mesma.\nSeique conseñaras un oxetivu enquivocáu pa la redireición, o que teas editando una páxina enquivocada. Si vuelves a facer clic en «{{int:savearticle}}», crearáse la redireición de toles maneres.",
"missingcommenttext": "Por favor, escribi un comentariu abaxo.",
"missingcommentheader": "<strong>Recordatoriu:</strong> Nun conseñasti un asuntu pa esti comentariu.\nSi calques nuevamente «{{int:savearticle}}», la to edición guardaráse ensin nengunu.",
- "summary-preview": "Vista previa del resume:",
+ "summary-preview": "Vista previa del resume d'edición:",
"subject-preview": "Vista previa del asuntu:",
"previewerrortext": "Hebo un error al intentar entever los cambios.",
"blockedtitle": "L'usuariu ta bloquiáu",
"rcfilters-invalid-filter": "Filtru inválidu",
"rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
"rcfilters-filterlist-title": "Filtros",
+ "rcfilters-highlightbutton-title": "Resaltar resultaos",
+ "rcfilters-highlightmenu-title": "Seleiciona un color",
"rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
"rcfilters-filtergroup-registration": "Rexistru del usuariu",
"rcfilters-filter-registered-label": "Rexistraos",
"editcomment": "El resume de la edición yera: <em>$1</em>.",
"revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
"revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
+ "rollback-success": "Revertíes les ediciones de {{GENDER:$3|$1}}; devueltu a la última revisión de {{GENDER:$4|$2}}.",
"rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
"sessionfailure-title": "Fallu de sesión",
"sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
"changeemail-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
"changeemail-oldemail": "Цяперашні адрас электроннай пошты:",
"changeemail-newemail": "Новы адрас электроннай пошты:",
- "changeemail-newemail-help": "Ð\9fоле Ñ\82Ñ\80Ñ\8dба пакÑ\96нÑ\83Ñ\86Ñ\8c пÑ\83Ñ\81Ñ\82Ñ\8bм, калÑ\96 вÑ\8b Ñ\85оÑ\87аÑ\86е вÑ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой адÑ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай поÑ\88Ñ\82Ñ\8b. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
+ "changeemail-newemail-help": "Ð\9aалÑ\96 вÑ\8b Ñ\85оÑ\87аÑ\86е вÑ\8bдалÑ\96Ñ\86Ñ\8c Ñ\81вой адÑ\80аÑ\81 Ñ\8dлекÑ\82Ñ\80оннай поÑ\88Ñ\82Ñ\8b, пакÑ\96нÑ\8cÑ\86е гÑ\8dÑ\82ае поле пÑ\83Ñ\81Ñ\82Ñ\8bм. Пасьля выдаленьня вы ня зможаце ануляваць забыты пароль і ня будзеце атрымліваць лісты электроннай пошты з гэтай вікі.",
"changeemail-none": "(няма)",
"changeemail-password": "Ваш пароль у {{GRAMMAR:месны|{{SITENAME}}}}:",
"changeemail-submit": "Зьмяніць адрас электроннай пошты",
"rev-deleted-text-view": "Гэтая вэрсія старонкі была <strong>выдаленая</strong>.\nВы можаце праглядзець яе; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
"rev-suppressed-text-view": "Гэтая вэрсія старонкі была <strong>схаваная</strong>.\nВы можаце яе праглядзець; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
"rev-deleted-no-diff": "Вы ня можаце праглядаць гэтую розьніцу паміж вэрсіямі, таму што адна з вэрсіяў была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
- "rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была '''выдаленая'''.",
- "rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была '''выдаленая'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
- "rev-suppressed-unhide-diff": "Адна з вэрсіяў гэтага параўнаньня была '''схаваная'''.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 паглядзець гэту розьніцу], калі жадаеце.",
- "rev-deleted-diff-view": "Адна з вэрсіяў гэтага параўнаньня была '''выдаленая'''.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі. Падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
- "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была '''схаваная'''.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
+ "rev-suppressed-no-diff": "Вы ня можаце праглядзець гэтую розьніцу, таму што адна з вэрсіяў была <strong>выдаленая</strong>.",
+ "rev-deleted-unhide-diff": "Адна з вэрсіяў гэтай старонкі была <strong>выдаленая</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].\nВы можаце праглядзець [$1 розьніцу паміж вэрсіямі], калі жадаеце.",
+ "rev-suppressed-unhide-diff": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nПадрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].\nВы можаце [$1 паглядзець гэту розьніцу], калі жадаеце.",
+ "rev-deleted-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>выдаленая</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі. Падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
+ "rev-suppressed-diff-view": "Адна з вэрсіяў гэтага параўнаньня была <strong>схаваная</strong>.\nВы можаце праглядзець гэтую розьніцу паміж вэрсіямі; падрабязнасьці могуць быць знойдзеныя ў [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} журнале хаваньняў].",
"rev-delundel": "паказаць/схаваць",
"rev-showdeleted": "паказаць",
"revisiondelete": "Выдаліць/аднавіць вэрсіі",
"rcfilters-invalid-filter": "Няслушны фільтар",
"rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
"rcfilters-filterlist-title": "Фільтры",
+ "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
+ "rcfilters-highlightbutton-title": "Вылучыць вынікі",
+ "rcfilters-highlightmenu-title": "Абярыце колер",
"rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
"rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
"rcfilters-filter-registered-label": "Зарэгістраваныя",
"statistics-users-active-desc": "Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}",
"pageswithprop": "Старонкі з уласьцівасьцямі старонак",
"pageswithprop-legend": "Старонкі з уласьцівасьцямі старонак",
- "pageswithprop-text": "Ð\9dа гÑ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b адлÑ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c пÑ\8dÑ\9eнÑ\8bÑ\8f Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\96 Ñ\81Ñ\82аÑ\80онак",
+ "pageswithprop-text": "Ð\9dа гÑ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онÑ\86Ñ\8b адлÑ\8eÑ\81Ñ\82Ñ\80оÑ\9eваÑ\8eÑ\86Ñ\86а Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ñ\9eжÑ\8bваÑ\8eÑ\86Ñ\8c пÑ\8dÑ\9eнÑ\83Ñ\8e Ñ\9eлаÑ\81Ñ\8cÑ\86Ñ\96ваÑ\81Ñ\8cÑ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96.",
"pageswithprop-prop": "Імя ўласьцівасьці:",
"pageswithprop-submit": "Паказаць",
"pageswithprop-prophidden-long": "доўгае тэкставае значэньне ўласьцівасьці схавана ($1)",
"authmanager-authn-not-in-progress": "Аўтэнтыфікацыя не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце зноў з самага пачатку.",
"authmanager-authn-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць правераныя на сапраўднасьць.",
"authmanager-authn-no-local-user": "Пададзеныя ўліковыя зьвесткі не зьвязаныя зь ніводным удзельнікам гэтай вікі.",
+ "authmanager-authn-no-local-user-link": "Пададзеныя ўліковыя зьвесткі зьяўляюцца карэктнымі, але не належаць ніводнаму ўдзельніку гэтай вікі. Увайдзіце іншым шляхам, або стварыце новага ўдзельніка і ў вас будзе магчымасьць злучыць вашыя папярэднія ўліковыя зьвесткі з гэтым рахункам.",
"authmanager-authn-autocreate-failed": "Аўтаматычнае стварэньне лякальнага рахунку не атрымалася: $1",
"authmanager-change-not-supported": "Пададзеныя ўліковыя зьвесткі ня могуць быць зьмененыя, бо яны ня будуць выкарыстаныя.",
"authmanager-create-disabled": "Стварэньне рахункаў адключанае.",
+ "authmanager-create-from-login": "Каб стварыць рахунак, калі ласка, запоўніце палі.",
+ "authmanager-create-not-in-progress": "Стварэньне рахунку не выконваецца або страчаныя зьвесткі пра сэсію. Калі ласка, пачніце наноў з самага пачатку.",
+ "authmanager-create-no-primary": "Пададзеныя ўліковыя зьвесткі ня могуць быць выкарыстаныя для стварэньня рахунку.",
"authmanager-realname-label": "Сапраўднае імя",
"authmanager-provider-temporarypassword": "Часовы пароль",
"changecredentials": "Зьмена ўліковых зьвестак",
"withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
"withoutinterwiki-legend": "Представка",
"withoutinterwiki-submit": "Показване",
- "fewestrevisions": "Страници с най-малко версии",
+ "fewestrevisions": "Страници с най-малко редакции",
"nbytes": "$1 {{PLURAL:$1|байт|байта}}",
"ncategories": "$1 {{PLURAL:$1|категория|категории}}",
"ninterwikis": "$1 {{PLURAL:$1|междууики|междууикита}}",
"log-name-pagelang": "Дневник на езиковите промени",
"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>изключено</strong>)",
- "mediastatistics": "Ð\9cедиÑ\8f Ñ\81Ñ\82аÑ\82иÑ\81Ñ\82ики",
+ "mediastatistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика за Ñ\84айлове",
"mediastatistics-table-mimetype": "MIME тип",
"mediastatistics-table-extensions": "Възможни разширения",
"mediastatistics-table-count": "Брой файлове",
"rcfilters-invalid-filter": "অকার্যকর ফিল্টার",
"rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
"rcfilters-filterlist-title": "ছাঁকনি",
+ "rcfilters-highlightbutton-title": "ফলাফল আলোকপাত করুন",
+ "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
"rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
"rcfilters-filtergroup-registration": "ব্যবহারকারী নিবন্ধন",
"rcfilters-filter-registered-label": "নিবন্ধিত",
"rcfilters-filter-bots-description": "স্বয়ংক্রিয় সরঞ্জাম দিয়ে করা সম্পাদনা।",
"rcfilters-filter-humans-label": "মানুষ (বট নয়)",
"rcfilters-filter-humans-description": "মানব সম্পাদক দ্বারা করা সম্পাদনা।",
- "rcfilters-filtergroup-significance": "তাতà§\8dপর্য",
+ "rcfilters-filtergroup-significance": "তাà§\8eপর্য",
"rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
"rcfilters-filter-major-label": "অ-অনুল্লেখ্য সম্পাদনা",
"rcfilters-filtergroup-changetype": "পরিবর্তনের ধরন",
"tog-previewonfirst": "Rakwelet tres ar bajenn kerkent hag an aozadenn gentañ",
"tog-enotifwatchlistpages": "Kas ur postel din pa vez kemmet ur bajenn zo war ma roll evezhiañ",
"tog-enotifusertalkpages": "Kas ur postel din pa vez kemmet ma fajenn gaozeal",
- "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister",
+ "tog-enotifminoredits": "Kas ur postel din, ha pa vije evit kemenn kemmoù dister war pajennoù pe restroù",
"tog-enotifrevealaddr": "Lakaat ma chomlec'h postel war wel er posteloù kemenn-diwall",
"tog-shownumberswatching": "Diskouez an niver a lennerien",
"tog-oldsig": "Ho sinadur evit poent :",
"tagline": "Eus {{SITENAME}}",
"help": "Skoazell",
"search": "Klask",
+ "search-ignored-headings": " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>\n# Titloù a vo lezet a-gostez gant ar c'hlask.\n# Ar c'hemmoù graet amañ a vo lakaet e pleustr kerkent ha menegeret ar bajenn gant an titl.\n# Gallout a rit forsiñ un advenegeriñ ma rit ur c'hemm goullo en ur bajenn.\n# Setu penaos emañ an ereadur :\n# * Kement linenn zo, adalek an arouezenn \"#\" betek dibenn al linenn a zo un evezhiadenn.\n# * Kement linenn ha n'eo ket goullo a verk an titl rik a zo da vezañ lezet a-gostez, pennlizherennoù hag all.\nDaveennoù\nLiammoù diavaez\nGwelet ivez\n #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
"searchbutton": "Klask",
"go": "Kas",
"searcharticle": "Mont",
"ok": "Mat eo",
"retrievedfrom": "Adtapet diwar « $1 »",
"youhavenewmessages": "$1 zo ganeoc'h ($2).",
- "youhavenewmessagesfromusers": "$1 ho peus eus {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
+ "youhavenewmessagesfromusers": "{{PLURAL:$4|Bez' hoc'h eus}} $1 a-berzh {{PLURAL:$3|un implijer all|$3 implijer}} ($2).",
"youhavenewmessagesmanyusers": " $1 ho peus implijerien a-leizh ($2).",
- "newmessageslinkplural": "{{PLURAL:$1|ur gemennad nevez|999=kemennadoù nevez}}",
- "newmessagesdifflinkplural": "{{PLURAL:$1|kemennad diwezhañ|999=kemennadoù diwezhañ}}",
- "youhavenewmessagesmulti": "Kemennoù nevez zo ganeoc'h war $1",
+ "newmessageslinkplural": "{{PLURAL:$1|ur gemennadenn nevez|999=kemennadennoù nevez}}",
+ "newmessagesdifflinkplural": "{{PLURAL:$1|kemm diwezhañ|999=kemmoù diwezhañ}}",
+ "youhavenewmessagesmulti": "Kemennadennoù nevez zo ganeoc'h war $1",
"editsection": "kemmañ",
"editold": "kemmañ",
"viewsourceold": "sellet ouzh tarzh an destenn",
"databaseerror-query": "Reked : $1",
"databaseerror-function": "Arc'hwel : $1",
"databaseerror-error": "Fazi : $1",
+ "transaction-duration-limit-exceeded": "Kuit da lakaat kreskiñ betek re an termen respont eo bet nullet an treuzgread-mañ rak aet e oa ar pad skrivañ ($1) en tu all d'ar vevenn a $2 eilenn.\nM'emaoc'h o cheñch kalz elfennoù war un dro klaskit kentoc'h troc'hañ anezho e meur a oberiadenn disteroc'h.",
"laggedslavemode": "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
"readonly": "Hizivadurioù stanket war ar bank roadennoù",
"enterlockreason": "Merkit perak eo stanket hag istimit pegeit e chomo evel-henn",
"missingarticle-rev": "(adweladenn # : $1)",
"missingarticle-diff": "(Dif : $1, $2)",
"readonly_lag": "Stanket eo bet ar bank roadennoù ent emgefre p'emañ an eilservijerioù oc'h adpakañ o dale e-keñver ar pennservijer",
+ "nonwrite-api-promise-error": "Kaset e oa bet an talbenn HTTP 'Promise-Non-Write-API-Action' met savet e oa bet ar reked ouzh ur vodulenn skrivañ API.",
"internalerror": "Fazi diabarzh",
"internalerror_info": "Fazi diabarzh : $1",
+ "internalerror-fatal-exception": "Fazi groñs a seurt \"$1\"",
"filecopyerror": "Dibosupl eilañ \"$1\" war-du \"$2\".",
"filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
"filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
"cannotdelete": "Dibosupl diverkañ ar bajenn pe ar restr \"$1\".\nMarteze e o bet diverket gant unan bennak all dija.",
"cannotdelete-title": "N'haller ket diverkañ ar bajenn \"$1\"",
"delete-hook-aborted": "Nullet ar c'hemmañ gant un astenn.\nAbeg dianav.",
+ "no-null-revision": "N'eus ket bet gallet krouiñ un adweladenn nevez c'houllo evit ar bajenn \"$1\"",
"badtitle": "Titl fall",
"badtitletext": "Faziek pe c'houllo eo titl ar bajenn goulennet; pe neuze eo faziek al liamm etreyezhel pe etrewiki.\nMarteze ez eus ennañ arouezennoù n'haller ket degemer en titloù.",
+ "title-invalid-empty": "Pe eo goullo titl ar bajenn c'houlennet pe n'eus ennañ nemet anv an esaouenn anv.",
+ "title-invalid-utf8": "Titl ar bajenn c'houlennet zo ennañ un heuliad UTF-8 direizh.",
+ "title-invalid-interwiki": "Titl ar bajenn c'houlennet zo ennañ ul liamm etrewiki n'haller ket ober gantañ en titloù.",
+ "title-invalid-talk-namespace": "Titl ar bajenn c'houlennet a ra dave d'ur bajenn gaozeal n'eus ket anezhi.",
+ "title-invalid-characters": "Titl ar bajenn c'houlennet zo ennañ arouezennoù direizh : \"$1\".",
+ "title-invalid-relative": "Un hent amvat zo gant an titl. Direizh eo titloù ar pajennoù amvat (./, ../) peogwir e vint dibosupl da dizhout dre merdeerioù implijet gant tud zo.",
+ "title-invalid-magic-tilde": "Titl ar bajenn c'houlennet zo ennañ un heuliad tildennoù burzhudus direizh (<nowiki>~~~</nowiki>).",
+ "title-invalid-too-long": "Re hir eo titl ar bajenn c'houlennet. N'hall ket bezañ hiroc'h eget $1 {{PLURAL:$1|okted}} er c'hod UTF-8.",
+ "title-invalid-leading-colon": "Titl ar bajenn c'houlennet zo ennañ un daoubik direizh er penn-kentañ.",
"perfcached": "Krubuilhet eo ar roadennoù da-heul ha marteze n'int ket bet hizivaet. D'ar muiañ e c'haller kaout {{PLURAL:$1|un disoc'h|$1 disoc'h}} er grubuilh.",
"perfcachedts": "Krubuilhet eo ar roadennoù da-heul hag hizivaet int bet da ziwezhañ d'an $1. D'ar muiañ e c'haller kaout {{PLURAL:$4|un disoc'h|$4 disoc'h}} er grubuilh.",
"querypage-no-updates": "Diweredekaet eo an hizivaat evit ar bajenn-mañ. Evit poent ne vo ket nevesaet ar roadennoù amañ.",
"viewsource": "Sellet ouzh tarzh an destenn",
"viewsource-title": "Gwelet an tarzh evit $1",
"actionthrottled": "Ober daleet",
- "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeut munutennoù.",
+ "actionthrottledtext": "A-benn dizarbenn ar strob, n'haller ket implijout an ober-mañ re alies en ur frapad amzer lakaet, hag aet oc'h dreist ar muzul. Klaskit en-dro a-benn un nebeudig munutennoù.",
"protectedpagetext": "Prennet eo bet ar bajenn-mañ kuit na vefe skrivet pe cheñchet un dra bennak enni",
- "viewsourcetext": "Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ",
+ "viewsourcetext": "Gallout a rit gwelet hag eilañ mammenn ar bajenn-mañ.",
"viewyourtext": "Gallout a rit gwelet hag eilañ mammenn ho <strong>kemmoù</strong> d'ar bajenn-mañ.",
"protectedinterface": "Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.",
"editinginterface": "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [https://translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
- "cascadeprotected": "Gwarezet eo ar bajenn-mañ; n'haller ket kemmañ anezhi ken p'he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
+ "translateinterface": "Evit ouzhpennañ pe cheñch troidigezhioù en holl wikioù, grit gant [https://translatewiki.net/ translatewiki.net], anezhañ raktres lec'helaat MediaWiki.",
+ "cascadeprotected": "Gwarezet eo ar bajenn-mañ ; n'haller ket kemmañ anezhi ken p'he c'haver treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :\n$2",
"namespaceprotected": "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
"customcssprotected": "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
"customjsprotected": "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
"mypreferencesprotected": "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
"ns-specialprotected": "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
"titleprotected": "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].\nSetu amañ perak <em>$2</em>.",
- "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"''$3''\" eo an abeg roet gant ar merour en deus prennet anezhi.",
+ "filereadonlyerror": "Dibosupl kemmañ ar restr \"$1\" abalamour m'emañ ar c'havlec'h restroù \"$2\" e mod lenn nemetken.\n\n\"$3\" eo an abeg roet gant merour ar reizhiad en deus prennet anezhi.",
"invalidtitle-knownnamespace": "Titl direizh gant an esaouenn anv \"$2\" hag an destenn \"$3\"",
"invalidtitle-unknownnamespace": "Titl direizh gant an niverenn esaouenn anv $1 hag an destenn \"$2\" dianav",
"exception-nologin": "N'oc'h ket kevreet",
"wrongpassword": "Ger-tremen kamm. Klaskit en-dro.",
"wrongpasswordempty": "Ger-tremen ebet. Lakait unan mar plij.",
"passwordtooshort": "{{PLURAL:$1|1 arouezenn|$1 arouezenn}} hir a rank bezañ ar gerioù-tremen da nebeutañ.",
- "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 arouezenn.",
+ "passwordtoolong": "N'hall ket ar gerioù-tremen bezañ enno ouzhpenn $1 {{PLURAL:$1|1 arouezenn|$1 arouezenn}}.",
+ "passwordtoopopular": "N'haller ket ober gant gerioù-ter boutin betek re. Grit gant ur ger-tremen raloc'h.",
"password-name-match": "Rankout a ra ho ker-tremen bezañ disheñvel diouzh hoc'h anv implijer.",
"password-login-forbidden": "Berzet eo ober gant an anv implijer hag ar ger-tremen-mañ.",
"mailmypassword": "Adderaouekaat ar ger-tremen",
"noemail": "N'eus bet enrollet chomlec'h postel ebet evit an implijer \"$1\".",
"noemailcreate": "Ret eo deoc'h merkañ ur chomlec'h postel reizh",
"passwordsent": "Kaset ez eus bet ur ger-tremen nevez da chomlec'h postel an implijer \"$1\".\nTrugarez deoc'h da gevreañ kerkent ha ma vo bet resevet ganeoc'h.",
- "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Gant se n'hallit ket implijout an arc'hwel adtapout gerioù-tremen, kuit m'en em ledfe gwallimplijoù.",
+ "blocked-mailpassword": "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Kuit m'en em ledfe gwallimplijoù n'hallit ket implijout an arc'hwel adtapout gerioù-tremen adalek ar chomlec'h IP-mañ.",
"eauthentsent": "Kaset ez eus bet ur postel kadarnaat war-du ar chomlec'h postel spisaet.\nA-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzulioù merket er postel resevet evit kadarnaat ez eo mat ho kont deoc'h.",
"throttled-mailpassword": "Kaset ez eus bet deoc'h ur postel adderaouekaat e-kerzh an\n{{PLURAL:$1|eurvezh|$1 eurvezh}} tremenet. Evit mirout ouzh nep gaou ne gaser ket ouzhpenn ur postel a seurt-se bep {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
"mailerror": "Fazi en ur gas ar postel : $1",
- "acct_creation_throttle_hit": "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
+ "acct_creation_throttle_hit": "Gweladennerien zo o deus implijet ho chomlec'h IP evit krouiñ {{PLURAL:$1|1 gont|$1 kont}} e-kerzh an $2 diwezhañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
"emailauthenticated": "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
"emailnotauthenticated": "N'eo ket bet gwiriekaet ho chomlec'h postel evit c'hoazh.\nNe vo ket tu da gas postel ebet deoc'h evit hini ebet eus an dezverkoù dindan.",
"noemailprefs": "Merkit ur chomlec'h postel mar fell deoc'h ez afe an arc'hwelioù-mañ en-dro.",
"botpasswords-label-delete": "Dilemel",
"botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
"botpasswords-label-grants": "Aotreoù a c'haller ober ganto :",
+ "botpasswords-help-grants": "Gant an aotreoù e c'haller kaout ar gwirioù grataet d'ho kont implijer. N'eo ket peogwir e vo gweredekaet un aotre amañ e vo digoret gwirioù ouzhpenn deoc'h estreget ar re zo stag ouzh ho kont implijer. Kit da welet [[Special:ListGrants|taolenn an aotreoù]] evit gouzout hiroc'h.",
"botpasswords-label-grants-column": "Aotreet",
"botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
"botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
"botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
"botpasswords-created-title": "Ger-tremen robotoù krouet",
- "botpasswords-created-body": "Krouet mat eo bet ar ger-tremen « $1 ».",
+ "botpasswords-created-body": "Krouet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
"botpasswords-updated-title": "Ger-tremen robotoù hizivaet",
- "botpasswords-updated-body": "Hizivaet mat eo bet ar ger-tremen « $1 ».",
+ "botpasswords-updated-body": "Hizivaet mat eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
"botpasswords-deleted-title": "Ger-tremen robotoù dilamet",
- "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
- "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
+ "botpasswords-deleted-body": "Dilamet eo bet ger-tremen ar robot \"$1\" evit an implijer \"$2\".",
+ "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen nevez evit kevreañ ouzh <strong>$1</strong>. Enrollit anezhañ evit ober dave dezhañ diwezhatoc'h.</em>(Evit ar robotoù kozh zo rekis evito e vefe heñvel an anv kevreañ ouzh hini an implijer a c'hall bezañ, e c'hallit ober gant <strong>$3</strong> da anv implijer ha gant <strong>$4</strong> evel ger-tremen).",
"botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
+ "botpasswords-restriction-failed": "N'hallit ket kevreañ abalamour d'ar strishadurioù war gerioù-tremen ar robotoù.",
+ "botpasswords-invalid-name": "N'eus ket a zispartier gerioù-tremen robot en anv implijer spisaet (\"$1\").",
"botpasswords-not-exist": "N'eus ger-tremen bot ebet anvet \"$2\" gant an implijer \"$1\".",
"resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
"resetpass_forbidden-reason": "N'haller ket cheñch ar gerioù-termen : $1",
"resetpass-temp-password": "Ger-tremen da c'hortoz :",
"resetpass-abort-generic": "Nullet eo bet kemm ar ger-tremen gant un astenn.",
"resetpass-expired": "Deuet eo ho ker-tremen d'e dermen. Lakait ur ger-tremen nevez, mar plij, evit kevreañ.",
+ "resetpass-expired-soft": "Aet eo ho ker-tremen d'e dermen, ret eo adderaouekaat anezhañ. Dibabit ur ger-tremen nevez diouzhtu pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
+ "resetpass-validity-soft": "Direizh eo ho ker-tremen : $1\n\nDibabit ur ger-tremen nevez diouzhtu, pe klikit war \"{{int:authprovider-resetpass-skip-label}}\" evit ober war-dro diwezhatoc'h.",
"passwordreset": "Adderaouekaat ar ger-tremen",
"passwordreset-text-one": "Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.",
"passwordreset-text-many": "{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}",
"passwordreset-emailtext-ip": "Unan bennak (c'hwi moarvat gant ar chomlec'h IP $1) en deus goulennet ma vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
"passwordreset-emailtext-user": "Goulennet en deus an implijer $1 war {{SITENAME}} e vefe degaset soñj dezhañ eus titouroù e gont evit {{SITENAME}} ($4). Emañ liammet {{PLURAL:$3|ar gont implijer|ar c'hontoù implijer}} da-heul gant ar chomlec'h postel-mañ :\n\n$2\n\nMont a raio da get {{PLURAL:$3|ar ger-tremen da c'hortoz|ar gerioù-tremen da c'hortoz}} a-benn {{PLURAL:$5|un devezh|$5 deiz}}.\nMat e vefe deoc'h kevreañ ha dibab ur ger-tremen nevez bremañ. Mard eo bet goulennet kement-se gant unan bennak all pe m'hoc'h eus soñj eus ho ker-tremen orin ha mar ne fell ket deoc'h e cheñch ken, na daolit ket evezh ouzh ar gemennadenn-mañ ha dalc'hit d'ober gant ho ker-tremen kozh.",
"passwordreset-emailelement": "Anv implijer : \n$1\n\nGer-tremen da c'hortoz : \n$2",
- "passwordreset-emailsentemail": "Kaset ez eus bet ur postel deoc'h da adderaouekaat ho ker-tremen.",
+ "passwordreset-emailsentemail": "Mard eo liammet ar chomlec'h postel-mañ ouzh ho kont, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
+ "passwordreset-emailsentusername": "Mard eo liammet ar chomlec'h postel-mañ gant an anv implijer-mañ, neuze e vo kaset ur postel deoc'h da adderaouekaat ho ker-tremen.",
"passwordreset-nocaller": "Ret eo merkañ anv ur galver",
"passwordreset-nosuchcaller": "N'eus ket eus ar galver : $1",
+ "passwordreset-ignored": "N'eus ket bet gallet adderaouekaat ar ger-termen. Marteze a-walc'h peogwir n'eus ket bet kefluniet pourvezer ebet ?",
"passwordreset-invalidemail": "Chomlec'h postel direizh",
"passwordreset-nodata": "N'eus bet lakaet anv implijer na chomlec'h postel ebet",
"changeemail": "Kemmañ pe dilemel ar chomlec'h postel",
- "changeemail-header": "Kemmañ chomlec'h postel ar gont",
+ "changeemail-header": "Leuniit ar furmskrid-mañ evit cheñch ho chomlec'h postel. Mar fell deoc'h distagañ ur chomlec'h postel bennak diouzh ho kont, lezit goullo lec'h ar chomlec'h postel nevez a-raok kadarnaat ar furmskrid.",
"changeemail-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
"changeemail-oldemail": "Chomlec'h postel a-vremañ :",
"changeemail-newemail": "Chomlec'h postel nevez :",
+ "changeemail-newemail-help": "Goullo e tlefe chom ar vaezienn-mañ mar fell deoc'h lemel kuit ho chomlec'h postel. Ne viot ket gouest da adderaouekaat ur ger-tremen ankouaet ganeoc'h ken ha ne resevot postel ebet a-berzh ar wiki-mañ ma lamit kuit ar chomlec'h postel.",
"changeemail-none": "(hini ebet)",
"changeemail-password": "Ho ker-tremen war {{SITENAME}}:",
"changeemail-submit": "Cheñch chomlec'h postel",
"changeemail-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
"changeemail-nochange": "Merkit ur chomlec'h postel all.",
"resettokens": "Adderaouekaat ar jedoueroù",
+ "resettokens-text": "Gallout a ri adderaouekaat amañ ar jedoueroù a aotre ac'hanoc'h da vont war roadennoù prevez zo hag a zo staget ouzh ho kont.\n\nMat e vefe deoc'h en ober m'hoc'h eus rannet anezho gant unan bennak dre fazi pe mard eo bet implijet ho kont gant unan bennak all mod pe vod.",
"resettokens-no-tokens": "N'eus jedouer ebet da adderaouekaat.",
"resettokens-tokens": "Jedoueroù :",
"resettokens-token-label": "$1 (talvoud bremañ : $2)",
+ "resettokens-watchlist-token": "Jedouer evit lanvad web (Atom/RSS) [[Special:Watchlist|kemmañ pajennoù eus ho roll evezhiañ]]",
"resettokens-done": "Jedoueroù adderaouekaet.",
"resettokens-resetbutton": "Adderaouekaat ar jedoueroù diuzet",
"bold_sample": "Testenn dev",
"preview": "Rakwelet",
"showpreview": "Rakwelet",
"showdiff": "Diskouez ar c'hemmoù",
+ "blankarticle": "<strong>Taolit evezh :</strong> Goullo eo ar bajenn emaoc'h o krouiñ.\nMar klikit war \"{{int:savearticle}}\" en-dro e vo krouet hep netra ebet e-barzh.",
"anoneditwarning": "</strong>Diwallit :</strong> N'oc'h ket kevreet.\nGallout a raio an holl dud gwelet ho chomlec'h IP ma rit kemmoù. Ma <strong>[$1kevreit]</strong>pe<strong>[$2 krouit ur gont]</strong>, e vo deroet ho kemmoù d'hoc'h anv-implijer, e-touez spletoù all.",
"anonpreviewwarning": "''N'oc'h ket kevreet. Enrollañ a lakao war-wel ho chomlec'h IP e istor kemmoù ar bajenn.''",
"missingsummary": "'''Taolit evezh:''' N'hoc'h eus ket lakaet tamm testenn diverrañ ebet evit ho kemmoù. Mar klikit war enrollañ en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+ "selfredirect": "<strong>Taolit evezh :</strong> Emaoc'h oc'h adkas ar bajenn-mañ warni hec'h-unan.\nPe hoc'h eus spisaet ur pal a-dreuz evit an adkas pe emaoc'h o cheñch ur bajenn n'emañ ket da vezañ cheñchet evel-se.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo krouet an adkas forzh penaos.",
"missingcommenttext": "Skrivit hoc'h evezhiadenn a-is.",
- "missingcommentheader": "'''Taolit evezh :''' N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
- "summary-preview": "Rakwelet an diverrañ :",
+ "missingcommentheader": "<strong>Taolit evezh :</strong> N'hoc'h eus lakaet tamm danvez/titl ebet d'hoc'h evezhiadenn.\nMar klikit war \"{{int:savearticle}}\" en-dro, e vo enrollet ho testenn evel m'emañ hepmuiken.",
+ "summary-preview": "Rakwelet un diverrañ eus ar c'hemmoù :",
"subject-preview": "Rakwelet an danvez :",
"previewerrortext": "C'hoarvezet ez eus ur fazi e-ser klask rakwelet ho kemmoù",
"blockedtitle": "Implijer stanket",
"blockedtext": "'''Stanket eo bet ho kont implijer pe ho chomlec'h IP'''\n\nGant $1 eo bet graet.\nSetu an abeg evit se : ''$2''.\n\n* Stanket adalek : $8\n* Stanket betek : $6\n* Pad ar stankadenn : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar [[{{MediaWiki:Grouppage-sysop}}|verourien]] all evit eskemm ganto war se. N'hallit implijout an arc'hwel 'kas ur postel d'an implijer-mañ' nemet ma'z eus bet spisaet ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù kont]] ha ma n'eo ket bet stanket.\n$3 eo ho chomlec'h IP, ha #$5 eo niverenn an identelezh stanket.\nMerkit anezho en ho koulennoù bep tro.",
"autoblockedtext": "Stanket eo bet ho chomlec'h IP ent emgefreek rak implijet e veze gant un implijer all bet stanket gant $1.\nSetu aze an abeg :\n\n: ''$2''\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Kont stanket : $7\n\nGallout a rit mont e darempred gant $1 pe gant unan eus ar\n[[{{MediaWiki:Grouppage-sysop}}|verourien]] all ma kavit abeg er stankadenn.\n\nNotennit mat ne c'hallot implijout an dibarzh \"kas ur postel d'an implijer\" nemet ma'z eus bet merket ganeoc'h ur chomlec'h postel reizh en ho [[Special:Preferences|penndibaboù implijer]] ha ma n'eo ket bet stanket ivez.\n\n$3 eo ho chomlec'h IP evit poent ha #$5 ho niverenn stankadenn.\nMerkit mat an titouroù-se war kement goulenn savet ganeoc'h.\n\n$5 eo ho niverenn stankadenn. Merkit mat an niverenn-se pa rit goulennoù.",
+ "systemblockedtext": "Stanket eo bet hoc'h anv implijer pe ho chomlec'h IP ent emgefre gant MediaWiki.\nSetu perak :\n\n:<em>$2</em>\n\n* Deroù ar stankadenn : $8\n* Termen ar stankadenn : $6\n* Hinienn a sell ar stankadenn outi : $7\n\n$3 eo ho chomlec'h IP diouzhtu.\nMerkit mat ar munudoù skrivet a-us er c'hlemmoù a c'halljec'h ober.",
"blockednoreason": "n'eus bet roet abeg ebet",
"whitelistedittext": "Ret eo deoc'h en em $1 evit gallout skridaozañ.",
"confirmedittext": "Rankout a ri bezañ kadarnaet ho chomlec'h postel a-raok gallout kemmañ pajennoù. Skrivit ha kadarnait ho chomlec'h postel en ho [[Special:Preferences|penndibaboù implijer]] mar plij.",
"accmailtext": "Kaset ez eus bet ur ger-tremen dargouezhek evit [[User talk:$1|$1]] da $2. Cheñchet e c'hall ar ger-tremen evit ar gont nevez-mañ bezañ war ar bajenn ''[[Special:ChangePassword|cheñch ger-tremen]]'', ur wezh kevreet.",
"newarticle": "(Nevez)",
"newarticletext": "Heuliet hoc'h eus ul liamm a gas d'ur bajenn n'eo ket bet savet evit c'hoazh.\nA-benn krouiñ ar bajenn-se, krogit da skrivañ er prenestr skridaozañ dindan (gwelet ar [$1 bajenn skoazell] evit gouzout hiroc'h).\nM'emaoc'h en em gavet amañ dre fazi, klikit war bouton '''kent''' ho merdeer evit mont war ho kiz.",
- "anontalkpagetext": "---- ''Homañ eo ar bajenn gaozeal evit un implijer(ez) dizanv n'eus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ/i.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer(ez).\nMa'z oc'h un implijer(ez) dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]]pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
+ "anontalkpagetext": "<em>Homañ eo ar bajenn gaozeal evit un implijer dizanv n'en deus ket krouet kont ebet evit c'hoazh pe na implij ket anezhi</em>.\nSetu perak e rankomp ober gant ar chomlec'h IP niverel evit anavezout anezhañ.\nGallout a ra ur chomlec'h a seurt-se bezañ rannet etre meur a implijer.\nMa'z oc'h un implijer dizanv ha ma stadit ez eus bet kaset deoc'h kemennadennoù na sellont ket ouzhoc'h, gallout a rit [[Special:CreateAccount|krouiñ ur gont]] pe [[Special:UserLogin|kevreañ]] kuit a vagañ muioc'h a gemmesk gant implijerien dizanv all.",
"noarticletext": "N'eus tamm skrid ebet war ar bajenn-mañ evit poent.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù all,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask en oberiadennoù liammet], pe [{{fullurl:{{FULLPAGENAME}}|action=edit}} krouiñ ar bajenn]</span>.",
"noarticletext-nopermission": "N'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.\nGallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,\npe <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>, met n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
"missing-revision": "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{FULLPAGENAME}} ».\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
"userpage-userdoesnotexist": "N'eo ket enrollet ar gont \"<nowiki>$1</nowiki>\". Merkit ma fell deoc'h krouiñ/kemmañ ar bajenn-mañ.",
"userpage-userdoesnotexist-view": "N'eo ket enrollet ar gont implijer \"$1\".",
"blocked-notice-logextract": "Stanket eo an implijer-mañ evit poent.\nDindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
- "clearyourcache": "Notenn :''' Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* '''Firefox / Safari:''' Derc'hel da bouezañ war ''Pennlizherenn'' en ur glikañ war ''Adkargañ'', pe pouezañ war ''Ctrl-F5'' pe ''Ctrl-R'' (''⌘-R'' war ur Mac); \n* ''''Google Chrome:''' Pouezañ war ''Ctrl-Pennlizh-R'' (''⌘-Shift-R'' war ur Mac)\n* '''Internet Explorer:''' Derc'hel da bouezañ war ''Ctrl'' en ur glikañ war ''Freskaat,'' pe pouezañ war ''Ctrl-F5''\n* ''''Konqueror: '''Klikañ war ''Adkargañ'' pe pouezañ war ''F5;'' \n* '''Opera:''' Riñsañ ar grubuilh e ''Ostilhoù → Penndibaboù''",
+ "clearyourcache": "<strong>Notenn :</strong> Goude bezañ enrollet ho pajenn e rankot freskaat krubuilh ho merdeer a-benn gwelet ar c'hemmoù.\n* <strong>Firefox / Safari:</strong> Derc'hel da bouezañ war <em>Pennlizherenn</em> en ur glikañ war <em>Adkargañ</em>, pe pouezañ war <em>Ctrl-F5</em> pe <em>Ctrl-R</em> (<em>⌘-R</em> war ur Mac); \n* <strong>Google Chrome:</strong> Pouezañ war <em>Ctrl-Pennlizh-R</em> (<em>⌘-Shift-R</em> war ur Mac)\n* <strong>Internet Explorer :</strong> Derc'hel da bouezañ war <em>Ctrl</em> en ur glikañ war <em>Freskaat</em>, pe pouezañ war <em>Ctrl-F5</em>\n* <strong>Konqueror :</strong> Klikañ war <em>Adkargañ</em> pe pouezañ war <em>F5</em>\n* <strong>Opera :</strong> Mont da <em>Arventennoù → lañser</em> (<em>Opera → Penndibaboù</em> war ur Mac) ha goude mont da <em>Prevezded & surentez → Riñsañ roadennoù ar grubuilh → Skeudennoù krubuilhet ha restroù</em>.",
"usercssyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn CSS nevez a-raok enrollañ anezhi.",
"userjsyoucanpreview": "'''Tun :''' Grit gant ar bouton \"{{int:showpreview}}\" evit testiñ ho follenn JS nevez a-raok enrollañ anezhi.",
"usercsspreview": "'''Dalc'hit soñj n'emaoc'h ken nemet o rakwelet ho follenn CSS deoc'h.'''\n'''N'eo ket bet enrollet evit c'hoazh!'''",
"previewnote": "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''\nN'eo ket bet enrollet ho kemmoù evit c'hoazh !",
"continue-editing": "Mont d'an takad kemmañ",
"previewconflict": "Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.",
- "session_fail_preview": "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''\nKlaskit en-dro mar plij.\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h.",
- "session_fail_preview_html": "'''Ho tigarez! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.'''\n\n''Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.''\n\n'''Mard e oa onest ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro. '''\nMar ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] ha kevreañ en-dro.",
+ "session_fail_preview": "Ho tigarez ! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.\n\nMarteze n'oc'h ket kevreet ken. <strong>Gwiriit emaoc'h mat kevreet ha klaskit en-dro</strong>.\n\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ war-lerc'h. Gwiriit mat e asant ho merdeer resev toupinoù a-berzh al lec'hienn-mañ ivez.",
+ "session_fail_preview_html": "Ho tigarez ! N'omp ket bet gouest da enrollañ ho kemmoù rak kollet ez eus bet roadennoù e-kerzh an dalc'h.\n\n<em>Gweredekaet eo al linennoù HTML e {{SITENAME}}. Rak-se eo kuzh ar rakweledoù a-benn en em zifenn diouzh an tagadennoù JavaScript.</em>\n\n<strong>Ma oa reizh ar c'hemmoù hoc'h eus klasket degas, klaskit en-dro.</strong>\nMa ned a ket en-dro, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude. Gwiriit e asant mat ho merdeer degemer toupinoù a-berzh al lec'hienn-mañ ivez.",
"token_suffix_mismatch": "'''Distaolet eo bet ar c'hemmoù degaset ganeoc'h abalamour ma oa bet kemmesket an arouezennoù poentadur gant ho merdeer en daveer kemmañ. Distaolet eo bet ar c'hemmoù kuit na vije breinet ar bajennad skrid.\nC'hoarvezout a ra a-wechoù pa implijit ur servijer proksi dreinek dizanav.'''",
"edit_form_incomplete": "'''Darn eus ar furmskrid kemmañ zo chomet hep tizhout ar servijer ; gwiriit ervat emañ mat ho kemmoù tre evel m'int bet graet ganeoc'h ha klaskit en-dro.'''",
"editing": "Oc'h aozañ $1",
"yourdiff": "Diforc'hioù",
"copyrightwarning": "Sellet e vez ouzh an holl degasadennoù graet war {{SITENAME}} evel ouzh degasadennoù a zouj da dermenoù ar $2 (Sellet ouzh $1 evit gouzout hiroc'h). Mar ne fell ket deoc'h e vefe embannet ha skignet ho skridoù, arabat kas anezho.<br />\nHeñveldra, prometiñ a rit kemer perzh dre zegas skridoù savet ganeoc'h hepken pe tennet eus ur vammenn frank a wirioù.\n'''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER (COPYRIGHT) HEP AOTRE D'OBER KEMENT-SE!'''",
"copyrightwarning2": "Notit mat e c'hall kement degasadenn graet ganeoc'h war {{SITENAME}} bezañ kemmet, adaozet pe lamet kuit gant an implijerien all. Mar ne fell ket deoc'h e vije kemmet-digemmet ar pezh hoc'h eus skrivet na gemerit ket perzh er raktres-mañ.<br /> Gouestlañ a rit ivez eo bet savet ar boued spered ganeoc'h pe eilet diwar ur vammenn frank a wirioù pe en domani foran (gwelet $1 evit gouzout hiroc'h). '''NA IMPLIJIT KET LABOURIOÙ GANT GWIRIOÙ AOZER HEP AOTRE D'OBER KEMENT-SE!'''",
+ "editpage-cannot-use-custom-model": "N'haller ket cheñch patrom danvez ar bajenn-mañ.",
"longpageerror": "'''FAZI : {{PLURAL:$1|Ur c'hilookted|$1 kilookted}} hir eo an destenn lakaet ganeoc'h, ar pezh zo hiroc'h eget {{PLURAL:$2|ur c'hilookted|$2 kilookted}}, ar vent vrasañ aotreet. N'haller ket enrollañ.'''",
- "readonlywarning": "'''KEMENN DIWALL : prennet eo bet an diaz titouroù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.'''\n\nGallout a rit eilañ ha pegañ ho testenn en ur restr skrid all hag enrollañ anezhi a-benn diwezhatoc'hik.'''\n\nSetu an displegadenn lakaet gant ar merour eo bet prennet an traoù gantañ : $1",
+ "readonlywarning": "<strong>Diwallit : prennet eo bet an diaz roadennoù evit bezañ trezalc'het; setu ne viot ket evit enrollañ ho kemmoù diouzhtu-diouzhtu eta.</strong>\n\nGallout a rit eilañ ha pegañ ho skrid en ur restr testenn all hag enrollañ anezhañ a-benn diwezhatoc'hik.\n\nSetu an displegadenn lakaet gant ar merour reizhiad eo bet prennet an traoù gantañ : $1",
"protectedpagewarning": "'''KEMENN DIWALL: Gwarezet eo bet ar bajenn-mañ. N'eus nemet an implijerien ganto ar statud merour a c'hall kemmañ anezhi.'''\nEnmont diwezhañ ar marilh a ziskouezer amañ a-is evel dave :",
"semiprotectedpagewarning": "''Notenn :''' Gwarezet eo ar bajenn-mañ; n'eus nemet an implijerien bet krouet ur gont ganto a kemmañ anezhi. Kasadenn ziwezhañ ar marilh zo diskouezet amañ a-is evel dave :",
- "cascadeprotectedwarning": "'''Diwallit :''' Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir he c'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
+ "cascadeprotectedwarning": "<strong>Diwallit :</strong> Prennet eo ar bajenn-mañ. N'eus nemet ar verourien a c'hall kemmañ anezhi peogwir emañ treuzkludet {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh \"skalierad\" :",
"titleprotectedwarning": "'''DIWALLIT : Gwarezet eo bet ar bajenn-mañ e doare ma ranker kaout [[Special:ListGroupRights|gwirioù dibar]] a-benn krouiñ anezhi.''' Kasadenn ziwezhañ ar marilh a zo diskouezet amañ a-is evel dave :",
"templatesused": "{{PLURAL:$1|Patrom|Patromoù}} implijet war ar bajenn-mañ :",
"templatesusedpreview": "{{PLURAL:$1|Patrom|Patromoù}} implijet er rakweladenn-mañ :",
"permissionserrors": "Fazi aotre",
"permissionserrorstext": "N'oc'h ket aotreet d'ober kement-mañ evit {{PLURAL:$1|an abeg-mañ|an abegoù-mañ}} :",
"permissionserrorstext-withaction": "N'oc'h ket aotreet da $2, evit an {{PLURAL:$1|abeg-mañ|abeg-mañ}} :",
+ "contentmodelediterror": "N'hallit ket kemmañ an adweladenn-mañ peogwir ez eo par he fatrom danvez da <code>$1</code>, ar pezh zo disheñvel diouzh ar patrom danvez implijet bremañ war ar bajenn <code>$2</code>.",
"recreate-moveddeleted-warn": "'''Diwallit : Emaoc'h o krouiñ ur bajenn zo bet diverket c'hoazh.'''\n\nEn em soñjit ervat ha talvoudus eo kenderc'hel krouiñ ar bajenn.\nDeoc'h da c'houzout, aze emañ ar marilhoù diverkañ hag adenvel :",
"moveddeleted-notice": "Diverket eo bet ar bajenn-mañ.\nDindan emañ ar marilh diverkañ hag adenvel.",
+ "moveddeleted-notice-recent": "Ho tigarez, nevez ziverket eo bet ar bajenn-mañ (e-kerzh an 24 eurvezh tremenet).\nDindan emañ ar marilhoù diverkañ hag adenvel evit ho kelaouiñ.",
"log-fulllog": "Gwelet ar marilh klok",
"edit-hook-aborted": "C'hwitet ar c'hemmañ gant un astenn.\nAbeg dianav.",
"edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
"invalid-content-data": "n'eo ket mat roadennoù an endalc'had",
"content-not-allowed-here": "N'eo ket aotreet an endalc'had \"$1\" er bajenn [[$2]]",
"editwarning-warning": "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.\nMa'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" en ho penndibaboù.",
+ "editpage-invalidcontentmodel-title": "N'eo ket skoret ar patrom danvez",
+ "editpage-invalidcontentmodel-text": "N'eo ket skoret ar patrom danvez \"$1\".",
"editpage-notsupportedcontentformat-title": "Furmad endalc'had ha n'eo ket kemeret e karg",
+ "editpage-notsupportedcontentformat-text": "N'eo ket skoret ar patrom $1 gant ar patrom danvez $2.",
"content-model-wikitext": "wikitestenn",
"content-model-text": "testenn blaen",
"content-model-javascript": "Javascript",
"content-json-empty-object": "Elfenn goullo",
"content-json-empty-array": "Taolenn c'houllo",
"deprecated-self-close-category": "Pajennoù a ra gant tikedennoù HTML emserriñ direizh",
- "expensive-parserfunction-warning": "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv|galv}}, ha {{PLURAL:$1|$1 galv|$1 galv}} zo.",
+ "deprecated-self-close-category-desc": "Er bajenn-mañ ez eus tikedennoù HTML emserriñ, evel <code><b/></code> pe <code><span/></code>. Cheñch a raio o emzalc'h a-raok pell evit bezañ diouzh an erbedadennoù HTML5. Gant se eo dispredet implijout anezho er wikitestenn.",
+ "duplicate-args-warning": "<strong>Taolit evezh : Emañ </strong> [[:$1]] o c'hervel [[:$2]] gant muioc'h eget un talvoud evit an arventenn \"$3\". N'eus nemet an talvoud pourchaset da ziwezhañ a vo implijet.",
+ "duplicate-args-category": "Pajennoù a ra gant arguzennoù eilet er galvoù patrom",
+ "duplicate-args-category-desc": "Er bajenn-mañ ez eus galvoù patroù a ra gant arguzennoù eilet, evel <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> pe <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+ "expensive-parserfunction-warning": "<strong>Diwallit :</strong>: Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo er bajenn-mañ.\n\nDleout a rafe bezañ nebeutoc'h eget $2 {{PLURAL:$2|galv}}, ha {{PLURAL:$1|$1 galv}} zo.",
"expensive-parserfunction-category": "Pagjennoù enno re a c'halvoù koustus e-keñver an arc'hwelioù parser.",
"post-expand-template-inclusion-warning": "Diwallit : re a batromoù zo war ar bajenn-mañ.\nLod anezho a vo lakaet a-gostez.",
"post-expand-template-inclusion-category": "Pajennoù enno re a batromoù",
"post-expand-template-argument-warning": "Diwallit : war ar bajenn-mañ ez eus eus da nebeutañ un arventenn eus ur patrom zo re vras.\nA-gostez eo bet lezet an arventenn-se.",
"post-expand-template-argument-category": "Pajennoù enno arventennoù patrom bet lezet a-gostez",
"parser-template-loop-warning": "Patrom e kelc'h detektet : [[$1]]",
- "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù ar patromoù ($1)",
+ "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù rekursivek ar patromoù ($1)",
"language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
"node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
"node-count-exceeded-category-desc": "Mont a ra ar bajenn-mañ en tu all da gont uhelañ ar skoulmoù.",
"undo-summary": "Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])",
"undo-summary-username-hidden": "Dizober ar reizhadenn $1 gant un implijer kuzhet",
"cantcreateaccount-text": "Stanket eo bet ar c'hrouiñ kontoù adal ar chomlec'h IP ('''$1''') gant [[User:$3|$3]].\n\nAn abeg roet gant $3 zo ''$2''",
+ "cantcreateaccount-range-text": "Berzet eo bet gant [[User:$3|$3]] ar c'hrouiñ kontoù adalek ar chomlec'hioù IP el lijorennoù <strong>$1</strong> m'emañ ho chomlec'h IP (<strong>$4</strong>), \n\n<em>$2</em> eo an abeg roet gant $3",
"viewpagelogs": "Gwelet ar marilhoù evit ar bajenn-mañ",
"nohistory": "Ar bajenn-mañ n'he deus tamm istor ebet.",
"currentrev": "Stumm a-vremañ pe stumm red",
"history-feed-description": "Istor ar c'hemmoù degaset war ar bajenn-mañ eus ar wiki",
"history-feed-item-nocomment": "$1 d'an $2",
"history-feed-empty": "Ar bajenn goulennet n'eus ket anezhi.\nMarteze eo bet diverket eus ar wiki, pe adanvet.\nImplijit [[Special:Search|klaskit er wiki]] evit kavout pajennoù all a c'hallfe klotañ.",
+ "history-edit-tags": "Kemmañ tikedennoù ar stummoù diuzet",
"rev-deleted-comment": "(diverradenn ar c'hemm diverket)",
"rev-deleted-user": "(anv implijer diverket)",
- "rev-deleted-event": "(elfenn dilamet)",
+ "rev-deleted-event": "(munudoù ar marilh bet dilamet)",
"rev-deleted-user-contribs": "[anv implijer pe chomlec'h IP diverket - kemm kuzhet diouzh an degasadennoù]",
"rev-deleted-text-permission": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} roll ar pajennoù diverket].",
+ "rev-suppressed-text-permission": "<strong>Diverket</strong> eo bet ar stumm-mañ eus ar bajenn.\nGallout a reot kavout ar munudoù e [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh an diverkadennoù].",
"rev-deleted-text-unhide": "!'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nMarteze e kavot munudoù war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
"rev-suppressed-text-unhide": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nTitouroù zo da gaout war [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].\nGallout a rit [$1 gwelet ar stumm-se] c'hoazh mar fell deoc'h kenderc'hel.",
"rev-deleted-text-view": "'''Diverket''' eo bet ar stumm-mañ eus ar bajenn.\nGallout a rit sellet outañ ; titouroù all a gavot war [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} marilh ar pajennoù diverket].",
"rev-showdeleted": "diskouez",
"revisiondelete": "Diverkañ/diziverkañ stummoù",
"revdelete-nooldid-title": "N'eus stumm pal ebet evit an degasadennoù",
- "revdelete-nooldid-text": "Pe n'eo ket bet spisaet ganeoc'h ar stumm(où) pal da implijout an arc'hwel-mañ evito. pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
+ "revdelete-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal ebet da lakaat an arc'hwel-mañ da vont en-dro warnañ, pe n'eus ket eus ar stummoù spisaet, pe emaoc'h o klask kuzhat ar stumm red.",
"revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
"revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
"revdelete-show-file-submit": "Ya",
+ "revdelete-selected-text": "{{PLURAL:$1|Stummoù diuzet|Stumm diuzet}} of [[:$2]]:",
+ "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
"logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+ "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
"revdelete-text-file": "Dalc'het e vo da welet stummoù restroù dilamet en istor ar restr, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
"logdelete-text": "Gwelet e vo c'hoazh dilamadennoù er marilhoù, nemet ne c'hallo ket an dud mont da welet un darn anezho.",
"revdelete-text-others": "Ar verourien a c'hallo c'hoazh mont da welet petra zo e-barzh, hag eilpennañ an dilamadenn, nemet ha reolennoù strishoc'h ouzhpenn a vefe.",
"revdelete-legend": "Lakaat strishadurioù gwelet",
"revdelete-hide-text": "Testenn ar stumm",
"revdelete-hide-image": "Kuzhat danvez ar restr",
- "revdelete-hide-name": "Kuzhat an ober hag ar vukadenn",
+ "revdelete-hide-name": "Kuzhat ar pal hag an arventennoù",
"revdelete-hide-comment": "Notenn ar c'hemm",
"revdelete-hide-user": "Anv implijer pe chomlec'h IP an aozer",
"revdelete-hide-restricted": "Diverkañ ar roadennoù kement d'ar verourien ha d'ar re all",
"revdelete-unsuppress": "Lemel ar strishadurioù war ar stummoù assavet",
"revdelete-log": "Abeg :",
"revdelete-submit": "Lakaat da dalvezout evit an {{PLURAL:$1|adweladenn|adweladennoù}} diuzet",
- "revdelete-success": "''Gweluster ar stummoù hizivaet mat.'''",
+ "revdelete-success": "Gweluster ar stummoù hizivaet.",
"revdelete-failure": "''Dibosupl hizivaat gweluster ar stumm :'''\n$1",
- "logdelete-success": "'''Gweluster ar marilh arventennet evel m'eo dleet.'''",
+ "logdelete-success": "Kemmet eo bet gweluster ar marilh.",
"logdelete-failure": "'''N'eus ket bet gallet termeniñ gweluster ar marilh :'''\n$1",
"revdel-restore": "Cheñch ar gweluster",
"pagehist": "Istor ar bajenn",
"mergehistory-go": "Diskouez ar stummoù a c'haller kendeuziñ",
"mergehistory-submit": "Kendeuziñ ar stummoù",
"mergehistory-empty": "N'haller ket kendeuziñ stumm ebet.",
- "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm|stumm}} eus $1 e [[:$2]].",
+ "mergehistory-done": "Kendeuzet ez eus bet $3 {{PLURAL:$3|stumm}} eus $1 e [[:$2]].",
"mergehistory-fail": "Dibosupl kendeuziñ an istorioù. Gwiriit ar bajenn hag arventennoù an deiziadoù.",
"mergehistory-fail-bad-timestamp": "Merk amzer direizh.",
"mergehistory-fail-invalid-source": "Pajenn darzh direizh.",
"mergehistory-fail-invalid-dest": "Pajenn vuket direizh.",
+ "mergehistory-fail-no-change": "N'eus ket bet kendeuzet stumm ebet p'eo bet kendeuzet an istor. Gwiriit en-dro ar bajenn hag an arventennoù amzer.",
+ "mergehistory-fail-permission": "Re izel eo ho kwirioù evit gallout kendeuziñ an istor.",
+ "mergehistory-fail-self-merge": "Mammenn ha pal ar bajenn n'hall ket bezañ heñvel.",
+ "mergehistory-fail-timestamps-overlap": "En em frikañ a ra stummoù ar vammenn pe dont a reont war-lerc'h stummoù pal.",
"mergehistory-fail-toobig": "Ne c'haller ket kendeuziñ an istorioù o vezañ ma vefe mont en tu all d'ar harzh a $1 reizhadenn da zilec'hiañ.",
"mergehistory-no-source": "N'eus ket eus ar bajenn orin $1.",
"mergehistory-no-destination": "N'eus ket eus ar bajenn dal $1.",
"search-category": "(rummad $1)",
"search-file-match": "(klotañ a ra gant endalc'had ar restr)",
"search-suggest": "N'hoc'h eus ket soñjet kentoc'h e : $1",
+ "search-rewritten": "O tiskouez disoc'hoù evit $1. Klask $2 kentoc'h.",
"search-interwiki-caption": "Raktresoù kar",
"search-interwiki-default": "Disoc'hoù eus $1 :",
"search-interwiki-more": "(muioc'h)",
"prefs-tokenwatchlist": "Jedouer",
"prefs-diffs": "Diforc'hioù",
"prefs-help-prefershttps": "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
+ "prefswarning-warning": "Kemmet eo bet ho penndibaboù ganeoc'h, met enrollet n'int ket bet avat.\nMar kuitait ar bajenn-mañ hep klikañ war \"$1\" ne vo ket nevesaet ho penndibaboù",
"prefs-tabs-navigation-hint": "Titourig : Gallout a rit implijout an touchennoù bir kleiz ha bir dehoù evit merdeiñ etre an ivinelloù e roll an ivinelloù.",
"userrights": "Merañ statud an implijerien",
"userrights-lookup-user": "Diuzañ un implijer",
"userrights-user-editname": "Lakait un anv implijer :",
"editusergroup": "Kargañ strolladoù implijerien",
"editinguser": "O kemmañ gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
- "userrights-editusergroup": "Kemmañ strolladoù an implijer",
- "userrights-viewusergroup": "Gwelet ar strolladoù implijerien",
+ "viewinguserrights": "Gwelet gwirioù an {{GENDER:$1|implijer|implijerez}} <strong>[[User:$1|$1]]</strong> $2",
+ "userrights-editusergroup": "Kemmañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
+ "userrights-viewusergroup": "Gwelet strolladoù an {{GENDER:$1|implijer|implijerez}}",
"saveusergroups": "Enrollañ strolladoù an {{GENDER:$1|implijer|implijerez}}",
"userrights-groupsmember": "Ezel eus :",
"userrights-groupsmember-auto": "Ezel emplegat eus :",
- "userrights-groups-help": "Cheñch strollad an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet, pe ar c'hontrol.",
+ "userrights-groups-help": "Cheñch strolladoù an implijer a c'hallit ober.\n* Ul log asket a verk emañ an implijer er strollad.\n* Ul log diask a verk n'emañ ket an implijer er strollad.\n* Ur * a verk n'hallit ket dilemel ar strollad ur wech bet ouzhpennet ganeoc'h, pe ar c'hontrol.\n* Ur # a verk a c'hallit astenn termen echuiñ ar strollad hepken ; n'hallit ket berraat anezhañ.",
"userrights-reason": "Abeg :",
"userrights-no-interwiki": "N'oc'h ket aotreet da gemmañ ar gwirioù implijer war wikioù all.",
"userrights-nodatabase": "N'eus ket eus an diaz titouroù $1 pe n'eo ket lec'hel.",
"userrights-expiry-options": "1 deiz:1 day,1 sizhun:1 week,1 miz:1 month,3 miz:3 months,6 miz:6 months, bloaz:1 year",
"userrights-invalid-expiry": "Direizh eo termen echuiñ ar strollad \"$1\".",
"userrights-expiry-in-past": "Re gozh eo termen echuiñ ar strollad \"$1\".",
+ "userrights-cannot-shorten-expiry": "N'hallit ket astenn termen echuiñ ar strollad \"$1\". N'eus nemet an implijerien aotreet da ouzhpennañ ha lemel ar strollad-mañ a c'hall astenn an termen.",
"userrights-conflict": "Bec'h zo abalamour da gemmoù e gwirioù an implijerien. Adwelit an traoù, mar plij, ha kadarnait ho kemmoù.",
"group": "Strollad :",
"group-user": "Implijerien",
"right-reupload-shared": "Gwaskañ restroù ent lec'hel war an diellaoueg vedia rannet",
"right-upload_by_url": "Enporzhiañ ur restr adal ur chomlec'h URL",
"right-purge": "Spujañ krubuilh ar pajennoù hep kadarnaat",
- "right-autoconfirmed": "Kemmañ ar pajennoù damwarezet",
+ "right-autoconfirmed": "Na vezañ trubuilhet gant ar bevennoù kas liammet ouzh ar chomlec'hioù IP",
"right-bot": "Plediñ ganti evel gant un argerzh emgefre",
"right-nominornewtalk": "Arabat diskouez ar c'hemenn \"Kemennoù nevez zo ganeoc'h\" pa vez lakaet kemmoù dister e pajenn gaozeal un implijer",
"right-apihighlimits": "Kreskiñ ar bevennoù er goulennoù API",
"right-deletedtext": "Gwelet ar skrid diverket hag an diforc'hioù etre ar stummoù diverket",
"right-browsearchive": "Klask pajennoù bet diverket",
"right-undelete": "Assevel ur bajenn",
- "right-suppressrevision": "Teuler ur sell war ar stummoù kuzhet ouzh ar verourien hag assevel anezho",
+ "right-suppressrevision": "Gwelet, kuzhat ha diguzhat stummoù resis pajennoù zo diouzh selloù an implijerien all",
+ "right-viewsuppressed": "Gwelet ar stummoù kuzhet diouzh an implijerien all",
"right-suppressionlog": "Gwelet ar marilhoù prevez",
"right-block": "Mirout ouzh an implijerien all a gemmañ pajennoù pelloc'h",
"right-blockemail": "Mirout ouzh un implijer a gas posteloù",
"right-hideuser": "Stankañ un implijer, en ur guzhat anezhañ diouzh ar re all",
"right-ipblock-exempt": "Tremen dreist an IPoù stanket, ar stankadennoù emgefre hag ar bloc'hadennoù IP stanket",
"right-unblockself": "En em zistankañ",
- "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet",
+ "right-protect": "Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet dre skalierad",
"right-editprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-sysop}}\"",
"right-editsemiprotected": "Aozañ ar pajennoù gwarezet evel \"{{int:protect-level-autoconfirmed}}\"",
+ "right-editcontentmodel": "Kemmañ patrom danvez ur bajenn bennak",
"right-editinterface": "Kemmañ an etrefas implijer",
"right-editusercssjs": "Kemmañ restroù CSS ha JS implijerien all",
"right-editusercss": "Kemmañ restroù CSS implijerien all",
"right-editmyusercss": "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
"right-editmyuserjs": "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
"right-viewmywatchlist": "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+ "right-editmywatchlist": "Kemmañ ho roll evezhiañ deoc'h-c'hwi. Notit mat e vo c'hoazh ouzhpennet pajennoù hep ar gwir-mañ gant obererezhioù zo.",
"right-viewmyprivateinfo": "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
"right-editmyprivateinfo": "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
"right-editmyoptions": "Kemmañ ho penndibaboù",
"right-siteadmin": "Prennañ ha dibrennañ ar bank-titouroù",
"right-override-export-depth": "Ezporzhiañ ar pajennoù en ur lakaat e-barzh ar pajennoù liammet betek un donder a 5 live",
"right-sendemail": "Kas ur postel d'an implijerien all",
+ "right-managechangetags": "Krouiñ ha gweredekaat/diweredekaat [[Special:Tags|tikedennoù]]",
+ "right-applychangetags": "Lakaat [[Special:Tags|an tikedennoù]] e pleustr asambles gant kemmoù an-unan",
+ "right-changetags": "Ouzhpennañ ha dilemel [[Special:Tags|tikedennoù]], diwar ziviz, war adweladennoù hiniennel pe monedoù marilh.",
+ "right-deletechangetags": "Diverkañ[[Special:Tags|tikedennoù]] a-ziwar an diaz roadennoù",
+ "grant-generic": "Pakad aotreoù \"$1\"",
+ "grant-group-page-interaction": "Etreober gant pajennoù",
+ "grant-group-file-interaction": "Etreober gant mediaoù",
+ "grant-group-watchlist-interaction": "Etreober gant ho roll evezhiañ",
"grant-group-email": "Kas ur postel",
+ "grant-group-high-volume": "Seveniñ ur pikol obererezh",
+ "grant-group-customization": "Personeladur ha penndibaboù",
+ "grant-group-administration": "Seveniñ oberoù melestradurel",
+ "grant-group-private-information": "Gwelet ar roadennoù prevez diwar ho penn",
"grant-group-other": "Obererezh liesseurt",
"grant-blockusers": "Stankañ ha distankañ implijerien",
"grant-createaccount": "Krouiñ kontoù",
"action-editcontentmodel": "Kemmañ patrom danvez ur bajenn",
"action-managechangetags": "krouiñ ha gweredekaat/diweredekaat tikedennoù",
"action-applychangetags": "lakaat e pleustr an tikedennoù a-gevret gant ho kemmoù",
+ "action-changetags": "ouzhpennañ ha dilemel tikedennoù diwar ziviz diouzh adweladennoù hiniennel pe monedoù marilh",
"action-deletechangetags": "Diverkañ tikedennoù a-ziwar an diaz-roadennoù",
"action-purge": "spurjañ ar bajenn-mañ",
"nchanges": "$1 {{PLURAL:$1|kemm|kemm}}",
"rcfilters-invalid-filter": "Sil direizh",
"rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
"rcfilters-filterlist-title": "Siloù",
+ "rcfilters-filterlist-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
+ "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
+ "rcfilters-highlightmenu-title": "Dibabit ul liv",
"rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
"rcfilters-filtergroup-registration": "Enskrivadur an implijer",
"rcfilters-filter-registered-label": "Marilhet",
"rcfilters-filter-categorization-label": "Kemmoù rummad",
"rcfilters-filter-categorization-description": "Roll ar pajennoù ouzhpennet da rummadoù zo pe dilamet diouto.",
"rcfilters-filter-logactions-label": "Obererezhioù enrollet",
+ "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
"rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
"rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
"rcshowhideminor": "$1 ar c'hemmoù dister",
"recentchangeslinked-page": "Anv ar bajenn :",
"recentchangeslinked-to": "Diskouez ar c'hemmoù war-du ar pajennoù liammet kentoc'h eget re ar bajenn lakaet",
"recentchanges-page-added-to-category": "[[:$1]] ouzhpennet d'ar rummad",
- "recentchanges-page-removed-from-category": "Diverket eo bet [[$1]] diouzh ar rummad",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] ouzhpennet d'ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
+ "recentchanges-page-removed-from-category": "Diverket eo bet [[:$1]] diouzh ar rummad",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] dilamet diouzh ar rummad, [[Special:WhatLinksHere/$1|emañ ensoc'het ar bajenn-mañ e diabarzh pajennoù all]]",
"autochange-username": "Kemm emgefre gant MediaWiki",
"upload": "Kargañ war ar servijer",
"uploadbtn": "Kargañ ur restr",
"uploaderror": "Fazi enporzhiañ",
"upload-recreate-warning": "'''Diwallit''' : Diverket pe dilec'hiet ez eus bet ur restr gant an anv-se.'''\n\nDeoc'h da c'houzout, setu aze marilh an diverkañ hag an dilec'hiañ evit ar bajenn-mañ.",
"uploadtext": "Grit gant ar furmskrid a-is evit enporzhiañ restroù war ar servijer.\nEvit sellet pe klask skeudennoù bet enporzhiet a-raok sellit ouzh [[Special:FileList|roll ar skeudennoù]]. Kavet e vo ar skeudennoù enporzhiet war [[Special:Log/upload|marilh ar pajennoù enporzhiet]] hag an diverkadennoù war [[Special:Log/delete|istor an diverkadennoù]].\n\nEvit enklozañ ur skeudenn en ur pennad, lakait er pennad-se ul liamm skrivet evel-henn :\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.jpg]]</nowiki></code>''' evit diskouez ar restr en he spider brasañ ;\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:anv_ar_restr.png|deskrivadenn]]</nowiki></code>''' evit ober gant ur munud 200 piksel ledander er ur voest a-gleiz enni \"testenn zeskrivañ\" da zeskrivadenn\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:anv_ar_restr.ogg]]</nowiki></code>''' evit sevel ul liamm war-eeun war-du ar restr hep diskouez anezhi.",
- "upload-permitted": "Seurtoù restroù aotreet : $1.",
- "upload-preferred": "Seurtoù restroù gwellañ : $1.",
- "upload-prohibited": "Seurtoù restroù berzet : $1.",
+ "upload-permitted": "{{PLURAL:$2|Seurt|Seurtoù}} restr aotreet : $1.",
+ "upload-preferred": "{{PLURAL:$2|Seurt|Seurtoù}} restr karetañ : $1.",
+ "upload-prohibited": "{{PLURAL:$2|Seurt|Seurtoù}} restr berzet : $1.",
"uploadlogpage": "Marilh ar pajennoù enporzhiet",
"uploadlogpagetext": "Setu a-is marilh ar restroù diwezhañ bet karget war ar servijer.\nS.o [[Special:NewFiles|rann ar skeudennoù nevez]] evit kaout ur sell gwiroc'h",
"filename": "Anv ar restr",
"largefileserver": "Brasoc'h eo ar restr-mañ eget ar pezh a c'hall ar servijer aotren.",
"emptyfile": "Evit doare eo goullo ar restr bet karget ganeoc'h. Moarvat eo abalamour d'an tipo en anv ar restr. Gwiriit mat e fell deoc'h pellgargañ ar restr-mañ.",
"windows-nonascii-filename": "N'eo ket skoret anvioù ar restroù enno arouezennoù dibar gant ar wiki-mañ.",
- "fileexists": "Ur restr all gant an anv-se zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'oc'h ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
+ "fileexists": "Ur restr all gant an anv-mañ zo c'hoazh.\nTrugarez da wiriañ <strong>[[:$1]]</strong> ma n'{{GENDER:|oc'h} ket sur e fell deoc'h kemmañ anezhi.\n[[$1|thumb]]",
"filepageexists": "Amañ <strong>[[:$1]]</strong> eo bet krouet ar bajenn zeskrivañ evit ar restr-mañ, padal n'eus restr ebet dezhi an anv-se evit c'hoazh.\nAn diverradenn skrivet ganeoc'h ne vo ket gwelet war ar bajenn zeskrivañ.\nMar fell deoc'h e teufe ho tiverradenn war wel eno eo ret deoc'h-c'hwi kemmañ anezhi hoc'h-unan.\n[[$1|thumb]]",
- "fileexists-extension": "Bez' ez eus dija ur restr gant an anv-se war-bouez nebeut : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi dija : <strong>[[:$2]]</strong>\nDibabit un anv all mar plij.",
+ "fileexists-extension": "Bez' ez eus ur restr gant an hevelep anv koulz lavaret : [[$2|thumb]]\n* Anv ar restr emeur oc'h enporzhiañ : <strong>[[:$1]]</strong>\n* Anv ar restr zo anezhi c'hoazh : <strong>[[:$2]]</strong>\nDibab un anv all a fell deoc'h kentoc'h marteze ?",
"fileexists-thumbnail-yes": "Evit doare ez eus ur skeudenn krennet he ment eus ar restr ''(thumbnail)''. [[$1|thumb]]\nGwiriit ar restr <strong>[[:$1]]</strong>.\nMard eo an hevelep skeudenn ha hini ar restr orin, ha heñvel he ment, n'eo ket dav pellgargañ ur stumm krennet ouzhpenn.",
"file-thumbnail-no": "Kregiñ a ra anv ar restr gant <strong>$1</strong>.\nEvit doare eo ur skeudenn krennet he ment ''(thumbnail)''.\nMa'z eus ganeoc'h ur skeudenn uhel he fizhder, pellgargit anezhi; a-hend-all cheñchit anv ar restr.",
"fileexists-forbidden": "Ur restr all gant an anv-se zo c'hoazh ha n'hall ket bezan diverket.\nMar fell deoc'h enporzhiañ ho restr memes tra, kit war ho kiz ha grit gant un anv all [[File:$1|thumb|center|$1]]",
"pageswithprop-prop": "Anv ar perzh :",
"pageswithprop-submit": "Mont",
"pageswithprop-prophidden-long": "talvoud perzh testenn hir kuzhet ($1)",
+ "pageswithprop-prophidden-binary": "Talvoud perzh binarel kuzhet ($1)",
"doubleredirects": "Adkasoù doubl",
"doubleredirectstext": "Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.\nWar bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal \"gwirion\" a zlefe an adkas kentañ kas di.\nDiskoulmet eo bet an enmontoù <del>barrennet</del>.",
"double-redirect-fixed-move": "Dilec'hiet eo [[$1]].\nHizivaet eo bet ent emgefre ha bremañ ez adkas da [[$2]].",
"apisandbox": "Poull-traezh API",
"apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
"apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ '''servij Web API MediaWiki'''.\nKit da deuler ur sell war [https://www.mediawiki.org/wiki/API:Main_page titouroù an API] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[https://www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bennbajenn]. Dibabit un oberiadenn bennak evit gwelet skouerioù all",
+ "apisandbox-fullscreen": "Dispakañ ar banell",
"apisandbox-unfullscreen": "Diskouez ar bajenn",
"apisandbox-submit": "Sevel ar goulenn",
"apisandbox-reset": "Riñsañ",
"wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
"watchlist-hide": "Kuzhat",
"watchlist-submit": "Diskouez",
+ "wlshowtime": "Prantad amzer war wel :",
"wlshowhideminor": "kemmoù dister",
"wlshowhidebots": "robotoù",
"wlshowhideliu": "implijerien enrollet",
"wlshowhideanons": "implijerien dizanv",
+ "wlshowhidepatr": "kemmoù gwiriet",
"wlshowhidemine": "ma c'hemmoù",
"wlshowhidecategorization": "rummatadur ar bajenn",
"watchlist-options": "Dibarzhioù ar roll evezhiañ",
"version-extensions": "Astennoù staliet",
"version-skins": "Gwiskadurioù staliet",
"version-specialpages": "Pajennoù dibar",
- "version-parserhooks": "Galvoù dielfennañ",
+ "version-parserhooks": "Astennoù an dielfenner",
"version-variables": "Argemmennoù",
"version-antispam": "Mirout ouzh ar strob",
"version-other": "Diseurt",
"version-mediahandlers": "Merer danvez liesvedia",
- "version-hooks": "Galvoù",
- "version-parser-extensiontags": "Balizenn dielfennañ o tont eus an astennoù",
- "version-parser-function-hooks": "Galv an arc'hwelioù dielfennañ",
+ "version-hooks": "Krogoù",
+ "version-parser-extensiontags": "Tikedenn astennet an dielfenner ereadurel",
+ "version-parser-function-hooks": "Arc'hwelioù astennet an dielfenner ereadurel",
"version-hook-name": "Anv ar galv",
"version-hook-subscribedby": "Termenet gant",
"version-version": "($1)",
"blankpage": "Pajenn c'houllo",
"intentionallyblankpage": "A-ratozh e leusker gwenn ar bajenn-mañ",
"external_image_whitelist": " #Lezel al linenn-mañ tre evel m'emañ<pre>\n#Merkañ an tammoù bommoù reoliek (ar rann zo etre ar // nemetken) a-is\n#Klotañ a raint gant URLoù ar skeudennoù diavaez (gourliammet)\n#En em ziskwel evel skeudennoù a raio ar re a glot, evit ar re all e vo diskwelet ul liamm war-du ar skeudenn nemetken\n#Sellet e vo ouzh a linennoù a grog gant # evel ouzh notennoù\n#Kizidik eo ar roll-mañ ouzh an diforc'h etre lizherennoù bihan ha lizherennoù bras\n\n#Merkit holl rannoù ar bommoù reoliek a-us d'al linenn-mañ. Lezit al linenn ziwezhañ-mañ tre evel m'emañ</pre>",
- "tags": "Balizennoù ar c'hemmoù reizh",
- "tag-filter": "Silañ ar [[Special:Tags|balizennoù]] :",
+ "tags": "Tikedennoù ar c'hemmoù reizh",
+ "tag-filter": "Silañ an [[Special:Tags|tikedennoù]] :",
"tag-filter-submit": "Silañ",
- "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Balizenn}}]]: $2)",
- "tags-title": "Balizennoù",
- "tags-intro": "Rollañ a ra ar bajenn-mañ ar balizennoù a c'hall ar meziant implijout da verkañ kemmoù hag an dalvoudegezh anezho.",
- "tags-tag": "Anv ar valizenn",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Dikedenn|Tikedenn}}]] : $2)",
+ "tags-title": "Tikedennoù",
+ "tags-intro": "Rollañ a ra ar bajenn-mañ an tikedennoù a c'hall ar meziant implijout da verkañ kemmoù hag o zalvoudegezh.",
+ "tags-tag": "Anv an dikedenn",
"tags-display-header": "Neuz e rolloù ar c'hemmoù",
- "tags-description-header": "Deskrivadur klok ar valizenn",
+ "tags-description-header": "Deskrivadur klok an dalvoudegezh",
"tags-source-header": "Mammenn",
"tags-active-header": "Oberiant ?",
"tags-hitcount-header": "Kemmoù balizennet",
"api-error-emptypage": "N'eo ket aotreet krouiñ pajennoù goullo.",
"api-error-publishfailed": "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
"api-error-stashfailed": "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
- "api-error-unknown-warning": "Kemenn diwall dianav : $1",
+ "api-error-unknown-warning": "Kemenn-diwall dianav : \"$1\".",
"api-error-unknownerror": "Fazi dianav : \"$1\".",
"duration-seconds": "$1 {{PLURAL:$1|eilenn|eilenn}}",
"duration-minutes": "$1 {{PLURAL:$1|munut|munut}}",
"expand_templates_html_output": "Disoc'h HTML kriz",
"expand_templates_ok": "Mat eo",
"expand_templates_remove_comments": "Lemel an notennoù kuit",
- "expand_templates_remove_nowiki": "Diverkañ a ra ar balizennoù <nowiki> en disoc'h",
+ "expand_templates_remove_nowiki": "Diverkañ a ra an tikedennoù <nowiki> en disoc'h",
"expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
"expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
"expand_templates_preview": "Rakwelet",
"mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
"mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
"sessionprovider-generic": "$1 estez",
+ "sessionprovider-mediawiki-session-cookiesessionprovider": "Eztez diazezet war toupinoù",
+ "sessionprovider-nocookies": "Marteze eo diweredekaet an toupinoù. Bezit sur eo gweredekaet an toupinoù ha klaskit en-dro.",
"randomrootpage": "Pajenn wrizienn dargouezhek",
"log-action-filter-block": "Seurt bloc'had :",
+ "log-action-filter-contentmodel": "Mod kemmañ ar patrom danvez :",
+ "log-action-filter-delete": "Mod diverkañ :",
"log-action-filter-import": "Seurt enporzhiadur :",
+ "log-action-filter-managetags": "Mod embreger ar merañ tikedennoù :",
+ "log-action-filter-move": "Mod dilec'hiañ :",
"log-action-filter-newusers": "Seurt krouidigezh kont :",
+ "log-action-filter-patrol": "Mod evezhiañ :",
+ "log-action-filter-protect": "Mod gwareziñ :",
+ "log-action-filter-rights": "Mod kemmañ ar gwirioù :",
+ "log-action-filter-suppress": "Mod dilemel :",
+ "log-action-filter-upload": "Mod enporzhiañ :",
"log-action-filter-all": "An holl",
"log-action-filter-block-block": "Stankañ",
+ "log-action-filter-block-reblock": "Stankañ ar c'hemm",
"log-action-filter-block-unblock": "Distankañ",
+ "log-action-filter-contentmodel-change": "Cheñch ar patrom danvez",
+ "log-action-filter-contentmodel-new": "Krouiñ pajennoù gant ur patrom danvez n'eo ket raktermenet",
+ "log-action-filter-delete-delete": "Diverkañ pajennoù",
+ "log-action-filter-delete-delete_redir": "Adkas ar frikañ",
+ "log-action-filter-delete-restore": "Diziverkañ pajennoù",
+ "log-action-filter-delete-event": "Diverkañ ar marilh",
+ "log-action-filter-delete-revision": "Diverkañ an adweladennoù",
+ "log-action-filter-import-interwiki": "Enporzh Treuzwiki",
+ "log-action-filter-import-upload": "Enporzh dre bellgarg XML",
"log-action-filter-managetags-create": "Krouiñ tikedenn",
"log-action-filter-managetags-delete": "Diverkañ tikedenn",
"log-action-filter-managetags-activate": "Gweredekaat tikedenn",
"log-action-filter-newusers-create2": "Krouiñ gant un implijer enrollet",
"log-action-filter-newusers-autocreate": "Krouiñ ent emgefre",
"log-action-filter-newusers-byemail": "Krouiñ gant ur ger-tremen kaset dre bostel",
+ "log-action-filter-patrol-patrol": "Gwiriet gant an dorn",
+ "log-action-filter-patrol-autopatrol": "Gwiriet ent emgefre",
"log-action-filter-protect-protect": "Gwarez",
+ "log-action-filter-protect-modify": "Cheñchamant er gwarez",
"log-action-filter-protect-unprotect": "Diwarez",
+ "log-action-filter-protect-move_prot": "Gwarez dilec'hiañ",
+ "log-action-filter-rights-rights": "Cheñchamant graet gant an dorn",
"log-action-filter-rights-autopromote": "Kemm emgefre",
+ "log-action-filter-suppress-event": "Diverkañ marilhoù",
+ "log-action-filter-suppress-revision": "Diverkañ adweladennoù",
+ "log-action-filter-suppress-delete": "Diverkañ pajennoù",
+ "log-action-filter-suppress-block": "Diverkañ implijerien dre stankadennoù",
+ "log-action-filter-suppress-reblock": "Diverkañ implijerien dre stankadennoù lies",
"log-action-filter-upload-upload": "Enporzhiadenn nevez",
"log-action-filter-upload-overwrite": "Adenporzhiañ",
"authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
"authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
"authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
"authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+ "authmanager-username-help": "Anv implijer evit ar gwiriekaat.",
+ "authmanager-password-help": "Ger-tremen evit ar gwiriekaat.",
+ "authmanager-domain-help": "Domani evit ar gwiriekaat diavaez.",
"authmanager-retype-help": "Adkadarnaat ar ger-tremen.",
"authmanager-email-label": "Postel",
"authmanager-email-help": "Chomlec'h postel",
"authmanager-realname-help": "Anv gwir an implijer",
"authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
"authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+ "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
"authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
"authprovider-resetpass-skip-label": "Lammat",
"authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
"specialpage-securitylevel-not-allowed-title": "Berzet",
"authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
"authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+ "authpage-cannot-link": "Dibosupl kregiñ da liammañ ar gont.",
+ "authpage-cannot-link-continue": "Dibosupl kenderc'hel da liammañ ar gont. Aet eo an eztez d'he zermen moarvat.",
"cannotauth-not-allowed-title": "Aotre nac'het",
"cannotauth-not-allowed": "N'oc'h ket aotreet d'ober gant ar bajenn-mañ",
"changecredentials": "Kemmañ an titouroù kred",
"changecredentials-submit": "Kemmañ an titouroù kred",
"changecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+ "changecredentials-success": "Cheñchet eo bet ho titouroù anaout.",
"removecredentials": "Lemel an titouroù kred",
"removecredentials-submit": "Lemel an aotreoù",
"removecredentials-invalidsubpage": "N'eo ket $1 ur seurt titour kred reizh.",
+ "removecredentials-success": "Lamet kuit eo bet ho titouroù anaout.",
"credentialsform-provider": "Seurt titouroù kred :",
"credentialsform-account": "Anv ar gont :",
"cannotlink-no-provider-title": "N'eus kont ebet da liammañ",
"linkaccounts-submit": "Liammañ ar c'hontoù",
"unlinkaccounts": "Diliammañ ar c'hontoù",
"unlinkaccounts-success": "Diliammet eo bet ar gont.",
+ "authenticationdatachange-ignored": "N'eus ket bet gallet cheñch ho roadennoù anaout. Marteze a-wac'h peogwir ne oa ket bet kefluniet pourvezer ebet.",
+ "restrictionsfield-badip": "Chomlec'h IP pe lijorenn direizh : $1",
+ "restrictionsfield-label": "Lijorennoù IP aotreet :",
"restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
"revid": "Adweladenn $1",
"pageid": "ID ar bajenn $1"
"redirectedfrom": "(Preusmjereno sa $1)",
"redirectpagesub": "Preusmjerenje",
"redirectto": "Preusmjerenje na:",
- "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
+ "lastmodifiedat": "Ova stranica je posljednji put izmijenjena na dan $1 u $2.",
"viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
"protectedpage": "Zaštićena stranica",
"jumpto": "Idi na:",
"listduplicatedfiles": "Spisak duplih datoteka",
"listduplicatedfiles-summary": "Ovo je spisak datoteka koje su duplikat nekih drugih datoteka. Prikazane su samo lokalne datoteke.",
"listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|jedan duplikat|$2 duplikata}}]].",
- "unusedtemplates": "Nekorišteni šabloni",
+ "unusedtemplates": "Neiskorišteni šabloni",
"unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
"unusedtemplateswlh": "ostali linkovi",
"randompage": "Slučajna stranica",
"brokenredirectstext": "Sljedeća preusmjerenja vode na nepostojeće stranice:",
"brokenredirects-edit": "uredi",
"brokenredirects-delete": "obriši",
- "withoutinterwiki": "Članci bez interwiki linkova",
+ "withoutinterwiki": "Stranice bez jezičkih linkova",
"withoutinterwiki-summary": "Slijedeće stranice nemaju linkove prema verzijama na drugim jezicima.",
"withoutinterwiki-legend": "Prefiks",
"withoutinterwiki-submit": "Prikaži",
- "fewestrevisions": "Stranice sa najmanje izmjena",
+ "fewestrevisions": "Stranice s najmanje izmjena",
"nbytes": "$1 {{PLURAL:$1|bajt|bajta|bajtova}}",
"ncategories": "$1 {{PLURAL:$1|kategorija|kategorije}}",
"ninterwikis": "$1 {{PLURAL:$1|međujezična veza|međujezične veze}}",
"specialpage-empty": "Nema rezultata za ovaj izvještaj.",
"lonelypages": "Siročad",
"lonelypagestext": "Sljedeće stranice nisu povezane niti su uključene transkluzijom u druge stranice na {{GRAMMAR:dativ|{{SITENAME}}}}.",
- "uncategorizedpages": "Nekategorisane stranice",
- "uncategorizedcategories": "Nekategorisane kategorije",
- "uncategorizedimages": "Slike bez kategorije",
- "uncategorizedtemplates": "Šabloni bez kategorije",
+ "uncategorizedpages": "Nekategorizirane stranice",
+ "uncategorizedcategories": "Nekategorizirane kategorije",
+ "uncategorizedimages": "Nekategorizirane datoteke",
+ "uncategorizedtemplates": "Nekategorizirani šabloni",
"unusedcategories": "Neiskorištene kategorije",
"unusedimages": "Nekorištene slike",
"wantedcategories": "Tražene kategorije",
- "wantedpages": "Najpotrebnije stranice",
+ "wantedpages": "Tražene stranice",
"wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
"wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
"wantedfiles": "Tražene datoteke",
"wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
"wantedfiletext-nocat": "Sljedeće datoteke se koriste, ali ne postoje. Datoteke iz drugih baza mogu biti navedene iako postoje. Takve datoteke će biti <del>precrtane</del> sa spiska.",
"wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
- "wantedtemplates": "Potrebni šabloni",
+ "wantedtemplates": "Traženi šabloni",
"mostlinked": "Članci sa najviše linkova",
"mostlinkedcategories": "Kategorije sa najviše linkova",
"mostlinkedtemplates": "Najviše uključene stranice",
"mostimages": "Datoteke s najviše veza",
"mostinterwikis": "Stranice sa najviše međuwikija",
"mostrevisions": "Članci sa najviše izmjena",
- "prefixindex": "Sve stranice sa prefiksom",
+ "prefixindex": "Sve stranice s prefiksom",
"prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
"prefixindex-submit": "Prikaži",
"prefixindex-strip": "Sakrij prefiks u spisku",
"shortpages": "Kratke stranice",
- "longpages": "Dugačke stranice",
- "deadendpages": "Stranice bez unutrašnjih veza",
+ "longpages": "Duge stranice",
+ "deadendpages": "Stranice bez unutrašnjih linkova",
"deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
"protectedpages": "Zaštićene stranice",
"protectedpages-indef": "Samo neograničena zaštićenja",
"categories-submit": "Prikaži",
"categoriespagetext": "{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.\n[[Special:UnusedCategories|Nekorištene kategorije]] nisu prikazane ovdje.\nVidi također [[Special:WantedCategories|zatražene kategorije]].",
"categoriesfrom": "Prikaži kategorije počev od:",
- "deletedcontributions": "Obrisani doprinosi korisnika",
+ "deletedcontributions": "Obrisani korisnički doprinosi",
"deletedcontributions-title": "Obrisani doprinosi korisnika",
"sp-deletedcontributions-contribs": "doprinosi",
"linksearch": "Pretraga vanjskih linkova",
"listgrants-summary": "Ovo je spisak OAuth dozvola s odgovarajućim pravima uz svaku dozvolu s desne strane. Korisnici aplikacijama mogu odobriti da koriste njihov korisnički račun ali uz ograničena prava u zavisnosti od tog koju dozvolu im korisnik omogući. Međutim, aplikacija koja se koristi korisničkim računom ne može koristiti prava koja korisnik ne posjeduje. Moguće je da postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o pojedinim pravima.",
"listgrants-grant": "Dozvola",
"listgrants-rights": "Prava",
- "trackingcategories": "Praćenje kategorija",
+ "trackingcategories": "Kategorije za praćenje",
"trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
"trackingcategories-msg": "Praćenje kategorije",
"trackingcategories-name": "Ime poruke",
"namespace_association": "Povezan imenski prostor",
"tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
"blanknamespace": "(glavni)",
- "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
+ "contributions": "{{GENDER:$1|Korisnički}} doprinosi",
"contributions-title": "Doprinosi korisnika $1",
"mycontris": "Doprinosi",
"anoncontribs": "Doprinosi",
"tooltip-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
"tooltip-search-go": "Idi na stranicu s tačno ovim imenom ako postoji",
"tooltip-search-fulltext": "Pretražite stranice s ovim tekstom",
- "tooltip-p-logo": "Glavna stranica",
+ "tooltip-p-logo": "Posjetite početnu stranicu",
"tooltip-n-mainpage": "Posjetite početnu stranicu",
"tooltip-n-mainpage-description": "Posjetite početnu stranicu",
"tooltip-n-portal": "O projektu, šta možete da uradite, gdje se šta nalazi",
"markedaspatrollederror": "Ne može se označiti kao patrolirano",
"markedaspatrollederrortext": "Morate izabrati izmjenu koju želite označiti patroliranom.",
"markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
- "markedaspatrollednotify": "Ova izmjena na stranici „$1“ je označena kao pregledana.",
+ "markedaspatrollednotify": "Ova izmjena na stranici $1 označena je kao patrolirana.",
"markedaspatrollederrornotify": "Označavanje stranice pregledanom nije uspjelo.",
"patrol-log-page": "Zapisnik patroliranja",
"patrol-log-header": "Ovo je zapisnik patroliranih izmjena.",
"revdelete-uname-unhid": "korisničko ime je otkriveno",
"revdelete-restricted": "primijenjena ograničenja za administratore",
"revdelete-unrestricted": "uklonjena ograničenja za administratore",
- "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
+ "logentry-block-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} u trajanju od $5 $6",
"logentry-block-unblock": "$1 {{GENDER:$2|deblokirao|deblokirala}} je {{GENDER:$4|$3}}",
"logentry-block-reblock": "$1 {{GENDER:$2|promijenio|promijenila}} je postavke za blokiranje {{GENDER:$4|korisnika|korisnice}} {{GENDER:$4|$3}} u trajanju od $5 $6",
"logentry-suppress-block": "$1 {{GENDER:$2|blokirao|blokirala}} je {{GENDER:$4|$3}} sa vremenom isticanja blokade od $5 $6",
"rcfilters-invalid-filter": "Filtre no vàlid",
"rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
"rcfilters-filterlist-title": "Filtres",
+ "rcfilters-highlightmenu-title": "Selecciona un color",
"rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
"rcfilters-filtergroup-registration": "Registre d'usuari",
"rcfilters-filter-registered-label": "Registrats",
"rcfilters-filter-categorization-label": "Canvis de categoria",
"rcfilters-filter-categorization-description": "Registres de pàgines afegides o suprimides de les categories.",
"rcfilters-filter-logactions-label": "Accions registrades",
+ "rcfilters-filter-logactions-description": "Accions administratives, creacions de comptes, eliminacions de pàgines, càrregues...",
"rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
"rclistfrom": "Mostra els canvis nous des de $3, $2",
"rcshowhideminor": "$1 edicions menors",
"apisandbox-reset": "Neteja",
"apisandbox-retry": "Torna a provar",
"apisandbox-loading": "S'està carregant la informació del mòdul d'API «$1»...",
+ "apisandbox-no-parameters": "Aquest mòdul API no té paràmetres.",
"apisandbox-helpurls": "Enllaços d'ajuda",
"apisandbox-examples": "Exemples",
"apisandbox-dynamic-parameters": "Paràmetres adicionals",
"apisandbox-sending-request": "S'està enviant una sol·licitud API...",
"apisandbox-loading-results": "S'estan reben els resultats de l'API...",
"apisandbox-results-error": "S'ha produït un error en carregar la resposta de la consulta de l'API: $1.",
+ "apisandbox-request-selectformat-label": "Mostra les dades de sol·licitud com:",
+ "apisandbox-request-format-url-label": "Cadena de consulta de l'URL",
"apisandbox-request-url-label": "Sol·licita URL:",
"apisandbox-request-json-label": "JSON de sol·licitud:",
"apisandbox-request-time": "Temps de sol·licitud: {{PLURAL:$1|$1 ms}}",
"log-name-tag": "Registre d'etiquetes",
"rightsnone": "(cap)",
"revdelete-summary": "el resum d'edició",
+ "rightslogentry-temporary-group": "$1 (temporal, fins a $2)",
"feedback-adding": "S'està afegint el comentari a la pàgina...",
"feedback-back": "Enrere",
"feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
"cannotauth-not-allowed": "No teniu permisos per utilitzar la pàgina",
"changecredentials": "Canvi de dades credencials",
"changecredentials-submit": "Canvia les dades credencials",
+ "changecredentials-invalidsubpage": "$1 no és tipus de credencial vàlid.",
"changecredentials-success": "Les vostres credencials han estat canviades.",
"removecredentials": "Suprimeix les credencials",
"removecredentials-submit": "Suprimeix les credencials",
"showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
"checkbox-select": "Харжар: $1",
"checkbox-all": "Массо",
- "checkbox-none": "ХӀума а",
+ "checkbox-none": "ХӀума",
"checkbox-invert": "Инверт ян",
"allpages": "Массо агӀонаш",
"nextpage": "ТӀаьхьа йогӀу агӀо ($1)",
"tog-watchdefault": "ئەو پەڕانە و ئەو پەڕگانە من دەستکاریان دەکەم زیاد بکە بە لیستی چاودێڕییەکەم",
"tog-watchmoves": "ئەو پەڕانە و ئەو پەڕگانە کە من گواستومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
"tog-watchdeletion": "ئەو پەڕانە و ئەو پەڕگانە من سڕیومنەتەوە زیاد بکە بە لیستی چاودێڕییەکەم",
+ "tog-watchuploads": "ئەو پەڕگە نوێیانەی باریان دەکەم زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
+ "tog-watchrollback": "ئەو پەڕانەی کە کرداری گەڕاندنەوەم لەسەر ئەنجام داون زیاد بکە ناو پێڕستی چاودێرییەکەمەوە",
"tog-minordefault": "ھەموو دەستکارییەکان بە ورد نیشان بکە لە حاڵەتی دیفاڵت",
"tog-previewontop": "پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە",
"tog-previewonfirst": "لە یەکەم دەستکاری دا پێشبینین نیشان بدە",
"newwindow": "(لە پەڕەیەکی نوێدا دەکرێتەوە)",
"cancel": "ھەڵوەشاندنەوە",
"moredotdotdot": "زیاتر",
- "morenotlisted": "ئەم لیستەیە تەواو نییە",
+ "morenotlisted": "ئەم لیستە لەوانەیە تەواو نەبێت",
"mypage": "پەڕە",
"mytalk": "لێدوان",
"anontalk": "لێدوان",
"searcharticle": "بڕۆ",
"history": "مێژووی پەڕە",
"history_short": "مێژووی پەڕە",
+ "history_small": "مێژوو",
"updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
"printableversion": "وەشانی ئامادەی چاپ",
"permalink": "بەستەری ھەمیشەیی",
"view": "بینین",
"view-foreign": "لە $1دا بیبینە",
"edit": "دەستکاری",
+ "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
"create": "دروستکردن",
"create-local": "وەسفی ناوچەیی زۆر بکە",
"editthispage": "دەستکاری ئەم پەڕەیە بکە",
"talk": "وتووێژ",
"views": "بینینەکان",
"toolbox": "ئامرازەکان",
+ "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+ "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
+ "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
"userpage": "بینینی پەڕەی بەکارھێنەر",
"projectpage": "پەڕەی پرۆژە نیشان بدە",
"imagepage": "پەڕەی پەڕگە نیشان بدە",
"jumptonavigation": "ڕێدۆزی",
"jumptosearch": "گەڕان",
"view-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، نەختێک بوەستە.\n\n$1",
+ "generic-pool-error": "ببورە، لەم کاتەدا ڕاژەکارەکان زیادەباریان لە سەرە.\nژمارەیەکی زۆر لە بەکارھێنەران ھاوکات ھەوڵی دیتنی ئەم پەڕەیان داوە.\nتکایە پێش ھەوڵی دووبارە بۆ دیتنی ئەم پەڕە، کەمێک بووەستە.",
"pool-timeout": "لەکات دەرچوون ڕوویدا لەکاتی چاوەڕوانکردنی داخستندا",
"pool-errorunknown": "هەڵەی نەزانراو",
"aboutsite": "دەربارەی {{SITENAME}}",
"viewsource": "بینینی سەرچاوە",
"viewsource-title": "سەرچاوەی $1 ببینە",
"actionthrottled": "چالاکی پێشی پێ گیرا",
- "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 سپÛ\95Ù\85Ø\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت تÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت دا Ù\84Û\95 سÛ\95ر Û\8cÛ\95Ú© ئÛ\95Ù\85Û\95 زÛ\86ر جار ئÛ\95Ù\86جاÙ\85 بدÛ\95Û\8cØ\8c Ù\88Û\95 ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
+ "actionthrottledtext": "بÛ\95 Ù\85Û\95بÛ\95ستÛ\8c Ù¾Û\8eشگرÛ\8cÛ\8c Ù\84Û\95 خراپکارÛ\8cØ\8c Ú\95Û\8eÚ¯Û\95 Ù\86ادرÛ\8eت تÛ\86 Ù\84Û\95 Ù\85اÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ú©Ù\88رت دا Ù\84Û\95 سÛ\95ر Û\8cÛ\95Ú© ئÛ\95Ù\85Û\95 زÛ\86ر جار ئÛ\95Ù\86جاÙ\85 بدÛ\95Û\8cØ\8c ئیستا تۆ لە ڕادە بەدەرت کردووە.\nتکایە پاش چەند خولەک دووبارە تاقی بکەوە.",
"protectedpagetext": "بۆ بەرگری لە دەستکاریکردن یان چالاکییەکانی تر ئەم پەڕەیە پارێزراوە.",
"viewsourcetext": "دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی٫",
"viewyourtext": "دەتوانی ژێدەری <strong>دەستکارییەکەت</strong> لەم پەڕەیەدا ببینی و کۆپی بکەی.",
"virus-scanfailed": "سکەن ئەنجام نەدرا(کۆد $1)",
"virus-unknownscanner": "دژەڤایرس نەناسراوە:",
"logouttext": "'''ئێستا چوویتە دەرەوە.'''\n\nئاگادار بە ھەتا ئەو کاتەی کەشی وێبگەڕەکەت پاک دەکەیتەوە، لەوانەیە ھەندێک لە پەڕەکان وا پێشان بدرێن کە ھێشتا لە ژوورەوە بیت.",
+ "cannotlogoutnow-title": "ناتوانیت لە ئێستادا بچیتە دەرەوە",
+ "cannotlogoutnow-text": "توانای چوونە دەرەوەت نییە لەکاتی بەکارھێنانی $1",
"welcomeuser": "بەخێربێیت، $1!",
"welcomecreation-msg": "ھەژمارەکەت دروست کرا.\nلە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.",
"yourname": "ناوی بەکارھێنەری:",
"createacct-yourpasswordagain-ph": "تێپەروشە دیسان بنووسەوە",
"userlogin-remembermypassword": "چوونەژوورەوەکەم ڕابگرە",
"userlogin-signwithsecure": "پەیوەندیی دڵنیا بەکاربھێنە",
+ "cannotlogin-title": "ناتوانیت بچیتە ژوورەوە",
+ "cannotlogin-text": "توانای چوونەژوورەوەت نییە",
+ "cannotloginnow-title": "ناتوانیت لە ئێستادا بچیتە ناوەوە",
+ "cannotloginnow-text": "توانای چوونەژوورەوەت نییە لەکاتی بەکارھێنانی $1",
+ "cannotcreateaccount-title": "ناتوانرێت ھەژمار دروست بکرێت",
"yourdomainname": "دۆمەینەکەت:",
"password-change-forbidden": "ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.",
"externaldberror": "یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.",
"login": "بچۆ ژوورەوە",
+ "login-security": "شوناست دڵنیا بکەرەوە",
"nav-login-createaccount": "بچۆ ژوورەوە / ھەژمار دروست بکە",
"userlogin": "بچۆ ژوورەوە / ھەژمار دروست بکە",
"userloginnocreate": "بچۆ ژوورەوە",
"userlogin-resetpassword-link": "تێپەڕوشەکەت بیر کردووە؟",
"userlogin-helplink2": "یارمەتی بۆ چوونەژوورەوە",
"userlogin-loggedin": "تۆ ھەر ئێستا بە ناوی {{GENDER:$1|$1}} چوویتە ژوورەوە.\nفۆرمی ژێرەوە بەکاربھێنە بۆ چوونەژوورەوە وەک بەکارھێنەرێکی تر.",
+ "userlogin-reauth": "دەبێت دووبارە بچیتە ژوورەوە بۆ دڵنیا بوونەوە لە {{GENDER:$1|$1}}بوونت.",
"userlogin-createanother": "ھەژمارێکی تر دروست بکە",
"createacct-emailrequired": "ناونیشانی ئیمەیل",
"createacct-emailoptional": "ناونیشانی ئیمەیل (دڵخوازانە)",
"createacct-email-ph": "ناونیشانی ئیمەیلەکەت بنووسە",
"createacct-another-email-ph": "ناونیشانی ئیمەیڵەکەت بنووسە",
"createaccountmail": "تێپەڕوشەیەکی ھەڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاریکراو",
+ "createaccountmail-help": "دەتوانرێت بەکار بھێندرێت بۆ دروستکردنی ھەژمار بۆ کەسێکی تر بەبێ زانینی تێپەڕ وشەکەی.",
"createacct-realname": "ناوی ڕاستی (دڵخوازانە)",
"createaccountreason": "هۆکار:",
"createacct-reason": "ھۆکار",
"createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
"createacct-submit": "ھەژمارەکەت دروست بکە",
"createacct-another-submit": "ھەژمار دروست بکە",
+ "createacct-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
+ "createacct-another-continue-submit": "بەردەوامبوون لە دروستکردنی ھەژمار",
"createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
"createacct-benefit-body1": "{{PLURAL:$1|دەستکاری}}",
"createacct-benefit-body2": "{{PLURAL:$1|پەڕە}}",
"createacct-benefit-body3": "دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}",
"badretype": "تێپەڕوشەکان لەیەک ناچن.",
+ "usernameinprogress": "دروستکردنی ھەژمارێک بۆ ئەم ناوی بەکارھێنەرە لە پڕۆسەی بەرھەمھێناندایە. تکایە چاوەڕوان بە.",
"userexists": "ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.\nناوێکی دیکە ھەڵبژێرە.",
"loginerror": "ھەڵەی چوونەژوورەوە",
"createacct-error": "ھەڵە لە دروستکردنی ھەژمار",
"nocookiesnew": "ھەژماری بەکارھێنەری دروست کرا، بەڵام نەچوویتەوە ژوورەوە.\n{{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر کوکی بەکاردەھێنێت.\nتۆ کوکییەکەکەت لەکارخستووە.\nتکایە کوکییەکە کارا بکە، پاشان بە ناوی بەکارھێنەری و تێپەڕوشەکەت بچۆ ژوورەوە.",
"nocookieslogin": "{{SITENAME}} بۆ چوونەژوورەوە لە کووکییەکان کەڵک وەرئەگرێت.\nڕێگەت نەداوە بە کووکییەکان.\nڕێگەیان پێ بدەو و دیسان تێبکۆشە.",
"nocookiesfornew": "ھەژماری بەکارھێنەری دروست نەکرا، چون ناتوانین سەرچاوەکەی پشتڕاست بکەینەوە.\nدڵنیا بە کوکییەکانت چالاک کردووە، پەڕەکە بار بکەوە و دیسان ھەوڵ بدە.",
+ "createacct-loginerror": "ھەژمارەکە بە سەرکەوتوانە دروست کرا، بەڵام ناتوانرێت بە شێوەیەکی ئۆتۆماتیکی بکرێیتە ژوورەوە. تکایە سەردانی [[Special:UserLogin|ڕێنماییەکانی چوونەژوورەوە]] بکە.",
"noname": "ناوی بەکارهێنەرییەکی گۆنجاوت دیاری نەکردووه.",
"loginsuccesstitle": "چوویە ناوەوە",
"loginsuccess": "'''ئێستا بە ناوی «$1»ەوە لە {{SITENAME}} چوویتەتەژوورەوە.'''",
- "nosuchuser": "بەکارھێنەرێک بە ناوی «$1» نیە.\nناوی بەکارھێنەر بە گەورە و بچووک بوونی پیتەکان ھەستیارە.\nڕێنووسەکەت چاولێکەرەوە، یان [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]].",
+ "nosuchuser": "بÛ\95کارھÛ\8eÙ\86Û\95رÛ\8eÚ© بÛ\95 Ù\86اÙ\88Û\8c «$1» Ù\86Û\8cÛ\8cÛ\95.\nÙ\86اÙ\88Û\8c بÛ\95کارھÛ\8eÙ\86Û\95ر بÛ\95 Ú¯Û\95Ù\88رÛ\95 Ù\88 بÚ\86Ù\88Ù\88Ú© بÙ\88Ù\88Ù\86Û\8c Ù¾Û\8cتÛ\95کاÙ\86 Ú¾Û\95ستÛ\8cارÛ\95.\nÚ\95Û\8eÙ\86Ù\88Ù\88سÛ\95Ú©Û\95ت Ú\86اÙ\88Ù\84Û\8eÚ©Û\95رÛ\95Ù\88Û\95Ø\8c Û\8cاÙ\86 [[Special:CreateAccount|Ú¾Û\95Ú\98Ù\85ارÛ\8eÚ©Û\8c Ù\86Ù\88Û\8e درÙ\88ست بکÛ\95]].",
"nosuchusershort": "بەکارھێنەرێک بە ناوی «$1»ەوە نیە.\nبە نووسراوەکەتدا بچۆرەوە.",
"nouserspecified": "دەبێت ناوێکی بەکارھێنەری دەستنیشان بکەیت.",
"login-userblocked": "ئەم بەکارهێنەرە بڵۆک کراوە. چوونەژوورەوە ڕێگەپێنەدراوە.",
"wrongpassword": "تێپەڕوشەی ھەڵە.\nتکایە دووبارە تێبکۆشە.",
"wrongpasswordempty": "تێپەڕەوشەی لێدراو بەتاڵبوو.\nتکایە هەوڵ بدەوە.",
"passwordtooshort": "تێپەڕوشەکەت لانی کەم دەبێ {{PLURAL:$1|١ پیت|$1 پیت}} بێت.",
+ "passwordtoolong": "تێپەڕ وشەکان ناتوانرێت لە {{PLURAL:$1|١ کارەکتەر|$1 کارەکتەر}} درێژتر بێت.",
+ "passwordtoopopular": "تێپەڕ وشە باوەکان ناتواندرێت دابنرێن. تکایە تێپەڕ وشەیەکی دەگمەنتر ھەڵبژێرە.",
"password-name-match": "تێپەڕوشەکەت ئەبێ جیاواز بێت لە ناوی بەکارهێنەریت.",
"password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
"mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
"noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
"noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
"passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
- "blocked-mailpassword": "ئادرەسی ئایپی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.",
+ "blocked-mailpassword": "ناونیشانی ئای پی تۆ بۆ دەستکاری کردن بەستراوه. بۆ بەرگری لە بەکارهێنانی نابەجێ، ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە لەسەر ئەم ناونیشانە ئای پییە.",
"eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
"throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
"mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
"createaccount-title": "درووست کردنی ھەژمار بۆ {{SITENAME}}",
"createaccount-text": "کەسێک ھەژمارێکی بۆ ناونیشانی ئیمێلی تۆ لە {{SITENAME}}دا ($4) بە ناوی «$2»ـەوە و بە تێپەڕوشەی «$3»ـەوە دروست کردووە.\nدەبێت ھەر ئێستا بچیتە چوورەوە و تێپەڕوشەیەکەت بگۆڕیت.\n\nئەگەر ئەم ھەژمارە بە ھەڵە دروست کراوە، دەکرێت گوێ بەم پەیامە نەدەیت.",
"login-throttled": "زۆر زۆر ھەوڵت داوە بۆ چوونە ژوورەوە.\nتکایە $1 بوەستە پێش ھەوڵی دووبارە.",
+ "login-abort-generic": "چوونەژوورەوەکەت شکستی ھێنا - بەجێ ھێڵدرا",
+ "login-migrated-generic": "ھەژمارەکەت گوازراوەتەوە و ناوی بەکارھێنەرەکەت چی تر لەسەر ئەم ویکیپیدیایە بوونی نییە.",
"loginlanguagelabel": "زمان: $1",
+ "suspicious-userlogout": "داواکارییەکەت بۆ چوونە دەرەوە ڕەت کرایەوە لەبەر ئەوەی وا دیارە داواکارییەکە لەلایەن براوسەرێکی شکاوەوە نێردراوە.",
+ "createacct-another-realname-tip": "ناوی ڕاستیت پێویست نییە.\nئەگەر ھەڵت بژارد کە دایبنێیت، ئەوا بەکار دەھێندرێت بۆ ئاماژە کردن بە بەکارھێنەر بۆ بەشدارییەکانیان.",
"pt-login": "بچۆ ژوورەوە",
"pt-login-button": "بچۆ ژوورەوە",
+ "pt-login-continue-button": "بەردەوامبوونی چوونەژوورەوە",
"pt-createaccount": "ھەژمار دروست بکە",
"pt-userlogout": "بچۆ دەرەوە",
+ "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
"changepassword": "تێپەڕوشە بگۆڕە",
"resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
"resetpass_text": "<!-- تێپهڕهوشهی ههژمارهكه سفر بكهرهوه -->",
"retypenew": "تێپەڕوشەی نوێ دوبارە بنووسەوە:",
"resetpass_submit": "تێپەڕوشە رێکخە و بچۆ ژوورەوە",
"changepassword-success": "تێپەڕەوشەکەت گۆڕدرا!",
+ "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
+ "botpasswords": "تێپەڕ وشەی بۆت",
+ "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+ "botpasswords-label-appid": "ناوی بۆت",
"botpasswords-label-create": "دروستکردن",
"botpasswords-label-update": "نوێکردنەوە",
"botpasswords-label-cancel": "ھەڵوەشاندنەوە",
"botpasswords-label-delete": "سڕینەوە",
"botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
+ "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+ "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+ "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+ "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
"resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
"resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
"resetpass-submit-loggedin": "تێپەڕوشە بگۆڕە",
"resetpass-submit-cancel": "ھەڵوەشاندنەوە",
"resetpass-wrong-oldpass": "تێپەڕوشەی ھەنووکەیی یان تێپەڕوشەی کاتی ھەڵەیە.\nوا دیارە تێپەڕوشەکەت بە سەرکەوتوویی گۆڕدراوە یان داوای تێپەڕوشەیەکی نوێت کردووە.",
+ "resetpass-recycled": "تکایە تێپەڕوشەکەت بگۆڕە بە دانەیەکی جیاواز لەوەی ئێستا.",
+ "resetpass-temp-emailed": "تۆ بە تێپەڕوشەیەکی کاتیی ھاتوویتە ژوورەوە. بۆ تەواوکردنی چوونە ژوورەوە تێپەڕوشەیەکی نوێ لێرە دابنێ.",
"resetpass-temp-password": "تێپەڕوشەی کاتی:",
+ "resetpass-expired": "تێپەڕ وشەکەت بەسەر چووە، تکایە تێپەڕ وشەیەکی نوێ دابنێ بۆ چوونە ژوورەوە",
+ "resetpass-validity-soft": "تێپەڕ وشەکەت دروست نییە: $1",
"passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
+ "passwordreset-text-one": "ئەم فۆرمە تەواو بکە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ",
+ "passwordreset-text-many": "{{PLURAL:$1|یەکێک لەم بۆشاییانە بڕ بکەرەوە بۆ بەدەستھێنانی تێپەڕ وشەیەکی کاتیی بە ئیمەیڵ}}",
"passwordreset-username": "ناوی بەکارھێنەری:",
"passwordreset-domain": "پاوان:",
"passwordreset-email": "ناونیشانی ئیمەیل:",
"passwordreset-emailtext-ip": "کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
"passwordreset-emailtext-user": "بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
"passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
- "passwordreset-emailsentemail": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
- "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
- "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
+ "passwordreset-emailsentemail": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ھەژمارەکەتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+ "passwordreset-emailsentusername": "ئەگەر ناونیشانی ئەم ئیمەیڵە بەستراوەتەوە بە ناوی بەکارھێنەرتەوە، ئەوا ڕێکخستنەوەی تێپەڕ وشەت بە ئیمەیڵ پێ دەگات.",
+ "passwordreset-invalidemail": "ناونیشانی ئیمەیڵی نەگونجاو",
+ "passwordreset-nodata": "نە ئیمەیڵێک یان ناوی بەکارھێنەرێک ھەڵبژێردرا",
+ "changeemail": "گۆڕین یان لابردنی ناونیشانی ئیمەیل",
+ "changeemail-header": "ئەم فۆرمە تەواو بکە بۆ گۆڕینی ناونیشانی ئیمەیڵەکەت. ئەگەر ئارەزووی ئەوە دەکەیت کە ھەر ئیمەیڵێک لە ھەژمارەکەت بکەیتەوە، بۆشایی ئیمەیڵی نوێ بە بەتاڵی بەجێ بھێڵە لەکاتی پاشەکەوتکردنی فۆرمەکە.",
"changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
"changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
"changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
+ "changeemail-newemail-help": "ئەم بۆشاییە دەبێت خاڵی بێت ئەگەر دەتەوێت ناونیشانی ئیمەیڵەکەت لابەریت. تۆ ناتوانیت ئیمەیڵی ڕێکخستنەوەی تێپەڕە وشە یاخود ھەر ئیمەیڵێکی تری ئەم ویکییەت پێ بگات ئەگەر ناونیشانی پۆستە ئەلیکترۆنییەکە لاببرێت.",
"changeemail-none": "(ھیچ)",
"changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
"changeemail-submit": "ئەمەیل بگۆڕە",
+ "changeemail-nochange": "تکایە ناونیشانی ئیمەیڵێکی جیاواز بەکار بھێنە.",
"bold_sample": "دەقی ئەستوور",
"bold_tip": "دەقی ئەستوور",
"italic_sample": "دەقی لار",
"sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
"hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
"summary": "کورتەی دەستکاری:",
- "subject": "بابەت/سەردێڕ:",
+ "subject": "بابەت:",
"minoredit": "ئەمە دەستکارییەکی بچووکە",
"watchthis": "ئەم پەڕەیە بخە ژێر چاودێری",
"savearticle": "پەڕەکە پاشەکەوت بکە",
"savechanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
+ "publishpage": "بڵاوکردنەوەی پەڕە",
+ "publishchanges": "پاشەکەوتکردنی گۆڕانکارییەکان",
"preview": "پێشبینین",
"showpreview": "پێشبینین نیشان بدە",
"showdiff": "گۆڕانکارییەکان نیشان بدە",
+ "blankarticle": "<strong>ئاگاداری:</strong> ئەو پەڕەیەی کە ھەوڵی دروستکردنی دەدەیت واڵایە. ئەگەر کرتە لەسەر «{{int:savearticle}}» بکەیت دووبارە، پەڕەکە بەبێ ھیچ ناوەڕۆکێک دروست دەبێت.",
"anoneditwarning": "<strong>ھۆشیار بە:</strong> نەڕۆیشتووتەتە ژوورەوە. ھەر دەستکارییەک بکەیت ناونیشانی IPیەکەت بۆ ھەموو کەسێک دیار دەبێت. بەڵام ئەگەر <strong>[$1 بچیتە ژوورەوە]</strong> یان <strong>[$2 ھەژمارێک دروست بکەیت]</strong>، دەستکارییەکانت بە ناوی بەکارھێنەرییەکەتەوە بڵاو دەبێتەوە و لە چەند قازانجی تریشی ھەیە.",
"anonpreviewwarning": "«نەڕۆشتوویتە ژوورەوە. پاشەکەوتکردن، ئەدرەسی IPەکەت لە مێژووی دەستکاریی ئەم پەڕە تۆمار دەکات.»",
"missingsummary": "'''وە بیر خستنەوە:''' پوختەیەکت نەنووسیوە بۆ چۆنیەتی گۆڕانکارییەکەت.\nئەگەر جارێکی تر پاشکەوت کردن لێبدەی، بێ پوختە تۆمار دەکرێ.",
+ "selfredirect": "<strong>ئاگاداری:</strong> تۆ خەریکی گواستنەوەی ئەم پەڕەیەیت بۆ سەر خۆی. لەوانەیە خەریکی گواستنەوەی پەڕەیەکی ھەڵە بیت یان ھەوڵی گواستنەوە دەدەیت بۆ ئامانجێکی ھەڵە. \nئەگەر دەەبارە کرتە لەسەر «{{int:savearticle}}» بکەیتەوە، ڕەوانەکەرەکە دروست دەکرێت بەھەرحاڵ.",
"missingcommenttext": "تکایە لە خوارەوە شرۆڤەیەک بنووسە.",
"missingcommentheader": "'''بیرهێنانەوە:''' بۆ ئەم بۆچوونەت سەردێڕ\\بابەت ڕاچاو نەکردووە.\nئەگەر دیسان «{{int:savearticle}}» لێبدەی، دەستکاریەکەت بێ سەردێڕ یان بابەت پاشەکەوت دەبێ.",
"summary-preview": "پێشبینینی کورتە:",
- "subject-preview": "پێشبینینی بابەت/سەردێڕ:",
+ "subject-preview": "پێشبینینی بابەت:",
+ "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
"blockedtitle": "بەکارھێنەر بەربەست کراوە",
"blockedtext": "'''ناوی بەکارهێنەری یان ئایپی ئەدرەسی تۆ بەربەست کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەستکران: $8\n* کۆتایی هاتنی بەربەستکران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەستکرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێکراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئایپی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەستکراو #$5.\nتکایە لە هەر پرس و داواکاریەکتدا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
"autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
"accmailtext": "تێپەڕوشەیەک کە بە هەڕەمەکی بۆ [[User talk:$1|$1]] دروست کرا، نێررا بۆ $2. دەتوانیت لە پەڕەی <em>[[Special:ChangePassword|گۆڕینی تێپەڕوشەدا]]</em> لە کاتی چوونەژوورەوەدا بیگۆڕی.",
"newarticle": "(نوێ)",
"newarticletext": "بە دوای بەستەری پەڕەیەک کەوتووی کە ھێشتا دروست نەکراوە.\nبۆ دروست کردنی پەڕەکە، لە چوارچێوەکەی خوارەوە دەست بکە بە تایپ کردن. (بۆ زانیاری زورتر\n[$1 یارمەتی] ببینە).\nئەگەر بە ھەڵەوە ھاتویتە ئێرە، لە سەر دوگمەی '''back'''ی وێبگەڕەکەت کلیک بکە.",
- "anontalkpagetext": "----''ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووستنەکردووه یان کەڵکی لێ وەرناگرێ .\nلەبەر ئەوە مەجبوورین ئایپی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.\nئایپی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی نەناسراوی دی تێکەڵ نەکرێیت. ''",
+ "anontalkpagetext": "----\n<em>ئەمە لاپەڕەی وتووێژە بۆ بەکارهێنەرێکی نەناسراوە کە هێشتا هەژمارەی درووست نەکردووه یان کەڵکی لێ وەرناگرێ.</em>\nلەبەر ئەوە ناچارین ناونیشانی ئای پی ژمارەیی بۆ ناساندنی بەکار بێنین.\nناونیشانی ئای پی وا لەوانەیه لە لایەن چەندین بەکارهێنەری ترەوە بەکاربێت.\nئەگەر تۆ بەکارهێنەرێکی نەناسراویت و هەست دەکەیت ئەم لێدوانە پەیوەندی بە تۆوە نییە، تکایە [[Special:CreateAccount|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] بۆ تێکەڵ نەبوونت لەگەڵ بەکارھێنەرانی نەناسراوی تردا لە داھاتوودا.",
"noarticletext": "ھەنووکە ھیچ دەقێک لەم پەڕەیەدا نییە.\nدەتوانیت لە پەڕەکانی تردا [[Special:Search/{{PAGENAME}}|بۆ ئەم سەرناوە بگەڕێیت]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێیت]،\nیان [{{fullurl:{{FULLPAGENAME}}|action=edit}} ئەم پەڕەیە دروست بکەیت]</span>.",
"noarticletext-nopermission": "ھەنووکە ھیچ دەقێک لەم پەڕەیەدا نییە.\nدەتوانی لە پەڕەکانی تردا [[Special:Search/{{PAGENAME}}|بۆ ئەم ناوە بگەڕێی]]، یان <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێی]</span>، بەڵام ناتوانی ئەم پەڕەیە دروست بکەی.",
+ "missing-revision": "بەسەرداچوونەوەی #$1 پەڕەی «{{FULLPAGENAME}}» بوونی نییە.\n\nئەمە ھەندێک جار ھۆکاری ئەوەیە کە مێژووەکەی بەسەرچووە یاخود پەڕەکە سڕدراوەتە.\nوردەکارییەکان دەتوانرێن ببینرێن لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوەدا].",
"userpage-userdoesnotexist": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.\nتکایە دڵنیا ببەرەوە ئەگەر دەتھەوێت ئەم پەڕەیە دروست یان دەستکاری بکەیت.",
"userpage-userdoesnotexist-view": "ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.",
"blocked-notice-logextract": "ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.\nدوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:",
- "clearyourcache": "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
+ "clearyourcache": "<strong>تێبینی:</strong> لە دوای پاشەکەوت کردن، لەوانەیە بۆ بینینی گۆڕانکارییەکان پێویست بێ کاشی وێبگەڕەکەت پاکبکەیتەوە.\n* '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)\n* '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە (''⌘-Shift-R'' لەسەر Mac دا)\n* '''Internet Explorer:''' دوگمەی ''Ctrl'' بگرە کاتێک لەسەر ''Refresh''دا کرتە دەکەی، یان ''Ctrl-F5'' لێبدە\n* '''Opera:''' لە ڕێگەی ''Tools → Preferences'' ەوە cacheەکە بسڕەوە.",
"usercssyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقیکردنەوەی CSS نوێکەت، پێش پاشەکەوتکردن.",
"userjsyoucanpreview": "'''سەرچەشن:''' «{{int:showpreview}}» بەکاربێنە بۆ تاقیکردنەوەی جاڤاسکریپتە نوێکەت، پێش پاشەکەوتکردن.",
"usercsspreview": "<strong>لە بیرت ببێت کە تەنھا خەریکی پێشبینینی CSSـەکەت دەبینیت.\nھێشتا پاشەکەوەت نەکراوە!</strong>",
"previewnote": "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''\nگۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
"continue-editing": "چوونە سەر بەشی دەستکاریکردن",
"previewconflict": "ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.",
- "session_fail_preview": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\nتکایە دیسان ھەوڵبدەوە.\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە.",
+ "session_fail_preview": "ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی زانیاری و داتاکانی ئەم کۆرسە.\nلەوانەیە ھەژمارەکەت کرابێتە دەرەوە. <strong>تکایە دڵنیا بکەرەوە کە ھێشتا لە ژوورەوەیت و دووبارە ھەوڵ بدەرەوە.</strong>\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونەدەرەوە]] و گەڕانەوەژوورەوە تاقی بکەوە، دواتریش ئەگەر ھێشتا ڕێگەت نەداوە، ڕێگە بە براوسەرەکەت بدە کە ''کوکی'' لەم سایەتەوە وەربگرێت.",
"session_fail_preview_html": "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''\n\n''لەبەر ئەوەی {{SITENAME}} ڕێگەی داوە بە raw HTML، بۆ بەرگری بەرامبەر بە هێرشەکانی جاڤاسکریپت، پێشبینین شاردراوەتەوە.''\n\n'''ئەگەر ئەمە ھەوڵێکی دەستکاریکردنی ڕەوایە، تکایە دیسان ھەوڵبدەوە.'''\nئەگەر ھێشتا کار ناکات، [[Special:UserLogout|چوونە دەرەوە]] گەڕانەوەژوورەوە تاقی بکەوە.",
"token_suffix_mismatch": "'''دەستکاریەکەت پەسەند نەکرا لەبەر ئەوەی ڕاژەخواز یان وێبگەڕەکەت نووسەکانی خاڵبەندی لەیەک پچڕاندوە.'''<br />\nدەستکاریەکەت بۆ بەرگری لە تێکەڵبوونی دەقی لاپەڕەکە وەر نەگیرا.<br />\nئەمە بڕێجار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
+ "edit_form_incomplete": "<strong>ھەندێک بەشی دەستکارییەکانت بە سێرڤەرەکەمان نەگەیشت. دووبارە سەیری دەستکارییەکانت بکە بۆ دڵنیا بوون لە تەواوییان و دووبارە ھەوڵ بدەرەوە.</strong>",
"editing": "دەستکاریکردنی $1",
"creating": "دروستکردنی $1",
"editingsection": "دەستکاریکردنی $1 (بەش)",
"copyrightwarning": "تکایە ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} وا فەرز دەکرێت کە لە ژێر $2دا بڵاودەبنەوە (سەیری $1 بکە بۆ وردەکاریەکان).\nئەگەر ناتەوێ نووسراوەکانت بە بێبەزەیی دەستکاری بکرێن و بە دڵخواز دابەشبکرێنەوە، مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە.\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
"copyrightwarning2": "ئاگادار بە کە هەموو بەشدارییەکان لە {{SITENAME}} لەوانەیە بەدەستی بەشداربووانی دیکەوە دەستکاری بکرێن، بگۆڕدرێن یا بسڕێنەوە.\nئەگەر ناتەوێ نووسراوەکانت بێبەزەیی دەستکاری بکرێن، ھەر مەینێرە بۆ ئێرە.<br />\nھەروەھا تۆ بەڵێنمان پێدەدەی کە خۆت ئەمەت نووسیوە یان لە پاوانێکی گشتی (public domain) یان سەرچاوە ئازادەکانی وەک ئەو وەرتگرتووە (سەیری $1 بکە بۆ وردەکاریەکان).\n'''ئەو کارانە کە مافی لەبەرگرتنەوەیان پارێزراوەکان بە بێ وەرگرتنی ئیجازە مەنێرە!'''",
"longpageerror": "'''ھەڵە: ئەو دەقە تۆ ناردووتە {{PLURAL:$1|یەک کیلۆبایت|$1 کیلۆبایت}} درێژە، کە درێژترە لە زۆرینەی {{PLURAL:$2|یەک کیلۆبایت|$2 کیلۆبایت}}.'''\nئەمە پاشەکەوت ناکرێت.",
- "readonlywarning": "<strong>ئاگادارÛ\8c: داتابÛ\95Û\8cس بÛ\86 Ú\86اکسازÛ\8c داخراÙ\88Û\95Ø\8c بÛ\86Û\8cÛ\95 ئÛ\8eستا Ù\86اتÙ\88اÙ\86Û\8c دÛ\95ستکارÛ\8cÛ\95کاÙ\86ت پاشÛ\95Ú©Û\95Ù\88ت بکÛ\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت دÛ\95Ù\82Û\95Ú©Û\95ت Ú©Û\86Ù¾Û\8c بکÛ\95Û\8cت بÛ\86 Ù\81اÛ\8cÙ\84Û\8eک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
+ "readonlywarning": "<strong>ئاگادارÛ\8c: بÙ\86Ú©Û\95Û\8c زاÙ\86Û\8cارÛ\8c بÛ\86 Ú\86اکسازÛ\8c داخراÙ\88Û\95Ø\8c بÛ\86Û\8cÛ\95 ئÛ\8eستا Ù\86اتÙ\88اÙ\86Û\8c دÛ\95ستکارÛ\8cÛ\95کاÙ\86ت پاشÛ\95Ú©Û\95Ù\88ت بکÛ\95Û\8cت.</strong>\nدÛ\95تÙ\88اÙ\86Û\8cت دÛ\95Ù\82Û\95Ú©Û\95ت Ù\84Û\95بÛ\95ر بگرÛ\8cتÛ\95Ù\88Û\95 بÛ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95ک و ھەڵی بگریت بۆ دوایی.\nئەو بەڕێوەبەرەی کە دای خستووە، ئەم هۆکارەی دەستنیشان کردووە: $1",
"protectedpagewarning": "'''وشیار بە: ئەم پەڕە پارێزراوە بۆ ئەوی تەنیا ئەو بەکارھێنەرانە کە مافەکانی بەڕێوەبەرایەتییان ھەیە بتوانن دەستکاریی بکەن.'''\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
"semiprotectedpagewarning": "'''ئاگاداری:''' ئەم پەڕە داخراوە بۆ ئەوی تەنھا بەکارھێنەرە تۆمارکراوەکان بتوانن دەستکاریی بکەن.\nدوایین لۆگ بۆ ژێدەر لە خوارەوەدا ھاتووە:",
- "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆیە تەنها ئەو کەسانەی مافی بەڕێوبەرایەتییان هەیە ئەتوانن دەستکاری بکەن، چۆنکا ئەمە {{PLURAL:$1|لاپهڕه|لاپهڕانه}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە:",
+ "cascadeprotectedwarning": "'''ئاگاداری:''' ئەم لاپەڕە داخراوە بۆ ئەوەی تەنھا ئەو کەسانەی کە مافی بەڕێوبەرایەتییان هەیە بتوانن دەستکاری بکەن، چوونکە ئەم {{PLURAL:$1|لاپهڕه|لاپهڕانه}} لە زنجیرەی پارێزراوەکانی لە خۆ گرتووە:",
"titleprotectedwarning": "'''ئاگاداری: ئەم پەڕە داخراوە، بۆئەوەی بۆ درووستکردنی [[Special:ListGroupRights|مافە تایبەتەکانت]] پێویستن.'''\nبۆ چاوانە دوایین لۆگ لە خوارەوەدا ھاتووە:",
"templatesused": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پەڕەیەدا بە کارھێنراوە|داڕێژانە کە لەم پەڕەیەدا بە کارھێنراون}}:",
"templatesusedpreview": "ئەو {{PLURAL:$1|داڕێژەیە کە لەم پێشبینینەدا بە کارھێنراوە|داڕێژانە کە لەم پێشبینینەدا بە کارھێنراون}}:",
"nocreate-loggedin": "ئیجازەی دروست کردنی پەڕەی نوێت نیە.",
"sectioneditnotsupported-title": "بەش دەستکاریکردنی پشتیوانی ناکرێ",
"sectioneditnotsupported-text": "دەستکاریکردنی بەش لە پەڕەدا پشتیوانی ناکرێ.",
- "permissionserrors": "ھەڵەی ئیجازەکان",
+ "permissionserrors": "ھەڵە لە بە دەست ھێنان",
"permissionserrorstext": "مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :",
"permissionserrorstext-withaction": "دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:",
"recreate-moveddeleted-warn": "'''ھۆشیار بە: خەریکی پەڕەیەک دروست دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''\n\nئەمە لەبەر چاو بگرە کە دەستکاریکردنی ئەم پەڕەیە بەقازانجە یان نا.\nلۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
"moveddeleted-notice": "ئەم پەڕەیە سڕاوەتەوە.\nلۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە ژێرەوە دابین کراوە.",
+ "moveddeleted-notice-recent": "ببورە، ئەم پەڕەیە بەم زووانە سڕدراوەتەوە (لە ماوەی ٢٤ کاتژمێری پێشوودا). \nلۆگی سڕینەوە و ڕەوانەکردنی پەڕەکە بەردەستن لە خوارەوە لە پەڕاوێزەکاندا.",
"log-fulllog": "لۆگی تەواو ببینە",
"edit-hook-aborted": "دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
"edit-gone-missing": "توانای نوێکردنەوەی لاپەڕەکە نیە.<br />\nلەوە دەچی سڕدرابێتەوه.",
"edit-conflict": "کێشەی دەستکاری.",
"edit-no-change": "دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.",
+ "postedit-confirmation-created": "پەڕەکە دروست کرا.",
+ "postedit-confirmation-restored": "پەڕەکە ھێنرایەوە.",
"postedit-confirmation-saved": "دەستکارییەکەت پاشەکەوت کرا.",
"edit-already-exists": "تواناییی دروستکردنی پەڕەی نوێ نییە.\nئەمە پەڕەیە پێشتر هەبووە.",
"defaultmessagetext": "دەقی پەیامی هەمیشەیی",
"invalid-content-data": "دراوەی ناوەرۆکی نادروست",
- "editwarning-warning": "بەجێهێشتنی ئەم لاپەڕەیە دەبێتە هۆی لەدەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.",
+ "content-not-allowed-here": "«$1» ڕێگە پێنەدراوە لەسەر پەڕەی [[$2]]",
+ "editwarning-warning": "بەجێھێشتنی ئەم لاپەڕەیە دەبێتە هۆی لەدەستدانی هەموو ئەو گۆڕانکاریانەی کە ئەنجامت داون. ئەگەر لە ژوورەوەیت، دەتوانیت ئەم ئاگادارییە لابەریت لە ھەڵبژاردەی بەکارھێنەرت.",
"content-model-wikitext": "ویکیدەق",
"content-model-text": "دەقی ساکار",
"content-model-javascript": "جاڤاسکریپت",
"content-model-css": "سی ئێس ئێس",
+ "deprecated-self-close-category": "ئەو پەڕانەی کە تاگی ئێچ تی ئێم ئێڵی خۆ-داخراوی ھەڵە بەکاردەھێنن",
+ "duplicate-args-warning": "<strong>ئاگاداری:</strong> ن [[:$1]] بانگی [[:$2]] دەکات بە بەکارھێنانی زیاتر لە یەک بەھا بۆ پارامەتری «$3.» تەنھا کۆتا بەھای کە پێشکەش کراوە بەکار دەھێندرێت.",
"expensive-parserfunction-warning": "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگکەری فەنکشێنی لێککەرەوەی لەخۆ گرتوو.<br /><br />\nئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگکەردن|بانگکەردن}} کە ئێستا {{PLURAL:$1|بانگکردنی|بانگکردنی}} تێدایە.",
"expensive-parserfunction-category": "ئەو لاپەڕانەی ژمارەیەکی زۆر بانگکەری فەنکشێنی لێککەرەوەیان لەخۆ گرتووە.",
"post-expand-template-inclusion-warning": "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.\nلەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
"undo-success": "دەکرێ دەستکاریەکە پووچەڵبکرێتەوە.\nتکایە چاو لەو هەڵسەنگاندنەی خوارەوە بکە تا دڵنیا بیت ئەمە ئەوەیە کە دەتویست بیکەی و دواتر گۆڕانکارییەکانی خوارەوە پاشەکەوت بکە بۆ تەواوکردنی پووچەڵکردنەوەکە.",
"undo-failure": "لەبەر کێشەی دەستتێوەردان، ناتوانی دەستکاریەکە ئەنجامنەدراو بکەیت.",
"undo-norev": "ناتوانی دەستکاریەکە ئەنجامنەدراو بکەی لەبەر ئەوەی بوونی نیە یا سڕدراوەتەوە.",
+ "undo-nochange": "وا دیارە دەستکارییەکە پووچەڵ کراوەتەوە.",
"undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
+ "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
"cantcreateaccount-text": "درووستکردنی هەژمارە بۆ ناونیشانی ئایپی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
"viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
"nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
"editusergroup": "گرووپەکانی بەکارھێنەر دەستکاری بکە",
"editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+ "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
"saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
"userrights-groupsmember": "ئەندامە لە:",
"userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
"right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێدراو تا قووڵایی 5 لەخۆ بگرێت",
"right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
"right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+ "grant-group-email": "ناردنی ئیمەیل",
+ "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
"newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
"newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
"rightslog": "لۆگی مافەکانی بەکارھێنەر",
"action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
"action-viewmyprivateinfo": "زانیارییە تایبەتییەکانت ببینە",
"action-editmyprivateinfo": "دەستکاری زانیارییە تایبەتییەکانت بکە",
+ "action-purge": "پاکسازی ئەم پەڕەیە بکە",
"nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
"enhancedrc-history": "مێژوو",
"recentchanges": "دوایین گۆڕانکارییەکان",
"emailpagetext": "دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.\nئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەریتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.",
"defemailsubject": "ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە",
"usermaildisabled": "ئیمەیڵی بەکارهێنەر لەکاردانیە",
+ "usermaildisabledtext": "ناتوانیت ئیمەیڵ بۆ بەکارھێنەرانی تر بنێریت لەسەر ئەم ویکیپیدیایە",
"noemailtitle": "هیچ ناونیشانێکی ئیمەیل نییە",
"noemailtext": "ئەم بەکارھێنەرە ناونێشانێکی گونجاوی ئیمێلی دەستنیشان نەکردووە.",
"nowikiemailtext": "ئەم بەکارهێنەرە تایبەتمەندیی وەرنەگرتنی ئیمەیل لە بەکارهێنەرانی دیکەی هەلبژاردووە.",
"enotif_lastvisited": "بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.",
"enotif_lastdiff": "بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.",
"enotif_anon_editor": "بەکارھێنەری نەناسراو $1",
- "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c بÛ\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c دÛ\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ دÛ\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا سÛ\95رداÙ\86Û\8c ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c داھاتÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا دÛ\95تÙ\88اÙ\86Û\8c ئاڵاکاÙ\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 سÛ\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© بخÛ\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 سپاسÛ\95Ù\88Û\95Ø\8c سÛ\8cستÛ\95می ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
+ "enotif_body": "â\80«$WATCHINGUSERNAMEÛ\8c بÛ\95Ú\95Û\8eزØ\8c\n\n$PAGEINTRO $NEWPAG\n\nÚ©Ù\88رتÛ\95Û\8c دÛ\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\95Û\8c: $PAGESUMMARY $PAGEMINOREDIT\n\nÙ¾Û\95Û\8cÙ\88Û\95Ù\86دÛ\8c Ù\84Û\95Ú¯Û\95Úµ دÛ\95ستکارÛ\8cÚ©Û\95ر:\nÙ\86اÙ\85Û\95: $PAGEEDITOR_EMAIL\nÙ\88Û\8cÚ©Û\8c: $PAGEEDITOR_WIKI\n\nتا سÛ\95رداÙ\86Û\8c ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\86Û\95Ú©Û\95Û\8cتØ\8c Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c داھاتÙ\88Ù\88Û\8c Ù¾Û\95Ú\95Û\95Ú©Û\95ت Ù¾Û\8e Ú\95اÙ\86اگÛ\95Û\8cÛ\8eÙ\86درÛ\8eت. Ù\87Û\95رÙ\88Û\95ھا دÛ\95تÙ\88اÙ\86Û\8c ئاڵاکاÙ\86Û\8c Ú\95اگÛ\95Û\8cاÙ\86دÙ\86 Ù\84Û\95 Ù¾Û\95Ú\95Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95Ú©Û\95تدا Ù\84Û\95 سÛ\95رÛ\95تاÙ\88Û\95 Ú\95Û\8eÚ© بخÛ\95Û\8cتÛ\95Ù\88Û\95.\n\nبÛ\95 سÙ\88پاسÛ\95Ù\88Û\95Ø\8c سÛ\8cستمی ڕاگەیاندنی {{SITENAME}}\n\n--\nبۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە\n{{canonicalurl:{{#special:Preferences}}}}\n\nبۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nبۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە\n$UNWATCHURL\n\nکاردانەوە و یارمەتیی زۆرتر:\n$HELPPAGE",
"created": "دروستکرا",
"changed": "گۆڕدرا",
"deletepage": "پەڕە بسڕەوە",
"alreadyrolled": "دوایین گۆڕانکارییەکان لەسەر [[:$1]] لە لایەن [[User:$2|$2]] ناگەڕێندرێنەوە ([[User talk:$2|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])؛ کەسێکی تر لە پێشدا دەستکاریی کردووە یان گەڕاندوویەتەوە.\n\nدوایین دەستکاری ئەم پەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|لێدوان]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
"editcomment": "پوختەی دەستکاری <em>$1</em> بوو.",
"revertpage": "گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]",
- "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاڕدراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
+ "revertpage-nouser": "دەستکارییەکانی بەکارھێنەرێکی شاردراوە بۆ دوایین پێداچوونەوەی {{GENDER:$1|[[User:$1|$1]]}} گەڕێنرایەوە.",
"rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
"sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
"changecontentmodel-title-label": "سەرناوی پەڕە",
"exif-imagelength": "بەرزی",
"exif-orientation": "ئاڕاستە",
"exif-ycbcrpositioning": "شوێنی Y و C",
+ "exif-xresolution": "شێوازی ئاسۆیی",
+ "exif-yresolution": "شێوازی ستوونی",
"exif-datetime": "ڕێکەوتی و کاتی گۆڕانی پەڕگە",
"exif-imagedescription": "ناونیشانی وێنە",
"exif-make": "بەرھەمھێنەری کامێرا",
"confirmemail_body_set": "کەسێک، لەوانەیە خۆت، لە ناونیشانی IPی $1 ـەوە،\nلە {{SITENAME}}دا، ناونیشانیی ئیمێلی ھەژماری «$2»ی کردووە بەم ناونیشانە.\n\nبۆ پشتڕاستکردنەوەی ئەوەی کە ئەم ھەژمارە بە ڕاستی ھی تۆیە و بۆ چالاککردنەوەی ئامرازە ئیمێلییەکانی {{SITENAME}}، ئەم لینکە لە وێبگەڕەکەتدا بکەرەوە:\n\n$3\n\nئەگەر ھەژمارەکە ھی تۆ *نییە*، بۆ هەڵوەشاندنەوەی پشتڕاستکردنەوەی ناونیشانی ئیمێل، شوێنی ئەم لینکە بکەوە:\n\n$5\n\nماوەی ئەم کۆدی پشتڕاستکردنەوەیە لە $4دا بە سەر دەچێت.",
"confirmemail_invalidated": "بڕواپیکردنی ناونیشانی ئیمەیل هەڵوەشێندراوە",
"invalidateemail": "هەڵوەشاندنەوەی بڕواپێکردنی ئیمەیل",
+ "notificationemail_body_changed": "کەسێک، کە لەوانەیە خۆت بووبێت، لە ناونیشانی IPی $1، ناونیشانی پۆستی ئەلیکترۆنی لە $2ەوە گۆڕی بە $3 لە {{SITENAME}}.\n\nئەگەر ئەمە تۆ نەبوویت، ھەر ئێستا پەیوەندی بە بەڕێوەبەرێکی سایتەکەوە بکە.",
"scarytranscludetoolong": "[URL زۆر درێژە]",
"deletedwhileediting": "'''ھۆشیار بە''': ئەم پەڕە دوای ئەوە تۆ دەستکاریکردنیت دەستپێکرد سڕاوەتەوە!",
"confirmrecreate-noreason": "بەکارھێنەر [[User:$1|$1]] ([[User talk:$1|talk]]) پەڕەکەی سڕییەوە پاش ئەوەی تۆ دەستکاریکردنی پەڕەکەت دەستپێکرد. تکایە پشتڕاستی بکەوە کە بە ڕاستی دەتەوێ دیسان ئەم پەڕە دروست بکەیتەوە.",
"special-characters-group-thai": "تایلەندی",
"special-characters-group-khmer": "خمێری",
"log-action-filter-all": "ھەموو",
- "log-action-filter-upload-upload": "بارکردنی نوێ"
+ "log-action-filter-upload-upload": "بارکردنی نوێ",
+ "authmanager-email-label": "ئیمەیڵ"
}
"editcomment": "Shrnutí editace bylo: <em>$1</em>.",
"revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
"revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
- "rollback-success": "Editace uživatele $1 byly vráceny na poslední verzi od uživatele $2.",
+ "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
"rollback-success-notify": "Editace uživatele $1 byly vráceny;\nobnovena poslední verze od uživatele $2. [$3 Zobrazit změny]",
"sessionfailure-title": "Chyba relace",
"sessionfailure": "Zřejmě je nějaký problém s vaším přihlášením;\nvámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
"Wolliger Mensch",
"ОйЛ",
"아라",
- "Илья Драконов"
+ "Илья Драконов",
+ "Vvs-dm"
]
},
"tog-oldsig": "нꙑнѣшьн҄ь аѵтографъ :",
"prefs-resetpass": "таина словєсє иꙁмѣнѥниѥ",
"saveprefs": "съхранѥниѥ",
"prefs-editing": "исправлѥниѥ",
- "rows": "рѧдꙑ :",
"searchresultshead": "исканиѥ",
"savedprefs": "твои строи иꙁмѣнєнъ ѥстъ",
"localtime": "мѣстьно врѣмѧ :",
"sourcefilename": "источьна дѣла имꙗ :",
"watchthisupload": "си дѣла блюдєниѥ",
"upload-dialog-button-cancel": "отъмѣтаниѥ",
+ "upload-form-label-infoform-categories": "Катигории",
"license": "прощєниѥ :",
"license-header": "прощєниѥ",
"imgfile": "дѣло",
"rcfilters-invalid-filter": "Ungültiger Filter",
"rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
"rcfilters-filterlist-title": "Filter",
+ "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
"rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
"rcfilters-highlightmenu-title": "Eine Farbe auswählen",
"rcfilters-filterlist-noresults": "Keine Filter gefunden",
"pageinfo-few-visiting-watchers": "Es könnte einen beobachtenden Benutzer geben oder nicht, der die letzten Bearbeitungen besucht hat",
"pageinfo-redirects-name": "Anzahl der Weiterleitungen zu dieser Seite",
"pageinfo-redirects-value": "$1",
- "pageinfo-subpages-name": "Unterseiten dieser Seite",
+ "pageinfo-subpages-name": "Anzahl der Unterseiten dieser Seite",
"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|Weiterleitung|Weiterleitungen}}; $3 {{PLURAL:$3|Unterseite|Unterseiten}})",
"pageinfo-firstuser": "Seitenersteller",
"pageinfo-firsttime": "Datum der Seitenerstellung",
"delete": "Bestern",
"deletethispage": "Na perrer bestern",
"undeletethispage": "Na perer mebesterne",
- "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
+ "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
"viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
"protect": "Bıstarnê",
"protect_change": "bıvurne",
- "protectthispage": "Ena perer bıpawe",
+ "protectthispage": "Ena perre şeveknê",
"unprotect": "Starnayışi bıvurne",
- "unprotectthispage": "Starnayışê ena perer bıvurne",
+ "unprotectthispage": "Şeveknayışê ena perre bıvırne",
"newpage": "Perra newi",
"talkpage": "Na per dı vatan kew",
"talkpagelinktext": "Mesac",
"summary": "Xulasa:",
"subject": "Mewzu:",
"minoredit": "No yew vırnayışo werdiyo",
- "watchthis": "Bewni ena per",
+ "watchthis": "Şıma bewnê ena perre",
"savearticle": "Perre qeyd ke",
"savechanges": "Vırnayışan qeyd ke",
"publishpage": "Perer bıhesırne",
"edit-no-change": "Vırnayışê şıma qebul nêbı, çunke nuşte de yew vırnayış nêvıraziyo.",
"postedit-confirmation-created": "Pele vıraziye.",
"postedit-confirmation-restored": "Pele anciya vıraziye.",
- "postedit-confirmation-saved": "Vırnayışê to qeyd bi.",
+ "postedit-confirmation-saved": "Vırnayışê şıma qeyd bi.",
"edit-already-exists": "Pelo newe nêvıraziyeno.\nPel ca ra esto.",
"defaultmessagetext": "Metnê mesacê hesabiyayey",
"content-failed-to-parse": "Qandê madela $3 zereyê $1, $2 sero nêagozyayo",
"rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
"rev-deleted-text-unhide": "Çım ra viyarnayışê enê riperri <strong>esteriya</strong>.\nTeferruati [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qeydê esterıtışi] yenê diyene.\nŞıma hewna şenê [$1 nê vırnayışi bıvênê], eke wazenê dewam kerê.",
"rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
- "rev-deleted-text-view": "Çımra viyarnayışê ena pele '''besternêno'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] de teferruat esto.",
+ "rev-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
"rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
"rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
"rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
"search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
"preferences": "Tercihi",
"mypreferences": "Tercihi",
- "prefs-edits": "Amarê vurnayışan:",
+ "prefs-edits": "Amarê vırnayışan:",
"prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
"prefs-skin": "Çerme",
"skin-preview": "Verqayt",
"right-createtalk": "Pela werênayışi vıraze",
"right-createaccount": "Hesabê karberi vıraze",
"right-autocreateaccount": "Xarici yew name dê karberi ya ronıştış ake",
- "right-minoredit": "Vurnayışan qıckek nışan bıde.",
+ "right-minoredit": "Vırnayışan zey werdi nışan bıde.",
"right-move": "Pele bere",
"right-move-subpages": "Pele be bınpelanê cı ra pia bere",
"right-move-rootuserpages": "Pelanê kaberiê rıstımi bere",
"right-deletedtext": "Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke",
"right-browsearchive": "Pelanê esterıteyan bıgeyre",
"right-undelete": "Yew pela esterıtiye peyser biya",
- "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
+ "right-suppressrevision": "Yew karber ra çım ra viyarnayışanê perran bıvênê, bınımnê u bımocnê.",
"right-viewsuppressed": "İdarekeran ra miyanki newede vurnayışan de qayt ke",
"right-suppressionlog": "Rocekanê xasan bıvêne",
"right-block": "Karberanê binan karê vurnayışi ra bloke bıke",
"action-deletelogentry": "roceka dekerdan bestern",
"action-deletedhistory": "verora esteriya perrer bıvin",
"action-browsearchive": "pelanê esterıteyan bıgeyre",
- "action-undelete": "ena perer mestern",
+ "action-undelete": "Ena perre mesterê",
"action-suppressrevision": "revizyonê nımnayi bıvin u timar kı.",
"action-suppressionlog": "enê qeydê xısusi bıvêne",
"action-block": "enê karberi vurnayışi ra bıreyne",
"action-siteadmin": "database kilit bike ya zi a bike",
"action-sendemail": "e-posta bırşe",
"action-editmyoptions": "Tercihanê xo bıvurne",
- "action-editmywatchlist": "Listeyseyran de xo bıvırne",
+ "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
"action-viewmywatchlist": "Listeyseyran de xo bıvin",
"action-viewmyprivateinfo": "Xısusi tercihane xo bıvin",
"action-editmyprivateinfo": "Xısusi malumate xo bıvurne",
"randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
"statistics": "İstatistiki",
"statistics-header-pages": "İstatistikê perer",
- "statistics-header-edits": "İstatistikê vurnayışan",
+ "statistics-header-edits": "İstatistikê vırnayışan",
"statistics-header-users": "İstatistikê karberi",
"statistics-header-hooks": "Yewbina istatistiki",
"statistics-articles": "Perê zerreki",
"watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
"watchnologin": "Şıma cıkewtış nêvıraşto",
"addwatch": "Lista seyrkerdışi ke",
- "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|listeya seyri]] tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
+ "addedwatchtext": "\"[[:$1]]\" u perra cıya werênayışi [[Special:Watchlist|lista şımaya ewniyayışi]] rê ameyo cıkerdış.",
"addedwatchtext-short": "Pera $1`i çebyê listeya seyran de şıma",
"removewatch": "Lista seyrkerdışi ra wedare",
"removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
"removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
"watch": "Seyr ke",
- "watchthispage": "Bewni ena per",
+ "watchthispage": "Şıma bewnê ena perre",
"unwatch": "Teqib meke",
"unwatchthispage": "temaşa kerdışê peli vındarn.",
"notanarticle": "mebhesê peli niyo",
"deleteotherreason": "Sebebo bin:",
"deletereasonotherlist": "Sebebo bin",
"deletereason-dropdown": "* Sebebê esterıtışê pêroyi\n** Vurnayışo nêwaşte (spam)\n** Vandalizm\n** İxlalê heqa telifi\n** Waştışê nuştoği\n** Oryantasyono xırabe",
- "delete-edit-reasonlist": "Sebebê vurnayışan bıvurne",
+ "delete-edit-reasonlist": "Sebebê vırnayışan bıvurnê",
"delete-toobig": "no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.\nqey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.",
"delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
"deleteprotected": "Şıma nêşenê ena perer esternê, çıkı per starya ya.",
"tooltip-pt-anonuserpage": "pelê karberê IPyi",
"tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
"tooltip-pt-anontalk": "vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker",
- "tooltip-pt-preferences": "Tercihê {{GENDER:|to}}",
+ "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
"tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
"tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
"tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
"tooltip-save": "Vurnayışanê xo qeyd ke",
"tooltip-publish": "Vurnayışê xo vıla kı",
"tooltip-preview": "Vurnayışanê xo çım ra bıviyarnê. Qeydkerdış ra ver bıgurê cı!",
- "tooltip-diff": "Metni sero vurnayışan mocneno",
+ "tooltip-diff": "Kamci vırnayışê ke şıma nuştey sero kerdê, inan bıvênê.",
"tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
"tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
"tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
"pageinfo-firsttime": "Vıraştena tarixê perrer",
"pageinfo-lastuser": "Vurnayoğo peyên",
"pageinfo-lasttime": "Deme u vurnayışo peyên",
- "pageinfo-edits": "Amarina vurnayışan pêro",
+ "pageinfo-edits": "Amarê vırnayışano pêroyi",
"pageinfo-authors": "Amarina nuştekaran pêro",
"pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
"pageinfo-recent-authors": "Amarina nuştekaran pêro",
"expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
"expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
"expand_templates_preview": "Verqayt",
- "pagelanguage": "Zıwanê perer bıvırnê",
+ "pagelanguage": "Zıwanê perre bıvırnê",
"pagelang-name": "Pele",
"pagelang-language": "Zıwan",
"pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
"views": "Προβολές",
"toolbox": "Εργαλεία",
"tool-link-userrights": "Αλλαγή ομάδων {{GENDER:$1|χρήστη}}",
+ "tool-link-userrights-readonly": "Εμφάνιση {{GENDER:$1|ομάδων}} χρηστών",
"tool-link-emailuser": "Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη",
"userpage": "Προβολή σελίδας χρήστη",
"projectpage": "Προβολή σελίδας εγχειρήματος",
"botpasswords-label-delete": "Διαγραφή",
"botpasswords-label-resetpassword": "Επαναφορά του συνθηματικού",
"botpasswords-label-grants": "Ισχύουσες άδειες:",
- "botpasswords-help-grants": "Î\9aάθε Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83η δίνει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83Ï\84α οÏ\81ιÏ\83μÎνα δικαιÏ\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Ï\80οÏ\85 Ï\80οÏ\85 ήδη ÎÏ\87ει ÎναÏ\82 λογαÏ\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84η. Î\94είÏ\84ε Ï\84η [[Special:ListGrants|Ï\80ίνακαÏ\82 παραχωρήσεων]] για περισσότερες πληροφορίες.",
+ "botpasswords-help-grants": "ΠαÏ\81αÏ\87Ï\89Ï\81εί Ï\84ην Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε δικαιÏ\8eμαÏ\84α Ï\80οÏ\85 ήδη καÏ\84ÎÏ\87ονÏ\84αι αÏ\80Ï\8c Ï\84ο λογαÏ\81ιαÏ\83μÏ\8c Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82. Î\95νεÏ\81γοÏ\80οίηÏ\83η μιαÏ\82 Ï\80αÏ\81αÏ\87Ï\8eÏ\81ηÏ\83ηÏ\82 εδÏ\8e δεν Ï\80αÏ\81ÎÏ\87ει Ï\80Ï\81Ï\8cÏ\83βαÏ\83η Ï\83ε δικαιÏ\8eμαÏ\84α Ï\80οÏ\85 ο λογαÏ\81ιαÏ\83μÏ\8cÏ\82 Ï\87Ï\81ήÏ\83Ï\84ηÏ\82 Ï\83αÏ\82 διαÏ\86οÏ\81εÏ\84ικά δεν θα είÏ\87ε. Î\94είÏ\84ε Ï\84ον [[Special:ListGrants|Ï\80ίνακα παραχωρήσεων]] για περισσότερες πληροφορίες.",
"botpasswords-label-grants-column": "Χορηγήθηκε",
"botpasswords-bad-appid": "Το όνομα του ρομπότ «$1» δεν είναι έγκυρο.",
"botpasswords-insert-failed": "Αποτυχία να προστεθεί το όνομα bot \"$1\". Έχει ήδη προστεθεί;",
"passwordreset-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το λογαριασμό σας, τότε θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
"passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
"passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+ "passwordreset-nodata": "Δεν δόθηκε όνομα χρήστη ή διεύθυνση email.",
"changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
"changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
"changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
"selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
"missingcommenttext": "Παρακαλούμε εισαγάγετε σχόλιο παρακάτω.",
"missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
- "summary-preview": "Προεπισκόπηση σύνοψης:",
+ "summary-preview": "Προεπισκόπηση σύνοψης επεξεργασίας:",
"subject-preview": "Προεπισκόπηση θέματος:",
"previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
"blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
"blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
"autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+ "systemblockedtext": "Το όνομα χρήστη σας ή η διεύθυνση IP έχει αποκλειστεί αυτόματα από το MediaWiki.\nΗ αιτία που δόθηκε είναι:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Στόχος φραγής: $7\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3.\nΠαρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
"blockednoreason": "δεν δόθηκε λόγος",
"whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
"confirmedittext": "Πρέπει να επιβεβαιώσετε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου πριν μπορέσετε να επεξεργαστείτε σελίδες. Παρακαλούμε καθορίστε και επικυρώστε την διεύθυνση ηλεκτρονικού σας ταχυδρομείου μέσω των [[Special:Preferences|προτιμήσεων χρήστη]] σας.",
"userpage-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος. Παρακαλούμε ελέγξτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτήν τη σελίδα.",
"userpage-userdoesnotexist-view": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
"blocked-notice-logextract": "Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.",
- "clearyourcache": "''' Σημείωση:''' μετά την αποθήκευση, ίσως χρειαστεί να παρακάμψετε την προσωρινή μνήμη του προγράμματος περιήγησής σας για να δείτε τις αλλαγές.\n * '''Firefox / Safari:''' Κρατήστε πατημένο το ''Shift'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'' ή πιέστε ''Ctrl-F5'' ή ''Ctrl-R'' ('' ⌘-R'' σε Mac)\n * '''Google Chrome:''' Πιέστε ''Ctrl-Shift-R'' (''⌘-Shift-R'' σε Mac)\n * '''Internet Explorer:''' Κρατήστε πατημένο το ''Ctrl'' κάνοντας ταυτόχρονα κλικ στο κουμπί ''Ανανέωση'', ή πιέστε ''Ctrl-F5'' \n * '''Opera:''' Εκκαθαρίστε την προσωρινή μνήμη από το μενού ''Εργαλεία → Προτιμήσεις''",
+ "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>Εργαλεία → Προτιμήσεις</em>",
"usercssyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τα νέα σας CSS πριν τα αποθηκεύσετε.",
"userjsyoucanpreview": "'''Χρήσιμη συμβουλή:''' Χρησιμοποιήστε το κουμπί \"{{int:showpreview}}\" για να ελέγξτε τη νέα σας JS πριν την αποθηκεύσετε.",
"usercsspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του CSS του χρήστη -δεν το έχετε ακόμα αποθηκεύσει! '''",
"watchlistanontext": "Παρακαλούμε συνδεθείτε για να δείτε ή να επεξεργαστείτε αντικείμενα στη λίστα παρακολούθησής σας.",
"watchnologin": "Δεν έχετε συνδεθεί.",
"addwatch": "Προσθήκη στη λίστα παρακολούθησης",
- "addedwatchtext": "Το λήμμα «[[:$1]]» και η Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84οÏ\85 ÎÏ\87οÏ\85ν Ï\80Ï\81οÏ\83Ï\84εθεί Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82]] Ï\83αÏ\82.",
+ "addedwatchtext": "Î\97 Ï\83ελίδα «[[:$1]]» και η Ï\83ελίδα Ï\83Ï\85ζήÏ\84ηÏ\83ήÏ\82 Ï\84ηÏ\82 Ï\80Ï\81οÏ\83Ï\84Îθηκαν Ï\83Ï\84η [[Special:Watchlist|λίÏ\83Ï\84α Ï\80αÏ\81ακολοÏ\8dθηÏ\83ήÏ\82 Ï\83αÏ\82]].",
"addedwatchtext-short": "Η σελίδα «$1» έχει προστεθεί στην λίστα παρακολούθησής σας.",
"removewatch": "Αφαίρεση από τη λίστα παρακολούθησης",
"removedwatchtext": "Το λήμμα «[[:$1]]» και η σελίδα συζήτησής του έχουν αφαιρεθεί από τη [[Special:Watchlist|λίστα παρακολούθησής]] σας.",
"rcfilters-invalid-filter": "Invalid filter",
"rcfilters-empty-filter": "No active filters. All contributions are shown.",
"rcfilters-filterlist-title": "Filters",
+ "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
"rcfilters-highlightbutton-title": "Highlight results",
"rcfilters-highlightmenu-title": "Select a color",
"rcfilters-filterlist-noresults": "No filters found",
"rcfilters-invalid-filter": "Filtro no válido",
"rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
"rcfilters-filterlist-title": "Filtros",
+ "rcfilters-highlightbutton-title": "Resaltar los resultados",
+ "rcfilters-highlightmenu-title": "Selecciona un color",
"rcfilters-filterlist-noresults": "No se encontraron filtros",
"rcfilters-filtergroup-registration": "Registro de usuario",
"rcfilters-filter-registered-label": "Registrados",
"editcomment": "El resumen de la edición fue: <em>$1</em>.",
"revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
"revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Revertidas las ediciones de $1; recuperada la última versión de $2.",
+ "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
"rollback-success-notify": "Revertidas las ediciones de $1 hasta la última revisión de $2. [$3 Ver cambios]",
"sessionfailure-title": "Error de sesión",
- "sessionfailure": "Parece que hay un problema con tu sesión;\nesta acción ha sido cancelada como medida de precaución contra secuestros de sesión.\nPor favor, pulsa «Atrás», recarga la página de la que viniste e inténtalo de nuevo.",
+ "sessionfailure": "Parece que hay un problema con tu sesión;\nse ha cancelado esta acción como medida de precaución contra el robo de sesiones.\nVuelve a la página anterior, recárgala e inténtalo de nuevo.",
"changecontentmodel": "Cambiar el modelo de contenido de una página",
"changecontentmodel-legend": "Cambiar el modelo de contenido",
"changecontentmodel-title-label": "Título de página",
"sp-contributions-blocked-notice-anon": "Esta dirección IP se encuentra actualmente bloqueada.\nA continuación se muestra la última entrada del registro de bloqueos para mayor referencia.",
"sp-contributions-search": "Buscar contribuciones",
"sp-contributions-username": "Dirección IP o nombre de usuario:",
- "sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
+ "sp-contributions-toponly": "Mostrar solo últimas ediciones de página",
"sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
"sp-contributions-hideminor": "Ocultar ediciones menores",
"sp-contributions-submit": "Buscar",
"logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
"logentry-newusers-newusers": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
"logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
- "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
+ "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua {{GENDER:$2|sortu}} du",
"logentry-newusers-byemail": "$1(e)k $3 erabiltzaile kontua {{GENDER:$2|sortu du}} eta pasahitza emailez bidali da",
"logentry-newusers-autocreate": "$1 erabiltzaile kontua automatikoki {{GENDER:$2|sortu da}}",
"logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
"action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
"action-siteadmin": "قفلکردن و بازکردن پایگاه دادهها",
"action-sendemail": "ارسال ایمیل",
+ "action-editmyoptions": "ویرایش ترجیحاتتان",
"action-editmywatchlist": "فهرست پیگیریهای خود را ویرایش کنید",
"action-viewmywatchlist": "فهرست پیگیریهای خود را ببینید",
"action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
"recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
"recentchanges-submit": "نمایش",
+ "rcfilters-activefilters": "فعالکردن پالایهها",
+ "rcfilters-restore-default-filters": "بازگردانی پالایههای پیشفرض",
+ "rcfilters-clear-all-filters": "پاککردن پالایشها",
+ "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
+ "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
+ "rcfilters-empty-filter": "پالایهای فعال نیست. همهٔ مشارکتهای دیده میشوند.",
+ "rcfilters-filterlist-title": "پالایهها",
+ "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایههای جدید (آزمایشی)",
+ "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
+ "rcfilters-highlightmenu-title": "انتخاب رنگ",
+ "rcfilters-filterlist-noresults": "پالایهای یافت نشد",
+ "rcfilters-filtergroup-registration": "ثبتنام کاربر",
+ "rcfilters-filter-registered-label": "ثبت شده",
+ "rcfilters-filter-registered-description": "ورود ویرایشگران.",
+ "rcfilters-filter-unregistered-label": "ثبتنام نکرده",
+ "rcfilters-filter-unregistered-description": "ویرایشگرانی که به سامانه وارد نشدهاند.",
+ "rcfilters-filter-editsbyself-label": "ویرایشهای شما",
+ "rcfilters-filter-editsbyself-description": "ویرایشهای انجام شده توسط شما.",
+ "rcfilters-filter-editsbyother-label": "ویرایشهای دیگران",
+ "rcfilters-filter-editsbyother-description": "ویرایشهای ایجاد شده توسط دیگران (نه شما).",
+ "rcfilters-filtergroup-userExpLevel": "درجهٔ تجربه (فقط برای کاربران ثبتنام کرده)",
+ "rcfilters-filter-userExpLevel-newcomer-label": "تازهواردها",
+ "rcfilters-filter-userExpLevel-newcomer-description": "کمتر از ۱۰ ویرایش یا ۴ روز فعالیت.",
+ "rcfilters-filter-userExpLevel-learner-label": "آموزندگان",
+ "rcfilters-filter-userExpLevel-experienced-label": "کاربران باتجربه",
+ "rcfilters-filter-userExpLevel-experienced-description": "بیشتر از ۳۰ روز فعالیت و ۵۰۰ ویرایش.",
+ "rcfilters-filtergroup-automated": "ویرایشهای خودکار",
+ "rcfilters-filter-bots-label": "ربات",
+ "rcfilters-filter-bots-description": "ویرایش توسط ابزارهای خودکار.",
+ "rcfilters-filter-humans-label": "انسان (ربات نه)",
+ "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
+ "rcfilters-filter-minor-label": "ویرایشهای جزئی",
+ "rcfilters-filter-minor-description": "ویرایشهایی که به عنوان جزئی برچسب خوردهاند.",
+ "rcfilters-filter-major-label": "ویرایشهای غیرجزئی",
+ "rcfilters-filter-major-description": "ویرایشهایی که برچسب جزئی نخوردند.",
+ "rcfilters-filtergroup-changetype": "نوع تغییرات",
+ "rcfilters-filter-pageedits-label": "ویرایشهای صفحه",
+ "rcfilters-filter-pageedits-description": "ویرایشهای محتوای ویکی، بحثها، توضیحات رده...",
+ "rcfilters-filter-newpages-label": "ایجاد صفحه",
+ "rcfilters-filter-newpages-description": "ویرایشهایی که منجر به ایجاد صفحه شدهاند.",
+ "rcfilters-filter-categorization-label": "تغییرات رده",
+ "rcfilters-filter-categorization-description": "سیاههٔ صفحاتی که به رده افزوده یا حذف شدهاند.",
+ "rcfilters-filter-logactions-label": "سیاههٔ فعالیتها",
"rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شدهاست|نشان داده شدهاند}}).",
"rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
"rcshowhideminor": "$1 ویرایشهای جزئی",
"apisandbox-sending-request": "ارسال درخواست ایپیآی...",
"apisandbox-loading-results": "دریافت درخواستهای ایپیآی...",
"apisandbox-results-error": "در زمان بارگیری پاسخ کوئری API خطایی رخ دادهاست: $1.",
+ "apisandbox-request-selectformat-label": "نمایش دادههای مورد درخواست به عنوان:",
+ "apisandbox-request-format-url-label": "آدرس اینترنتی متن پرسمان",
"apisandbox-request-url-label": "درخواست آدرس:",
+ "apisandbox-request-json-label": "درخواست JSON:",
"apisandbox-request-time": "زمان درخواست: {{PLURAL:$1|$1 ms}}",
"apisandbox-results-fixtoken": "توکن را اصلاح کنید و از نو ارسال کنید",
"apisandbox-results-fixtoken-fail": "خطا در دریافت توکن \"$1\"",
"editcomment": "خلاصهٔ ویرایش این بود: <em>«$1»</em>.",
"revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
"revertpage-nouser": "ویرایشهای انجامشده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
- "rollback-success": "ویرایشهای $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+ "rollback-success": "ویرایشهای {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
"rollback-success-notify": "ویرایشهای توسط $1 واگردانی شد؛\nبه آخرین نسخه توسط $2 بازگردانی شد. [$3 نمایش تغییرات]",
"sessionfailure-title": "خطای نشست کاربری",
"sessionfailure": "به نظر میرسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربودهشدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحهای که از آن به اینجا رسیدهاید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
"pageinfo-length": "حجم صفحه (بایت)",
"pageinfo-article-id": "شناسهٔ صفحه",
"pageinfo-language": "زبان محتوای صفحه",
+ "pageinfo-language-change": "تغییر",
"pageinfo-content-model": "ساختار محتوای صفحه",
"pageinfo-content-model-change": "تغییر",
"pageinfo-robot-policy": "فهرستکردن توسط رباتها",
"pagelang-language": "زبان",
"pagelang-use-default": "استفاده از زبان پیشفرض",
"pagelang-select-lang": "انتخاب زبان",
+ "pagelang-reason": "دلیل",
"pagelang-submit": "اعمال",
"right-pagelang": "تغییر صفحهٔ زبان",
"action-pagelang": "تغییر زبان صفحه",
"mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
"mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
"mw-widgets-categoryselector-add-category-placeholder": "در حال افزودن رده ...",
+ "mw-widgets-usersmultiselect-placeholder": "افزودن بیشتر...",
"sessionmanager-tie": "نمیتوان چندین نوع درخواست هویتسنجی را ترکیب کرد: $1.",
"sessionprovider-generic": "$1 فصل",
"sessionprovider-mediawiki-session-cookiesessionprovider": "فصلهای کوکیمحور",
"usercssispublic": "لطفاً توجه کنید: زیرصفحههای سیاساس نباید حاوی اطلاعات محرمانه باشند چون توسط دیگران قابل مشاهده هستند.",
"restrictionsfield-badip": "نشانی یا بازهٔ آیپی نامعتبر: $1",
"restrictionsfield-label": "بازههای آیپی مجاز:",
- "restrictionsfield-help": "یک نشانی آیپی یا بازهٔ سیآیدیار در هر خط وارد کنید. برای فعال کردن همهچیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>"
+ "restrictionsfield-help": "یک نشانی آیپی یا بازهٔ سیآیدیار در هر خط وارد کنید. برای فعال کردن همهچیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br><code>::/0</code>",
+ "revid": "نسخهٔ $1",
+ "pageid": "شناسهٔ صفحهٔ $1"
}
"Derugon",
"Benoit Rochon",
"Fitoschido",
- "Archaeodontosaurus"
+ "Archaeodontosaurus",
+ "Trizek (WMF)"
]
},
"tog-underline": "Soulignement des liens :",
"rcfilters-invalid-filter": "Filtre non valide",
"rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
"rcfilters-filterlist-title": "Filtres",
+ "rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
+ "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
+ "rcfilters-highlightmenu-title": "Choisir une couleur",
"rcfilters-filterlist-noresults": "Aucun filtre trouvé",
"rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
- "rcfilters-filter-registered-label": "Enregistré",
+ "rcfilters-filter-registered-label": "Connectés",
"rcfilters-filter-registered-description": "Éditeurs connectés.",
- "rcfilters-filter-unregistered-label": "Désinscrit",
+ "rcfilters-filter-unregistered-label": "Non connectés",
"rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
"rcfilters-filtergroup-authorship": "Modifier la paternité",
"rcfilters-filter-editsbyself-label": "Vos propres modifications",
"rcfilters-invalid-filter": "Filtro no válido",
"rcfilters-empty-filter": "Non hai filtros activos. Móstranse tódalas contribucións.",
"rcfilters-filterlist-title": "Filtros",
+ "rcfilters-highlightbutton-title": "Resaltar resultados",
+ "rcfilters-highlightmenu-title": "Seleccione unha cor",
"rcfilters-filterlist-noresults": "Non se atoparon filtros",
"rcfilters-filtergroup-registration": "Rexistro de usuario",
"rcfilters-filter-registered-label": "Rexistrado",
"recentchanges-label-unpatrolled": "اي دچينواچين هلئه گشتزني نۊبؤ",
"recentchanges-label-plusminus": "ولگˇ حجم اي مقدار بايتˇ واويراز تغيير بؤده",
"recentchanges-legend-heading": "<strong>اختصارؤن:</strong>",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}( [[Special:NewPages|تازه ولگؤنˇ ليسته]] بينين)",
"rclistfrom": "تازه تغييرؤنˇ نۊشؤن دأنˇ سرأگيري $3 $2ˇ جي",
"rcshowhideminor": "$1 نيميزگره دچينواچينؤن",
"rcshowhideminor-show": "نۊشؤن دأن",
"rcfilters-invalid-filter": "מסנן בלתי־תקין",
"rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
"rcfilters-filterlist-title": "מסננים",
+ "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
+ "rcfilters-highlightbutton-title": "הבלטת התוצאות",
+ "rcfilters-highlightmenu-title": "בחירת צבע",
"rcfilters-filterlist-noresults": "לא נמצאו מסננים",
"rcfilters-filtergroup-registration": "רישום העורכים",
"rcfilters-filter-registered-label": "רשומים",
"editcomment": "תקציר העריכה היה: <em>$1</em>.",
"revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
"revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "שוחזר מעריכות של $1 לעריכה האחרונה של $2.",
+ "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}} לעריכה האחרונה של {{GENDER:$4|$2}}.",
"rollback-success-notify": "שוחזר מעריכות של $1 לעריכה האחרונה של $2. [$3 הצגת שינויים]",
"sessionfailure-title": "בעיה בחיבור",
"sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לחזור לדף הקודם, לטעון אותו מחדש ולנסות שוב.",
"Ziyaurr",
"NehalDaveND",
"Susant purohit",
- "Jayprakash12345"
+ "Jayprakash12345",
+ "Dr. Shikha Jaggi",
+ "Shyamal"
]
},
"tog-underline": "कड़ियाँ अधोरेखन:",
"rcfilters-invalid-filter": "अमान्य फ़िल्टर",
"rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
"rcfilters-filterlist-title": "फिल्टर",
+ "rcfilters-highlightbutton-title": "परिणाम रेखांकन करें",
+ "rcfilters-highlightmenu-title": "रंग चुनें",
"rcfilters-filterlist-noresults": "कोई फिल्टर नहीं पाया",
"rcfilters-filtergroup-registration": "उपयोगकर्ता पंजीकरण",
"rcfilters-filter-registered-label": "पंजीकृत:",
"rcfilters-filter-editsbyself-label": "आपके अपने संपादन",
"rcfilters-filter-editsbyself-description": "आपके द्वारा संपादित",
"rcfilters-filter-editsbyother-label": "दूसरों के द्वारा संपादित",
+ "rcfilters-filter-userExpLevel-newcomer-label": "अपरिचित",
+ "rcfilters-filter-userExpLevel-learner-label": "शिक्षार्थियों",
"rcfilters-filter-bots-label": "बॉट",
"rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
"rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
"Teoo3",
"Matma Rex",
"Vrhnje",
- "Ivi104"
+ "Ivi104",
+ "Сербијана"
]
},
"tog-underline": "Podcrtavanje poveznica",
"period-am": "AM",
"period-pm": "PM",
"pagecategories": "{{PLURAL:$1|Kategorija|Kategorije|Kategorija}}",
- "category_header": "Stranice u kategoriji \"$1\"",
+ "category_header": "Stranice u kategoriji »$1«",
"subcategories": "Potkategorije",
- "category-media-header": "Mediji u kategoriji \"$1\":",
+ "category-media-header": "Mediji u kategoriji »$1«",
"category-empty": "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
"hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije|Skrivenih kategorija}}",
"hidden-category-category": "Skrivene kategorije",
"searchbutton": "Traži",
"go": "Kreni",
"searcharticle": "Kreni",
- "history": "Stare izmjene",
+ "history": "Povijest stranice",
"history_short": "Stare izmjene",
"history_small": "stare izmjene",
"updatedmarker": "obnovljeno od posljednjeg posjeta",
"toolbox": "Pomagala",
"tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
"tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
- "tool-link-emailuser": "Pošalji e-poštu {{GENDER:$1|suradniku|suradnici}}",
+ "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
"userpage": "Vidi suradnikovu stranicu",
"projectpage": "Vidi stranicu o projektu",
"imagepage": "Vidi stranicu datoteke",
"youhavenewmessages": "Imate $1 ($2).",
"youhavenewmessagesfromusers": "Imate $1 {{PLURAL:$3||od $3 suradnika|od $3 suradnika}} ($2).",
"youhavenewmessagesmanyusers": "Imate $1 od više suradnika ($2).",
- "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|999=novih poruka}}",
+ "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
"newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|posljednja $1 uređivanja|posljednjih $1 uređivanja}} na stranici za razgovor",
"youhavenewmessagesmulti": "Imate nove poruke na $1",
"editsection": "uredi",
"passwordreset-emailsentemail": "Ako je ova adresa povezana s Vašim suradničkim računom, na nju će biti poslan podsjetnik na zaporku.",
"passwordreset-invalidemail": "Nevaljala adresa e-pošte",
"changeemail": "Promijeni ili izbriši e-mail adresu",
- "changeemail-header": "Promijeni adresu e-pošte računa",
+ "changeemail-header": "Ispunite ovaj obrazac da biste promijenili svoju adresu e-pošte. Ukoliko želite ukloniti povezanost svoje adrese e-pošte i suradničkoga računa, prilikom popunjavanja obrasca ostavite prazno polje umjesto upisivanja nove adrese e-pošte.",
"changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
"changeemail-oldemail": "Trenutačna adresa e-pošte:",
"changeemail-newemail": "Nova adresa e-pošte:",
"changeemail-password": "Zaporka za projekt {{SITENAME}}:",
"changeemail-submit": "Promijeni e-mail",
"changeemail-throttled": "Nedavno ste se previše puta pokušali prijaviti.\nMolimo Vas pričekajte $1 prije nego što pokušate ponovno.",
+ "changeemail-nochange": "Molimo vas, upišite neku novu adresu e-pošte.",
"bold_sample": "Podebljani tekst",
"bold_tip": "Podebljani tekst",
"italic_sample": "Kurzivni tekst",
"minoredit": "Ovo je manja promjena",
"watchthis": "Prati ovu stranicu",
"savearticle": "Sačuvaj stranicu",
- "savechanges": "Spremi promjene",
+ "savechanges": "Sačuvaj stranicu",
"publishpage": "Objavi stranicu",
"publishchanges": "Objavi izmjene",
"preview": "Pregled kako će stranica izgledati",
"missingsummary": "'''Podsjetnik:''' Niste unijeli sažetak promjena. Ako ponovno kliknete na \"Sačuvaj stranicu\", Vaše će promjene biti snimljene bez sažetka.",
"selfredirect": "<strong>Upozorenje:</strong> Stvarate preusmjeravanje na isti članak.\nMožda ste izabrali pogrješnu odredišnu stranicu za preusmjeravanje ili uređujete pogrješnu stranicu.\nAko pritisnete na \"{{int:savearticle}}\" još jednom, preusmjeravanje će svejedno biti stvoreno.",
"missingcommenttext": "Molim unesite sažetak.",
- "missingcommentheader": "'''Podsjetnik:''' Niste napisali sažetak ovog komentara. Ako ponovno kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
+ "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali sažetak ovoga komentara. Ukoliko ponovo kliknete \"{{int:savearticle}}\", Vaš će komentar biti snimljen bez sažetka.",
"summary-preview": "Pregled polja Sažetak:",
"subject-preview": "Pregled teme:",
+ "previewerrortext": "Pri pokušaju prikazivanja pretpregleda vaših promjena došlo je do pogrješke.",
"blockedtitle": "Suradnik je blokiran",
"blockedtext": "'''Vaše suradničko ime ili IP adresa je blokirana'''\n\nBlokirao Vas je $1.\nRazlog blokiranja je sljedeći: ''$2''.\n\n* Početak blokade: $8\n* Istek blokade: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete koristiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
"autoblockedtext": "Vaša IP adresa automatski je blokirana zbog toga što ju je koristio drugi suradnik, kojeg je blokirao $1.\nRazlog blokiranja je sljedeći:\n\n:''$2''\n\n* Početak blokade: $8\n* Blokada istječe: $6\n* Ime blokiranog suradnika: $7\n\nMožete kontaktirati $1 ili jednog od [[{{MediaWiki:Grouppage-sysop}}|administratora]] kako bi Vam pojasnili razlog blokiranja.\n\nPrimijetite da ne možete rabiti opciju \"Pošalji mu e-poruku\" ako niste upisali valjanu adresu e-pošte u Vašim [[Special:Preferences|suradničkim postavkama]] i ako niste u tome onemogućeni prilikom blokiranja.\n\nVaša trenutačna IP adresa je $3, a oznaka bloka #$5. Molimo navedite ovaj broj kod svakog upita vezano za razlog blokiranja.",
"yourdiff": "Razlike",
"copyrightwarning": "Molimo uočite da se svi doprinosi {{SITENAME}} smatraju objavljenima pod uvjetima $2 (vidi $1 za detalje). Ako ne želite da se Vaše pisanje nemilosrdno uređuje i slobodno raspačava, nemojte ga ovamo slati.<br />\nTakođer nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom.\n'''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
"copyrightwarning2": "Molimo uočite da svi suradnici mogu mijenjati sve doprinose na {{SITENAME}}. Ako ne želite da se Vaše pisanje nemilosrdno uređuje, nemojte ga slati ovdje.<br /> Također nam obećavate da ste ovo sami napisali, ili da ste to prepisali iz nečeg što je u javnom vlasništvu ili pod sličnom slobodnom licencijom (vidi $1 za detalje). '''NE POSTAVLJAJTE RADOVE ZAŠTIĆENE AUTORSKIM PRAVIMA BEZ DOPUŠTENJA!'''",
+ "editpage-cannot-use-custom-model": "Model sadržaja ove stranice ne može se mijenjati.",
"longpageerror": "'''Pogrješka: Tekst koji ste unijeli dug je {{PLURAL:$1|jedan kilobajt|$1 kilobajta}}, što je više od maksimalno {{PLURAL:$2|jednog kilobajta|$2 kilobajta}}.'''\nNije ga moguće snimiti.",
"readonlywarning": "'''UPOZORENJE: Baza podataka je zaključana zbog održavanja, pa trenutačno ne možete sačuvati svoje\npromjene. Najbolje je da kopirate i zaljepite tekst u tekstualnu datoteku te je snimite za kasnije.'''\n\nAdministrator je zaključao bazu iz razloga: $1",
"protectedpagewarning": "'''UPOZORENJE: Ova stranica je zaključana i mogu je uređivati samo suradnici s administratorskim pravima.'''\nPosljednja stavka u evidenciji navedena je niže kao napomena:",
"content-json-empty-object": "Prazan objekt",
"content-json-empty-array": "Prazno polje",
"duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] s više od jedne vrijednosti za parametar \"$3\". Rabit će se samo posljednja navedena vrijednost.",
+ "duplicate-args-category": "Stranice u kojima se ponavljaju argumenti u predlošcima",
"expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija\n\nTrebala bi imati manje od $2 {{PLURAL:$2|poziva|poziva}}, sada ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
"expensive-parserfunction-category": "Stranice s previše poziva opterećujućih parserskih funkcija",
"post-expand-template-inclusion-warning": "Upozorenje: Veličina uključenih predložaka je prevelika.\nNeki predlošci neće biti uključeni.",
"last": "pret",
"page_first": "prva",
"page_last": "zadnja",
- "histlegend": "Uputa: (sad) = razlika od trenutačne inačice,\n(pret) = razlika od prethodne inačice, m = manja promjena",
+ "histlegend": "Izbor za usporedbu: označi kružiće pokraj dvije inačice koje želiš usporediti i pritisni \"Enter\" ili tipku na dnu.<br />\nUputa: <strong>({{int:cur}})</strong> = razlika od trenutačne inačice, <strong>({{int:last}})</strong> = razlika od prethodne inačice, <strong>{{int:minoreditletter}}</strong> = manja promjena.",
"history-fieldset-title": "Pretraži povijest",
"history-show-deleted": "Samo izbrisane",
"histfirst": "najstarije",
"mergehistory-empty": "Nema spojivih promjena (spajanje nije moguće).",
"mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene}} stranice $1 uspješno {{PLURAL:$3|spojena|spojene}} u povijest stranice [[:$2]].",
"mergehistory-fail": "Nemoguće spojiti povijest stranica, molimo provjerite stranice i vremenske parametre.",
+ "mergehistory-fail-bad-timestamp": "Oznaka vremena nije valjana.",
"mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
"mergehistory-no-destination": "Ciljna stranica $1 ne postoji.",
"mergehistory-invalid-source": "Izvorna stranica mora imati valjani naziv.",
"mergelog": "Evidencija spajanja povijesti stranica",
"revertmerge": "Razdvoji",
"mergelogpagetext": "Slijedi popis posljednjih spajanja povijesti stranica.",
- "history-title": "Povijest izmjena stranice \"$1\"",
- "difference-title": "Razlika između inačica stranice $1",
+ "history-title": "Povijest izmjena stranice »$1«",
+ "difference-title": "Razlika između inačica stranice »$1«",
"difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
"difference-multipage": "(Razlika između stranica)",
"lineno": "Redak $1:",
"userrights-editusergroup": "Uredi {{GENDER:$1|suradničke}} skupine",
"userrights-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
"saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
- "userrights-groupsmember": "Član:",
- "userrights-groupsmember-auto": "Uključeni član:",
+ "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} skupina:",
+ "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} obuhvaćenih skupina:",
"userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
"userrights-reason": "Razlog:",
"userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
"right-move": "Premještanje stranica",
"right-move-subpages": "Premještanje stranica s njihovim podstranicama",
"right-move-rootuserpages": "Premještanje osnovne stranice suradnika",
+ "right-move-categorypages": "premještanja kategorizacijskih stranica",
"right-movefile": "Premještanje datoteka",
"right-suppressredirect": "Ne raditi preusmjeravanje od starog imena prilikom premještanja stranice",
"right-upload": "Postavljanje datoteka",
"recentchanges-label-minor": "Manja izmjena",
"recentchanges-label-bot": "Izmjenu napravio bot",
"recentchanges-label-unpatrolled": "Nepregledana izmjena",
- "recentchanges-label-plusminus": "Promjena veličine stranice (u bajtovima)",
+ "recentchanges-label-plusminus": "Promjena veličine stranice u bajtovima",
"recentchanges-legend-heading": "<strong>Legenda:</strong>",
"recentchanges-legend-newpage": "Nova stranica",
"recentchanges-legend-plusminus": "(<em>±123</em>)",
"filehist-dimensions": "Dimenzije",
"filehist-filesize": "Veličina datoteke",
"filehist-comment": "Komentar",
- "imagelinks": "Upotreba datoteke",
+ "imagelinks": "Uporaba datoteke",
"linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedeće stranice povezuju|$1 sljedećih stranica povezuje}} na ovu datoteku:",
"linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
"nolinkstoimage": "Nijedna stranica ne povezuje na ovu sliku.",
"bad_image_list": "Rabi se sljedeći format:\n\nSamo retci koji počinju sa zvjezdicom su prikazani. Prva poveznica u retku mora biti poveznica na nevaljanu sliku.\nSvaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se slike pojavljuju ''inline''.",
"variantname-sr-ec": "ćirilica",
"variantname-sr-el": "latinica",
- "metadata": "Metapodaci",
+ "metadata": "Metapodatci",
"metadata-help": "Ova datoteka sadržava dodatne podatke koje je vjerojatno dodala digitalna kamera ili skener u procesu snimanja odnosno digitalizacije. Ako je datoteka mijenjana, podatci možda nisu u skladu sa stvarnim stanjem.",
"metadata-expand": "Pokaži sve podatke",
"metadata-collapse": "Sakrij dodatne podatke",
"tags": "Valjane oznake izmjena",
"tag-filter": "Filtar [[Special:Tags|oznaka]]:",
"tag-filter-submit": "Filtar",
- "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake|Oznaka}}]]: $2)",
"tag-mw-contentmodelchange": "promjena modela sadržaja",
"tag-mw-contentmodelchange-description": "Uređivanja koja [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel mijenjanju model sadržaja] stranice",
"tags-title": "Oznake",
"htmlform-time-invalid": "Unesena vrijednost nije prepoznati format vremena. Pokušajte koristiti format HH:MM:SS.",
"htmlform-datetime-toohigh": "Uneseni datum i vrijeme su veći od $1",
"logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
- "logentry-delete-delete_redir": "$1 je {{GENDER:$2|obrisao|obrisala}} preusmjeravanje $3 prepisivanjem",
+ "logentry-delete-delete_redir": "$1 je premještanjem {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
"logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
"logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4",
"logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4",
"searcharticle": "Անցնել",
"history": "Էջի պատմություն",
"history_short": "Պատմություն",
- "updatedmarker": "թարմացվել է իմ վերջին այցից հետո",
+ "updatedmarker": "փոփոխվել է ձեր վերջին այցից հետո",
"printableversion": "Տպելու տարբերակ",
"permalink": "Մշտական հղում",
"print": "Տպել",
"retypenew": "Հաստատեք նոր գաղտնաբառը.",
"resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
"changepassword-success": "Ձեր գաղտնաբառը փոփոխվեց։",
- "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80եր",
- "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¶ անջատված են:",
- "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Ö\80Õ¥Ö\80Õ¨",
- "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ¡ÕµÕ«Õ¶ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80",
- "botpasswords-editexisting": "Խմբագրել առկա բոտային ծածկագիրը",
+ "botpasswords": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼եր",
+ "botpasswords-disabled": "Ô²Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80Õ¨ անջատված են:",
+ "botpasswords-existing": "Ô³Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ¢Õ¸Õ¿Õ¥Ö\80Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¥Ö\80",
+ "botpasswords-createnew": "Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼",
+ "botpasswords-editexisting": "Փոխել եղած բոտի գաղտնաբառը",
"botpasswords-label-appid": "Բոտի անուն՝",
"botpasswords-label-create": "Ստեղծել",
"botpasswords-label-update": "Թարմացնել",
"botpasswords-label-cancel": "Չեղարկել",
"botpasswords-label-delete": "Ջնջել",
- "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը",
+ "botpasswords-label-resetpassword": "Õ\8eÕ¥Ö\80Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը",
"botpasswords-label-grants-column": "Թույլատրված է",
"botpasswords-bad-appid": "\"$1\" բոտի անունն անթույլատրելի է:",
"botpasswords-created-title": "Բոտի ծածկագիրը ստեղծվել է",
"botpasswords-created-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
- "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80ը թարմացվել է",
- "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ°Õ¡Õ´Õ¡Ö\80 Õ¢Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§:",
- "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ®Õ¡Õ®Õ¯Õ¡Õ£Õ«Ö\80Õ¨ Õ»Õ¶Õ»Õ¾Õ¡Õ® Õ§",
+ "botpasswords-updated-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼ը թարմացվել է",
+ "botpasswords-updated-body": "$2 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« $1 Õ¢Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Ö\83Õ¸Ö\83Õ¸ÕÕ¾Õ¥Ö\81:",
+ "botpasswords-deleted-title": "Ô²Õ¸Õ¿Õ« Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ Õ»Õ¶Õ»Õ¾Õ¥Ö\81",
"botpasswords-deleted-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ջնջվել է:",
"resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
"resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
"tog-enotifminoredits": "ОагIонашта а файлашта даь хувцамаш геттара зIамига дале а хоам бе сога",
"tog-enotifrevealaddr": "ДIахайта хоамбараш чу бIаргадейта са почта адрес",
"tog-shownumberswatching": "Шоаш зем бу оагIонашта юкъе ер оагIув чуяьккха доакьошхоша таьрахь гойта",
- "tog-oldsig": "ХIанзара яздаь кулг:",
+ "tog-oldsig": "Хьа карара кулг яздар:",
"tog-fancysig": "Кулг яздара ший йола вики-разметка (автоматически тIахьожаярг йоацаш)",
"tog-uselivepreview": "Пайда эца сиха дола хьалххе бIаргтохар",
"tog-forceeditsummary": "ДIахьалхадаккха, нагахьа санна хувцама йоазонца сурт оттадара моттиг хьалъйизанза яле",
"category-file-count-limited": "Укх категори чу {{PLURAL:$1|$1 файл|$1 файлаш|1=цаI мара файл яц}}.",
"listingcontinuesabbrev": "(дIахо)",
"index-category": "Индекс оттаеш оагIонаш",
- "noindex-category": "Индекс ца оттаеш оагIонаш",
+ "noindex-category": "Индекс оттайинза оагIонаш",
"broken-file-category": "Файла тIахьожаяргаш болхбеш йоаца оагIонаш",
"about": "Сурт оттадар",
"article": "Статья",
"newwindow": " (керда кора чу)",
"cancel": "Юхадаккха",
"moredotdotdot": "ДIахо...",
- "morenotlisted": "Ð\95Ñ\80 Ñ\81пиÑ\81ок Ñ\85Ñ\8cалйиза Ñ\8fÑ\86.",
+ "morenotlisted": "Ð\95Ñ\80 Ñ\85Ñ\8cаÑ\8fзÑ\8fÑ\8cÑ\80 Ñ\85Ñ\8cалйизанза Ñ\85ила мегаÑ\88 Ñ\8f.",
"mypage": "ОагIув",
"mytalk": "Дувца оттадар",
"anontalk": "Дувца оттадар",
"showpreview": "Хьалххе бIаргтохар",
"showdiff": "Даь дола хувцамаш",
"anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
- "summary-preview": "СÑ\83Ñ\80Ñ\82 оÑ\82Ñ\82адаÑ\80 Ñ\85Ñ\83Ñ\80гда:",
- "subject-preview": "Ð\94аÑ\8cкÑ\8aа Ñ\86Iи Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f иÑ\88Ñ\82Ñ\82а:",
+ "summary-preview": "Ð¥Ñ\83вÑ\86ама Ñ\81Ñ\83Ñ\80Ñ\82 оÑ\82Ñ\82адаÑ\80а Ñ\85Ñ\8cалÑ\85е бIаÑ\80гÑ\82оÑ\85аÑ\80:",
+ "subject-preview": "Теман/коÑ\80Ñ\82баÑ\80а Ñ\85Ñ\8cалÑ\85Ñ\85е бIаÑ\80гÑ\82оÑ\85аÑ\80:",
"blockedtitle": "Доакъашхочун чIега техаб",
"blockednoreason": "бахьан белгалдаьккха дац",
"loginreqlink": "довзийта",
"notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
"prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
"nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
- "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
+ "prevn-title": "{{PLURAL:$1|ХьалхадоагIа $1 дIаяздар}}",
"nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
"shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
"viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
- "searchmenu-exists": "'''Укх вики чу йолаш я оагӀув «[[:$1]]»'''",
+ "searchmenu-exists": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
"searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
"searchprofile-articles": "Кертера оагIонаш",
"searchprofile-images": "Мультимедиа",
"searchprofile-everything-tooltip": "Массайола оагIонаш тIа лахар (дувцар оттадара оагIонаш чулоацаш)",
"searchprofile-advanced-tooltip": "Iочуязаяь цIерий аренашка лаха",
"search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешаш}})",
- "search-result-category-size": "{{PLURAL:$1|1=$1 дакъа|$1 дакъаш}} ({{PLURAL:$2|1=$2 кIалцатег|$2 кIалцатегаш}}, {{PLURAL:$3|1=$3 паьла|$3 паьлий}})",
+ "search-result-category-size": "$1 {{PLURAL:$1|юкъедахар}} ($2 {{PLURAL:$2|кIалкатегори}}, $3 {{PLURAL:$3|файл}})",
"search-redirect": "(дIа-хьахьожадар $1 тIара)",
"search-section": "(дáкъа «$1»)",
"search-suggest": "Хьона эшар ер хила мега: $1",
"prefs-signature": "Кулг яздар",
"prefs-preview": "Хьалххе бIаргтохар",
"userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
- "editusergroup": "Ð¥Ñ\83вÑ\86а {{GENDER:$1|доакÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н}} тоабаш",
+ "editusergroup": "Ð\99оÑ\82Ñ\82а доакÑ\8aаÑ\88Ñ\85ой тоабаш",
"saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
"userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
"userrights-reason": "Бахьан:",
"recentchanges-label-plusminus": "байташкахь боарам хувцар",
"recentchanges-legend-heading": "<strong>Легенда: </strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
- "rcnotefrom": "КIалхагIа хувцамаш хьахьекха я <strong>$2</strong> денза (<strong>$1</strong> кхачалца).",
+ "rcnotefrom": "КIалхагIа {{PLURAL:$5|хувцам белгалбаьккхаб}} <strong>$3, $4</strong> тIера (хьахьекхабац <strong>$1</strong>-л дукхагIа).",
"rclistfrom": "$3 $2 денза даь хувцамаш хьахьокха",
"rcshowhideminor": "$1 зIамига нийсдараш",
"rcshowhideminor-show": "Хьахьокха",
"newpages": "Керда оагIонаш",
"move": "ЦIи хувца",
"movethispage": "ЦIи хувца укх оагIон",
- "pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
+ "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
"pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
"booksources": "Джейнай хьасташ (источники)",
"booksources-search-legend": "Джейнах лаьца хоам лахар",
"protect_expiry_old": "Чакхадалара ха — дахáр да.",
"protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
"protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
- "protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
+ "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
"protect-default": "Лорадар доацаш",
"protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
"protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
"unblocklogentry": "чIега баьстаб $1",
"block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
"move-page-legend": "ОагIон цIи хувцар",
- "movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
- "movepagetalktext": "ТIаÑ\82еÑ\85а дÑ\83вÑ\86ама оагIÑ\83в, Ñ\88ий лоIамаÑ\85Ñ\8c Ñ\86Iи Ñ\85Ñ\83влÑ\83Ñ\80гÑ\8cÑ\8f, '''еÑ\80 дага а доаÑ\86аÑ\80, доаÑ\86а:'''\n\n*Ð\98зза мо Ñ\86Iи йолаÑ\88 Ñ\8fÑ\8cÑ\81Ñ\81а дÑ\83вÑ\86ама оагIÑ\83в Ñ\8f е\n*Ð\9eаÑ\88 кIалÑ\85аÑ\85Ñ\8c белгало даÑ\8cдаÑ\86.\n\nÐ\98з иÑ\88Ñ\82Ñ\82а дале, кÑ\83лги новкÑ\8aоÑ\81Ñ\82алÑ\86а оагIÑ\83внаÑ\88 вIаÑ\88агIаÑ\82оÑ\85а е дIадеÑ\85Ñ\8cаÑ\8fккÑ\85а деза Ñ\88Ñ\83н.",
+ "movepagetext": "КIалха белгаляьча формах пайда ийца Iа оагIон цIи хувцаргья, цун хувцамий тептар кхыйола моттиге оттаярца цхьанна.\nКъаьнарча цIерах хургья кердача цIера дIа-сахьожадар.\nХьа аьттув ба къаьнарча цIера хинна дIа-сахьожадараш ше-ше кердадаккха.\nНагахьа санна Iа из ца дой, дехар ду, [[Special:DoubleRedirects|шолха]] а [[Special:BrokenRedirects|хеттанза дIа-сахьожадараш]] долаш дий тахка.\nХьо бехктокхаме ва тIахьожаяргаш шоаш тIахьожаде дезача нийса хилар.\n\nТеркам бе, оагIон цIи <strong>хувцалургьйоацалга</strong> нагахьа санна изза мо цIи йола оагIув йолаш яле. Чу хIама доацача оагIонашта е дIа-сахьожадарашта, кхы а цар хувцамий истори йице, из новкъа дац. Из яхилга да, нагахьа Iа харца цIи хувцар даь дале, ше хинна цIи юхадIахувца йиш я, амма бакъда йолаш йола оагIув ца ховш дIаяккха аьттув бац. \n\n<strong>Белгалдоахар:</strong>\nГIоряьннача оагIонай цIи хувцаро тIехдоккхеи цIаьххеи хувцамаш доаладе мега.\nБоккъала, дIахо хье дIавахалехьа, кхета, хила мегаш дар хургдолга.",
+ "movepagetalktext": "Ð\9dагаÑ\85Ñ\8cа Ñ\81анна Iа еÑ\80 пÑ\83нкÑ\82 белгалÑ\8aйой, Ñ\86Ñ\83нÑ\86а бÑ\83взам бола дÑ\83вÑ\86а оÑ\82Ñ\82адаÑ\80а оагIÑ\83в иÑ\88Ñ\82Ñ\82а Ñ\88е-Ñ\88е Ñ\86Iи Ñ\85ийÑ\86а Ñ\85Ñ\83Ñ\80гÑ\8cÑ\8f, нагаÑ\85Ñ\8cа Ñ\81анна изза мо Ñ\86Iи йола Ñ\8fÑ\8cÑ\81Ñ\81а йоаÑ\86а дÑ\83вÑ\86а оÑ\82Ñ\82адаÑ\80а оагIÑ\83в йолаÑ\88 йиÑ\86е.\n\nÐ\98з иÑ\88Ñ\82Ñ\82а дале, нагаÑ\85Ñ\8cа из Ñ\8dÑ\88аÑ\88 дале, IайÑ\85а оагIон Ñ\86Iи дIаÑ\85Ñ\83вÑ\86а.",
"newtitle": "Керда цIи:",
"move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
"movepagebtn": "ОагIон цIи хувца",
"Saracrovetto",
"Tosky",
"Selven",
- "Margherita.mignanelli"
+ "Margherita.mignanelli",
+ "Redredsonia"
]
},
"tog-underline": "Sottolinea i collegamenti:",
"nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
"shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
"viewprevnext": "Vedi ($1 {{int:pipe-separator}} $2) ($3).",
- "searchmenu-exists": "'''Sul sito esiste una pagina il cui nome è \"[[:$1]]\"'''",
+ "searchmenu-exists": "<strong>Su questo wiki esiste una pagina il cui nome è \"[[:$1]]\".</strong> {{PLURAL:$2|0=|Vedi anche gli altri risultati trovati.}}",
"searchmenu-new": "<strong>Crea la pagina \"[[:$1]]\" su questo wiki!</strong> {{PLURAL:$2|0=|Vedi anche la pagina trovata con la tua ricerca|Vedi anche i risultati della ricerca}}",
"searchprofile-articles": "Pagine di contenuti",
"searchprofile-images": "Multimedia",
"userrights-expiry-current": "Scade il $1",
"userrights-expiry-none": "Non ha scadenza",
"userrights-expiry": "Scadenza:",
+ "userrights-expiry-existing": "Scadenza attuale: $2, $3",
+ "userrights-expiry-othertime": "Altra durata:",
"userrights-expiry-options": "1 giorno:1 day,1 settimana:1 week,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year",
"userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
"group": "Gruppo:",
"rcfilters-invalid-filter": "Filtro non valido",
"rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
"rcfilters-filterlist-title": "Filtri",
+ "rcfilters-highlightmenu-title": "Seleziona un colore",
"rcfilters-filterlist-noresults": "Nessun filtro trovato",
"rcfilters-filtergroup-registration": "Registrazione utente",
"rcfilters-filter-registered-label": "Registrato",
"largefileserver": "Il file supera le dimensioni consentite dalla configurazione del server.",
"emptyfile": "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
"windows-nonascii-filename": "Questo wiki non supporta nomi di file con caratteri speciali.",
- "fileexists": "Un file con questo nome esiste già.\nVerificare prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
+ "fileexists": "Un file con questo nome esiste già, verifica prima <strong>[[:$1]]</strong> se non si è sicuri di volerlo sovrascrivere.\n[[$1|thumb]]",
"filepageexists": "La pagina di descrizione di questo file è già stata creata all'indirizzo <strong>[[:$1]]</strong>, anche se non esiste ancora un file con questo nome. La descrizione dell'oggetto inserita in fase di caricamento non apparirà sulla pagina di descrizione. Per far sì che l'oggetto compaia sulla pagina di descrizione, sarà necessario modificarla manualmente.\n[[$1|thumb]]",
"fileexists-extension": "Un file con nome simile a questo esiste già: [[$2|thumb]]\n* Nome del file caricato: <strong>[[:$1]]</strong>\n* Nome del file esistente: <strong>[[:$2]]</strong>\nForse vuoi scegliere un nome più caratteristico?.",
"fileexists-thumbnail-yes": "Il file caricato sembra essere una miniatura ''(thumbnail)''. [[$1|thumb]]\nVerificare, per confronto, il file <strong>[[:$1]]</strong>.\nSe si tratta della stessa immagine, nelle dimensioni originali, non è necessario caricarne altre miniature.",
"editcomment": "L'oggetto della modifica era: <em>$1</em>.",
"revertpage": "Annullate le modifiche di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), riportata alla versione precedente di [[User:$1|$1]]",
"revertpage-nouser": "Annullate le modifiche di un utente nascosto, riportata alla versione precedente di {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Annullate le modifiche di $1; pagina riportata all'ultima versione di $2.",
+ "rollback-success": "Annullate le modifiche di {{GENDER:$3|$1}}; pagina riportata all'ultima versione di {{GENDER:$4|$2}}.",
"rollback-success-notify": "Annullate le modifiche di $1;\npagina riportata all'ultima revisione di $2. [$3 Mostra le modifiche]",
"sessionfailure-title": "Sessione fallita",
"sessionfailure": "Si è verificato un problema nella sessione che identifica l'accesso; il sistema non ha eseguito il comando impartito per precauzione. Tornare alla pagina precedente con il tasto 'Indietro' del proprio browser, ricaricare la pagina e riprovare.",
"protect-expiry-indefinite": "infinito",
"protect-cascade": "Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).",
"protect-cantedit": "Non è possibile modificare i livelli di protezione per la pagina in quanto non si dispone dei permessi necessari per modificare la pagina stessa.",
- "protect-othertime": "Durata non in elenco:",
- "protect-othertime-op": "durata non in elenco",
+ "protect-othertime": "Altra durata:",
+ "protect-othertime-op": "altra durata",
"protect-existing-expiry": "Scadenza attuale: $2, $3",
"protect-existing-expiry-infinity": "Scadenza attuale: infinito",
"protect-otherreason": "Altri motivi/dettagli:",
"ipbemailban": "Impedisci all'utente l'invio di email",
"ipbenableautoblock": "Blocca automaticamente l'ultimo indirizzo IP usato dall'utente e i successivi con cui vengono tentate modifiche",
"ipbsubmit": "Blocca l'utente",
- "ipbother": "Durata non in elenco:",
+ "ipbother": "Altra durata:",
"ipboptions": "2 ore:2 hours,1 giorno:1 day,3 giorni:3 days,1 settimana:1 week,2 settimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year,infinito:infinite",
"ipbhidename": "Nascondi il nome utente dalle modifiche e dagli elenchi.",
"ipbwatchuser": "Segui le pagine e le discussioni utente di questo utente",
"Gi777ga",
"Matma Rex",
"Sopopruidze",
- "Dixtosa"
+ "Dixtosa",
+ "OpusDEI"
]
},
"tog-underline": "ბმულების ხაზგასმა:",
"tog-showhiddencats": "დამალული კატეგორიების ჩვენება",
"tog-norollbackdiff": "ცვლილების გაუქმებისას არ მანახო ცვლილებათა განსხვავება",
"tog-useeditwarning": "გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით",
- "tog-prefershttps": "á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ á\83\9bá\83£á\83\93á\83\90á\83\9b გამოყენება ავტორიზაციის შემდეგ",
+ "tog-prefershttps": "á\83\9bá\83£á\83\93á\83\90á\83\9b á\83£á\83¡á\83\90á\83¤á\83 á\83\97á\83®á\83\9d á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\98á\83¡ გამოყენება ავტორიზაციის შემდეგ",
"underline-always": "მუდამ",
"underline-never": "არასდროს",
"underline-default": "დამოკიდებული მომხმარებელზე ან ბრაუზერის არჩევანზე",
"category-file-count-limited": "შემდეგი {{PLURAL:$1|ფაილი|$1 ფაილები}} ამ კატეგორიაშია.",
"listingcontinuesabbrev": "გაგრძ.",
"index-category": "გვერდების ინდექსაცია",
- "noindex-category": "არ არსებობს ინდექსირებული გვერდები",
+ "noindex-category": "არაინდექსირებული გვერდები",
"broken-file-category": "გვერდები ფაილების არასწორი ბმულებით",
"categoryviewer-pagedlinks": "($1) ($2)",
"category-header-numerals": "$1–$2",
"newwindow": "(ახალ ფანჯარაში)",
"cancel": "გაუქმება",
"moredotdotdot": "ვრცლად...",
- "morenotlisted": "á\83\94á\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98 á\83¡á\83\98á\83\90á\83\90.",
+ "morenotlisted": "á\83\94á\83¡ á\83¡á\83\98á\83\90 á\83¨á\83\94á\83\98á\83«á\83\9aá\83\94á\83\91á\83\90 á\83\98á\83§á\83\9dá\83¡ á\83\90á\83 á\83\90á\83¡á\83 á\83£á\83\9aá\83\98.",
"mypage": "გვერდი",
"mytalk": "განხილვა",
"anontalk": "განხილვა",
"searcharticle": "გვერდი",
"history": "გვერდის ისტორია",
"history_short": "ისტორია",
+ "history_small": "ისტორია",
"updatedmarker": "განახლდა ჩემი ბოლო შემოსვლის შემდეგ",
"printableversion": "დასაბეჭდი ვერსია",
"permalink": "მუდმივი ბმული",
"viewyourtext": "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ <strong>თქვენი რედაქტირებების</strong> საწყისი ტექსტი ამ გვერდზე:",
"protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
"editinginterface": "'''ყურადღება:''' თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. \nიმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში, გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
- "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+ "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
"cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის|გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
"namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
"customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
"recentchanges-legend-plusminus": "(<em>±123</em>)",
"recentchanges-submit": "ჩვენება",
+ "rcfilters-highlightmenu-title": "ფერის არჩევა",
"rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
"rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
"rcshowhideminor": "მცირე რედაქტირების $1",
"rcfilters-invalid-filter": "유효하지 않은 필터",
"rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
"rcfilters-filterlist-title": "필터",
+ "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
+ "rcfilters-highlightbutton-title": "결과 강조",
+ "rcfilters-highlightmenu-title": "색 선택",
"rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
"rcfilters-filtergroup-registration": "사용자 등록",
"rcfilters-filter-registered-label": "등록됨",
"editcomment": "편집 요약: <em>$1</em>",
"revertpage": "[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])의 편집을 [[User:$1|$1]]의 마지막 판으로 되돌림",
"revertpage-nouser": "숨긴 사용자의 편집을 {{GENDER:$1|[[User:$1|$1]]}}의 마지막 판으로 되돌림",
- "rollback-success": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
+ "rollback-success": "{{GENDER:$3|$1}}의 편집을 되돌렸습니다.\n{{GENDER:$4|$2}}의 마지막 판으로 바뀌었습니다.",
"rollback-success-notify": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다. [$3 차이 보기]",
"sessionfailure-title": "세션 실패",
"sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
"rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
"rcfilters-invalid-filter": "Net valabele Filter",
"rcfilters-filterlist-title": "Filteren",
+ "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
"rcfilters-filterlist-noresults": "Keng Filtere fonnt",
"rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
"rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
"editcomment": "De Resumé vun der Ännerung war: <em>$1</em>.",
"revertpage": "Ännerunge vum [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]]) zréckgesat op déi lescht Versioun vum [[User:$1|$1]]",
"revertpage-nouser": "Zréckgesaten Ännerungen duerch e verstoppte Benotzer op déi lescht Versioun vum {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "D'Ännerunge vum $1 goufen zréckgesat op déi lescht Versioun vum $2.",
+ "rollback-success": "D'Ännerunge vum {{GENDER:$3|$1}} goufen zréckgesat op déi lescht Versioun vum {{GENDER:$4|$2}}.",
"rollback-success-notify": "Zréckgesat Ännerunge vum $1:\nzréckgeännert op déi lescht Versioun vum $2. [$3 Ännerunge weisen]",
"sessionfailure-title": "Setzungsfeeler",
"sessionfailure": "Et schéngt e Problem mat Ärer Loginseance ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Seance piratéiert ka ginn.\nKlickt w.e.g. op \"Zréck\" a luet déi Säit vun där Dir komm sidd nei, a versicht et dann nach eng Kéier.",
"wantedfiletext-nocat-noforeign": "I seguenti file son in doeuvia, ma no existan.",
"wantedtemplates": "Template domandæ",
"mostlinked": "Paggine ciû collegæ",
- "mostlinkedcategories": "Categorîe ciû collegæ",
+ "mostlinkedcategories": "Categorie ciu conligæ",
"mostlinkedtemplates": "Paggine ciu incluse",
"mostcategories": "Voxe con ciû categorîe",
"mostimages": "Immaggini con ciû collegamenti",
"protectedtitles-summary": "Questa pagina a l'elenca i titoli che son attualmente protetti da-a creaçion. Pe 'n elenco de pagine existente che son protette, amia [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
"protectedtitlesempty": "Tittoli protezui con sti parammetri pe-o momento no ghe n'è.",
"protectedtitles-submit": "Mostra tittoli",
- "listusers": "Lista d'ûtenti",
+ "listusers": "Lista di utenti",
"listusers-editsonly": "Mostra solo i utenti con di contributi",
"listusers-creationsort": "Ordina pe dæta de creaçion",
"listusers-desc": "Ordina in senso decrescente",
"rcfilters-clear-all-filters": "Valyti visus filtrus",
"rcfilters-invalid-filter": "Negalimas filtras",
"rcfilters-filterlist-title": "Filtrai",
+ "rcfilters-highlightmenu-title": "Pasirinkti spalvą",
"rcfilters-filterlist-noresults": "Nerastas toks filtras",
"rcfilters-filtergroup-registration": "Vartotojo registracija",
"rcfilters-filter-registered-label": "Registruoti",
"searcharticle": "Aiziet!",
"history": "hronoloģija",
"history_short": "Vēsture",
+ "history_small": "vēsture",
"updatedmarker": "atjaunināti kopš pēdējā apmeklējuma",
"printableversion": "Drukājama versija",
"permalink": "Pastāvīgā saite",
"views": "Apskates",
"toolbox": "Rīki",
"tool-link-userrights": "Mainīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
+ "tool-link-userrights-readonly": "Apskatīt {{GENDER:$1|dalībnieka|dalībnieces}} grupas",
"tool-link-emailuser": "Nosūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
"userpage": "Skatīt dalībnieka lapu",
"projectpage": "Skatīt projekta lapu",
"newarticletext": "Šajā projektā vēl nav lapas ar šādu nosaukumu.\nLai izveidotu lapu, sāc rakstīt teksta logā apakšā (par teksta formatēšanu un sīkākai informācija skatīt [$1 palīdzības lapu]).\nJa tu šeit nonāci kļūdas pēc, vienkārši uzspied <strong>back</strong> pogu pārlūkprogrammā.",
"anontalkpagetext": "----''Šī ir diskusiju lapa anonīmam dalībniekam, kurš vēl nav kļuvis par reģistrētu dalībnieku vai arī neizmanto savu dalībnieka vārdu. Tādēļ mums ir jāizmanto skaitliskā IP adrese, lai viņu identificētu.\nŠāda IP adrese var būt vairākiem dalībniekiem.\nJa tu esi anonīms dalībnieks un uzskati, ka tev ir adresēti neatbilstoši komentāri, lūdzu, [[Special:CreateAccount|kļūsti par dalībnieku]] vai arī [[Special:UserLogin|izmanto jau izveidotu dalībnieka vārdu]], lai izvairītos no turpmākām neskaidrībām un tu netiktu sajaukts ar citiem anonīmiem dalībniekiem.''",
"noarticletext": "Šajā lapā šobrīd nav nekāda teksta, tu vari [[Special:Search/{{PAGENAME}}|meklēt citās lapās pēc šīs lapas nosaukuma]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītos reģistru ierakstos] vai arī [{{fullurl:{{FULLPAGENAME}}|action=edit}} sākt rediģēt šo lapu]</span>.",
- "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot si lapu.",
+ "noarticletext-nopermission": "Šajā lapā pašlaik nav nekāda teksta.\nTu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,\nvai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>, bet jums nav atļauja izveidot šo lapu.",
"userpage-userdoesnotexist": "Lietotājs \"<nowiki>$1</nowiki>\" nav reģistrēts.\nLūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.",
"userpage-userdoesnotexist-view": "Dalībnieks \"$1\" nav reģistrēts.",
"blocked-notice-logextract": "Šis dalībnieks pašlaik ir nobloķēts.\n\nPēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:",
"right-unblockself": "Atbloķēt sevi",
"right-protect": "Izmainīt aizsargātās lapas un to aizsardzības līmeni",
"right-editprotected": "Labot aizsargātās lapas (bez kaskādes aizsardzības)",
+ "right-editcontentmodel": "Labot lapas satura modeli",
"right-editinterface": "Izmainīt dalībnieka interfeisu",
"right-editusercssjs": "Izmainīt citu dalībnieku CSS un JS failus",
"right-editusercss": "Izmainīt citu dalībnieku CSS failus",
"action-upload_by_url": "augšupielādēt šo failu no URL",
"action-writeapi": "izmantot rakstīto lietojumprogrammu saskarni",
"action-delete": "izdzēst šo lapu",
- "action-deleterevision": "izdzēst šo versiju",
- "action-deletedhistory": "skatīt šīs lapas dzēsto hronoloģiju",
+ "action-deleterevision": "dzēst versijas",
+ "action-deletelogentry": "dzēst žurnāla ierakstus",
+ "action-deletedhistory": "skatīt šīs lapas dzēsto vēsturi",
"action-browsearchive": "meklēt dzēstās lapas",
"action-undelete": "atjaunot šo lapu",
"action-suppressrevision": "pārskatīt un atjaunot šo slēpto versiju",
"recentchanges-legend-heading": "<strong>Apzīmējumi:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
"recentchanges-submit": "Rādīt",
+ "rcfilters-invalid-filter": "Nederīgs filtrs",
+ "rcfilters-filterlist-title": "Filtri",
+ "rcfilters-filterlist-noresults": "Filtri nav atrasti",
+ "rcfilters-filtergroup-registration": "Lietotāja reģistrācija",
+ "rcfilters-filtergroup-changetype": "Izmaiņu veids",
+ "rcfilters-filter-pageedits-label": "Lapu labojumi",
+ "rcfilters-filter-pageedits-description": "Labojumi vikivietnes saturā, diskusijā, kategoriju aprakstos...",
+ "rcfilters-filter-newpages-label": "Lapu veidošana",
+ "rcfilters-filter-newpages-description": "Labojumi, kas veido jaunas lapas.",
+ "rcfilters-filter-categorization-label": "Kategoriju izmaiņas",
+ "rcfilters-filter-categorization-description": "Ieraksti par lapu pievienošanu vai noņemšanu no kategorijām.",
+ "rcfilters-filter-logactions-label": "Reģistrētās darbības",
+ "rcfilters-filter-logactions-description": "Administratīvās darbības, kontu veidošana, lapu dzēšana, augšupielādes...",
"rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
"rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
"rcshowhideminor": "$1 maznozīmīgos",
"apihelp-no-such-module": "Modulis \"$1\" nav atrasts.",
"apisandbox": "API smilškaste",
"apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
+ "apisandbox-unfullscreen": "Rādīt lapau",
+ "apisandbox-submit": "Izveidot pieprasījumu",
"apisandbox-reset": "Notīrīt",
"apisandbox-retry": "Mēģināt vēlreiz",
"apisandbox-no-parameters": "Šo API modulim nav parametru.",
"apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
"apisandbox-results": "Rezultāti",
"apisandbox-request-url-label": "Pieprasījuma URL:",
+ "apisandbox-request-json-label": "Pieprasījuma JSON:",
"apisandbox-request-time": "Pieprasījuma izpildes laiks: {{PLURAL:$1|$1 ms}}",
+ "apisandbox-continue": "Turpināt",
"apisandbox-continue-clear": "Notīrīt",
+ "apisandbox-multivalue-all-namespaces": "$1 (visas vārdtelpas)",
+ "apisandbox-multivalue-all-values": "$1 (visas vērtības)",
"booksources": "Grāmatu avoti",
"booksources-search-legend": "Meklēt grāmatu avotus",
"booksources-search": "Meklēt",
"pageinfo-watchers": "Lapas uzraudzītāju skaits",
"pageinfo-redirects-name": "Pāradresāciju skaits uz šo lapu",
"pageinfo-subpages-name": "Šīs lapas apakšlapas",
+ "pageinfo-firstuser": "Lapas izveidotājs",
+ "pageinfo-firsttime": "Lapas izveides datums",
"pageinfo-lastuser": "Pēdējais labotājs",
+ "pageinfo-lasttime": "Pēdējā labojuma datums",
"pageinfo-edits": "Kopējais izmaiņu skaits",
"pageinfo-authors": "Kopējais atsevišķu autoru skaits",
"pageinfo-toolboxlink": "Lapas informācija",
"pageinfo-category-pages": "Lapu skaits",
"pageinfo-category-subcats": "Apakškategoriju skaits",
"pageinfo-category-files": "Failu skaits",
+ "pageinfo-user-id": "Lietotāja ID",
"markaspatrolleddiff": "Atzīmēt kā pārbaudītu",
"markaspatrolledtext": "Atzīmēt šo lapu kā pārbaudītu",
"markedaspatrolled": "Atzīmēta kā pārbaudīta",
"patrol-log-page": "Pārbaudes reģistrs",
"patrol-log-header": "Šis ir pārbaudīto versiju reģistrs.",
"log-show-hide-patrol": "$1 pārbaudes reģistrs",
+ "confirm-markpatrolled-button": "Labi",
"deletedrevision": "Izdzēstā vecā versija $1",
"filedeleteerror-short": "Kļūda dzēšot failu: $1",
"filedeleteerror-long": "Kļūdas, kas radās failu dzēšanas laikā:\n\n$1",
"feedback-submit": "Iesniegt",
"feedback-thanks": "Paldies! Jūsu atsauksmes ir ievietotas lapā \"[$2 $1]\".",
"feedback-thanks-title": "Paldies!",
+ "feedback-useragent": "Lietotāja aģents:",
"searchsuggest-search": "Meklēt {{SITENAME}}",
"searchsuggest-containing": "Meklējamā frāze:",
"api-error-unknown-warning": "Nezināms brīdinājums: $1",
"api-error-unknownerror": "Nezināma kļūda: \"$1\"",
+ "duration-seconds": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+ "duration-minutes": "$1 {{PLURAL:$1|minūtes|minūte|minūtes}}",
+ "duration-hours": "$1 {{PLURAL:$1|stundas|stunda|stundas}}",
+ "duration-days": "$1 {{PLURAL:$1|dienas|diena|dienas}}",
+ "duration-weeks": "$1 {{PLURAL:$1|nedēļas|nedēļa|nedēļas}}",
+ "duration-years": "$1 {{PLURAL:$1|gadi|gads|gadi}}",
+ "duration-decades": "$1 {{PLURAL:$1|desmitgades|desmitgade|desmitgades}}",
+ "duration-centuries": "$1 {{PLURAL:$1|gadsimti|gadsimts|gadsimti}}",
+ "duration-millennia": "$1 {{PLURAL:$1|tūkstošgades|tūkstošgade|tūkstošgades}}",
"limitreport-title": "Parsētāja profilēšanas dati:",
+ "limitreport-cputime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
+ "limitreport-walltime-value": "$1 {{PLURAL:$1|sekundes|sekunde|sekundes}}",
"limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
"limitreport-templateargumentsize": "Veidnes argumenta izmērs",
"limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|baiti|baits|baiti}}",
"special-characters-group-gujarati": "Gudžarati",
"mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
"mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
+ "mw-widgets-categoryselector-add-category-placeholder": "Pievienot kategoriju...",
+ "sessionprovider-generic": "$1 sesijas",
"authmanager-email-label": "E-pasts",
"authmanager-email-help": "E-pasta adrese",
"authmanager-realname-label": "Tavs īstais vārds",
"missingarticle-rev": "(famerenana faha : $1)",
"missingarticle-diff": "(diff : $1 ; $2)",
"readonly_lag": "\nMihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tompony",
+ "nonwrite-api-promise-error": "Ny loha HTTP \"<code>Promise-Non-Write-API-Action:</code>\" dia nalefa fa tsy natao tany amina module fanoratana API ny hataka",
"internalerror": "Tsy fetezana anatin'ny rindrankajy",
"internalerror_info": "Tsy fetezana ety anatiny : $1",
"internalerror-fatal-exception": "Karazana-kadisoana nampijanona \"$1\"",
"passwordreset-emailsentemail": "Lasa ny mailaka famerenana tenimiafina.",
"passwordreset-nocaller": "Mila manitsy mpiantso",
"passwordreset-nosuchcaller": "Tsy misy ilay mpiantso: $1",
- "changeemail": "Hanova ny adiresy imailaka",
- "changeemail-header": "Hanova ny adiresy imailak'ilay kaonty",
+ "passwordreset-invalidemail": "Adiresy mailaka tsy azo raisina",
+ "passwordreset-nodata": "Tsy nanome anaram-pikambana na adiresy mailaka",
+ "changeemail": "Hanova na hanala adiresy mailaka",
+ "changeemail-header": "Fenoy ity fôrmiolera ity ahafahanao manova ny adiresy mailakao. Raha tianao ho esorina ny fifandraisan'ity mailaka ity amin'ny kaontinao dia avelao ho fotsy ny saha rehefa mandefa fôrmiolera.",
"changeemail-no-info": "Mila tafiditra ianao vao avaka mijery ity pejy ity.",
"changeemail-oldemail": "Adiresy imailaka ankehitriny :",
"changeemail-newemail": "Adiresy imailaka vaovao :",
"search-external": "Hikaroka any ivelany",
"searchdisabled": "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
"search-error": "Hadisoana nitranga tam-pikarohana: $1",
+ "search-warning": "Fampitandremana nitranga teo am-pikarohana: $1",
"preferences": "Ny momba anao",
"mypreferences": "Safidy",
"prefs-edits": "isa ny fanovàna :",
"rcfilters-invalid-filter": "Sivana tsy azo raisina",
"rcfilters-empty-filter": "Tsy misy sivana miasa. Aseho avokoa ireo fandraisan'anjara.",
"rcfilters-filterlist-title": "Sivana",
+ "rcfilters-highlightbutton-title": "Hampibaribary ny valiny",
+ "rcfilters-highlightmenu-title": "Hisafidy loko",
"rcfilters-filterlist-noresults": "Tsy nahitana sivana",
"rcfilters-filtergroup-registration": "Fisoratan'ny mpikambana",
"rcfilters-filter-registered-label": "Nisoratra anarana",
"rcfilters-filter-major-description": "Fiovana tsy natao ho madinika.",
"rcfilters-filtergroup-changetype": "Karazam-piovana",
"rcfilters-filter-pageedits-label": "Fiovam-pejy",
+ "rcfilters-filter-newpages-label": "Famoronam-pejy",
+ "rcfilters-filter-newpages-description": "Fiovana nahatonga famoronam-pejy.",
+ "rcfilters-filter-categorization-label": "Fiovana amin'ny sokajy",
+ "rcfilters-filter-categorization-description": "Fandraiketana an'ireo pejy ampiana na esorina amin'ny sokajy.",
+ "rcfilters-filter-logactions-label": "Asa voalaogy",
"rcnotefrom": "Eo ambany dia ahitana ireo fiovana{{PLURAL:$5}} hatry ny <strong>$3, $4</strong> (naseho hatramin'ny <strong>$1</strong>).",
"rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
"rcshowhideminor": "$1 ny fanovàna kely",
"upload-copy-upload-invalid-domain": "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
"upload-dialog-title": "Hanafatra rakitra",
"upload-dialog-button-cancel": "Aoka",
+ "upload-dialog-button-back": "Hiverina",
"upload-dialog-button-done": "Vita",
"upload-dialog-button-save": "Tehirizina",
"upload-dialog-button-upload": "Mampiditra",
"special-characters-group-khmer": "kimera",
"special-characters-title-endash": "tsipika anglisy",
"special-characters-title-emdash": "tsipika em",
- "special-characters-title-minus": "marika mainosy"
+ "special-characters-title-minus": "marika mainosy",
+ "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+ "authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
+ "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
+ "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
+ "authmanager-authplugin-create-fail": "Nandà ny famoronan-kaonty ny plugin fampamantarana.",
+ "authmanager-authplugin-setpass-denied": "Tsy ahafahana manova tenimiafina ny plugin fampamantarana.",
+ "authmanager-userlogin-remembermypassword-help": "Milaza raha tsy maintsy tadidiana mihoatra ny halafan'ny fotoam-pitsidihana ny tenimiafina.",
+ "authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
+ "authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
+ "authmanager-retype-help": "tenimiafina indray hanamarinana.",
+ "authmanager-provider-password": "Fampamamtarana mifototra amin'ny tenimiafina",
+ "authmanager-provider-password-domain": "Fampamantarana mifototra amin'ny tenimiafina ary vala",
+ "authmanager-provider-temporarypassword": "Tenimiafina vonjimaika",
+ "authprovider-resetpass-skip-help": "Handingana ny famerenam-tenimiafina.",
+ "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao."
}
"mytalk": "Каҥашымаш",
"anontalk": "Каҥашымаш тиде IP нерген",
"navigation": "Навигаций",
+ "and": " да",
"qbfind": "Муаш",
"qbedit": "Тӧрлаташ",
"qbpageoptions": "Тиде лаштык",
"view": "Ончалаш",
"edit": "Тӧрлаташ",
"create": "Ышташ",
- "editthispage": "Тӧрлаташ тиде лаштыкым",
+ "editthispage": "Тиде лаштыкым тӧрлаташ",
"create-this-page": "Тиде лаштыкым ышташ",
"delete": "Шӧраш",
"deletethispage": "Тиде лаштыкым шӧраш",
"emailauthenticated": "Тыйын почто адресетым пеҥгыдемдыме $2, $3.",
"loginlanguagelabel": "Йылме: $1",
"pt-login": "Пураш",
+ "pt-createaccount": "Регистрацийым эрте",
"pt-userlogout": "Лекташ",
"changepassword": "Шолыпмутым вашталташ",
"oldpassword": "Тошто шолыпмут:",
"preview": "Ончылгоч ончымаш",
"showpreview": "Ончылгоч ончымаш",
"showdiff": "Тӧрлатымашым ончыкташ",
- "anoneditwarning": "'''ТӱÑ\82кӧ лий:''': ТÑ\8bй авÑ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен оÑ\82Ñ\8bл. ТÑ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 лаÑ\88Ñ\82Ñ\8bкÑ\8bн ваÑ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 иÑ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже возалÑ\82 кодеÑ\88. Шке лӱмеÑ\82 ден пÑ\83Ñ\80еÑ\82 але Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 гÑ\8bн, Ñ\88каланет пашам ышташ йӧнлырак лиеш.",
+ "anoneditwarning": "'''ТӱÑ\82кӧ лий:''': ТÑ\8bй авÑ\82оÑ\80изаÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82ен оÑ\82Ñ\8bл. ТÑ\8bйÑ\8bн IP-адÑ\80еÑ\81еÑ\82 лаÑ\88Ñ\82Ñ\8bкÑ\8bн ваÑ\88Ñ\82алÑ\82Ñ\8bмаÑ\88 иÑ\81Ñ\82оÑ\80ийÑ\8bÑ\88Ñ\82Ñ\8bже возалÑ\82 кодеÑ\88. Шке лӱмеÑ\82 ден пÑ\83Ñ\80еÑ\82 але Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86ийÑ\8bм Ñ\8dÑ\80Ñ\82еÑ\82 гÑ\8bн, Ñ\82Ñ\8bлат пашам ышташ йӧнлырак лиеш.",
"summary-preview": "Тӧрлатымаш нерген ончылгоч ончымаш:",
"accmailtitle": "Шолыпмут колтымо.",
"newarticle": "(У)",
"group-bot-member": "бот",
"grouppage-bot": "{{ns:project}}:Бот-влак",
"grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
+ "right-writeapi": "Возымашлан API-ым кучылтмаш",
"newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
"rightslog": "Участникын праваже-влакым ончыктышо журнал",
"action-edit": "тиде лаштыкым тӧрлаташ",
"minoreditletter": "и",
"newpageletter": "У",
"boteditletter": "б",
+ "rc-change-size-new": "Вашталтымаш деч вара $1 {{PLURAL:$1|байт}} лийын",
"rc-enhanced-expand": "Тичмашын ончыкташ",
"rc-enhanced-hide": "Рашлык-влакым шылташ",
"recentchangeslinked": "Ваш кылдалтше тӧрлатымаш-влак",
"protectexpiry": "Мучашлалтеш:",
"protect_expiry_invalid": "Йоҥылыш мучашлалтше жап.",
"protect_expiry_old": "Мучашлалтше жап эртен.",
- "protect-text": "Тыште тый '''$1''' лаштыкын шыгыремдымашыжым ончалаш да тӧрлаташ кертат.",
+ "protect-text": "Тыште тый '''$1''' лаштыкын аралымаш уровеньжым ончалын але вашталтен кертат.",
"protect-locked-access": "Тыйын лаштыкын шыгыремдымашыжым тӧрлаш кертмешет шагал.\nӰлнӧ '''$1''' лаштыкын кызытсе келыштарымаш.",
"protect-cascadeon": "Тиде лаштыкым тӧрлатымаш деч аралыме. \nКаскадный аралымашан {{PLURAL:$1|лаштык-влак}} тудо пура.",
"protect-default": "Чыла пайдаланыше-влаклан йӧным пуаш",
"file-nohires": "Кугурак чаплык уке.",
"svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
"show-big-image": "Тӱҥалтыш файл",
+ "show-big-image-preview": "Ончылгоч ончымо годым кугыт: $1",
"show-big-image-size": "$1 × $2 пиксел",
"newimages-legend": "Фильтр",
"ilsubmit": "Кычал",
"specialpages-group-pagetools": "Лаштык ӱзгар-влак",
"specialpages-group-redirects": "Вес вере колтышо спецлаштык-влак",
"external_image_whitelist": " #Оставьте эту строчку такой, как она есть<pre>\n#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)\n#они будут соотнесены с URL внешних изображений.\n#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.\n#Строки, начинающиеся с # считаются комментариями.\n#Строки не чувствительны к регистру\n\n#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>",
- "logentry-delete-delete": "$1 {{GENDER:$2|лыктын|лыктын}} странице $3",
+ "tag-filter": "[[Special:Tags|Метке]] фильтр:",
+ "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
+ "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
"revdelete-summary": "тӧрлатымаш-влакым возен ончыктымаш",
- "searchsuggest-search": "Кычалаш",
+ "searchsuggest-search": "{{SITENAME}} сайтым кычалаш",
"expand_templates_ok": "Йӧра",
"expand_templates_preview": "Ончылгоч ончымаш"
}
"eauthentsent": "На назначената адреса е испратена потврдна порака.\nПред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.",
"throttled-mailpassword": "Веќе е испратена порака за измена на лозинката во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.\nЗа да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.",
"mailerror": "Грешка при испраќање на е-поштата: $1",
- "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако резултат на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
+ "acct_creation_throttle_hit": "Посетители на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 сметка|$1 сметки}} во последниве $2, при што е достигнат најголемиот допуштен број на кориснички сметки предвиден и овозможен за овој период.\nКако последица на ова, посетителите кои ја користат оваа IP-адреса во моментов нема да можат да создаваат нови сметки.",
"emailauthenticated": "Вашата е-пошта адреса е потврдена на $2 во $3 ч.",
"emailnotauthenticated": "Вашата е-поштенска адреса сè уште не е потврдена.\nНема да биде испратена е-пошта во ниту еден од следниве случаи.",
"noemailprefs": "Наведете е-поштенска адреса за да функционираат следниве својства.",
"selfredirect": "<strong>Предупредување:</strong> Создавате пренасочување кон истата статија.\nМоже да сте укажале грешна целна страница, или пак уредувате погрешна страница.\nАко стиснете на „{{int:savearticle}}“ повторно, тогаш пренасочувањето бездруго ќе се создаде.",
"missingcommenttext": "Ве молиме внесете коментар подолу.",
"missingcommentheader": "<strong>Потсетување:</strong> Не внесовте наслов за овој коментар.\nАко повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
- "summary-preview": "Ð\98зглед на описот:",
+ "summary-preview": "Ð\9fÑ\80еглед на описот:",
"subject-preview": "Преглед на насловот:",
"previewerrortext": "Се појави грешка при обидот да се прегледаат промените.",
"blockedtitle": "Корисникот е блокиран",
"nextn": "{{PLURAL:следна $1|следни $1}}",
"prev-page": "претходна страница",
"next-page": "следна страница",
- "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85оден|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82|Ñ\80езÑ\83лÑ\82аÑ\82и}}",
- "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82|Ñ\80езÑ\83лÑ\82аÑ\82и}}",
- "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\80езÑ\83лÑ\82аÑ\82|Ñ\80езÑ\83лÑ\82аÑ\82и}} на страница",
+ "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80еÑ\82Ñ\85одна|Ð\9fÑ\80еÑ\82Ñ\85одни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+ "nextn-title": "{{PLURAL:$1|Следна|Следни}} $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}}",
+ "shown-title": "Ð\9fÑ\80икажи $1 {{PLURAL:$1|Ñ\81Ñ\82авка|Ñ\81Ñ\82авки}} по страница",
"viewprevnext": "Погледајте ($1 {{int:pipe-separator}} $2) ($3).",
"searchmenu-exists": "'''На ова вики има страница со наслов „[[:$1]]“'''",
"searchmenu-new": "<strong>Создајте ја страницата „[[:$1]]“ на ова вики!</strong> {{PLURAL:$2|0=|Погледајте ја и страницата најдена со пребарувањето.|Погледајте го и најденото од пребарувањето.}}",
"search-relatedarticle": "Поврзано",
"searchrelated": "поврзано",
"searchall": "сè",
- "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
- "showingresultsinrange": "Ð\94олÑ\83 {{PLURAL:$1|е пÑ\80икажан до <strong>еден</strong> Ñ\80езÑ\83лÑ\82аÑ\82|Ñ\81е пÑ\80икажани до <strong>$1</strong> Ñ\80езÑ\83лÑ\82аÑ\82и}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
- "search-showingresults": "{{PLURAL:$4|РезÑ\83лÑ\82аÑ\82 <strong>$1</strong> од <strong>$3</strong>|РезÑ\83лÑ\82аÑ\82и <strong>$1 - $2</strong> од <strong>$3</strong>}}",
- "search-nonefound": "Нема резултати што одговараат на бараното.",
- "search-nonefound-thiswiki": "Ð\9dема Ñ\80езÑ\83лÑ\82аÑ\82и што одговараат на бараното на ова мрежно место.",
+ "showingresults": "Подолу {{PLURAL:$1|е прикажана <strong>1</strong> ставка|се прикажани <strong>$1</strong> ставки}} почнувајќи од бр. <strong>$2</strong>.",
+ "showingresultsinrange": "Ð\9fодолÑ\83 {{PLURAL:$1|е пÑ\80икажана до <strong>една</strong> Ñ\81Ñ\82авка|Ñ\81е пÑ\80икажани до <strong>$1</strong> Ñ\81Ñ\82авки}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
+ "search-showingresults": "{{PLURAL:$4|СÑ\82авка <strong>$1</strong> од <strong>$3</strong>|СÑ\82авки <strong>$1 - $2</strong> од <strong>$3</strong>}}",
+ "search-nonefound": "Нема исходни ставки што одговараат на бараното.",
+ "search-nonefound-thiswiki": "Ð\9dема Ñ\81Ñ\82авки што одговараат на бараното на ова мрежно место.",
"powersearch-legend": "Напредно пребарување",
"powersearch-ns": "Пребарај во следниве именски простори:",
"powersearch-togglelabel": "Избор:",
"rcfilters-invalid-filter": "Неважечки филтер",
"rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
"rcfilters-filterlist-title": "Филтри",
+ "rcfilters-filterlist-feedbacklink": "Дајте мислење за новите (бета) филтри",
+ "rcfilters-highlightbutton-title": "Истакнување на исход",
+ "rcfilters-highlightmenu-title": "Изберете боја",
"rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
"rcfilters-filtergroup-registration": "Регистрација на корисници",
"rcfilters-filter-registered-label": "Регистрирани",
"wantedcategories": "Потребни категории",
"wantedpages": "Потребни страници",
"wantedpages-summary": "Список на непостоечки страници со највеќе врски што водат до нив, исклучувајќи страниците до кои водат само пренасочувања. Список на непостоечки страници до кои водат пренасочувања ќе најдете на [[{{#special:BrokenRedirects}}|списокот на прекинати пренасочувања]].",
- "wantedpages-badtitle": "Ð\9dевалиден наÑ\81лов во Ñ\80езÑ\83лÑ\82аÑ\82ите: $1",
+ "wantedpages-badtitle": "Ð\9dеважеÑ\87ки наÑ\81лов во Ñ\81Ñ\82авките: $1",
"wantedfiles": "Потребни податотеки",
"wantedfiletext-cat": "Следниве податотеки се користат, но не постојат. Податотеките од други складишта може да се наведени дури и ако постојат. Таквите ќе бидат <del>поништени</del> од списокот. Покрај ова, страниците што содржат податотеки кои не постојат се наведени на [[:$1]].",
"wantedfiletext-cat-noforeign": "Следниве податотеки се користат, но не постојат. Покрај ова, страниците што ги содржат непостоечките податотеки се наведени во [[:$1]].",
"editcomment": "Коментарот на уредувањето беше: <em>$1</em>.",
"revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
"revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
+ "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};; вратено на последната верзија на {{GENDER:$4|$2}}.",
"rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
"sessionfailure-title": "Седницата не успеа",
"sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
"feedback-external-bug-report-button": "Поднеси техничка задача",
"feedback-dialog-title": "Поднеси мислење",
"feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
- "feedback-error1": "Грешка: Непрепознаен резултат од извршникот",
+ "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
"feedback-error2": "Грешка: Уредувањето не успеа",
"feedback-error3": "Грешка: Извршникот не одговара",
"feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
"expand_templates_html_output": "Сиров HTML-извод",
"expand_templates_ok": "ОК",
"expand_templates_remove_comments": "Отстрани коментари",
- "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во резултатот",
+ "expand_templates_remove_nowiki": "Притаи <nowiki> ознаки во исходот",
"expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
"expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
"expand_templates_preview": "Преглед",
"Hex",
"Xxmarijnw",
"Mainframe98",
- "QZanden"
+ "QZanden",
+ "Huhbakker"
]
},
"tog-underline": "Verwijzingen onderstrepen:",
"passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
"passwordreset-nocaller": "Een aanroeper moet worden opgegeven",
"passwordreset-nosuchcaller": "Aanroeper bestaat niet: $1",
- "passwordreset-ignored": "Opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
+ "passwordreset-ignored": "Het opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
"passwordreset-invalidemail": "Ongeldig e-mailadres",
"passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
"changeemail": "E-mailadres wijzigen of verwijderen",
"rcfilters-invalid-filter": "Ongeldig filter",
"rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergeven.",
"rcfilters-filterlist-title": "Filters",
+ "rcfilters-filterlist-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
+ "rcfilters-highlightbutton-title": "Resultaten markeren",
+ "rcfilters-highlightmenu-title": "Kies een kleur",
"rcfilters-filterlist-noresults": "Geen filters gevonden",
"rcfilters-filtergroup-registration": "Gebruikers-registratie",
"rcfilters-filter-registered-label": "Geregistreerd",
"rcfilters-filter-registered-description": "Ingelogde gebruikers.",
"rcfilters-filter-unregistered-label": "Niet-geregistreerd",
"rcfilters-filter-unregistered-description": "Gebruikers die niet zijn ingelogd.",
+ "rcfilters-filtergroup-authorship": "Bewerken auteurschap",
"rcfilters-filter-editsbyself-label": "Uw eigen bewerkingen",
"rcfilters-filter-editsbyself-description": "Bewerkingen door u.",
"rcfilters-filter-editsbyother-label": "Bewerkingen door anderen",
"editcomment": "De bewerkingssamenvatting was: <em>$1</em>.",
"revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]",
"revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "De wijzigingen door $1 zijn teruggedraaid.\nDe laatste versie van $2 is hersteld.",
+ "rollback-success": "De wijzigingen door {{GENDER:$3|$1}} zijn teruggedraaid.\nDe laatste versie van {{GENDER:$4|$2}} is hersteld.",
"rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]",
"sessionfailure-title": "Sessiefout",
"sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
"log-action-filter-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
"log-action-filter-upload-upload": "Nieuwe upload",
"log-action-filter-upload-overwrite": "Herupload",
+ "authmanager-authn-not-in-progress": "Verificatie is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+ "authmanager-authn-no-primary": "De meegeleverde inloggegevens kunnen niet worden geverifieerd.",
+ "authmanager-authn-no-local-user": "De ingevoerde inloggegevens zijn niet geassocieerd met een gebruiker op deze wiki.",
+ "authmanager-authn-no-local-user-link": "De meegeleverde inloggegevens zijn geldig, maar zijn niet gekoppeld aan enige gebruiker op deze wiki. Log in op een andere manier, of creëer een nieuwe gebruiker, en u heeft een optie om uw eerdere inloggegevens van te koppelen.",
"authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
+ "authmanager-change-not-supported": "De meegeleverde inloggegevens kunnen niet worden gewijzigd, omdat niets deze zou gebruiken.",
"authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
"authmanager-create-from-login": "Om een account aan te maken, gelieve de velden in te vullen.",
+ "authmanager-create-not-in-progress": "Het maken van een account is niet in uitvoering of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
+ "authmanager-create-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt voor het aanmaken van uw account.",
+ "authmanager-link-no-primary": "De meegeleverde inloggegevens kunnen niet worden gebruikt om een account te koppelen.",
+ "authmanager-link-not-in-progress": "Account koppelen is niet gestart of de sessiegegevens zijn verloren gegaan. Gelieve opnieuw starten vanaf het begin.",
"authmanager-authplugin-setpass-failed-title": "Wachtwoord wijzigen is mislukt",
+ "authmanager-authplugin-setpass-failed-message": "De verificatie-invoegtoepassing heeft het wijzigen van het wachtwoord geweigerd.",
+ "authmanager-authplugin-create-fail": "De verificatie-invoegtoepassing heeft geweigerd uw account aan te maken.",
"authmanager-authplugin-setpass-denied": "De verificatie-invoegtoepassing staat het wijzigen van wachtwoorden niet toe.",
"authmanager-authplugin-setpass-bad-domain": "Ongeldig domein.",
"authmanager-autocreate-noperm": "Het automatisch aanmaken van accounts is niet toegestaan.",
"authmanager-provider-password": "Op wachtwoord gebaseerde authenticatie",
"authmanager-provider-password-domain": "Wachtwoord- en domeingebaseerde authentificatie",
"authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
+ "authprovider-confirmlink-message": "Op basis van uw recente login pogingen, kan het volgende account worden gekoppeld aan uw wiki account. Het koppelen van stelt U in staat in te loggen via deze accounts. Gelieve te selecteren welk account moet worden gekoppeld.",
"authprovider-confirmlink-request-label": "Accounts die aan elkaar moeten worden gekoppeld.",
"authprovider-confirmlink-success-line": "$1: Succesvol gekoppeld.",
"authprovider-confirmlink-failed": "Account koppelen is niet volledig gelukt: $1",
+ "authprovider-confirmlink-ok-help": "Doorgaan na het weergeven van de storingsmeldingen over het koppelen.",
"authprovider-resetpass-skip-label": "Overslaan",
"authprovider-resetpass-skip-help": "Sla het resetten van het wachtwoord over.",
+ "authform-nosession-login": "De verificatie is geslaagd, maar uw browser heeft niet \"onthouden\" ingelogd te zijn.\n!\n$1",
+ "authform-nosession-signup": "Het account is aangemaakt, maar uw browser heeft niet \"onthouden\" om ingelogd te zijn.\n!\n$1",
"authform-newtoken": "Ontbrekend token. $1",
"authform-notoken": "Ontbrekend token",
"authform-wrongtoken": "Verkeerd token",
"specialpage-securitylevel-not-allowed-title": "Niet toegestaan",
+ "specialpage-securitylevel-not-allowed": "Sorry, het is u niet toegestaan gebruik te maken van deze pagina omdat uw identiteit niet kon worden geverifieerd.",
+ "authpage-cannot-login": "Niet in staat om te beginnen met aanmelden.",
+ "authpage-cannot-login-continue": "Niet mogelijk om in te loggen. Uw sessie is waarschijnlijk verlopen.",
"authpage-cannot-create": "Kon het account aanmaken niet starten.",
+ "authpage-cannot-create-continue": "Kan niet doorgaan met het aanmaken van een account. Uw sessie is waarschijnlijk verlopen.",
+ "authpage-cannot-link": "Niet in staat om het account te kunnen koppelen.",
+ "authpage-cannot-link-continue": "Niet mogelijk het account te koppelen. Uw sessie is waarschijnlijk verlopen.",
"cannotauth-not-allowed-title": "Geen toegang",
"cannotauth-not-allowed": "U hebt geen toestemming om deze pagina te gebruiken",
"changecredentials": "Authenticatiegegevens wijzigen",
"linkaccounts-submit": "Accounts koppelen",
"unlinkaccounts": "Accounts ontkoppelen",
"unlinkaccounts-success": "Het account is ontkoppeld.",
+ "authenticationdatachange-ignored": "De wijziging van de authenticatie gegevens zijn niet afgehandeld. Misschien is er geen provider is geconfigureerd?",
"userjsispublic": "Let op: JavaScript 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",
"undo-failure": "Aquesta modificacion a pas pogut èsser desfaita a causa de conflictes amb de modificacions intermediàrias.",
"undo-norev": "La modificacion a pas pogut èsser desfaita perque siá es inexistenta siá es estada suprimida.",
"undo-nochange": "Sembla que la modificacion es ja estada anullada.",
- "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
+ "undo-summary": "Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
"undo-summary-username-hidden": "Anullar la revision $1 per un utilizaire amagat",
"cantcreateaccount-text": "La creacion de compte dempuèi aquesta adreça IP ('''$1''') es estada blocada per [[User:$3|$3]].\n\nLa rason balhada per $3 èra ''$2''.",
"cantcreateaccount-range-text": "La creacion de compte dempuèi las adreças IP dins la plaja <strong>$1</strong>, que compren vòstra agreça IP (<strong>$4</strong>) son estadas blocadas per [[User:$3|$3]].\n\nLo motiu provesit per $3 es <em>$2</em>",
"selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
"missingcommenttext": "Wprowadź komentarz poniżej.",
"missingcommentheader": "<strong>Uwaga:</strong> treść tytułu komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}”, zmiany zostaną zapisane bez niego.",
- "summary-preview": "Podgląd opisu:",
+ "summary-preview": "Podgląd opisu zmian:",
"subject-preview": "Podgląd tematu:",
"previewerrortext": "Wystąpił błąd podczas próby podglądu Twoich zmian.",
"blockedtitle": "Użytkownik jest zablokowany",
"rcfilters-invalid-filter": "Nieprawidłowy filtr",
"rcfilters-empty-filter": "Brak aktywnych filtrów. Wyświetlane są wszystkie zmiany.",
"rcfilters-filterlist-title": "Filtry",
+ "rcfilters-highlightmenu-title": "Wybierz kolor",
"rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
"rcfilters-filtergroup-registration": "Rejestracja użytkownika",
"rcfilters-filter-registered-label": "Zarejestrowany",
"editcomment": "Edycję opisał: <em>$1</em>.",
"revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
"revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
- "rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
+ "rollback-success": "Wycofano edycje {{GENDER:$3|użytkownika|użytkowniczki}} $1;\nprzywrócono ostatnią wersję autorstwa {{GENDER:$4|$2}}.",
"rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
"sessionfailure-title": "Błąd sesji",
"sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
"invalidateemail": "Anulowanie potwierdzenia adresu e‐mail",
"notificationemail_subject_changed": "Został zmieniony zarejestrowany adres e-mail na {{SITENAME}}",
"notificationemail_subject_removed": "Zarejestrowany adres e-mail w {{GRAMMAR:MS.lp|SITENAME}} został usunięty",
+ "notificationemail_body_changed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nzmienił adres e-mail przypisany do konta „$2” na „$3” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
+ "notificationemail_body_removed": "Ktoś, najprawdopodobniej Ty, z adresu IP $1,\nusunął adres e-mail przypisany do konta „$2” w {{GRAMMAR:MS.lp|{{SITENAME}}}}.\n\nJeżeli nie zostało to zrobione przez Ciebie, skontaktuj się niezwłocznie z administratorem.",
"scarytranscludedisabled": "[Transkluzja przez interwiki jest wyłączona]",
"scarytranscludefailed": "[Pobranie szablonu dla $1 nie powiodło się]",
"scarytranscludefailed-httpstatus": "[Pobranie szablonu dla $1 nie powiodło się: HTTP $2]",
"watchlisttools-view": "ملدیاں ہوئیاں تبدیلیاں ویکھو",
"watchlisttools-edit": "اکھ تھلے رکھے ہوۓ صفحیاں نوں ویکھو تے تبدیل کرو",
"watchlisttools-raw": "کچی اکھ تھلے رکھی ہوئی نو تبدیل کرو",
+ "hijri-calendar-m1": "محرم",
+ "hijri-calendar-m2": "صفر",
+ "hijri-calendar-m3": "ربیع الاول",
+ "hijri-calendar-m4": "ربیع الثانی",
+ "hijri-calendar-m5": "جمادی الاول",
+ "hijri-calendar-m6": "جمادی الثانی",
+ "hijri-calendar-m7": "رجب",
+ "hijri-calendar-m8": "شعبان",
+ "hijri-calendar-m9": "رمضان",
+ "hijri-calendar-m10": "شوال",
+ "hijri-calendar-m11": "ذوالقعدہ",
+ "hijri-calendar-m12": "ذوالحجہ",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
"duplicate-defaultsort": "'''خبردار:''' ڈیفالٹ چابی \"$2\" پہلی ڈیفالٹ چابی \"$1\" دے اتے لگ گئی اے۔",
"version": "ورژن",
"selfredirect": "<strong>Aviso:</strong> Você esta redirecionando esta pagina para ela mesmo. Você pode ter especificado o caminho errado para redirecionar, ou você pode estar editando a pagina errada. Se você clicar \"{{int:savearticle}}\" novamente, o redirecionamento será criado de qualquer modo.",
"missingcommenttext": "Por favor, introduzida um comentário abaixo.",
"missingcommentheader": "'''Lembrete:''' Você não introduziu um assunto/título para este comentário.\nSe você clicar novamente \"{{int:savearticle}}\", a sua edição será salva sem um assunto/título.",
- "summary-preview": "Previsão do resumo:",
+ "summary-preview": "Previsão do resumo de edição:",
"subject-preview": "Previsão do assunto/título:",
"previewerrortext": "Ocorreu um erro ao tentar pré-visualizar suas alterações.",
"blockedtitle": "O usuário está bloqueado",
"rcfilters-invalid-filter": "Filtro inválido",
"rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
"rcfilters-filterlist-title": "Filtros",
+ "rcfilters-filterlist-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
+ "rcfilters-highlightbutton-title": "Realçar os resultados",
+ "rcfilters-highlightmenu-title": "Selecione uma cor",
"rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
"rcfilters-filtergroup-registration": "Registro de usuário",
"rcfilters-filter-registered-label": "Registrado",
"rcfilters-invalid-filter": "A label for an invalid filter.",
"rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
"rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+ "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
"rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
"rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
"rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
"Mailman",
"Аль-Гимравий",
"Gamliel Fishkin",
- "Ping08"
+ "Ping08",
+ "Yuryleb",
+ "Redredsonia"
]
},
"tog-underline": "Подчёркивание ссылок:",
- "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c малÑ\8bе пÑ\80авки из списка свежих правок",
+ "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c малÑ\8bе изменениÑ\8f из списка свежих правок",
"tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
"tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
"tog-hidecategorization": "Скрывать категоризацию страниц",
"broken-file-category": "Страницы с неработающими файловыми ссылками",
"about": "Описание",
"article": "Статья",
- "newwindow": " (в новом окне)",
+ "newwindow": "(в новом окне)",
"cancel": "Отменить",
"moredotdotdot": "Далее…",
"morenotlisted": "Этот список может быть неполным.",
"rcfilters-invalid-filter": "Недопустимый фильтр",
"rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
"rcfilters-filterlist-title": "Фильтры",
+ "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
+ "rcfilters-highlightbutton-title": "Выделить результаты",
+ "rcfilters-highlightmenu-title": "Выберите цвет",
"rcfilters-filterlist-noresults": "Фильтры не найдены",
"rcfilters-filtergroup-registration": "Регистрация участников",
"rcfilters-filter-registered-label": "Зарегистрированные",
"editcomment": "Было дано описание изменения: <em>$1</em>.",
"revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
"revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Откачены правки $1; возврат к версии $2.",
+ "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возврат к версии {{GENDER:$4|$2}}.",
"rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
"sessionfailure-title": "Ошибка сеанса",
"sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, нажмите кнопку «Назад» и перезагрузите страницу, с которой вы пришли.",
"spam_blanking": "Все версии содержат ссылки на $1, очистка",
"spam_deleting": "Все версии содержали ссылки на $1, производится удаление",
"simpleantispam-label": "Анти-спам проверка.\n<strong>Не</strong> заполняйте это!",
- "pageinfo-title": "СведениÑ\8f по «$1»",
+ "pageinfo-title": "СведениÑ\8f о Ñ\81Ñ\82Ñ\80аниÑ\86е «$1»",
"pageinfo-not-current": "К сожалению, невозможно предоставить эту информацию для старых версий.",
"pageinfo-header-basic": "Основные сведения",
"pageinfo-header-edits": "История изменений",
"아라",
"Dicto23456",
"Macofe",
- "Matma Rex"
+ "Matma Rex",
+ "KHMELNYTSKYIA"
]
},
"tog-underline": "Підкреслёвати одказы:",
"currentevents": "Актуалны подїї",
"currentevents-url": "Project:Актуалны подїї",
"disclaimers": "Вылучіня одповідности",
- "disclaimerpage": "Project:Ð\92Ñ\8bлÑ\83Ñ\87Ñ\96нÑ\8f одповÑ\96дноÑ\81Ñ\82и",
+ "disclaimerpage": "Project:Ð\92Ñ\96дмова вÑ\96д вÑ\96дповÑ\96далÑ\8cноÑ\81Ñ\82Ñ\96",
"edithelp": "Поміч едітованя",
"mainpage": "Головна сторінка",
"mainpage-description": "Головна сторінка",
"passwordreset-emaildisabled": "Функції електронічной пошты были выпнуы на тій вікі.",
"passwordreset-username": "Мено хоснователя:",
"passwordreset-domain": "Домена:",
- "passwordreset-capture": "Посмотрити выслїдный імейл?",
- "passwordreset-capture-help": "Кідь означіте тото поличко, буде імейл (з дочасным геслом) оркем посланя хоснователёви указаный і вам.",
"passwordreset-email": "Адреса електронічной пошты:",
"passwordreset-emailtitle": "Детайлы конта на {{SITENAME}}",
"passwordreset-emailtext-ip": "Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане слїдуюче конто|суть повязаны слїдуючі конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло стане неплатным|Тоты дочасны гесла стануть неплатныма}} {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту просьбу послав хтось другый або сьте собі на своє старе гесло спомянули і не хочете го змінити, можете тото повідомлїня іґноровати і дале хосновати старе гесло.",
"saveprefs": "Уложыти",
"restoreprefs": "Обновити вшыткы штандартны наставлїня (у вшыткых секціях)",
"prefs-editing": "Едітованя",
- "rows": "Рядкы:",
- "columns": "Колонкы:",
"searchresultshead": "Гляданя",
"stub-threshold": "Поріг про форматованя одказу як <a href=\"#\" class=\"stub\">одказів на \"stub\"</a> (v bajtech):",
"stub-threshold-disabled": "Выпнуте",
"userrights-reason": "Причіна:",
"userrights-no-interwiki": "Не маєте поволїня мінити права хоснователїв на іншых вікі.",
"userrights-nodatabase": "Датабаза $1 не екзістує або не є місцёва.",
- "userrights-nologin": "Мусите ся [[Special:UserLogin|приголосити]] на конто адміністратора, жебы сьте могли мінити права хоснователїв.",
- "userrights-notallowed": "Вы не мате права придати або одстранити хосновательскы права.",
"userrights-changeable-col": "Ґрупы, котры можете змінити",
"userrights-unchangeable-col": "Ґрупы, котры не можете змінити",
"userrights-conflict": "Конфлікт змін прав хоснователїв! Просиме, перевірьте зміны і потвердьте їх.",
- "userrights-removed-self": "Вы успішно позбавили ся властных прав. Зато уж веце не мате приступ до той сторінкы.",
"group": "Ґрупа:",
"group-user": "Хоснователї",
"group-autoconfirmed": "Автопотверджены хоснователї",
"right-siteadmin": "Замыкана і одомыканя датабазы",
"right-override-export-depth": "Експорт сторінок включаючі звязаны сторінкы з глубков до 5",
"right-sendemail": "Посыланя пошты іншым хоснователям",
- "right-passwordreset": "Перезераня імейлів про зміну гесла",
"newuserlogpage": "Лоґ вытварянь хоснователїв",
"newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
"rightslog": "Лоґ хосновательскых прав",
"blocklink": "заблоковати",
"unblocklink": "одблоковати",
"change-blocklink": "змінити блок",
- "contribslink": "пÑ\80иÑ\81пÑ\96вкÑ\8b",
+ "contribslink": "внеÑ\81ок",
"emaillink": "послати імейл",
"autoblocker": "Сьте были автоматічно блокованы, протоже здїляте IP-адресу з хоснователём „[[User:$1|$1]]“. Причіна блокованя того хоснователя: „$2“",
"blocklogpage": "Запис блоковань",
"version-license": "Ліценція",
"version-ext-license": "Ліценція",
"version-ext-colheader-name": "Росшырїня",
- "version-ext-colheader-version": "Верзія",
+ "version-ext-colheader-version": "Версія",
"version-ext-colheader-license": "Ліценція",
"version-ext-colheader-description": "Попис",
"version-ext-colheader-credits": "Авторы",
"feedback-thanks": "Дякуєме! Ваш коментарь быв приданый на сторінку „[$2 $1]“.",
"searchsuggest-search": "Глядати",
"searchsuggest-containing": "обсягуючій...",
- "api-error-badaccess-groups": "Не мате дозволено наладововати файлы на тоту вікі.",
"api-error-badtoken": "Внутрїшня хыба: планый знак.",
- "api-error-copyuploaddisabled": "Наладовованя з URL є на тім сервері заказане.",
- "api-error-duplicate": "На тій вікі уж {{PLURAL:$1|екзістує другый файл|екзістують іншы файлы}} з такым самым обсягом.",
- "api-error-duplicate-archive": "{{PLURAL:$1|быв другый файл|были даякы другы файлы}} з такым самым обсягом уж гев оперед {{PLURAL:$1|быв|были}}, але {{PLURAL:$1|быв змазаный|были змазаны}}.",
- "api-error-empty-file": "Наладованый файл є порожнїй.",
"api-error-emptypage": "Створїня новых, порожнїх сторінк неслободно.",
- "api-error-fetchfileerror": "Внутрїшня хыба: трафила ся хыба під час обтриманя файлу.",
- "api-error-fileexists-forbidden": "Файл з назвов „$1“ уж екзістує тай не годен го переписати.",
- "api-error-fileexists-shared-forbidden": "файл з назвов „$1“ уж екзістує в сполочнім усховищу тай не годен го переписати.",
- "api-error-file-too-large": "Наладованый файл є барз великый.",
- "api-error-filename-tooshort": "Назва файлу є барз курта.",
- "api-error-filetype-banned": "Тот тіп файлу є заказаный.",
- "api-error-filetype-banned-type": "$1 {{PLURAL:$4|є недозволеный формат файлів|суть недозволены форматы файлів}}. {{PLURAL:$3|Дозволеный формат фалів є|Дозволены форматы файлів суть}} $2.",
- "api-error-filetype-missing": "Тот файл не мать росшырїня.",
- "api-error-hookaborted": "Пожадована вами зміна была одмітнута дакотрым росшырінём.",
- "api-error-http": "Внутрїшня хыба: не вдало ся припоїти к серверу.",
- "api-error-illegal-filename": "Тота назва файлу не є дозволена.",
- "api-error-internal-error": "Внутрїшня хыба: притрафила ся хыба під час спрацованя вашого наладованого файлу.",
- "api-error-invalid-file-key": "Внутрїшня хыба: файл ся не нашов в дочаснім усховіщі.",
- "api-error-missingparam": "Внутрїшня хыба: хыбують параметры пожадавкы.",
- "api-error-missingresult": "Внутрїшня хыба: не годен становити, ці копірованя было успішне.",
- "api-error-mustbeloggedin": "Жебы наладовати файлы, мусите быти приголошеный.",
- "api-error-mustbeposted": "Внутрїшня хыба: пожадавка мусить быти через HTTP POST.",
- "api-error-noimageinfo": "Наладованя было успішне, але сервер не додав о файлї ниякы інформації.",
- "api-error-nomodule": "Внутрїшня хыба: не є наставленый модул наладовованя.",
- "api-error-ok-but-empty": "Внутрїшня хыба: сервер не одповідать.",
- "api-error-overwrite": "Не є дозволене переписати екзістуючій файл.",
- "api-error-stashfailed": "Внутрїшня хыба: серверу ся не вдало уложыти дочасный файл.",
"api-error-publishfailed": "Внутрїшня хыба: серверови ся не вдало опубліковати дочасный файл.",
- "api-error-timeout": "Сервер не одповідав в очекаванім часї.",
- "api-error-unclassified": "Трафила ся незнама хыба.",
- "api-error-unknown-code": "Незнама хыба: „$1“",
- "api-error-unknown-error": "Внутрїшня хыба: трафила ся хыба при спробі о наладованя файлу.",
+ "api-error-stashfailed": "Внутрїшня хыба: серверу ся не вдало уложыти дочасный файл.",
"api-error-unknown-warning": "Незнаме варованя: $1",
"api-error-unknownerror": "Незнама хыба: „$1“",
- "api-error-uploaddisabled": "Начітаваня файлів є на тій вікі выпнуте.",
- "api-error-verification-error": "Файл є може пошкодженый, або мать плане росшырїня.",
"duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
"duration-minutes": "$1 {{PLURAL:$1|минуту|минуты|минут}}",
"duration-hours": "$1 {{PLURAL:$1|година|годины|годин}}",
"rcfilters-invalid-filter": "Neveljaven filter",
"rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
"rcfilters-filterlist-title": "Filtri",
+ "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
+ "rcfilters-highlightbutton-title": "Označi rezultate",
+ "rcfilters-highlightmenu-title": "Izberite barvo",
"rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
"rcfilters-filtergroup-registration": "Registracija uporabnika",
"rcfilters-filter-registered-label": "Registriran",
"editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
"revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
"revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
+ "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
"rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
"sessionfailure-title": "Neuspeh seje",
"sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
"searcharticle": "Shko",
"history": "Historiku i faqes",
"history_short": "Historiku",
+ "history_small": "historiku",
"updatedmarker": "përditësuar që nga vizita ime e fundit",
"printableversion": "Versioni i printueshëm",
"permalink": "Lidhje e përhershme",
"nocookieslogin": "{{SITENAME}} shfrytëzon \"cookies\" për identifikimin e përdoruesve.\nYou nuk lejoni shfrytëzimin e \"cookies\".\nJu lutemi, lejoni shfrytëzimin e \"cookies\" dhe provojeni përsëri.",
"nocookiesfornew": "Llogaria e përdoruesit nuk u krijua, pasi ne nuk mund të konfirmojmë burimin e tij.\nSigurohuni që ju lejoni shfrytëzimin e \"cookies\", rifreskoni këtë faqe dhe provojen përsëri.",
"noname": "Nuk keni dhënë një emër përdoruesi të pranueshëm.",
- "loginsuccesstitle": "Identifikim i suksesshëm",
+ "loginsuccesstitle": "I/e identifikuar",
"loginsuccess": "'''Ju tani jeni identifikuar tek {{SITENAME}} si \"$1\".'''",
"nosuchuser": "Nuk ka ndonjë përdorues me emrin \"$1\".\nKontrolloni shkrimin ose [[Special:CreateAccount|hapni një llogari të re]].",
"nosuchusershort": "Nuk ka asnjë përdorues me emrin \"$1\".",
"saveprefs": "Ruaj parapëlqimet",
"restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
"prefs-editing": "Redaktimi",
- "rows": "Rreshta:",
- "columns": "Kollona:",
"searchresultshead": "Kërkimi",
"stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
"stub-threshold-sample-link": "shembull",
"feedback-thanks-title": "Ju faleminderit!",
"searchsuggest-search": "Kërko",
"searchsuggest-containing": "përmban ...",
- "api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
"api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
- "api-error-copyuploaddisabled": "Ngarkimi nga URL-ja është çaktivizuar në këtë server.",
- "api-error-duplicate": "{{PLURAL:$1|Ekziston një skedë tjetër|Ekzistojnë disa skeda të tjera}} me të njëjtën përmbajtje.",
- "api-error-duplicate-archive": "{{PLURAL:$1|Ekzistonte një skedë tjetër|Ekzistonin disa skeda të tjera}} me të njëjtën përmbajtje, por {{PLURAL:$1|ajo është|ato janë}} fshirë.",
- "api-error-empty-file": "Skeda që paraqitët ishte bosh.",
"api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
- "api-error-fetchfileerror": "Gabim i brendshëm: Diçka shkoi keq gjatë marrjes së skedës.",
- "api-error-fileexists-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston dhe nuk mund të mbishkruhet.",
- "api-error-fileexists-shared-forbidden": "Një skedar me emrin \"$1\" tashmë ekziston në depon për skedarët e shpërndarë dhe nuk mund të mbishkruhet.",
- "api-error-file-too-large": "Skeda që paraqitët ishte shumë e madhe.",
- "api-error-filename-tooshort": "Emri i skedës është shumë i shkurtër.",
- "api-error-filetype-banned": "Ky lloj i skedës është përjashtuar.",
- "api-error-filetype-banned-type": "$1 {{PLURAL:$4|nuk është një lloj i skedës së lejuar|nuk janë lloje të lejuara të skedave}}. {{PLURAL:$3|Lloji i lejuar i skedës është|Llojet e lejuara të skedave janë}} $2.",
- "api-error-filetype-missing": "Skedës i mungon një shtesë.",
- "api-error-hookaborted": "Modifikimi që provuat të bëni u ndërpre nga një goditje shtese.",
- "api-error-http": "Gabim i brendshëm: Nuk mund të lidhet me serverin.",
- "api-error-illegal-filename": "Emri i skedës nuk lejohet.",
- "api-error-internal-error": "Gabim i brendshëm: Diçka shkoi keq me procesimin e ngarkimit tuaj në wiki.",
- "api-error-invalid-file-key": "Gabim i brendshëm: Skeda nuk u gjet në ruajtjen e përkohshme.",
- "api-error-missingparam": "Gabim i brendshëm: Mungesë e parametrave në kërkesë.",
- "api-error-missingresult": "Gabim i brendshëm: Nuk mund të përcaktohet nëse kopjimi doli me sukses.",
- "api-error-mustbeloggedin": "Ju duhet të identifikoheni për të ngarkuar skeda.",
- "api-error-mustbeposted": "Gabim i brendshëm: Kërkesa kërkon HTTP POST.",
- "api-error-noimageinfo": "Ngarkimi u krye me sukses, por serveri nuk na dha ndonjë informacion për këtë skedë.",
- "api-error-nomodule": "Gabim i brendshëm: Nuk ka modul ngarkimi të vendosur.",
- "api-error-ok-but-empty": "Gabim i brendshëm: Nuk ka përgjigje nga serveri.",
- "api-error-overwrite": "Mbishkrimi i një skede ekzistuese nuk lejohet.",
"api-error-stashfailed": "Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.",
- "api-error-timeout": "Serveri nuk u përgjigj gjatës kohës që pritej.",
- "api-error-unclassified": "Një gabim i panjohur ndodhi.",
- "api-error-unknown-code": "Gabim i panjohur: \"$1\"",
- "api-error-unknown-error": "Gabim i brendshëm: Diçka shkoi gabim kur provuat të ngarkoni skedën tuaj.",
"api-error-unknown-warning": "Paralajmërim i panjohur: $1",
"api-error-unknownerror": "Gabim i papërcaktuar: \"$1\".",
- "api-error-uploaddisabled": "Ngarkimi është i çaktivizuar në këte wiki.",
- "api-error-verification-error": "Skeda mund të jetë e korruptuar ose ka shtesë të gabuar.",
"duration-seconds": "$1 {{PLURAL:$1|sekondë|sekonda}}",
"duration-minutes": "$1 {{PLURAL:$1|minutë|minuta}}",
"duration-hours": "$1 {{PLURAL:$1|orë|orë}}",
"virus-scanfailed": "неуспешно скенирање (код $1)",
"virus-unknownscanner": "непознати антивирус:",
"logouttext": "<strong>Одјављени сте.</strong>\n\nИмајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
+ "cannotlogoutnow-title": "Одјава тренутно није могућа",
+ "cannotlogoutnow-text": "Одјава није могућа током употребе $1.",
"welcomeuser": "Добро дошли, $1!",
"welcomecreation-msg": "Ваш налог је отворен.\nНе заборавите да промените своја [[Special:Preferences|подешавања]].",
"yourname": "Корисничко име:",
"changepassword-success": "Ваша лозинка је успешно промењена!",
"changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
"botpasswords": "Лозинке ботова",
+ "botpasswords-disabled": "Лозинке ботова су онемогућене.",
"botpasswords-label-appid": "Име бота:",
"botpasswords-label-create": "Направи",
"botpasswords-label-update": "Ажурирај",
"hr_tip": "Водоравна линија (користити ретко)",
"summary": "Опис измене:",
"subject": "Тема:",
- "minoredit": "мања измена",
- "watchthis": "надгледај ову страницу",
+ "minoredit": "Ð\9eво Ñ\98е маÑ\9aа измена",
+ "watchthis": "Ð\9dадгледај ову страницу",
"savearticle": "Сачувај страницу",
"savechanges": "Сачувај измене",
"publishpage": "Објави страницу",
"nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
"editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
"yourdiff": "Разлике",
- "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
- "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
+ "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
+ "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n<strong>Не шаљите радове заштићене ауторским правима без дозволе!</strong>",
"editpage-cannot-use-custom-model": "Модел садржаја ове странице се не може променити.",
"longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
"readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
"last": "разл",
"page_first": "прва",
"page_last": "последња",
- "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> – разлика с тренутном изменом,\n<strong>({{int:last}})</strong> – разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> – мала измена",
+ "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> = разлика с тренутном изменом, <strong>({{int:last}})</strong> = разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> = мала измена",
"history-fieldset-title": "Преглед историје",
"history-show-deleted": "Само обрисано",
"histfirst": "најстарије",
"difference-multipage": "(разлике између страница)",
"lineno": "Ред $1:",
"compareselectedversions": "Упореди изабране измене",
- "showhideselectedversions": "Ð\9fÑ\80икажи/Ñ\81акÑ\80иÑ\98 изабÑ\80ане измене",
+ "showhideselectedversions": "Ð\9fÑ\80омени видÑ\99ивоÑ\81Ñ\82 изабÑ\80аниÑ\85 измена",
"editundo": "поништи",
"diff-empty": "(Нема разлике)",
"diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмене истог корисника није приказано|$1 међуизмена истог корисника није приказано}})",
"prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
"prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
"userrights": "Управљање корисничким правима",
- "userrights-lookup-user": "УпÑ\80авÑ\99аÑ\9aе коÑ\80иÑ\81ниÑ\87ким гÑ\80Ñ\83пама",
+ "userrights-lookup-user": "Ð\98забеÑ\80и коÑ\80иÑ\81ника",
"userrights-user-editname": "Корисничко име:",
"editusergroup": "Учитај корисничке групе",
"editinguser": "Мењате корисничка права {{GENDER:$1|корисника|кориснице}} <strong>[[User:$1|$1]]</strong> $2",
"saveusergroups": "Сачувај {{GENDER:$1|корисничке}} групе",
"userrights-groupsmember": "Члан:",
"userrights-groupsmember-auto": "Подразумевано члан и:",
- "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица означава да не можете уклонити групу ако је додате и обратно.",
+ "userrights-groups-help": "Можете променити групе којима овај корисник припада.\n* Означен квадратић означава да се корисник налази у тој групи.\n* Неозначен квадратић означава да се корисник не налази у тој групи.\n* Звездица (*) означава да не можете уклонити групу ако је додате и обратно.\n* Тараба (#) означава да једино можете одложити време истека ове групе; не можете га убрзати.",
"userrights-reason": "Разлог:",
"userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
"userrights-nodatabase": "База података $1 не постоји или није локална.",
"action-writeapi": "писање АПИ-ја",
"action-delete": "брисање ове странице",
"action-deleterevision": "брисање измена",
- "action-deletedhistory": "прегледање обрисане историје ове странице",
+ "action-deletedhistory": "прегледање обрисане историје странице",
"action-browsearchive": "претраживање обрисаних страница",
"action-undelete": "враћање страница",
- "action-suppressrevision": "прегледање и враћање ове сакривене измене",
+ "action-suppressrevision": "прегледање и враћање сакривених измена",
"action-suppressionlog": "прегледање ове приватне историје",
"action-block": "блокирање даљих измена овог корисника",
"action-protect": "мењање степена заштите ове странице",
"recentchangeslinked-page": "Назив странице:",
"recentchangeslinked-to": "Прикажи измене страница које су повезане с датом страницом",
"recentchanges-page-added-to-category": "[[:$1]] је додата у категорију",
- "recentchanges-page-added-to-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су додате у категорију",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] је додана у категорију, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
"recentchanges-page-removed-from-category": "[[:$1]] је уклоњена из категорије",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] и још [[Special:WhatLinksHere/$1|{{PLURAL:$2|једна страница|$2 странице}}]] су уклоњене из категорије",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] је уклоњена из категорије, [[Special:WhatLinksHere/$1|ова страница је повезана са другим страницама]]",
"autochange-username": "Медијавики аутоматска измена",
"upload": "Отпреми датотеку",
"uploadbtn": "Отпреми датотеку",
"booksources-search": "Претражи",
"booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
"booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
+ "magiclink-tracking-isbn": "Странице са ISBN магичним везама",
"specialloguserlabel": "Извршилац:",
"speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
"log": "Дневници",
"emailccsubject": "Копија ваше поруке кориснику $1: $2",
"emailsent": "Имејл је послат",
"emailsenttext": "Ваша имејл порука је послата.",
- "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+ "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}. Ако одговорите на овај имејл, {{GENDER:$2|Ваш}} имејл ће бити непосредно прослеђен ка {{GENDER:$1|првобитном пошиљаоцу}}, чиме ће те {{GENDER:$2|му|јој}} открити {{GENDER:$2|Вашу}} имејл адресу.",
"usermessage-summary": "Слање системске поруке.",
"usermessage-editor": "Уређивач системских порука",
"usermessage-template": "MediaWiki:UserMessage",
"editcomment": "Опис измене: <em>$1</em>.",
"revertpage": "Враћене измене [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену корисника [[User:$1|$1]]",
"revertpage-nouser": "Враћене су измене скривеног корисника на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
- "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} $1\nна последњу измену {{GENDER:$2|корисника|кориснице}} $2.",
+ "rollback-success": "Враћене су измене {{GENDER:$1|корисника|кориснице}} {{GENDER:$3|$1}}\nна последњу измену {{GENDER:$2|корисника|кориснице}} {{GENDER:$4|$2}}.",
"sessionfailure-title": "Сесија је окончана",
"sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nВратите се на претходну страницу, поново је учитајте и покушајте поново.",
"changecontentmodel": "Промени модел садржаја странице",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
"watchlistedit-too-many": "Има превише страница за приказ овде.",
"watchlisttools-clear": "испразни списак надгледања",
- "watchlisttools-view": "прикажи сродне измене",
+ "watchlisttools-view": "Ð\9fрикажи сродне измене",
"watchlisttools-edit": "прикажи и уреди списак надгледања",
"watchlisttools-raw": "измени сиров списак надгледања",
"iranian-calendar-m1": "Фарвардин",
"special-characters-group-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": "проширени арапски",
"tog-watchdefault": "Dodaj stranice i datoteke koje izmenim u spisak nadgledanja",
"tog-watchmoves": "Dodaj stranice i datoteke koje premestim u spisak nadgledanja",
"tog-watchdeletion": "Dodaj stranice i datoteke koje obrišem u spisak nadgledanja",
+ "tog-watchuploads": "Dodaj datoteke koje otpremim u spisak nadgledanja",
"tog-watchrollback": "Dodaj stranice na kojima sam vratio izmene u spisak nadgledanja",
"tog-minordefault": "Označavaj sve izmene kao manje",
"tog-previewontop": "Prikaži pregled pre okvira za uređivanje",
"tog-shownumberswatching": "Prikaži broj korisnika koji nadgledaju",
"tog-oldsig": "Tekući potpis:",
"tog-fancysig": "Smatraj potpis kao vikitekst (bez samopovezivanja)",
- "tog-uselivepreview": "Koristi trenutan pregled",
+ "tog-uselivepreview": "Koristi trenutni pregled",
"tog-forceeditsummary": "Upozori me kada ne unesem opis izmene",
"tog-watchlisthideown": "Sakrij moje izmene sa spiska nadgledanja",
"tog-watchlisthidebots": "Sakrij izmene botova sa spiska nadgledanja",
"tog-ccmeonemails": "Pošalji mi kopije imejlova koje pošaljem drugim korisnicima",
"tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
"tog-showhiddencats": "Prikaži skrivene kategorije",
- "tog-norollbackdiff": "Izostavi razliku nakon izvršenog vraćanja",
+ "tog-norollbackdiff": "Ne prikazuj razliku nakon izvršenog vraćanja",
"tog-useeditwarning": "Upozori me kada napuštam stranicu sa nesačuvanim promenama",
"tog-prefershttps": "Uvek koristi sigurnu konekciju kada sam prijavljen.",
"underline-always": "uvek podvlači",
"hr_tip": "Vodoravna linija (koristiti retko)",
"summary": "Opis izmene:",
"subject": "Tema:",
- "minoredit": "manja izmena",
- "watchthis": "nadgledaj ovu stranicu",
+ "minoredit": "Ovo je manja izmena",
+ "watchthis": "Nadgledaj ovu stranicu",
"savearticle": "Sačuvaj stranicu",
"savechanges": "Sačuvaj izmene",
"publishpage": "Objavi stranicu",
"last": "razl",
"page_first": "prva",
"page_last": "poslednja",
- "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> – razlika s trenutnom izmenom,\n<strong>({{int:last}})</strong> – razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> – mala izmena",
+ "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> = razlika s trenutnom izmenom, <strong>({{int:last}})</strong> = razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> = mala izmena",
"history-fieldset-title": "Pregled istorije",
"history-show-deleted": "Samo obrisane",
"histfirst": "najstarije",
"difference-multipage": "(razlike između stranica)",
"lineno": "Red $1:",
"compareselectedversions": "Uporedi izabrane izmene",
- "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
+ "showhideselectedversions": "Promeni vidljivost izabranih izmena",
"editundo": "poništi",
"diff-empty": "(Nema razlike)",
"diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmene istog korisnika nije prikazano|$1 međuizmena istog korisnika nije prikazano}})",
"username": "{{GENDER:$1|Korisničko ime}}:",
"prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
"prefs-memberingroups-type": "$1",
- "prefs-registration": "Vreme upisa:",
+ "prefs-registration": "Vreme registracije:",
"prefs-registration-date-time": "$1",
"yourrealname": "Pravo ime:",
"yourlanguage": "Jezik:",
"booksources-search": "Pretraži",
"booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
"booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
+ "magiclink-tracking-isbn": "Stranice sa ISBN magičnim vezama",
"specialloguserlabel": "Izvršilac:",
"speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
"log": "Dnevnici",
"tooltip-watchlistedit-raw-submit": "Ažuriraj spisak",
"tooltip-recreate": "Ponovo napravite stranicu iako je obrisana",
"tooltip-upload": "Započnite otpremanje",
- "tooltip-rollback": "Opcija „Vrati“ vraća izmene poslednjeg korisnika",
+ "tooltip-rollback": "„Vrati“ vraća izmene poslednjeg korisnika jednim klikom",
"tooltip-undo": "Poništava ovu izmenu i otvara obrazac za uređivanje.",
"tooltip-preferences-save": "Sačuvaj postavke",
"tooltip-summary": "Unesite kratak opis",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova su uklonjena|$1 naslova je uklonjeno}}:",
"watchlistedit-too-many": "Ima previše stranica za prikaz ovde.",
"watchlisttools-clear": "isprazni spisak nadgledanja",
- "watchlisttools-view": "prikaži srodne izmene",
+ "watchlisttools-view": "Prikaži srodne izmene",
"watchlisttools-edit": "prikaži i uredi spisak nadgledanja",
"watchlisttools-raw": "izmeni sirov spisak nadgledanja",
"iranian-calendar-m1": "Farvardin",
"special-characters-group-ipa": "IPA",
"special-characters-group-symbols": "Simboli",
"special-characters-group-greek": "grčki",
+ "special-characters-group-greekextended": "prošireni grčki",
"special-characters-group-cyrillic": "ćirilica",
"special-characters-group-arabic": "arapski",
"special-characters-group-arabicextended": "prošireni arapski",
"rcfilters-invalid-filter": "Ogiltigt filter",
"rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
"rcfilters-filterlist-title": "Filter",
+ "rcfilters-filterlist-feedbacklink": "Ge återkoppling på nya (beta)filter",
+ "rcfilters-highlightbutton-title": "Markera resultat",
+ "rcfilters-highlightmenu-title": "Välj en färg",
"rcfilters-filterlist-noresults": "Inga filter hittades",
"rcfilters-filtergroup-registration": "Användarregistrering",
"rcfilters-filter-registered-label": "Registrerade",
"editcomment": "Redigeringskommentaren var: <em>$1</em>.",
"revertpage": "Återställde redigeringar av [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
"revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
- "rollback-success": "Återställde ändringar av $1;\nändrade tillbaka till senaste version av $2.",
+ "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
"rollback-success-notify": "Återställde ändringar av $1;\nändrade tillbaka till senaste sidversion av $2. [$3 Visa ändringar]",
"sessionfailure-title": "Sessionsfel",
"sessionfailure": "Något med din session som inloggad är på tok. Din begärda åtgärd har avbrutits, för att förhindra att någon kapar din session. Klicka på \"Tillbaka\" i din webbläsare och ladda om den sida du kom ifrån. Försök sedan igen.",
"tog-watchdefault": "நான் தொகுக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
"tog-watchmoves": "நான் நகர்த்தும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்.",
"tog-watchdeletion": "நான் நீக்கும் பக்கங்கள் மற்றும் கோப்புகளை என் கவனிப்புப் பட்டியலில் சேர்",
+ "tog-watchuploads": "நான் பதிவேற்றும் புதிய கோப்புகளை எனது கவனிப்புப் பட்டியலில் சேர்க்கவும்",
"tog-watchrollback": "நான் பின்மாற்றம் செய்த எனது கவனிப்பு பட்டியலில் பக்கங்களை சேர்",
"tog-minordefault": "இயல்பிருப்பாக அனைத்து தொகுப்புகளையும் சிறியது எனக் குறித்துக்கொள்.",
"tog-previewontop": "தொகுப்புப் பெட்டிக்கு முன்பு முன்தோற்றத்தைக் காட்டு",
"tog-ccmeonemails": "ஏனைய பயனர்களுக்கு நான் அனுப்பும் மின்னஞ்சல்களின் நகலொன்றை எனக்கு அனுப்பு",
"tog-diffonly": "மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே",
"tog-showhiddencats": "மறைக்கப்பட்ட பகுப்புகளைக் காட்டு",
- "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத நிலà¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d விதà¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 விà®\9fà¯\8dà®\9fà¯\81விà®\9fவà¯\81à®®à¯\8d (à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88).",
+ "tog-norollbackdiff": "à®®à¯\81னà¯\8dபிரà¯\81நà¯\8dத நிலà¯\88à®\95à¯\8dà®\95à¯\81à®\95à¯\8d à®\95à¯\8aணà¯\8dà®\9fà¯\81வநà¯\8dதபினà¯\8d விதà¯\8dதியாà®\9aà®\99à¯\8dà®\95ளà¯\88 à®\95ாà®\9fà¯\8dà®\9fதà¯\8dதà¯\87வà¯\88யிலà¯\8dலà¯\88",
"tog-useeditwarning": "தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்",
"tog-prefershttps": "புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்",
"underline-always": "எப்பொழுதும்",
"password-change-forbidden": "நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது",
"externaldberror": "வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.",
"login": "புகுபதிகை",
+ "login-security": "தங்கள் அடையாளத்தை உறுதிப்படுத்தவும்",
"nav-login-createaccount": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
"userlogin": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
"userloginnocreate": "புகுபதிகை",
"createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?",
"createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
"createacct-another-submit": "கணக்கை உருவாக்கவும்",
+ "createacct-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
+ "createacct-another-continue-submit": "கணக்கு தொடக்கத்தை தொடரவும்",
"createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
"createacct-benefit-body1": "{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}",
"createacct-benefit-body2": "{{PLURAL:$1|பக்கம்|பக்கங்கள்}}",
"createacct-another-realname-tip": "உண்மையான பெயர் கட்டாயமற்றது.\nநீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.",
"pt-login": "உள்நுழை",
"pt-login-button": "புகுபதிகை",
+ "pt-login-continue-button": "உள்நுழைவை தொடரவும்",
"pt-createaccount": "புதிய கணக்கை உருவாக்கவும்",
"pt-userlogout": "விடுபதிகை",
"php-mail-error-unknown": "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
"newpassword": "புதிய கடவுச்சொல்:",
"retypenew": "புதிய கடவுச்சொல்லை மீண்டும் தட்டச்சிடு",
"resetpass_submit": "கடவுச்சொல்லை பதிவுசெய்து புகுபதிகை செய்",
- "changepassword-success": "à®\89à®\99à¯\8dà®\95ளதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d வà¯\86à®±à¯\8dறிà®\95ரமாà®\95 மாறà¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fà¯\81ளà¯\8dளது!",
+ "changepassword-success": "à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d மாறà¯\8dறபà¯\8dபà®\9fà¯\8dà®\9fது!",
"changepassword-throttled": "தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.\nமீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.",
"botpasswords": "தானியங்கி கடவுச்சொற்கள்",
"botpasswords-disabled": "தானியங்கி கடவுச்சொற்கள் பயன்பாட்டில் இல்லை.",
"botpasswords-insert-failed": "\"$1\" என்ற தானியங்கி பெயரை இணைக்க முடியவில்லை. ஏற்கனவே இருக்குமோ?",
"botpasswords-update-failed": "\"$1\" என்ற தானியங்கி பெயரை புதிப்பிக்க முடியவில்லை. அது நீக்கப்பட்டதா?",
"botpasswords-created-title": "தானியங்கி கடவுச்சொல் உருவாக்கப்பட்டது.",
- "botpasswords-created-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
+ "botpasswords-created-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் முழுமையாக உருவாக்கப்பட்டது.",
"botpasswords-updated-title": "தானியங்கி கடவுச்சொல் புதுப்பிக்கப்பட்டது",
- "botpasswords-updated-body": "\"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
+ "botpasswords-updated-body": "\"$2\" பயனரின் \"$1\" தானியங்கி கடவுச்சொல் முழுமையாக புதிப்பிக்கப்பட்டது.",
"botpasswords-deleted-title": "தானியங்கி கடவுச்சொல் நீக்கப்பட்டது",
- "botpasswords-deleted-body": "\"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
+ "botpasswords-deleted-body": "\"$2\" பயனரின் \"$1\"-க்கான தானியங்கி கடவுச்சொல் நீக்கப்பட்டது.",
"botpasswords-newpassword": "<strong>$1</strong>-இற்கு புகுபதிகை செய்வதற்கான புதிய கடவுச்சொல் <strong>$2</strong> ஆகும். <em>தயவு செய்து வருங்கால மேற்கோளுக்கு இதனை பதிக.</em><br>(பழைய முகவர்கள் பயனாளர் பெயரை உள்ளீட்டிற்கு பயன்படுத்தலாம், மேலும் நீங்கள் <strong>$3</strong> ஐ பயனாளர் பெயராகவும் <strong>$4</strong> ஐ கடவுச்சொல்லாகவும் பயன்படுத்தலாம்.)",
"botpasswords-no-provider": "தானியங்கிகடவுச்சொல்அமர்வுவழங்குநர் பயன்பாட்டில் இல்லை.",
"botpasswords-restriction-failed": "தானியங்கி கடவுச்சொல் புகுபதிகை செய்ய தடுக்கிறது.",
"botpasswords-invalid-name": "தானியங்கி கடவுச்சொல் பிரிப்பானை (\"$1\") குறிக்கப்பட்ட பயனர் பெயர் கொண்டிருக்கவில்லை.",
"botpasswords-not-exist": "\"$1\" என்ற பயனர் \"$2\" என்ற தானியங்கி கடவுச்சொல்லை கொண்டிருக்கவில்லை.",
"resetpass_forbidden": "கடவுச்சொற்கள் மாற்றப்பட முடியாது",
+ "resetpass_forbidden-reason": "கடவுச்சொற்கள் மாற்றப்பட முடியாது:$1",
"resetpass-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
"resetpass-submit-loggedin": "கடவுச்சொல்லை மாற்று",
"resetpass-submit-cancel": "விட்டுவிடு",
"passwordreset-emailelement": "பயனர் பெயர்: \n$1\n\nதற்காலிகக் கடவுச்சொல்: \n$2",
"passwordreset-emailsentemail": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
"passwordreset-emailsentusername": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
+ "passwordreset-invalidemail": "செல்லுபடியற்ற அஞ்சல் முகவரி",
+ "passwordreset-nodata": "பயனர் பெயர் மற்றும் மின்னஞ்சல் முகவரி கொடுக்கப்படவில்லை",
"changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
"changeemail-header": "இந்த படிவத்தை உங்கள் மின்னஞ்சல் முகவரியை மாற்ற பூர்த்தி செய்யவும். நீங்கள் இந்த மாற்றத்தை உறுதிசெய்ய உங்கள் கடவுச்சொல்லை உள்ளிட வேண்டிவரும். உங்கள் கணக்கிலிருந்து ஏதாவது மின்னஞ்சலை நீக்க விரும்பினால், படிவத்தை சமர்ப்பிக்கும்போது மின்னஞ்சல் முகவரியை காலியாக விடவும்.",
"changeemail-no-info": "இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.",
"content-model-css": "சிஎஸ்எஸ்",
"content-json-empty-object": "காலி பொருள்",
"content-json-empty-array": "காலி அணி",
+ "deprecated-self-close-category": "தவறாக சுய மூடப்பட்ட HTML குறிச்சொற்களை பயன்படுத்தும் பக்கங்கள்",
"duplicate-args-category": "வார்ப்புரு அழைப்பில் ஒத்த விவாதங்களை கொண்ட பக்கங்கள்",
"duplicate-args-category-desc": "இப்பக்கம் விவாதங்களின் ஒத்த வடிவங்களைப் பயன்படுத்தும் வார்ப்புருக்களை, எடுத்துக்காட்டக <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code> கொண்டுள்ளது.",
"expensive-parserfunction-warning": "எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.\n\nஇது $2 {{PLURAL:$2|சார்புக்கும்|சார்புகளுக்கும் }} குறைவான இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டிருக்க வேண்டும், ஆனால் தற்போது இதில் {{PLURAL:$1|$1 சார்பு|$1 சார்புகள்}} உள்ளன.",
"mergehistory-empty": "இணைக்கப்படக்கூடிய திருத்தங்கள் எதுவுமில்லை.",
"mergehistory-done": "$1 பக்கத்தின் {{PLURAL:$3|ஒரு திருத்தம்|$3 திருத்தங்கள்}} வெற்றிகரமாக [[:$2]] பக்கத்தில் இணைக்கப்பட்ட{{PLURAL:$3|து|ன}}.",
"mergehistory-fail": "வரலாற்றை இணைக்க முடியவில்லை. அருள் கூர்ந்து நேரங்களை ஒரு முறை சரி பார்க்கவும்.",
+ "mergehistory-fail-bad-timestamp": "செல்லுப்படியாகாத நேர முத்திரை.",
"mergehistory-fail-invalid-source": "மூலப்பக்கம் பயன்பாட்டில் இல்லை.",
"mergehistory-fail-invalid-dest": "இலக்குப் பக்கம் செல்லுபடியற்றது.",
+ "mergehistory-fail-permission": "வரலாறுகளை ஒன்றினைக்க தேவையாக அதிகாரங்கள் இல்லை.",
"mergehistory-fail-toobig": "$1 அளவுக்கு மேல் வரலாறு இணைப்பு செய்ய இயலவில்லை {{PLURAL:$1|revision|திருத்தங்கள்}} நகர்த்தப்படும்.",
"mergehistory-no-source": "மூலப் பக்கம் $1 இல்லை.",
"mergehistory-no-destination": "இலக்குப் பக்கம் $1 இல்லை.",
"search-interwiki-caption": "உறவுத் திட்டங்கள்",
"search-interwiki-default": "$1 தளத்திலிருந்து முடிவுகள்:",
"search-interwiki-more": "(மேலும்)",
+ "search-interwiki-more-results": "மேலும் முடிவுகள்",
"search-relatedarticle": "தொடர்புடையவை",
"searchrelated": "தொடர்புடையவை",
"searchall": "அனைத்தும்",
"action-userrights-interwiki": "ஏனைய விக்கித் தளங்களின் பயனர் உரிமைகளைத் தொகு",
"action-siteadmin": "தரவுதளத்தை பூட்டு அல்லது பூட்டாதே",
"action-sendemail": "மின்னஞ்சல்கள் அனுப்பு",
+ "action-editmyoptions": "உங்கள் விருப்பத்தேர்வுகளை தொகு",
"action-editmywatchlist": "உங்கள் கவனிப்பு பட்டியலை தொகு",
"action-viewmywatchlist": "உங்கள் கவனிப்பு பட்டியலை பார்",
"action-viewmyprivateinfo": "உங்கள் தனிப்பட்ட தகவல்களைப் பார்",
"action-managechangetags": "தரவுதளத்திலிருந்து அடையாளங்களை உருவாக்கு அல்லது நீக்கு",
"action-applychangetags": "உங்கள் மாற்றங்களுடன் அடையாளங்களைச் செயற்படுத்து",
"action-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில் அடையாளங்களைச் சேர் அல்லது நீக்கு",
+ "action-purge": "இப்பக்கத்தினை துப்புரவாக்கு",
"nchanges": "{{PLURAL:$1|ஓர் மாற்றம்|$1 மாற்றங்கள்}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|கடந்த வருகையிலிருந்து}}",
"enhancedrc-history": "வரலாறு",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|புதிய பக்கங்கள் பட்டியலையும்]] காணவும்)",
"recentchanges-submit": "காட்டு",
"rcfilters-filterlist-title": "வடிப்பான்கள்",
+ "rcfilters-highlightmenu-title": "ஒரு நிறத்தை தேர்ந்தெடுக்கவும்",
+ "rcfilters-filterlist-noresults": "எந்த வடிப்பானும் காணப்படவில்லை",
"rcfilters-filtergroup-registration": "பயனர் பதிகை",
"rcfilters-filter-registered-label": "பதிவுசெய்யப்பட்டது",
"rcfilters-filter-unregistered-label": "பதிவு நீக்கம் செய்யப்பட்டது",
"rcfilters-filter-editsbyself-label": "தங்களின் சொந்த தொகுப்புகள்",
+ "rcfilters-filter-editsbyself-description": "தங்களது தொகுப்புகள்.",
+ "rcfilters-filter-editsbyother-label": "மற்றவர் தொகுப்புகள்",
"rcfilters-filter-userExpLevel-newcomer-label": "புது வரவுகள்",
"rcfilters-filter-userExpLevel-learner-label": "கற்போர்",
+ "rcfilters-filter-userExpLevel-experienced-label": "அனுபவமுள்ள பயனர்கள்",
+ "rcfilters-filter-userExpLevel-experienced-description": "30 நாட்கள் நடவடிக்கை மற்றும் 500 தொகுப்புகளுக்கு மேல்",
+ "rcfilters-filtergroup-automated": "தானியக்க பங்களிப்பு",
"rcfilters-filter-bots-label": "தானியங்கி",
+ "rcfilters-filter-bots-description": "தானியக்க கருவிகளால ஆன தொகுப்புகள்",
"rcfilters-filter-humans-label": "மனிதன் (தானியங்கி அல்ல)",
+ "rcfilters-filter-humans-description": "மனித தொகுப்பாளர்களால் ஆன தொகுப்பு",
+ "rcfilters-filtergroup-significance": "சிறப்பு",
+ "rcfilters-filter-minor-label": "சிறு தொகுப்பு",
"rcfilters-filtergroup-changetype": "மாற்ற வகை",
+ "rcfilters-filter-pageedits-label": "பக்க தொகுப்புகள்",
"rcfilters-filter-newpages-label": "பக்க உருவாக்கங்கள்",
"rcnotefrom": "கீழே காணப்படுவது <strong>$3, $4</strong> இலிருந்து செய்யப்பட்ட (<strong>$1</strong> வரைக் காட்டப்பட்டுள்ளது) {{PLURAL:$5|மாற்றமாகும்.|மாற்றங்களாகும்.}}",
"rclistfrom": "$2, $3 முதல் இன்று வரை செய்யப்பட்ட புதிய மாற்றங்களைக் காட்டவும்",
"apisandbox-request-url-label": "URL வேண்டுகோள்:",
"apisandbox-request-time": "வேண்டுகோள் நேரம்: {{PLURAL:$1|$1 மிசெ}}",
"apisandbox-results-fixtoken": "அட்டையை திருத்தி மீண்டும் சமர்பிக்கவும்",
+ "apisandbox-continue": "தொடரவும்",
+ "apisandbox-continue-clear": "வெறுமையாக்குக",
"booksources": "நூல் மூலங்கள்",
"booksources-search-legend": "நூல் மூலங்களைத் தேடு",
"booksources-search": "தேடுக",
"listgrouprights-namespaceprotection-header": "பெயர்வெளி கட்டுப்பாடு",
"listgrouprights-namespaceprotection-namespace": "பெயர்வெளி",
"listgrouprights-namespaceprotection-restrictedto": "பயனரை திருத்த அனுமதிக்கும் உரிமை(கள்)",
+ "listgrants-grant": "நல்கை",
"listgrants-rights": "அணுக்கங்கள்",
"trackingcategories": "பகுப்புகளை தடமறி",
"trackingcategories-msg": "பகுப்புகளை தடமறிதல்",
"changecontentmodel-title-label": "பக்கத் தலைப்பு",
"changecontentmodel-model-label": "புது உள்ளடக்க மாதிரி",
"changecontentmodel-reason-label": "காரணம்:",
+ "changecontentmodel-submit": "மாற்றுக",
"changecontentmodel-success-title": "உள்ளடக்க மாதிரி மாற்றப்பட்டது",
"changecontentmodel-success-text": "[[:$1]]-இன் உள்ளடக்க வகை மாற்றப்பட்டது",
"log-name-contentmodel": "உள்ளடக்க மாதிரி மாற்றப் பதிகை",
"ipb-unblock": "ஐ.பி. அல்லது பயனருக்கான தடையை நீக்கு",
"ipb-blocklist": "தற்போதுள்ள தடுப்புகளைப் பார்",
"ipb-blocklist-contribs": "{{GENDER:$1|$1}}க்கு பங்களிப்புகள்",
+ "ipb-blocklist-duration-left": "$1 வெளியேறினர்",
"unblockip": "பயனர் தடையை நீக்கு",
"unblockiptext": "முன்னர் தடுக்கப்பட்ட ஐ.பி. முகவரி அல்லது பயனர்பெயரின் எழுத்து அணுக்கத்தை மீழ்விப்பதற்கு கீழேயுள்ள படிவத்தை பயன்படுத்தவும்.",
"ipusubmit": "இந்தத் தடையை நீக்கு",
"lockdbsuccesstext": "தரவுத்தளம் பூட்டப் பட்டது.<br />பராமரிப்பு முடிவடைந்ததும் [[Special:UnlockDB|பூட்டை நீக்க]] மறவாதீர்.",
"unlockdbsuccesstext": "தரவுத்தளம் திறக்கப்பட்டது.",
"lockfilenotwritable": "தரவுதள பூட்டு கோப்பு எழுதுமாறு இல்லை.\nஇத்தரவுதளத்தை பூட்ட அல்லது பூட்டியதை நீக்க , இது வலை சேவகன் எழுதுவதற்க்கேற்றவாறு இருக்க வேண்டும்.",
+ "databaselocked": "தரவுத்தளம் ஏற்கனவே பூட்டப்பட்டுள்ளது.",
"databasenotlocked": "தரவுத்தளம் பூட்டப்படவில்லை.",
"lockedbyandtime": "(இதன்படி{{GENDER:$1|$1}} on $2 at $3)",
"move-page": "$1 பக்கத்தை நகர்த்து",
"export-download": "கோப்பாக சேமி",
"export-templates": "வார்ப்புருக்களையும் உள்ளடக்கு",
"export-pagelinks": "இணைத்த பக்கங்களை கீழ்வரும் ஆழம் வரை சேர்:",
+ "export-manual": "கைமுறையாக பக்கங்களை சேர்க:",
"allmessages": "அனைத்து முறைமைசார் தகவல்கள் அட்டவணை",
"allmessagesname": "பெயர்",
"allmessagesdefault": "இயல்பிருப்பு உரை",
"tooltip-ca-nstab-category": "பகுப்புப் பக்கத்தை பார்க்க",
"tooltip-minoredit": "இம்மாற்றத்தை சிறிய தொகுப்பாக கருது",
"tooltip-save": "உங்கள் மாற்றங்களைச் சேமிக்கவும்.",
+ "tooltip-publish": "மாற்றங்களைப் பதிப்பிடுக",
"tooltip-preview": "நீங்கள் செய்த மாற்றங்களின் முன்தோற்றம் பார்க்கவும்! தயவுசெய்து, மாற்றங்களை சேமிக்கும் முன்னர் இதனைப் பயன்படுத்தவும்!",
"tooltip-diff": "உரையில் நீங்கள் செய்த மாற்றங்களைக் காட்டவும்.",
"tooltip-compareselectedversions": "இப் பக்கத்தின் தெரிவு செய்யப்பட்ட இரண்டு பதிப்புக்களுக்கு இடையிலான வேறுபாடுகளைப் பார்க்கவும்.",
"pageinfo-category-pages": "பக்கங்களின் எண்ணிக்கை",
"pageinfo-category-subcats": "துணைபகுப்புகளின் எண்ணிக்கை",
"pageinfo-category-files": "கோப்புகளின் எண்ணிக்கை",
+ "pageinfo-user-id": "பயனர் அடையாளம்",
"markaspatrolleddiff": "ரோந்திட்டதாக குறி",
"markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
"markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
"patrol-log-header": "இது ரோந்து செய்யப்பட்ட பரிசீலனைகளுக்கான குறிப்பேடு.",
"log-show-hide-patrol": "$1 ரோந்து குறிப்பேடு",
"log-show-hide-tag": "$1 அடையாள பதிவு",
+ "confirm-markpatrolled-button": "சரி",
"deletedrevision": "பழைய திருத்தம் $1 நீக்கப்பட்டது",
"filedeleteerror-short": "பின்வரும் கோப்பை நீக்குவதில் தவறு: $1",
"filedeleteerror-long": "கோப்பை நீக்கும் போது தவறுகள் ஏற்பட்டுள்ளன:\n\n$1",
"newimages-showbots": "தானியிங்கி பதிவேற்றங்களைக் காட்டு",
"newimages-hidepatrolled": "ரோந்திட்ட பதிவேற்றங்களை மறை",
"noimages": "பார்வைக்கு ஓன்றுமில்லை.",
+ "gallery-slideshow-toggle": "வில்லைப்படங்களை ஊசலாடு",
"ilsubmit": "தேடுக",
"bydate": "நாள் வழி",
"sp-newimages-showfrom": "$1, $2க்குப் பின்னரான புதியக் கோப்புக்களைக் காட்டுக",
"confirm-watch-top": "இப்பக்கத்தை உங்கள் கவனிப்புப் பட்டியலில் சேர்க்க வேண்டுமா?",
"confirm-unwatch-button": "சரி",
"confirm-unwatch-top": "இப்பக்கத்தை உங்கள் கவனிப்புப் பட்டியலிருந்து நீக்கா வேண்டுமா?",
+ "confirm-rollback-button": "சரி",
"quotation-marks": "\"$1\"",
"imgmultipageprev": "← முந்திய பக்கம்",
"imgmultipagenext": "அடுத்தப் பக்கம் →",
"htmlform-cloner-create": "மேலும் சேர்க",
"htmlform-cloner-delete": "நீக்குக",
"htmlform-cloner-required": "குறைந்து ஒரு மதிப்பு தேவைப்படும்.",
+ "htmlform-date-placeholder": "வவவவ-மாமா-தேதே",
+ "htmlform-time-placeholder": "மம:நிநி:நொநொ",
+ "htmlform-datetime-placeholder": "வவவவ-மாமா-தேதே மம:நிநி:நொநொ",
"htmlform-title-badnamespace": "\"{{ns:$2}}\" பெயர்வெளியில் [[:$1]] இல்லை",
"htmlform-title-not-creatable": "\"$1\" ஒரு உருவாக்கத்தக்க பக்கத் தலைப்பு அல்ல",
"htmlform-title-not-exists": "$1 இ்டம்பெறவில்லை.",
"pagelang-select-lang": "மொழியைத் தேர்ந்தெடு",
"pagelang-reason": "காரணம்",
"pagelang-submit": "சமர்ப்பி",
+ "pagelang-nonexistent-page": "பக்கம் $1 காணப்படவில்லை.",
"right-pagelang": "பக்க மொழியை மாற்றுக",
"action-pagelang": "பக்க மொழியை மாற்றுக",
"log-name-pagelang": "மொழி பதிவை மாற்றுக",
"log-description-pagelang": "இது பக்க மொழி மாற்றச் செயல்பாட்டின் பதிவு.",
"logentry-pagelang-pagelang": "$3 க்கான பக்க மொழியை $4 இலிருந்து $5 க்கு $1 {{GENDER:$2|மாற்றினார்}}.",
+ "mediastatistics": "ஊடகம் பற்றிய புள்ளிவிவரங்கள்",
"mediastatistics-bytespertype": "இந்த பிரிவக்கான மொத்த கோப்பளவு: $1 எண்ணுண்மி",
"mediastatistics-allbytes": "அனைத்து கோப்புகளின் மொத்த கோப்பளவு: $1 எண்ணுண்மி",
"mediastatistics-table-count": "கோப்புகளின் எண்ணிக்கை",
"mediastatistics-header-video": "காணொளிகள்",
"mediastatistics-header-office": "அலுவலகம்",
"mediastatistics-header-text": "உரை வடிவ",
+ "mediastatistics-header-archive": "அமுக்கிய வடிவங்கள்",
"mediastatistics-header-total": "அனைத்துக் கோப்புக்களும்",
"json-error-syntax": "தொடரியல் பிழை",
"special-characters-group-latin": "இலத்தீன்",
"special-characters-group-ipa": "பன்னாட்டு ஒலிப்பு அரிச்சுவடி",
"special-characters-group-symbols": "குறியீடுகள்",
"special-characters-group-greek": "கிரேக்கம்",
+ "special-characters-group-greekextended": "நீடித்த கிரேக்கம்",
"special-characters-group-cyrillic": "சைரிலிக் (Cyrillic)",
"special-characters-group-arabic": "அரபு",
"special-characters-group-arabicextended": "அரபு விரிவு",
"special-characters-title-emdash": "பெரு கோடு",
"special-characters-title-minus": "கழித்தல் குறி",
"mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
+ "mw-widgets-mediasearch-noresults": "முடிவுகள் எதுவும் காணப்படவில்லை.",
"mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
"mw-widgets-titleinput-description-redirect": "$1-க்கு வழிமாற்று",
+ "mw-widgets-categoryselector-add-category-placeholder": "ஒரு பகுப்பைச் சேர்க...",
+ "mw-widgets-usersmultiselect-placeholder": "மேலும் சேர்க...",
"sessionprovider-generic": "$1 பகுதி",
"sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
"sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
"recentchanges-submit": "చూపించు",
"rcfilters-filterlist-title": "వడపోతలు",
+ "rcfilters-highlightmenu-title": "ఒక రంగును ఎంచుకోండి",
"rcfilters-filtergroup-registration": "వాడుకరి నమోదు",
"rcfilters-filter-editsbyself-label": "మీ స్వంత దిద్దుబాట్లు",
"rcfilters-filter-editsbyself-description": "మీ దిద్దుబాట్లు.",
"selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
"missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
"missingcommentheader": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ใส่เรื่องสำหรับความเห็นนี้ \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่ระบุเรื่อง",
- "summary-preview": "ตัวอย่างคำอธิบาย:",
- "subject-preview": "ตัวอย่างเรื่อง:",
+ "summary-preview": "ตัวอย่างคำอธิบายการแก้ไข:",
+ "subject-preview": "à¸\95ัวà¸à¸¢à¹\88าà¸\87à¸\8aืà¹\88à¸à¹\80รืà¹\88à¸à¸\87:",
"previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
"blockedtitle": "ผู้ใช้ถูกบล็อก",
"blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
"invalid-content-data": "ข้อมูลเนื้อหาไม่ถูกต้อง",
"content-not-allowed-here": "ไม่อนุญาตเนื้อหา \"$1\" ในหน้า [[$2]]",
"editwarning-warning": "การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณดำเนินการสูญหาย\nถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน \"{{int:prefs-editing}}\" ในการตั้งค่าของคุณ",
+ "editpage-invalidcontentmodel-title": "ไม่รองรับรูปแบบเนื้อหานี้",
"editpage-notsupportedcontentformat-title": "รูปแบบเนื้อหาไม่ได้รับการรองรับ",
"editpage-notsupportedcontentformat-text": "ตัวแบบเนื้อหา $2 ไม่รองรับตัวแบบเนื้อหา $1",
"content-model-wikitext": "ข้อความวิกิ",
"editinguser": "กำลังเปลี่ยนสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
"viewinguserrights": "กำลังดูสิทธิผู้ใช้ของผู้ใช้ <strong>[[User:$1|$1]]</strong> $2",
"userrights-editusergroup": "แก้ไขกลุ่มผู้ใช้",
- "userrights-viewusergroup": "ดูกลุ่มผู้ใช้",
+ "userrights-viewusergroup": "ดูกลุ่ม{{GENDER:$1|ผู้ใช้}}",
"saveusergroups": "บันทึกกลุ่ม{{GENDER:$1|ผู้ใช้}}",
"userrights-groupsmember": "สมาชิกของ:",
"userrights-groupsmember-auto": "สมาชิกโดยปริยายของ:",
"saveprefs": "Шыгжаары",
"restoreprefs": "Шупту баштайгы ниити шилилгелерни restore",
"prefs-editing": "Өскертир",
- "rows": "Одуруглар:",
- "columns": "Баганалар:",
"searchresultshead": "Дилээр",
"timezoneuseserverdefault": "Викиниң ниити шилилгезин ажыглаары ($1)",
"servertime": "Серверниң шагы:",
"hours": "{{PLURAL:$1|1=$1 шак|$1 шак}}",
"days": "{{PLURAL:$1|1=$1 хүн|$1 хүн}}",
"ago": "$1 бурунгаар",
- "bad_image_list": "ФоÑ\80мадÑ\8b мÑ\8bндÑ\8bг бооÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nЧүгле даңзÑ\8bнÑ\8bÒ£ идегеÑ\82Ñ\82еÑ\80и (Ñ\8dлеменÑ\82илеÑ\80и) Ñ\81анаÑ\82Ñ\8bнаÑ\80 бооÑ\80 (* деп демдекÑ\82ен Ñ\8dгелÑ\8dÑ\8dн одÑ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гнÑ\83Ò£ биÑ\80ги Ñ\88өлүдүү Ñ\81алдÑ\8bнмаÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83малÑ\87е Ñ\88өлүдүг болÑ\83Ñ\80Ñ\83 албан.\nÐ\9eл-ла одÑ\83Ñ\80Ñ\83гнÑ\83Ò£ аÑ\80Ñ\82кан Ñ\88өлүдүглеÑ\80и онзагай кÑ\8bлдÑ\8bÑ\80 азÑ\8b Ñ\87Ñ\83Ñ\80Ñ\83мал капÑ\81Ñ\8bÑ\80Ñ\8bп болÑ\83Ñ\80 Ñ\87үүлдеÑ\80 кÑ\8bлдÑ\8bÑ\80 Ñ\81анаÑ\82Ñ\82Ñ\8bнар.",
+ "bad_image_list": "ФоÑ\80мадÑ\8b мÑ\8bндÑ\8bг болÑ\83Ñ\80 Ñ\83жÑ\83Ñ\80лÑ\83г:\n\nÐ\94аңзÑ\8bда Ñ\87үгле Ñ\8dлеменÑ\82илеÑ\80 Ñ\81анаÑ\82Ñ\8bнаÑ\80 (* деп демдекÑ\82ен Ñ\8dгелÑ\8dÑ\8dн одÑ\83Ñ\80Ñ\83глаÑ\80).\nÐ\9eдÑ\83Ñ\80Ñ\83гда биÑ\80 дÑ\83гааÑ\80 айÑ\82Ñ\8bг болза кииÑ\80 бижиÑ\82Ñ\82инмеÑ\81 Ñ\87Ñ\83Ñ\80Ñ\83кÑ\87е айÑ\82Ñ\8bÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г.\nÐ\9eл-ла одÑ\83Ñ\80Ñ\83гнÑ\83Ò£ Ó©Ñ\81ке айÑ\82Ñ\8bглаÑ\80Ñ\8b, Ñ\87Ñ\83Ñ\80Ñ\83кÑ\82аÑ\80нÑ\8b кииÑ\80 бижидип болÑ\83Ñ\80 аÑ\80Ñ\8bннаÑ\80же айÑ\82Ñ\8bп Ñ\82Ñ\83Ñ\80ар.",
"metadata": "Чурумал дугайында медээлер",
"metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
"metadata-fields": "Бо даңзыда айыткан чурумалдар метаданныйларның кезектери чурумалдың арынынга көстүп кээр, метаданныйлар таблицазын дүрүп каан болур. \nАрткан кезектер аайлаан ёзугаар чажыт көстүр.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"Silovan",
"David1010",
"Macofe",
- "Nemo bis"
+ "Nemo bis",
+ "Otogi"
]
},
"tog-underline": "რცხუეფიშ ათოღაზუა:",
"viewyourtext": "თქვა შეილებუნა ქოძირათ '''თქვანი რედაქტირაფეფიშ''' დაჭყაფური ტექსტი თე ხასჷლას დო გეჭოფათ თიშ ანგი.",
"protectedinterface": "ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.",
"editinginterface": "<strong>ყურადღება:</strong> თქვენ არედაქტირებთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. \nამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც.",
- "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკებისლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
+ "translateinterface": "თარგმანების ყველა ვიკიში დასამატებლად ან შესაცვლელად, გთხოვთ გამოიყენოთ მედიავიკების ლოკალიზაციის პროექტი [https://translatewiki.net/ translatewiki.net].",
"cascadeprotected": "ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი \"იერარქიული\":\n$2",
"namespaceprotected": "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
"customcssprotected": "თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.",
"rcfilters-invalid-filter": "无效过滤器",
"rcfilters-empty-filter": "没有活跃的过滤器。已显示所有贡献。",
"rcfilters-filterlist-title": "过滤器",
+ "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
+ "rcfilters-highlightbutton-title": "高亮结果",
+ "rcfilters-highlightmenu-title": "选择颜色",
"rcfilters-filterlist-noresults": "找不到过滤器",
"rcfilters-filtergroup-registration": "用户注册",
"rcfilters-filter-registered-label": "已注册",
"recentchangeslinked-feed": "相关更改",
"recentchangeslinked-toolbox": "相关更改",
"recentchangeslinked-title": "与“$1”有关的更改",
- "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|你的监视列表]]中的页面以<strong>粗体</strong>显示。",
+ "recentchangeslinked-summary": "这是链接自指定页面(或至指定分类的成员)的页面的最近更改的列表。[[Special:Watchlist|您的监视列表]]中的页面以<strong>粗体</strong>显示。",
"recentchangeslinked-page": "页面名称:",
"recentchangeslinked-to": "显示链到所给出的页面",
"recentchanges-page-added-to-category": "[[:$1]]已添加至分类",
"editcomment": "编辑摘要:<em>$1</em>。",
"revertpage": "恢复[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的编辑至[[User:$1|$1]]的最后版本",
"revertpage-nouser": "恢复隐藏用户的编辑至{{GENDER:$1|[[User:$1|$1]]}}的最后版本",
- "rollback-success": "已恢复$1的编辑,更改回$2的最后版本。",
+ "rollback-success": "已恢复{{GENDER:$3|$1}}的编辑;更改回{{GENDER:$4|$2}}的最后版本。",
"rollback-success-notify": "已回退$1的编辑,更改回$2的最后版本。[$3 显示更改]",
"sessionfailure-title": "会话无效",
"sessionfailure": "似乎您的登录会话有问题;\n为了防止会话劫持,这个操作已经被取消。\n请返回先前的页面,重新载入该页面,然后重试。",
"tooltip-pt-mytalk": "{{GENDER:|您}}的讨论页面",
"tooltip-pt-anontalk": "有关本IP地址的编辑的讨论",
"tooltip-pt-preferences": "{{GENDER:|您}}的设置",
- "tooltip-pt-watchlist": "你正在监视更改的页面的列表",
+ "tooltip-pt-watchlist": "您正在监视更改的页面的列表",
"tooltip-pt-mycontris": "{{GENDER:|您}}的贡献的列表",
"tooltip-pt-anoncontribs": "来自此IP地址的编辑列表",
"tooltip-pt-login": "我们鼓励您登录;然而,这不是强制性的",
"variantname-gan-hant": "hant",
"variantname-kk-cyrl": "kk-cyrl",
"metadata": "元数据",
- "metadata-help": "此文件中包含有额外的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。如果已自文件的初始状态修改,一些详细说明可能无法反映修改后的文件。",
+ "metadata-help": "此文件中包含有额外的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加的。如果文件自初始状态已受到修改,一些详细说明可能无法反映修改后的文件。",
"metadata-expand": "显示详细资料",
"metadata-collapse": "隐藏详细资料",
"metadata-fields": "在本信息中所列出的 EXIF 元数据域将包含在图片显示页面,当元数据表损坏时只显示以下信息。\n其他的元数据默认为隐藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"Maskers",
"Knch903",
"Winstonyin",
- "Wmr"
+ "Wmr",
+ "烈羽"
]
},
"tog-underline": "底線標示連結:",
"talk": "討論",
"views": "檢視",
"toolbox": "工具",
- "tool-link-userrights": "更改{{GENDER:$1|使用者}}群組",
+ "tool-link-userrights": "變更{{GENDER:$1|使用者}}群組",
"tool-link-userrights-readonly": "檢視{{GENDER:$1|使用者}}群組",
"tool-link-emailuser": "寄信給這位{{GENDER:$1|使用者}}",
"userpage": "檢視使用者頁面",
"selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
"missingcommenttext": "請在下方輸入評論。",
"missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
- "summary-preview": "摘要預覽:",
+ "summary-preview": "預覽摘要:",
"subject-preview": "主旨預覽:",
"previewerrortext": "嘗試預覽您的變更時發生錯誤。",
"blockedtitle": "使用者已被封鎖",
"newarticle": "(新)",
"newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 使用說明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
"anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:CreateAccount|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
- "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁]</span>。",
+ "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[Special:Search/{{PAGENAME}}|搜尋此頁面標題]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 建立此頁面]</span>。",
"noarticletext-nopermission": "此頁面目前沒有內容,\n您可以在其它頁面中 [[Special:Search/{{PAGENAME}}|搜尋此頁面標題]],或 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋相關日誌]</span>,但您沒有權限建立此頁面。",
"missing-revision": "頁面名稱 \"{{FULLPAGENAME}}\" 的 #$1 修訂版本不存在。\n\n通常是因連結到過期的歷史頁面,該頁面已被刪除。\n詳情請參考 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
"userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
"search-interwiki-caption": "姐妹專案",
"search-interwiki-default": "來自 $1 的結果:",
"search-interwiki-more": "(更多)",
+ "search-interwiki-more-results": "更多結果",
"search-relatedarticle": "相關",
"searchrelated": "相關",
"searchall": "全部",
"editusergroup": "載入使用者群組",
"editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
"viewinguserrights": "檢視{{GENDER:$1|使用者}}<strong>[[User:$1|$1]]</strong>的使用者權限 $2",
- "userrights-editusergroup": "編輯使用者群組",
- "userrights-viewusergroup": "檢視使用者群組",
+ "userrights-editusergroup": "編輯{{GENDER:$1|使用者}}群組",
+ "userrights-viewusergroup": "檢視{{GENDER:$1|使用者}}群組",
"saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
"userrights-groupsmember": "所屬群組:",
"userrights-groupsmember-auto": "所屬隱含群組:",
"userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
"userrights-changeable-col": "您可變更的群組",
"userrights-unchangeable-col": "您不可變更的群組",
+ "userrights-expiry": "期限:",
"userrights-expiry-othertime": "其他時間:",
"userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
"group": "群組:",
"rcfilters-search-placeholder": "過濾最近變更(瀏覽或開始輸入)",
"rcfilters-invalid-filter": "過濾規則無效",
"rcfilters-filterlist-title": "篩選器",
+ "rcfilters-highlightmenu-title": "選擇顏色",
"rcfilters-filterlist-noresults": "找不到過濾規則",
"rcfilters-filtergroup-authorship": "編輯者",
"rcfilters-filter-editsbyself-label": "您自己的編輯",
"rcfilters-filter-userExpLevel-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
"rcfilters-filter-userExpLevel-experienced-label": "有經驗的使用者",
"rcfilters-filter-userExpLevel-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+ "rcfilters-filter-bots-label": "機器人",
+ "rcfilters-filter-humans-label": "人類(非機器人)",
+ "rcfilters-filter-humans-description": "由人類編者做出的編輯",
+ "rcfilters-filter-minor-label": "小修改",
+ "rcfilters-filter-major-label": "非小編輯",
+ "rcfilters-filter-major-description": "未標記小修改的編輯。",
+ "rcfilters-filter-pageedits-label": "頁面編輯",
+ "rcfilters-filter-newpages-label": "頁面創建",
+ "rcfilters-filter-newpages-description": "創立新頁面的編緝。",
+ "rcfilters-filter-categorization-label": "分類變更",
"rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
"rclistfrom": "顯示自 $3 $2 以來的新變更",
"rcshowhideminor": "$1 小修訂",
"editcomment": "編輯摘要為:<em>$1</em>。",
"revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
"revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
- "rollback-success": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。",
+ "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
"rollback-success-notify": "已還原 $1 所做的編輯;\n變更回由 $2 修訂的最後一個版本。[$3 顯示變更]",
"sessionfailure-title": "連線階段失敗",
"sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
"variantname-gan-hans": "中文(简体)",
"variantname-gan-hant": "中文(繁體)",
"metadata": "詮釋資料",
- "metadata-help": "æ¤æª\94æ¡\88å\8c\85å\90«é¡\8då¤\96ç\9a\84è³\87è¨\8aï¼\8cå\8f¯è\83½ç\94±æ\95¸ä½\8dç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8fæ©\9fæ\89\80建ç«\8bç\9a\84ã\80\82\n\nå¦\82æ\9e\9cå·²è\87ªæª\94æ¡\88å\88\9då§\8bç\8b\80æ\85\8bä¿®æ\94¹ï¼\8cä¸\80äº\9b詳細說æ\98\8eå\8f¯è\83½ç\84¡æ³\95å\8f\8dæ\98 ä¿®æ\94¹å¾\8cç\9a\84æª\94æ¡\88。",
+ "metadata-help": "æ¤æ\96\87件ä¸å\8c\85å\90«é¡\8då¤\96ä¿¡æ\81¯ã\80\82é\80\99äº\9bä¿¡æ\81¯å\8f¯è\83½æ\98¯ç\94±æ\95¸ç¢¼ç\9b¸æ©\9fæ\88\96æ\8e\83æ\8f\8få\84\80å\9c¨å\89µå»ºæ\88\96æ\95¸å\97å\8c\96é\81\8eç¨\8bä¸æ\89\80æ·»å\8a ç\9a\84ã\80\82å¦\82æ\9e\9cæ\96\87件è\87ªå\88\9då§\8bç\8b\80æ\85\8bå·²å\8f\97å\88°ä¿®æ\94¹ï¼\8cä¸\80äº\9b詳細說æ\98\8eå\8f¯è\83½ç\84¡æ³\95å\8f\8dæ\98 ä¿®æ\94¹å¾\8cç\9a\84æ\96\87件。",
"metadata-expand": "顯示詳細資料",
"metadata-collapse": "隱藏詳細資料",
"metadata-fields": "在本訊息中所列出的 EXIF 詮釋資料域將包含在圖片顯示頁面,當詮釋資料表損壞時只顯示以下訊息。\n其他的詮釋資料預設為隱藏。\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
"mw-widgets-titleinput-description-new-page": "頁面不存在",
"mw-widgets-titleinput-description-redirect": "重新導向至 $1",
"mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
+ "mw-widgets-usersmultiselect-placeholder": "添加更多...",
"sessionmanager-tie": "無法合併多個請求認証類型:$1。",
"sessionprovider-generic": "$1 連線階段",
"sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
'pagesincategory_files' => [ '0', 'فايلات', 'ملفات', 'files' ],
];
-// (bug 16469) Override Eastern Arabic numberals, use Western
+// (T18469) Override Eastern Arabic numberals, use Western
$digitTransformTable = [
'0' => '0',
'1' => '1',
'Mostlinkedtemplates' => [ 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ],
'Mostrevisions' => [ 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ],
'Movepage' => [ 'Přesunout_stránku', 'Přejmenovat_stránku' ],
- 'Mycontributions' => [ 'Mé_příspěvky', 'Me_prispevky' ],
+ 'Mycontributions' => [ 'Moje_příspěvky', 'Mé_příspěvky', 'Me_prispevky' ],
'MyLanguage' => [ 'V_mém_jazyce', 'Můj_jazyk' ],
- 'Mypage' => [ 'Moje_stránka', 'Moje_stranka' ],
- 'Mytalk' => [ 'Moje_diskuse' ],
+ 'Mypage' => [ 'Moje_stránka', 'Moje_stranka', 'Má_stránka' ],
+ 'Mytalk' => [ 'Moje_diskuse', 'Má_diskuse' ],
'Myuploads' => [ 'Moje_soubory', 'Mé_soubory' ],
'Newimages' => [ 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ],
'Newpages' => [ 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ],
* Example:
* @code
* $namespaceGenderAliases = [
- * NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
+ * NS_USER => [ 'male' => 'Male_user', 'female' => 'Female_user' ],
* ];
* @endcode
*/
'img_center' => [ '1', 'erdian', 'center', 'centre' ],
];
-$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* Bug 15717 */
+$separatorTransformTable = [ ',' => '.', '.' => ',' ]; /* T17717 */
NS_CATEGORY_TALK => 'Ñemohenda_myangekõi',
];
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
$namespaceGenderAliases = [];
*
*/
-# $fallback = 'ru'; // bug 27785
+# $fallback = 'ru'; // T29785
$namespaceNames = [
NS_MEDIA => 'Медиа',
'Diskusyón_de_Katēggoría' => NS_CATEGORY_TALK,
];
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
$namespaceGenderAliases = [];
$specialPageAliases = [
$linkPrefixExtension = true;
-# Same as the French (bug 8485)
+# Same as the French (T10485)
$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
NS_CATEGORY_TALK => 'Neneuhcāyōtl_tēixnāmiquiliztli',
];
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
$namespaceGenderAliases = [];
$namespaceAliases = [
$fallback8bitEncoding = 'iso-8859-2';
$separatorTransformTable = [
- ',' => "\xc2\xa0", // @bug 2749
+ ',' => "\xc2\xa0", // T4749
'.' => ','
];
];
$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
-$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
+$linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # T23168, T29633
$specialPageAliases = [
'Activeusers' => [ 'Utilizadores_activos' ],
NS_CATEGORY_TALK => 'Katiguriya_rimanakuy',
];
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
$namespaceGenderAliases = [];
$specialPageAliases = [
NS_CATEGORY_TALK => 'Samiyachiy_rimanakuy',
];
-// Remove Spanish gender aliases (bug 37090)
+// Remove Spanish gender aliases (T39090)
$namespaceGenderAliases = [];
$linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
$separatorTransformTable = [
- ',' => "\xc2\xa0", // @bug 2749
+ ',' => "\xc2\xa0", // T4749
'.' => ','
];
];
$namespaceAliases = [
- // Aliases for Polish namespaces (bug 34988).
+ // Aliases for Polish namespaces (T36988).
'Specjalna' => NS_SPECIAL,
'Dyskusja' => NS_TALK,
'Użytkownik' => NS_USER,
$namespaceAliases = [
'సభ్యులు' => NS_USER,
'సభ్యులపై_చర్చ' => NS_USER_TALK,
- 'సభ్యుడు' => NS_USER, # set for bug 11615
+ 'సభ్యుడు' => NS_USER, # set for T13615
'సభ్యునిపై_చర్చ' => NS_USER_TALK,
'బొమ్మ' => NS_FILE,
'బొమ్మపై_చర్చ' => NS_FILE_TALK,
/**
* Namespace names
- * (bug 8708)
+ * (T10708)
*/
$namespaceNames = [
NS_MEDIA => 'Media',
--- /dev/null
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/..';
+
+require_once $basePath . '/maintenance/Maintenance.php';
+
+/**
+ * Maintenance script for adding a site definition into the sites table.
+ *
+ * @since 1.29
+ *
+ * @license GNU GPL v2+
+ * @author Florian Schmidt
+ */
+class AddSite extends Maintenance {
+
+ public function __construct() {
+ $this->addDescription( 'Add a site definition into the sites table.' );
+
+ $this->addArg( 'globalid', 'The global id of the site to add, e.g. "wikipedia".', true );
+ $this->addArg( 'group', 'In which group this site should be sorted in.', true );
+ $this->addOption( 'language', 'The language code of the site, e.g. "de".' );
+ $this->addOption( 'interwiki-id', 'The interwiki ID of the site.' );
+ $this->addOption( 'navigation-id', 'The navigation ID of the site.' );
+ $this->addOption( 'pagepath', 'The URL to pages of this site, e.g.' .
+ ' https://example.com/wiki/\$1.' );
+ $this->addOption( 'filepath', 'The URL to files of this site, e.g. https://example
+ .com/w/\$1.' );
+
+ parent::__construct();
+ }
+
+ /**
+ * Imports the site described by the parameters (see self::__construct()) passed to this
+ * maintenance sccript into the sites table of MediaWiki.
+ */
+ public function execute() {
+ $siteStore = MediaWikiServices::getInstance()->getSiteStore();
+ $siteStore->reset();
+
+ $globalId = $this->getArg( 0 );
+ $group = $this->getArg( 1 );
+ $language = $this->getOption( 'language' );
+ $interwikiId = $this->getOption( 'interwiki-id' );
+ $navigationId = $this->getOption( 'navigation-id' );
+ $pagepath = $this->getOption( 'pagepath' );
+ $filepath = $this->getOption( 'filepath' );
+
+ if ( !is_string( $globalId ) || !is_string( $group ) ) {
+ echo "Arguments globalid and group need to be strings.\n";
+ return false;
+ }
+
+ if ( $siteStore->getSite( $globalId ) !== null ) {
+ echo "Site with global id $globalId already exists.\n";
+ return false;
+ }
+
+ $site = new MediaWikiSite();
+ $site->setGlobalId( $globalId );
+ $site->setGroup( $group );
+ if ( $language !== null ) {
+ $site->setLanguageCode( $language );
+ }
+ if ( $interwikiId !== null ) {
+ $site->addInterwikiId( $interwikiId );
+ }
+ if ( $navigationId !== null ) {
+ $site->addNavigationId( $navigationId );
+ }
+ if ( $pagepath !== null ) {
+ $site->setPagePath( $pagepath );
+ }
+ if ( $filepath !== null ) {
+ $site->setFilePath( $filepath );
+ }
+
+ $siteStore->saveSites( [ $site ] );
+
+ if ( method_exists( $siteStore, 'reset' ) ) {
+ $siteStore->reset();
+ }
+
+ echo "Done.\n";
+ }
+}
+
+$maintClass = 'AddSite';
+require_once RUN_MAINTENANCE_IF_MAIN;
--
-- patch-archive-ar_id.sql
--
--- Bug 39675. Add archive.ar_id.
+-- T41675. Add archive.ar_id.
ALTER TABLE /*$wgDBprefix*/archive
ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
--
-- patch-categorylinks-better-collation.sql
--
--- Bugs 164, 1211, 23682. This is the second version of this patch; the
+-- T2164, T3211, T25682. This is the second version of this patch; the
-- changes are also incorporated into patch-categorylinks-better-collation2.sql,
-- for the benefit of trunk users who applied the original.
--
--- Due to bug 25254, the length limit of 255 bytes for cl_sortkey_prefix
+-- Due to T27254, the length limit of 255 bytes for cl_sortkey_prefix
-- is also enforced in php. If you change the length of that field, make
-- sure to also change the check in LinksUpdate.php.
ALTER TABLE /*$wgDBprefix*/categorylinks
--
-- patch-extenallinks-el_id.sql
--
--- Bug 15441. Add externallinks.el_id.
+-- T17441. Add externallinks.el_id.
ALTER TABLE /*$wgDBprefix*/externallinks
ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
--- Increase the length of up_property from 32 -> 255 bytes. Bug 19408
+-- Increase the length of up_property from 32 -> 255 bytes. T21408
ALTER TABLE /*_*/user_properties
MODIFY up_property varbinary(255);
"United States of America", // 7bit ASCII
"S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
"Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn",
- // This comes from bug 36839
+ // This comes from T38839
"Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
. "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
. "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
* if the target title exists in the image table, or if both the
* original and target titles exist in the page table, append
* increasing version numbers until the target title exists in
- * neither. (See also bug 16916.)
+ * neither. (See also T18916.)
*/
$version = 0;
$final = $new;
parent::__construct();
$this->addDescription(
'Remove cache entries for removed ResourceLoader modules from the database' );
- $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+ $this->setBatchSize( 500 );
}
public function execute() {
+ $this->output( "Cleaning up module_deps table...\n" );
+
$dbw = $this->getDB( DB_MASTER );
$rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
$moduleNames = $rl->getModuleNames();
- $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
- $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+ $res = $dbw->select( 'module_deps',
+ [ 'md_module', 'md_skin' ],
+ $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1',
+ __METHOD__
+ );
+ $rows = iterator_to_array( $res, false );
- $this->output( "Cleaning up module_deps table...\n" );
- $i = 1;
$modDeps = $dbw->tableName( 'module_deps' );
- do {
- // $dbw->delete() doesn't support LIMIT :(
- $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
- $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ );
+ $i = 1;
+ foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+ // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+ $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+ return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+ }, $chunk );
+ $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+ $this->beginTransaction( $dbw, __METHOD__ );
+ $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
$numRows = $dbw->affectedRows();
$this->output( "Batch $i: $numRows rows\n" );
+ $this->commitTransaction( $dbw, __METHOD__ );
+
$i++;
- wfWaitForSlaves();
- } while ( $numRows > 0 );
- $this->output( "done\n" );
+ }
+
+ $this->output( "Done\n" );
}
}
-$maintClass = "CleanupRemovedModules";
+$maintClass = 'CleanupRemovedModules';
require_once RUN_MAINTENANCE_IF_MAIN;
$prior = $title->getDBkey();
}
- # Old cleanupTitles could move articles there. See bug 23147.
+ # Old cleanupTitles could move articles there. See T25147.
$ns = $row->page_namespace;
if ( $ns < 0 ) {
$ns = 0;
}
# Namespace which no longer exists. Put the page in the main namespace
- # since we don't have any idea of the old namespace name. See bug 68501.
+ # since we don't have any idea of the old namespace name. See T70501.
if ( !MWNamespace::exists( $ns ) ) {
$ns = 0;
}
require_once __DIR__ . '/Maintenance.php';
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Maintenance script to convert user options to the new `user_properties` table.
*
'rd_from = pa.page_id',
'rd_namespace = pb.page_namespace',
'rd_title = pb.page_title',
- 'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // bug 40352
+ 'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ), // T42352
'pb.page_is_redirect' => 1,
];
function fileEntry( $url, $date, $priority ) {
return
"\t<url>\n" .
- // bug 34666: $url may contain bad characters such as ampersands.
+ // T36666: $url may contain bad characters such as ampersands.
"\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
"\t\t<lastmod>$date</lastmod>\n" .
"\t\t<priority>$priority</priority>\n" .
* @param int $namespace
*/
function generateLimit( $namespace ) {
- // bug 17961: make a title with the longest possible URL in this namespace
+ // T19961: make a title with the longest possible URL in this namespace
$title = Title::makeTitle( $namespace, str_repeat( "\xf0\xa8\xae\x81", 63 ) . "\xe5\x96\x83" );
$this->limit = [
$cmd = wfEscapeShellArg(
$hhvm,
'--hphp',
- '--target', 'hhbc',
+ '--target', 'hhbc',
'--format', 'binary',
'--force', '1',
'--keep-tempdir', '1',
# (preferably batching files too).
private function getFileCommentFromSourceWiki( $wiki_host, $file ) {
$url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
- . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
+ . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=comment';
$body = Http::get( $url, [], __METHOD__ );
if ( preg_match( '#<ii comment="([^"]*)" />#', $body, $matches ) == 0 ) {
return false;
private function getFileUserFromSourceWiki( $wiki_host, $file ) {
$url = $wiki_host . '/api.php?action=query&format=xml&titles=File:'
- . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
+ . rawurlencode( $file ) . '&prop=imageinfo&&iiprop=user';
$body = Http::get( $url, [], __METHOD__ );
if ( preg_match( '#<ii user="([^"]*)" />#', $body, $matches ) == 0 ) {
return false;
--- /dev/null
+<?php
+/**
+ * Initialize a user preference based on the value
+ * of another preference.
+ *
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that initializes a user preference
+ * based on the value of another preference.
+ *
+ * @ingroup Maintenance
+ */
+class InitUserPreference extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addOption(
+ 'target',
+ 'Name of the user preference to initialize',
+ true,
+ true,
+ 't'
+ );
+ $this->addOption(
+ 'source',
+ 'Name of the user preference to take the value from',
+ true,
+ true,
+ 's'
+ );
+ $this->setBatchSize( 300 );
+ }
+
+ public function execute() {
+ $target = $this->getOption( 'target' );
+ $source = $this->getOption( 'source' );
+ $this->output( "Initializing '$target' based on the value of '$source'\n" );
+
+ $dbr = $this->getDB( DB_REPLICA );
+ $dbw = $this->getDB( DB_MASTER );
+
+ $iterator = new BatchRowIterator(
+ $dbr,
+ 'user_properties',
+ [ 'up_user', 'up_property' ],
+ $this->mBatchSize
+ );
+ $iterator->setFetchColumns( [ 'up_user', 'up_value' ] );
+ $iterator->addConditions( [
+ 'up_property' => $source,
+ 'up_value IS NOT NULL',
+ 'up_value != 0',
+ ] );
+
+ $processed = 0;
+ foreach ( $iterator as $batch ) {
+ foreach ( $batch as $row ) {
+ $values = [
+ 'up_user' => $row->up_user,
+ 'up_property' => $target,
+ 'up_value' => $row->up_value,
+ ];
+ $dbw->upsert(
+ 'user_properties',
+ $values,
+ [ 'up_user', 'up_property' ],
+ $values,
+ __METHOD__
+ );
+
+ $processed += $dbw->affectedRows();
+ }
+ }
+
+ $this->output( "Processed $processed user(s)\n" );
+ $this->output( "Finished!\n" );
+ }
+}
+
+$maintClass = 'InitUserPreference'; // Tells it to run the class
+require_once RUN_MAINTENANCE_IF_MAIN;
$affected += $dbw->affectedRows();
$this->commitTransaction( $dbw, __METHOD__ );
- // Clear cache for the affected users (bug 40340)
+ // Clear cache for the affected users (T42340)
if ( $affected > 0 ) {
// XXX: This also invalidates cache of unaffected users that
// were in the new group and not in the group.
-- conversion algorithm is run. We store this so that we can update
-- collations without reparsing all pages.
-- Note: If you change the length of this field, you also need to change
- -- code in LinksUpdate.php. See bug 25254.
+ -- code in LinksUpdate.php. See T27254.
cl_sortkey_prefix varbinary(255) NOT NULL default 0x,
-- This isn't really used at present. Provided for an optional
-- Size chosen to allow IPv6
-- FIXME: these fields were originally blank for single-IP blocks,
-- but now they are populated. No migration was ever done. They
- -- should be fixed to be blank again for such blocks (bug 49504).
+ -- should be fixed to be blank again for such blocks (T51504).
ipb_range_start varchar(255) NOT NULL,
ipb_range_end varchar(255) NOT NULL,
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\ResultWrapper;
require_once __DIR__ . '/Maintenance.php';
/**
* Merge page histories
*
- * @param integer $id The page_id
+ * @param stdClass $row Page row
* @param Title $newTitle The new title
* @return bool
*/
$content = $rev->getContent();
if ( !$content ) {
- # This should not happen, but sometimes does (bug 20757)
+ # This should not happen, but sometimes does (T22757)
$id = $row->$idCol;
$this->output( "Content of $table $id unavailable!\n" );
} catch ( Exception $e ) {
$this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
- return false; // bug 22624?
+ return false; // T24624?
}
if ( !is_string( $text ) ) {
- # This should not happen, but sometimes does (bug 20757)
+ # This should not happen, but sometimes does (T22757)
$this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
return false;
} catch ( Exception $e ) {
$this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
- return false; // bug 22624?
+ return false; // T24624?
}
$text = $rev->getSerializedData();
if ( !is_string( $text ) ) {
- # This should not happen, but sometimes does (bug 20757)
+ # This should not happen, but sometimes does (T22757)
$this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
return false;
require_once __DIR__ . '/Maintenance.php';
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Maintenance script that sends purge requests for pages edited in a date
* range to squid/varnish.
--- /dev/null
+<?php
+/**
+ * Remove all cache entries for ResourceLoader modules from the database.
+ *
+ * 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
+ * @author Timo Tijhof
+ */
+
+use MediaWiki\MediaWikiServices;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to purge the module_deps database cache table.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeModuleDeps extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->addDescription(
+ 'Remove all cache entries for ResourceLoader modules from the database' );
+ $this->setBatchSize( 500 );
+ }
+
+ public function execute() {
+ $this->output( "Cleaning up module_deps table...\n" );
+
+ $dbw = $this->getDB( DB_MASTER );
+ $res = $dbw->select( 'module_deps', [ 'md_module', 'md_skin' ], [], __METHOD__ );
+ $rows = iterator_to_array( $res, false );
+
+ $modDeps = $dbw->tableName( 'module_deps' );
+ $i = 1;
+ foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) {
+ // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) ..
+ $conds = array_map( function ( stdClass $row ) use ( $dbw ) {
+ return $dbw->makeList( (array)$row, IDatabase::LIST_AND );
+ }, $chunk );
+ $conds = $dbw->makeList( $conds, IDatabase::LIST_OR );
+
+ $this->beginTransaction( $dbw, __METHOD__ );
+ $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ );
+ $numRows = $dbw->affectedRows();
+ $this->output( "Batch $i: $numRows rows\n" );
+ $this->commitTransaction( $dbw, __METHOD__ );
+
+ $i++;
+ }
+
+ $this->output( "Done\n" );
+ }
+}
+
+$maintClass = 'PurgeModuleDeps';
+require_once RUN_MAINTENANCE_IF_MAIN;
MediaWiki\suppressWarnings(); // header notices
// Cache ?action=view
- $wgRequestTime = microtime( true ); # bug 22852
+ $wgRequestTime = microtime( true ); # T24852
ob_start();
$article->view();
$context->getOutput()->output();
$viewHtml = ob_get_clean();
$viewCache->saveToFileCache( $viewHtml );
// Cache ?action=history
- $wgRequestTime = microtime( true ); # bug 22852
+ $wgRequestTime = microtime( true ); # T24852
ob_start();
Action::factory( 'history', $article, $context )->show();
$context->getOutput()->output();
return;
}
- foreach ( $content->getSecondaryDataUpdates( $page->getTitle() ) as $update ) {
+ $updates = $content->getSecondaryDataUpdates(
+ $page->getTitle(), /* $old = */ null, /* $recursive = */ false );
+ foreach ( $updates as $update ) {
DeferredUpdates::addUpdate( $update );
}
}
require_once __DIR__ . '/Maintenance.php';
+use Wikimedia\Rdbms\ResultWrapper;
+
/**
* Maintenance script that sends SQL queries from the specified file to the database.
*
$wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
// Get the appropriate load balancer (for this wiki)
if ( $this->hasOption( 'cluster' ) ) {
- $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
+ $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
} else {
$lb = wfGetLB( $wiki );
}
}
if ( $historyFile ) {
# Delimiter is eated by streamStatementEnd, we add it
- # up in the history (bug 37020)
+ # up in the history (T39020)
readline_add_history( $wholeLine . ';' );
readline_write_history( $historyFile );
}
/**
* Print the results, callback for $db->sourceStream()
- * @param ResultWrapper $res The results object
+ * @param ResultWrapper|bool $res The results object
* @param IDatabase $db
*/
public function sqlPrintResult( $res, $db ) {
-- Unique indexes need to be handled with INSERT SELECT since just running
-- the CREATE INDEX statement will fail if there are duplicate values.
--
--- Ignore duplicates, several tables will have them (e.g. bug 16966) but in
+-- Ignore duplicates, several tables will have them (e.g. T18966) but in
-- most cases it's harmless to discard them.
--------------------------------------------------------------------------------
+++ /dev/null
-<?php
-/**
- * Script to fix bug 20757.
- *
- * 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 ExternalStorage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script to fix bug 20757.
- *
- * @ingroup Maintenance ExternalStorage
- */
-class FixBug20757 extends Maintenance {
- public $batchSize = 10000;
- public $mapCache = [];
- public $mapCacheSize = 0;
- public $maxMapCacheSize = 1000000;
-
- function __construct() {
- parent::__construct();
- $this->addDescription( 'Script to fix bug 20757 assuming that blob_tracking is intact' );
- $this->addOption( 'dry-run', 'Report only' );
- $this->addOption( 'start', 'old_id to start at', false, true );
- }
-
- function execute() {
- $dbr = $this->getDB( DB_REPLICA );
- $dbw = $this->getDB( DB_MASTER );
-
- $dryRun = $this->getOption( 'dry-run' );
- if ( $dryRun ) {
- print "Dry run only.\n";
- }
-
- $startId = $this->getOption( 'start', 0 );
- $numGood = 0;
- $numFixed = 0;
- $numBad = 0;
-
- $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
-
- // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
- $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
-
- while ( true ) {
- print "ID: $startId / $totalRevs\r";
-
- $res = $dbr->select(
- 'text',
- [ 'old_id', 'old_flags', 'old_text' ],
- [
- 'old_id > ' . intval( $startId ),
- 'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
- "$lowerLeft = 'o:15:\"historyblobstub\"'",
- ],
- __METHOD__,
- [
- 'ORDER BY' => 'old_id',
- 'LIMIT' => $this->batchSize,
- ]
- );
-
- if ( !$res->numRows() ) {
- break;
- }
-
- $secondaryIds = [];
- $stubs = [];
-
- foreach ( $res as $row ) {
- $startId = $row->old_id;
-
- // Basic sanity checks
- $obj = unserialize( $row->old_text );
- if ( $obj === false ) {
- print "{$row->old_id}: unrecoverable: cannot unserialize\n";
- ++$numBad;
- continue;
- }
-
- if ( !is_object( $obj ) ) {
- print "{$row->old_id}: unrecoverable: unserialized to type " .
- gettype( $obj ) . ", possible double-serialization\n";
- ++$numBad;
- continue;
- }
-
- if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
- print "{$row->old_id}: unrecoverable: unexpected object class " .
- get_class( $obj ) . "\n";
- ++$numBad;
- continue;
- }
-
- // Process flags
- $flags = explode( ',', $row->old_flags );
- if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
- $legacyEncoding = false;
- } else {
- $legacyEncoding = true;
- }
-
- // Queue the stub for future batch processing
- $id = intval( $obj->mOldId );
- $secondaryIds[] = $id;
- $stubs[$row->old_id] = [
- 'legacyEncoding' => $legacyEncoding,
- 'secondaryId' => $id,
- 'hash' => $obj->mHash,
- ];
- }
-
- $secondaryIds = array_unique( $secondaryIds );
-
- if ( !count( $secondaryIds ) ) {
- continue;
- }
-
- // Run the batch query on blob_tracking
- $res = $dbr->select(
- 'blob_tracking',
- '*',
- [
- 'bt_text_id' => $secondaryIds,
- ],
- __METHOD__
- );
- $trackedBlobs = [];
- foreach ( $res as $row ) {
- $trackedBlobs[$row->bt_text_id] = $row;
- }
-
- // Process the stubs
- foreach ( $stubs as $primaryId => $stub ) {
- $secondaryId = $stub['secondaryId'];
- if ( !isset( $trackedBlobs[$secondaryId] ) ) {
- // No tracked blob. Work out what went wrong
- $secondaryRow = $dbr->selectRow(
- 'text',
- [ 'old_flags', 'old_text' ],
- [ 'old_id' => $secondaryId ],
- __METHOD__
- );
- if ( !$secondaryRow ) {
- print "$primaryId: unrecoverable: secondary row is missing\n";
- ++$numBad;
- } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
- // Not broken yet, and not in the tracked clusters so it won't get
- // broken by the current RCT run.
- ++$numGood;
- } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
- print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
- ++$numBad;
- } else {
- print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
- ++$numBad;
- }
- unset( $stubs[$primaryId] );
- continue;
- }
- $trackRow = $trackedBlobs[$secondaryId];
-
- // Check that the specified text really is available in the tracked source row
- $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
- $text = ExternalStore::fetchFromURL( $url );
- if ( $text === false ) {
- print "$primaryId: unrecoverable: source text missing\n";
- ++$numBad;
- unset( $stubs[$primaryId] );
- continue;
- }
- if ( md5( $text ) !== $stub['hash'] ) {
- print "$primaryId: unrecoverable: content hashes do not match\n";
- ++$numBad;
- unset( $stubs[$primaryId] );
- continue;
- }
-
- // Find the page_id and rev_id
- // The page is probably the same as the page of the secondary row
- $pageId = intval( $trackRow->bt_page );
- if ( !$pageId ) {
- $revId = $pageId = 0;
- } else {
- $revId = $this->findTextIdInPage( $pageId, $primaryId );
- if ( !$revId ) {
- // Actually an orphan
- $pageId = $revId = 0;
- }
- }
-
- $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
-
- if ( !$dryRun ) {
- // Reset the text row to point to the original copy
- $this->beginTransaction( $dbw, __METHOD__ );
- $dbw->update(
- 'text',
- // SET
- [
- 'old_flags' => $newFlags,
- 'old_text' => $url
- ],
- // WHERE
- [ 'old_id' => $primaryId ],
- __METHOD__
- );
-
- // Add a blob_tracking row so that the new reference can be recompressed
- // without needing to run trackBlobs.php again
- $dbw->insert( 'blob_tracking',
- [
- 'bt_page' => $pageId,
- 'bt_rev_id' => $revId,
- 'bt_text_id' => $primaryId,
- 'bt_cluster' => $trackRow->bt_cluster,
- 'bt_blob_id' => $trackRow->bt_blob_id,
- 'bt_cgz_hash' => $stub['hash'],
- 'bt_new_url' => null,
- 'bt_moved' => 0,
- ],
- __METHOD__
- );
- $this->commitTransaction( $dbw, __METHOD__ );
- $this->waitForSlaves();
- }
-
- print "$primaryId: resolved to $url\n";
- ++$numFixed;
- }
- }
-
- print "\n";
- print "Fixed: $numFixed\n";
- print "Unrecoverable: $numBad\n";
- print "Good stubs: $numGood\n";
- }
-
- function waitForSlaves() {
- static $iteration = 0;
- ++$iteration;
- if ( ++$iteration > 50 == 0 ) {
- wfWaitForSlaves();
- $iteration = 0;
- }
- }
-
- function findTextIdInPage( $pageId, $textId ) {
- $ids = $this->getRevTextMap( $pageId );
- if ( !isset( $ids[$textId] ) ) {
- return null;
- } else {
- return $ids[$textId];
- }
- }
-
- function getRevTextMap( $pageId ) {
- if ( !isset( $this->mapCache[$pageId] ) ) {
- // Limit cache size
- while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
- $key = key( $this->mapCache );
- $this->mapCacheSize -= count( $this->mapCache[$key] );
- unset( $this->mapCache[$key] );
- }
-
- $dbr = $this->getDB( DB_REPLICA );
- $map = [];
- $res = $dbr->select( 'revision',
- [ 'rev_id', 'rev_text_id' ],
- [ 'rev_page' => $pageId ],
- __METHOD__
- );
- foreach ( $res as $row ) {
- $map[$row->rev_text_id] = $row->rev_id;
- }
- $this->mapCache[$pageId] = $map;
- $this->mapCacheSize += count( $map );
- }
-
- return $this->mapCache[$pageId];
- }
-
- /**
- * This is based on part of HistoryBlobStub::getText().
- * Determine if the text can be retrieved from the row in the normal way.
- * @param array $stub
- * @param stdClass $secondaryRow
- * @return bool
- */
- function isUnbrokenStub( $stub, $secondaryRow ) {
- $flags = explode( ',', $secondaryRow->old_flags );
- $text = $secondaryRow->old_text;
- if ( in_array( 'external', $flags ) ) {
- $url = $text;
- MediaWiki\suppressWarnings();
- list( /* $proto */, $path ) = explode( '://', $url, 2 );
- MediaWiki\restoreWarnings();
-
- if ( $path == "" ) {
- return false;
- }
- $text = ExternalStore::fetchFromURL( $url );
- }
- if ( !in_array( 'object', $flags ) ) {
- return false;
- }
-
- if ( in_array( 'gzip', $flags ) ) {
- $obj = unserialize( gzinflate( $text ) );
- } else {
- $obj = unserialize( $text );
- }
-
- if ( !is_object( $obj ) ) {
- // Correct for old double-serialization bug.
- $obj = unserialize( $obj );
- }
-
- if ( !is_object( $obj ) ) {
- return false;
- }
-
- $obj->uncompress();
- $text = $obj->getItem( $stub['hash'] );
-
- return $text !== false;
- }
-}
-
-$maintClass = 'FixBug20757';
-require_once RUN_MAINTENANCE_IF_MAIN;
--- /dev/null
+<?php
+/**
+ * Script to fix T22757.
+ *
+ * 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 ExternalStorage
+ */
+
+require_once __DIR__ . '/../Maintenance.php';
+
+/**
+ * Maintenance script to fix T22757.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
+class FixT22757 extends Maintenance {
+ public $batchSize = 10000;
+ public $mapCache = [];
+ public $mapCacheSize = 0;
+ public $maxMapCacheSize = 1000000;
+
+ function __construct() {
+ parent::__construct();
+ $this->addDescription( 'Script to fix T22757 assuming that blob_tracking is intact' );
+ $this->addOption( 'dry-run', 'Report only' );
+ $this->addOption( 'start', 'old_id to start at', false, true );
+ }
+
+ function execute() {
+ $dbr = $this->getDB( DB_REPLICA );
+ $dbw = $this->getDB( DB_MASTER );
+
+ $dryRun = $this->getOption( 'dry-run' );
+ if ( $dryRun ) {
+ print "Dry run only.\n";
+ }
+
+ $startId = $this->getOption( 'start', 0 );
+ $numGood = 0;
+ $numFixed = 0;
+ $numBad = 0;
+
+ $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', false, __METHOD__ );
+
+ // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
+ $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
+
+ while ( true ) {
+ print "ID: $startId / $totalRevs\r";
+
+ $res = $dbr->select(
+ 'text',
+ [ 'old_id', 'old_flags', 'old_text' ],
+ [
+ 'old_id > ' . intval( $startId ),
+ 'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
+ "$lowerLeft = 'o:15:\"historyblobstub\"'",
+ ],
+ __METHOD__,
+ [
+ 'ORDER BY' => 'old_id',
+ 'LIMIT' => $this->batchSize,
+ ]
+ );
+
+ if ( !$res->numRows() ) {
+ break;
+ }
+
+ $secondaryIds = [];
+ $stubs = [];
+
+ foreach ( $res as $row ) {
+ $startId = $row->old_id;
+
+ // Basic sanity checks
+ $obj = unserialize( $row->old_text );
+ if ( $obj === false ) {
+ print "{$row->old_id}: unrecoverable: cannot unserialize\n";
+ ++$numBad;
+ continue;
+ }
+
+ if ( !is_object( $obj ) ) {
+ print "{$row->old_id}: unrecoverable: unserialized to type " .
+ gettype( $obj ) . ", possible double-serialization\n";
+ ++$numBad;
+ continue;
+ }
+
+ if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
+ print "{$row->old_id}: unrecoverable: unexpected object class " .
+ get_class( $obj ) . "\n";
+ ++$numBad;
+ continue;
+ }
+
+ // Process flags
+ $flags = explode( ',', $row->old_flags );
+ if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
+ $legacyEncoding = false;
+ } else {
+ $legacyEncoding = true;
+ }
+
+ // Queue the stub for future batch processing
+ $id = intval( $obj->mOldId );
+ $secondaryIds[] = $id;
+ $stubs[$row->old_id] = [
+ 'legacyEncoding' => $legacyEncoding,
+ 'secondaryId' => $id,
+ 'hash' => $obj->mHash,
+ ];
+ }
+
+ $secondaryIds = array_unique( $secondaryIds );
+
+ if ( !count( $secondaryIds ) ) {
+ continue;
+ }
+
+ // Run the batch query on blob_tracking
+ $res = $dbr->select(
+ 'blob_tracking',
+ '*',
+ [
+ 'bt_text_id' => $secondaryIds,
+ ],
+ __METHOD__
+ );
+ $trackedBlobs = [];
+ foreach ( $res as $row ) {
+ $trackedBlobs[$row->bt_text_id] = $row;
+ }
+
+ // Process the stubs
+ foreach ( $stubs as $primaryId => $stub ) {
+ $secondaryId = $stub['secondaryId'];
+ if ( !isset( $trackedBlobs[$secondaryId] ) ) {
+ // No tracked blob. Work out what went wrong
+ $secondaryRow = $dbr->selectRow(
+ 'text',
+ [ 'old_flags', 'old_text' ],
+ [ 'old_id' => $secondaryId ],
+ __METHOD__
+ );
+ if ( !$secondaryRow ) {
+ print "$primaryId: unrecoverable: secondary row is missing\n";
+ ++$numBad;
+ } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
+ // Not broken yet, and not in the tracked clusters so it won't get
+ // broken by the current RCT run.
+ ++$numGood;
+ } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
+ print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
+ ++$numBad;
+ } else {
+ print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
+ ++$numBad;
+ }
+ unset( $stubs[$primaryId] );
+ continue;
+ }
+ $trackRow = $trackedBlobs[$secondaryId];
+
+ // Check that the specified text really is available in the tracked source row
+ $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
+ $text = ExternalStore::fetchFromURL( $url );
+ if ( $text === false ) {
+ print "$primaryId: unrecoverable: source text missing\n";
+ ++$numBad;
+ unset( $stubs[$primaryId] );
+ continue;
+ }
+ if ( md5( $text ) !== $stub['hash'] ) {
+ print "$primaryId: unrecoverable: content hashes do not match\n";
+ ++$numBad;
+ unset( $stubs[$primaryId] );
+ continue;
+ }
+
+ // Find the page_id and rev_id
+ // The page is probably the same as the page of the secondary row
+ $pageId = intval( $trackRow->bt_page );
+ if ( !$pageId ) {
+ $revId = $pageId = 0;
+ } else {
+ $revId = $this->findTextIdInPage( $pageId, $primaryId );
+ if ( !$revId ) {
+ // Actually an orphan
+ $pageId = $revId = 0;
+ }
+ }
+
+ $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
+
+ if ( !$dryRun ) {
+ // Reset the text row to point to the original copy
+ $this->beginTransaction( $dbw, __METHOD__ );
+ $dbw->update(
+ 'text',
+ // SET
+ [
+ 'old_flags' => $newFlags,
+ 'old_text' => $url
+ ],
+ // WHERE
+ [ 'old_id' => $primaryId ],
+ __METHOD__
+ );
+
+ // Add a blob_tracking row so that the new reference can be recompressed
+ // without needing to run trackBlobs.php again
+ $dbw->insert( 'blob_tracking',
+ [
+ 'bt_page' => $pageId,
+ 'bt_rev_id' => $revId,
+ 'bt_text_id' => $primaryId,
+ 'bt_cluster' => $trackRow->bt_cluster,
+ 'bt_blob_id' => $trackRow->bt_blob_id,
+ 'bt_cgz_hash' => $stub['hash'],
+ 'bt_new_url' => null,
+ 'bt_moved' => 0,
+ ],
+ __METHOD__
+ );
+ $this->commitTransaction( $dbw, __METHOD__ );
+ $this->waitForSlaves();
+ }
+
+ print "$primaryId: resolved to $url\n";
+ ++$numFixed;
+ }
+ }
+
+ print "\n";
+ print "Fixed: $numFixed\n";
+ print "Unrecoverable: $numBad\n";
+ print "Good stubs: $numGood\n";
+ }
+
+ function waitForSlaves() {
+ static $iteration = 0;
+ ++$iteration;
+ if ( ++$iteration > 50 == 0 ) {
+ wfWaitForSlaves();
+ $iteration = 0;
+ }
+ }
+
+ function findTextIdInPage( $pageId, $textId ) {
+ $ids = $this->getRevTextMap( $pageId );
+ if ( !isset( $ids[$textId] ) ) {
+ return null;
+ } else {
+ return $ids[$textId];
+ }
+ }
+
+ function getRevTextMap( $pageId ) {
+ if ( !isset( $this->mapCache[$pageId] ) ) {
+ // Limit cache size
+ while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
+ $key = key( $this->mapCache );
+ $this->mapCacheSize -= count( $this->mapCache[$key] );
+ unset( $this->mapCache[$key] );
+ }
+
+ $dbr = $this->getDB( DB_REPLICA );
+ $map = [];
+ $res = $dbr->select( 'revision',
+ [ 'rev_id', 'rev_text_id' ],
+ [ 'rev_page' => $pageId ],
+ __METHOD__
+ );
+ foreach ( $res as $row ) {
+ $map[$row->rev_text_id] = $row->rev_id;
+ }
+ $this->mapCache[$pageId] = $map;
+ $this->mapCacheSize += count( $map );
+ }
+
+ return $this->mapCache[$pageId];
+ }
+
+ /**
+ * This is based on part of HistoryBlobStub::getText().
+ * Determine if the text can be retrieved from the row in the normal way.
+ * @param array $stub
+ * @param stdClass $secondaryRow
+ * @return bool
+ */
+ function isUnbrokenStub( $stub, $secondaryRow ) {
+ $flags = explode( ',', $secondaryRow->old_flags );
+ $text = $secondaryRow->old_text;
+ if ( in_array( 'external', $flags ) ) {
+ $url = $text;
+ MediaWiki\suppressWarnings();
+ list( /* $proto */, $path ) = explode( '://', $url, 2 );
+ MediaWiki\restoreWarnings();
+
+ if ( $path == "" ) {
+ return false;
+ }
+ $text = ExternalStore::fetchFromURL( $url );
+ }
+ if ( !in_array( 'object', $flags ) ) {
+ return false;
+ }
+
+ if ( in_array( 'gzip', $flags ) ) {
+ $obj = unserialize( gzinflate( $text ) );
+ } else {
+ $obj = unserialize( $text );
+ }
+
+ if ( !is_object( $obj ) ) {
+ // Correct for old double-serialization bug.
+ $obj = unserialize( $obj );
+ }
+
+ if ( !is_object( $obj ) ) {
+ return false;
+ }
+
+ $obj->uncompress();
+ $text = $obj->getItem( $stub['hash'] );
+
+ return $text !== false;
+ }
+}
+
+$maintClass = 'FixT22757';
+require_once RUN_MAINTENANCE_IF_MAIN;
echo "Doing integrity check...\n";
$dbr = wfGetDB( DB_REPLICA );
- // Scan for HistoryBlobStub objects in the text table (bug 20757)
+ // Scan for HistoryBlobStub objects in the text table (T22757)
$exists = $dbr->selectField( 'text', 1,
'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\' ' .
exit( 1 );
}
- // Scan the archive table for HistoryBlobStub objects or external flags (bug 22624)
+ // Scan the archive table for HistoryBlobStub objects or external flags (T24624)
$flags = $dbr->selectField( 'archive', 'ar_flags',
'ar_flags LIKE \'%external%\' OR (' .
'ar_flags LIKE \'%object%\' ' .
-- conversion algorithm is run. We store this so that we can update
-- collations without reparsing all pages.
-- Note: If you change the length of this field, you also need to change
- -- code in LinksUpdate.php. See bug 25254.
+ -- code in LinksUpdate.php. See T27254.
cl_sortkey_prefix varchar(255) binary NOT NULL default '',
-- This isn't really used at present. Provided for an optional
-- Size chosen to allow IPv6
-- FIXME: these fields were originally blank for single-IP blocks,
-- but now they are populated. No migration was ever done. They
- -- should be fixed to be blank again for such blocks (bug 49504).
+ -- should be fixed to be blank again for such blocks (T51504).
ipb_range_start tinyblob NOT NULL,
ipb_range_end tinyblob NOT NULL,
}
$lang = Language::factory( 'en' );
- // Set global language to ensure localised errors are in English (bug 20633)
+ // Set global language to ensure localised errors are in English (T22633)
RequestContext::getMain()->setLanguage( $lang );
$wgLang = $lang; // BackCompat
# Don't try to access the database
# This needs to be disabled early since extensions will try to use the l10n
- # cache from $wgExtensionFunctions (bug 20471)
+ # cache from $wgExtensionFunctions (T22471)
$wgLocalisationCacheConf = [
'class' => 'LocalisationCache',
'storeClass' => 'LCStoreNull',
"SELECT user_name,COUNT(*) AS n
FROM $user
GROUP BY user_name
- HAVING n > 1", __METHOD__ );
+ HAVING n > 1", __METHOD__ );
$list = [];
foreach ( $result as $row ) {
}
.config-plainlink a {
- background: none !important;
- padding: 0 !important;
+ background: none !important; /* stylelint-disable-line declaration-no-important */
+ padding: 0 !important; /* stylelint-disable-line declaration-no-important */
}
.config-download-link {
'scripts' => 'resources/src/jquery/jquery.highlightText.js',
'dependencies' => [
'mediawiki.RegExp',
- 'dom-level2-shim',
],
'targets' => [ 'desktop', 'mobile' ],
],
'styles' => 'resources/src/jquery/jquery.tablesorter.less',
'messages' => [ 'sort-descending', 'sort-ascending' ],
'dependencies' => [
- 'dom-level2-shim',
'mediawiki.RegExp',
'mediawiki.language.months',
],
// Deprecated since MediaWiki 1.29.0
'json' => [
- 'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
+ 'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.api.upload' => [
'scripts' => 'resources/src/mediawiki/api/upload.js',
'dependencies' => [
- 'dom-level2-shim',
'mediawiki.api',
'mediawiki.api.edit',
],
'mediawiki.Upload' => [
'scripts' => 'resources/src/mediawiki/mediawiki.Upload.js',
'dependencies' => [
- 'dom-level2-shim',
'mediawiki.api.upload',
],
],
'mediawiki.util',
'mediawiki.language',
'user.options',
- 'dom-level2-shim',
],
'targets' => [ 'desktop', 'mobile' ],
],
/* MediaWiki Special pages */
+ 'mediawiki.rcfilters.filters.base.styles' => [
+ 'styles' => [
+ 'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less',
+ ],
+ ],
'mediawiki.rcfilters.filters.dm' => [
'scripts' => [
'resources/src/mediawiki.rcfilters/mw.rcfilters.js',
'rcfilters-invalid-filter',
'rcfilters-empty-filter',
'rcfilters-filterlist-title',
+ 'rcfilters-filterlist-feedbacklink',
'rcfilters-filterlist-noresults',
'rcfilters-filtergroup-registration',
'rcfilters-filter-registered-label',
'mediawiki.rcfilters.filters.dm',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-editing-core',
+ 'oojs-ui.styles.icons-interactions',
],
],
'mediawiki.special' => [
],
/* dom-level2-shim */
- // IE 8
+ // Deprecated since MediaWiki 1.29.0
'dom-level2-shim' => [
- 'scripts' => 'resources/src/polyfill-nodeTypes.js',
+ 'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
'targets' => [ 'desktop', 'mobile' ],
- 'skipFunction' => 'resources/src/dom-level2-skip.js',
],
/* OOjs */
"ooui-dialog-process-retry": "ز نۉ تلاش کونين",
"ooui-dialog-process-continue": "ديندا گرهڌن",
"ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
- "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ"
+ "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
+ "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
}
"ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
"ooui-dialog-process-dismiss": "Disteurel",
"ooui-dialog-process-retry": "Klask en-dro",
- "ooui-dialog-process-continue": "Kenderc'hel"
+ "ooui-dialog-process-continue": "Kenderc'hel",
+ "ooui-selectfile-button-select": "Diuzañ ur restr",
+ "ooui-selectfile-not-supported": "N'eo ket skoret an diuzañ restroù",
+ "ooui-selectfile-placeholder": "N'eus bet diuzet restr ebet",
+ "ooui-selectfile-dragdrop-placeholder": "Lezel ar restr amañ"
}
"authors": [
"Jagwar"
]
- }
+ },
+ "ooui-outline-control-move-down": "Hampidina ilay zavatra",
+ "ooui-outline-control-move-up": "Hampiakatra ilay zavatra",
+ "ooui-outline-control-remove": "Hanala iay zavatra",
+ "ooui-toolbar-more": "Be kokoa",
+ "ooui-toolgroup-expand": "Be kokoa",
+ "ooui-toolgroup-collapse": "Kely kokoa",
+ "ooui-dialog-message-accept": "OK",
+ "ooui-dialog-message-reject": "Avela",
+ "ooui-dialog-process-error": "Nisy hadisoana nitranga",
+ "ooui-dialog-process-dismiss": "Esorina",
+ "ooui-dialog-process-retry": "Andramana indray",
+ "ooui-dialog-process-continue": "Tohizana",
+ "ooui-selectfile-button-select": "Misafidia rakitra iray",
+ "ooui-selectfile-not-supported": "Tsy zaka ny fisafidiana rakitra",
+ "ooui-selectfile-placeholder": "Tsy misy rakitra voafidy",
+ "ooui-selectfile-dragdrop-placeholder": "Hametraka rakitra eto"
}
},
"ooui-outline-control-move-down": "Flytt element ned",
"ooui-outline-control-move-up": "Flytt element opp",
- "ooui-toolbar-more": "Fleire",
+ "ooui-toolbar-more": "Meir",
+ "ooui-toolgroup-expand": "Meir",
+ "ooui-toolgroup-collapse": "Færre",
+ "ooui-dialog-message-reject": "Bryt av",
+ "ooui-dialog-process-error": "Noko gjekk gale",
+ "ooui-dialog-process-dismiss": "Lat att",
+ "ooui-dialog-process-continue": "Hald fram",
"ooui-selectfile-button-select": "Vel ei fil",
"ooui-selectfile-placeholder": "Inga fil er vald"
}
{
"@metadata": {
"authors": [
- "Saanvel"
+ "Saanvel",
+ "Abbas dhothar"
]
},
"ooui-outline-control-move-down": "شیہ تھلے کرو",
"ooui-outline-control-remove": "شیہ مٹاؤ",
"ooui-toolbar-more": "ہور",
"ooui-toolgroup-expand": "ہور",
+ "ooui-toolgroup-collapse": "گھٹ",
"ooui-dialog-message-accept": "OK",
"ooui-dialog-message-reject": "مکاؤ",
"ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
"ooui-dialog-process-dismiss": "צומאַכן",
"ooui-dialog-process-retry": "פרובירט נאכאמאל",
"ooui-dialog-process-continue": "פֿארזעצן",
+ "ooui-selectfile-button-select": "קלויבט א טעקע",
"ooui-selectfile-not-supported": "טעקע אויסווייל נישט געשטיצט",
"ooui-selectfile-placeholder": "קיין טעקע נישט אויסגעוויילט"
}
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-element-hidden {
display: none !important;
/* stylelint-disable-line declaration-no-important */
cursor: default;
}
.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
display: inline-block;
vertical-align: middle;
}
}
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
- outline: none;
+ outline: 0;
}
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover > .oo-ui-iconElement-icon,
.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus > .oo-ui-iconElement-icon {
.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
border-color: #aaa;
- outline: none;
+ outline: 0;
}
.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
margin-left: -0.5em;
margin-right: -0.5em;
+ display: inline-block;
+ vertical-align: middle;
}
.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
margin-right: 0.3em;
position: relative;
}
.oo-ui-panelLayout-scrollable {
- overflow-y: auto;
+ overflow: auto;
-webkit-transform: translateZ(0);
transform: translateZ(0);
}
}
.oo-ui-popupWidget {
position: absolute;
- left: 0;
}
.oo-ui-popupWidget-popup {
position: relative;
display: block;
position: absolute;
/* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
- left: 0;
background-repeat: no-repeat;
}
.oo-ui-popupWidget-head {
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
border-color: rgba(0, 0, 0, 0.2);
- outline: none;
+ outline: 0;
}
.oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
color: #ccc;
-webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
-moz-transition: border-color 250ms ease, box-shadow 250ms ease;
transition: border-color 250ms ease, box-shadow 250ms ease;
+ /* stylelint-disable indentation */
+ /* stylelint-enable indentation */
}
.oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
.oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
background-color: transparent;
}
+.oo-ui-textInputWidget input::-webkit-input-placeholder,
+.oo-ui-textInputWidget textarea::-webkit-input-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-textInputWidget input:-ms-input-placeholder,
+.oo-ui-textInputWidget textarea:-ms-input-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-textInputWidget input::-moz-placeholder,
+.oo-ui-textInputWidget textarea::-moz-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-textInputWidget input:-moz-placeholder,
+.oo-ui-textInputWidget textarea:-moz-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-textInputWidget input::placeholder,
+.oo-ui-textInputWidget textarea::placeholder {
+ color: #72777d;
+ opacity: 1;
+}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
- outline: none;
+ outline: 0;
border-color: #a7dcff;
box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
}
-moz-box-sizing: border-box;
box-sizing: border-box;
}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
position: absolute;
+ top: 0;
+ height: 100%;
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
cursor: pointer;
.oo-ui-dropdownWidget-handle:hover {
border-color: rgba(0, 0, 0, 0.2);
}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
- top: 0;
- right: 0;
- margin: 0.775em;
-}
.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
- top: 0;
left: 0.25em;
- margin: 0.3em;
+ margin: 0 0.3em;
}
.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
line-height: 2.5em;
margin: 0 0.5em;
}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+ right: 0;
+ margin: 0 0.775em;
+}
.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
color: #ccc;
text-shadow: 0 1px 1px #fff;
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-element-hidden {
display: none !important;
/* stylelint-disable-line declaration-no-important */
cursor: default;
}
.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
-.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+.oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
display: inline-block;
vertical-align: middle;
}
.oo-ui-buttonElement > .oo-ui-buttonElement-button:focus::-moz-focus-inner {
border-color: transparent;
}
-.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
- margin-left: 0;
-}
.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
margin-right: 0.25em;
margin-left: 0.46875em;
padding-left: 2.4em;
}
.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
- padding: 0.546875em 1em;
+ position: relative;
min-height: 2.5em;
- min-width: 3.125em;
border-radius: 2px;
- position: relative;
+ padding: 0.546875em 1em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
+ min-width: 3.125em;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button {
+ min-width: 0;
}
.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
line-height: 1.25;
}
.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+ display: block;
position: absolute;
- top: 0.2em;
+ top: 0;
+ height: 100%;
left: 0.5625em;
}
.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
position: relative;
}
.oo-ui-panelLayout-scrollable {
- overflow-y: auto;
+ overflow: auto;
-webkit-transform: translateZ(0);
transform: translateZ(0);
}
margin-right: 0;
}
.oo-ui-horizontalLayout > .oo-ui-layout {
- margin-bottom: 0;
+ margin-top: 0;
}
.oo-ui-optionWidget {
position: relative;
}
.oo-ui-popupWidget {
position: absolute;
- left: 0;
}
.oo-ui-popupWidget-popup {
position: relative;
display: block;
position: absolute;
/* `top` property is to be set in theme's selector due to specific `@size-anchor` values */
- left: 0;
background-repeat: no-repeat;
}
.oo-ui-popupWidget-head {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
+.oo-ui-dropdownInputWidget-php {
+ border-right: 1px solid #a2a9b1;
+ border-radius: 2px;
+ overflow-x: hidden;
+}
.oo-ui-dropdownInputWidget select {
- background-color: #fff;
- height: 2.275em;
- font-size: inherit;
- font-family: inherit;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border: 1px solid #a2a9b1;
border-radius: 2px;
- padding-left: 1em;
+ padding: 0.5em 1em;
+ font-size: inherit;
+ font-family: inherit;
vertical-align: middle;
}
.oo-ui-dropdownInputWidget option {
height: 1.5em;
padding: 0.5em 1em;
}
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+ background-color: #f8f9fa;
+ background-position: -9999em 0;
+ background-repeat: no-repeat;
+ color: #222;
+ -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+ -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+ transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover {
+ background-color: #fff;
+ color: #444;
+ border-color: #a2a9b1;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:active {
+ color: #000;
+ border-color: #72777d;
+}
.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+ border-color: #36c;
outline: 0;
+ box-shadow: inset 0 0 0 1px #36c;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select::-ms-expand {
+ display: none;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:not( [no-ie] ) {
+ background-position: right 1.75em center;
+ width: calc( 100% + 1em );
+ height: 2.5em;
+ padding: 0 0 0 1em;
}
.oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+ background-color: #eaecf0;
color: #72777d;
border-color: #c8ccd1;
- background-color: #eaecf0;
}
.oo-ui-radioInputWidget {
position: relative;
-webkit-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-moz-transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
transition: border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+ /* stylelint-disable indentation */
+ /* stylelint-enable indentation */
}
.oo-ui-textInputWidget.oo-ui-widget-enabled input:hover,
.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:hover {
border-color: #c8ccd1;
box-shadow: inset 0 0 0 1px #c8ccd1;
}
-@media screen and (min-width: 0) {
- .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
- outline: 1px solid #36c;
- outline-offset: -2px;
- }
-}
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-webkit-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-webkit-input-placeholder {
color: #72777d;
opacity: 1;
}
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-moz-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-ms-input-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-ms-input-placeholder {
color: #72777d;
opacity: 1;
}
-.oo-ui-textInputWidget.oo-ui-widget-enabled :-ms-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::-moz-placeholder {
color: #72777d;
+ opacity: 1;
}
-.oo-ui-textInputWidget.oo-ui-widget-enabled ::-webkit-input-placeholder {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:-moz-placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:-moz-placeholder {
color: #72777d;
+ opacity: 1;
}
-.oo-ui-textInputWidget.oo-ui-widget-enabled :placeholder-shown {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input::placeholder,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea::placeholder {
color: #72777d;
+ opacity: 1;
+}
+@media screen and (min-width: 0) {
+ .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+ outline: 1px solid #36c;
+ outline-offset: -2px;
+ }
}
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid input,
.oo-ui-textInputWidget.oo-ui-widget-enabled.oo-ui-flaggedElement-invalid textarea {
}
.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
left: 0;
- height: 100%;
max-height: 2.375em;
margin-left: 0.5em;
background-position: right center;
}
.oo-ui-textInputWidget > .oo-ui-labelElement-label {
color: #72777d;
- padding: 0.4em;
- line-height: 1.5;
+ margin-top: 1px;
+ padding: 0.625em 0.546875em 0.546875em;
+ line-height: 1.172em;
}
.oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
margin-right: 2.0875em;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
-.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon,
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
position: absolute;
+ top: 0;
+ height: 100%;
}
.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
cursor: pointer;
border-radius: 2px;
}
.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
- top: 0;
right: 0;
- margin: 0.775em;
+ margin: 0 0.775em;
}
.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
- top: 0;
left: 0.25em;
- margin: 0.3em;
+ margin: 0 0.3em;
}
.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
margin: 0 1em;
.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
pointer-events: none;
}
-.oo-ui-comboBoxInputWidget input,
-.oo-ui-comboBoxInputWidget textarea {
+.oo-ui-comboBoxInputWidget input {
height: 2.5em;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty textarea {
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
border-right-width: 1px;
}
.oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
}
};
+/**
+ * Get the number of pixels that an element's content is scrolled to the left.
+ *
+ * Adapted from <https://github.com/othree/jquery.rtl-scroll-type>.
+ * Original code copyright 2012 Wei-Ko Kao, licensed under the MIT License.
+ *
+ * This function smooths out browser inconsistencies (nicely described in the README at
+ * <https://github.com/othree/jquery.rtl-scroll-type>) and produces a result consistent
+ * with Firefox's 'scrollLeft', which seems the sanest.
+ *
+ * @static
+ * @method
+ * @param {HTMLElement|Window} el Element to measure
+ * @return {number} Scroll position from the left.
+ * If the element's direction is LTR, this is a positive number between `0` (initial scroll position)
+ * and `el.scrollWidth - el.clientWidth` (furthest possible scroll position).
+ * If the element's direction is RTL, this is a negative number between `0` (initial scroll position)
+ * and `-el.scrollWidth + el.clientWidth` (furthest possible scroll position).
+ */
+OO.ui.Element.static.getScrollLeft = ( function () {
+ var rtlScrollType = null;
+
+ function test() {
+ var $definer = $( '<div dir="rtl" style="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll">A</div>' ),
+ definer = $definer[ 0 ];
+
+ $definer.appendTo( 'body' );
+ if ( definer.scrollLeft > 0 ) {
+ // Safari, Chrome
+ rtlScrollType = 'default';
+ } else {
+ definer.scrollLeft = 1;
+ if ( definer.scrollLeft === 0 ) {
+ // Firefox, old Opera
+ rtlScrollType = 'negative';
+ } else {
+ // Internet Explorer, Edge
+ rtlScrollType = 'reverse';
+ }
+ }
+ $definer.remove();
+ }
+
+ return function getScrollLeft( el ) {
+ var isRoot = el.window === el ||
+ el === el.ownerDocument.body ||
+ el === el.ownerDocument.documentElement,
+ scrollLeft = isRoot ? $( window ).scrollLeft() : el.scrollLeft,
+ // All browsers use the correct scroll type ('negative') on the root, so don't
+ // do any fixups when looking at the root element
+ direction = isRoot ? 'ltr' : $( el ).css( 'direction' );
+
+ if ( direction === 'rtl' ) {
+ if ( rtlScrollType === null ) {
+ test();
+ }
+ if ( rtlScrollType === 'reverse' ) {
+ scrollLeft = -scrollLeft;
+ } else if ( rtlScrollType === 'default' ) {
+ scrollLeft = scrollLeft - el.scrollWidth + el.clientWidth;
+ }
+ }
+
+ return scrollLeft;
+ };
+}() );
+
/**
* Get scrollable object parent
*
*/
OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension ) {
var i, val,
- // props = [ 'overflow' ] doesn't work due to https://bugzilla.mozilla.org/show_bug.cgi?id=889091
+ // Browsers do not correctly return the computed value of 'overflow' when 'overflow-x' and
+ // 'overflow-y' have different values, so we need to check the separate properties.
props = [ 'overflow-x', 'overflow-y' ],
$parent = $( el ).parent();
i = props.length;
while ( i-- ) {
val = $parent.css( props[ i ] );
+ // We assume that elements with 'overflow' (in any direction) set to 'hidden' will never be
+ // scrolled in that direction, but they can actually be scrolled programatically. The user can
+ // unintentionally perform a scroll in such case even if the application doesn't scroll
+ // programatically, e.g. when jumping to an anchor, or when using built-in find functionality.
+ // This could cause funny issues...
if ( val === 'auto' || val === 'scroll' ) {
return $parent[ 0 ];
}
if ( this.input instanceof OO.ui.InputWidget ) {
if ( this.input.getInputId() ) {
this.$element.attr( 'for', this.input.getInputId() );
+ } else {
+ this.$label.on( 'click', function () {
+ this.fieldWidget.focus();
+ return false;
+ }.bind( this ) );
}
}
this.$element.addClass( 'oo-ui-labelWidget' );
};
/**
- * Element that will stick under a specified container, even when it is inserted elsewhere in the
- * document (for example, in a OO.ui.Window's $overlay).
+ * Element that will stick adjacent to a specified container, even when it is inserted elsewhere
+ * in the document (for example, in an OO.ui.Window's $overlay).
*
* The elements's position is automatically calculated and maintained when window is resized or the
* page is scrolled. If you reposition the container manually, you have to call #position to make
* @constructor
* @param {Object} [config] Configuration options
* @cfg {jQuery} [$floatable] Node to position, assigned to #$floatable, omit to use #$element
- * @cfg {jQuery} [$floatableContainer] Node to position below
+ * @cfg {jQuery} [$floatableContainer] Node to position adjacent to
+ * @cfg {string} [verticalPosition='below'] Where to position $floatable vertically:
+ * 'below': Directly below $floatableContainer, aligning f's top edge with fC's bottom edge
+ * 'above': Directly above $floatableContainer, aligning f's bottom edge with fC's top edge
+ * 'top': Align the top edge with $floatableContainer's top edge
+ * 'bottom': Align the bottom edge with $floatableContainer's bottom edge
+ * 'center': Vertically align the center with $floatableContainer's center
+ * @cfg {string} [horizontalPosition='start'] Where to position $floatable horizontally:
+ * 'before': Directly before $floatableContainer, aligning f's end edge with fC's start edge
+ * 'after': Directly after $floatableContainer, algining f's start edge with fC's end edge
+ * 'start': Align the start (left in LTR, right in RTL) edge with $floatableContainer's start edge
+ * 'end': Align the end (right in LTR, left in RTL) edge with $floatableContainer's end edge
+ * 'center': Horizontally align the center with $floatableContainer's center
*/
OO.ui.mixin.FloatableElement = function OoUiMixinFloatableElement( config ) {
// Configuration initialization
// Initialization
this.setFloatableContainer( config.$floatableContainer );
this.setFloatableElement( config.$floatable || this.$element );
+ this.setVerticalPosition( config.verticalPosition || 'below' );
+ this.setHorizontalPosition( config.horizontalPosition || 'start' );
};
/* Methods */
/**
* Set floatable container.
*
- * The element will be always positioned under the specified container.
+ * The element will be positioned relative to the specified container.
*
* @param {jQuery|null} $floatableContainer Container to keep visible, or null to unset
*/
}
};
+/**
+ * Change how the element is positioned vertically.
+ *
+ * @param {string} position 'below', 'above', 'top', 'bottom' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setVerticalPosition = function ( position ) {
+ if ( [ 'below', 'above', 'top', 'bottom', 'center' ].indexOf( position ) === -1 ) {
+ throw new Error( 'Invalid value for vertical position: ' + position );
+ }
+ this.verticalPosition = position;
+ if ( this.$floatable ) {
+ this.position();
+ }
+};
+
+/**
+ * Change how the element is positioned horizontally.
+ *
+ * @param {string} position 'before', 'after', 'start', 'end' or 'center'
+ */
+OO.ui.mixin.FloatableElement.prototype.setHorizontalPosition = function ( position ) {
+ if ( [ 'before', 'after', 'start', 'end', 'center' ].indexOf( position ) === -1 ) {
+ throw new Error( 'Invalid value for horizontal position: ' + position );
+ }
+ this.horizontalPosition = position;
+ if ( this.$floatable ) {
+ this.position();
+ }
+};
+
/**
* Toggle positioning.
*
positioning = positioning === undefined ? !this.positioning : !!positioning;
+ if ( positioning && !this.warnedUnattached && !this.isElementAttached() ) {
+ OO.ui.warnDeprecation( 'FloatableElement#togglePositioning: Before calling this method, the element must be attached to the DOM.' );
+ this.warnedUnattached = true;
+ }
+
if ( this.positioning !== positioning ) {
this.positioning = positioning;
+ this.needsCustomPosition =
+ this.verticalPostion !== 'below' ||
+ this.horizontalPosition !== 'start' ||
+ !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
+
closestScrollableOfContainer = OO.ui.Element.static.getClosestScrollableContainer( this.$floatableContainer[ 0 ] );
- this.needsCustomPosition = !OO.ui.contains( this.$floatableContainer[ 0 ], this.$floatable[ 0 ] );
// If the scrollable is the root, we have to listen to scroll events
// on the window because of browser inconsistencies.
if ( $( closestScrollableOfContainer ).is( 'html, body' ) ) {
* @return {boolean}
*/
OO.ui.mixin.FloatableElement.prototype.isElementInViewport = function ( $element, $container ) {
- var elemRect, contRect,
- leftEdgeInBounds = false,
- bottomEdgeInBounds = false,
- rightEdgeInBounds = false;
+ var elemRect, contRect, topEdgeInBounds, bottomEdgeInBounds, leftEdgeInBounds, rightEdgeInBounds,
+ startEdgeInBounds, endEdgeInBounds,
+ direction = $element.css( 'direction' );
elemRect = $element[ 0 ].getBoundingClientRect();
if ( $container[ 0 ] === window ) {
contRect = $container[ 0 ].getBoundingClientRect();
}
- // For completeness, if we still cared about topEdgeInBounds, that'd be:
- // elemRect.top >= contRect.top && elemRect.top <= contRect.bottom
- if ( elemRect.left >= contRect.left && elemRect.left <= contRect.right ) {
- leftEdgeInBounds = true;
+ topEdgeInBounds = elemRect.top >= contRect.top && elemRect.top <= contRect.bottom;
+ bottomEdgeInBounds = elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom;
+ leftEdgeInBounds = elemRect.left >= contRect.left && elemRect.left <= contRect.right;
+ rightEdgeInBounds = elemRect.right >= contRect.left && elemRect.right <= contRect.right;
+ if ( direction === 'rtl' ) {
+ startEdgeInBounds = rightEdgeInBounds;
+ endEdgeInBounds = leftEdgeInBounds;
+ } else {
+ startEdgeInBounds = leftEdgeInBounds;
+ endEdgeInBounds = rightEdgeInBounds;
}
- if ( elemRect.bottom >= contRect.top && elemRect.bottom <= contRect.bottom ) {
- bottomEdgeInBounds = true;
+
+ if ( this.verticalPosition === 'below' && !bottomEdgeInBounds ) {
+ return false;
}
- if ( elemRect.right >= contRect.left && elemRect.right <= contRect.right ) {
- rightEdgeInBounds = true;
+ if ( this.verticalPosition === 'above' && !topEdgeInBounds ) {
+ return false;
+ }
+ if ( this.horizontalPosition === 'before' && !startEdgeInBounds ) {
+ return false;
+ }
+ if ( this.horizontalPosition === 'after' && !endEdgeInBounds ) {
+ return false;
}
- // We only care that any part of the bottom edge is visible
- return bottomEdgeInBounds && ( leftEdgeInBounds || rightEdgeInBounds );
+ // The other positioning values are all about being inside the container,
+ // so in those cases all we care about is that any part of the container is visible.
+ return elemRect.top <= contRect.bottom && elemRect.bottom >= contRect.top &&
+ elemRect.left <= contRect.right && elemRect.right >= contRect.left;
};
/**
* @chainable
*/
OO.ui.mixin.FloatableElement.prototype.position = function () {
- var pos;
+ var containerPos, direction, $offsetParent, isBody, scrollableX, scrollableY,
+ horizScrollbarHeight, vertScrollbarWidth, scrollTop, scrollLeft,
+ newPos = { top: '', left: '', bottom: '', right: '' };
if ( !this.positioning ) {
return this;
return;
}
- pos = OO.ui.Element.static.getRelativePosition( this.$floatableContainer, this.$floatable.offsetParent() );
- // Position under container
- pos.top += this.$floatableContainer.height();
- // In LTR, we position from the left, and pos.left is already set
- // In RTL, we position from the right instead.
- if ( this.$floatableContainer.css( 'direction' ) === 'rtl' ) {
- pos.right = this.$floatable.offsetParent().width() - pos.left - this.$floatableContainer.outerWidth();
- delete pos.left;
+ direction = this.$floatableContainer.css( 'direction' );
+ $offsetParent = this.$floatable.offsetParent();
+ if ( $offsetParent.is( 'html' ) ) {
+ // The innerHeight/Width and clientHeight/Width calculations don't work well on the
+ // <html> element, but they do work on the <body>
+ $offsetParent = $( $offsetParent[ 0 ].ownerDocument.body );
+ }
+ isBody = $offsetParent.is( 'body' );
+ scrollableX = $offsetParent.css( 'overflow-x' ) === 'scroll' || $offsetParent.css( 'overflow-x' ) === 'auto';
+ scrollableY = $offsetParent.css( 'overflow-y' ) === 'scroll' || $offsetParent.css( 'overflow-y' ) === 'auto';
+
+ vertScrollbarWidth = $offsetParent.innerWidth() - $offsetParent.prop( 'clientWidth' );
+ horizScrollbarHeight = $offsetParent.innerHeight() - $offsetParent.prop( 'clientHeight' );
+ // We don't need to compute and add scrollTop and scrollLeft if the scrollable container is the body,
+ // or if it isn't scrollable
+ scrollTop = scrollableY && !isBody ? $offsetParent.scrollTop() : 0;
+ scrollLeft = scrollableX && !isBody ? OO.ui.Element.static.getScrollLeft( $offsetParent[ 0 ] ) : 0;
+
+ // Avoid passing the <body> to getRelativePosition(), because it won't return what we expect
+ // if the <body> has a margin
+ containerPos = isBody ?
+ this.$floatableContainer.offset() :
+ OO.ui.Element.static.getRelativePosition( this.$floatableContainer, $offsetParent );
+ containerPos.bottom = containerPos.top + this.$floatableContainer.outerHeight();
+ containerPos.right = containerPos.left + this.$floatableContainer.outerWidth();
+ containerPos.start = direction === 'rtl' ? containerPos.right : containerPos.left;
+ containerPos.end = direction === 'rtl' ? containerPos.left : containerPos.right;
+
+ if ( this.verticalPosition === 'below' ) {
+ newPos.top = containerPos.bottom;
+ } else if ( this.verticalPosition === 'above' ) {
+ newPos.bottom = $offsetParent.outerHeight() - containerPos.top;
+ } else if ( this.verticalPosition === 'top' ) {
+ newPos.top = containerPos.top;
+ } else if ( this.verticalPosition === 'bottom' ) {
+ newPos.bottom = $offsetParent.outerHeight() - containerPos.bottom;
+ } else if ( this.verticalPosition === 'center' ) {
+ newPos.top = containerPos.top +
+ ( this.$floatableContainer.height() - this.$floatable.height() ) / 2;
+ }
+
+ if ( this.horizontalPosition === 'before' ) {
+ newPos.end = containerPos.start;
+ } else if ( this.horizontalPosition === 'after' ) {
+ newPos.start = containerPos.end;
+ } else if ( this.horizontalPosition === 'start' ) {
+ newPos.start = containerPos.start;
+ } else if ( this.horizontalPosition === 'end' ) {
+ newPos.end = containerPos.end;
+ } else if ( this.horizontalPosition === 'center' ) {
+ newPos.left = containerPos.left +
+ ( this.$floatableContainer.width() - this.$floatable.width() ) / 2;
+ }
+
+ if ( newPos.start !== undefined ) {
+ if ( direction === 'rtl' ) {
+ newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.start;
+ } else {
+ newPos.left = newPos.start;
+ }
+ delete newPos.start;
+ }
+ if ( newPos.end !== undefined ) {
+ if ( direction === 'rtl' ) {
+ newPos.left = newPos.end;
+ } else {
+ newPos.right = ( isBody ? $( $offsetParent[ 0 ].ownerDocument.documentElement ) : $offsetParent ).outerWidth() - newPos.end;
+ }
+ delete newPos.end;
+ }
+
+ // Account for scroll position
+ if ( newPos.top !== '' ) {
+ newPos.top += scrollTop;
+ }
+ if ( newPos.bottom !== '' ) {
+ newPos.bottom -= scrollTop;
+ }
+ if ( newPos.left !== '' ) {
+ newPos.left += scrollLeft;
+ }
+ if ( newPos.right !== '' ) {
+ newPos.right -= scrollLeft;
}
- this.$floatable.css( pos );
+
+ // Account for scrollbar gutter
+ if ( newPos.bottom !== '' ) {
+ newPos.bottom -= horizScrollbarHeight;
+ }
+ if ( direction === 'rtl' ) {
+ if ( newPos.left !== '' ) {
+ newPos.left -= vertScrollbarWidth;
+ }
+ } else {
+ if ( newPos.right !== '' ) {
+ newPos.right -= vertScrollbarWidth;
+ }
+ }
+
+ this.$floatable.css( newPos );
// We updated the position, so re-evaluate the clipping state.
// (ClippableElement does not listen to 'scroll' events on $floatableContainer's parent, and so
OO.ui.mixin.ClippableElement.prototype.toggleClipping = function ( clipping ) {
clipping = clipping === undefined ? !this.clipping : !!clipping;
+ if ( clipping && !this.warnedUnattached && !this.isElementAttached() ) {
+ OO.ui.warnDeprecation( 'ClippableElement#toggleClipping: Before calling this method, the element must be attached to the DOM.' );
+ this.warnedUnattached = true;
+ }
+
if ( this.clipping !== clipping ) {
this.clipping = clipping;
if ( clipping ) {
* By default, each popup has an anchor that points toward its origin.
* Please see the [OOjs UI documentation on Mediawiki] [1] for more information and examples.
*
+ * Unlike most widgets, PopupWidget is initially hidden and must be shown by calling #toggle.
+ *
* @example
* // A popup widget.
* var popup = new OO.ui.PopupWidget( {
};
/**
+ * Toggle visibility of the popup. The popup is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the popup while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
* @inheritdoc
*/
OO.ui.PopupWidget.prototype.toggle = function ( show ) {
change = show !== this.isVisible();
+ if ( show && !this.warnedUnattached && !this.isElementAttached() ) {
+ OO.ui.warnDeprecation( 'PopupWidget#toggle: Before calling this method, the popup must be attached to the DOM.' );
+ this.warnedUnattached = true;
+ }
+
// Parent method
OO.ui.PopupWidget.parent.prototype.toggle.call( this, show );
* - Down-arrow key: highlight the next menu option
* - Esc key: hide the menu
*
+ * Unlike most widgets, MenuSelectWidget is initially hidden and must be shown by calling #toggle.
+ *
* Please see the [OOjs UI documentation on MediaWiki][1] for more information.
* [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options
*
* that toggles the menu's visibility on click, the menu will be hidden then re-shown when the user clicks
* that button, unless the button (or its parent widget) is passed in here.
* @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu.
+ * @cfg {boolean} [hideOnChoose=true] Hide the menu when the user chooses an option.
* @cfg {boolean} [filterFromInput=false] Filter the displayed options from the input
*/
OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
// Properties
this.autoHide = config.autoHide === undefined || !!config.autoHide;
+ this.hideOnChoose = config.hideOnChoose === undefined || !!config.hideOnChoose;
this.filterFromInput = !!config.filterFromInput;
this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
this.$widget = config.widget ? config.widget.$element : null;
/**
* Choose an item.
*
- * When a user chooses an item, the menu is closed.
+ * When a user chooses an item, the menu is closed, unless the hideOnChoose config option is set to false.
*
* Note that ‘choose’ should never be modified programmatically. A user can choose an option with the keyboard
* or mouse and it becomes selected. To select an item programmatically, use the #selectItem method.
*/
OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
OO.ui.MenuSelectWidget.parent.prototype.chooseItem.call( this, item );
- this.toggle( false );
+ if ( this.hideOnChoose ) {
+ this.toggle( false );
+ }
return this;
};
};
/**
+ * Toggle visibility of the menu. The menu is initially hidden and must be shown by calling
+ * `.toggle( true )` after its #$element is attached to the DOM.
+ *
+ * Do not show the menu while it is not attached to the DOM. The calculations required to display
+ * it in the right place and with the right dimensions only work correctly while it is attached.
+ * Side-effects may include broken interface and exceptions being thrown. This wasn't always
+ * strictly enforced, so currently it only generates a warning in the browser console.
+ *
* @inheritdoc
*/
OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
change = visible !== this.isVisible();
+ if ( visible && !this.warnedUnattached && !this.isElementAttached() ) {
+ OO.ui.warnDeprecation( 'MenuSelectWidget#toggle: Before calling this method, the menu must be attached to the DOM.' );
+ this.warnedUnattached = true;
+ }
+
// Parent method
OO.ui.MenuSelectWidget.parent.prototype.toggle.call( this, visible );
* @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
* in the upper-right corner of the rendered field; clicking it will display the text in a popup.
* For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
*
* @throws {Error} An error is thrown if no widget is specified
*/
this.align = null;
if ( config.help ) {
this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+ $overlay: config.$overlay,
popup: {
padded: true
},
if ( fieldWidget.constructor.static.supportsSimpleLabel ) {
if ( this.fieldWidget.getInputId() ) {
this.$label.attr( 'for', this.fieldWidget.getInputId() );
+ } else {
+ this.$label.on( 'click', function () {
+ this.fieldWidget.focus();
+ return false;
+ }.bind( this ) );
}
}
this.$element
* @cfg {string|OO.ui.HtmlSnippet} [help] Help text. When help text is specified, a "help" icon will appear
* in the upper-right corner of the rendered field; clicking it will display the text in a popup.
* For important messages, you are advised to use `notices`, as they are always shown.
+ * @cfg {jQuery} [$overlay] Passed to OO.ui.PopupButtonWidget for help popup, if `help` is given.
*/
OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
// Configuration initialization
this.$header = $( '<div>' );
if ( config.help ) {
this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
+ $overlay: config.$overlay,
popup: {
padded: true
},
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
z-index: 4;
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-tool.oo-ui-widget-enabled {
-webkit-transition: background-color 100ms;
-moz-transition: background-color 100ms;
height: 2.5em;
width: 1.875em;
}
-.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
- line-height: 2.1;
-}
.oo-ui-toolGroup {
display: inline-block;
vertical-align: middle;
width: 1.875em;
min-width: 1.875em;
}
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title,
-.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
- line-height: 2;
-}
.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
padding-left: 0.5em;
color: #222;
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
cursor: move;
display: inline-block;
}
.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
- overflow-y: hidden;
+ overflow: hidden;
}
.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
width: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
- overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
- padding: 2em;
-}
.oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 3em;
- overflow-y: auto;
+ overflow: auto;
}
.oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
position: absolute;
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
position: absolute;
+ top: 0;
+ height: 100%;
}
.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
cursor: default;
border-width: 1px 0 1px 1px;
}
.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
- top: 0;
left: 0;
- height: 2.3em;
margin-left: 0.3em;
}
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
- top: 0;
right: 0;
- height: 2.3em;
margin-right: 0.775em;
}
.oo-ui-selectFileWidget-label {
background-color: #a7dcff;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
- font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
- opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
- color: #777;
-}
.oo-ui-outlineControlsWidget {
height: 3em;
background-color: #fff;
display: block;
position: relative;
}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+ position: absolute;
+ top: 0;
+ height: 100%;
+}
.oo-ui-capsuleMultiselectWidget-content {
position: relative;
}
.oo-ui-capsuleMultiselectWidget-handle:last-child {
margin-right: 0;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
- position: absolute;
-}
.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
border: 0;
line-height: 1.675em;
background-color: transparent;
color: #000;
vertical-align: middle;
+ /* stylelint-disable indentation */
+ /* stylelint-enable indentation */
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
- outline: none;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
+ color: #72777d;
+ opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
- padding-right: 2.4875em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
+ color: #72777d;
+ opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
- right: 0;
- top: 0;
- margin: 0.775em;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
+ color: #72777d;
+ opacity: 1;
+}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
+ outline: 0;
}
.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
padding-left: 2.475em;
}
.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
left: 0;
- top: 0;
- margin: 0.3em;
+ margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+ padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+ right: 0;
+ margin: 0 0.775em;
}
.oo-ui-capsuleMultiselectWidget:hover .oo-ui-capsuleMultiselectWidget-handle {
border-color: rgba(0, 0, 0, 0.2);
cursor: text;
}
.oo-ui-capsuleItemWidget:focus {
- outline: none;
+ outline: 0;
border-color: #087ecc;
}
.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
cursor: move;
.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement {
display: inline-block;
}
+.oo-ui-draggableElement-handle:focus {
+ border-radius: 2px;
+ box-shadow: inset 0 0 0 1px #36c, 0 0 0 1px #36c;
+ outline: 0;
+}
.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
- overflow-y: hidden;
+ overflow: hidden;
}
.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
width: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
- overflow-y: auto;
-}
-.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
- padding: 2em;
-}
.oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 3em;
- overflow-y: auto;
+ overflow: auto;
}
.oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
position: absolute;
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
position: absolute;
+ top: 0;
+ height: 100%;
}
.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
cursor: default;
}
.oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
left: 0;
- top: 0;
- height: 2.3em;
margin-left: 0.5em;
}
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
- top: 0;
right: 0;
- height: 2.3em;
margin-right: 0.775em;
}
.oo-ui-selectFileWidget-label {
.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-label {
right: 2em;
}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
- background-color: #eaf3ff;
-}
.oo-ui-selectFileWidget-dropTarget {
background-color: #fff;
border: 1px solid #a2a9b1;
+ border-radius: 2px;
vertical-align: middle;
overflow: hidden;
- border-radius: 2px;
}
.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
border-radius: 2px;
white-space: normal;
}
.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget {
- background-color: #eee;
+ background-color: #fff;
border-style: dashed;
+ -webkit-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+ -moz-transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+ transition: background-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), color 200ms cubic-bezier(0.39, 0.575, 0.565, 1), border-color 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-selectFileWidget-empty.oo-ui-widget-enabled.oo-ui-selectFileWidget-dropTarget:hover {
+ border-color: #72777d;
+}
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop.oo-ui-selectFileWidget-dropTarget {
+ background-color: #eaf3ff;
+ color: #36c;
}
.oo-ui-selectFileWidget.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled.oo-ui-selectFileWidget-dropTarget,
.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
left: 4em;
}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
- font-weight: bold;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
- opacity: 0.5;
-}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
- color: #777;
-}
.oo-ui-outlineControlsWidget {
height: 3em;
background-color: #fff;
display: block;
position: relative;
}
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon,
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+ position: absolute;
+ top: 0;
+ height: 100%;
+}
.oo-ui-capsuleMultiselectWidget-content {
position: relative;
}
.oo-ui-capsuleMultiselectWidget-handle:last-child {
margin-right: 0;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator,
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
- position: absolute;
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
+ border: 0;
+ line-height: 1.675;
+ margin: 0 0 0 0.2em;
+ padding: 0;
+ font-size: inherit;
+ font-family: inherit;
+ background-color: transparent;
+ color: #000;
+ vertical-align: middle;
+ /* stylelint-disable indentation */
+ /* stylelint-enable indentation */
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-webkit-input-placeholder {
color: #72777d;
opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-moz-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-ms-input-placeholder {
color: #72777d;
opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :-ms-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::-moz-placeholder {
color: #72777d;
+ opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content ::-webkit-input-placeholder {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:-moz-placeholder {
color: #72777d;
+ opacity: 1;
}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content :placeholder-shown {
+.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input::placeholder {
color: #72777d;
-}
-.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input {
- border: 0;
- line-height: 1.675;
- margin: 0 0 0 0.2em;
- padding: 0;
- font-size: inherit;
- font-family: inherit;
- background-color: transparent;
- color: #000;
- vertical-align: middle;
+ opacity: 1;
}
.oo-ui-capsuleMultiselectWidget-handle > .oo-ui-capsuleMultiselectWidget-content > input:focus {
outline: 0;
}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
- padding-right: 2.4875em;
-}
-.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
- right: 0;
- top: 0;
- margin: 0.775em;
-}
.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle {
padding-left: 2.475em;
}
.oo-ui-capsuleMultiselectWidget.oo-ui-iconElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-iconElement-icon {
left: 0;
- top: 0;
- margin: 0.3em;
+ margin: 0 0.3em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle {
+ padding-right: 2.4875em;
+}
+.oo-ui-capsuleMultiselectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiselectWidget-handle > .oo-ui-indicatorElement-indicator {
+ right: 0;
+ margin: 0 0.775em;
}
.oo-ui-capsuleMultiselectWidget-popup {
margin-top: -1px;
display: inline-block;
cursor: default;
white-space: nowrap;
- width: auto;
- max-width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
- vertical-align: middle;
+ width: auto;
+ max-width: 100%;
height: 1.7em;
- line-height: 1.7;
- background-color: #eee;
- color: #222;
margin: 0.1em;
border: 1px solid #a2a9b1;
border-radius: 2px;
padding: 0 0.4em;
+ line-height: 1.7;
+ vertical-align: middle;
}
.oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
display: inline-block;
overflow: hidden;
cursor: text;
}
-.oo-ui-capsuleItemWidget:focus {
- outline: 0;
- border-color: #36c;
- box-shadow: inset 0 0 0 1px #36c;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
- background-color: #eaecf0;
- color: #72777d;
- border-color: #c8ccd1;
- text-shadow: 0 1px 1px #fff;
-}
-.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
- display: none;
-}
.oo-ui-capsuleItemWidget.oo-ui-widget-enabled {
+ background-color: #f8f9fa;
+ color: #222;
padding-right: 1.5375em;
+ -webkit-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+ -moz-transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+ transition: background-color 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:hover {
+ background-color: #fff;
+ color: #444;
+ border-color: #a2a9b1;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-enabled:focus {
+ border-color: #36c;
+ box-shadow: inset 0 0 0 1px #36c;
+ outline: 0;
}
.oo-ui-capsuleItemWidget.oo-ui-widget-enabled > .oo-ui-buttonElement {
display: block;
bottom: 0;
height: auto;
}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
+ background-color: #eaecf0;
+ color: #72777d;
+ border-color: #c8ccd1;
+ text-shadow: 0 1px 1px #fff;
+}
+.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-buttonElement {
+ display: none;
+}
.oo-ui-searchWidget-query {
position: absolute;
top: 0;
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
}
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:25Z
+ * Date: 2017-02-28T23:19:44Z
*/
+/* stylelint-disable selector-no-vendor-prefix, at-rule-no-unknown */
+/* stylelint-enable selector-no-vendor-prefix, at-rule-no-unknown */
.oo-ui-window {
background: transparent;
}
.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless:active {
background-color: rgba(0, 0, 0, 0.1);
}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:hover {
background-color: rgba(8, 126, 204, 0.05);
}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive:active {
background-color: rgba(8, 126, 204, 0.1);
}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-constructive .oo-ui-labelElement-label {
font-weight: bold;
}
.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless.oo-ui-flaggedElement-destructive:hover,
/*!
- * OOjs UI v0.19.2
+ * OOjs UI v0.19.4
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-02-14T22:47:20Z
+ * Date: 2017-02-28T23:19:40Z
*/
( function ( OO ) {
"rtl": "images/icons/articleRedirect-rtl.svg"
} },
"searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+ "searchDiacritics": { "file": "images/icons/diacritic.svg" },
"searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
"specialCharacter": { "file": "images/icons/specialCharacter.svg" },
"table": { "file": "images/icons/table.svg" },
} },
"clear": { "file": "images/icons/clear.svg" },
"clock": { "file": "images/icons/clock.svg" },
+ "feedback": { "file": {
+ "ltr": "images/icons/feedback-ltr.svg",
+ "rtl": "images/icons/feedback-rtl.svg"
+ } },
"funnel": { "file": {
"ltr": "images/icons/funnel-ltr.svg",
"rtl": "images/icons/funnel-rtl.svg"
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="regular-expression">
+ <g id="case-sensitive">
<path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
<path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
</g>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="diacritic">
+ <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+ <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+ <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
+ <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
"rtl": "images/icons/articleRedirect-rtl.svg"
} },
"searchCaseSensitive": { "file": "images/icons/case-sensitive.svg" },
+ "searchDiacritics": { "file": "images/icons/diacritic.svg" },
"searchRegularExpression": { "file": "images/icons/regular-expression.svg" },
"specialCharacter": { "file": "images/icons/specialCharacter.svg" },
"table": { "file": "images/icons/table.svg" },
} },
"clear": { "file": "images/icons/clear.svg" },
"clock": { "file": "images/icons/clock.svg" },
+ "feedback": {
+ "file": {
+ "ltr": "images/icons/feedback-ltr.svg",
+ "rtl": "images/icons/feedback-rtl.svg"
+ },
+ "variants": [ "progressive" ]
+ },
"funnel": { "file": {
"ltr": "images/icons/funnel-ltr.svg",
"rtl": "images/icons/funnel-rtl.svg"
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
- <g id="regular-expression">
+ <g id="case-sensitive">
<path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
<path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
</g>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
- <g id="regular-expression">
+ <g id="case-sensitive">
<path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
<path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
</g>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="regular-expression">
+ <g id="case-sensitive">
<path id="upper-case" d="M7.53 7L4 17h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 7h-2.12zm1.064 1.53L9.938 13H7.25l1.344-4.47z"/>
<path id="lower-case" d="M18.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.564 0-.955-.208-1.377-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.322-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.688-1.4c.877-.46 1.85-.69 2.916-.69 1.024 0 1.59.22 2.134.662.545.445.818 1.12.818 2.03V17h-1.45m-.394-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.336.87 1.008.87.48 0 .865-.137 1.152-.414.29-.277.436-.645.436-1.103v-.627"/>
</g>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+ <g id="diacritic">
+ <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+ <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+ </g>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+ <g id="diacritic">
+ <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+ <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+ </g>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="diacritic">
+ <path id="letter-a" d="M13.55 17l-.184-1.035h-.055c-.35.44-.71.747-1.08.92-.37.167-.85.25-1.44.25-.563 0-.954-.208-1.376-.625-.42-.418-.627-1.012-.627-1.784 0-.808.283-1.403.846-1.784.568-.386 1.193-.607 2.208-.64l1.323-.04v-.335c0-.772-.396-1.158-1.187-1.158-.61 0-1.325.18-2.147.55l-.69-1.4c.878-.46 1.85-.69 2.917-.69 1.024 0 1.59.22 2.134.66.546.446.82 1.12.82 2.03V17h-1.45m-.395-3.527l-.802.027c-.604.018-1.054.127-1.35.327-.294.2-.442.504-.442.912 0 .58.337.87 1.01.87.48 0 .864-.138 1.15-.415.29-.277.437-.645.437-1.103v-.627"/>
+ <path id="tilde" d="M12.012 7.527l-.466-.306a.832.832 0 0 1-.085-.048c-.264-.17-.467-.256-.608-.256a.518.518 0 0 0-.466.256c-.107.17-.16.418-.16.743v.066H9.047c0-.748.144-1.326.432-1.733.294-.407.703-.61 1.228-.61.203 0 .406.037.61.114.208.073.43.19.66.357l.517.355c.124.082.237.146.338.19a.77.77 0 0 0 .288.066c.204 0 .362-.088.475-.265.113-.176.17-.42.17-.735v-.066h1.177c0 .75-.147 1.327-.44 1.735-.29.407-.695.61-1.22.61-.203 0-.4-.032-.593-.098a3.107 3.107 0 0 1-.678-.373z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+ <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+ <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+ <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+ <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</g></svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
+</svg>
+++ /dev/null
-/*!
- * Skip function for dom-level2-shim module.
- *
- * Tests for window.Node because that's the only thing that this shim is adding.
- */
-return !!window.Node;
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
/* Table Sorting */
font-size: 0.9em;
}
-#wpSummary {
+input#wpSummary {
display: block;
+ background-color: #fff;
+ color: #000;
+ width: 80%;
margin-top: 0;
- margin-bottom: 0.5em;
+ margin-bottom: 1em;
+ padding: 0.625em 0.546875em 0.546875em;
+ border: 1px solid #a2a9b1;
+ border-radius: 2px;
+ box-shadow: inset 0 0 0 1px #fff;
+ font-family: inherit;
+ font-size: inherit;
+ -webkit-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+ -moz-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+ transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+}
+
+input#wpSummary:focus,
+input#wpSummary:active {
+ outline: 0;
+ border-color: #36c;
+ box-shadow: inset 0 0 0 1px #36c;
}
.editButtons input:first-child {
/* Styles for the JavaScript enhancements of the history page */
-#pagehistory li.before input[name="oldid"],
-#pagehistory li.after input[name="diff"] {
+#pagehistory li.before input[name='oldid'],
+#pagehistory li.after input[name='diff'] {
visibility: hidden;
}
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
.mw-category {
.column-count(3);
}
.skin-monobook .postedit {
- top: 6em !important;
+ top: 6em !important; /* stylelint-disable-line declaration-no-important */
}
.postedit-faded {
list-style: none none;
display: inline;
/* shared.css has some very weird directionality-specific rules for 'ul' we need to override,
- search for "Correct directionality when page dir is different from site/user dir" */
+ * search for "Correct directionality when page dir is different from site/user dir" */
+ /* stylelint-disable declaration-no-important */
margin: 0 !important;
padding: 0 !important;
+ /* stylelint-enable declaration-no-important */
}
/* @noflip */
* MediaWiki-specific elements
*/
#globalWrapper {
- width: 100% !important;
- min-width: 0 !important;
+ width: 100% !important; /* stylelint-disable-line declaration-no-important */
+ min-width: 0 !important; /* stylelint-disable-line declaration-no-important */
}
.mw-body {
background: #fff;
color: #000;
- border: 0 !important;
- padding: 0 !important;
- margin: 0 !important;
+ border: 0 !important; /* stylelint-disable-line declaration-no-important */
+ padding: 0 !important; /* stylelint-disable-line declaration-no-important */
+ margin: 0 !important; /* stylelint-disable-line declaration-no-important */
direction: ltr;
}
#column-content {
- margin: 0 !important;
+ margin: 0 !important; /* stylelint-disable-line declaration-no-important */
}
#column-content .mw-body {
padding: 1em;
- margin: 0 !important;
+ margin: 0 !important; /* stylelint-disable-line declaration-no-important */
}
#toc {
* Links
*/
a {
- background: none !important;
- padding: 0 !important;
+ background: none !important; /* stylelint-disable-line declaration-no-important */
+ padding: 0 !important; /* stylelint-disable-line declaration-no-important */
}
/* Expand URLs for printing */
.mw-body a.external.text:after,
.mw-body a.external.autonumber:after {
- content: " (" attr( href ) ")";
+ content: ' (' attr( href ) ')';
word-break: break-all;
word-wrap: break-word;
}
/* Expand protocol-relative URLs for printing */
.mw-body a.external.text[href^='//']:after,
.mw-body a.external.autonumber[href^='//']:after {
- content: " (https:" attr( href ) ")";
+ content: ' (https:' attr( href ) ')';
}
a,
a.new,
a.stub {
/* IE 6 & 7 don't understand `inherit` */
- color: #000 !important;
- text-decoration: none !important;
+ color: #000 !important; /* stylelint-disable-line declaration-no-important */
+ text-decoration: none !important; /* stylelint-disable-line declaration-no-important */
/* Modern browser will apply this, IE 6 & 7 ignore the unknown */
- color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
- text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties */
+ color: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
+ text-decoration: inherit !important; /* stylelint-disable-line declaration-block-no-duplicate-properties, declaration-no-important */
}
/**
/* Input types that should follow user direction, like buttons */
/* TODO: What about buttons in wikipage content ? */
-input[type="submit"],
-input[type="button"],
-input[type="reset"],
-input[type="file"] {
+input[type='submit'],
+input[type='button'],
+input[type='reset'],
+input[type='file'] {
direction: ltr;
}
/* Override default values */
-textarea[dir="ltr"],
-input[dir="ltr"] {
+textarea[dir='ltr'],
+input[dir='ltr'] {
/* @noflip */
direction: ltr;
}
-textarea[dir="rtl"],
-input[dir="rtl"] {
+textarea[dir='rtl'],
+input[dir='rtl'] {
/* @noflip */
direction: rtl;
}
white-space: nowrap;
}
-input#wpSummary {
- background-color: #fff;
- color: #000;
- width: 80%;
- margin-bottom: 1em;
- padding: 0.625em 0.546875em 0.546875em;
- border: 1px solid #a2a9b1;
- border-radius: 2px;
- box-shadow: inset 0 0 0 1px #fff;
- font-family: inherit;
- font-size: inherit;
- -webkit-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
- -moz-transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
- transition: border-color 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
-}
-
-input#wpSummary:focus,
-input#wpSummary:active {
- outline: 0;
- border-color: #36c;
- box-shadow: inset 0 0 0 1px #36c;
-}
-
.mw-input-with-label {
white-space: nowrap;
display: inline-block;
/* Plainlinks - this can be used to switch
* off special external link styling */
.plainlinks a.external {
- background: none !important;
- padding: 0 !important;
+ background: none !important; /* stylelint-disable-line declaration-no-important */
+ padding: 0 !important; /* stylelint-disable-line declaration-no-important */
}
/* External URLs should always be treated as LTR (T6330) */
}
.mw-small-spinner {
- padding: 10px !important;
+ padding: 10px !important; /* stylelint-disable-line declaration-no-important */
margin-right: 0.6em;
background-image: url( images/spinner.gif );
background-position: center center;
h1:lang( sa ),
h1:lang( ta ),
h1:lang( te ) {
- line-height: 1.6em !important;
+ line-height: 1.6em !important; /* stylelint-disable-line declaration-no-important */
}
/* stylelint-disable selector-list-comma-newline-after */
// Common Less mixin library for MediaWiki
//
// By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
-// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+// which makes this file importable by all less files via `@import 'mediawiki.mixins';`.
//
// The mixins included below are considered a public interface for MediaWiki extensions.
// The signatures of parametrized mixins should be kept as stable as possible.
}
.flex-display( @display: flex ) {
- display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
- display: ~"-moz-@{display}"; // Firefox 21-
- display: ~"-ms-@{display}box"; // IE 10
+ display: ~'-webkit-@{display}'; // iOS 6-, Safari 3.1-6
+ display: ~'-moz-@{display}'; // Firefox 21-
+ display: ~'-ms-@{display}box'; // IE 10
display: @display;
}
// Screen Reader Helper Mixin
.mixin-screen-reader-text() {
display: block;
- position: absolute !important;
+ position: absolute !important; /* stylelint-disable-line declaration-no-important */
clip: rect( 1px, 1px, 1px, 1px );
width: 1px;
height: 1px;
// This is a separate file because importing the mixin causes
// the keyframes blocks to be included in the output, regardless
// of whether .rotation is used.
-@import "mediawiki.mixins.animation";
+@import 'mediawiki.mixins.animation';
.rotate-frames() {
from {
line-height: normal;
font-weight: normal;
- & > input[type="checkbox"],
- & > input[type="radio"] {
+ & > input[type='checkbox'],
+ & > input[type='radio'] {
width: auto;
height: auto;
margin: 0 0.1em 0 0;
* Update the model with an updated list of changes
*
* @param {jQuery|string} changesListContent
+ * @param {jQuery} $fieldset
*/
- mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent ) {
+ mw.rcfilters.dm.ChangesListViewModel.prototype.update = function ( changesListContent, $fieldset ) {
this.valid = true;
- this.emit( 'update', changesListContent );
+ this.emit( 'update', changesListContent, $fieldset );
};
}( mediaWiki ) );
/* Methods */
+ /**
+ * Return the representation of the state of this item.
+ *
+ * @return {Object} State of the object
+ */
+ mw.rcfilters.dm.FilterItem.prototype.getState = function () {
+ return {
+ selected: this.isSelected(),
+ included: this.isIncluded(),
+ conflicted: this.isConflicted(),
+ fullyCovered: this.isFullyCovered()
+ };
+ };
+
/**
* Get the name of this filter
*
// For example, see two groups with conflicts:
// userExpLevel: [
// {
- // name: 'experienced',
- // conflicts: [ 'unregistered' ]
+ // name: 'experienced',
+ // conflicts: [ 'unregistered' ]
// }
// ],
// registration: [
// {
- // name: 'registered',
+ // name: 'registered',
// },
// {
- // name: 'unregistered',
+ // name: 'unregistered',
// }
// ]
// If we select 'experienced', then 'unregistered' is in conflict (and vice versa),
// Check all filter interactions
this.filtersModel.reassessFilterInteractions();
- this.updateURL();
this.updateChangesList();
};
// Check all filter interactions
this.filtersModel.reassessFilterInteractions();
- this.updateURL();
this.updateChangesList();
};
obj[ filterName ] = isSelected;
this.filtersModel.updateFilters( obj );
- this.updateURL();
this.updateChangesList();
// Check filter interactions
/**
* Update the URL of the page to reflect current filters
+ *
+ * This should not be called directly from outside the controller.
+ * If an action requires changing the URL, it should either use the
+ * highlighting actions below, or call #updateChangesList which does
+ * the uri corrections already.
+ *
+ * @private
+ * @param {Object} [params] Extra parameters to add to the API call
*/
- mw.rcfilters.Controller.prototype.updateURL = function () {
- var uri = this.getUpdatedUri();
+ mw.rcfilters.Controller.prototype.updateURL = function ( params ) {
+ var uri;
+
+ params = params || {};
+
+ uri = this.getUpdatedUri();
+ uri.extend( params );
+
window.history.pushState( { tag: 'rcfilters' }, document.title, uri.toString() );
};
* Fetch the list of changes from the server for the current filters
*
* @return {jQuery.Promise} Promise object that will resolve with the changes list
+ * or with a string denoting no results.
*/
mw.rcfilters.Controller.prototype.fetchChangesList = function () {
var uri = this.getUpdatedUri(),
latestRequest = function () {
return requestId === this.requestCounter;
}.bind( this );
- uri.extend( this.filtersModel.getParametersFromFilters() );
+
return $.ajax( uri.toString(), { contentType: 'html' } )
- .then( function ( html ) {
- return latestRequest() ?
- $( $.parseHTML( html ) ).find( '.mw-changeslist' ).first().contents() :
- null;
- } ).then( null, function () {
- return latestRequest() ? 'NO_RESULTS' : null;
- } );
+ .then(
+ // Success
+ function ( html ) {
+ var $parsed;
+ if ( !latestRequest() ) {
+ return $.Deferred().reject();
+ }
+
+ $parsed = $( $.parseHTML( html ) );
+
+ return {
+ // Changes list
+ changes: $parsed.find( '.mw-changeslist' ).first().contents(),
+ // Fieldset
+ fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+ };
+ },
+ // Failure
+ function ( responseObj ) {
+ var $parsed;
+
+ if ( !latestRequest() ) {
+ return $.Deferred().reject();
+ }
+
+ $parsed = $( $.parseHTML( responseObj.responseText ) );
+
+ // Force a resolve state to this promise
+ return $.Deferred().resolve( {
+ changes: 'NO_RESULTS',
+ fieldset: $parsed.find( 'fieldset.rcoptions' ).first()
+ } ).promise();
+ }
+ );
};
/**
* Update the list of changes and notify the model
+ *
+ * @param {Object} [params] Extra parameters to add to the API call
*/
- mw.rcfilters.Controller.prototype.updateChangesList = function () {
+ mw.rcfilters.Controller.prototype.updateChangesList = function ( params ) {
+ this.updateURL( params );
this.changesListModel.invalidate();
this.fetchChangesList()
- .always( function ( changesListContent ) {
- if ( changesListContent ) {
- this.changesListModel.update( changesListContent );
- }
- }.bind( this ) );
+ .then(
+ // Success
+ function ( pieces ) {
+ var $changesListContent = pieces.changes,
+ $fieldset = pieces.fieldset;
+
+ this.changesListModel.update( $changesListContent, $fieldset );
+ }.bind( this )
+ // Do nothing for failure
+ );
};
/**
// eslint-disable-next-line no-new
new mw.rcfilters.ui.FormWrapperWidget(
- changesListModel, $( '.rcoptions form' ) );
+ changesListModel, controller, $( 'fieldset.rcoptions' ) );
controller.initialize( {
registration: {
}
} );
- $( '.rcoptions' ).before( filtersWidget.$element );
+ $( '.rcfilters-container' ).append( filtersWidget.$element );
$( 'body' ).append( $overlay );
// HACK: Remove old-style filter links for filters handled by the widget
} );
window.addEventListener( 'popstate', function () {
- controller.updateFromURL();
controller.updateChangesList();
} );
+
+ $( 'a.mw-helplink' ).attr(
+ 'href',
+ 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:New_filters_for_edit_review'
+ );
}
};
// Corrections for the standard special page
-.rcoptions {
- border: 0;
- border-bottom: 1px solid #a2a9b1;
+.client-js{
+ .rcoptions {
+ border: 0;
+ border-bottom: 1px solid #a2a9b1;
- legend {
- display: none;
+ legend {
+ display: none;
+ }
+
+ &:not( .mw-rcfilters-ui-ready ) {
+ /* @embed */
+ background-image: url( ../images/pending.gif );
+ margin: 0;
+
+ * {
+ visibility: hidden;
+ }
+ }
}
+
+ .rcfilters-container {
+ min-height: 100px;
+ margin: 0;
+
+ &:not( .mw-rcfilters-ui-ready ) {
+ /* @embed */
+ background-image: url( ../images/pending.gif );
+ }
+ }
+}
+
+.mw-rcfilters-staticfilters-selected {
+ font-weight: bold;
}
-@import "mediawiki.mixins";
-@import "mw.rcfilters.variables";
+@import 'mediawiki.mixins';
+@import 'mw.rcfilters.variables';
// This is a general mixin for a color circle
.mw-rcfilters-mixin-circle( @color: white, @diameter: 2em, @padding: 0.5em, @border: false ) {
// a color class on its parent element
.result-circle( @colorName: 'none' ) {
&-@{colorName} {
- .mw-rcfilters-mixin-circle( ~"@{highlight-@{colorName}}", @result-circle-diameter, 0 );
+ .mw-rcfilters-mixin-circle( ~'@{highlight-@{colorName}}', @result-circle-diameter, 0 );
display: none;
.mw-rcfilters-highlight-color-@{colorName} & {
// This mixin produces color mixes for two, three and four colors
.highlight-color-mix( @color1, @color2, @color3: false, @color4: false ) {
- @highlight-color-class-var: ~".mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}";
+ @highlight-color-class-var: ~'.mw-rcfilters-highlight-color-@{color1}.mw-rcfilters-highlight-color-@{color2}';
// The nature of these variables and them being inside
// a 'tint' and 'average' LESS functions is such where
// the parsing is failing if it is done inside those functions.
// Instead, we first construct their LESS variable names,
// and then we call them inside those functions by calling @@var
- @c1var: ~"highlight-@{color1}";
- @c2var: ~"highlight-@{color2}";
+ @c1var: ~'highlight-@{color1}';
+ @c2var: ~'highlight-@{color2}';
// Two colors
@{highlight-color-class-var} when ( @color3 = false ) and ( @color4 = false ) and not ( @color1 = false ), ( @color2 = false ) {
}
// Three colors
@{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3} when ( @color4 = false ) and not ( @color3 = false ) {
- @c3var: ~"highlight-@{color3}";
+ @c3var: ~'highlight-@{color3}';
background-color: tint( mix( @@c1var, average( @@c2var, @@c3var ), 33% ), 30% );
}
// Four colors
@{highlight-color-class-var}.mw-rcfilters-highlight-color-@{color3}.mw-rcfilters-highlight-color-@{color4} when not ( @color4 = false ) {
- @c3var: ~"highlight-@{color3}";
- @c4var: ~"highlight-@{color4}";
+ @c3var: ~'highlight-@{color3}';
+ @c4var: ~'highlight-@{color4}';
background-color: tint( mix( @@c1var, mix( @@c2var, average( @@c3var, @@c4var ), 25% ), 25% ), 25% );
}
}
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
.mw-rcfilters-ui-capsuleItemWidget {
+ background-color: #fff;
+ border-color: #979797;
+ color: #222;
+
+ &-muted {
+ // Muted state
+ background-color: #eaecf0;
+ border-color: #c8ccd1;
+ .oo-ui-labelElement-label {
+ color: #72777d;
+ }
+
+ .oo-ui-buttonWidget {
+ opacity: @muted-opacity;
+ }
+ }
+
+ &-selected {
+ background-color: #eaf3ff;
+ border-color: #36c;
+ }
+
&-popup-content {
padding: 0.5em;
color: #54595d;
cursor: pointer;
}
- &-muted {
- // Muted state
- // We want everything muted except the circle
- background-color: rgba( 255, 255, 255, @muted-opacity );
-
- .oo-ui-labelElement-label,
- .oo-ui-buttonWidget {
- opacity: @muted-opacity;
- }
- }
-
&-highlight {
display: none;
padding-right: 0.5em;
}
- &[data-color="c1"] {
- .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~"0 0.5em 0 0" );
+ &[data-color='c1'] {
+ .mw-rcfilters-mixin-circle( @highlight-c1, 0.7em, ~'0 0.5em 0 0' );
}
- &[data-color="c2"] {
- .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~"0 0.5em 0 0" );
+ &[data-color='c2'] {
+ .mw-rcfilters-mixin-circle( @highlight-c2, 0.7em, ~'0 0.5em 0 0' );
}
- &[data-color="c3"] {
- .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~"0 0.5em 0 0" );
+ &[data-color='c3'] {
+ .mw-rcfilters-mixin-circle( @highlight-c3, 0.7em, ~'0 0.5em 0 0' );
}
- &[data-color="c4"] {
- .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~"0 0.5em 0 0" );
+ &[data-color='c4'] {
+ .mw-rcfilters-mixin-circle( @highlight-c4, 0.7em, ~'0 0.5em 0 0' );
}
- &[data-color="c5"] {
- .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~"0 0.5em 0 0" );
+ &[data-color='c5'] {
+ .mw-rcfilters-mixin-circle( @highlight-c5, 0.7em, ~'0 0.5em 0 0' );
}
}
}
list-style: none;
// Each li's margin-left should be the width of the highlights
// element + the margin
- margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+ margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
}
}
// Correction for Enhanced RC
// This is outside the scope of the 'highlights' wrapper
table.mw-enhanced-rc {
- margin-left: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )";
+ margin-left: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 + @{result-circle-general-margin} )';
td:last-child {
width: 100%;
text-align: right;
// The width is 5 circles times their diameter + individual margin
// and then plus the general margin
- width: ~"calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )";
+ width: ~'calc( ( @{result-circle-diameter} + @{result-circle-margin} ) * 5 )';
// And we want to shift the entire block to the left of the li
position: absolute;
left: 0;
text-align: right;
padding-left: 0.5em;
}
-
- .oo-ui-capsuleItemWidget {
- color: #222;
- background-color: #fff;
- }
}
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
.mw-rcfilters-ui-filterGroupWidget {
padding-bottom: 0.5em;
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
.mw-rcfilters-ui-filterItemHighlightButton {
- &-circle {
+ .oo-ui-buttonWidget.oo-ui-popupButtonWidget .oo-ui-buttonElement-button > &-circle {
display: inline-block;
vertical-align: middle;
background-image: none;
&-c1 {
// These values duplicate the sizing of the icon
// width/height 1.875em
- .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0 );
+ .mw-rcfilters-mixin-circle( @highlight-c1, 1.875em, 0.2em 0 );
}
&-c2 {
- .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0 );
+ .mw-rcfilters-mixin-circle( @highlight-c2, 1.875em, 0.2em 0 );
}
&-c3 {
- .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0 );
+ .mw-rcfilters-mixin-circle( @highlight-c3, 1.875em, 0.2em 0 );
}
&-c4 {
- .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0 );
+ .mw-rcfilters-mixin-circle( @highlight-c4, 1.875em, 0.2em 0 );
}
&-c5 {
- .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0 );
+ .mw-rcfilters-mixin-circle( @highlight-c5, 1.875em, 0.2em 0 );
}
}
}
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
.mw-rcfilters-ui-filterItemWidget {
padding: 0 0.5em;
}
}
+ &-selected {
+ background-color: #eaf3ff; // Accent90 AAA
+ }
+
&-label {
&-title {
font-weight: bold;
- font-size: 1.2em;
+ font-size: 1.15em;
color: #222;
}
&-desc {
&-filterCheckbox {
.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
// Override margin-top and -bottom rules from FieldLayout
- margin: 0 !important;
+ margin: 0 !important; /* stylelint-disable-line declaration-no-important */
}
-
}
&-highlightButton {
&-popup {
// We have to override OOUI's definition, which is set
// on the inline style of the popup
- margin-top: 2.4em !important;
+ margin-top: 2.4em !important; /* stylelint-disable-line declaration-no-important */
max-width: 650px;
+
+ .oo-ui-popupWidget-body {
+ max-height: 70vh;
+ }
+
+ .oo-ui-popupWidget-footer {
+ background-color: #f8f9fa;
+ text-align: right;
+ padding: 0.5em;
+ }
}
&-search {
-@import "mw.rcfilters.mixins";
+@import 'mw.rcfilters.mixins';
.mw-rcfilters-ui-highlightColorPickerWidget {
&-label {
&-none {
.mw-rcfilters-mixin-circle( @highlight-none, 2em, 0.5em, true );
+ // Override border to dashed
+ border: 1px dashed #565656;
&.oo-ui-buttonOptionWidget.oo-ui-buttonElement-active,
&.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
this.model = model;
this.$overlay = config.$overlay || this.$element;
this.positioned = false;
+ this.popupTimeoutShow = null;
+ this.popupTimeoutHide = null;
// Parent constructor
mw.rcfilters.ui.CapsuleItemWidget.parent.call( this, $.extend( {
.prepend( this.$highlight )
.attr( 'aria-haspopup', 'true' )
.addClass( 'mw-rcfilters-ui-capsuleItemWidget' )
- .on( 'mouseover', this.onHover.bind( this, true ) )
- .on( 'mouseout', this.onHover.bind( this, false ) );
+ .on( 'mouseenter', this.onMouseEnter.bind( this ) )
+ .on( 'mouseleave', this.onMouseLeave.bind( this ) );
this.setCurrentMuteState();
this.setHighlightColor();
e.stopPropagation();
};
+ /**
+ * Emit a click event when the capsule is clicked so we can aggregate this
+ * in the parent (the capsule)
+ */
+ mw.rcfilters.ui.CapsuleItemWidget.prototype.onClick = function () {
+ this.emit( 'click' );
+ };
+
/**
* Override the event listening to the item close button click
*/
};
/**
- * Respond to hover event on the capsule item.
- *
- * @param {boolean} isHovering Mouse is hovering on the item
+ * Respond to mouse enter event
*/
- mw.rcfilters.ui.CapsuleItemWidget.prototype.onHover = function ( isHovering ) {
+ mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
if ( this.model.getDescription() ) {
- this.popup.toggle( isHovering );
-
- if ( isHovering && !this.positioned ) {
+ if ( !this.positioned ) {
// Recalculate position to be center of the capsule item
this.popup.$element.css( 'margin-left', ( this.$element.width() / 2 ) );
this.positioned = true;
}
+
+ // Set timeout for the popup to show
+ this.popupTimeoutShow = setTimeout( function () {
+ this.popup.toggle( true );
+ }.bind( this ), 500 );
+
+ // Cancel the hide timeout
+ clearTimeout( this.popupTimeoutHide );
+ this.popupTimeoutHide = null;
+ }
+ };
+
+ /**
+ * Respond to mouse leave event
+ */
+ mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseLeave = function () {
+ this.popupTimeoutHide = setTimeout( function () {
+ this.popup.toggle( false );
+ }.bind( this ), 250 );
+
+ // Clear the show timeout
+ clearTimeout( this.popupTimeoutShow );
+ this.popupTimeoutShow = null;
+ };
+
+ /**
+ * Set selected state on this widget
+ *
+ * @param {boolean} [isSelected] Widget is selected
+ */
+ mw.rcfilters.ui.CapsuleItemWidget.prototype.toggleSelected = function ( isSelected ) {
+ isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+ if ( this.selected !== isSelected ) {
+ this.selected = isSelected;
+
+ this.$element.toggleClass( 'mw-rcfilters-ui-capsuleItemWidget-selected', this.selected );
}
};
this.controller = controller;
this.model = model;
-
this.filterInput = filterInput;
+ this.isSelecting = false;
+ this.selected = null;
this.resetButton = new OO.ui.ButtonWidget( {
icon: 'trash',
itemUpdate: 'onModelItemUpdate',
highlightChange: 'onModelHighlightChange'
} );
+ this.aggregate( { click: 'capsuleItemClick' } );
+
// Add the filterInput as trigger
this.filterInput.$input
.on( 'focus', this.focus.bind( this ) );
this.emptyFilterMessage.toggle( currFiltersAreEmpty );
};
+ /**
+ * Mark an item widget as selected
+ *
+ * @param {mw.rcfilters.ui.CapsuleItemWidget} item Capsule widget
+ */
+ mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.select = function ( item ) {
+ if ( this.selected !== item ) {
+ // Unselect previous
+ if ( this.selected ) {
+ this.selected.toggleSelected( false );
+ }
+
+ // Select new one
+ this.selected = item;
+ if ( this.selected ) {
+ item.toggleSelected( true );
+ }
+ }
+ };
+
+ /**
+ * Reset selection and remove selected states from all items
+ */
+ mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.resetSelection = function () {
+ if ( this.selected !== null ) {
+ this.selected = null;
+ this.getItems().forEach( function ( capsuleWidget ) {
+ capsuleWidget.toggleSelected( false );
+ } );
+ }
+ };
+
/**
* @inheritdoc
*/
this.controller = controller;
this.model = model;
+ this.filters = {};
// Mixin constructors
OO.ui.mixin.GroupWidget.call( this, config );
this.$element
.addClass( 'mw-rcfilters-ui-filterGroupWidget' )
+ .addClass( 'mw-rcfilters-ui-filterGroupWidget-name-' + this.model.getName() )
.append(
this.$label,
this.$group
);
};
+ /**
+ * Get an item widget from its filter name
+ *
+ * @param {string} filterName Filter name
+ * @return {mw.rcfilters.ui.FilterItemWidget} Item widget
+ */
+ mw.rcfilters.ui.FilterGroupWidget.prototype.getItemWidget = function ( filterName ) {
+ return this.filters[ filterName ];
+ };
+
+ /**
+ * Populate data from the model
+ */
mw.rcfilters.ui.FilterGroupWidget.prototype.populateFromModel = function () {
var widget = this;
+ this.clearItems();
+ this.filters = {};
+
this.addItems(
this.model.getItems().map( function ( filterItem ) {
- return new mw.rcfilters.ui.FilterItemWidget(
+ var groupWidget = new mw.rcfilters.ui.FilterItemWidget(
widget.controller,
filterItem,
{
$overlay: widget.$overlay
}
);
+
+ widget.filters[ filterItem.getName() ] = groupWidget;
+
+ return groupWidget;
} )
);
};
anchor: false,
padded: true,
align: 'backwards',
+ horizontalPosition: 'end',
+ $floatableContainer: this.$element,
width: 290,
$content: this.colorPickerWidget.$element
}
this.controller = controller;
this.model = model;
+ this.selected = false;
this.checkboxWidget = new mw.rcfilters.ui.CheckboxInputWidget( {
value: this.model.getName(),
this.setCurrentMuteState();
};
+ /**
+ * Set selected state on this widget
+ *
+ * @param {boolean} [isSelected] Widget is selected
+ */
+ mw.rcfilters.ui.FilterItemWidget.prototype.toggleSelected = function ( isSelected ) {
+ isSelected = isSelected !== undefined ? isSelected : !this.selected;
+
+ if ( this.selected !== isSelected ) {
+ this.selected = isSelected;
+
+ this.$element.toggleClass( 'mw-rcfilters-ui-filterItemWidget-selected', this.selected );
+ }
+ };
+
/**
* Set the current mute state for this item
*/
'mw-rcfilters-ui-filterItemWidget-muted',
this.model.isConflicted() ||
this.model.isIncluded() ||
- this.model.isFullyCovered() ||
(
// Item is also muted when any of the items in its group is active
this.model.getGroupModel().isActive() &&
* @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
*/
mw.rcfilters.ui.FilterWrapperWidget = function MwRcfiltersUiFilterWrapperWidget( controller, model, config ) {
+ var $footer = $( '<div>' );
config = config || {};
// Parent
}
);
+ $footer.append(
+ new OO.ui.ButtonWidget( {
+ framed: false,
+ icon: 'feedback',
+ flags: [ 'progressive' ],
+ label: mw.msg( 'rcfilters-filterlist-feedbacklink' ),
+ href: 'https://www.mediawiki.org/wiki/Help_talk:New_filters_for_edit_review'
+ } ).$element
+ );
+
this.textInput = new OO.ui.TextInputWidget( {
classes: [ 'mw-rcfilters-ui-filterWrapperWidget-search' ],
icon: 'search',
$overlay: this.$overlay,
popup: {
$content: this.filterPopup.$element,
+ $footer: $footer,
classes: [ 'mw-rcfilters-ui-filterWrapperWidget-popup' ],
width: 650
}
// Events
this.model.connect( this, {
- initialize: 'onModelInitialize'
+ initialize: 'onModelInitialize',
+ itemUpdate: 'onModelItemUpdate'
} );
this.textInput.connect( this, {
change: 'onTextInputChange'
} );
+ this.capsule.connect( this, { capsuleItemClick: 'onCapsuleItemClick' } );
+ this.capsule.popup.connect( this, { toggle: 'onCapsulePopupToggle' } );
+
+ // Initialize
this.$element
.addClass( 'mw-rcfilters-ui-filterWrapperWidget' )
+ .addClass( 'mw-rcfilters-ui-ready' )
.append( this.capsule.$element, this.textInput.$element );
};
OO.inheritClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.Widget );
OO.mixinClass( mw.rcfilters.ui.FilterWrapperWidget, OO.ui.mixin.PendingElement );
+ /**
+ * Respond to capsule item click and make the popup scroll down to the requested item
+ *
+ * @param {mw.rcfilters.ui.CapsuleItemWidget} item Clicked item
+ */
+ mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsuleItemClick = function ( item ) {
+ var filterName = item.getData(),
+ // Find the item in the popup
+ filterWidget = this.filterPopup.getItemWidget( filterName );
+
+ // Highlight item
+ this.filterPopup.select( filterName );
+ this.capsule.select( item );
+
+ this.scrollToTop( filterWidget.$element );
+ };
+
+ /**
+ * Respond to popup toggle event. Reset selection in the list when the popup is closed.
+ *
+ * @param {boolean} isVisible Popup is visible
+ */
+ mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupToggle = function ( isVisible ) {
+ if ( !isVisible ) {
+ this.filterPopup.resetSelection();
+ this.capsule.resetSelection();
+ } else {
+ this.scrollToTop( this.capsule.$element, 10 );
+ }
+ };
+
/**
* Respond to text input change
*
* @param {string} newValue Current value
*/
mw.rcfilters.ui.FilterWrapperWidget.prototype.onTextInputChange = function ( newValue ) {
+ this.filterPopup.resetSelection();
+
// Filter the results
this.filterPopup.filter( this.model.findMatches( newValue ) );
+ this.capsule.popup.clip();
};
/**
}
} );
};
+
+ /**
+ * Respond to item update and reset the selection. This will make it so that
+ * any actual interaction with the system resets the selection state of any item.
+ */
+ mw.rcfilters.ui.FilterWrapperWidget.prototype.onModelItemUpdate = function () {
+ this.filterPopup.resetSelection();
+ };
+
+ /**
+ * Scroll the element to top within its container
+ *
+ * @private
+ * @param {jQuery} $element Element to position
+ * @param {number} [marginFromTop] When scrolling the entire widget to the top, leave this
+ * much space (in pixels) above the widget.
+ */
+ mw.rcfilters.ui.FilterWrapperWidget.prototype.scrollToTop = function ( $element, marginFromTop ) {
+ var container = OO.ui.Element.static.getClosestScrollableContainer( $element[ 0 ], 'y' ),
+ pos = OO.ui.Element.static.getRelativePosition( $element, $( container ) );
+
+ // Scroll to item
+ $( container ).animate( {
+ scrollTop: $( container ).scrollTop() + pos.top + ( marginFromTop || 0 )
+ } );
+ };
}( mediaWiki ) );
this.controller = controller;
this.model = model;
this.$overlay = config.$overlay || this.$element;
+ this.groups = {};
+ this.selected = null;
this.highlightButton = new OO.ui.ButtonWidget( {
label: mw.message( 'rcfilters-highlightbutton-title' ).text(),
// Reset
this.clearItems();
+ this.groups = {};
this.addItems(
Object.keys( this.model.getFilterGroups() ).map( function ( groupName ) {
- return new mw.rcfilters.ui.FilterGroupWidget(
+ var groupWidget = new mw.rcfilters.ui.FilterGroupWidget(
widget.controller,
widget.model.getGroup( groupName ),
{
$overlay: widget.$overlay
}
);
+
+ widget.groups[ groupName ] = groupWidget;
+ return groupWidget;
} )
);
};
this.controller.toggleHighlight();
};
+ /**
+ * Find the filter item widget that corresponds to the item name
+ *
+ * @param {string} itemName Filter name
+ * @return {mw.rcfilters.ui.FilterItemWidget} Filter widget
+ */
+ mw.rcfilters.ui.FiltersListWidget.prototype.getItemWidget = function ( itemName ) {
+ var filterItem = this.model.getItemByName( itemName ),
+ // Find the group
+ groupWidget = this.groups[ filterItem.getGroupName() ];
+
+ // Find the item inside the group
+ return groupWidget.getItemWidget( itemName );
+ };
+
+ /**
+ * Mark an item widget as selected
+ *
+ * @param {string} itemName Filter name
+ */
+ mw.rcfilters.ui.FiltersListWidget.prototype.select = function ( itemName ) {
+ var filterWidget;
+
+ if ( this.selected !== itemName ) {
+ // Unselect previous
+ if ( this.selected ) {
+ filterWidget = this.getItemWidget( this.selected );
+ filterWidget.toggleSelected( false );
+ }
+
+ // Select new one
+ this.selected = itemName;
+ if ( this.selected ) {
+ filterWidget = this.getItemWidget( this.selected );
+ filterWidget.toggleSelected( true );
+ }
+ }
+ };
+
+ /**
+ * Reset selection and remove selected states from all items
+ */
+ mw.rcfilters.ui.FiltersListWidget.prototype.resetSelection = function () {
+ if ( this.selected !== null ) {
+ this.selected = null;
+ this.getItems().forEach( function ( groupWidget ) {
+ groupWidget.getItems().forEach( function ( filterItemWidget ) {
+ filterItemWidget.toggleSelected( false );
+ } );
+ } );
+ }
+ };
+
/**
* Switch between showing the 'no results' message for filtering results or the result list.
*
*
* @constructor
* @param {mw.rcfilters.dm.ChangesListViewModel} model Changes list view model
+ * @param {mw.rcfilters.Controller} controller RCfilters controller
* @param {jQuery} $formRoot Root element of the form to attach to
* @param {Object} config Configuration object
*/
- mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( model, $formRoot, config ) {
+ mw.rcfilters.ui.FormWrapperWidget = function MwRcfiltersUiFormWrapperWidget( model, controller, $formRoot, config ) {
config = config || {};
// Parent
mw.rcfilters.ui.FormWrapperWidget.parent.call( this, $.extend( {}, config, {
$element: $formRoot
} ) );
+ // Mixin constructors
+ OO.ui.mixin.PendingElement.call( this, config );
this.model = model;
- this.$submitButton = this.$element.find( 'input[type=submit]' );
+ this.controller = controller;
+ this.$submitButton = this.$element.find( 'form input[type=submit]' );
+
+ this.$element
+ .on( 'click', 'a[data-params]', this.onLinkClick.bind( this ) );
+
+ this.$element
+ .on( 'submit', 'form', this.onFormSubmit.bind( this ) );
// Events
this.model.connect( this, {
invalidate: 'onModelInvalidate',
update: 'onModelUpdate'
} );
+
+ // Initialize
+ this.cleanupForm();
+ this.$element
+ .addClass( 'mw-rcfilters-ui-FormWrapperWidget' )
+ .addClass( 'mw-rcfilters-ui-ready' );
};
/* Initialization */
OO.inheritClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.Widget );
+ OO.mixinClass( mw.rcfilters.ui.FormWrapperWidget, OO.ui.mixin.PendingElement );
+
+ /**
+ * Clean up the base form we're getting from the back-end.
+ * Remove <strong> tags and replace those with classes, so
+ * we can toggle those on click.
+ */
+ mw.rcfilters.ui.FormWrapperWidget.prototype.cleanupForm = function () {
+ this.$element.find( '[data-keys] strong' ).each( function () {
+ $( this )
+ .parent().addClass( 'mw-rcfilters-staticfilters-selected' );
+
+ $( this )
+ .replaceWith( $( this ).contents() );
+ } );
+ };
+
+ /**
+ * Respond to link click
+ *
+ * @param {jQuery.Event} e Event
+ * @return {boolean} false
+ */
+ mw.rcfilters.ui.FormWrapperWidget.prototype.onLinkClick = function ( e ) {
+ var $element = $( e.target ),
+ data = $element.data( 'params' ),
+ keys = $element.data( 'keys' ),
+ $similarElements = $element.parent().find( '[data-keys="' + keys + '"]' );
+
+ // Only highlight choice if this link isn't a show/hide link
+ if ( !$element.parents( '.rcshowhideoption' ).length ) {
+ // Remove the class from similar elements
+ $similarElements.removeClass( 'mw-rcfilters-staticfilters-selected' );
+ // Add the class to this element
+ $element.addClass( 'mw-rcfilters-staticfilters-selected' );
+ }
+
+ e.stopPropagation();
+
+ this.controller.updateChangesList( data );
+ return false;
+ };
+
+ /**
+ * Respond to form submit event
+ *
+ * @param {jQuery.Event} e Event
+ * @return {boolean} false
+ */
+ mw.rcfilters.ui.FormWrapperWidget.prototype.onFormSubmit = function ( e ) {
+ var data = {};
+
+ // Collect all data from form
+ $( e.target ).find( 'input:not([type="hidden"],[type="submit"]), select' ).each( function () {
+ if ( !$( this ).is( ':checkbox' ) || $( this ).is( ':checked' ) ) {
+ data[ $( this ).prop( 'name' ) ] = $( this ).val();
+ }
+ } );
+
+ this.controller.updateChangesList( data );
+ return false;
+ };
/**
* Respond to model invalidate
*/
mw.rcfilters.ui.FormWrapperWidget.prototype.onModelInvalidate = function () {
+ this.pushPending();
this.$submitButton.prop( 'disabled', true );
};
/**
- * Respond to model update
+ * Respond to model update, replace the show/hide links with the ones from the
+ * server so they feature the correct state.
+ *
+ * @param {jQuery|string} $changesList Updated changes list
+ * @param {jQuery} $fieldset Updated fieldset
*/
- mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function () {
+ mw.rcfilters.ui.FormWrapperWidget.prototype.onModelUpdate = function ( $changesList, $fieldset ) {
this.$submitButton.prop( 'disabled', false );
+
+ // Replace the links we have in the content
+ // We don't want to replace the entire thing, because there is a big difference between
+ // the links in the backend and the links we have initialized, since we are removing
+ // the ones that are implemented in the new system
+ this.$element.find( '.rcshowhide' ).children().each( function () {
+ // Go over existing links and replace only them
+ var classes = $( this ).attr( 'class' ).split( ' ' ),
+ // Look for that item in the fieldset from the server
+ $remoteItem = $fieldset.find( '.' + classes.join( '.' ) );
+
+ if ( $remoteItem ) {
+ $( this ).replaceWith( $remoteItem );
+ }
+ } );
+
+ this.popPending();
};
}( mediaWiki ) );
padding-right: 15px;
}
-.mw-body a.external[href^="mailto:"],
+.mw-body a.external[href^='mailto:'],
.link-mailto {
background: url( images/mail.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href^="ftp://"],
+.mw-body a.external[href^='ftp://'],
.link-ftp {
background: url( images/ftp-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href^="irc://"],
-.mw-body a.external[href^="ircs://"],
+.mw-body a.external[href^='irc://'],
+.mw-body a.external[href^='ircs://'],
.link-irc {
background: url( images/chat-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$=".ogg"],
-.mw-body a.external[href$=".OGG"],
-.mw-body a.external[href$=".mid"],
-.mw-body a.external[href$=".MID"],
-.mw-body a.external[href$=".midi"],
-.mw-body a.external[href$=".MIDI"],
-.mw-body a.external[href$=".mp3"],
-.mw-body a.external[href$=".MP3"],
-.mw-body a.external[href$=".wav"],
-.mw-body a.external[href$=".WAV"],
-.mw-body a.external[href$=".wma"],
-.mw-body a.external[href$=".WMA"],
+.mw-body a.external[href$='.ogg'],
+.mw-body a.external[href$='.OGG'],
+.mw-body a.external[href$='.mid'],
+.mw-body a.external[href$='.MID'],
+.mw-body a.external[href$='.midi'],
+.mw-body a.external[href$='.MIDI'],
+.mw-body a.external[href$='.mp3'],
+.mw-body a.external[href$='.MP3'],
+.mw-body a.external[href$='.wav'],
+.mw-body a.external[href$='.WAV'],
+.mw-body a.external[href$='.wma'],
+.mw-body a.external[href$='.WMA'],
.link-audio {
background: url( images/audio-ltr.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$=".ogm"],
-.mw-body a.external[href$=".OGM"],
-.mw-body a.external[href$=".avi"],
-.mw-body a.external[href$=".AVI"],
-.mw-body a.external[href$=".mpeg"],
-.mw-body a.external[href$=".MPEG"],
-.mw-body a.external[href$=".mpg"],
-.mw-body a.external[href$=".MPG"],
+.mw-body a.external[href$='.ogm'],
+.mw-body a.external[href$='.OGM'],
+.mw-body a.external[href$='.avi'],
+.mw-body a.external[href$='.AVI'],
+.mw-body a.external[href$='.mpeg'],
+.mw-body a.external[href$='.MPEG'],
+.mw-body a.external[href$='.mpg'],
+.mw-body a.external[href$='.MPG'],
.link-video {
background: url( images/video.png ) center right no-repeat;
/* @embed */
padding-right: 15px;
}
-.mw-body a.external[href$=".pdf"],
-.mw-body a.external[href$=".PDF"],
-.mw-body a.external[href*=".pdf#"],
-.mw-body a.external[href*=".PDF#"],
-.mw-body a.external[href*=".pdf?"],
-.mw-body a.external[href*=".PDF?"],
+.mw-body a.external[href$='.pdf'],
+.mw-body a.external[href$='.PDF'],
+.mw-body a.external[href*='.pdf#'],
+.mw-body a.external[href*='.PDF#'],
+.mw-body a.external[href*='.pdf?'],
+.mw-body a.external[href*='.PDF?'],
.link-document {
background: url( images/document-ltr.png ) center right no-repeat;
/* @embed */
* automatically when content is modified.
*/
.mw-body-content {
- counter-reset: mw-NumberedExtLink;
+ counter-reset: mw-numbered-ext-link;
}
-.mw-body-content a[rel~="mw:ExtLink"]:empty:after {
- content: "[" counter( mw-NumberedExtLink ) "]";
- counter-increment: mw-NumberedExtLink;
+.mw-body-content a[rel~='mw:ExtLink']:empty:after {
+ content: '[' counter( mw-numbered-ext-link ) ']';
+ counter-increment: mw-numbered-ext-link;
}
/**
display: table-caption;
caption-side: bottom;
/* In mw-core the font-size is duplicated, 94% in thumbiner
- and again 94% in thumbcaption. 88% for font size of the
- caption results in the same behavior. */
+ * and again 94% in thumbcaption. 88% for font size of the
+ * caption results in the same behavior. */
font-size: 88%;
line-height: 1.4em;
text-align: left;
}
/* Hide the caption for frameless and plain floated images */
-figure[typeof~="mw:Image/Frameless"] > figcaption,
-figure[typeof~="mw:Image"] > figcaption {
+figure[typeof~='mw:Image/Frameless'] > figcaption,
+figure[typeof~='mw:Image'] > figcaption {
display: none;
}
Util.fetchModuleInfo( this.apiModule )
.done( function ( pi ) {
- var prefix, i, j, dl, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
+ var prefix, i, j, descriptionContainer, widget, $widgetLabel, widgetField, helpField, tmp, flag, count,
items = [],
deprecatedItems = [],
buttons = [],
that.tokenWidget = widget;
}
- dl = $( '<dl>' );
- dl.append( $( '<dd>', {
+ descriptionContainer = $( '<div>' );
+ descriptionContainer.append( $( '<div>', {
addClass: 'description',
append: Util.parseHTML( pi.parameters[ i ].description )
} ) );
if ( pi.parameters[ i ].info && pi.parameters[ i ].info.length ) {
for ( j = 0; j < pi.parameters[ i ].info.length; j++ ) {
- dl.append( $( '<dd>', {
+ descriptionContainer.append( $( '<div>', {
addClass: 'info',
append: Util.parseHTML( pi.parameters[ i ].info[ j ] )
} ) );
case 'limit':
if ( pi.parameters[ i ].highmax !== undefined ) {
- dl.append( $( '<dd>', {
+ descriptionContainer.append( $( '<div>', {
addClass: 'info',
append: [
Util.parseMsg(
]
} ) );
} else {
- dl.append( $( '<dd>', {
+ descriptionContainer.append( $( '<div>', {
addClass: 'info',
append: [
Util.parseMsg( 'api-help-param-limit', pi.parameters[ i ].max ),
tmp += 'max';
}
if ( tmp !== '' ) {
- dl.append( $( '<dd>', {
+ descriptionContainer.append( $( '<div>', {
addClass: 'info',
append: Util.parseMsg(
'api-help-param-integer-' + tmp,
);
}
if ( tmp.length ) {
- dl.append( $( '<dd>', {
+ descriptionContainer.append( $( '<div>', {
addClass: 'info',
append: Util.parseHTML( tmp.join( ' ' ) )
} ) );
} ), {
align: 'inline',
classes: [ 'mw-apisandbox-help-field' ],
- label: dl
+ label: descriptionContainer
}
);
* Styling for Special:Block
*/
-label[for="mw-input-wpConfirm"] {
+label[for='mw-input-wpConfirm'] {
font-weight: bold;
}
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
.mw-special-ComparePages .mw-htmlform-ooui-wrapper {
width: 100%;
*/
( function ( mw, $ ) {
$( function () {
- var $preftoc, $preferences, $fieldsets, labelFunc,
+ var $preftoc, $preferences, $fieldsets, labelFunc, previousTab,
$tzSelect, $tzTextbox, $localtimeHolder, servertime, allowCloseWindow,
convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
updateTimezoneSelection();
}
- // Preserve the tab after saving the preferences
- // Not using cookies, because their deletion results are inconsistent.
- // Not using jStorage due to its enormous size (for this feature)
- if ( window.sessionStorage ) {
- if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
- switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
- }
+ // Restore the active tab after saving the preferences
+ previousTab = mw.storage.session.get( 'mwpreferences-prevTab' );
+ if ( previousTab ) {
+ switchPrefTab( previousTab, 'noHash' );
// Deleting the key, the tab states should be reset until we press Save
- sessionStorage.removeItem( 'mediawikiPreferencesTab' );
-
- $( '#mw-prefs-form' ).submit( function () {
- var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
- sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
- } );
+ mw.storage.session.remove( previousTab );
}
+ $( '#mw-prefs-form' ).on( 'submit', function () {
+ var value = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+ mw.storage.session.set( 'mwpreferences-prevTab', value );
+ } );
+
// Check if all of the form values are unchanged
function isPrefsChanged() {
var inputs = $( '#mw-prefs-form :input[name]' ),
visibility: hidden;
display: block;
font-size: 0;
- content: " ";
+ content: ' ';
clear: both;
height: 0;
}
visibility: hidden;
display: block;
font-size: 0;
- content: " ";
+ content: ' ';
clear: both;
height: 0;
}
}
/* mobile */
+/* stylelint-disable declaration-no-important */
@media only screen and ( max-width: 768px ) {
#mw-interwiki-results {
width: 100%;
max-width: none !important;
}
}
+/* stylelint-enable declaration-no-important */
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
#mw-editbutton-bold {
- .background-image("images/@{button-bold}");
+ .background-image('images/@{button-bold}');
}
#mw-editbutton-italic {
- .background-image("images/@{button-italic}");
+ .background-image('images/@{button-italic}');
}
#mw-editbutton-link {
- .background-image("images/@{button-link}");
+ .background-image('images/@{button-link}');
}
#mw-editbutton-extlink {
- .background-image("images/@{button-extlink}");
+ .background-image('images/@{button-extlink}');
}
#mw-editbutton-headline {
- .background-image("images/@{button-headline}");
+ .background-image('images/@{button-headline}');
}
#mw-editbutton-image {
- .background-image("images/@{button-image}");
+ .background-image('images/@{button-image}');
}
#mw-editbutton-media {
- .background-image("images/@{button-media}");
+ .background-image('images/@{button-media}');
}
#mw-editbutton-nowiki {
- .background-image("images/@{button-nowiki}");
+ .background-image('images/@{button-nowiki}');
}
// Who decided to make only this single one different than the name of the data item?
#mw-editbutton-signature {
- .background-image("images/@{button-sig}");
+ .background-image('images/@{button-sig}');
}
#mw-editbutton-hr {
- .background-image("images/@{button-hr}");
+ .background-image('images/@{button-hr}');
}
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
// Helpers
.mixin-mw-ui-anchor-styles( @mainColor ) {
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
// Buttons
//
display: inline-block;
min-width: 4em;
max-width: 28.75em; // equivalent to 460px, @see T95367
- padding: 0.5em 1em;
+ padding: 0.546875em 1em;
+ line-height: 1.286;
margin: 0;
border-radius: @borderRadius;
.box-sizing( border-box );
}
}
+input.mw-ui-button,
+button.mw-ui-button {
+ // Buttons in Firefox have extra height
+ &::-moz-focus-inner {
+ margin-top: -1px;
+ margin-bottom: -1px;
+ }
+}
+
a.mw-ui-button {
text-decoration: none;
&:focus {
text-decoration: none;
}
-
- // a-tags behave different to inputs if the line-height attribute is inherited
- // from another element (e.g. mw-body-content). They appear bigger as input
- // tags. See Bug T116427. To fix that, apply the correct line-height (used
- // for inputs) to a-tags, too.
- line-height: normal;
}
// Button groups
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
// Checkbox
//
vertical-align: middle;
}
- input[type="checkbox"] {
+ input[type='checkbox'] {
// we hide the input element as instead we will style the label that follows
// we use opacity so that VoiceOver software can still identify it
opacity: 0;
- // Render "on top of" the label, so that it's still clickable (T98905)
+ // Render *on top of* the label, so that it's still clickable (T98905)
z-index: 1;
position: relative;
// ensure the invisible checkbox takes up the required width
}
// the pseudo before element of the label after the checkbox now looks like a checkbox
- & + label::before {
+ & + label:before {
content: '';
background-color: #fff;
.background-image-svg( 'images/checked.svg', 'images/checked.png' );
}
// when the input is checked, style the label pseudo before element that followed as a checked checkbox
- &:checked + label::before {
+ &:checked + label:before {
.background-size( 100%, 100% );
}
- &:active + label::before {
+ &:active + label:before {
background-color: @colorGray13;
border-color: @colorGray13;
}
- &:focus + label::before {
+ &:focus + label:before {
border-width: 2px;
}
- &:focus:hover + label::before,
- &:hover + label::before {
+ &:focus:hover + label:before,
+ &:hover + label:before {
border-bottom-width: 3px;
}
// disabled checkboxes have a gray background
- &:disabled + label::before {
+ &:disabled + label:before {
cursor: default;
background-color: @colorGray14;
border-color: @colorGray14;
}
// disabled and checked checkboxes have a white circle
- &:disabled:checked + label::before {
+ &:disabled:checked + label:before {
.background-image-svg( 'images/checked_disabled.svg', 'images/checked_disabled.png' );
}
}
// Form elements and layouts
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
// --------------------------------------------------------------------------
// Layouts
}
// Override input styling just for checkboxes and radio inputs.
- input[type="radio"] {
+ input[type='radio'] {
display: inline;
.box-sizing( content-box );
width: auto;
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
// Mixins
.mixin-mw-ui-icon-bgimage( @iconSvg, @iconPng ) {
// Inputs
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
// Text inputs
//
width: 100%;
border: 1px solid @colorFieldBorder;
border-radius: @borderRadius;
- padding: 0.3em 0.3em 0.3em 0.6em;
+ padding: 0.625em 0.546875em 0.546875em;
// necessary for smooth transition
box-shadow: inset 0 0 0 0.1em #fff;
font-family: inherit;
font-size: inherit;
- line-height: inherit;
+ line-height: 1.172em;
vertical-align: middle;
// Normalize & style placeholder text, see T139034
}
// Normalize styling for `<input type="search">`
- &[type="search"] {
+ &[type='search'] {
// Correct the odd appearance in Chrome and Safari 5
-webkit-appearance: textfield;
// <button class="mw-ui-button mw-ui-progressive">Submit</button>
//
// Styleguide 1.2.
-input[type="number"],
+input[type='number'],
.mw-ui-input-inline {
display: inline-block;
width: auto;
font-size: 1.75em;
font-weight: bold;
line-height: 1.25em;
+ padding: 0.3673em 0.3265em 0.3265em;
}
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
// Radio
//
vertical-align: middle;
}
- input[type="radio"] {
+ input[type='radio'] {
// we hide the input element as instead we will style the label that follows
// we use opacity so that VoiceOver software can still identify it
opacity: 0;
margin-right: 0.4em;
// the pseudo before element of the label after the radio now looks like a radio
- & + label::before {
+ & + label:before {
content: '';
background-color: #fff;
.background-image-svg( 'images/radio_checked.svg', 'images/radio_checked.png' );
}
// when the input is checked, style the label pseudo before element that followed as a checked radio
- &:checked + label::before {
+ &:checked + label:before {
.background-size( 100%, 100% );
}
- &:active + label::before {
+ &:active + label:before {
background-color: @colorGray13;
border-color: @colorGray13;
}
- &:focus + label::before {
+ &:focus + label:before {
border-width: 2px;
}
- &:focus:hover + label::before,
- &:hover + label::before {
+ &:focus:hover + label:before,
+ &:hover + label:before {
border-bottom-width: 3px;
}
// disabled radios have a gray background
- &:disabled + label::before {
+ &:disabled + label:before {
background-color: @colorGray14;
border-color: @colorGray14;
cursor: default;
}
// disabled and checked radios have a white circle
- &:disabled:checked + label::before {
+ &:disabled:checked + label:before {
.background-image-svg( 'images/radio_disabled.svg', 'images/radio_disabled.png' );
}
}
-@import "mediawiki.mixins";
-@import "mediawiki.ui/variables";
-@import "mediawiki.ui/mixins";
+@import 'mediawiki.mixins';
+@import 'mediawiki.ui/variables';
+@import 'mediawiki.ui/mixins';
/*
Text & Anchors
/**
* Provide Agora appearance for mw-ui-* classes.
*/
-@import "components/forms";
-@import "components/utilities";
+@import 'components/forms';
+@import 'components/utilities';
/* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
.mw-widgets-datetime-calendarWidget {
display: inline-block;
/* stylelint-disable no-duplicate-selectors */
-@import "mediawiki.widgets.datetime.definitions";
+@import 'mediawiki.widgets.datetime.definitions';
.mw-widgets-datetime-dateTimeInputWidget {
display: inline-block;
}
.oo-ui-transition( @value1, @value2: X, ... ) {
- @value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after
+ @value: ~`'@{arguments}'.replace(/[\[\]]|\,\sX/g, '')`; // stylelint-disable-line function-comma-space-after, function-parentheses-space-inside, function-whitespace-after, value-keyword-case
-webkit-transition: @value;
-moz-transition: @value;
transition: @value;
}
.mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
- margin-top: -@calendarHeight;
- margin-left: -@calendarWidth;
+ margin-top: -@calendarHeight; /* stylelint-disable-line value-keyword-case */
+ margin-left: -@calendarWidth; /* stylelint-disable-line value-keyword-case */
}
.mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
height: @calendarHeight;
.mw-widget-calendarWidget-body:first-child {
- margin-top: 0 !important;
- margin-left: 0 !important;
+ margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
+ margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
.transition( margin-left 500ms );
}
}
height: @calendarHeight;
.mw-widget-calendarWidget-body:first-child {
- margin-left: -@calendarWidth !important;
- margin-top: 0 !important;
+ margin-left: -@calendarWidth !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
+ margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
.transition( margin-left 500ms );
}
}
}
.mw-widget-calendarWidget-body:first-child {
- margin-left: 0 !important;
- margin-top: 0 !important;
+ margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+ margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
.transition( margin-top 500ms );
}
}
}
.mw-widget-calendarWidget-body:first-child {
- margin-left: 0 !important;
- margin-top: -@calendarHeight !important;
+ margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
+ margin-top: -@calendarHeight !important; /* stylelint-disable-line value-keyword-case, declaration-no-important */
.transition( margin-top 500ms );
}
}
}
tr.mw-htmlform-vertical-label td.mw-label {
- text-align: left !important;
+ text-align: left !important; /* stylelint-disable-line declaration-no-important */
}
.mw-icon-question {
.diff-otitle,
.diff-ntitle,
.diff-lineno {
- direction: ltr !important;
+ direction: ltr !important; /* stylelint-disable-line declaration-no-important */
unicode-bidi: embed;
}
-@import "mediawiki.ui/variables";
+@import 'mediawiki.ui/variables';
.mediawiki-filewarning {
visibility: hidden;
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
#mw-indicator-mw-helplink a {
.background-image-svg('images/help.svg', 'images/help.png');
}
/* Generate interpuncts */
.hlist dt:after {
- content: ":";
+ content: ':';
}
.hlist dd:after,
.hlist li:after {
- content: " ·";
+ content: ' ·';
font-weight: bold;
}
.hlist dd:last-child:after,
.hlist li dd:first-child:before,
.hlist li dt:first-child:before,
.hlist li li:first-child:before {
- content: "(";
+ content: '(';
font-weight: normal;
}
.hlist dd dd:last-child:after,
.hlist li dd:last-child:after,
.hlist li dt:last-child:after,
.hlist li li:last-child:after {
- content: ")";
+ content: ')';
font-weight: normal;
}
/* For IE8 */
.hlist li dd.hlist-last-child:after,
.hlist li dt.hlist-last-child:after,
.hlist li li.hlist-last-child:after {
- content: ")";
+ content: ')';
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
counter-increment: list-item;
}
.hlist ol > li:before {
- content: counter( list-item ) " ";
+ content: counter( list-item ) ' ';
}
.hlist dd ol > li:first-child:before,
.hlist dt ol > li:first-child:before,
.hlist li ol > li:first-child:before {
- content: "(" counter( list-item ) " ";
+ content: '(' counter( list-item ) ' ';
}
/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
/* For the collapsed and expanded arrows, we also provide selectors to make it
* easy to use them with jquery.makeCollapsible. */
* in MediaWiki (used e.g. on Special:ListFiles).
*/
-@import "mediawiki.mixins";
+@import 'mediawiki.mixins';
.TablePager {
min-width: 80%;
* immediate execution after this amount of time (in milliseconds) if it didn't run
* by that time.
*/
- mw.requestIdleCallback = mw.requestIdleCallbackInternal;
- /*
- // XXX: Polyfill disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=647870
- mw.requestIdleCallback = window.requestIdleCallback
+ mw.requestIdleCallback = window.requestIdleCallback ?
// Bind because it throws TypeError if context is not window
- ? window.requestIdleCallback.bind( window )
- : mw.requestIdleCallbackInternal;
- */
+ window.requestIdleCallback.bind( window ) :
+ mw.requestIdleCallbackInternal;
+ // Note: Polyfill was previously disabled due to
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+ // See also <http://codepen.io/Krinkle/full/XNGEvv>
}( mediaWiki ) );
};
/**
- * Set a value in device storage.
- *
- * @param {string} key Key name to store under
- * @param {string} value Value to be stored
- * @return {boolean} Whether the save succeeded or not
- */
+ * Set a value in device storage.
+ *
+ * @param {string} key Key name to store under
+ * @param {string} value Value to be stored
+ * @return {boolean} Whether the save succeeded or not
+ */
SafeStorage.prototype.set = function ( key, value ) {
try {
this.store.setItem( key, value );
};
/**
- * Remove a value from device storage.
- *
- * @param {string} key Key of item to remove
- * @return {boolean} Whether the save succeeded or not
- */
+ * Remove a value from device storage.
+ *
+ * @param {string} key Key of item to remove
+ * @return {boolean} Whether the save succeeded or not
+ */
SafeStorage.prototype.remove = function ( key ) {
try {
this.store.removeItem( key );
},
/**
- * Get an automatically generated random ID (stored in a session cookie)
+ * Get an automatically generated random ID (persisted in sessionStorage)
*
- * This ID is ephemeral for everyone, staying in their browser only until they close
- * their browser.
+ * This ID is ephemeral for everyone, staying in their browser only until they
+ * close their browsing session.
*
* @return {string} Random session ID
*/
sessionId: function () {
- var sessionId = mw.cookie.get( 'mwuser-sessionId' );
- if ( sessionId === null ) {
+ var sessionId = mw.storage.session.get( 'mwuser-sessionId' );
+ if ( !sessionId ) {
sessionId = mw.user.generateRandomSessionId();
- mw.cookie.set( 'mwuser-sessionId', sessionId, { expires: null } );
+ mw.storage.session.set( 'mwuser-sessionId', sessionId );
}
return sessionId;
},
/**
* @property {jQuery} $container If the gallery contained in an element that is
- * not the main content element, then it stores that element.
+ * not the main content element, then it stores that element.
*/
/**
/**
* @property {number} imageHeight Height of the image based on viewport size
- * the URLs in the required size.
+ * the URLs in the required size.
*/
/* Setup */
+++ /dev/null
-/**
- * Adds window.Node with node types according to:
- * https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247
- */
-
-window.Node = window.Node || {
- ELEMENT_NODE: 1,
- ATTRIBUTE_NODE: 2,
- TEXT_NODE: 3,
- CDATA_SECTION_NODE: 4,
- ENTITY_REFERENCE_NODE: 5,
- ENTITY_NODE: 6,
- PROCESSING_INSTRUCTION_NODE: 7,
- COMMENT_NODE: 8,
- DOCUMENT_NODE: 9,
- DOCUMENT_TYPE_NODE: 10,
- DOCUMENT_FRAGMENT_NODE: 11,
- NOTATION_NODE: 12
-};
Then(/^feedback should be (.+)$/) do |feedback|
on(LoginPage) do |page|
- page.feedback_element.when_present.click
+ page.feedback_element.click
expect(page.feedback).to match Regexp.escape(feedback)
end
end
end
Then(/^there should be a link to (.+)$/) do |text|
- expect(on(LoginPage).username_displayed_element.when_present.text).to eq text
+ expect(on(LoginPage).username_displayed_element.text).to eq text
end
Then(/^Username element should be there$/) do
When(/^I click Appearance$/) do
- visit(PreferencesPage).appearance_link_element.when_present.click
+ visit(PreferencesPage).appearance_link_element.click
end
When(/^I navigate to Preferences$/) do
When(/^I click Editing$/) do
- visit(PreferencesPage).editing_link_element.when_present.click
+ visit(PreferencesPage).editing_link_element.click
end
Then(/^I can select edit area font style$/) do
- expect(on(PreferencesEditingPage).edit_area_font_style_select_element.when_present).to exist
+ expect(on(PreferencesEditingPage).edit_area_font_style_select_element).to exist
end
Then(/^I can select live preview$/) do
- expect(on(PreferencesEditingPage).live_preview_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).live_preview_check_element).to exist
end
Then(/^I can select section editing by double clicking$/) do
- expect(on(PreferencesEditingPage).edit_section_double_click_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).edit_section_double_click_check_element).to exist
end
Then(/^I can select section editing by right clicking$/) do
- expect(on(PreferencesEditingPage).edit_section_right_click_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).edit_section_right_click_check_element).to exist
end
Then(/^I can select section editing via edit links$/) do
- expect(on(PreferencesEditingPage).edit_section_edit_link_element.when_present).to exist
+ expect(on(PreferencesEditingPage).edit_section_edit_link_element).to exist
end
Then(/^I can select show edit toolbar$/) do
- expect(on(PreferencesEditingPage).show_edit_toolbar_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).show_edit_toolbar_check_element).to exist
end
Then(/^I can select show preview before edit box$/) do
- expect(on(PreferencesEditingPage).preview_on_top_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).preview_on_top_check_element).to exist
end
Then(/^I can select show preview on first edit$/) do
- expect(on(PreferencesEditingPage).preview_on_first_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).preview_on_first_check_element).to exist
end
Then(/^I can select to prompt me when entering a blank edit summary$/) do
- expect(on(PreferencesEditingPage).forced_edit_summary_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).forced_edit_summary_check_element).to exist
end
Then(/^I can select to warn me when I leave an edit page with unsaved changes$/) do
- expect(on(PreferencesEditingPage).unsaved_changes_check_element.when_present).to exist
+ expect(on(PreferencesEditingPage).unsaved_changes_check_element).to exist
end
When(/^I click User profile$/) do
- visit(PreferencesPage).user_profile_link_element.when_present.click
+ visit(PreferencesPage).user_profile_link_element.click
end
Then(/^I can change my gender$/) do
class LoginPage
include PageObject
- page_url 'Special:UserLogin'
-
element(:error_message, css: 'div#userloginForm div.error')
- div(:feedback, class: 'errorbox')
- button(:login, id: 'wpLoginAttempt')
- li(:logout, id: 'pt-logout')
- text_field(:password, id: 'wpPassword1')
element(:password_error, css: 'input#wpPassword1:required:invalid')
- a(:password_strength, text: 'password strength')
- a(:phishing, text: 'phishing')
- text_field(:username, id: 'wpName1')
- a(:username_displayed, title: /Your user page/)
element(:username_error, css: 'input#wpName1:required:invalid')
-
- def logged_in_as_element
- @browser.div(id: 'mw-content-text').p.b
- end
-
- def login_with(username, password, wait_for_logout_element = true)
- username_element.when_present.send_keys(username)
- password_element.when_present.send_keys(password)
- login_element.when_present.click
- logout_element.when_present(10) if wait_for_logout_element
- end
end
'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
'wgLanguageCode' => $langCode,
'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
- 'wgNamespacesWithSubpages' => [
- 0 => isset( $opts['subpage'] ),
- 2 => isset( $opts['subpage'] ),
- ],
+ 'wgNamespacesWithSubpages' => array_fill_keys(
+ MWNamespace::getValidNamespaces(), isset( $opts['subpage'] )
+ ),
'wgMaxTocLevel' => $maxtoclevel,
'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
'wgThumbLimits' => [ self::getOptionValue( 'thumbsize', $opts, 180 ) ],
}
if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
- if ( $wgLocalisationCacheConf['storeClass'] === false
- && ( $wgLocalisationCacheConf['store'] == 'db'
- || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) )
+ if (
+ $wgLocalisationCacheConf['storeClass'] === false
+ && (
+ $wgLocalisationCacheConf['store'] == 'db'
+ || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory )
+ )
) {
$wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
}
public function testExists() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
*/
public function testGetCanonicalNamespaces() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
*/
public function testGetCanonicalName() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
*/
public function testGetCanonicalIndex() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
*/
public function testGetValidNamespaces() {
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
+ 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
);
}
*/
return [
[ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
[ '<span>foo</span>', 'escaped', '<span>foo</span>',
- '<span>foo</span>' ],
+ '<span>foo</span>' ],
[ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
[ '<script>alert(1)</script>', 'parse', '<script>alert(1)</script>',
'<script>alert(1)</script>' ],
[ '<script>alert(1)</script>', 'escaped', '<script>alert(1)</script>',
'<script>alert(1)</script>' ],
[ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
- '<script>alert(1)</script>' ],
+ '<script>alert(1)</script>' ],
];
}
$page = new WikiPage( $title );
$this->setTemporaryHook( 'SearchDataForIndex',
- function ( &$fields, ContentHandler $handler, WikiPage $page, ParserOutput $output,
- SearchEngine $engine ) {
+ function (
+ &$fields,
+ ContentHandler $handler,
+ WikiPage $page,
+ ParserOutput $output,
+ SearchEngine $engine
+ ) {
$fields['testDataField'] = 'test content';
} );
],
],
'serverTemplate' => [
- 'dbname' => $wgDBname,
- 'user' => $wgDBuser,
- 'password' => $wgDBpassword,
- 'type' => $wgDBtype,
+ 'dbname' => $wgDBname,
+ 'user' => $wgDBuser,
+ 'password' => $wgDBpassword,
+ 'type' => $wgDBtype,
'dbDirectory' => $wgSQLiteDataDir,
- 'flags' => DBO_DEFAULT
+ 'flags' => DBO_DEFAULT
],
'hostsByName' => [
'test-db1' => $wgDBserver,
<?php
class DeferredUpdatesTest extends MediaWikiTestCase {
+
+ /**
+ * @covers DeferredUpdates::getPendingUpdates
+ */
+ public function testGetPendingUpdates() {
+ # Prevent updates from running
+ $this->setMwGlobals( 'wgCommandLineMode', false );
+
+ $pre = DeferredUpdates::PRESEND;
+ $post = DeferredUpdates::POSTSEND;
+ $all = DeferredUpdates::ALL;
+
+ $update = $this->getMockBuilder( 'DeferrableUpdate' )
+ ->getMock();
+ $update->expects( $this->never() )
+ ->method( 'doUpdate' );
+
+ DeferredUpdates::addUpdate( $update, $pre );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) );
+ $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+ DeferredUpdates::clearPendingUpdates();
+ $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+
+ DeferredUpdates::addUpdate( $update, $post );
+ $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) );
+ $this->assertCount( 1, DeferredUpdates::getPendingUpdates() );
+ DeferredUpdates::clearPendingUpdates();
+ $this->assertCount( 0, DeferredUpdates::getPendingUpdates() );
+ }
+
public function testDoUpdatesWeb() {
$this->setMwGlobals( 'wgCommandLineMode', false );
* Added this test based on an issue experienced with HHVM 3.3.0-dev
* where it did not define a cURL constant.
*
- * @T72570
+ * T72570
* @dataProvider provideCurlConstants
*/
public function testCurlConstants( $value ) {
+++ /dev/null
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class ConvertibleTimestampTest extends PHPUnit_Framework_TestCase {
- /**
- * @covers ConvertibleTimestamp::__construct
- */
- public function testConstructWithNoTimestamp() {
- $timestamp = new ConvertibleTimestamp();
- $this->assertInternalType( 'string', $timestamp->getTimestamp() );
- $this->assertNotEmpty( $timestamp->getTimestamp() );
- $this->assertNotEquals( false, strtotime( $timestamp->getTimestamp( TS_MW ) ) );
- }
-
- /**
- * @covers ConvertibleTimestamp::__toString
- */
- public function testToString() {
- $timestamp = new ConvertibleTimestamp( '1406833268' ); // Equivalent to 20140731190108
- $this->assertEquals( '1406833268', $timestamp->__toString() );
- }
-
- public static function provideValidTimestampDifferences() {
- return [
- [ '1406833268', '1406833269', '00 00 00 01' ],
- [ '1406833268', '1406833329', '00 00 01 01' ],
- [ '1406833268', '1406836929', '00 01 01 01' ],
- [ '1406833268', '1406923329', '01 01 01 01' ],
- ];
- }
-
- /**
- * @dataProvider provideValidTimestampDifferences
- * @covers ConvertibleTimestamp::diff
- */
- public function testDiff( $timestamp1, $timestamp2, $expected ) {
- $timestamp1 = new ConvertibleTimestamp( $timestamp1 );
- $timestamp2 = new ConvertibleTimestamp( $timestamp2 );
- $diff = $timestamp1->diff( $timestamp2 );
- $this->assertEquals( $expected, $diff->format( '%D %H %I %S' ) );
- }
-
- /**
- * Test parsing of valid timestamps and outputing to MW format.
- * @dataProvider provideValidTimestamps
- * @covers ConvertibleTimestamp::getTimestamp
- */
- public function testValidParse( $format, $original, $expected ) {
- $timestamp = new ConvertibleTimestamp( $original );
- $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
- }
-
- /**
- * Test outputting valid timestamps to different formats.
- * @dataProvider provideValidTimestamps
- * @covers ConvertibleTimestamp::getTimestamp
- */
- public function testValidOutput( $format, $expected, $original ) {
- $timestamp = new ConvertibleTimestamp( $original );
- $this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
- }
-
- /**
- * Test an invalid timestamp.
- * @expectedException TimestampException
- * @covers ConvertibleTimestamp
- */
- public function testInvalidParse() {
- new ConvertibleTimestamp( "This is not a timestamp." );
- }
-
- /**
- * @dataProvider provideValidTimestamps
- * @covers ConvertibleTimestamp::convert
- */
- public function testConvert( $format, $expected, $original ) {
- $this->assertSame( $expected, ConvertibleTimestamp::convert( $format, $original ) );
- }
-
- /**
- * Format an invalid timestamp.
- * @covers ConvertibleTimestamp::convert
- */
- public function testConvertInvalid() {
- $this->assertSame( false, ConvertibleTimestamp::convert( 'Not a timestamp', 0 ) );
- }
-
- /**
- * Test an out of range timestamp
- * @dataProvider provideOutOfRangeTimestamps
- * @expectedException TimestampException
- * @covers ConvertibleTimestamp
- */
- public function testOutOfRangeTimestamps( $format, $input ) {
- $timestamp = new ConvertibleTimestamp( $input );
- $timestamp->getTimestamp( $format );
- }
-
- /**
- * Test requesting an invalid output format.
- * @expectedException TimestampException
- * @covers ConvertibleTimestamp::getTimestamp
- */
- public function testInvalidOutput() {
- $timestamp = new ConvertibleTimestamp( '1343761268' );
- $timestamp->getTimestamp( 98 );
- }
-
- /**
- * Returns a list of valid timestamps in the format:
- * [ type, timestamp_of_type, timestamp_in_MW ]
- */
- public static function provideValidTimestamps() {
- return [
- // Various formats
- [ TS_UNIX, '1343761268', '20120731190108' ],
- [ TS_MW, '20120731190108', '20120731190108' ],
- [ TS_DB, '2012-07-31 19:01:08', '20120731190108' ],
- [ TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ],
- [ TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ],
- [ TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ],
- [ TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ],
- [ TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ],
- [ TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ],
- // Some extremes and weird values
- [ TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ],
- [ TS_UNIX, '-62135596801', '00001231235959' ]
- ];
- }
-
- /**
- * Returns a list of out of range timestamps in the format:
- * [ type, timestamp_of_type ]
- */
- public static function provideOutOfRangeTimestamps() {
- return [
- // Various formats
- [ TS_MW, '-62167219201' ], // -0001-12-31T23:59:59Z
- [ TS_MW, '253402300800' ], // 10000-01-01T00:00:00Z
- ];
- }
-}
$this->client->expects( $this->once() )->method( 'run' )->with( [
'method' => 'GET',
'url' => 'http://test/rest/42xyz42'
- // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
+ // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
$result = $this->bag->get( '42xyz42' );
$this->assertEquals( 'somedata', $result );
$this->client->expects( $this->once() )->method( 'run' )->with( [
'method' => 'PUT',
'url' => 'http://test/rest/42xyz42',
- 'body' => 's:8:"postdata";'
+ 'body' => 's:8:"postdata";'
// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
$result = $this->bag->set( '42xyz42', 'postdata' );
/**
* @group Database
+ * @covers Parser
*/
-
class ParserMethodsTest extends MediaWikiLangTestCase {
public static function providePreSaveTransform() {
/**
* @dataProvider providePreSaveTransform
- * @covers Parser::preSaveTransform
*/
public function testPreSaveTransform( $text, $expected ) {
global $wgParser;
/**
* @dataProvider provideStripOuterParagraph
- * @covers Parser::stripOuterParagraph
*/
public function testStripOuterParagraph( $text, $expected ) {
$this->assertEquals( $expected, Parser::stripOuterParagraph( $text ) );
* @expectedException MWException
* @expectedExceptionMessage Parser state cleared while parsing.
* Did you call Parser::parse recursively?
- * @covers Parser::lock
*/
public function testRecursiveParse() {
global $wgParser;
return 'bar';
}
- /**
- * @covers Parser::callParserFunction
- */
public function testCallParserFunction() {
global $wgParser;
}
/**
- * @covers Parser::parse
+ * @covers Parser
* @covers ParserOutput::getSections
*/
public function testGetSections() {
/**
* @dataProvider provideNormalizeLinkUrl
- * @covers Parser::normalizeLinkUrl
- * @covers Parser::normalizeUrlComponent
*/
public function testNormalizeLinkUrl( $explanation, $url, $expected ) {
$this->assertEquals( $expected, Parser::normalizeLinkUrl( $url ), $explanation );
/**
* Basic tests for Parser::getPreloadText
* @author Antoine Musso
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
*/
class ParserPreloadTest extends MediaWikiTestCase {
/**
unset( $this->title );
}
- /**
- * @covers Parser::getPreloadText
- */
public function testPreloadSimpleText() {
$this->assertPreloaded( 'simple', 'simple' );
}
- /**
- * @covers Parser::getPreloadText
- */
public function testPreloadedPreIsUnstripped() {
$this->assertPreloaded(
'<pre>monospaced</pre>',
);
}
- /**
- * @covers Parser::getPreloadText
- */
public function testPreloadedNowikiIsUnstripped() {
$this->assertPreloaded(
'<nowiki>[[Dummy title]]</nowiki>',
/**
* @group Database
* @group Parser
+ *
+ * @covers Parser
+ * @covers StripState
+ *
+ * @covers Preprocessor_DOM
+ * @covers PPDStack
+ * @covers PPDStackElement
+ * @covers PPDPart
+ * @covers PPFrame_DOM
+ * @covers PPTemplateFrame_DOM
+ * @covers PPCustomFrame_DOM
+ * @covers PPNode_DOM
+ *
+ * @covers Preprocessor_Hash
+ * @covers PPDStack_Hash
+ * @covers PPDStackElement_Hash
+ * @covers PPDPart_Hash
+ * @covers PPFrame_Hash
+ * @covers PPTemplateFrame_Hash
+ * @covers PPCustomFrame_Hash
+ * @covers PPNode_Hash_Tree
+ * @covers PPNode_Hash_Text
+ * @covers PPNode_Hash_Array
+ * @covers PPNode_Hash_Attr
*/
class TagHookTest extends MediaWikiTestCase {
public static function provideValidNames() {
/**
* @dataProvider provideValidNames
- * @covers Parser::setHook
*/
public function testTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
/**
* @dataProvider provideBadNames
* @expectedException MWException
- * @covers Parser::setHook
*/
public function testBadTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
/**
* @dataProvider provideValidNames
- * @covers Parser::setFunctionTagHook
*/
public function testFunctionTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
/**
* @dataProvider provideBadNames
* @expectedException MWException
- * @covers Parser::setFunctionTagHook
*/
public function testBadFunctionTagHooks( $tag ) {
global $wgParserConf, $wgContLang;
return [
[ 0, 'test', 0, 'test', true ],
[ SearchIndexField::INDEX_TYPE_NESTED, 'test',
- SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
+ SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
[ 0, 'test', 0, 'test2', true ],
[ 0, 'test', 1, 'test', false ],
];
}
/**
- * @covers MediaWiki\Tidy\Balancer::balance
+ * @covers MediaWiki\Tidy\Balancer
+ * @covers MediaWiki\Tidy\BalanceSets
+ * @covers MediaWiki\Tidy\BalanceElement
+ * @covers MediaWiki\Tidy\BalanceStack
+ * @covers MediaWiki\Tidy\BalanceMarker
+ * @covers MediaWiki\Tidy\BalanceActiveFormattingElements
* @dataProvider provideBalancerTests
*/
public function testBalancer( $description, $input, $expected, $useTidy ) {
$last_timestamp_bin,
$timestamp_bin,
"timestamp ($timestamp_bin) of current ID ($id_bin) >= timestamp ($last_timestamp_bin) " .
- "of prior one ($lastId_bin)" );
+ "of prior one ($lastId_bin)" );
$hostbits_bin = substr( $id_bin, -$hostbits );
$last_hostbits_bin = substr( $lastId_bin, -$hostbits );
$hostbits_bin,
$last_hostbits_bin,
"Host ID ($hostbits_bin) of current ID ($id_bin) is same as host ID ($last_hostbits_bin) " .
- "of prior one ($lastId_bin)." );
+ "of prior one ($lastId_bin)." );
}
$lastId = $id;
<directory>structure</directory>
<file>suites/LessTestSuite.php</file>
</testsuite>
- <!-- As there is a class Maintenance, we cannot use the
- name "maintenance" directly -->
+ <!-- As there is a class Maintenance, we cannot use the name "maintenance" directly -->
<testsuite name="maintenance_suite">
<directory>maintenance</directory>
</testsuite>
'mediawiki.page.ready',
'mediawiki.page.startup',
'test.sinonjs',
- 'dom-level2-shim',
],
'position' => 'top',
'targets' => [ 'desktop', 'mobile' ],
'tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js',
'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js',
+ 'tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
--- /dev/null
+( function ( mw ) {
+ QUnit.module( 'mediawiki.rcfilters - FilterItem' );
+
+ QUnit.test( 'Initializing filter item', function ( assert ) {
+ var item,
+ group1 = new mw.rcfilters.dm.FilterGroup( 'group1' );
+
+ item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+ assert.equal(
+ item.getName(),
+ 'filter1',
+ 'Filter name is retained.'
+ );
+ assert.equal(
+ item.getGroupName(),
+ 'group1',
+ 'Group name is retained.'
+ );
+
+ item = new mw.rcfilters.dm.FilterItem(
+ 'filter1',
+ group1,
+ {
+ label: 'test label',
+ description: 'test description'
+ }
+ );
+ assert.equal(
+ item.getLabel(),
+ 'test label',
+ 'Label information is retained.'
+ );
+ assert.equal(
+ item.getLabel(),
+ 'test label',
+ 'Description information is retained.'
+ );
+
+ item = new mw.rcfilters.dm.FilterItem(
+ 'filter1',
+ group1,
+ {
+ selected: true
+ }
+ );
+ assert.equal(
+ item.isSelected(),
+ true,
+ 'Item can be selected in the config.'
+ );
+ item.toggleSelected( true );
+ assert.equal(
+ item.isSelected(),
+ true,
+ 'Item can toggle its selected state.'
+ );
+
+ // Subsets
+ item = new mw.rcfilters.dm.FilterItem(
+ 'filter1',
+ group1,
+ {
+ subset: [ 'sub1', 'sub2', 'sub3' ]
+ }
+ );
+ assert.deepEqual(
+ item.getSubset(),
+ [ 'sub1', 'sub2', 'sub3' ],
+ 'Subset information is retained.'
+ );
+ assert.equal(
+ item.existsInSubset( 'sub1' ),
+ true,
+ 'Specific item exists in subset.'
+ );
+ assert.equal(
+ item.existsInSubset( 'sub10' ),
+ false,
+ 'Specific item does not exists in subset.'
+ );
+ assert.equal(
+ item.isIncluded(),
+ false,
+ 'Initial state of "included" is false.'
+ );
+
+ item.toggleIncluded( true );
+ assert.equal(
+ item.isIncluded(),
+ true,
+ 'Item toggles its included state.'
+ );
+
+ // Conflicts
+ item = new mw.rcfilters.dm.FilterItem(
+ 'filter1',
+ group1,
+ {
+ conflicts: [ 'conflict1', 'conflict2', 'conflict3' ]
+ }
+ );
+ assert.deepEqual(
+ item.getConflicts(),
+ [ 'conflict1', 'conflict2', 'conflict3' ],
+ 'Conflict information is retained.'
+ );
+ assert.equal(
+ // TODO: Consider allowing for either a FilterItem or a filter name
+ // in this method, so it is consistent with the subset one
+ item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group1 ) ),
+ true,
+ 'Specific item exists in conflicts.'
+ );
+ assert.equal(
+ item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict10', group1 ) ),
+ false,
+ 'Specific item does not exists in conflicts.'
+ );
+ assert.equal(
+ item.isConflicted(),
+ false,
+ 'Initial state of "conflicted" is false.'
+ );
+
+ item.toggleConflicted( true );
+ assert.equal(
+ item.isConflicted(),
+ true,
+ 'Item toggles its conflicted state.'
+ );
+
+ // Fully covered
+ item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
+ assert.equal(
+ item.isFullyCovered(),
+ false,
+ 'Initial state of "full coverage" is false.'
+ );
+ item.toggleFullyCovered( true );
+ assert.equal(
+ item.isFullyCovered(),
+ true,
+ 'Item toggles its fully coverage state.'
+ );
+
+ } );
+
+ QUnit.test( 'Emitting events', function ( assert ) {
+ var group1 = new mw.rcfilters.dm.FilterGroup( 'group1' ),
+ item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 ),
+ events = [];
+
+ // Listen to update events
+ item.on( 'update', function () {
+ events.push( item.getState() );
+ } );
+
+ // Do stuff
+ item.toggleSelected( true ); // { selected: true, included: false, conflicted: false, fullyCovered: false }
+ item.toggleSelected( true ); // No event (duplicate state)
+ item.toggleIncluded( true ); // { selected: true, included: true, conflicted: false, fullyCovered: false }
+ item.toggleConflicted( true ); // { selected: true, included: true, conflicted: true, fullyCovered: false }
+ item.toggleFullyCovered( true ); // { selected: true, included: true, conflicted: true, fullyCovered: true }
+ item.toggleSelected(); // { selected: false, included: true, conflicted: true, fullyCovered: true }
+
+ // Check emitted events
+ assert.deepEqual(
+ events,
+ [
+ { selected: true, included: false, conflicted: false, fullyCovered: false },
+ { selected: true, included: true, conflicted: false, fullyCovered: false },
+ { selected: true, included: true, conflicted: true, fullyCovered: false },
+ { selected: true, included: true, conflicted: true, fullyCovered: true },
+ { selected: false, included: true, conflicted: true, fullyCovered: true }
+ ],
+ 'Events emitted successfully.'
+ );
+ } );
+}( mediaWiki ) );
result2 = mw.user.generateRandomSessionId();
assert.notEqual( result, result2, 'different when called multiple times' );
+ } );
+ QUnit.test( 'sessionId', function ( assert ) {
+ var result = mw.user.sessionId(),
+ result2 = mw.user.sessionId();
+ assert.equal( typeof result, 'string', 'type' );
+ assert.equal( $.trim( result ), result, 'no leading or trailing whitespace' );
+ assert.equal( result2, result, 'retained' );
} );
}( mediaWiki, jQuery ) );
// For 404 handled thumbnails, we only use the base name of the URI
// for the thumb params and the parent directory for the source file name.
// Check that the zone relative path matches up so squid caches won't pick
- // up thumbs that would not be purged on source file deletion (bug 34231).
+ // up thumbs that would not be purged on source file deletion (T36231).
if ( $rel404 !== null ) { // thumbnail was handled via 404
if ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName ) ) {
// Request for the canonical thumbnail name