is deprecated.
* (T33313) Add a preference for watching uploads by default, also applies
to API-based upload tools.
+* $wgJpegPixelFormat was added to override chroma subsampling for JPEG image
+ thumbnails created via ImageMagick. Defaults to 'yuv420', providing bandwidth
+ savings versus the previous behavior on many files.
=== External library changes in 1.27 ===
* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21).
* Skin::userTalkLink was removed (deprecated since 1.21).
* Skin::userToolLinksRedContribs was removed (deprecated since 1.21).
+* wikidiff3 is now the default and only PHP diff engine. It provides improved diff
+ performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore
+ makes no difference now. Users are still recommended to use wikidiff2 if possible,
+ though.
== Compatibility ==
"ext-xml": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.16.6",
+ "oojs/oojs-ui": "0.17.0",
"oyejorge/less.php": "1.7.0.10",
"php": ">=5.5.9",
"psr/log": "1.0.0",
*/
$wgJpegTran = '/usr/bin/jpegtran';
+/**
+ * At default setting of 'yuv420', JPEG thumbnails will use 4:2:0 chroma
+ * subsampling to reduce file size, at the cost of possible color fringing
+ * at sharp edges.
+ *
+ * See https://en.wikipedia.org/wiki/Chroma_subsampling
+ *
+ * Supported values:
+ * false - use scaling system's default (same as pre-1.27 behavior)
+ * 'yuv444' - luma and chroma at same resolution
+ * 'yuv422' - chroma at 1/2 resolution horizontally, full vertically
+ * 'yuv420' - chroma at 1/2 resolution in both dimensions
+ *
+ * This setting is currently supported only for the ImageMagick backend;
+ * others may default to 4:2:0 or 4:4:4 or maintaining the source file's
+ * sampling in the thumbnail.
+ *
+ * @since 1.27
+ */
+$wgJpegPixelFormat = 'yuv420';
+
/**
* Some tests and extensions use exiv2 to manipulate the Exif metadata in some
* image formats.
/**
* Name of the external diff engine to use. Supported values:
- * * false: default PHP implementation, DairikiDiff
+ * * false: default PHP implementation
* * 'wikidiff2': Wikimedia's fast difference engine implemented as a PHP/HHVM module
- * * 'wikidiff3': newer PHP-based difference engine
+ * * 'wikidiff' and 'wikidiff3' are treated as false for backwards compatibility
* * any other string is treated as a path to external diff executable
*/
$wgExternalDiffEngine = false;
use GlobalVarConfig;
use Config;
use Hooks;
-use LBFactory;
use Liuggio\StatsdClient\Factory\StatsdDataFactory;
-use LoadBalancer;
use MediaWiki\Services\ServiceContainer;
+use SearchEngine;
+use SearchEngineConfig;
+use SearchEngineFactory;
use SiteLookup;
use SiteStore;
+use SkinFactory;
/**
* Service locator for MediaWiki core services.
return $this->getService( 'SearchEngineConfig' );
}
+ /**
+ * @return SkinFactory
+ */
+ public function getSkinFactory() {
+ return $this->getService( 'SkinFactory' );
+ }
+
///////////////////////////////////////////////////////////////////////////
// NOTE: When adding a service getter here, don't forget to add a test
// case for it in MediaWikiServicesTest::provideGetters() and in
},
'SearchEngineFactory' => function( MediaWikiServices $services ) {
- // Create search engine
- return new SearchEngineFactory( $services->getService( 'SearchEngineConfig' ) );
+ return new SearchEngineFactory( $services->getSearchEngineConfig() );
},
'SearchEngineConfig' => function( MediaWikiServices $services ) {
- // Create a search engine config from main config.
- $config = $services->getService( 'MainConfig' );
- return new SearchEngineConfig( $config );
- }
+ global $wgContLang;
+ return new SearchEngineConfig( $services->getMainConfig(), $wgContLang );
+ },
+
+ 'SkinFactory' => function( MediaWikiServices $services ) {
+ return new SkinFactory();
+ },
///////////////////////////////////////////////////////////////////////////
// NOTE: When adding a service here, don't forget to add a getter function
return self::makeTitle(
$linkTarget->getNamespace(),
$linkTarget->getText(),
- $linkTarget->getFragment() );
+ $linkTarget->getFragment(),
+ $linkTarget->getInterwiki()
+ );
}
/**
$this->mTitleValue = new TitleValue(
$this->getNamespace(),
$this->getDBkey(),
- $this->getFragment() );
+ $this->getFragment(),
+ $this->getInterwiki()
+ );
} catch ( InvalidArgumentException $ex ) {
wfDebug( __METHOD__ . ': Can\'t create a TitleValue for [[' .
$this->getPrefixedText() . ']]: ' . $ex->getMessage() . "\n" );
const ERROR_CACHE = 'error_cache';
const ERROR_UNCACHEABLE = 'uncacheable';
+ const PRESUME_FRESH_TTL_SEC = 5;
+
public function execute() {
$user = $this->getUser();
$params = $this->extractRequestParams();
return false;
}
- $time = wfTimestamp( TS_UNIX, $editInfo->output->getTimestamp() );
- if ( ( time() - $time ) <= 3 ) {
+ $age = time() - wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
+ if ( $age <= self::PRESUME_FRESH_TTL_SEC ) {
$stats->increment( 'editstash.cache_hits.presumed_fresh' );
- $logger->debug( "Timestamp-based cache hit for key '$key'." );
+ $logger->debug( "Timestamp-based cache hit for key '$key' (age: $age sec)." );
return $editInfo; // assume nothing changed
}
if ( $changed || $res->numRows() != $templateUses ) {
$stats->increment( 'editstash.cache_misses.proven_stale' );
- $logger->info( "Stale cache for key '$key'; template changed." );
+ $logger->info( "Stale cache for key '$key'; template changed. (age: $age sec)" );
return false;
}
}
if ( $changed || $res->numRows() != count( $files ) ) {
$stats->increment( 'editstash.cache_misses.proven_stale' );
- $logger->info( "Stale cache for key '$key'; file changed." );
+ $logger->info( "Stale cache for key '$key'; file changed. (age: $age sec)" );
return false;
}
}
$stats->increment( 'editstash.cache_hits.proven_fresh' );
- $logger->debug( "Cache hit for key '$key'." );
+ $logger->debug( "Verified cache hit for key '$key' (age: $age sec)." );
return $editInfo;
}
"apihelp-revisiondelete-param-hide": "Cosa nascondere per ogni versione.",
"apihelp-revisiondelete-param-show": "Cosa mostrare per ogni versione.",
"apihelp-revisiondelete-param-reason": "Motivo per l'eliminazione o il ripristino.",
- "apihelp-stashedit-param-title": "Titolo della pagina revisionata.",
+ "apihelp-stashedit-param-title": "Titolo della pagina che si sta modificando.",
"apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.",
"apihelp-stashedit-param-text": "Contenuto della pagina.",
"apihelp-stashedit-param-contentmodel": "Modello di contenuto dei nuovi contenuti.",
*
* @return LinkCache
*/
- public static function &singleton() {
+ public static function singleton() {
if ( !self::$instance ) {
self::$instance = new LinkCache;
}
}
/**
- * @param string $title
+ * @param string $title Prefixed DB key
* @return int Page ID or zero
*/
public function getGoodLinkID( $title ) {
* @param string $field ('length','redirect','revision','model')
* @return string|int|null
*/
- public function getGoodLinkFieldObj( $title, $field ) {
+ public function getGoodLinkFieldObj( Title $title, $field ) {
$dbkey = $title->getPrefixedDBkey();
$info = $this->mGoodLinks->get( $dbkey );
if ( !$info ) {
}
/**
- * @param string $title
+ * @param string $title Prefixed DB key
* @return bool
*/
public function isBadLink( $title ) {
}
}
+ /**
+ * @param string $title Prefixed DB key
+ */
public function clearBadLink( $title ) {
- $this->mBadLinks->clear( [ $title ] );
+ $this->mBadLinks->delete( $title );
}
/**
* @param Title $title
*/
- public function clearLink( $title ) {
+ public function clearLink( Title $title ) {
$dbkey = $title->getPrefixedDBkey();
$this->mBadLinks->delete( $dbkey );
$this->mGoodLinks->delete( $dbkey );
/**
* Add a title to the link cache, return the page_id or zero if non-existent
*
- * @param string $title Title to add
+ * @param string $title Prefixed DB key
* @return int Page ID or zero
*/
public function addLink( $title ) {
* @param string[] $to_lines
*/
private function diffLocal( $from_lines, $to_lines ) {
- global $wgExternalDiffEngine;
-
- if ( $wgExternalDiffEngine == 'wikidiff3' ) {
- // wikidiff3
- $wikidiff3 = new WikiDiff3();
- $wikidiff3->diff( $from_lines, $to_lines );
- $this->xchanged = $wikidiff3->removed;
- $this->ychanged = $wikidiff3->added;
- unset( $wikidiff3 );
- } else {
- // old diff
- $n_from = count( $from_lines );
- $n_to = count( $to_lines );
- $this->xchanged = $this->ychanged = [];
- $this->xv = $this->yv = [];
- $this->xind = $this->yind = [];
- $this->seq = [];
- $this->in_seq = [];
- $this->lcs = 0;
-
- // Skip leading common lines.
- for ( $skip = 0; $skip < $n_from && $skip < $n_to; $skip++ ) {
- if ( $from_lines[$skip] !== $to_lines[$skip] ) {
- break;
- }
- $this->xchanged[$skip] = $this->ychanged[$skip] = false;
- }
- // Skip trailing common lines.
- $xi = $n_from;
- $yi = $n_to;
- for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
- if ( $from_lines[$xi] !== $to_lines[$yi] ) {
- break;
- }
- $this->xchanged[$xi] = $this->ychanged[$yi] = false;
- }
-
- // Ignore lines which do not exist in both files.
- for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
- $xhash[$this->lineHash( $from_lines[$xi] )] = 1;
- }
-
- for ( $yi = $skip; $yi < $n_to - $endskip; $yi++ ) {
- $line = $to_lines[$yi];
- $this->ychanged[$yi] = empty( $xhash[$this->lineHash( $line )] );
- if ( $this->ychanged[$yi] ) {
- continue;
- }
- $yhash[$this->lineHash( $line )] = 1;
- $this->yv[] = $line;
- $this->yind[] = $yi;
- }
- for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
- $line = $from_lines[$xi];
- $this->xchanged[$xi] = empty( $yhash[$this->lineHash( $line )] );
- if ( $this->xchanged[$xi] ) {
- continue;
- }
- $this->xv[] = $line;
- $this->xind[] = $xi;
- }
-
- // Find the LCS.
- $this->compareSeq( 0, count( $this->xv ), 0, count( $this->yv ) );
- }
- }
-
- /**
- * Returns the whole line if it's small enough, or the MD5 hash otherwise
- *
- * @param string $line
- *
- * @return string
- */
- private function lineHash( $line ) {
- if ( strlen( $line ) > self::MAX_XREF_LENGTH ) {
- return md5( $line );
- } else {
- return $line;
- }
- }
-
- /**
- * Divide the Largest Common Subsequence (LCS) of the sequences
- * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
- * sized segments.
- *
- * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
- * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
- * sub sequences. The first sub-sequence is contained in [X0, X1),
- * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
- * that (X0, Y0) == (XOFF, YOFF) and
- * (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).
- *
- * This function assumes that the first lines of the specified portions
- * of the two files do not match, and likewise that the last lines do not
- * match. The caller must trim matching lines from the beginning and end
- * of the portions it is going to specify.
- *
- * @param int $xoff
- * @param int $xlim
- * @param int $yoff
- * @param int $ylim
- * @param int $nchunks
- *
- * @return array List of two elements, integer and array[].
- */
- private function diag( $xoff, $xlim, $yoff, $ylim, $nchunks ) {
- $flip = false;
-
- if ( $xlim - $xoff > $ylim - $yoff ) {
- // Things seems faster (I'm not sure I understand why)
- // when the shortest sequence in X.
- $flip = true;
- list( $xoff, $xlim, $yoff, $ylim ) = [ $yoff, $ylim, $xoff, $xlim ];
- }
-
- if ( $flip ) {
- for ( $i = $ylim - 1; $i >= $yoff; $i-- ) {
- $ymatches[$this->xv[$i]][] = $i;
- }
- } else {
- for ( $i = $ylim - 1; $i >= $yoff; $i-- ) {
- $ymatches[$this->yv[$i]][] = $i;
- }
- }
-
- $this->lcs = 0;
- $this->seq[0] = $yoff - 1;
- $this->in_seq = [];
- $ymids[0] = [];
-
- $numer = $xlim - $xoff + $nchunks - 1;
- $x = $xoff;
- for ( $chunk = 0; $chunk < $nchunks; $chunk++ ) {
- if ( $chunk > 0 ) {
- for ( $i = 0; $i <= $this->lcs; $i++ ) {
- $ymids[$i][$chunk - 1] = $this->seq[$i];
- }
- }
-
- $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
- // @codingStandardsIgnoreStart Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
- for ( ; $x < $x1; $x++ ) {
- // @codingStandardsIgnoreEnd
- $line = $flip ? $this->yv[$x] : $this->xv[$x];
- if ( empty( $ymatches[$line] ) ) {
- continue;
- }
-
- $k = 0;
- $matches = $ymatches[$line];
- reset( $matches );
- while ( list( , $y ) = each( $matches ) ) {
- if ( empty( $this->in_seq[$y] ) ) {
- $k = $this->lcsPos( $y );
- assert( $k > 0 );
- $ymids[$k] = $ymids[$k - 1];
- break;
- }
- }
-
- while ( list( , $y ) = each( $matches ) ) {
- if ( $y > $this->seq[$k - 1] ) {
- assert( $y < $this->seq[$k] );
- // Optimization: this is a common case:
- // next match is just replacing previous match.
- $this->in_seq[$this->seq[$k]] = false;
- $this->seq[$k] = $y;
- $this->in_seq[$y] = 1;
- } elseif ( empty( $this->in_seq[$y] ) ) {
- $k = $this->lcsPos( $y );
- assert( $k > 0 );
- $ymids[$k] = $ymids[$k - 1];
- }
- }
- }
- }
-
- $seps[] = $flip ? [ $yoff, $xoff ] : [ $xoff, $yoff ];
- $ymid = $ymids[$this->lcs];
- for ( $n = 0; $n < $nchunks - 1; $n++ ) {
- $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $n ) / $nchunks );
- $y1 = $ymid[$n] + 1;
- $seps[] = $flip ? [ $y1, $x1 ] : [ $x1, $y1 ];
- }
- $seps[] = $flip ? [ $ylim, $xlim ] : [ $xlim, $ylim ];
-
- return [ $this->lcs, $seps ];
- }
-
- /**
- * @param int $ypos
- *
- * @return int
- */
- private function lcsPos( $ypos ) {
- $end = $this->lcs;
- if ( $end == 0 || $ypos > $this->seq[$end] ) {
- $this->seq[++$this->lcs] = $ypos;
- $this->in_seq[$ypos] = 1;
-
- return $this->lcs;
- }
-
- $beg = 1;
- while ( $beg < $end ) {
- $mid = (int)( ( $beg + $end ) / 2 );
- if ( $ypos > $this->seq[$mid] ) {
- $beg = $mid + 1;
- } else {
- $end = $mid;
- }
- }
-
- assert( $ypos != $this->seq[$end] );
-
- $this->in_seq[$this->seq[$end]] = false;
- $this->seq[$end] = $ypos;
- $this->in_seq[$ypos] = 1;
-
- return $end;
- }
-
- /**
- * Find LCS of two sequences.
- *
- * The results are recorded in the vectors $this->{x,y}changed[], by
- * storing a 1 in the element for each line that is an insertion
- * or deletion (ie. is not in the LCS).
- *
- * The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1.
- *
- * Note that XLIM, YLIM are exclusive bounds.
- * All line numbers are origin-0 and discarded lines are not counted.
- *
- * @param int $xoff
- * @param int $xlim
- * @param int $yoff
- * @param int $ylim
- */
- private function compareSeq( $xoff, $xlim, $yoff, $ylim ) {
- // Slide down the bottom initial diagonal.
- while ( $xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff] ) {
- ++$xoff;
- ++$yoff;
- }
-
- // Slide up the top initial diagonal.
- while ( $xlim > $xoff && $ylim > $yoff
- && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]
- ) {
- --$xlim;
- --$ylim;
- }
-
- if ( $xoff == $xlim || $yoff == $ylim ) {
- $lcs = 0;
- } else {
- // This is ad hoc but seems to work well.
- // $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
- // $nchunks = max(2,min(8,(int)$nchunks));
- $nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
- list( $lcs, $seps ) = $this->diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
- }
-
- if ( $lcs == 0 ) {
- // X and Y sequences have no common subsequence:
- // mark all changed.
- while ( $yoff < $ylim ) {
- $this->ychanged[$this->yind[$yoff++]] = 1;
- }
- while ( $xoff < $xlim ) {
- $this->xchanged[$this->xind[$xoff++]] = 1;
- }
- } else {
- // Use the partitions to split this problem into subproblems.
- reset( $seps );
- $pt1 = $seps[0];
- while ( $pt2 = next( $seps ) ) {
- $this->compareSeq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
- $pt1 = $pt2;
- }
- }
+ $wikidiff3 = new WikiDiff3();
+ $wikidiff3->diff( $from_lines, $to_lines );
+ $this->xchanged = $wikidiff3->removed;
+ $this->ychanged = $wikidiff3->added;
}
/**
$otext = str_replace( "\r\n", "\n", $otext );
$ntext = str_replace( "\r\n", "\n", $ntext );
- if ( $wgExternalDiffEngine == 'wikidiff' ) {
- wfDeprecated( 'wikidiff support', '1.27' );
+ if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) {
+ wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' );
$wgExternalDiffEngine = false;
}
return $text;
}
- } elseif ( $wgExternalDiffEngine != 'wikidiff3' && $wgExternalDiffEngine !== false ) {
+ } elseif ( $wgExternalDiffEngine !== false ) {
# Diff via the shell
$tmpDir = wfTempDir();
$tempName1 = tempnam( $tmpDir, 'diff_' );
return $status; // skip checks
}
+ // Preload all of the stat info in as few round trips as possible...
+ foreach ( $this->backends as $backend ) {
+ $realPaths = $this->substPaths( $paths, $backend );
+ $backend->preloadFileStat( [ 'srcs' => $realPaths, 'latest' => true ] );
+ }
+
$mBackend = $this->backends[$this->masterIndex];
foreach ( $paths as $path ) {
$params = [ 'src' => $path, 'latest' => true ];
* @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of
* each subsection, ignored if empty.
* @param bool &$hasUserVisibleFields Whether the section had user-visible fields.
+ * @throws LogicException When called on uninitialized field data, e.g. When
+ * HTMLForm::displayForm was called without calling HTMLForm::prepareForm
+ * first.
*
* @return string
*/
public function displaySection( $fields,
$sectionName = '',
$fieldsetIDPrefix = '',
- &$hasUserVisibleFields = false ) {
+ &$hasUserVisibleFields = false
+ ) {
+ if ( $this->mFieldData === null ) {
+ throw new LogicException( 'HTMLForm::displaySection() called on uninitialized field data. '
+ . 'You probably called displayForm() without calling prepareForm() first.' );
+ }
+
$displayFormat = $this->getDisplayFormat();
$html = [];
"Servien"
]
},
+ "config-help": "hulpe",
"mainpagetext": "'''’t Installeren van de MediaWiki programmatuur is succesvol.'''",
"mainpagedocfooter": "Bekiek de [//meta.wikimedia.org/wiki/Help:Contents haandleiding] veur informasie over t gebruuk van de wikiprogrammatuur.\n\n== Meer hulpe ==\n* [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]\n* [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]"
}
$this->mURL = $url;
$this->mAPI = $api;
$this->mWikiID = $wikiId;
- $this->mLocal = $local;
- $this->mTrans = $trans;
+ $this->mLocal = (bool)$local;
+ $this->mTrans = (bool)$trans;
}
/**
}
/**
- * Purge the cache for an interwiki prefix
+ * Resets locally cached Interwiki objects. This is intended for use during testing only.
+ * This does not invalidate entries in the persistent cache, as invalidateCache() does.
+ * @since 1.27
+ */
+ public static function resetLocalCache() {
+ static::$smCache = [];
+ }
+
+ /**
+ * Purge the cache (local and persistent) for an interwiki prefix.
* @param string $prefix
* @since 1.26
*/
$cache = ObjectCache::getMainWANInstance();
$key = wfMemcKey( 'interwiki', $prefix );
$cache->delete( $key );
+ unset( static::$smCache[$prefix] );
}
/**
// Split values
list( $local, $url ) = explode( ' ', $value, 2 );
$s->mURL = $url;
- $s->mLocal = (int)$local;
+ $s->mLocal = (bool)$local;
} else {
$s = false;
}
if ( isset( $mc['iw_url'] ) ) {
$iw = new Interwiki();
$iw->mURL = $mc['iw_url'];
- $iw->mLocal = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
- $iw->mTrans = isset( $mc['iw_trans'] ) ? $mc['iw_trans'] : 0;
+ $iw->mLocal = isset( $mc['iw_local'] ) ? (bool)$mc['iw_local'] : false;
+ $iw->mTrans = isset( $mc['iw_trans'] ) ? (bool)$mc['iw_trans'] : false;
$iw->mAPI = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
$iw->mWikiID = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
public function getName() {
$msg = wfMessage( 'interwiki-name-' . $this->mPrefix )->inContentLanguage();
- return !$msg->exists() ? '' : $msg;
+ return !$msg->exists() ? '' : $msg->text();
}
/**
public function getDescription() {
$msg = wfMessage( 'interwiki-desc-' . $this->mPrefix )->inContentLanguage();
- return !$msg->exists() ? '' : $msg;
+ return !$msg->exists() ? '' : $msg->text();
}
/**
* @return LinkTarget
*/
public function createFragmentTarget( $fragment );
+
+ /**
+ * Whether this LinkTarget has an interwiki component
+ *
+ * @return bool
+ */
+ public function isExternal();
+
+ /**
+ * The interwiki component of this LinkTarget
+ *
+ * @return string
+ */
+ public function getInterwiki();
}
return true;
}
+ /**
+ * Get ImageMagick subsampling factors for the target JPEG pixel format.
+ *
+ * @param string $pixelFormat one of 'yuv444', 'yuv422', 'yuv420'
+ * @return array of string keys
+ */
+ protected function imageMagickSubsampling( $pixelFormat ) {
+ switch ( $pixelFormat ) {
+ case 'yuv444':
+ return [ '1x1', '1x1', '1x1' ];
+ case 'yuv422':
+ return [ '2x1', '1x1', '1x1' ];
+ case 'yuv420':
+ return [ '2x2', '1x1', '1x1' ];
+ default:
+ throw new MWException( 'Invalid pixel format for JPEG output' );
+ }
+ }
+
/**
* Transform an image using ImageMagick
*
protected function transformImageMagick( $image, $params ) {
# use ImageMagick
global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea,
- $wgImageMagickTempDir, $wgImageMagickConvertCommand;
+ $wgImageMagickTempDir, $wgImageMagickConvertCommand, $wgJpegPixelFormat;
$quality = [];
$sharpen = [];
$animation_pre = [];
$animation_post = [];
$decoderHint = [];
+ $subsampling = [];
if ( $params['mimeType'] == 'image/jpeg' ) {
$qualityVal = isset( $params['quality'] ) ? (string)$params['quality'] : null;
// JPEG decoder hint to reduce memory, available since IM 6.5.6-2
$decoderHint = [ '-define', "jpeg:size={$params['physicalDimensions']}" ];
}
+ if ( $wgJpegPixelFormat ) {
+ $factors = $this->imageMagickSubsampling( $wgJpegPixelFormat );
+ $subsampling = [ '-sampling-factor', implode( ',', $factors ) ];
+ }
} elseif ( $params['mimeType'] == 'image/png' ) {
$quality = [ '-quality', '95' ]; // zlib 9, adaptive filtering
if ( $params['interlace'] ) {
[ '-depth', 8 ],
$sharpen,
[ '-rotate', "-$rotation" ],
+ $subsampling,
$animation_post,
[ $this->escapeMagickOutput( $params['dstPath'] ) ] ) );
*/
protected function transformImageMagickExt( $image, $params ) {
global $wgSharpenReductionThreshold, $wgSharpenParameter, $wgMaxAnimatedGifArea,
- $wgMaxInterlacingAreas;
+ $wgMaxInterlacingAreas, $wgJpegPixelFormat;
try {
$im = new Imagick();
if ( $params['interlace'] ) {
$im->setInterlaceScheme( Imagick::INTERLACE_JPEG );
}
+ if ( $wgJpegPixelFormat ) {
+ $factors = $this->imageMagickSubsampling( $wgJpegPixelFormat );
+ $im->setSamplingFactors( $factors );
+ }
} elseif ( $params['mimeType'] == 'image/png' ) {
$im->setCompressionQuality( 95 );
if ( $params['interlace'] ) {
: '';
$edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialFormat ) : '';
+ if ( $edit->output ) {
+ $edit->output->setCacheTime( wfTimestampNow() );
+ }
+
+ // Process cache the result
$this->mPreparedEdit = $edit;
+
return $edit;
}
if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
wfIncrStats( "pcache.miss.expired" );
$cacheTime = $optionsKey->getCacheTime();
- wfDebug( "Parser options key expired, touched " . $article->getTouched()
+ wfDebugLog( "ParserCache",
+ "Parser options key expired, touched " . $article->getTouched()
. ", epoch $wgCacheEpoch, cached $cacheTime\n" );
return false;
} elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
wfIncrStats( "pcache.miss.revid" );
$revId = $article->getLatest();
$cachedRevId = $optionsKey->getCacheRevisionId();
- wfDebug( "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n" );
+ wfDebugLog( "ParserCache",
+ "ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
+ );
return false;
}
}
$casToken = null;
+ /** @var ParserOutput $value */
$value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
if ( !$value ) {
wfDebug( "ParserOutput cache miss.\n" );
if ( !$useOutdated && $value->expired( $touched ) ) {
wfIncrStats( "pcache.miss.expired" );
$cacheTime = $value->getCacheTime();
- wfDebug( "ParserOutput key expired, touched $touched, "
+ wfDebugLog( "ParserCache",
+ "ParserOutput key expired, touched $touched, "
. "epoch $wgCacheEpoch, cached $cacheTime\n" );
$value = false;
} elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
wfIncrStats( "pcache.miss.revid" );
$revId = $article->getLatest();
$cachedRevId = $value->getCacheRevisionId();
- wfDebug(
+ wfDebugLog( "ParserCache",
"ParserOutput key is for an old revision, latest $revId, cached $cachedRevId\n"
);
$value = false;
Hooks::run( 'RejectParserCacheValue', [ $value, $wikiPage, $popts ] ) === false
) {
wfIncrStats( 'pcache.miss.rejected' );
- wfDebug(
+ wfDebugLog( "ParserCache",
"ParserOutput key valid, but rejected by RejectParserCacheValue hook handler.\n"
);
$value = false;
return $this->mTOCHTML;
}
+ /**
+ * @return string|null TS_MW timestamp of the revision content
+ */
public function getTimestamp() {
return $this->mTimestamp;
}
* @return Status
* @since 1.23 Added 'perItemStatus' param
*/
- public function setVisibility( $params ) {
+ public function setVisibility( array $params ) {
$bitPars = $params['value'];
$comment = $params['comment'];
$perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
* @return SearchNearMatcher
*/
public function getNearMatcher( Config $config ) {
- return new SearchNearMatcher( $config );
+ global $wgContLang;
+ return new SearchNearMatcher( $config, $wgContLang );
}
/**
*/
private $config;
- public function __construct( Config $config ) {
+ /**
+ * Current language
+ * @var Language
+ */
+ private $language;
+
+ public function __construct( Config $config, Language $lang ) {
$this->config = $config;
+ $this->language = $lang;
}
/**
*/
public function searchableNamespaces() {
$arr = [];
- foreach ( $this->config->get( 'ContLang' )->getNamespaces() as $ns => $name ) {
+ foreach ( $this->language->getNamespaces() as $ns => $name ) {
if ( $ns >= NS_MAIN ) {
$arr[$ns] = $name;
}
* @return string[] List of names
*/
public function namespacesAsText( $namespaces ) {
- $formatted = array_map( [ $this->config->get( 'ContLang' ), 'getFormattedNsText' ], $namespaces );
+ $formatted = array_map( [ $this->language, 'getFormattedNsText' ], $namespaces );
foreach ( $formatted as $key => $ns ) {
if ( empty( $ns ) ) {
$formatted[$key] = wfMessage( 'blanknamespace' )->text();
*/
protected $config;
- public function __construct( Config $config ) {
+ /**
+ * Current language
+ * @var Language
+ */
+ private $language;
+ public function __construct( Config $config, Language $lang ) {
$this->config = $config;
+ $this->language = $lang;
}
/**
* @return null|Title
*/
protected function getNearMatchInternal( $searchterm ) {
- $lang = $this->config->get( 'ContLang' );
+ $lang = $this->language;
$allSearchTerms = [ $searchterm ];
* @file
*/
+use MediaWiki\MediaWikiServices;
+
/**
* Factory class to create Skin objects
*
private $displayNames = [];
/**
- * @var SkinFactory
+ * @deprecated in 1.27
+ * @return SkinFactory
*/
- private static $self;
-
public static function getDefaultInstance() {
- if ( !self::$self ) {
- self::$self = new self;
- }
-
- return self::$self;
+ return MediaWikiServices::getInstance()->getSkinFactory();
}
/**
return;
}
# If there's an exact or very near match, jump right there.
- $title = $this->newSearchEngine()->
- getNearMatcher( $this->getConfig() )->getNearMatch( $term );
+ $title = $this->getSearchEngine()
+ ->getNearMatcher( $this->getConfig() )->getNearMatch( $term );
if ( !is_null( $title ) &&
Hooks::run( 'SpecialSearchGoResult', [ $term, $title, &$url ] )
$user->setOption( 'searchNs' . $n, true );
}
- $user->saveSettings();
+ DeferredUpdates::addCallableUpdate( function () use ( $user ) {
+ $user->saveSettings();
+ } );
+
return true;
}
* @param string $text The page title. Should be valid. Only minimal normalization is applied.
* Underscores will be replaced.
* @param string $fragment The fragment name (may be empty).
+ * @param string $interwiki The interwiki name (may be empty).
*
* @throws InvalidArgumentException If the namespace is invalid
* @return string
*/
- public function formatTitle( $namespace, $text, $fragment = '' ) {
+ public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' ) {
if ( $namespace !== false ) {
$namespace = $this->getNamespaceName( $namespace, $text );
$text = $text . '#' . $fragment;
}
+ if ( $interwiki !== '' ) {
+ $text = $interwiki . ':' . $text;
+ }
+
$text = str_replace( '_', ' ', $text );
return $text;
// be refactored to avoid this.
$parts = $this->splitTitleString( $text, $defaultNamespace );
- // Interwiki links are not supported by TitleValue
- if ( $parts['interwiki'] !== '' ) {
- throw new MalformedTitleException( 'title-invalid-interwiki', $text );
- }
-
// Relative fragment links are not supported by TitleValue
if ( $parts['dbkey'] === '' ) {
throw new MalformedTitleException( 'title-invalid-empty', $text );
}
- return new TitleValue( $parts['namespace'], $parts['dbkey'], $parts['fragment'] );
+ return new TitleValue(
+ $parts['namespace'],
+ $parts['dbkey'],
+ $parts['fragment'],
+ $parts['interwiki']
+ );
}
/**
* @return string
*/
public function getPrefixedText( LinkTarget $title ) {
- return $this->formatTitle( $title->getNamespace(), $title->getText(), '' );
+ return $this->formatTitle(
+ $title->getNamespace(),
+ $title->getText(),
+ '',
+ $title->getInterwiki()
+ );
}
/**
* @return string
*/
public function getFullText( LinkTarget $title ) {
- return $this->formatTitle( $title->getNamespace(), $title->getText(), $title->getFragment() );
+ return $this->formatTitle(
+ $title->getNamespace(),
+ $title->getText(),
+ $title->getFragment(),
+ $title->getInterwiki()
+ );
}
/**
* @param int|bool $namespace The namespace ID (or false, if the namespace should be ignored)
* @param string $text The page title
* @param string $fragment The fragment name (may be empty).
+ * @param string $interwiki The interwiki prefix (may be empty).
*
* @return string
*/
- public function formatTitle( $namespace, $text, $fragment = '' );
+ public function formatTitle( $namespace, $text, $fragment = '', $interwiki = '' );
/**
* Returns the title text formatted for display, without namespace of fragment.
* @note In contrast to Title, this is designed to be a plain value object. That is,
* it is immutable, does not use global state, and causes no side effects.
*
- * @note TitleValue represents the title of a local page (or fragment of a page).
- * It does not represent a link, and does not support interwiki prefixes etc.
- *
* @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
* @since 1.23
*/
*/
protected $fragment;
+ /**
+ * @var string
+ */
+ protected $interwiki;
+
/**
* Constructs a TitleValue.
*
* @param string $dbkey The page title in valid DBkey form. No normalization is applied.
* @param string $fragment The fragment title. Use '' to represent the whole page.
* No validation or normalization is applied.
+ * @param string $interwiki The interwiki component
*
* @throws InvalidArgumentException
*/
- public function __construct( $namespace, $dbkey, $fragment = '' ) {
+ public function __construct( $namespace, $dbkey, $fragment = '', $interwiki = '' ) {
Assert::parameterType( 'integer', $namespace, '$namespace' );
Assert::parameterType( 'string', $dbkey, '$dbkey' );
Assert::parameterType( 'string', $fragment, '$fragment' );
+ Assert::parameterType( 'string', $interwiki, '$interwiki' );
// Sanity check, no full validation or normalization applied here!
Assert::parameter( !preg_match( '/^_|[ \r\n\t]|_$/', $dbkey ), '$dbkey', 'invalid DB key' );
$this->namespace = $namespace;
$this->dbkey = $dbkey;
$this->fragment = $fragment;
+ $this->interwiki = $interwiki;
}
/**
* @return TitleValue
*/
public function createFragmentTarget( $fragment ) {
- return new TitleValue( $this->namespace, $this->dbkey, $fragment );
+ return new TitleValue(
+ $this->namespace,
+ $this->dbkey,
+ $fragment,
+ $this->interwiki
+ );
+ }
+
+ /**
+ * Whether it has an interwiki part
+ *
+ * @since 1.27
+ * @return bool
+ */
+ public function isExternal() {
+ return $this->interwiki !== '';
+ }
+
+ /**
+ * Returns the interwiki part
+ *
+ * @since 1.27
+ * @return string
+ */
+ public function getInterwiki() {
+ return $this->interwiki;
}
/**
$name .= '#' . $this->fragment;
}
+ if ( $this->interwiki !== '' ) {
+ $name = $this->interwiki . ':' . $name;
+ }
+
return $name;
}
}
"BAB ZAA",
"ASammour",
"Maroen1990",
- "Sonic N800"
+ "Sonic N800",
+ "Jdforrester"
]
},
"tog-underline": "سطر تحت الوصلات:",
"minoredit": "هذا تعديل طفيف",
"watchthis": "راقب هذه الصفحة",
"savearticle": "احفظ الصفحة",
+ "publishpage": "نشر الصفحة",
"preview": "عرض مسبق",
"showpreview": "أظهر معاينة",
"showdiff": "عرض التغييرات",
"minoredit": "Гэта дробная праўка",
"watchthis": "Назіраць за гэтай старонкай",
"savearticle": "Захаваць старонку",
+ "publishpage": "Апублікаваць старонку",
"preview": "Папярэдні прагляд",
"showpreview": "Праглядзець",
"showdiff": "Паказаць зьмены",
"apisandbox-results-error": "Адбылася памылка пры загрузцы адказу на API-запыт: $1.",
"apisandbox-request-url-label": "URL-адрас запыту:",
"apisandbox-request-time": "Час запыту: {{PLURAL:$1|$1 мс}}",
+ "apisandbox-alert-page": "Палі на гэтай старонцы няслушныя.",
"booksources": "Крыніцы кніг",
"booksources-search-legend": "Пошук кніг",
"booksources-isbn": "ISBN:",
"minoredit": "Tato změna je malá editace.",
"watchthis": "Sledovat tuto stránku",
"savearticle": "Uložit změny",
+ "publishpage": "Zveřejnit stránku",
"preview": "Náhled",
"showpreview": "Ukázat náhled",
"showdiff": "Ukázat změny",
"tooltip-ca-nstab-category": "Zobrazit kategorii",
"tooltip-minoredit": "Označit změnu jako malou editaci",
"tooltip-save": "Uložit vaše změny",
+ "tooltip-publish": "Zveřejnit vaše změny",
"tooltip-preview": "Zobrazit náhled vašich změn; prosíme, zobrazte si ho před uložením!",
"tooltip-diff": "Zobrazit, jaké změny jste v textu provedli",
"tooltip-compareselectedversions": "Podívat se na rozdíly mezi dvěma vybranými verzemi této stránky.",
"minoredit": "Nur Kleinigkeiten wurden verändert",
"watchthis": "Diese Seite beobachten",
"savearticle": "Seite speichern",
+ "publishpage": "Seite veröffentlichen",
"preview": "Vorschau",
"showpreview": "Vorschau zeigen",
"showdiff": "Änderungen zeigen",
"tooltip-ca-nstab-category": "Kategorieseite anzeigen",
"tooltip-minoredit": "Diese Änderung als klein markieren.",
"tooltip-save": "Änderungen speichern",
+ "tooltip-publish": "Deine Änderungen veröffentlichen",
"tooltip-preview": "Vorschau der Änderungen an dieser Seite. Bitte vor dem Speichern benutzen!",
"tooltip-diff": "Änderungen am Text zeigen",
"tooltip-compareselectedversions": "Unterschied zwischen zwei ausgewählten Versionen dieser Seite anzeigen",
"hidden-category-category": "Kategoriyê nımıtey",
"category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}",
"category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.",
- "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena pele esta|enê $1 peli estê.}}, be $2 ra pêro pia}}",
+ "category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 tenan ra, {{PLURAL:$1|ena pele esta|$1 peli}}, ena kategoriye miyan derê}}",
"category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
"category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.",
"category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
"resetpass_submit": "Parola eyar kere u newe ra dekewe",
"changepassword-success": "Parola şıma be serkewtış vuriye!",
"changepassword-throttled": "Şıma zaf ronıştış akerdış ke.Kerem ke verdi dekewten $1 bıpawe.",
+ "botpasswords-label-appid": "Bot name:",
+ "botpasswords-label-create": "Vıraze",
+ "botpasswords-label-update": "Rocane ke",
"botpasswords-label-cancel": "Bıtexelne",
"botpasswords-label-delete": "Bestere",
+ "botpasswords-label-resetpassword": "Parola reset ke",
+ "botpasswords-label-grants-column": "Dayen",
"resetpass_forbidden": "parolayi nêvuryayi",
"resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
"resetpass-submit-loggedin": "Parola bıvurne",
"userinvalidcssjstitle": "'''Teme:''' Mewzuyê \"$1\" çıniyo.\nDosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
"updated": "(Rozeneya)",
"note": "'''Not:'''",
- "previewnote": "'''Xo vira mekerê ke ena yew verqayta.'''\nVurnayışê şıma hona qeyd nêbiyo!",
+ "previewnote": "'''Şıma bızanê ke ena yew verqayta.'''\nVurnayışê şıma hona qeyd nêbiyo!",
"continue-editing": "Şo herunda vurnayışi",
"previewconflict": "No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.",
"session_fail_preview": "Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.",
"prefs-help-signature": "Peran de vatenana de vatışi\"<nowiki>~~~~</nowiki>\" ya do imza bé, no bahdo beno çerğé imza u wahdey zemani",
"badsig": "Îmzayê tu raşt niyo.\nEtiketê HTMLî kontrol bike.",
"badsiglength": "İmzaya şıma zaf derga.\nA gani be $1 {{PLURAL:$1|karakter|karakteran}} ra zêde mebo.",
- "yourgender": "Çıçiy cı esto?",
+ "yourgender": "Cınsiyeta şıma?",
"gender-unknown": "Ez detay nivana",
"gender-male": "Perané wiki camérd deyne ezo vırnena",
"gender-female": "Perané wiki cıni deyne eza vırnena",
"enhancedrc-history": "tarix",
"recentchanges": "Vurnayışê peyêni",
"recentchanges-legend": "Tercihê vurnayışanê peyênan",
- "recentchanges-summary": "Ena pele de wiki sero vurnayışanê peyênan teqib ke.",
+ "recentchanges-summary": "Wiki sero vurnayışanê peyênan ena pele de teqib kerê.",
"recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
"recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
"recentchanges-label-newpage": "Enê vurnayışi ra yew pela newiye vıraziye",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
"recentchanges-legend-plusminus": "''(±123)''",
"rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
- "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
- "rcshowhideminor": "Vurnayışanê werdiyan $1",
+ "rclistfrom": "$3 u seate $2 ra tepiya vurnayışanê neweyan bımocne",
+ "rcshowhideminor": "vurnayışanê werdiyan $1",
"rcshowhideminor-show": "Bımocne",
"rcshowhideminor-hide": "Bınımne",
- "rcshowhidebots": "Botan $1",
+ "rcshowhidebots": "Vurnayışanê botan $1",
"rcshowhidebots-show": "Bımocne",
"rcshowhidebots-hide": "Bınımne",
- "rcshowhideliu": "Karberanê qeydınan $1",
+ "rcshowhideliu": "Qeydbıyayê karberan $1",
"rcshowhideliu-show": "Bımocne",
"rcshowhideliu-hide": "Bınımne",
- "rcshowhideanons": "Karberanê bênameyan $1",
+ "rcshowhideanons": "Bêname karberan $1",
"rcshowhideanons-show": "Bımocne",
"rcshowhideanons-hide": "Bınımne",
"rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
"rcshowhidepatr-show": "Bımocne",
"rcshowhidepatr-hide": "Bınımne",
- "rcshowhidemine": "Vurnayışanê mı $1",
+ "rcshowhidemine": "Vurnayışanê êdê mı $1",
"rcshowhidemine-show": "Bımocne",
"rcshowhidemine-hide": "Bınımne",
"rcshowhidecategorization": "kategorizasyona perer $1",
"rcshowhidecategorization-show": "Bımocne",
"rcshowhidecategorization-hide": "Bınımne",
- "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
+ "rclinks": "Peyên $2 rocan de $1 vurnayışan bımocne <br />$3",
"diff": "ferq",
"hist": "verên",
"hide": "Bınımne",
"uploadbtn": "Dosya bar ke",
"reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
"upload-tryagain": "Deskripyonê dosyayî ke vurîya ey qeyd bike",
- "uploadnologin": "Şıma cıkewtış nêvıraşto",
+ "uploadnologin": "Şıma cıkewtış nêvıraşt o",
"uploadnologintext": "Ti şeni $1 dosya bar bikere.",
"upload_directory_missing": "Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.",
"upload_directory_read_only": "Direktorê dosyayê ($1)î webserver de nieşkeno binuse.",
"watchlist-details": "{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.",
"wlheader-enotif": "E-mail xeber dayiş abiyo.",
"wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
- "wlnote": "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
+ "wlnote": "$3 seate u $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
"wlshowlast": "Peyni de vurnayışan ra $1 seata u $2 roca bımocnê",
"watchlist-hide": "Bınımne",
"wlshowtime": "Peyênan bımocne:",
- "wlshowhideminor": "vurnayışê werdiyi",
+ "wlshowhideminor": "vurnayışanê werdiyan",
"wlshowhidebots": "boti",
"wlshowhideliu": "karberê qeydıni",
"wlshowhideanons": "karberê anonimi",
"actioncomplete": "Kar bi temam",
"actionfailed": "kar nêbı",
"deletedtext": "\"$1\" biya wedariya.\nQe qeydê wedarnayışi, $2 bevinin.",
- "dellogpage": "Qeydê esterıtışi",
+ "dellogpage": "Qeydê esternayışi",
"dellogpagetext": "listeya cêrıni heme qaydê hewn a kerdeyan o.",
- "deletionlog": "qeydê esterıtışi",
+ "deletionlog": "Qeydê esternayışi",
"reverted": "revizyono verin tepiya anciyayo",
"deletecomment": "Sebeb:",
"deleteotherreason": "Sebebo bin:",
"sp-contributions-newbies": "Tenya iştıraqanê karberanê neweyan bımocne",
"sp-contributions-newbies-sub": "Qe hesebê newe",
"sp-contributions-newbies-title": "Îştîrakê karberî ser hesabê neweyî",
- "sp-contributions-blocklog": "Qeydê blokey",
+ "sp-contributions-blocklog": "Qeydê meni",
"sp-contributions-deleted": "iştırakê karberi esterdi",
"sp-contributions-uploads": "barkerdey",
"sp-contributions-logs": "qeydi",
"contribslink": "iştıraqi",
"emaillink": "e-poste bırışe",
"autoblocker": "Şıma otomatikmen kılit biy, çıke adresa şımaya ''IP''y terefê \"[[User:$1|$1]]\" gureniyena.\nSebebê kılitbiyayışê $1'i \"$2\"o",
- "blocklogpage": "Qeydê bloqi",
+ "blocklogpage": "Qeydê meni",
"blocklog-showlog": "verniyê no/na karberi cıwa ver geriyayo/ya.",
"blocklog-showsuppresslog": "verniyê no/na karberi cıwa ver geriyayo/ya.",
"blocklogentry": "[[$1]] biyo bloqe, sebeb: $3, hetana $2 do bıramo.",
"Mgpena",
"Transonlohk",
"Eloy",
- "Lemondoge"
+ "Lemondoge",
+ "Jdforrester"
]
},
"tog-underline": "Subrayar los enlaces:",
"minoredit": "Esta es una edición menor",
"watchthis": "Vigilar esta página",
"savearticle": "Guardar la página",
+ "publishpage": "Publicar la página",
"preview": "Previsualizar",
"showpreview": "Mostrar previsualización",
"showdiff": "Mostrar los cambios",
"userpage-userdoesnotexist": "El usuario «$1» no está registrado. Asegúrate de que realmente quieres crear o editar esta página.",
"userpage-userdoesnotexist-view": "El usuario «$1» no está registrado.",
"blocked-notice-logextract": "Este usuario se encuentra actualmente bloqueado.\nA continuación se muestra la última entrada del registro de bloqueos para más información:",
- "clearyourcache": "<strong>Nota:</strong> tras guardar, quizás necesites actualizar la caché de tu navegador para ver los cambios.\n* <strong>Firefox/Safari:</strong> Mantén presionada la tecla <em>Mayús</em> mientras pulsas el botón <em>Actualizar</em>, o presiona <em>Ctrl+F5</em> o <em>Ctrl+R</em> (<em>⌘+R</em> en Mac)\n* <strong>Google Chrome:</strong> presiona <em>Ctrl+Shift+R</em> (<em>⌘+Mayús+R</em> en Mac)\n* <strong>Internet Explorer:</strong> mantén presionada <em>Ctrl</em> mientras pulsas <em>Actualizar</em>, o presiona <em>Ctrl+F5</em>\n* <strong>Opera:</strong> vacía la caché en <em>Herramientas → Preferencias</em>",
+ "clearyourcache": "<strong>Nota:</strong> tras guardar, quizás necesites actualizar la caché de tu navegador para ver los cambios.\n* <strong>Firefox/Safari:</strong> Mantén presionada la tecla <em>Mayús</em> mientras pulsas el botón <em>Actualizar</em>, o presiona <em>Ctrl+F5</em> o <em>Ctrl+R</em> (<em>⌘+R</em> en Mac)\n* <strong>Google Chrome:</strong> presiona <em>Ctrl+Shift+R</em> (<em>⌘+Mayús+R</em> en Mac)\n* <strong>Internet Explorer:</strong> mantén presionada <em>Ctrl</em> mientras pulsas <em>Actualizar</em>, o presiona <em>Ctrl+F5</em>\n* <strong>Opera:</strong> dirígete a <em>Menú → Configuración</em> (<em>Opera → Preferencias</em> en Mac) y luego a <em>Privacidad y seguridad → Borrar datos de navegación → Imágenes y archivos en caché</em>.",
"usercssyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el nuevo CSS antes de guardarlo.",
"userjsyoucanpreview": "<strong>Consejo:</strong> usa el botón «{{int:showpreview}}» para probar el nuevo código JavaScript antes de guardarlo.",
"usercsspreview": "<strong>Recuerda que solo estás previsualizando tu CSS de usuario.\n¡Aún no se ha guardado!</strong>",
"tooltip-ca-nstab-category": "Ver la página de categoría",
"tooltip-minoredit": "Marcar este cambio como menor",
"tooltip-save": "Guardar los cambios",
+ "tooltip-publish": "Publicar tus cambios",
"tooltip-preview": "Previsualiza tus cambios. ¡Hazlo antes de grabar!",
"tooltip-diff": "Mostrar los cambios que has hecho en el texto.",
"tooltip-compareselectedversions": "Ver las diferencias entre las dos versiones seleccionadas de esta página.",
"tooltip-ca-nstab-category": "Kategoria orrialdea ikusi",
"tooltip-minoredit": "Markatu aldaketa hau txikitzat",
"tooltip-save": "Zure aldaketak gorde",
+ "tooltip-publish": "Argitaratu zure aldaketak",
"tooltip-preview": "Zure aldaketak aurreikusi, mesedez gorde aurretik erabili!",
"tooltip-diff": "Testuari egindako aldaketak erakutsi.",
"tooltip-compareselectedversions": "Ikusi orri honen bi bertsio hautatuen arteko aldeak.",
"C13m3n7",
"Gnangbade",
"Frigory",
- "Lemondoge"
+ "Lemondoge",
+ "Jdforrester"
]
},
"tog-underline": "Soulignement des liens :",
"minoredit": "Modification mineure",
"watchthis": "Suivre cette page",
"savearticle": "Enregistrer",
+ "publishpage": "Publier la page",
"preview": "Prévisualisation",
"showpreview": "Prévisualiser",
"showdiff": "Voir les modifications",
"tooltip-ca-nstab-category": "Voir la page de la catégorie",
"tooltip-minoredit": "Marquer mes modifications comme mineures",
"tooltip-save": "Enregistrer vos modifications",
+ "tooltip-publish": "Publier vos modifications",
"tooltip-preview": "Merci de prévisualiser vos modifications avant de les publier",
"tooltip-diff": "Affiche les modifications que vous avez apportées au texte",
"tooltip-compareselectedversions": "Afficher les différences entre deux versions de cette page",
"minoredit": "Esta é unha edición pequena",
"watchthis": "Vixiar esta páxina",
"savearticle": "Gardar a páxina",
+ "publishpage": "Publicar páxina",
"preview": "Vista previa",
"showpreview": "Mostrar a vista previa",
"showdiff": "Mostrar os cambios",
"tooltip-ca-nstab-category": "Ver a páxina da categoría",
"tooltip-minoredit": "Marcar isto coma unha edición pequena",
"tooltip-save": "Gravar os seus cambios",
+ "tooltip-publish": "Publicar os seus cambios",
"tooltip-preview": "Vista previa dos seus cambios; por favor, úsea antes de gravalos!",
"tooltip-diff": "Mostrar os cambios que fixo no texto",
"tooltip-compareselectedversions": "Ver as diferenzas entre dúas versións seleccionadas desta páxina",
"redirectedfrom": "(הופנה מהדף $1)",
"redirectpagesub": "דף הפניה",
"redirectto": "הפניה ל:",
- "lastmodifiedat": "ש×\95× ×\94 ×\9c×\90×\97ר×\95× ×\94 ×\91Ö¾$2, $1.",
+ "lastmodifiedat": "ש×\81×\95Ö¼× ×\94 ×\9c×\90×\97ר×\95× ×\94 ×\91Ö¾$1, ×\91שע×\94 $2.",
"viewcount": "דף זה נצפה {{PLURAL:$1|פעם אחת|פעמיים|$1 פעמים}}.",
"protectedpage": "דף מוגן",
"jumpto": "קפיצה אל:",
"minoredit": "זוהי עריכה משנית",
"watchthis": "מעקב אחרי דף זה",
"savearticle": "שמירה",
+ "publishpage": "פרסום הדף",
"preview": "תצוגה מקדימה",
"showpreview": "תצוגה מקדימה",
"showdiff": "הצגת שינויים",
"userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא בִּדקו אם ברצונכם ליצור/לערוך את הדף הזה.",
"userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
"blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
- "clearyourcache": "<strong>×\94ער×\94:</strong> ×\9c×\90×\97ר ×\94ש×\9e×\99ר×\94, ×\99×\99ת×\9b×\9f שתצ×\98ר×\9b×\95 ×\9c× ×§×\95ת ×\90ת ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f (cache) ש×\9c ×\94×\93פ×\93פ×\9f ×\9b×\93×\99 ×\9c×\94×\91×\97×\99×\9f ×\91ש×\99× ×\95×\99×\99×\9d.\n* <strong>פ×\99×\99רפ×\95קס / ספ×\90ר×\99:</strong> ×\9c×\97צ×\95 ×\95×\94×\97×\96×\99ק×\95 ×\90ת ×\94×\9eקש <em>Shift</em> ×\91עת ×\9c×\97×\99צת×\9b×\9d ×¢×\9c <strong>×\98×¢×\99× ×\94 ×\9e×\97×\93ש</strong> (Reload), ×\90×\95 ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-F5</em> ×\90×\95 <em>Ctrl-R</em>‏ (<em><span dir=\"ltr\">â\8c\98-R</span></em> ×\91×\9e×\97ש×\91 ×\9eק)\n* <strong>×\92×\95×\92×\9c ×\9bר×\95×\9d:</strong> ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-Shift-R</em>‏ (<em><span dir=\"ltr\">â\8c\98-Shift-R</span></em> ×\91×\9e×\97ש×\91 ×\9eק)\n* <strong>×\90×\99× ×\98×¨× ×\98 ×\90קספ×\9c×\95רר:</strong> ×\9c×\97צ×\95 ×\95×\94×\97×\96×\99ק×\95 ×\90ת ×\94×\9eקש <em>Ctrl</em> ×\91עת ×\9c×\97×\99צת×\9b×\9d ×¢×\9c <strong>×¨×¢× ×\9f</strong> (Refresh), ×\90×\95 ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-F5</em>\n* <strong>×\90×\95פר×\94:</strong> × ×§×\95 ×\90ת ×\94×\9e×\98×\9e×\95×\9f ×\91Ö¾<em>Toolsâ\80\8f â\86\90 Preferences</em>",
+ "clearyourcache": "<strong>×\94ער×\94:</strong> ×\9c×\90×\97ר ×\94ש×\9e×\99ר×\94, ×\99×\99ת×\9b×\9f שתצ×\98ר×\9b×\95 ×\9c× ×§×\95ת ×\90ת ×\96×\99×\9bר×\95×\9f ×\94×\9e×\98×\9e×\95×\9f (cache) ש×\9c ×\94×\93פ×\93פ×\9f ×\9b×\93×\99 ×\9c×\94×\91×\97×\99×\9f ×\91ש×\99× ×\95×\99×\99×\9d.\n* <strong>פ×\99×\99רפ×\95קס / ספ×\90ר×\99:</strong> ×\9c×\97צ×\95 ×\95×\94×\97×\96×\99ק×\95 ×\90ת ×\94×\9eקש <em>Shift</em> ×\91עת ×\9c×\97×\99צת×\9b×\9d ×¢×\9c <strong>×\98×¢×\99× ×\94 ×\9e×\97×\93ש</strong> (Reload), ×\90×\95 ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-F5</em> ×\90×\95 <em>Ctrl-R</em>‏ (<em><span dir=\"ltr\">â\8c\98-R</span></em> ×\91×\9e×\97ש×\91 ×\9eק)\n* <strong>×\92×\95×\92×\9c ×\9bר×\95×\9d:</strong> ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-Shift-R</em>‏ (<em><span dir=\"ltr\">â\8c\98-Shift-R</span></em> ×\91×\9e×\97ש×\91 ×\9eק)\n* <strong>×\90×\99× ×\98×¨× ×\98 ×\90קספ×\9c×\95רר:</strong> ×\9c×\97צ×\95 ×\95×\94×\97×\96×\99ק×\95 ×\90ת ×\94×\9eקש <em>Ctrl</em> ×\91עת ×\9c×\97×\99צת×\9b×\9d ×¢×\9c <strong>×¨×¢× ×\9f</strong> (Refresh), ×\90×\95 ×\9c×\97צ×\95 ×¢×\9c צ×\99ר×\95×£ ×\94×\9eקש×\99×\9d <em>Ctrl-F5</em>\n* <strong>×\90×\95פר×\94:</strong> פת×\97×\95 ×\90ת <em>Menu â\86\92 Settings</em> (×\94× ×§×¨×\90 <em>Opera â\86\92 Preferences</em> ×\91×\9e×\97ש×\91 ×\9eק) ×\95×\90×\96 ×\9c×\97צ×\95 ×¢×\9c <em>Privacy & security â\86\92 Clear browsing data â\86\92 Cached images and files</em>.",
"usercssyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
"userjsyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
"usercsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.\nהוא עדיין לא נשמר!</strong>",
"prefs-help-gender": "אין חובה למלא העדפה זו.\nהמערכת משתמשת במידע זה כדי לפנות אליך/אלייך ולציין את שם המשתמש שלך במין הדקדוקי הנכון.\nהמידע יהיה ציבורי.",
"email": "דוא\"ל",
"prefs-help-realname": "אין חובה למלא את השם האמיתי.\nהשם האמיתי עשוי לשמש כדי לייחס לך את עבודתך.",
- "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה שתשכחו אותה.",
+ "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
"prefs-help-email-others": "באפשרותך גם לבחור לאפשר לאחרים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים אחרים ייצרו איתך קשר.",
"prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
"prefs-info": "מידע בסיסי",
"cant-move-category-page": "אין לך הרשאה להעביר דפי קטגוריה.",
"cant-move-to-category-page": "אין לך הרשאה להעביר דף לדף קטגוריה.",
"newtitle": "השם החדש:",
- "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
+ "move-watch": "מעקב אחרי דף המקור ואחרי דף היעד",
"movepagebtn": "העברה",
"pagemovedsub": "ההעברה הושלמה בהצלחה",
"movepage-moved": "הדף \"$1\" הועבר לשם \"$2\".",
"articleexists": "קיים כבר דף באותו שם, או שהשם שבחרת אינו תקין.\nנא לבחור שם אחר.",
"cantmove-titleprotected": "אין לך הרשאה להעביר את הדף לכאן, כי השם החדש מוגן מפני יצירה.",
"movetalk": "העברה גם של דף השיחה",
- "move-subpages": "×\94×¢×\91רת ×\9b×\9c ×\93פ×\99 ×\94×\9e×©× ×\94 (×¢×\93 $1)",
- "move-talk-subpages": "×\94×¢×\91רת ×\9b×\9c ×\93פ×\99 ×\94×\9e×©× ×\94 ש×\9c ×\93×£ ×\94ש×\99×\97×\94 (×¢×\93 $1)",
+ "move-subpages": "העברת דפי המשנה (עד $1)",
+ "move-talk-subpages": "העברת דפי המשנה של דף השיחה (עד $1)",
"movepage-page-exists": "הדף $1 קיים כבר ולא ניתן לדרוס אותו אוטומטית.",
"movepage-page-moved": "הדף $1 הועבר לשם $2.",
"movepage-page-unmoved": "לא ניתן להעביר את הדף $1 לשם $2.",
"import-comment": "הערה:",
"importtext": "נא לייצא את הקובץ מאתר המקור באמצעות ב[[Special:Export|כלי הייצוא]].\nשמרו אותו למחשב שלכם והעלו אותו לכאן.",
"importstart": "ייבוא דפים...",
- "import-revision-count": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+ "import-revision-count": "‏{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
"importnopages": "אין דפים לייבוא.",
"imported-log-entries": "{{PLURAL:$1|יובאה פעולת יומן אחת|יובאו $1 פעולות יומן}}.",
"importfailed": "הייבוא נכשל: <nowiki>$1</nowiki>",
"tooltip-ca-nstab-category": "צפייה בדף הקטגוריה",
"tooltip-minoredit": "סימון עריכה זו כמשנית",
"tooltip-save": "שמירת השינויים שלך",
+ "tooltip-publish": "פרסום השינויים שלך",
"tooltip-preview": "תצוגה מקדימה של השינויים שלך. נא להשתמש באפשרות זו לפני השמירה.",
"tooltip-diff": "צפייה בשינויים שערכתם בטקסט",
"tooltip-compareselectedversions": "צפייה בהשוואת שתי גרסאות של דף זה",
"tog-watchdefault": "Az általam szerkesztett lapok és fájlok felvétele a figyelőlistámra",
"tog-watchmoves": "Az általam átnevezett lapok és fájlok felvétele a figyelőlistámra",
"tog-watchdeletion": "Az általam törölt lapok és fájlok felvétele a figyelőlistámra",
+ "tog-watchuploads": "Általam feltöltött új fájlok hozzáadása a figyelőlistámhoz",
"tog-watchrollback": "Az általam visszaállított lapok felvétele a figyelőlistámra",
"tog-minordefault": "Alapértelmezetten minden szerkesztésemet jelölje aprónak",
"tog-previewontop": "Előnézet megjelenítése a szerkesztőablak előtt",
"tags-edit-revision-legend": "Címkék hozzáadás vagy eltávolítása {{PLURAL:$1|ehhez a változathoz|mind a(z) $1 változathoz}}",
"tags-edit-logentry-legend": "Címkék hozzáadás vagy eltávolítása {{PLURAL:$1|ehhez a napló bejegyzéshez|mind a(z) $1 napló bejegyzéshez}}",
"tags-edit-existing-tags": "Létező címkék:",
- "tags-edit-existing-tags-none": "„Nincs”",
+ "tags-edit-existing-tags-none": "<em>Nincs</em>",
"tags-edit-new-tags": "Új címkék:",
"tags-edit-add": "Alábbi címkék hozzáadása:",
"tags-edit-remove": "Alábbi címkék eltávolítása:",
"tags-edit-reason": "Ok:",
"tags-edit-revision-submit": "Változások alkalmazás {{PLURAL:$1|ehhez a|$1}} változathoz",
"tags-edit-logentry-submit": "Változások alkalmazás {{PLURAL:$1|ehhez a|$1}} napló bejegyzéshez",
- "tags-edit-success": "A változások sikeresen alkalmazva.",
+ "tags-edit-success": "A változások alkalmazva.",
"tags-edit-failure": "A változásokat nem sikerült alkalmazni:\n$1",
"tags-edit-nooldid-title": "Érvénytelen változat",
"tags-edit-nooldid-text": "Nem adtál meg a változatot, vagy a megadott változat nem létezik.",
"tog-watchdefault": "Ավելացնել իմ խմբագրած էջերը և նիշքերը իմ հսկացանկում",
"tog-watchmoves": "Ավելացնել իմ վերնավանած էջերը և նիշքերը իմ հսկացանկում",
"tog-watchdeletion": "Ավելացնել իմ ջնջած էջերը և նիշքերը իմ հսկացանկում",
+ "tog-watchuploads": "Իմ բեռնած նիշքերը ավելացնել իմ հսկացանկում",
"tog-watchrollback": "Իմ հետ շրջած էջերն ավելացնել իմ հսկացանկում",
"tog-minordefault": "Բոլոր խմբագրումները լռելյայն կերպով նշել որպես չնչին",
"tog-previewontop": "Ցույց տալ նախադիտումը խմբագրման դաշտից առաջ",
"october-date": "Հոկտեմբերի $1",
"november-date": "Նոյեմբերի $1",
"december-date": "Դեկտեմբերի $1",
+ "period-am": "AM",
+ "period-pm": "PM",
"pagecategories": "{{PLURAL:$1|Կատեգորիա|Կատեգորիաներ}}",
"category_header": "«$1» կատեգորիայի հոդվածները",
"subcategories": "Ենթակատեգորիաներ",
"view-pool-error": "Ներեցեք, սերվերները գերբեռնված են այս պահին։\nՇատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը կրկին դիտելու համար։\n\n$1",
"generic-pool-error": "Ներեցեք, սերվերները գերբեռնված են այս պահին։\nՇատ օգտվողներ փորձում են դիտել այս էջը։\nԽնդրում ենք սպասել որոշ ժամանակ էջը կրկին դիտելու համար։",
"pool-errorunknown": "Անհայտ սխալ",
+ "poolcounter-usage-error": "Օգտագործման սխալ՝ $1",
"aboutsite": "{{grammar:genitive|{{SITENAME}}}} մասին",
"aboutpage": "Project:Էությունը",
"copyright": "Կայքի բովանդակությունը թողարկված է $1 թույլատրագրով, եթե այլ բան նշված չէ։",
"pagetitle": "$1 — {{SITENAME}}",
"retrievedfrom": "Ստացված է «$1» էջից",
"youhavenewmessages": "Դուք ունեք $1 ($2)։",
+ "youhavenewmessagesfromusers": "{{PLURAL:$4|Դուք ունեք}} $1 {{PLURAL:$3|այլ մասնակից|$3 մասնակցից}} ($2):",
"youhavenewmessagesmanyusers": "Դուք ունեք $1 մի քանի օգտագործողից ($2)։",
"newmessageslinkplural": "{{PLURAL:$1|նոր հաղորդագրություն|999=նոր հաղորդագրություններ}}",
"newmessagesdifflinkplural": "վերջին {{PLURAL:$1|փոփոխում|999=փոփոխումներ}}",
"filerenameerror": "Չհաջողվեց «$1» նիշքը վերանվանել «$2»։",
"filedeleteerror": "Չհաջողվեց ջնջել «$1» ֆայլը։",
"directorycreateerror": "Չհաջողվեց ստեղծել «$1» պանակը։",
+ "directoryreadonlyerror": "$1 թղթապանակը միայն ընթերցելու համար է:",
"filenotfound": "Չհաջողվեց գտնել «$1» ֆայլը։",
"unexpected": "Անսպասելի արժեք. «$1»=«$2»։",
"formerror": "Սխալ. չհաջողվեց փոխանցել տվյալները",
"customjsprotected": "Դուք չեք կարող խմբագրել այս ՋավաՍկրիպտ էջը, քանի որ այն պարունակում է այլ մասնակցի անձնական նախընտրանքներ։",
"mycustomcssprotected": "Դուք բավարար իրավունքներ չունեք այս CSS էջը խմբագրելու համար։",
"mycustomjsprotected": "Դուք բավարար իրավունքներ չունեք այս JavaScript էջը խմբագրելու համար։",
+ "myprivateinfoprotected": "Դուք իրավասու չեք խմբագրել Ձեր անձնական տեղեկությունը:",
"mypreferencesprotected": "Դուք բավարար իրավունքներ չունեք Ձեր նախընտրությունները խմբագրելու համար։",
"ns-specialprotected": "«{{ns:special}}» անվանատարածքի էջերը չեն կարող խմբագրվել։",
"titleprotected": "Այս անվանմամբ էջի ստեղծումը արգելվել է [[User:$1|$1]] մասնակցի կողմից։\nՏրված պատճառն է՝ <em>$2</em>։",
"virus-scanfailed": "զննման սխալ (կոդ $1)",
"virus-unknownscanner": "անծանոթ հակավիրուս՝",
"logouttext": "<strong>Դուք դուրս եկաք համակարգից։</strong>\n\nԻ նկատի ունեցեք, որ որոշ էջեր կարող են ցուցադրվել այնպես՝ ինչպես եթե դեռ համակարգում լինեիք մինչև որ չջնջեք ձեր զննարկիչի հիշապահեստը։",
+ "cannotlogoutnow-title": "Այժմ դուրս գալ անհնար է",
+ "cannotlogoutnow-text": "$1 օգտագործելիս դուրս գալն անհնար է:",
"welcomeuser": "Բարի գալո՜ւստ, $1",
"welcomecreation-msg": "Ձեր հաշիվն ստեղծված է։\nՉմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։",
"yourname": "Մասնակցի անուն՝",
"remembermypassword": "Հիշել իմ մուտքը այս դիտարկչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)",
"userlogin-remembermypassword": "Մուտք գործած մնալ",
"userlogin-signwithsecure": "Օգտագործել անվտանգ միացում",
+ "cannotloginnow-title": "Այժմ դուրս գալ անհնար է",
+ "cannotloginnow-text": "$1 օգտագործելիս դուրս գալն անհնար է:",
"yourdomainname": "Ձեր դոմենը՝",
"password-change-forbidden": "Այս վիքիում չեք կարող փոխել գաղտնաբառ։",
"externaldberror": "Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։",
"wrongpassword": "Մուտքագրված գաղտնաբառը սխալ էր։ Խնդրում ենք կրկին փորձել։",
"wrongpasswordempty": "Մուտքագրված գաղտնաբառը դատարկ էր։ Խնդրում ենք կրկին փորձել։",
"passwordtooshort": "Գաղտնաբառը պետք է պարունակի առնվազն {{PLURAL:$1|1 սիմվոլ|$1 սիմվոլ}}։",
+ "passwordtoolong": "Ծածկագիրը չի կարող գերազանցել {{PLURAL:$1|1 նիշը|$1 նիշը}}:",
"password-name-match": "Գաղտնաբառը պետք է տարբեր լինել ձեր մասնակցի անունից։",
"password-login-forbidden": "Այս ծածկանվան և գաղտնաբառի օգտագործումն արգելված է",
"mailmypassword": "Փոխել գաղտնաբառը",
"noemailprefs": "Այս հնարավորության գործածման համար անհրաժեշտ է նշել էլ-փոստի հասցե։",
"emailconfirmlink": "Վավերացնել ձեր էլ-փոստի հասցեն",
"invalidemailaddress": "Նշված էլ-փոստի հասցեն անընդունելի է, քանի որ այն ունի անթույլատրելի ֆորմատ։ Խնդրում ենք նշել ճշմարիտ հասցե կամ այս դաշտը թողնել դատարկ։",
+ "cannotchangeemail": "Այս վիքիում մասնակցային հաշվի էլ.փոստի փոփոխությունն անհնար է:",
"emaildisabled": "Այս կայքը չի կարող ուղարկել էլ․ նամակներ։",
"accountcreated": "Հաշիվը ստեղծված է",
"accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|քննարկում]]) մասնակցի հաշիվը ստեղծված է։",
"createaccount-title": "{{SITENAME}}. մասնակցային հաշվի ստեղծում",
"createaccount-text": "Ինչ-որ մեկը ստեղծել է «$2» անվանմամբ մասնակցային հաշիվ «$3» գաղտնաբառով {{SITENAME}} ($4) նախագծում՝ նշելով ձեր էլ-հասցեն։ Ձեզ անհրաժեշտ է մտնել համակարգ և փոխել գաղտնաբառը։\n\nԿարող եք անտեսել այս հաղորդագրությունը, եթե հաշիվը ստեղծվել է սխալմամբ։",
"login-throttled": "Դուք կատարել եք չափից շատ մուտքի փորձ։\nԽնդրում ենք սպասել $1 կրկին փորձելուց առաջ։",
+ "login-abort-generic": "Մուտք գործելը ձախողվեց: Մերժված է:",
+ "login-migrated-generic": "Ձեր մասնակցային հաշիվը տեղափոխվել է, և Ձեր մասնակցային անունն այլևս գոյություն չունի այս վիքիում:",
"loginlanguagelabel": "Լեզու՝ $1",
"pt-login": "Մուտք գործել",
"pt-login-button": "Մտնել",
"newpassword": "Նոր գաղտնաբառը.",
"retypenew": "Հաստատեք նոր գաղտնաբառը.",
"resetpass_submit": "Հաստատել գաղտնաբառը և մտնել համակարգ",
- "changepassword-success": "Ձեր գաղտնաբառը հաջողությամբ փոխված է։",
+ "changepassword-success": "Ձեր գաղտնաբառը փոփոխվեց։",
+ "botpasswords": "Բոտերի ծածկագրեր",
+ "botpasswords-disabled": "Բոտերի ծածկագրերն անջատված են:",
+ "botpasswords-existing": "Գոյություն ունեցող բոտային ծածկագրերը",
+ "botpasswords-createnew": "Ստեղծել նոր բոտային ծածկագիր",
+ "botpasswords-editexisting": "Խմբագրել առկա բոտային ծածկագիրը",
+ "botpasswords-label-appid": "Բոտի անուն՝",
+ "botpasswords-label-create": "Ստեղծել",
+ "botpasswords-label-update": "Թարմացնել",
+ "botpasswords-label-cancel": "Չեղարկել",
+ "botpasswords-label-delete": "Ջնջել",
+ "botpasswords-label-resetpassword": "Վերականգնել ծածկագիրը",
+ "botpasswords-label-restrictions": "Օգտագործման սահմանափակումներ:",
+ "botpasswords-label-grants-column": "Թույլատրված է",
+ "botpasswords-bad-appid": "\"$1\" բոտի անունն անթույլատրելի է:",
+ "botpasswords-created-title": "Բոտի ծածկագիրը ստեղծվել է",
+ "botpasswords-created-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
+ "botpasswords-updated-title": "Բոտի ծածկագիրը թարմացվել է",
+ "botpasswords-updated-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ստեղծվել է:",
+ "botpasswords-deleted-title": "Բոտի ծածկագիրը ջնջված է",
+ "botpasswords-deleted-body": "$2 մասնակցի $1 բոտի համար բոտի ծածկագիրը ջնջվել է:",
"resetpass_forbidden": "Գաղտնաբառը չի կարող փոխվել",
"resetpass-no-info": "Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։",
"resetpass-submit-loggedin": "Փոխել գաղտնաբառը",
"userlogin-yourname-ph": "Чуйоалае доакъашхочун цӀи",
"createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
"yourpassword": "КъайладIоагӀа:",
+ "userlogin-yourpassword": "Пароль",
"yourpasswordagain": "КъайладIоагӀа юха Ӏоязаде:",
"remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
"yourdomainname": "Шун цӀеноагӀув:",
"prevn": "{{PLURAL:$1|хьалхйоагlар $1|хьалхйоагlараш $1|хьалхйоагlараш $1}}",
"nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
"prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
- "nextn-title": "{{PLURAL:$1|1=$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}",
+ "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
"shown-title": "Хьóкха $1 {{PLURAL:$1|даь йоазо|даь йоазонаш}} укх оáгIувна тIа",
"viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) хьажа",
"searchmenu-exists": "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:$1]]\" я'''",
"contributions": "{{GENDER:$1|Доакъашхочунна}} къахьегам",
"contributions-title": "$1 дакъалаьцархочунна къахьегам",
"mycontris": "Са къахьегам",
+ "anoncontribs": "Къахьегам",
"contribsub2": "{{GENDER:$3|$1}} ($2) баь болх",
"uctop": "(xIанзара)",
"month": "Укх бетт (кхы хьалхагIа)",
"thumbnail-more": "Доккха де",
"thumbnail_error": "ЗIамигасуртанчий кхеллама гIалат: $1",
"import-upload-filename": "ПаьлацIи:",
- "tooltip-pt-userpage": "Дакъалаьцархочунна оагIув",
+ "tooltip-pt-userpage": "{{GENDER:|Хьа}} доакъашхочунна оагIув",
"tooltip-pt-mytalk": "Шун дувцамий оагIув",
- "tooltip-pt-preferences": "Шун оттамаш",
+ "tooltip-pt-preferences": "{{GENDER:|Хьа оттамаш}}",
"tooltip-pt-watchlist": "ОоагIувна дагарле, шо бIаргалокхаш йола",
"tooltip-pt-mycontris": "Шун хувцамаш",
"tooltip-pt-login": "Укхаза хьай цIи аьле чувала/яла йиша я, амма из параз дац",
"exif-artist": "Яздархо",
"exif-exifversion": "Верси Exif",
"exif-colorspace": "Басара аре",
- "exif-pixelxdimension": "СÑ\83Ñ\80Ñ\82а Ñ\88ерал",
+ "exif-pixelxdimension": "СÑ\83Ñ\80Ñ\82а Ñ\88орал",
"exif-pixelydimension": "Сурта лакхал",
"exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
"exif-writer": "Яздама да",
"watchlisttools-view": "Дагарчера оагIувнаш тIа хувцамаш",
"watchlisttools-edit": "Дагарче хьажа/хувца",
"watchlisttools-raw": "Яздам мо хувца",
+ "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
"duplicate-defaultsort": "Зем бе. Сатийна дIа-хьа хьоржама доагI \"$2\" хьалхара сатийна дIа-хьа хьоржама доагI \"$1\" хьахьоржа.",
"version": "Доржам",
"version-specialpages": "ГIулакхий оагIувнаш",
"minoredit": "Questa è una modifica minore",
"watchthis": "Aggiungi agli osservati speciali",
"savearticle": "Salva la pagina",
+ "publishpage": "Pubblica pagina",
"preview": "Anteprima",
"showpreview": "Visualizza anteprima",
"showdiff": "Mostra modifiche",
"tooltip-ca-nstab-category": "Vedi la pagina della categoria",
"tooltip-minoredit": "Contrassegna questa modifica come minore",
"tooltip-save": "Salva le modifiche",
+ "tooltip-publish": "Pubblica le tue modifiche",
"tooltip-preview": "Anteprima delle modifiche (consigliata prima di salvare)",
"tooltip-diff": "Guarda le modifiche apportate al testo",
"tooltip-compareselectedversions": "Guarda le differenze tra le due versioni selezionate di questa pagina.",
"tog-editondblclick": "Besut kaca sarana ngeklik pindho",
"tog-editsectiononrightclick": "Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (mbutuhaké JavaScript)",
"tog-watchcreations": "Tambahaké kaca sing tak gawé lan berkas sing tak unggah nèng daptar pangawasan",
- "tog-watchdefault": "Tambahaké kaca lan berkas sing tak sunting nèng daptar pangawasan",
+ "tog-watchdefault": "Tambahaké kaca lan barkas sing tak sunting nyang pawawanganku",
"tog-watchmoves": "Tambahaké kaca lan berkas sing tak pindhahaké nèng daptar pangawasan",
"tog-watchdeletion": "Tambahaké kaca lan berkas sing tak busak nèng daptar pangawasan",
"tog-watchuploads": "Tambahaké barkas anyar sing tak unggah nyang pawawanganku",
"tog-watchrollback": "Tambahaké kaca sing tak wurungaké nyang pawawanganku",
"tog-minordefault": "Tandhanana kabèh suntingan dadi suntingan cilik secara baku",
- "tog-previewontop": "Tuduhna pratayang sadurungé kothak sunting lan ora sawisé",
+ "tog-previewontop": "Deleng prawuryan sadurungé besut kothak",
"tog-previewonfirst": "Tuduhna pratayang ing suntingan kapisan",
"tog-enotifwatchlistpages": "Kirimi kula layang èlèktronik yèn ana kaca utawa berkas nèng daptar pangawasanku sing diowah",
"tog-enotifusertalkpages": "Kirimana aku layang e-mail yèn kaca dhiskusiku owah",
"talkpage": "Rembug kaca iki",
"talkpagelinktext": "gunem",
"specialpage": "Kaca mirunggan",
- "personaltools": "Piranti pribadhi",
+ "personaltools": "Piranti pribadi",
"articlepage": "Deleng kaca isi",
"talk": "Rembug",
"views": "Praèn",
"permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni sing panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
"permissionserrorstext-withaction": "Panjenengan ora duwé hak aksès kanggo $2, amarga {{PLURAL:$1|alasan|alasan}} ing ngisor iki:",
"recreate-moveddeleted-warn": "'''Pènget: Panjenengan gawé manèh sawijining kaca sing wis tau dibusak.'''\n\nMangga digagas manèh apa pantes nerusaké nyunting kaca iki.\nIng ngisor iki kapacak log pambusakan lan pamindhahan saka kaca iki:",
- "moveddeleted-notice": "Kaca iki wis dibusak.\nCathetan busakan lan lihlihan kaca ana ing ngisor minangka rujukan.",
+ "moveddeleted-notice": "Kaca iki wis dibusak.\nCathetan busakan lan lih-lihan kaca ana ing ngisor minangka rujukan.",
"log-fulllog": "Deleng cathetan wutuh",
"edit-hook-aborted": "Suntingan dibatalaké déning kait parser\nTanpa ana katrangan.",
"edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
"revdelete-reason-dropdown": "*Alasan penghapusan yang umum\n** Pelanggaran hak cipta\n** Komentar atau informasi pribadi yang tidak pantas\n** Nama pengguna yang tidak pantas\n** Berpotensi mencemarkan nama baik",
"revdelete-otherreason": "Alesan liya/tambahan:",
"revdelete-reasonotherlist": "Alesan liya",
- "revdelete-edit-reasonlist": "Sunting alesan pambusakan",
+ "revdelete-edit-reasonlist": "Besut jalaraning pambusak",
"revdelete-offender": "Juru pangriptaning owahan:",
"suppressionlog": "Log barang-barang sing didelikaké (''oversight'')",
"suppressionlogtext": "Ngisor iki daptar apa-apa waé sing wis dibusak lan diblokir kalebu kontèn sing didhelikaké saka para pangurus.\nDelok [[Special:BlockList|daptar blokiran]] sing isiné daptar apa-apa waé sing lagi dilarang lan diblokir.",
"userrights": "Manajemen hak panganggo",
"userrights-lookup-user": "Ngatur kelompok panganggo",
"userrights-user-editname": "Lebokna jeneng panganggo:",
- "editusergroup": "Sunting kelompok panganggo",
+ "editusergroup": "Besut golongan {{GENDER:$1|panganggo}}",
"editinguser": "Ngganti hak panganggo '''[[User:$1|$1]]''' $2",
- "userrights-editusergroup": "Sunting kelompok panganggo",
+ "userrights-editusergroup": "Besut golongan panganggo",
"saveusergroups": "Simpen kelompok panganggo",
"userrights-groupsmember": "Anggota saka:",
"userrights-groupsmember-auto": "Anggota implisit saka:",
"right-protect": "Ganti undhaking pangreksan lan owah kaca-kaca sing direksa",
"right-editprotected": "Owah kaca-kaca sing direksa (tanpa pangreksan runtun)",
"right-editsemiprotected": "Owah kaca-kaca sing direksa dadi \"{{int:protect-level-autoconfirmed}}\"",
- "right-editinterface": "Sunting interface (antarmuka) panganggo",
- "right-editusercssjs": "Sunting berkas-berkas CSS lan JS panganggo liya",
- "right-editusercss": "Sunting berkas-berkas CSS panganggo liya",
- "right-edituserjs": "Sunting berkas-berkas JS panganggo liya",
+ "right-editinterface": "Besut antarmuka panganggo",
+ "right-editusercssjs": "Besut barkas-barkas CSS lan JavaScript panganggo liya",
+ "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
+ "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
"right-editmyusercss": "Owahi berkas CSS panganggo sampeyan",
"right-editmyuserjs": "Owahi berkas JavaScript panganggo sampeyan",
"right-viewmywatchlist": "Dheleng daftar pangawasan sampeyan",
"right-unwatchedpages": "Tuduhna daftar kaca-kaca sing ora diawasi",
"right-mergehistory": "Gabungna sajarah kaca-kaca",
"right-userrights": "Besut kabèh hak panganggo",
- "right-userrights-interwiki": "Sunting hak-hak para panganggo ing situs-situs wiki liya",
+ "right-userrights-interwiki": "Besut hak-haking panganggo asal wiki jaba",
"right-siteadmin": "Kunci lan buka kunci basis data",
"right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
"right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
"filedelete-otherreason": "Alesan tambahan/liya:",
"filedelete-reason-otherlist": "Alesan liya",
"filedelete-reason-dropdown": "*Alesan pambusakan\n** Nglanggar hak cipta\n** Berkas duplikat",
- "filedelete-edit-reasonlist": "Sunting alesan pambusakan",
+ "filedelete-edit-reasonlist": "Busak jalaraning pambusak",
"filedelete-maintenance": "Pambusakan lan pambalikan berkas kanggo sawetara dipatèni salawas ana pangruwatan.",
"filedelete-maintenance-title": "Ora bisa mbusak berkas",
"mimesearch": "Panggolèkan MIME",
"deleteotherreason": "Alesan liya utawa tambahan:",
"deletereasonotherlist": "Alesan liya",
"deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandalisme\n** Nglanggar hak cipta\n** Disuwun sing nulis\n** Pangalihan rusak",
- "delete-edit-reasonlist": "Sunting alesan pambusakan",
+ "delete-edit-reasonlist": "Besut jalaraning pambusak",
"delete-toobig": "Kaca iki ndarbèni sajarah panyuntingan sing dawa, yaiku ngluwihi $1 {{PLURAL:$1|revision|révisi}}.\nPambusakan kaca sing kaya mangkono mau wis ora diparengaké kanggo menggak anané karusakan ing {{SITENAME}}.",
"delete-warning-toobig": "Kaca iki duwé sajarah panyuntingan sing dawa, luwih saka $1 {{PLURAL:$1|révisi|révisi}}.\nMbusak kaca iki bisa ngrusak operasi basis data ing {{SITENAME}};\nkudu ngati-ati.",
"deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
"protect-otherreason": "Alesan liya/tambahan:",
"protect-otherreason-op": "Alesan liya",
"protect-dropdown": "*Alesan umum pangreksan\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang suntingan\n** Kaca kerep disunting",
- "protect-edit-reasonlist": "Nyunting alesan reksan",
+ "protect-edit-reasonlist": "Mbesut jalaraning pangreksa",
"protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 sasi:1 month,3 sasi:3 months,6 sasi:6 months,1 taun:1 year,tanpa wates:infinite",
"restriction-type": "Pangreksan:",
"restriction-level": "Tingkatan pambatesan:",
"linkshere": "Kaca-kaca iki nduwé pranala menyang '''[[:$1]]''':",
"nolinkshere": "Ora ana kaca sing nduwé pranala menyang '''[[:$1]]'''.",
"nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''[[:$1]]''' ing bilik jeneng sing kapilih.",
- "isredirect": "kaca lihlihan",
+ "isredirect": "kaca lih-lihan",
"istemplate": "karo cithakan",
"isimage": "pranala berkas",
"whatlinkshere-prev": "{{PLURAL:$1|sadurungé|$1 sadurungé}}",
"blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDelok [[Special:BlockList|daptar blokir]] kanggo ninjo blokiran.",
"ipb-blockingself": "Sampéyan arep mblokir Sampéyan dhéwé! Sampéyan yakin arep nglakoni kuwi?",
"ipb-confirmhideuser": "Sampéyan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?",
- "ipb-edit-dropdown": "Sunting alesan pamblokiran",
+ "ipb-edit-dropdown": "Besut jalaraning pamalang",
"ipb-unblock-addr": "Ilangna blokir $1",
"ipb-unblock": "Ilangna blokir sawijining panganggo utawa alamat IP",
"ipb-blocklist": "Ndeleng blokir sing lagi ditrapaké",
"movepage-page-moved": "Kaca $1 wis dipindhah menyang $2.",
"movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
"movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh sing bakal dialihaké sacara otomatis.",
- "movelogpage": "Cathetan lihlihan",
+ "movelogpage": "Cathetan lih-lihan",
"movelogpagetext": "Ing ngisor iki kapacak log pangalihan kaca.",
"movesubpage": "{{PLURAL:$1|Anak-kaca|Anak-kaca}}",
"movesubpagetext": "Kaca iki nduwèni $1 {{PLURAL:$1|anak-kaca|anak-kaca}} kaya kapacak ing ngisor.",
"autosumm-new": "Gawé kaca sing isi '$1'",
"lag-warn-normal": "Owah-owahan pungkasan sing luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
"lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan sing luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing daftar iki.",
- "watchlistedit-normal-title": "Sunting daftar pangawasan",
+ "watchlistedit-normal-title": "Besut pawawangan",
"watchlistedit-normal-legend": "Busak irah-irahan saka daftar pangawasan",
"watchlistedit-normal-explain": "Irah-irahan utawa judhul ing daftar pangawasan panjenengan kapacak ing ngisor iki.\nKanggo mbusak sawijining irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|nyunting daftar mentah]].",
"watchlistedit-normal-submit": "Busak irah-irahan",
"watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka daftar pangawasan panjenengan:",
- "watchlistedit-raw-title": "Sunting daftar mentah",
- "watchlistedit-raw-legend": "Sunting daftar mentah",
+ "watchlistedit-raw-title": "Besut pawawangan wantahan",
+ "watchlistedit-raw-legend": "Besut pawawangan wantahan",
"watchlistedit-raw-explain": "Irah-irahan ing daftar pangawasan panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak daftar; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca daftar pangawasan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
"watchlistedit-raw-titles": "Irah-irahan:",
"watchlistedit-raw-submit": "Anyarana daftar pangawasan",
"watchlistedit-raw-added": "{{PLURAL:$1|1 irah-irahan wis|$1 irah-irahan wis}} ditambahaké:",
"watchlistedit-raw-removed": "{{PLURAL:$1|1 irah-irahan wis|$1 irah-irahan wis}} diwetokaké:",
"watchlisttools-view": "Tuduhna owah-owahan sing ana gandhèngané",
- "watchlisttools-edit": "Tuduhna lan sunting daftar pangawasan",
- "watchlisttools-raw": "Sunting daftar pangawasan mentah",
+ "watchlisttools-edit": "Deleng lan besut pawawangan",
+ "watchlisttools-raw": "Besut pawawangan wantahan",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|wicara]])",
"duplicate-defaultsort": "Pènget: Kunci pilih asal (''Default sort key'') \"$2\" nggantèkaké kunci pilih asal sadurungé \"$1\".",
"version": "Versi",
"feedback-cancel": "Batal",
"feedback-close": "Rampung",
"feedback-error1": "Kasalahan: Asil ora dikenal saka API",
- "feedback-error2": "Kasalahan: Gagal nyunting",
+ "feedback-error2": "Cacad: Gagal mbesut",
"feedback-error3": "Kasalahan: Ora ana tanggepan saka API",
"feedback-message": "Layang:",
"feedback-subject": "Jejer:",
"minoredit": "Dat es en klein Änderong (mini)",
"watchthis": "Op di Sigg heh oppaßße",
"savearticle": "De Sigg Avspeichere",
+ "publishpage": "Veröffentlesche",
"preview": "Vör-Ansich",
- "showpreview": "Vör-Aansich zeije",
- "showdiff": "De Ungerscheide zeije",
+ "showpreview": "Vöraff belohre",
+ "showdiff": "Veränderonge zeije",
"blankarticle": "<strong>Opjepaß:</strong> Di Sigg, di De jrahd aanlähje wells, es läddesch. Wann De jäz norr_ens op „{{int:savearticle}}“ jehß, weed di Sigg och ohne jät dren aanjelaat.",
"anoneditwarning": "'''Opjepaß:''' Weil De nit enjelogg bes, weed Ding <i lang=\"en\" xml:lang=\"en\">IP</i>-Adräß en heh dä Sigg ier Leß met de Väsiohne faßjehallde wääde.\nWann De [$1 enlogge deihs] udder [$2 desch aanmällds], dann wääde Ding Änderonge met dingem Nahme als Metmaacher opjevöhrt.",
"anonpreviewwarning": "''Weil De nit enjlogg bes, weed Ding <code lang=\"en\">IP</code>-Addräß zoamme met dä neue Version faßjehallde, wann de heh di Sigg avspeichere deihß.''",
"userpage-userdoesnotexist": "Enne Metmaacher „<nowiki>$1</nowiki>“ ham_mer nit, beß De sescher, dat De di Metmaachersigg verhaftesch änndere udder aanlähje wellß?.",
"userpage-userdoesnotexist-view": "Ene Metmaacher mem Nahme „$1“ hät sesch noch nih aanjemeldt",
"blocked-notice-logextract": "Dä Metmaacher es jraad jesperrt.\nHeh kütt der neuste Enndraach drövver uss_em Logbooch övver et Metmaacher_Sperre:",
- "clearyourcache": "'''Opjepass:'''\nNoh em Speichere künnd et sin, datt De Dingem Brauser singe Cache Speicher\növverlisste muss, ih datt De de Änderunge och ze sinn kreß.\n* Beim '''<i lang=\"en\">Mozilla</i>''' un '''<i lang=\"en\">Firefox</i>''' un '''<i lang=\"en\">Safari</i>''', dröck dä Jrußschreffknopp eronger un kleck dann op <i lang=\"en\">Reload</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck <i lang=\"de\">Ctrl+F5</i> / <i lang=\"de\">Strg+F5</i>, udder dröck <i lang=\"en\">Ctrl+R</i> / <i lang=\"de\">Strg+R</i>, obb enem <i lang=\"en\">Macintosh</i> dröck <i lang=\"de\">⌘+R</i>.\n* Beim '''<i lang=\"en\">Google Chrome</i>''', dröck <i lang=\"en\">Ctrl+Jrußschreffknopp+R</i> / <i lang=\"de\">Strg+Jrußschreffknopp+R</i>, obb enem <i lang=\"en\">Macintosh</i> dröck <i lang=\"de\">⌘+Jrußschreffknopp+R</i>.\n* Beim '''<i lang=\"en\">Internet Explorer</i>''', dröck dä Jrußschreffknopp eronger un kleck dann op <i lang=\"en\">Refresh</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck <i lang=\"de\">Ctrl+F5</i> / <i lang=\"de\">Strg+F5</i>,\n* Beim '''<i lang=\"en\">Konqueror</i>''' kleck op <i lang=\"en\">Reload</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck op <i>F5</i>.\n* Beim '''<i lang=\"en\">Opera</i>''' kanns De övver et Menue jonn un däm janze Zwescheschpeischer singe Enhald övver <i lang=\"en\">Tools → Preferences</i> / <i lang=\"de\">Werkzeug → Einstellungen</i> fottschmieße, neuerdings jeiht et och met <i>Alt+F5</i>.",
+ "clearyourcache": "<strong>Opjepass:</strong>\nNoh em Speichere künnd et sin, datt De Dingem Brauser singe Cache Speicher\növverlisste muss, ih datt De de Änderunge och ze sinn kreß.\n* Beim <strong><i lang=\"en\">Mozilla</i></strong> un <strong><i lang=\"en\">Firefox</i></strong> un <strong><i lang=\"en\">Safari</i></strong>, dröck dä Jrußschreffknopp eronger un kleck dann op <i lang=\"en\">Reload</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck <i lang=\"de\">Ctrl+F5</i> / <i lang=\"de\">Strg+F5</i>, udder dröck <i lang=\"en\">Ctrl+R</i> / <i lang=\"de\">Strg+R</i>, obb enem <i lang=\"en\">Macintosh</i> dröck <i lang=\"de\">⌘+R</i>.\n* Beim <strong><i lang=\"en\">Google Chrome</i></strong>, dröck <i lang=\"en\">Ctrl+Jrußschreffknopp+R</i> / <i lang=\"de\">Strg+Jrußschreffknopp+R</i>, obb enem <i lang=\"en\">Macintosh</i> dröck <i lang=\"de\">⌘+Jrußschreffknopp+R</i>.\n* Beim <strong><i lang=\"en\">Internet Explorer</i></strong>, dröck dä Jrußschreffknopp eronger un kleck dann op <i lang=\"en\">Refresh</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck <i lang=\"de\">Ctrl+F5</i> / <i lang=\"de\">Strg+F5</i>,\n* Beim <strong><i lang=\"en\">Konqueror</i></strong> klegg op <i lang=\"en\">Reload</i> / <i lang=\"de\">Aktualisieren</i>, udder dröck op <i>F5</i>.\n* Beim <strong><i lang=\"en\">Opera</i></strong> kanns De övver et Menue jonn un däm janze Zwescheschpeischer singe Enhald övver <i lang=\"en\">Tools → Preferences</i> / <i lang=\"de\">Werkzeug → Einstellungen</i> fottschmieße, neuerdings jeiht et och met <i>Alt+F5</i>.",
"usercssyoucanpreview": "<b>Tipp:</b> Dun met däm <b style=\"padding:2px; background-color:#ddd;\ncolor:black\">Vör-Aansich Zeije</b>-Knopp usprobeere, wat Ding neu\nMetmaacher_CSS/Java_Skripp mäht, ih dat et avspeichere deis!",
"userjsyoucanpreview": "<b>Tipp:</b> Dun met däm <b style=\"padding:2px; background-color:#ddd;\ncolor:black\">Vör-Aansich Zeije</b>-Knopp usprobeere, wat Ding neu\nMetmaacher_Java_Skripp mäht, ih dat et avspeichere deis!",
"usercsspreview": "<b>Opjepass: Do bes heh nor am Usprobeere, wat Ding\nMetmaacher_CSS mäht, et es noch nit jesechert!</b>",
"tooltip-ca-nstab-category": "Dun de Saachjropp aanzeije",
"tooltip-minoredit": "Deit Ding Änderonge als klein Mini-Änderonge markkehre.",
"tooltip-save": "Deit Ding Änderonge avspeichere.",
+ "tooltip-publish": "Donn Ding Änderonge öffentlesch maache",
"tooltip-preview": "Liss de Vör-Aanseesch vun dä Sigg un vun Dinge Änderonge, ih datte se avspeijschere deihs!",
"tooltip-diff": "Zeijsch Ding Änderonge aam Täx aan.",
"tooltip-compareselectedversions": "Dun de Ungerscheid zwesche dä beids usjewählde Versione zeije.",
"logentry-protect-protect-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ jeschöz: $4 met wiggerjävve",
"logentry-protect-modify": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4",
"logentry-protect-modify-cascade": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Schoz vun dä Sigg „$3“ verändert: $4 met wiggerjävve",
- "logentry-rights-rights": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.",
+ "logentry-rights-rights": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät {{GENDER:$2|däm|däm|däm Metmaacher|dä|däm}} „$3“ {{GENDER:$2|sing|sing|sing|ier|sing}} Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.",
"logentry-rights-rights-legacy": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.",
"logentry-rights-autopromote": "{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.",
"logentry-upload-upload": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Dattei „$3“ huhjelahe.",
"minoredit": "Chisto è nu cagnamiénto piccerillo",
"watchthis": "Tiene d'uocchio sta paggena",
"savearticle": "Sarva 'a paggena",
+ "publishpage": "Pubbreca paggena",
"preview": "Anteprimma",
"showpreview": "Vire anteprimma",
"showdiff": "Fa veré 'e cagnamiente",
"userpage-userdoesnotexist": "'O cunto utente \"<nowiki>$1</nowiki>\" nun è riggistrato. Cuntrolla ca si buò overo crià o cagnà sta paggena.",
"userpage-userdoesnotexist-view": "'O cunto utente \"$1\" nun è riggistrato.",
"blocked-notice-logextract": "St'utente è bloccato mò.\nL'urdemo elemento d' 'o riggistro 'e blocche è ripurtato ccà abbascio p'avé nu riferimento:",
- "clearyourcache": "'''Nota:''' aroppo sarvate putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe' vedé 'e cagnamiente. \n*'''Firefox / Safari''': sprémme 'o buttóne maiuscole e ffà clic ncopp'a ''Recarreca'', o pure spremme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' ncopp'a Mac)\n*'''Google Chrome''': spremme ''Ctrl-Shift-R'' (''⌘-Shift-R'' ncopp'a nu Mac)\n*'''Internet Explorer''': spremme 'o buttóne ''Ctrl'' pe' tramente ca faie click ncopp'a ''Refresh'', o pure spremmere ''Ctrl-F5''\n*'''Opera''': sbacanta tutt' 'a cache addò menu ''Strumiente → Preferenze''",
+ "clearyourcache": "<strong>Nota:</strong> aroppo sarvate putisse necessità 'e pulezzà 'a caché d' 'o navigatóre pe' vedé 'e cagnamiente. \n*<strong>Firefox / Safari</strong>: sprémme 'o buttóne maiuscole e ffà clic ncopp'a ''Recarreca'', o pure spremme ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' ncopp'a Mac)\n*<strong>Google Chrome''': spremme ''Ctrl-Shift-R'' (''⌘-Shift-R'' ncopp'a nu Mac)\n*<strong>Internet Explorer</strong>: spremme 'o buttóne ''Ctrl'' pe' tramente ca faie click ncopp'a ''Refresh'', o pure spremmere ''Ctrl-F5''\n* <strong>Opera:</strong> Vaje addò 'o <em>Menu → Mpustaziune</em> (<em>Opera → Mpustaziune</em> ncopp' 'o Mac) e po' ncopp'a <em>Privacy & sicurezza → Pulezza date d' 'o browser → Immaggene e file d' 'a cache</em>.",
"usercssyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o CSS nuovo apprimma d' 'o sarvà.",
"userjsyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o JavaScript nuovo apprimma d' 'o sarvà.",
"usercsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
"tooltip-ca-nstab-category": "Vere a paggena d\"a categurìa",
"tooltip-minoredit": "Rénne chìsto cagnamiénto cchiù ppiccirìllo.",
"tooltip-save": "Sàrva 'e cagnamiénte.",
+ "tooltip-publish": "Pubbreca 'e cagnamiente vuoste",
"tooltip-preview": "Primma 'e sarvà, vìre primma chille ca hê cagnàte!",
"tooltip-diff": "Fà vedé 'e cagnamiente c'avite fatto ô testo",
"tooltip-compareselectedversions": "Fà vedé 'e differenze nfra tutt' 'e dduje verziune scigliute 'e sta paggena",
"morenotlisted": "Disse lieste is niet kompleet...",
"mypage": "Gebrukerszied",
"mytalk": "Mien overleg",
- "anontalk": "Overlegzied veur dit IP-adres",
+ "anontalk": "Overleg",
"navigation": "Navigasie",
"and": " en",
"qbfind": "Zeuken",
"viewsource": "Brontekste bekieken",
"viewsource-title": "Bron bekieken van $1",
"actionthrottled": "Haandeling tegenehöllen",
- "actionthrottledtext": "As maotregel tegen t plaotsen van ongewunste verwiezingen, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
+ "actionthrottledtext": "As maotregel tegen t plaotsen van alderhaande moek, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
"protectedpagetext": "Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.",
- "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken:",
- "viewyourtext": "Je kunnen '''joew bewarkingen''' an de brontekste van disse zied bekieken en kopiëren:",
+ "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken.",
+ "viewyourtext": "Je kunnen <strong>joew bewarkingen</strong> an de brontekste van disse zied bekieken en kopiëren.",
"protectedinterface": "Op disse zied steet tekste die gebruukt wördt veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.\nUm vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
"editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
"cascadeprotected": "Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de \"kaskade\"-opsie:\n$2",
"mypreferencesprotected": "Je hebben gien rechten um joew veurkeuren an te passen.",
"ns-specialprotected": "Spesiale ziejen kunnen niet bewarkt wörden.",
"titleprotected": "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].\nDe op-egeven reden is <em>$2</em>.",
- "filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe beheerder gaf hierveur de volgende reden: \"$3\".",
+ "filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe op-egeven reden is: \"$3\".",
"invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"",
"invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"",
"exception-nologin": "Niet an-emeld",
"createacct-reason": "Reden",
"createacct-reason-ph": "Waorumme je n aandere gebrukerskonto anmaken",
"createacct-submit": "Gebrukerskonto anmaken",
- "createacct-another-submit": "n Aandere gebrukerskonto anmaken",
+ "createacct-another-submit": "Gebrukerskonto anmaken",
"createacct-benefit-heading": "{{SITENAME}} wörden emaakt deur meensen zo as jie.",
"createacct-benefit-body1": "bewarking{{PLURAL:$1||en}}",
"createacct-benefit-body2": "{{PLURAL:$1|zied|ziejen}}",
"nocookieslogin": "t Anmelden is mislokt umdat de webkieker gien scheumbestaanden (cookies) an hef staon. Probeer t aksepteren van scheumbestaanden an te zetten en daornao opniej an te melden.",
"nocookiesfornew": "De gebruker is niet an-emaakt, umdat de bron niet bevestigd kon wörden.\nZörg derveur da'j scheumbestaanden (cookies) an hebben staon, herlaoi disse zied en probeer t opniej.",
"noname": "Je mutten n gebrukersnaam opgeven.",
- "loginsuccesstitle": "Suksesvol an-emeld",
+ "loginsuccesstitle": "An-emeld",
"loginsuccess": "Je bin noen an-emeld bie {{SITENAME}} as \"$1\".",
"nosuchuser": "Der is gien gebruker mit de naam \"$1\".\nGebrukersnamen bin heufdlettergeveulig.\nKiek de schriefwieze effen nao of [[Special:UserLogin/signup|maak n nieje gebruker an]].",
"nosuchusershort": "Der is gien gebruker mit de naam \"$1\". Kiek de spelling nao.",
"createaccount-title": "Gebrukers anmaken veur {{SITENAME}}",
"createaccount-text": "Der hef der ene n gebruker an-emaakt op {{SITENAME}} ($4), mit de naam $2 en t wachtwoord \"$3\". \nMeld je eigen noen an en wiezig t wachtwoord.\n\nNegeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.",
"login-throttled": "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.\nJe mutten effen $1 wachten veurda'j t opniej proberen.",
- "login-abort-generic": "Je bin niet an-emeld. De procedure is aofebreuken.",
+ "login-abort-generic": "Je bin niet an-emeld - Aofebreuken",
"loginlanguagelabel": "Taal: $1",
"suspicious-userlogout": "Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer",
"createacct-another-realname-tip": "Joew echte naam opgeven is niet verplicht.\nA'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
"passwordreset-emailtext-ip": "Der hef der ene, waorschienlik jie zelf vanaof t IP-adres $1, n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen.\nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
"passwordreset-emailtext-user": "De gebruker $1 van {{SITENAME}} hef n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen. \nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
"passwordreset-emailelement": "Gebrukersnaam: \n$1\n\nTiedelik wachtwoord: \n$2",
- "passwordreset-emailsentemail": "Der is n bericht verstuurd um t wachtwoord opniej in te stellen.",
+ "passwordreset-emailsentemail": "As dit netpostadres an joew gebrukerskonto ekoppeld is, dan wördt der n netbericht estuurd um joew wachtwoord opniej in te stellen.",
"passwordreset-emailsent-capture": "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
"passwordreset-emailerror-capture": "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
- "changeemail": "Wiezig netpostadres",
- "changeemail-header": "Netpostadres wiezigen",
+ "changeemail": "Netpostadres wiezigen of vorthaolen",
+ "changeemail-header": "Vul dit formulier in um joew netpostadres te wiezigen. A'j t netpostadres van disse gebrukerskonto ontkoppelen willen, laot t netpostadres dan leeg a'j t formulier opslaon.",
"changeemail-no-info": "Je mutten an-emeld ween um drekt toegang te hebben tot disse zied.",
"changeemail-oldemail": "t Ouwe netpostadres:",
"changeemail-newemail": "t Nieje netpostadres:",
"anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
"missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
"missingcommenttext": "Plaots joew opmarking hieronder.",
- "missingcommentheader": "'''Waorschuwing:''' je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"{{int:savearticle}}\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
+ "missingcommentheader": "<strong>Waorschuwing:</strong> je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"{{int:savearticle}}\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
"summary-preview": "Samenvatting naokieken:",
- "subject-preview": "Onderwarp/kop naokieken:",
+ "subject-preview": "Onderwarp naokieken:",
"blockedtitle": "Gebruker is eblokkeerd",
"blockedtext": "'''Joew gebrukersnaam of IP-adres is eblokkeerd.'''\n\nJe bin eblokkeerd deur: $1.\nDe op-egeven reden is: ''$2''.\n\n* Eblokkeerd vanaof: $8\n* Eblokkeerd tot: $6\n* Bedoeld um te blokkeren: $7\n\nJe kunnen kontakt opnemen mit $1 of n aandere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] um de blokkering te bepraoten.\nJe kunnen gien gebruukmaken van de funksie 'een bericht sturen', behalven a'j n geldig netpostadres op-egeven hebben in joew [[Special:Preferences|veurkeuren]] en t gebruuk van disse funksie niet eblokkeerd is.\nt IP-adres da'j noen gebruken is $3 en t blokkeringsnummer is #$5.\nVermeld t allebeie a'j argens op disse blokkering reageren.",
"autoblockedtext": "Joew IP-adres is automaties eblokkeerd umdat t gebruukt wördt deur n aandere gebruker, die eblokkeerd wördt deur $1.\nDe reden hierveur was:\n\n:''$2''\n\n* Begint: $8\n* Löp of nao: $6\n* Wee eblokkeerd wördt: $7\n\nJe kunnen kontakt opnemen mit $1 of n van de aandere\n[[{{MediaWiki:Grouppage-sysop}}|beheerders]] um de blokkering te bepraoten.\n\nNB: je kunnen de opsie \"n bericht sturen\" niet gebruken, behalven a'j n geldig netpostadres op-egeven hebben in de [[Special:Preferences|gebrukersveurkeuren]] en je niet eblokkeerd bin.\n\nJoew IP-adres is $3 en joew blokkeernummer is $5.\nGeef disse nummers deur a'j kontakt mit ene opnemen over de blokkering.",
"prefs-watchlist-token": "Volgliestesleutel",
"prefs-misc": "Overig",
"prefs-resetpass": "Wachtwoord wiezigen",
- "prefs-changeemail": "Netpostadres wiezigen",
+ "prefs-changeemail": "Netpostadres wiezigen of vorthaolen",
"prefs-setemail": "Stel n netpostadres in",
"prefs-email": "Instellingen veur netpost",
"prefs-rendering": "Ziedweergave",
"rows": "Regels",
"columns": "Kolommen",
"searchresultshead": "Zeukresultaoten",
- "stub-threshold": "Verwiezingsformattering van <a href=\"#\" class=\"stub\">beginnetjes</a>:",
+ "stub-threshold": "Verwiezingsformattering van beginnetjes ($1):",
+ "stub-threshold-sample-link": "veurbeeld",
"stub-threshold-disabled": "uutezet",
"recentchangesdays": "Antal dagen die \"Leste wiezigingen\" löt zien:",
"recentchangesdays-max": "(hooguut $1 {{PLURAL:$1|dag|dagen}})",
"grouppage-bot": "{{ns:project}}:Bots",
"grouppage-sysop": "{{ns:project}}:Beheerder",
"grouppage-bureaucrat": "{{ns:project}}:Beheerder",
- "grouppage-suppress": "{{ns:project}}:Toezichte",
+ "grouppage-suppress": "{{ns:project}}:Toezicht",
"right-read": "Ziejen bekieken",
"right-edit": "Ziejen bewarken",
"right-createpage": "Ziejen anmaken",
"right-move": "Ziejen herneumen",
"right-move-subpages": "Ziejen samen mit de ziejen die deronder hangen verplaotsen",
"right-move-rootuserpages": "Gebrukersziejen van t hoogste nivo herneumen",
+ "right-move-categorypages": "Kategorieziejen herneumen",
"right-movefile": "Bestaanden herneumen",
"right-suppressredirect": "Gien deurverwiezing anmaken op de ouwe naam as n zied herneumd wörden",
"right-upload": "Bestaanden opsturen",
"right-deletedtext": "Bekiek vortedaone tekste en wiezigingen tussen vortedaone versies",
"right-browsearchive": "Vortedaone ziejen bekieken",
"right-undelete": "Vortedaone ziejen weerummeplaotsen",
- "right-suppressrevision": "Verbörgen versies bekieken en weerummeplaotsen",
+ "right-suppressrevision": "Bepaolde versies bekieken, verbargen en weer zichtbaor maken op ziejen van elke gebruker",
"right-suppressionlog": "Niet-publieke logboeken bekieken",
"right-block": "Aandere gebrukers de meugelikheid ontnemen um te bewarken",
"right-blockemail": "n Gebruker t recht ontnemen um berichjes te versturen",
"recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
"recentchanges-legend-heading": "<strong>Legenda:</strong>",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
+ "recentchanges-submit": "Bekiek",
"rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
"rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
"rcshowhideminor": "$1 kleine wiezigingen",
"recentchangeslinked-summary": "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wördt. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet'''.",
"recentchangeslinked-page": "Ziednaam:",
"recentchangeslinked-to": "Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied",
+ "recentchanges-page-added-to-category": "[[:$1]] bie kategorie ezet",
+ "recentchanges-page-added-to-category-bundled": "[[:$1]] bie kategorie ezet, [[Special:WhatLinksHere/$1|disse zied zit in aandere ziejen in-esleuten]]",
+ "recentchanges-page-removed-from-category": "[[:$1]] is vortedaon uut kategorie",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] vortedaon uut kategorie, [[Special:WhatLinksHere/$1|disse zied zit in aandere ziejen in-esleuten]]",
+ "autochange-username": "Automatiese wieziging van MediaWiki",
"upload": "Bestaand opsturen",
"uploadbtn": "Bestaand opsturen",
"reuploaddesc": "Weerumme naor de opstuurzied",
"Edoderoo",
"Nemo bis",
"Lemondoge",
- "Dinosaur918"
+ "Dinosaur918",
+ "Jdforrester"
]
},
"tog-underline": "Koppelingen onderstrepen:",
"minoredit": "Dit is een kleine bewerking",
"watchthis": "Deze pagina volgen",
"savearticle": "Pagina opslaan",
+ "publishpage": "Pagina publiceren",
"preview": "Voorvertoning",
"showpreview": "Bewerking ter controle bekijken",
"showdiff": "Wijzigingen bekijken",
"wantedfiles": "Niet-bestaande bestanden met koppelingen",
"wantedfiletext-cat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>. Pagina's die niet-bestaande bestanden insluiten staan op de pagina [[:$1]].",
"wantedfiletext-cat-noforeign": "De volgende bestanden zijn in gebruik maar bestaan niet. Daarnaast staan pagina's met niet-bestaande bestanden op [[:$1]].",
- "wantedfiletext-nocat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke vals positieven worden <del>doorgehaald weergegeven</del>.",
+ "wantedfiletext-nocat": "De volgende bestanden worden gebruikt maar bestaan niet. Bestanden van externe repositories kunnen zijn opgenomen in de lijst, ondanks dat ze bestaan. Dergelijke valse positieven worden <del>doorgehaald weergegeven</del>.",
"wantedfiletext-nocat-noforeign": "De volgende bestanden zijn in gebruik maar bestaan niet.",
"wantedtemplates": "Niet-bestaande sjablonen met koppelingen",
"mostlinked": "Pagina's waar het meest naar verwezen wordt",
"randomrootpage": "Losowa strona (bez podstron)",
"log-action-filter-block": "Rodzaj blokady:",
"log-action-filter-delete": "Rodzaj usunięcia:",
+ "log-action-filter-patrol": "Rodzaj patrolu:",
"log-action-filter-protect": "Rodzaj zabezpieczenia:",
+ "log-action-filter-rights": "Typ zmiany uprawień",
"log-action-filter-upload": "Rodzaj przesłanych:",
"log-action-filter-all": "Wszystkie",
"log-action-filter-block-block": "Zablokowanie",
"log-action-filter-managetags-delete": "Usunięcie znacznika",
"log-action-filter-managetags-activate": "Aktywacja znacznika",
"log-action-filter-managetags-deactivate": "Deaktywacja znacznika",
+ "log-action-filter-patrol-patrol": "Ręczny",
+ "log-action-filter-patrol-autopatrol": "Automatyczny",
"log-action-filter-protect-protect": "Zabezpieczenie",
"log-action-filter-protect-modify": "Zmiana zabezpieczenia",
"log-action-filter-protect-unprotect": "Odbezpieczenie",
+ "log-action-filter-rights-rights": "Ręczna zmiana",
+ "log-action-filter-rights-autopromote": "Automatyczna zmiana",
"log-action-filter-upload-upload": "Nowe przesłane",
"log-action-filter-upload-overwrite": "Przesłane ponownie"
}
"Diniscoelho",
"Josep Maria Roca Peña",
"Luan",
- "Gato Preto"
+ "Gato Preto",
+ "Jdforrester"
]
},
"tog-underline": "Sublinhar ligações:",
"minoredit": "Marcar como edição menor",
"watchthis": "Vigiar esta página",
"savearticle": "Gravar página",
+ "publishpage": "Publicar página",
"preview": "Antevisão",
"showpreview": "Antever resultado",
"showdiff": "Mostrar alterações",
"Ядерный Трамвай",
"Исмаил Садуев",
"Lemondoge",
- "SamGold"
+ "SamGold",
+ "Jdforrester"
]
},
"tog-underline": "Подчёркивание ссылок:",
"minoredit": "Малое изменение",
"watchthis": "Включить эту страницу в список наблюдения",
"savearticle": "Записать страницу",
+ "publishpage": "издавать страницу",
"preview": "Предпросмотр",
"showpreview": "Предварительный просмотр",
"showdiff": "Внесённые изменения",
"minoredit": "manjše urejanje",
"watchthis": "Opazuj članek",
"savearticle": "Shrani stran",
+ "publishpage": "Objavi stran",
"preview": "Predogled",
"showpreview": "Prikaži predogled",
"showdiff": "Prikaži spremembe",
"tooltip-ca-nstab-category": "Prikaže stran kategorije",
"tooltip-minoredit": "Označite kot manjše urejanje",
"tooltip-save": "Shranite vnesene spremembe (ste si jih predogledali?)",
+ "tooltip-publish": "Objavite svoje spremembe",
"tooltip-preview": "Pred shranjevanjem si, prosimo, predoglejte stran!",
"tooltip-diff": "Preglejte spremembe, ki ste jih vnesli.",
"tooltip-compareselectedversions": "Preglejte razlike med izbranima redakcijama.",
"minoredit": "Mindre ändring (m)",
"watchthis": "Bevaka denna sida",
"savearticle": "Spara sidan",
+ "publishpage": "Publicera sida",
"preview": "Förhandsgranska",
"showpreview": "Visa förhandsgranskning",
"showdiff": "Visa ändringar",
"userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" är inte ett registrerat användarkonto. Tänk efter om du vill skapa/redigera den här sidan.",
"userpage-userdoesnotexist-view": "Kontot \"$1\" är inte registrerat.",
"blocked-notice-logextract": "Användaren är blockerad.\nOrsaken till senaste blockeringen kan ses nedan:",
- "clearyourcache": "'''OBS:''' Efter du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.\n*'''Firefox / Safari:''' Håll ned ''Skift'' och klicka på ''Uppdatera sidan'' eller tryck antingen ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på Mac)\n*'''Google Chrome:''' Tryck ''Ctrl-Skift-R'' (''⌘-Shift-R'' på Mac)\n*'''Internet Explorer:''' Håll ned ''Ctrl'' och klicka på ''Uppdatera'' eller tryck ''Ctrl-F5''\n*'''Opera:''' Rensa cachen i ''Verktyg → Inställningar''",
+ "clearyourcache": "<strong>OBS:</strong> Efter du sparat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.\n*<strong>Firefox / Safari:</strong> Håll ned <em>Skift</em> och klicka på <em>Uppdatera sidan</em> eller tryck antingen <em>Ctrl-F5</em> eller <em>Ctrl-R</em> (<em>⌘-R</em> på Mac)\n*<strong>Google Chrome:</strong> Tryck <em>Ctrl-Skift-R</em> (<em>⌘-Shift-R</em> på Mac)\n*<strong>Internet Explorer:</strong> Håll ned <em>Ctrl</em> och klicka på <em>Uppdatera</em> eller tryck <em>Ctrl-F5</em>\n*<strong>Opera:</strong> Gå till <em>Meny → Inställningar</em> (<em>Opera → Inställningar</em> på en Mac) och sedan på <em>Sekretess & säkerhet → Rensa webbläsardata → Hämtade bilder och filer</em>.",
"usercssyoucanpreview": "'''Tips:''' Använd knappen \"{{int:showpreview}}\" för att testa din nya CSS innan du sparar.",
"userjsyoucanpreview": "'''Tips:''' Använd knappen \"{{int:showpreview}}\" för att testa ditt nya JavaScript innan du sparar.",
"usercsspreview": "'''Kom ihåg att du bara förhandsgranskar din användar-CSS.'''\n'''Den har inte sparats än!'''",
"tooltip-ca-nstab-category": "Visa kategorisidan",
"tooltip-minoredit": "Markera som mindre ändring",
"tooltip-save": "Spara dina ändringar",
+ "tooltip-publish": "Publicera dina ändringar",
"tooltip-preview": "Förhandsgranska dina ändringar, vänligen använd detta innan du sparar!",
"tooltip-diff": "Visa vilka ändringar du har gjort i texten.",
"tooltip-compareselectedversions": "Visa skillnaden mellan de två markerade versionerna av den här sidan.",
"minoredit": "标记为小编辑",
"watchthis": "监视本页",
"savearticle": "保存页面",
+ "publishpage": "发布页面",
"preview": "预览",
"showpreview": "显示预览",
"showdiff": "显示更改",
"userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
"userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
"blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
- "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)\n* <strong>Google Chrome:</strong>按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)\n* <strong>Internet Explorer:</strong>按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”\n* <strong>Opera:</strong>在“工具→首选项”中清除缓存",
+ "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住<em>Shift</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>或<em>Ctrl-R</em>(Mac为<em>⌘-R</em>)\n* <strong>Google Chrome:</strong>按<em>Ctrl-Shift-R</em>(Mac为<em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong>按住<em>Ctrl</em>的同时单击<em>刷新</em>,或按<em>Ctrl-F5</em>\n* <strong>Opera:</strong>前往<em>菜单 → 设置</em>(Mac为<em>Opera → Preferences</em>),然后em>隐私和安全 → 清除浏览数据 → 缓存的图片和文件</em>。",
"usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
"userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
"usercsspreview": "<strong>请记住您现在只是在预览你的用户CSS。它尚未保存!</strong>",
"tooltip-ca-nstab-category": "查看分类页面",
"tooltip-minoredit": "标记本编辑为小编辑",
"tooltip-save": "保存你的更改",
+ "tooltip-publish": "发布您的更改",
"tooltip-preview": "预览您的更改。请在保存前使用此功能。",
"tooltip-diff": "显示您对该文字所做的更改",
"tooltip-compareselectedversions": "查看该页面两个选定的版本之间的差异。",
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-element-hidden {
display: none !important;
.oo-ui-optionWidget.oo-ui-widget-enabled {
cursor: pointer;
}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+ cursor: default;
+}
.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
display: block;
white-space: nowrap;
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-element-hidden {
display: none !important;
.oo-ui-optionWidget.oo-ui-widget-enabled {
cursor: pointer;
}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+ cursor: default;
+}
.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
display: block;
white-space: nowrap;
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-21T17:34:15Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-21T17:34:15Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
right: 0;
text-overflow: ellipsis;
}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
- float: left;
-}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
float: right;
}
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
position: absolute;
}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
z-index: 2;
}
.oo-ui-selectFileWidget-dropTarget {
.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
position: relative;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+ display: block;
+ padding-right: 2.375em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
display: block;
float: none;
}
font-size: 1.1em;
padding: 0.75em;
}
+.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
+ font-size: 90.90909%;
+}
.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
padding-right: 1.5em;
}
.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
font-weight: bold;
}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
- font-style: italic;
-}
.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
opacity: 0.5;
}
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-draggableElement-handle,
.oo-ui-draggableElement-handle.oo-ui-widget {
right: 0;
text-overflow: ellipsis;
}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
- float: left;
-}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
float: right;
}
.oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
position: absolute;
}
-.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+.oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
z-index: 2;
}
.oo-ui-selectFileWidget-dropTarget {
.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
position: relative;
}
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName,
-.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileName {
+ display: block;
+ padding-right: 2.375em;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-fileType {
display: block;
float: none;
}
margin-left: 0.5em;
}
.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ display: block;
line-height: 2.3em;
margin: 0;
overflow: hidden;
white-space: nowrap;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
text-overflow: ellipsis;
- left: 0.5em;
- right: 0.5em;
+ left: 0;
+ right: 0;
+ padding-left: 0.5em;
}
.oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
color: #888888;
height: 2.3em;
}
.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
+ background-color: #f3f3f3;
color: #cccccc;
text-shadow: 0 1px 1px #ffffff;
border-color: #dddddd;
- background-color: #f3f3f3;
+ cursor: default;
}
.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
}
.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
right: 4.4625em;
+ padding-left: 0;
}
.oo-ui-selectFileWidget.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-clearButton {
right: 2.0875em;
.oo-ui-selectFileWidget-empty.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label,
.oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
right: 2em;
+ padding-left: 0;
}
.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
background-color: #ebf2ff;
font-size: 1.1em;
padding: 0.75em;
}
+.oo-ui-outlineOptionWidget .oo-ui-iconElement-icon {
+ font-size: 90.90909%;
+}
.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
padding-right: 1.5em;
}
.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
font-weight: bold;
}
-.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
- font-style: italic;
-}
.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
opacity: 0.5;
}
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:53Z
+ * Date: 2016-04-26T21:34:05Z
*/
.oo-ui-window {
background: transparent;
/*!
- * OOjs UI v0.16.6
+ * OOjs UI v0.17.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-04-19T21:57:49Z
+ * Date: 2016-04-26T21:34:01Z
*/
( function ( OO ) {
"prefix": "oo-ui-icon",
"intro": "@import '../../../../src/styles/common';",
"images": {
+ "fullScreen": { "file": "images/icons/fullScreen.svg" },
"image": { "file": "images/icons/image.svg" },
"imageGallery": { "file": {
"ltr": "images/icons/imageGallery-ltr.svg",
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+ <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+ <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
}
},
"images": {
+ "fullScreen": { "file": "images/icons/fullScreen.svg" },
"image": { "file": {
"ltr": "images/icons/image-ltr.svg",
"rtl": "images/icons/image-rtl.svg"
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
+ <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+ <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+ <path id="arrow" d="M6 6v4l1.28-1.28 2 2 1.423-1.44-2-2L10 6z"/>
+ <use transform="rotate(90 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(180 12 12)" xlink:href="#arrow"/>
+ <use transform="rotate(-90 12 12)" xlink:href="#arrow"/>
+</svg>
'SearchEngine' => [ 'newSearchEngine', SearchEngine::class ],
'SearchEngineFactory' => [ 'getSearchEngineFactory', SearchEngineFactory::class ],
'SearchEngineConfig' => [ 'getSearchEngineConfig', SearchEngineConfig::class ],
+ 'SkinFactory' => [ 'getSkinFactory', SkinFactory::class ],
];
}
'EventRelayerGroup' => [ 'EventRelayerGroup', EventRelayerGroup::class ],
'SearchEngineFactory' => [ 'SearchEngineFactory', SearchEngineFactory::class ],
'SearchEngineConfig' => [ 'SearchEngineConfig', SearchEngineConfig::class ],
+ 'SkinFactory' => [ 'SkinFactory', SkinFactory::class ],
];
}
return $title;
}
+ private function verifyCallbackJob(
+ $callback,
+ LinkTarget $expectedTitle,
+ $expectedUserId,
+ callable $notificationTimestampCondition
+ ) {
+ $this->assertInternalType( 'callable', $callback );
+
+ $callbackReflector = new ReflectionFunction( $callback );
+ $vars = $callbackReflector->getStaticVariables();
+ $this->assertArrayHasKey( 'job', $vars );
+ $this->assertInstanceOf( ActivityUpdateJob::class, $vars['job'] );
+
+ /** @var ActivityUpdateJob $job */
+ $job = $vars['job'];
+ $this->assertEquals( $expectedTitle->getDBkey(), $job->getTitle()->getDBkey() );
+ $this->assertEquals( $expectedTitle->getNamespace(), $job->getTitle()->getNamespace() );
+
+ $jobParams = $job->getParams();
+ $this->assertArrayHasKey( 'type', $jobParams );
+ $this->assertEquals( 'updateWatchlistNotification', $jobParams['type'] );
+ $this->assertArrayHasKey( 'userid', $jobParams );
+ $this->assertEquals( $expectedUserId, $jobParams['userid'] );
+ $this->assertArrayHasKey( 'notifTime', $jobParams );
+ $this->assertTrue( $notificationTimestampCondition( $jobParams['notifTime'] ) );
+ }
+
public function testResetNotificationTimestamp_oldidSpecifiedLatestRevisionForced() {
$user = $this->getMockNonAnonUserWithId( 1 );
$oldid = 22;
$mockCache
);
- // Note: This does not actually assert the job is correct
$callableCallCounter = 0;
$scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
- function( $callable ) use ( &$callableCallCounter ) {
+ function( $callable ) use ( &$callableCallCounter, $title, $user ) {
$callableCallCounter++;
- $this->assertInternalType( 'callable', $callable );
+ $this->verifyCallbackJob(
+ $callable,
+ $title,
+ $user->getId(),
+ function( $time ) {
+ return $time === null;
+ }
+ );
}
);
$mockCache
);
- // Note: This does not actually assert the job is correct
$addUpdateCallCounter = 0;
$scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
- function( $callable ) use ( &$addUpdateCallCounter ) {
+ function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
$addUpdateCallCounter++;
- $this->assertInternalType( 'callable', $callable );
+ $this->verifyCallbackJob(
+ $callable,
+ $title,
+ $user->getId(),
+ function( $time ) {
+ return $time !== null && $time > '20151212010101';
+ }
+ );
}
);
ScopedCallback::consume( $scopedOverrideRevision );
}
+ public function testResetNotificationTimestamp_notWatchedPageForced() {
+ $user = $this->getMockNonAnonUserWithId( 1 );
+ $oldid = 22;
+ $title = $this->getMockTitle( 'SomeDbKey' );
+ $title->expects( $this->once() )
+ ->method( 'getNextRevisionID' )
+ ->with( $oldid )
+ ->will( $this->returnValue( 33 ) );
+
+ $mockDb = $this->getMockDb();
+ $mockDb->expects( $this->once() )
+ ->method( 'selectRow' )
+ ->with(
+ 'watchlist',
+ 'wl_notificationtimestamp',
+ [
+ 'wl_user' => 1,
+ 'wl_namespace' => 0,
+ 'wl_title' => 'SomeDbKey',
+ ]
+ )
+ ->will( $this->returnValue( false ) );
+
+ $mockCache = $this->getMockCache();
+ $mockDb->expects( $this->never() )
+ ->method( 'get' );
+ $mockDb->expects( $this->never() )
+ ->method( 'set' );
+ $mockDb->expects( $this->never() )
+ ->method( 'delete' );
+
+ $store = $this->newWatchedItemStore(
+ $this->getMockLoadBalancer( $mockDb ),
+ $mockCache
+ );
+
+ $callableCallCounter = 0;
+ $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+ function( $callable ) use ( &$callableCallCounter, $title, $user ) {
+ $callableCallCounter++;
+ $this->verifyCallbackJob(
+ $callable,
+ $title,
+ $user->getId(),
+ function( $time ) {
+ return $time === null;
+ }
+ );
+ }
+ );
+
+ $this->assertTrue(
+ $store->resetNotificationTimestamp(
+ $user,
+ $title,
+ 'force',
+ $oldid
+ )
+ );
+ $this->assertEquals( 1, $callableCallCounter );
+
+ ScopedCallback::consume( $scopedOverride );
+ }
+
+ public function testResetNotificationTimestamp_futureNotificationTimestampForced() {
+ $user = $this->getMockNonAnonUserWithId( 1 );
+ $oldid = 22;
+ $title = $this->getMockTitle( 'SomeDbKey' );
+ $title->expects( $this->once() )
+ ->method( 'getNextRevisionID' )
+ ->with( $oldid )
+ ->will( $this->returnValue( 33 ) );
+
+ $mockDb = $this->getMockDb();
+ $mockDb->expects( $this->once() )
+ ->method( 'selectRow' )
+ ->with(
+ 'watchlist',
+ 'wl_notificationtimestamp',
+ [
+ 'wl_user' => 1,
+ 'wl_namespace' => 0,
+ 'wl_title' => 'SomeDbKey',
+ ]
+ )
+ ->will( $this->returnValue(
+ $this->getFakeRow( [ 'wl_notificationtimestamp' => '30151212010101' ] )
+ ) );
+
+ $mockCache = $this->getMockCache();
+ $mockDb->expects( $this->never() )
+ ->method( 'get' );
+ $mockDb->expects( $this->never() )
+ ->method( 'set' );
+ $mockDb->expects( $this->never() )
+ ->method( 'delete' );
+
+ $store = $this->newWatchedItemStore(
+ $this->getMockLoadBalancer( $mockDb ),
+ $mockCache
+ );
+
+ $addUpdateCallCounter = 0;
+ $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+ function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
+ $addUpdateCallCounter++;
+ $this->verifyCallbackJob(
+ $callable,
+ $title,
+ $user->getId(),
+ function( $time ) {
+ return $time === '30151212010101';
+ }
+ );
+ }
+ );
+
+ $getTimestampCallCounter = 0;
+ $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
+ function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+ $getTimestampCallCounter++;
+ $this->assertEquals( $title, $titleParam );
+ $this->assertEquals( $oldid, $oldidParam );
+ }
+ );
+
+ $this->assertTrue(
+ $store->resetNotificationTimestamp(
+ $user,
+ $title,
+ 'force',
+ $oldid
+ )
+ );
+ $this->assertEquals( 1, $addUpdateCallCounter );
+ $this->assertEquals( 1, $getTimestampCallCounter );
+
+ ScopedCallback::consume( $scopedOverrideDeferred );
+ ScopedCallback::consume( $scopedOverrideRevision );
+ }
+
+ public function testResetNotificationTimestamp_futureNotificationTimestampNotForced() {
+ $user = $this->getMockNonAnonUserWithId( 1 );
+ $oldid = 22;
+ $title = $this->getMockTitle( 'SomeDbKey' );
+ $title->expects( $this->once() )
+ ->method( 'getNextRevisionID' )
+ ->with( $oldid )
+ ->will( $this->returnValue( 33 ) );
+
+ $mockDb = $this->getMockDb();
+ $mockDb->expects( $this->once() )
+ ->method( 'selectRow' )
+ ->with(
+ 'watchlist',
+ 'wl_notificationtimestamp',
+ [
+ 'wl_user' => 1,
+ 'wl_namespace' => 0,
+ 'wl_title' => 'SomeDbKey',
+ ]
+ )
+ ->will( $this->returnValue(
+ $this->getFakeRow( [ 'wl_notificationtimestamp' => '30151212010101' ] )
+ ) );
+
+ $mockCache = $this->getMockCache();
+ $mockDb->expects( $this->never() )
+ ->method( 'get' );
+ $mockDb->expects( $this->never() )
+ ->method( 'set' );
+ $mockDb->expects( $this->never() )
+ ->method( 'delete' );
+
+ $store = $this->newWatchedItemStore(
+ $this->getMockLoadBalancer( $mockDb ),
+ $mockCache
+ );
+
+ $addUpdateCallCounter = 0;
+ $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+ function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
+ $addUpdateCallCounter++;
+ $this->verifyCallbackJob(
+ $callable,
+ $title,
+ $user->getId(),
+ function( $time ) {
+ return $time === false;
+ }
+ );
+ }
+ );
+
+ $getTimestampCallCounter = 0;
+ $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
+ function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+ $getTimestampCallCounter++;
+ $this->assertEquals( $title, $titleParam );
+ $this->assertEquals( $oldid, $oldidParam );
+ }
+ );
+
+ $this->assertTrue(
+ $store->resetNotificationTimestamp(
+ $user,
+ $title,
+ '',
+ $oldid
+ )
+ );
+ $this->assertEquals( 1, $addUpdateCallCounter );
+ $this->assertEquals( 1, $getTimestampCallCounter );
+
+ ScopedCallback::consume( $scopedOverrideDeferred );
+ ScopedCallback::consume( $scopedOverrideRevision );
+ }
+
public function testUpdateNotificationTimestamp_watchersExist() {
$mockDb = $this->getMockDb();
$mockDb->expects( $this->once() )
--- /dev/null
+<?php
+
+
+class HTMLFormTest extends MediaWikiTestCase {
+ public function testGetHTML_empty() {
+ $form = new HTMLForm( [] );
+ $form->setTitle( Title::newFromText( 'Foo' ) );
+ $form->prepareForm();
+ $html = $form->getHTML( false );
+ $this->assertRegExp( '/<form\b/', $html );
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ public function testGetHTML_noPrepare() {
+ $form = new HTMLForm( [] );
+ $form->setTitle( Title::newFromText( 'Foo' ) );
+ $form->getHTML( false );
+ }
+}
--- /dev/null
+<?php
+/**
+ * @covers Interwiki
+ *
+ * @group MediaWiki
+ * @group Database
+ */
+class InterwikiTest extends MediaWikiTestCase {
+
+ public function testConstructor() {
+ $interwiki = new Interwiki(
+ 'xyz',
+ 'http://xyz.acme.test/wiki/$1',
+ 'http://xyz.acme.test/w/api.php',
+ 'xyzwiki',
+ 1,
+ 0
+ );
+
+ $this->setContentLang( 'qqx' );
+
+ $this->assertSame( '(interwiki-name-xyz)', $interwiki->getName() );
+ $this->assertSame( '(interwiki-desc-xyz)', $interwiki->getDescription() );
+ $this->assertSame( 'http://xyz.acme.test/w/api.php', $interwiki->getAPI() );
+ $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
+ $this->assertSame( 'xyzwiki', $interwiki->getWikiID() );
+ $this->assertTrue( $interwiki->isLocal() );
+ $this->assertFalse( $interwiki->isTranscludable() );
+ }
+
+ public function testGetUrl() {
+ $interwiki = new Interwiki(
+ 'xyz',
+ 'http://xyz.acme.test/wiki/$1'
+ );
+
+ $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
+ $this->assertSame( 'http://xyz.acme.test/wiki/Foo%26Bar', $interwiki->getURL( 'Foo&Bar' ) );
+ }
+
+ //// tests for static data access methods below ///////////////////////////////////////////////
+
+ private function populateDB( $iwrows ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'interwiki', '*', __METHOD__ );
+ $dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ );
+ $this->tablesUsed[] = 'interwiki';
+ }
+
+ public function testDatabaseStorage() {
+ // NOTE: database setup is expensive, so we only do
+ // it once and run all the tests in one go.
+ $dewiki = [
+ 'iw_prefix' => 'de',
+ 'iw_url' => 'http://de.wikipedia.org/wiki/',
+ 'iw_api' => 'http://de.wikipedia.org/w/api.php',
+ 'iw_wikiid' => 'dewiki',
+ 'iw_local' => 1,
+ 'iw_trans' => 0
+ ];
+
+ $zzwiki = [
+ 'iw_prefix' => 'zz',
+ 'iw_url' => 'http://zzwiki.org/wiki/',
+ 'iw_api' => 'http://zzwiki.org/w/api.php',
+ 'iw_wikiid' => 'zzwiki',
+ 'iw_local' => 0,
+ 'iw_trans' => 0
+ ];
+
+ $this->populateDB( [ $dewiki, $zzwiki ] );
+
+ Interwiki::resetLocalCache();
+ $this->setMwGlobals( 'wgInterwikiCache', false );
+
+ $this->assertEquals(
+ [ $dewiki, $zzwiki ],
+ Interwiki::getAllPrefixes(),
+ 'getAllPrefixes()'
+ );
+ $this->assertEquals(
+ [ $dewiki ],
+ Interwiki::getAllPrefixes( true ),
+ 'getAllPrefixes()'
+ );
+ $this->assertEquals(
+ [ $zzwiki ],
+ Interwiki::getAllPrefixes( false ),
+ 'getAllPrefixes()'
+ );
+
+ $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+ $this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
+
+ $this->assertNull( Interwiki::fetch( null ), 'no prefix' );
+ $this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
+
+ $interwiki = Interwiki::fetch( 'de' );
+ $this->assertInstanceOf( 'Interwiki', $interwiki );
+ $this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
+
+ $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+ $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
+ $this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' );
+ $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+ $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
+
+ Interwiki::invalidateCache( 'de' );
+ $this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
+ }
+
+ /**
+ * @param string $thisSite
+ * @param string[] $local
+ * @param string[] $global
+ *
+ * @return string[]
+ */
+ private function populateHash( $thisSite, $local, $global ) {
+ $hash = [];
+ $hash[ '__sites:' . wfWikiID() ] = $thisSite;
+
+ $globals = [];
+ $locals = [];
+
+ foreach ( $local as $row ) {
+ $prefix = $row['iw_prefix'];
+ $data = $row['iw_local'] . ' ' . $row['iw_url'];
+ $locals[] = $prefix;
+ $hash[ "_{$thisSite}:{$prefix}" ] = $data;
+ }
+
+ foreach ( $global as $row ) {
+ $prefix = $row['iw_prefix'];
+ $data = $row['iw_local'] . ' ' . $row['iw_url'];
+ $globals[] = $prefix;
+ $hash[ "__global:{$prefix}" ] = $data;
+ }
+
+ $hash[ '__list:__global' ] = implode( ' ', $globals );
+ $hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
+
+ return $hash;
+ }
+
+ private function populateCDB( $thisSite, $local, $global ) {
+ $cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
+ $cdb = CdbWriter::open( $cdbFile );
+
+ $hash = $this->populateHash( $thisSite, $local, $global );
+
+ foreach ( $hash as $key => $value ) {
+ $cdb->set( $key, $value );
+ }
+
+ $cdb->close();
+ return $cdbFile;
+ }
+
+ public function testCDBStorage() {
+ // NOTE: CDB setup is expensive, so we only do
+ // it once and run all the tests in one go.
+
+ $dewiki = [
+ 'iw_prefix' => 'de',
+ 'iw_url' => 'http://de.wikipedia.org/wiki/',
+ 'iw_local' => 1
+ ];
+
+ $zzwiki = [
+ 'iw_prefix' => 'zz',
+ 'iw_url' => 'http://zzwiki.org/wiki/',
+ 'iw_local' => 0
+ ];
+
+ $cdbFile = $this->populateCDB(
+ 'en',
+ [ $dewiki ],
+ [ $zzwiki ]
+ );
+
+ Interwiki::resetLocalCache();
+ $this->setMwGlobals( 'wgInterwikiCache', $cdbFile );
+
+ $this->assertEquals(
+ [ $dewiki, $zzwiki ],
+ Interwiki::getAllPrefixes(),
+ 'getAllPrefixes()'
+ );
+
+ $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+ $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+ $interwiki = Interwiki::fetch( 'de' );
+ $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+ $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+ $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+ $interwiki = Interwiki::fetch( 'zz' );
+ $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+ $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+ $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+
+ // cleanup temp file
+ unlink( $cdbFile );
+ }
+
+ public function testArrayStorage() {
+ $dewiki = [
+ 'iw_prefix' => 'de',
+ 'iw_url' => 'http://de.wikipedia.org/wiki/',
+ 'iw_local' => 1
+ ];
+
+ $zzwiki = [
+ 'iw_prefix' => 'zz',
+ 'iw_url' => 'http://zzwiki.org/wiki/',
+ 'iw_local' => 0
+ ];
+
+ $cdbData = $this->populateHash(
+ 'en',
+ [ $dewiki ],
+ [ $zzwiki ]
+ );
+
+ Interwiki::resetLocalCache();
+ $this->setMwGlobals( 'wgInterwikiCache', $cdbData );
+
+ $this->assertEquals(
+ [ $dewiki, $zzwiki ],
+ Interwiki::getAllPrefixes(),
+ 'getAllPrefixes()'
+ );
+
+ $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
+ $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
+
+ $interwiki = Interwiki::fetch( 'de' );
+ $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+ $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
+ $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
+
+ $interwiki = Interwiki::fetch( 'zz' );
+ $this->assertInstanceOf( 'Interwiki', $interwiki );
+
+ $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
+ $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * Tests related to JPEG chroma subsampling via $wgJpegPixelFormat setting.
+ *
+ * @group Media
+ * @group medium
+ *
+ * @todo covers tags
+ */
+class JpegPixelFormatTest extends MediaWikiMediaTestCase {
+
+ protected function setUp() {
+ parent::setUp();
+ }
+
+ /**
+ * Mark this test as creating thumbnail files.
+ */
+ protected function createsThumbnails() {
+ return true;
+ }
+
+ /**
+ *
+ * @dataProvider providePixelFormats
+ */
+ public function testPixelFormatRendering( $sourceFile, $pixelFormat, $samplingFactor ) {
+ global $wgUseImageMagick, $wgUseImageResize;
+ if ( !$wgUseImageMagick ) {
+ $this->markTestSkipped( "This test is only applicable when using ImageMagick thumbnailing" );
+ }
+ if ( !$wgUseImageResize ) {
+ $this->markTestSkipped( "This test is only applicable when using thumbnailing" );
+ }
+
+ $fmtStr = var_export( $pixelFormat, true );
+ $this->setMwGlobals( 'wgJpegPixelFormat', $pixelFormat );
+
+ $file = $this->dataFile( $sourceFile, 'image/jpeg' );
+
+ $params = [
+ 'width' => 320,
+ ];
+ $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
+ $this->assertTrue( !$thumb->isError(), "created JPEG thumbnail for pixel format $fmtStr" );
+
+ $path = $thumb->getLocalCopyPath();
+ $this->assertTrue( is_string( $path ), "path returned for JPEG thumbnail for $fmtStr" );
+
+ $cmd = [
+ 'identify',
+ '-format',
+ '%[jpeg:sampling-factor]',
+ $path
+ ];
+ $retval = null;
+ $output = wfShellExec( $cmd, $retval );
+ $this->assertTrue( $retval === 0, "ImageMagick's identify command should return success" );
+
+ $expected = $samplingFactor;
+ $actual = trim( $output );
+ $this->assertEquals(
+ $expected,
+ trim( $output ),
+ "IM identify expects JPEG chroma subsampling \"$expected\" for $fmtStr"
+ );
+ }
+
+ public static function providePixelFormats() {
+ return [
+ // From 4:4:4 source file
+ [
+ 'yuv444.jpg',
+ false,
+ '1x1,1x1,1x1'
+ ],
+ [
+ 'yuv444.jpg',
+ 'yuv444',
+ '1x1,1x1,1x1'
+ ],
+ [
+ 'yuv444.jpg',
+ 'yuv422',
+ '2x1,1x1,1x1'
+ ],
+ [
+ 'yuv444.jpg',
+ 'yuv420',
+ '2x2,1x1,1x1'
+ ],
+ // From 4:2:0 source file
+ [
+ 'yuv420.jpg',
+ false,
+ '2x2,1x1,1x1'
+ ],
+ [
+ 'yuv420.jpg',
+ 'yuv444',
+ '1x1,1x1,1x1'
+ ],
+ [
+ 'yuv420.jpg',
+ 'yuv422',
+ '2x1,1x1,1x1'
+ ],
+ [
+ 'yuv420.jpg',
+ 'yuv420',
+ '2x2,1x1,1x1'
+ ]
+ ];
+ }
+}
public static function provideFormat() {
return [
- [ NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ],
- [ NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ],
- [ false, 'Hansi_Maier', '', 'en', 'Hansi Maier' ],
+ [ NS_MAIN, 'Foo_Bar', '', '', 'en', 'Foo Bar' ],
+ [ NS_USER, 'Hansi_Maier', 'stuff_and_so_on', '', 'en', 'User:Hansi Maier#stuff and so on' ],
+ [ false, 'Hansi_Maier', '', '', 'en', 'Hansi Maier' ],
[
NS_USER_TALK,
'hansi__maier',
'',
+ '',
'en',
'User talk:hansi maier',
'User talk:Hansi maier'
// getGenderCache() provides a mock that considers first
// names ending in "a" to be female.
- [ NS_USER, 'Lisa_Müller', '', 'de', 'Benutzerin:Lisa Müller' ],
+ [ NS_USER, 'Lisa_Müller', '', '', 'de', 'Benutzerin:Lisa Müller' ],
+ [ NS_MAIN, 'FooBar', '', 'remotetestiw', 'en', 'remotetestiw:FooBar' ],
];
}
/**
* @dataProvider provideFormat
*/
- public function testFormat( $namespace, $text, $fragment, $lang, $expected, $normalized = null ) {
+ public function testFormat( $namespace, $text, $fragment, $interwiki, $lang, $expected,
+ $normalized = null
+ ) {
if ( $normalized === null ) {
$normalized = $expected;
}
$codec = $this->makeCodec( $lang );
- $actual = $codec->formatTitle( $namespace, $text, $fragment );
+ $actual = $codec->formatTitle( $namespace, $text, $fragment, $interwiki );
$this->assertEquals( $expected, $actual, 'formatted' );
$actual2 = $codec->formatTitle(
$parsed->getNamespace(),
$parsed->getText(),
- $parsed->getFragment()
+ $parsed->getFragment(),
+ $parsed->getInterwiki()
);
$this->assertEquals( $normalized, $actual2, 'normalized after round trip' );
[ 'Talk:File:Foo.jpg' ],
[ 'Talk:localtestiw:Foo' ],
- [ 'remotetestiw:Foo' ],
[ '::1' ], // only valid in user namespace
[ 'User::x' ], // leading ":" in a user name is only valid of IPv6 addresses
public function goodConstructorProvider() {
return [
- [ NS_USER, 'TestThis', 'stuff', true ],
- [ NS_USER, 'TestThis', '', false ],
+ [ NS_USER, 'TestThis', 'stuff', '', true, false ],
+ [ NS_USER, 'TestThis', '', 'baz', false, true ],
];
}
/**
* @dataProvider goodConstructorProvider
*/
- public function testConstruction( $ns, $text, $fragment, $hasFragment ) {
- $title = new TitleValue( $ns, $text, $fragment );
+ public function testConstruction( $ns, $text, $fragment, $interwiki, $hasFragment,
+ $hasInterwiki
+ ) {
+ $title = new TitleValue( $ns, $text, $fragment, $interwiki );
$this->assertEquals( $ns, $title->getNamespace() );
$this->assertEquals( $text, $title->getText() );
$this->assertEquals( $fragment, $title->getFragment() );
$this->assertEquals( $hasFragment, $title->hasFragment() );
+ $this->assertEquals( $interwiki, $title->getInterwiki() );
+ $this->assertEquals( $hasInterwiki, $title->isExternal() );
}
public function badConstructorProvider() {
return [
- [ 'foo', 'title', 'fragment' ],
- [ null, 'title', 'fragment' ],
- [ 2.3, 'title', 'fragment' ],
+ [ 'foo', 'title', 'fragment', '' ],
+ [ null, 'title', 'fragment', '' ],
+ [ 2.3, 'title', 'fragment', '' ],
- [ NS_MAIN, 5, 'fragment' ],
- [ NS_MAIN, null, 'fragment' ],
- [ NS_MAIN, '', 'fragment' ],
- [ NS_MAIN, 'foo bar', '' ],
- [ NS_MAIN, 'bar_', '' ],
- [ NS_MAIN, '_foo', '' ],
- [ NS_MAIN, ' eek ', '' ],
+ [ NS_MAIN, 5, 'fragment', '' ],
+ [ NS_MAIN, null, 'fragment', '' ],
+ [ NS_MAIN, '', 'fragment', '' ],
+ [ NS_MAIN, 'foo bar', '', '' ],
+ [ NS_MAIN, 'bar_', '', '' ],
+ [ NS_MAIN, '_foo', '', '' ],
+ [ NS_MAIN, ' eek ', '', '' ],
- [ NS_MAIN, 'title', 5 ],
- [ NS_MAIN, 'title', null ],
- [ NS_MAIN, 'title', [] ],
+ [ NS_MAIN, 'title', 5, '' ],
+ [ NS_MAIN, 'title', null, '' ],
+ [ NS_MAIN, 'title', [], '' ],
+
+ [ NS_MAIN, 'title', '', 5 ],
+ [ NS_MAIN, 'title', null, 5 ],
+ [ NS_MAIN, 'title', [], 5 ],
];
}
/**
* @dataProvider badConstructorProvider
*/
- public function testConstructionErrors( $ns, $text, $fragment ) {
+ public function testConstructionErrors( $ns, $text, $fragment, $interwiki ) {
$this->setExpectedException( 'InvalidArgumentException' );
- new TitleValue( $ns, $text, $fragment );
+ new TitleValue( $ns, $text, $fragment, $interwiki );
}
public function fragmentTitleProvider() {