* (bug 57874) action=feedcontributions no longer has one item more than limit.
* All API modules now support an assert parameter. See the new features section
for more details.
+* Added prop=contributors to fetch the list of contributors to the page.
=== Languages updated in 1.23 ===
// Set the fragment if one was specified in the redirect
if ( strval( $this->getTitle()->getFragment() ) != '' ) {
- $outputPage->addInlineScript( Xml::encodeJsCall(
- 'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
- ) );
+ $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
+ $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
}
// Add a <link rel="canonical"> tag
'ApiQueryCategoryInfo' => 'includes/api/ApiQueryCategoryInfo.php',
'ApiQueryCategoryMembers' => 'includes/api/ApiQueryCategoryMembers.php',
'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
+ 'ApiQueryContributors' => 'includes/api/ApiQueryContributors.php',
'ApiQueryDeletedrevs' => 'includes/api/ApiQueryDeletedrevs.php',
'ApiQueryDisabled' => 'includes/api/ApiQueryDisabled.php',
'ApiQueryDuplicateFiles' => 'includes/api/ApiQueryDuplicateFiles.php',
'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
'CSSMin' => 'includes/libs/CSSMin.php',
'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
+ 'HashRing' => 'includes/libs/HashRing.php',
'HttpStatus' => 'includes/libs/HttpStatus.php',
'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
+ 'MappedIterator' => 'includes/libs/MappedIterator.php',
'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
'JSCompilerContext' => 'includes/libs/jsminplus.php',
'JSMinPlus' => 'includes/libs/jsminplus.php',
# includes/profiler
'Profiler' => 'includes/profiler/Profiler.php',
+ 'ProfilerMwprof' => 'includes/profiler/ProfilerMwprof.php',
'ProfilerSimple' => 'includes/profiler/ProfilerSimple.php',
'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
'ConfEditorToken' => 'includes/utils/ConfEditor.php',
'DoubleReplacer' => 'includes/utils/StringUtils.php',
'ExplodeIterator' => 'includes/utils/StringUtils.php',
- 'HashRing' => 'includes/utils/HashRing.php',
'HashtableReplacer' => 'includes/utils/StringUtils.php',
'IP' => 'includes/utils/IP.php',
'MWCryptRand' => 'includes/utils/MWCryptRand.php',
'MWFunction' => 'includes/utils/MWFunction.php',
- 'MappedIterator' => 'includes/utils/MappedIterator.php',
'RegexlikeReplacer' => 'includes/utils/StringUtils.php',
'ReplacementArray' => 'includes/utils/StringUtils.php',
'Replacer' => 'includes/utils/StringUtils.php',
return;
}
+ if ( substr( $filename, 0, 6 ) === 'alias:' ) {
+ // Supported alias formats:
+ // - No deprecation warning: alias:MyNewClassName
+ // - Deprecated in MediaWiki 1.1: alias:MyNewClassName?v=1.1
+ // - Deprecated in MyExtension 1.1: alias:MyNewClassName?c=MyExtension&v=1.1
+ $parts = explode( '?', substr( $filename, 6 ), 2 );
+ $newClassName = $parts[0];
+
+ // If necessary, this will make a recursive call to this function to
+ // load the class using its actual, canonical name.
+ class_alias( $newClassName, $className );
+
+ if ( isset( $parts[1] ) && function_exists( 'wfDeprecated' ) ) {
+ $info = wfCgiToArray( $parts[1] );
+ $function = "name $className for class $newClassName";
+ $version = isset( $info['v'] ) ? $info['v'] : false;
+ $component = isset( $info['c'] ) ? $info['c'] : false;
+
+ // https://github.com/facebook/hhvm/issues/1018
+ $callerOffset = wfIsHHVM() ? 2 : 3;
+ wfDeprecated( $function, $version, $component, $callerOffset );
+ }
+
+ return;
+ }
+
# Make an absolute path, this improves performance by avoiding some stat calls
if ( substr( $filename, 0, 1 ) != '/' && substr( $filename, 1, 1 ) != ':' ) {
global $IP;
function useOutputPage() {
return $this->useMessageCache() &&
!empty( $GLOBALS['wgFullyInitialised'] ) &&
- !empty( $GLOBALS['wgOut'] ) &&
- !empty( $GLOBALS['wgTitle'] );
+ !empty( $GLOBALS['wgOut'] );
}
/**
private static $QueryPropModules = array(
'categories' => 'ApiQueryCategories',
'categoryinfo' => 'ApiQueryCategoryInfo',
+ 'contributors' => 'ApiQueryContributors',
'duplicatefiles' => 'ApiQueryDuplicateFiles',
'extlinks' => 'ApiQueryExternalLinks',
'images' => 'ApiQueryImages',
--- /dev/null
+<?php
+/**
+ * Query the list of contributors to a page
+ *
+ * Created on Nov 14, 2013
+ *
+ * Copyright © 2013 Brad Jorsch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.23
+ */
+
+/**
+ * A query module to show contributors to a page
+ *
+ * @ingroup API
+ * @since 1.23
+ */
+class ApiQueryContributors extends ApiQueryBase {
+ /** We don't want to process too many pages at once (it hits cold
+ * database pages too heavily), so only do the first MAX_PAGES input pages
+ * in each API call (leaving the rest for continuation).
+ */
+ const MAX_PAGES = 100;
+
+ public function __construct( $query, $moduleName ) {
+ // "pc" is short for "page contributors", "co" was already taken by the
+ // GeoData extension's prop=coordinates.
+ parent::__construct( $query, $moduleName, 'pc' );
+ }
+
+ public function execute() {
+ $db = $this->getDB();
+ $params = $this->extractRequestParams();
+ $this->requireMaxOneParameter( $params, 'group', 'excludegroup', 'rights', 'excluderights' );
+
+ // Only operate on existing pages
+ $pages = array_keys( $this->getPageSet()->getGoodTitles() );
+
+ // Filter out already-processed pages
+ if ( $params['continue'] !== null ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
+ $cont_page = (int)$cont[0];
+ $pages = array_filter( $pages, function ( $v ) use ( $cont_page ) {
+ return $v >= $cont_page;
+ } );
+ }
+ if ( !count( $pages ) ) {
+ // Nothing to do
+ return;
+ }
+
+ // Apply MAX_PAGES, leaving any over the limit for a continue.
+ sort( $pages );
+ $continuePages = null;
+ if ( count( $pages ) > self::MAX_PAGES ) {
+ $continuePages = $pages[self::MAX_PAGES] . '|0';
+ $pages = array_slice( $pages, 0, self::MAX_PAGES );
+ }
+
+ $result = $this->getResult();
+
+ // First, count anons
+ $this->addTables( 'revision' );
+ $this->addFields( array(
+ 'page' => 'rev_page',
+ 'anons' => 'COUNT(DISTINCT rev_user_text)',
+ ) );
+ $this->addWhereFld( 'rev_page', $pages );
+ $this->addWhere( 'rev_user = 0' );
+ $this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+ $this->addOption( 'GROUP BY', 'rev_page' );
+ $res = $this->select( __METHOD__ );
+ foreach ( $res as $row ) {
+ $fit = $result->addValue( array( 'query', 'pages', $row->page ),
+ 'anoncontributors', $row->anons
+ );
+ if ( !$fit ) {
+ // This not fitting isn't reasonable, so it probably means that
+ // some other module used up all the space. Just set a dummy
+ // continue and hope it works next time.
+ $this->setContinueEnumParameter( 'continue',
+ $params['continue'] !== null ? $params['continue'] : '0|0'
+ );
+ return;
+ }
+ }
+
+ // Next, add logged-in users
+ $this->resetQueryParams();
+ $this->addTables( 'revision' );
+ $this->addFields( array(
+ 'page' => 'rev_page',
+ 'user' => 'rev_user',
+ 'username' => 'MAX(rev_user_text)', // Non-MySQL databases don't like partial group-by
+ ) );
+ $this->addWhereFld( 'rev_page', $pages );
+ $this->addWhere( 'rev_user != 0' );
+ $this->addWhere( $db->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' );
+ $this->addOption( 'GROUP BY', 'rev_page, rev_user' );
+ $this->addOption( 'LIMIT', $params['limit'] + 1 );
+
+ // Force a sort order to ensure that properties are grouped by page
+ // But only if pp_page is not constant in the WHERE clause.
+ if ( count( $pages ) > 1 ) {
+ $this->addOption( 'ORDER BY', 'rev_page, rev_user' );
+ } else {
+ $this->addOption( 'ORDER BY', 'rev_user' );
+ }
+
+ $limitGroups = array();
+ if ( $params['group'] ) {
+ $excludeGroups = false;
+ $limitGroups = $params['group'];
+ } elseif ( $params['excludegroup'] ) {
+ $excludeGroups = true;
+ $limitGroups = $params['excludegroup'];
+ } elseif ( $params['rights'] ) {
+ $excludeGroups = false;
+ foreach ( $params['rights'] as $r ) {
+ $limitGroups = array_merge( $limitGroups, User::getGroupsWithPermission( $r ) );
+ }
+
+ // If no group has the rights requested, no need to query
+ if ( !$limitGroups ) {
+ if ( $continuePages !== null ) {
+ // But we still need to continue for the next page's worth
+ // of anoncontributors
+ $this->setContinueEnumParameter( 'continue', $continuePages );
+ }
+ return;
+ }
+ } elseif ( $params['excluderights'] ) {
+ $excludeGroups = true;
+ foreach ( $params['excluderights'] as $r ) {
+ $limitGroups = array_merge( $limitGroups, User::getGroupsWithPermission( $r ) );
+ }
+ }
+
+ if ( $limitGroups ) {
+ $limitGroups = array_unique( $limitGroups );
+ $this->addTables( 'user_groups' );
+ $this->addJoinConds( array( 'user_groups' => array(
+ $excludeGroups ? 'LEFT OUTER JOIN' : 'INNER JOIN',
+ array( 'ug_user=rev_user', 'ug_group' => $limitGroups )
+ ) ) );
+ $this->addWhereIf( 'ug_user IS NULL', $excludeGroups );
+ }
+
+ if ( $params['continue'] !== null ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
+ $cont_page = (int)$cont[0];
+ $cont_user = (int)$cont[1];
+ $this->addWhere(
+ "rev_page > $cont_page OR " .
+ "(rev_page = $cont_page AND " .
+ "rev_user >= $cont_user)"
+ );
+ }
+
+ $res = $this->select( __METHOD__ );
+ $count = 0;
+ foreach ( $res as $row ) {
+ if ( ++$count > $params['limit'] ) {
+ // We've reached the one extra which shows that
+ // there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+ return;
+ }
+
+ $fit = $this->addPageSubItem( $row->page,
+ array( 'userid' => $row->user, 'name' => $row->username ),
+ 'user'
+ );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $row->page . '|' . $row->user );
+ return;
+ }
+ }
+
+ if ( $continuePages !== null ) {
+ $this->setContinueEnumParameter( 'continue', $continuePages );
+ }
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function getAllowedParams() {
+ $userGroups = User::getAllGroups();
+ $userRights = User::getAllRights();
+
+ return array(
+ 'group' => array(
+ ApiBase::PARAM_TYPE => $userGroups,
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'excludegroup' => array(
+ ApiBase::PARAM_TYPE => $userGroups,
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'rights' => array(
+ ApiBase::PARAM_TYPE => $userRights,
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'excluderights' => array(
+ ApiBase::PARAM_TYPE => $userRights,
+ ApiBase::PARAM_ISMULTI => true,
+ ),
+ 'limit' => array(
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ 'continue' => null,
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'group' => array(
+ 'Limit users to given group name(s)',
+ 'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed'
+ ),
+ 'excludegroup' => array(
+ 'Exclude users in given group name(s)',
+ 'Does not include implicit or auto-promoted groups like *, user, or autoconfirmed'
+ ),
+ 'rights' => array(
+ 'Limit users to those having given right(s)',
+ 'Does not include rights granted by implicit or auto-promoted groups ' .
+ 'like *, user, or autoconfirmed'
+ ),
+ 'excluderights' => array(
+ 'Limit users to those not having given right(s)',
+ 'Does not include rights granted by implicit or auto-promoted groups ' .
+ 'like *, user, or autoconfirmed'
+ ),
+ 'limit' => 'How many contributors to return',
+ 'continue' => 'When more results are available, use this to continue',
+ );
+ }
+
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(),
+ $this->getRequireMaxOneParameterErrorMessages(
+ array( 'group', 'excludegroup', 'rights', 'excluderights' )
+ )
+ );
+ }
+
+
+ public function getDescription() {
+ return 'Get the list of logged-in contributors and ' .
+ 'the count of anonymous contributors to a page';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&prop=contributors&titles=Main_Page',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Properties#contributors_.2F_pc';
+ }
+}
foreach ( $diffs as $url => $dummy ) {
foreach ( wfMakeUrlIndexes( $url ) as $index ) {
$arr[] = array(
+ 'el_id' => $this->mDb->nextSequenceValue( 'externallinks_el_id_seq' ),
'el_from' => $this->mId,
'el_to' => $url,
'el_index' => $index,
public function submitConnectForm() {
// Get variables from the request
- $newValues = $this->setVarsFromRequest(
+ $newValues = $this->setVarsFromRequest( array(
'wgDBserver',
'wgDBprefix',
'wgDBuser',
'wgDBpassword'
- );
+ ) );
$this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
// Validate them
--- /dev/null
+<?php
+/**
+ * Convenience class for weighted consistent hash rings.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for weighted consistent hash rings
+ *
+ * @since 1.22
+ */
+class HashRing {
+ /** @var Array (location => weight) */
+ protected $sourceMap = array();
+ /** @var Array (location => (start, end)) */
+ protected $ring = array();
+
+ const RING_SIZE = 268435456; // 2^28
+
+ /**
+ * @param array $map (location => weight)
+ */
+ public function __construct( array $map ) {
+ $map = array_filter( $map, function ( $w ) {
+ return $w > 0;
+ } );
+ if ( !count( $map ) ) {
+ throw new UnexpectedValueException( "Ring is empty or all weights are zero." );
+ }
+ $this->sourceMap = $map;
+ // Sort the locations based on the hash of their names
+ $hashes = array();
+ foreach ( $map as $location => $weight ) {
+ $hashes[$location] = sha1( $location );
+ }
+ uksort( $map, function ( $a, $b ) use ( $hashes ) {
+ return strcmp( $hashes[$a], $hashes[$b] );
+ } );
+ // Fit the map to weight-proportionate one with a space of size RING_SIZE
+ $sum = array_sum( $map );
+ $standardMap = array();
+ foreach ( $map as $location => $weight ) {
+ $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
+ }
+ // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
+ $index = 0;
+ foreach ( $standardMap as $location => $weight ) {
+ // Location covers half-closed interval [$index,$index + $weight)
+ $this->ring[$location] = array( $index, $index + $weight );
+ $index += $weight;
+ }
+ // Make sure the last location covers what is left
+ end( $this->ring );
+ $this->ring[key( $this->ring )][1] = self::RING_SIZE;
+ }
+
+ /**
+ * Get the location of an item on the ring
+ *
+ * @param string $item
+ * @return string Location
+ */
+ public function getLocation( $item ) {
+ $locations = $this->getLocations( $item, 1 );
+
+ return $locations[0];
+ }
+
+ /**
+ * Get the location of an item on the ring, as well as the next clockwise locations
+ *
+ * @param string $item
+ * @param integer $limit Maximum number of locations to return
+ * @return array List of locations
+ */
+ public function getLocations( $item, $limit ) {
+ $locations = array();
+ $primaryLocation = null;
+ $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
+ foreach ( $this->ring as $location => $range ) {
+ if ( count( $locations ) >= $limit ) {
+ break;
+ }
+ // The $primaryLocation is the location the item spot is in.
+ // After that is reached, keep appending the next locations.
+ if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
+ if ( $primaryLocation === null ) {
+ $primaryLocation = $location;
+ }
+ $locations[] = $location;
+ }
+ }
+ // If more locations are requested, wrap-around and keep adding them
+ reset( $this->ring );
+ while ( count( $locations ) < $limit ) {
+ list( $location, ) = each( $this->ring );
+ if ( $location === $primaryLocation ) {
+ break; // don't go in circles
+ }
+ $locations[] = $location;
+ }
+
+ return $locations;
+ }
+
+ /**
+ * Get the map of locations to weight (ignores 0-weight items)
+ *
+ * @return array
+ */
+ public function getLocationWeights() {
+ return $this->sourceMap;
+ }
+
+ /**
+ * Get a new hash ring with a location removed from the ring
+ *
+ * @param string $location
+ * @return HashRing|bool Returns false if no non-zero weighted spots are left
+ */
+ public function newWithoutLocation( $location ) {
+ $map = $this->sourceMap;
+ unset( $map[$location] );
+ if ( count( $map ) ) {
+ return new self( $map );
+ }
+
+ return false;
+ }
+}
--- /dev/null
+<?php
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * @since 1.21
+ */
+class MappedIterator extends FilterIterator {
+ /** @var callable */
+ protected $vCallback;
+ /** @var callable */
+ protected $aCallback;
+ /** @var array */
+ protected $cache = array();
+
+ protected $rewound = false; // boolean; whether rewind() has been called
+
+ /**
+ * Build an new iterator from a base iterator by having the former wrap the
+ * later, returning the result of "value" callback for each current() invocation.
+ * The callback takes the result of current() on the base iterator as an argument.
+ * The keys of the base iterator are reused verbatim.
+ *
+ * An "accept" callback can also be provided which will be called for each value in
+ * the base iterator (post-callback) and will return true if that value should be
+ * included in iteration of the MappedIterator (otherwise it will be filtered out).
+ *
+ * @param Iterator|Array $iter
+ * @param callable $vCallback Value transformation callback
+ * @param array $options Options map (includes "accept") (since 1.22)
+ * @throws UnexpectedValueException
+ */
+ public function __construct( $iter, $vCallback, array $options = array() ) {
+ if ( is_array( $iter ) ) {
+ $baseIterator = new ArrayIterator( $iter );
+ } elseif ( $iter instanceof Iterator ) {
+ $baseIterator = $iter;
+ } else {
+ throw new UnexpectedValueException( "Invalid base iterator provided." );
+ }
+ parent::__construct( $baseIterator );
+ $this->vCallback = $vCallback;
+ $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+ }
+
+ public function next() {
+ $this->cache = array();
+ parent::next();
+ }
+
+ public function rewind() {
+ $this->rewound = true;
+ $this->cache = array();
+ parent::rewind();
+ }
+
+ public function accept() {
+ $value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
+ $ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
+ if ( $ok ) {
+ $this->cache['current'] = $value;
+ }
+
+ return $ok;
+ }
+
+ public function key() {
+ $this->init();
+
+ return parent::key();
+ }
+
+ public function valid() {
+ $this->init();
+
+ return parent::valid();
+ }
+
+ public function current() {
+ $this->init();
+ if ( parent::valid() ) {
+ return $this->cache['current'];
+ } else {
+ return null; // out of range
+ }
+ }
+
+ /**
+ * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
+ */
+ protected function init() {
+ if ( !$this->rewound ) {
+ $this->rewind();
+ }
+ }
+}
if ( $parser->incrementExpensiveFunctionCount() ) {
$sources = $titleObject->getCascadeProtectionSources();
foreach ( $sources[0] as $sourceTitle ) {
- $names[] = $sourceTitle->getText();
+ $names[] = $sourceTitle->getPrefixedText();
}
}
--- /dev/null
+<?php
+/**
+ * Profiler class for Mwprof.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Profiler
+ */
+
+/**
+ * Profiler class for Mwprof.
+ *
+ * Mwprof is a high-performance MediaWiki profiling data collector, designed to
+ * collect profiling data from multiple hosts running in tandem. This class
+ * serializes profiling samples into MessagePack arrays and sends them to an
+ * Mwprof instance via UDP.
+ *
+ * @see https://github.com/wikimedia/operations-software-mwprof
+ * @since 1.23
+ */
+class ProfilerMwprof extends Profiler {
+
+ // Message types
+
+ const TYPE_SINGLE = 1;
+ const TYPE_RUNNING = 2;
+
+ /**
+ * Indicate that this Profiler subclass is persistent.
+ *
+ * Called by Parser::braceSubstitution. If true, the parser will not
+ * generate per-title profiling sections, to avoid overloading the
+ * profiling data collector.
+ *
+ * @return bool true
+ */
+ public function isPersistent() {
+ return true;
+ }
+
+ /**
+ * Start a profiling section.
+ *
+ * Marks the beginning of the function or code-block that should be time
+ * and logged under some specific name.
+ *
+ * @param string $inName Section to start
+ */
+ public function profileIn( $inName ) {
+ $this->mWorkStack[] = array( $inName, count( $this->mWorkStack ),
+ $this->getTime(), $this->getTime( 'cpu' ) );
+ }
+
+ /**
+ * Produce an empty function report.
+ *
+ * ProfileMwprof does not provide a function report.
+ *
+ * @return string Empty string.
+ */
+ public function getFunctionReport() {
+ return '';
+ }
+
+ /**
+ * Close a profiling section.
+ *
+ * Marks the end of the function or code-block that should be timed and
+ * logged under some specific name.
+ *
+ * @param string $outName Section to close
+ */
+ public function profileOut( $outName ) {
+ list( $inName, $inCount, $inWall, $inCpu ) = array_pop( $this->mWorkStack );
+
+ // Check for unbalanced profileIn / profileOut calls.
+ // Bad entries are logged but not sent.
+ if ( $inName !== $outName ) {
+ wfDebugLog( 'ProfilerUnbalanced', json_encode( array( $inName, $outName ) ) );
+ return;
+ }
+
+ $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
+ $elapsedWall = $this->getTime() - $inWall;
+ $this->updateEntry( $outName, $elapsedCpu, $elapsedWall );
+ $this->updateTrxProfiling( $outName, $elapsedWall );
+ }
+
+ /**
+ * Update an entry with timing data.
+ *
+ * @param string $name Section name
+ * @param float $elapsedCpu elapsed CPU time
+ * @param float $elapsedWall elapsed wall-clock time
+ */
+ public function updateEntry( $name, $elapsedCpu, $elapsedWall ) {
+ // If this is the first measurement for this entry, store plain values.
+ // Many profiled functions will only be called once per request.
+ if ( !isset( $this->mCollated[$name] ) ) {
+ $this->mCollated[$name] = array(
+ 'cpu' => $elapsedCpu,
+ 'wall' => $elapsedWall,
+ 'count' => 1,
+ );
+ return;
+ }
+
+ $entry = &$this->mCollated[$name];
+
+ // If it's the second measurement, convert the plain values to
+ // RunningStat instances, so we can push the incoming values on top.
+ if ( $entry['count'] === 1 ) {
+ $cpu = new RunningStat();
+ $cpu->push( $entry['cpu'] );
+ $entry['cpu'] = $cpu;
+
+ $wall = new RunningStat();
+ $wall->push( $entry['wall'] );
+ $entry['wall'] = $wall;
+ }
+
+ $entry['count']++;
+ $entry['cpu']->push( $elapsedCpu );
+ $entry['wall']->push( $elapsedWall );
+ }
+
+ /**
+ * Serialize profiling data and send to a profiling data aggregator.
+ *
+ * Individual entries are represented as arrays and then encoded using
+ * MessagePack, an efficient binary data-interchange format. Encoded
+ * entries are accumulated into a buffer and sent in batch via UDP to the
+ * profiling data aggregator.
+ */
+ public function logData() {
+ global $wgUDPProfilerHost, $wgUDPProfilerPort;
+
+ $this->close();
+
+ $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+ socket_connect( $sock, $wgUDPProfilerHost, $wgUDPProfilerPort );
+ $bufferLength = 0;
+ $buffer = '';
+ foreach ( $this->mCollated as $name => $entry ) {
+ $count = $entry['count'];
+ $cpu = $entry['cpu'];
+ $wall = $entry['wall'];
+
+ if ( $count === 1 ) {
+ $data = array( self::TYPE_SINGLE, $name, $cpu, $wall );
+ } else {
+ $data = array( self::TYPE_RUNNING, $name, $count,
+ $cpu->m1, $cpu->m2, $cpu->min, $cpu->max,
+ $wall->m1, $wall->m2, $wall->min, $wall->max );
+ }
+
+ $encoded = MWMessagePack::pack( $data );
+ $length = strlen( $encoded );
+
+ // If adding this entry would cause the size of the buffer to
+ // exceed the standard ethernet MTU size less the UDP header,
+ // send all pending data and reset the buffer. Otherwise, continue
+ // accumulating entries into the current buffer.
+ if ( $length + $bufferLength > 1450 ) {
+ socket_send( $sock, $buffer, $bufferLength, 0 );
+ $buffer = '';
+ $bufferLength = 0;
+ }
+ $buffer .= $encoded;
+ $bufferLength += $length;
+ }
+ if ( $bufferLength !== 0 ) {
+ socket_send( $sock, $buffer, $bufferLength, 0 );
+ }
+ }
+}
+++ /dev/null
-<?php
-/**
- * Convenience class for weighted consistent hash rings.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Convenience class for weighted consistent hash rings
- *
- * @since 1.22
- */
-class HashRing {
- /** @var Array (location => weight) */
- protected $sourceMap = array();
- /** @var Array (location => (start, end)) */
- protected $ring = array();
-
- const RING_SIZE = 268435456; // 2^28
-
- /**
- * @param array $map (location => weight)
- */
- public function __construct( array $map ) {
- $map = array_filter( $map, function ( $w ) {
- return $w > 0;
- } );
- if ( !count( $map ) ) {
- throw new MWException( "Ring is empty or all weights are zero." );
- }
- $this->sourceMap = $map;
- // Sort the locations based on the hash of their names
- $hashes = array();
- foreach ( $map as $location => $weight ) {
- $hashes[$location] = sha1( $location );
- }
- uksort( $map, function ( $a, $b ) use ( $hashes ) {
- return strcmp( $hashes[$a], $hashes[$b] );
- } );
- // Fit the map to weight-proportionate one with a space of size RING_SIZE
- $sum = array_sum( $map );
- $standardMap = array();
- foreach ( $map as $location => $weight ) {
- $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
- }
- // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
- $index = 0;
- foreach ( $standardMap as $location => $weight ) {
- // Location covers half-closed interval [$index,$index + $weight)
- $this->ring[$location] = array( $index, $index + $weight );
- $index += $weight;
- }
- // Make sure the last location covers what is left
- end( $this->ring );
- $this->ring[key( $this->ring )][1] = self::RING_SIZE;
- }
-
- /**
- * Get the location of an item on the ring
- *
- * @param string $item
- * @return string Location
- */
- public function getLocation( $item ) {
- $locations = $this->getLocations( $item, 1 );
-
- return $locations[0];
- }
-
- /**
- * Get the location of an item on the ring, as well as the next clockwise locations
- *
- * @param string $item
- * @param integer $limit Maximum number of locations to return
- * @return array List of locations
- */
- public function getLocations( $item, $limit ) {
- $locations = array();
- $primaryLocation = null;
- $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
- foreach ( $this->ring as $location => $range ) {
- if ( count( $locations ) >= $limit ) {
- break;
- }
- // The $primaryLocation is the location the item spot is in.
- // After that is reached, keep appending the next locations.
- if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
- if ( $primaryLocation === null ) {
- $primaryLocation = $location;
- }
- $locations[] = $location;
- }
- }
- // If more locations are requested, wrap-around and keep adding them
- reset( $this->ring );
- while ( count( $locations ) < $limit ) {
- list( $location, ) = each( $this->ring );
- if ( $location === $primaryLocation ) {
- break; // don't go in circles
- }
- $locations[] = $location;
- }
-
- return $locations;
- }
-
- /**
- * Get the map of locations to weight (ignores 0-weight items)
- *
- * @return array
- */
- public function getLocationWeights() {
- return $this->sourceMap;
- }
-
- /**
- * Get a new hash ring with a location removed from the ring
- *
- * @param string $location
- * @return HashRing|bool Returns false if no non-zero weighted spots are left
- */
- public function newWithoutLocation( $location ) {
- $map = $this->sourceMap;
- unset( $map[$location] );
- if ( count( $map ) ) {
- return new self( $map );
- }
-
- return false;
- }
-}
+++ /dev/null
-<?php
-/**
- * Convenience class for generating iterators from iterators.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Convenience class for generating iterators from iterators.
- *
- * @since 1.21
- */
-class MappedIterator extends FilterIterator {
- /** @var callable */
- protected $vCallback;
- /** @var callable */
- protected $aCallback;
- /** @var array */
- protected $cache = array();
-
- protected $rewound = false; // boolean; whether rewind() has been called
-
- /**
- * Build an new iterator from a base iterator by having the former wrap the
- * later, returning the result of "value" callback for each current() invocation.
- * The callback takes the result of current() on the base iterator as an argument.
- * The keys of the base iterator are reused verbatim.
- *
- * An "accept" callback can also be provided which will be called for each value in
- * the base iterator (post-callback) and will return true if that value should be
- * included in iteration of the MappedIterator (otherwise it will be filtered out).
- *
- * @param Iterator|Array $iter
- * @param callable $vCallback Value transformation callback
- * @param array $options Options map (includes "accept") (since 1.22)
- * @throws MWException
- */
- public function __construct( $iter, $vCallback, array $options = array() ) {
- if ( is_array( $iter ) ) {
- $baseIterator = new ArrayIterator( $iter );
- } elseif ( $iter instanceof Iterator ) {
- $baseIterator = $iter;
- } else {
- throw new MWException( "Invalid base iterator provided." );
- }
- parent::__construct( $baseIterator );
- $this->vCallback = $vCallback;
- $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
- }
-
- public function next() {
- $this->cache = array();
- parent::next();
- }
-
- public function rewind() {
- $this->rewound = true;
- $this->cache = array();
- parent::rewind();
- }
-
- public function accept() {
- $value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
- $ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
- if ( $ok ) {
- $this->cache['current'] = $value;
- }
-
- return $ok;
- }
-
- public function key() {
- $this->init();
-
- return parent::key();
- }
-
- public function valid() {
- $this->init();
-
- return parent::valid();
- }
-
- public function current() {
- $this->init();
- if ( parent::valid() ) {
- return $this->cache['current'];
- } else {
- return null; // out of range
- }
- }
-
- /**
- * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
- */
- protected function init() {
- if ( !$this->rewound ) {
- $this->rewind();
- }
- }
-}
'version-parser-function-hooks' => "Galv an arc'hwelioù dielfennañ",
'version-hook-name' => 'Anv ar galv',
'version-hook-subscribedby' => 'Termenet gant',
-'version-version' => '(Stumm $1)',
-'version-license' => 'Aotre-implijout',
+'version-version' => '($1)',
+'version-license' => 'Aotre-implijout MediaWiki',
'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 're all',
'version-poweredby-translators' => 'troerien translatewiki.net',
'group-autoconfirmed' => 'Ша тӀелаьцболу декъашхой',
'group-bot' => 'Шаболххой',
'group-sysop' => 'Куьйгалхой',
-'group-bureaucrat' => 'Ð\94аÑ\80жаÑ\85ой',
+'group-bureaucrat' => 'Ð\91Ñ\8eÑ\80окÑ\80аÑ\82аÑ\88',
'group-suppress' => 'Ревизораш',
'group-all' => '(массо)',
'group-user-member' => '{{GENDER:$1|декъашхо}}',
'group-bot-member' => 'шаболххо',
'group-sysop-member' => '{{GENDER:$1|куьйгалхо}}',
-'group-bureaucrat-member' => 'даржахо',
+'group-bureaucrat-member' => '{{GENDER:$1|бюрократхо}}',
'group-suppress-member' => 'левисорхо',
'grouppage-user' => '{{ns:project}}:Декъашхой',
'grouppage-autoconfirmed' => '{{ns:project}}:Бакъонаш йолу декъашхой',
'grouppage-bot' => '{{ns:project}}:Шаболххой',
'grouppage-sysop' => '{{ns:project}}:Куьйгалхой',
-'grouppage-bureaucrat' => '{{ns:project}}:Ð\94аÑ\80жаÑ\85ой',
+'grouppage-bureaucrat' => '{{ns:project}}:Ð\91Ñ\8eÑ\80окÑ\80аÑ\82аÑ\88',
'grouppage-suppress' => '{{ns:project}}:Ревизораш',
# Rights
Ишта чу ханчохь, ахьа дехьа яккха йезар ю йа куьйга хlоттайар, нагахь иза хьашт йалахь.",
'movearticle' => 'Цle хийца хlокху агlон',
+'moveuserpage-warning' => "'''Тергам бе.''' Хьо декъашхочун агӀона цӀе хийца гӀерта. Дехар до, тергам бе, декъашхочун агӀона цӀе бен хийца лур яц, декъашхочун дӀаяздаран цӀе хийца лур яц.",
'newtitle' => 'Керла цlе',
'move-watch' => 'Латайé хӀара агӀо тергаме могӀанан юкъахь',
'movepagebtn' => 'Агlон цlе хийца',
'version-parser-function-hooks' => "Parsererweiterungen ''(Funktionen)''",
'version-hook-name' => 'Schnittstellenname',
'version-hook-subscribedby' => 'Aufruf von',
-'version-version' => '(Version $1)',
+'version-version' => '($1)',
'version-svn-revision' => '(Version $2)',
'version-license' => 'MediaWiki-Lizenz',
'version-ext-license' => 'Lizenz',
'protectthispage' => 'Ena pele bıpawe',
'unprotect' => 'Starkerdışi bıvurne',
'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
-'newpage' => 'Pera newiye',
+'newpage' => 'Pela newiye',
'talkpage' => 'Ena pele sero werêne',
'talkpagelinktext' => 'Werênayış',
'specialpage' => 'Pela xısusiye',
'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
'edithelp' => 'Peştdariya vurnayışi',
'helppage' => 'Help:Zerrek',
-'mainpage' => 'Pera Seri',
-'mainpage-description' => 'Pera Seri',
+'mainpage' => 'Pela Seri',
+'mainpage-description' => 'Pela seri',
'policy-url' => 'Project:Terzê hereketi',
'portal' => 'Portalê cemaeti',
'portal-url' => 'Project:Portalê cemaeti',
'nstab-main' => 'Wesiqe',
'nstab-user' => 'Pera Karberi',
'nstab-media' => 'Pera Medya',
-'nstab-special' => 'Pera bağsi',
+'nstab-special' => 'Pela xase',
'nstab-project' => 'Pera proci',
'nstab-image' => 'Dosya',
'nstab-mediawiki' => 'Mesac',
'prefs-dateformat' => 'Formatê tarixi',
'prefs-timeoffset' => 'Wext offset',
'prefs-advancedediting' => 'Herayen weçinayış',
-'prefs-editor' => 'Timarkar',
+'prefs-editor' => 'Vurnayoğ',
'prefs-preview' => 'Verqayt',
'prefs-advancedrc' => 'Tercihê raverberdey',
'prefs-advancedrendering' => 'Tercihê raverberdey',
'listusers-desc' => 'Kemeyen rézed ratn',
'usereditcount' => '$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}',
'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
-'newpages' => 'Peré newey',
+'newpages' => 'Pelê newey',
'newpages-username' => 'Nameyê karberi:',
'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
'move' => 'Bere',
'tooltip-search' => '{{SITENAME}} miyan de bıvin',
'tooltip-search-go' => 'Ebe nê namey tami şo yew pela ke esta',
'tooltip-search-fulltext' => 'Nê metni peran dı cı geyre',
-'tooltip-p-logo' => 'Şo pera seri',
-'tooltip-n-mainpage' => 'Şo pera seri',
+'tooltip-p-logo' => 'Şo pela seri',
+'tooltip-n-mainpage' => 'Şo pela seri',
'tooltip-n-mainpage-description' => 'Şo pela seri',
'tooltip-n-portal' => 'Heqa projey de, kes çı şeno bıkero, çıçiyo koti deyo',
'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
'tooltip-ca-nstab-main' => 'Perra muhtevay bıvin',
'tooltip-ca-nstab-user' => 'Pera karberi bıvin',
'tooltip-ca-nstab-media' => 'Pera medya bıvin',
-'tooltip-ca-nstab-special' => 'Na zu pera bağsi ya, şıma néşené sero vırnayış bıkeré',
+'tooltip-ca-nstab-special' => 'Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê',
'tooltip-ca-nstab-project' => 'Pera proci bıvin',
'tooltip-ca-nstab-image' => 'Pera dosyayer bıvin',
'tooltip-ca-nstab-mediawiki' => 'Mesacané sistemi bıvin',
E-posta yo ke erşawiyeno tede gıreyê kodê araşti esto, gıreyi pıploxne akerê u e-postayê xo araşt kerê.',
'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
Eka ti newe hesabê xo viraşt, ti gani yew di dekika vindero u email xo kontrol bike, yani reyna yew hesab meviraz.',
-'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
+'confirmemail_send' => 'Yew kodê konfirmasyoni bırışe',
'confirmemail_sent' => 'Emailê konfirmasyonî şiravt',
'confirmemail_oncreate' => 'Yew codê konfirmasyonî ma ti ra şiravt;
Ena kod semed ci kewtîşî lazim niyo, feqat ti gani sistem rê eno kod bimocne ke ti opsiyonê emailî wîkî a bike.',
# Special:SpecialPages
'specialpages' => 'Pelê xısusiy',
'specialpages-note-top' => 'Kıtabek',
-'specialpages-note' => '*Normal pera bağsi.
-* <span class="mw-specialpagerestricted">Peré bağseyé ke groté ver hafıza.</span>',
+'specialpages-note' => '* Pelê xasê normali.
+* <span class="mw-specialpagerestricted">Pelê xasê nımıtey.</span>',
'specialpages-group-maintenance' => 'Raporê tepıştışi',
'specialpages-group-other' => 'Pelê xasiyê bini',
'specialpages-group-login' => 'Cı kewe / hesab vıraze',
# Virus scanner
'virus-badscanner' => "Špatna konfiguracija: njeznaty wirusowy scanner: ''$1''",
-'virus-scanfailed' => 'Scannowanje jo se njeraźiło (kod $1)',
+'virus-scanfailed' => 'Scannowanje njejo se raźiło (koda $1)',
'virus-unknownscanner' => 'njeznaty antiwirus:',
# Login and logout pages
Nachylne gronidło: $2',
'passwordreset-emailsent' => 'E-mail za anulěrowanje gronidła jo se pósłała.',
'passwordreset-emailsent-capture' => 'E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.',
-'passwordreset-emailerror-capture' => 'E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} jo se njeraźiło: $1',
+'passwordreset-emailerror-capture' => 'E-mail za anulěrowanje gronidła jo se napórała, kótaraž se dołojce pokazujo, ale słanje {{GENDER:$2|wužywarjeju|wužywarce}} njejo se raźiło: $1',
# Special:ChangeEmail
'changeemail' => 'E-mailowu adresu změniś',
'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
Eksistěrujo južo.',
'defaultmessagetext' => 'Standardny tekst powěźeńki',
-'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
+'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 njejo se raźiło: $3',
'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł.
'action-undelete' => 'Toś ten bok wótnowiś',
'action-suppressrevision' => 'schowanu wersiju pśeglědaś a wótnowiś',
'action-suppressionlog' => 'toś ten priwatny protokol zwobrazniś',
-'action-block' => 'Toś tomu wužiwarjeju wobźěłowanje zawoboraś',
+'action-block' => 'Toś tomu wužywarjeju wobźěłowanje zawoboraś',
'action-protect' => 'Šćitowe stopnje za toś ten bok změniś',
'action-rollback' => 'změny slědnego wužywarja, kótaryž jo wobźěłał wěsty bok, malsnje slědk stajiś',
'action-import' => 'boki z drugego wikija importěrowaś',
'uploadstash-summary' => 'Toś ten bok zmóžnja dostup do datajow, kótarež su nagrate (abo so nagrawaju), ale hyšći njejsu do wikija wózjawjone. Toś te dataje njejsu widobne za nikogo, mimo až za wužywarja, kótaryž jo je nagrał.',
'uploadstash-clear' => 'Schowane nagrate dataje wulašowaś',
'uploadstash-nofiles' => 'Njamaš schowane nagrate dataje.',
-'uploadstash-badtoken' => 'Wuwjeźenje teje akcije jo se njeraźiło, snaź dokulaž twóje wobźěłowańske daty su spadnjone. Wopytaj hyšći raz.',
-'uploadstash-errclear' => 'Wótpóranje datajow jo se njeraźiło.',
+'uploadstash-badtoken' => 'Wuwjeźenje teje akcije njejo se raźiło, snaź dokulaž twóje wobźěłowańske daty su spadnjone. Wopytaj hyšći raz.',
+'uploadstash-errclear' => 'Wótpóranje datajow njejo se raźiło.',
'uploadstash-refresh' => 'Lisćinu datajow aktualizěrowaś',
'invalid-chunk-offset' => 'Njepłaśiwy startowy dypk',
# HTTP errors
'http-invalid-url' => 'Njepłaśiwy URL: $1',
'http-invalid-scheme' => 'URL ze šemu "$1" se njepódpěraju.',
-'http-request-error' => 'HTTP-napšašowanje jo se njeraźiło njeznateje zmólki dla.',
+'http-request-error' => 'HTTP-napšašowanje njejo se raźiło njeznateje zmólki dla.',
'http-read-error' => 'Cytańska zmólka HTTP.',
'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
'undeletedrevisions' => '{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.',
'undeletedfiles' => '{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.',
-'cannotundelete' => 'Wótnowjenje jo se njeraźiło:
+'cannotundelete' => 'Wótnowjenje njejo se raźiło:
$1',
'undeletedpage' => "Bok '''$1''' jo se nawrośił.
'importhistoryconflict' => 'Konflikt wersijow (snaź jo toś ten bok južo raz se importěrował)',
'importnosources' => 'Za transwikijowe importěrowanje njejsu žrědła definěrowane, direktne stawizny nagraśow su znjemóžnjone.',
'importnofile' => 'Žedna dataja za importěrowanje njejo se nagrała.',
-'importuploaderrorsize' => 'Nagrawanje importoweje dataje jo se njeraźiło. Dataja jo wětša ako dowólona wjelikosć nagraśow.',
-'importuploaderrorpartial' => 'Nagrawanje importoweje dataje jo se njeraźiło. Dataja jo se jano pó źělach nagrała.',
-'importuploaderrortemp' => 'Nagrawanje importoweje dataje jo se njeraźiło. Temporarny zapis feluje.',
+'importuploaderrorsize' => 'Nagrawanje importoweje dataje njejo se raźiło. Dataja jo wětša ako dowólona wjelikosć nagraśow.',
+'importuploaderrorpartial' => 'Nagrawanje importoweje dataje njejo se raźiło. Dataja jo se jano pó źělach nagrała.',
+'importuploaderrortemp' => 'Nagrawanje importoweje dataje njejo se raźiło. Temporarny zapis felujo.',
'import-parse-failure' => 'Zmólka pśi XML-imporśe:',
'import-noarticle' => 'Žeden bok za import!',
'import-nonewrevisions' => 'Wšykne wersije buchu južo pjerwjej importowane.',
'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
-'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane njejo se raźiło.',
# Patrol log
'patrol-log-page' => 'Protokol kontrolow',
# Scary transclusion
'scarytranscludedisabled' => '[Pśidawanje interwiki jo deaktiwěrowane]',
'scarytranscludefailed' => '[Zapśěgnjenje pśedłogi za $1 njejo se raźiło]',
-'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 jo se njeraźiło: HTTP $2]',
+'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 njejo se raźiło: HTTP $2]',
'scarytranscludetoolong' => '[URL jo pśedłujki]',
# Delete conflict
'feedback-submit' => 'Komentar wótpósłaś',
'feedback-adding' => 'Komentar pśidawa se bokoju...',
'feedback-error1' => 'Zmólka: Njepóznaty wuslědk wót API',
-'feedback-error2' => 'Zmólka: Wobźěłanje jo se njeraźiło',
+'feedback-error2' => 'Zmólka: Wobźěłanje njejo se raźiło',
'feedback-error3' => 'Zmólka: Žedne wótegrono wót API',
'feedback-thanks' => 'Źěkujomy se! Twój komentar jo se k bokoju "[$2 $1]" pósłał.',
'feedback-close' => 'Dokóńcony',
'api-error-duplicate-popup-title' => '{{PLURAL:$1|Dwójna dataja|Dwójnej dataji|Dwójne dataje|Dwójne dataje}}',
'api-error-empty-file' => 'Dataja, kótaruž sy nagrał, jo prozna była.',
'api-error-emptypage' => 'Napóranje nowych, proznych bokow njejo dowólone.',
-'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśii wobstarowanju dataje jo se něco njeraźiło.',
+'api-error-fetchfileerror' => 'Nutśikowna zmólka: Pśi wobstarowanju dataje něco njejo se raźiło.',
'api-error-fileexists-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo, a njedajo se pśepisaś.',
'api-error-fileexists-shared-forbidden' => 'Dataja z mjenim "$1" južo eksistěrujo w zgromadnem datajowem repozitoriumje a njedajo se pśepisaś.',
'api-error-file-too-large' => 'Dataja, kótaruž sy nagrał, jo pśewjelika była.',
'api-error-hookaborted' => 'Změna, kótaruž sy wopytał pśewjasć, jo se pśetergnuła pśez rozšyrjenje.',
'api-error-http' => 'Nutśikowna zmólka: Zwisk ze serwerom njemóžno.',
'api-error-illegal-filename' => 'Datajowe mě njejo dowólone.',
-'api-error-internal-error' => 'Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki jo se něco njeraźiło.',
+'api-error-internal-error' => 'Nutśikowna zmólka: Pśi pśeźěłowanju twójogo nagraśa na wiki něco njejo se raźiło.',
'api-error-invalid-file-key' => 'Nutśikowna zmólka: Dataja njejo se w temporernem składowaku namakała.',
'api-error-missingparam' => 'Nutśikowna zmólka: Felujuce parametry pśi napšašowanju.',
'api-error-missingresult' => 'Nutśikowna zmólka: Njedajo se zwěsćiś, lěc kopěrowanje jo se raźiło.',
'api-error-timeout' => 'Serwer njejo we wócakanem casu wótgronił.',
'api-error-unclassified' => 'Njeznata zmólka jo nastała.',
'api-error-unknown-code' => 'Njeznata zmólka: "$1"',
-'api-error-unknown-error' => 'Nutśikowna zmólka: Pśi nagrawanju twójeje dataje jo se něco njeraźiło.',
+'api-error-unknown-error' => 'Nutśikowna zmólka: Pśi nagrawanju twójeje dataje něco njejo se raźiło.',
'api-error-unknown-warning' => 'Njeznate warnowanje: $1',
'api-error-unknownerror' => 'Njeznata zmólka: "$1".',
'api-error-uploaddisabled' => 'Nagraśa su na toś tom wikiju znjemóžnjone.',
'tog-showtoc' => "Fà vèder al sûnt (p'r al pàgini cun pió 'd 3 sesiòun)",
'tog-rememberpassword' => "Tîn a mèint la cêva 'd ingrès insém a cól navigadōr ché (per un mâsim ed $1{{PLURAL:$1|dé}}).",
'tog-watchcreations' => "Zûnta al pàgini fâti e i file carghê int i tgnû 'd ôc specêl.",
+'tog-watchdefault' => "Zûnta al pàgini e i file mudifichê int i tgnû 'd ôc specêl.",
'tog-watchmoves' => "Zûnta al pàgini e i file spustê int i tgnû 'd ôc specêl.",
'tog-watchdeletion' => "Zûnta al pàgini e i file scanşlê int i tgnû 'd ôc specêl.",
'tog-minordefault' => 'Sògna ògni mudéfica cme céca (sōl cme pre-stabilî)',
+'tog-previewontop' => "Fà vèder còl ch' ò fât sōver la caşèla ed mudéfica e mìa sòta.",
+'tog-previewonfirst' => "Fà vèder còl ch' ò fât almēno 'na vôlta préma 'd salvêr",
+'tog-enotifwatchlistpages' => "Mândon un avîş cun la pôsta eletrônica quând a vîn cambiê 'na pàgina o un file preşèint int i tgnû 'd ôc specêl",
+'tog-enotifusertalkpages' => "Mândon un avîş cun la pôsta eletrônica quând a vîn cambiê la mé pàgina 'd discusiòun",
+'tog-enotifminoredits' => "Mândom un avîş ânca p'r al mudéfichi céchi ed pàgini e file",
+'tog-enotifrevealaddr' => "Fà vèder al mé indirés ed la pôsta eletrônica int i mesâg 'd avîş",
+'tog-shownumberswatching' => "Fà vèder al nómer ed j utèint che gh'àn la pàgina sòta uservasiòun",
+'tog-oldsig' => "La fîrma 'd adèsa",
+'tog-fancysig' => 'Trâta la fîrma cme wikitèst (sèinsa colegamèint avtomâtich)',
+'tog-uselivepreview' => 'Permèt la funsiòun "Live preview" (guêrda préma \'d salvêr dal vîv - in sperimèint)',
+'tog-forceeditsummary' => "Dmânda s'l'è vèira che al câmp argumèint l' é vōd",
+'tog-watchlisthideown' => "Lōga al mé mudéfichi int i tgnû 'd ôc specêl",
+'tog-watchlisthidebots' => "Lōga al mudéfichi di bot int i tgnû 'd ôc specêl",
+'tog-watchlisthideminor' => "Lōga al mudéfichi céchi int i tgnû 'd ôc specêl",
+'tog-watchlisthideliu' => "Lōga al mudéfichi 'd j utèint registrê int i tgnû 'd ôc specêl",
+'tog-watchlisthideanons' => "Lōga al mudéfichi 'd j utèint sèinsa nòm int i tgnû 'd ôc specêl",
+'tog-watchlisthidepatrolled' => "Lōga al mudéfichi verifichêdi int i tgnû 'd ôc specêl",
+'tog-ccmeonemails' => "Mândom 'na côpia di mesâg spidî a chiêter utèint",
+'tog-diffonly' => "An fê mia vèder còl che gh'é dèinter int la pàgina dôp al cunfrûnt tr'al versiòun",
+'tog-showhiddencats' => 'Fà vèder al categoréi lughêdi',
+'tog-norollbackdiff' => 'An fê mia vèder al cunfrûnt tr\' al versiòun dôp avèir fât un "rollback"',
# Dates
'sunday' => 'Dumènica',
'create' => 'Invèinta',
'delete' => 'Scanşéla',
'deletethispage' => 'Scanşéla cla pàgina ché',
-'undelete_short' => "Recóper ed {{PLURAL:$1|'na revişiòun|$1 revişiòun}}",
+'undelete_short' => "Recóper ed {{PLURAL:$1|'na versiòun|$1 versiòun}}",
'viewdeleted_short' => "Guèrda {{PLURAL:$1|'na mudéficha scanşlêda|$1 mudéfichi scanşlêdi}}",
'protect' => 'Prutēz',
'protect_change' => 'Câmbia',
'error' => 'Erōr',
'databaseerror' => "Erōr dal 'database'",
'readonly' => "'Database' bluchê",
-'missing-article' => "Al datebêş an n'à mìa catê al tèst ed 'na pàgina ch' l' aré duvû catêres sòt' al nòm \"\$1\" \$2. Ed sôlit còst a sucēd quând a vîn arciamê, a partîr da la stòria dal mudéfichi o dal cunfrûnt tra revişiòun, un colegamèint a 'na pàgina scanşlêda, a un cunfrûnt tra revişiòun che gh'în mìa o a un cunfrûnt tra revişiòun cun la stòria dal mudéfichi scanşlêda. In chês cuntrâri, a s'é pubabilmèint catê un erōr int al prugrâma ed Media Wiki. A se dmânda al piaşèir ed comunichêr còl ch'é sucès a un [[Special:ListUsers/sysop|amministadōr]] e comunichêregh l'indirés (URL) in quistiòun.",
-'missingarticle-rev' => '(revişiòun n°: $1)',
+'missing-article' => "Al datebêş an n'à mìa catê al tèst ed 'na pàgina ch' l' aré duvû catêres sòt' al nòm \"\$1\" \$2. Ed sôlit còst a sucēd quând a vîn arciamê, a partîr da la stòria dal mudéfichi o dal cunfrûnt tra versiòun, un colegamèint a 'na pàgina scanşlêda, a un cunfrûnt tra versiòun che gh'în mìa o a un cunfrûnt tra versiòun cun la stòria dal mudéfichi scanşlêda. In chês cuntrâri, a s'é pubabilmèint catê un erōr int al prugrâma ed Media Wiki. A se dmânda al piaşèir ed comunichêr còl ch'é sucès a un [[Special:ListUsers/sysop|amministadōr]] e comunichêregh l'indirés (URL) in quistiòun.",
+'missingarticle-rev' => '(nómer ed la versiòun: $1)',
'missingarticle-diff' => '(Diff: $1, $2)',
'internalerror' => 'Erōr intêren',
'internalerror_info' => 'Erōr intêren: $1',
# History pages
'viewpagelogs' => "Guêrda la stòria 'd cla pàgina ché",
-'currentrev' => 'Ûltma revişiòun',
-'currentrev-asof' => 'Ûltma revişiòun dal $1',
-'revisionasof' => 'Revişiòun dal $1',
-'revision-info' => 'Revişiòun ed $1, avtōr: $2',
-'previousrevision' => '← Revişiòun pió vècia',
-'nextrevision' => 'Revişiòun pió nōva →',
-'currentrevisionlink' => 'Ûltma revişiòun',
+'currentrev' => 'Ûltma versiòun',
+'currentrev-asof' => 'Ûltma versiòun dal $1',
+'revisionasof' => 'Versiòun dal $1',
+'revision-info' => 'Versiòun ed $1, avtōr: $2',
+'previousrevision' => '← Versiòun pió vècia',
+'nextrevision' => 'Versiòun pió nōva →',
+'currentrevisionlink' => 'Ûltma versiòun',
'cur' => 'cur',
'next' => 'Còl dôp',
'last' => 'Còl préma',
'page_first' => 'préma',
'page_last' => 'ûltem',
-'histlegend' => "Cunfrûnt tra 'l revişiòun: sernés al caşèli cumpâgni al revişiòun vrûdi e schésa Invio o al ptòun in bâs. Spiegasiòun: : '''({{int:cur}})''' = diferèinsi cun la revişiòun d' adèsa, '''({{int:last}})''' = diferèinsi cun la revişiòun ed préma, '''{{int:minoreditletter}}''' = mudéfica céca.",
+'histlegend' => "Cunfrûnt tra 'l versiòun: sernés al caşèli cumpâgni al versiòun vrûdi e schésa Invio o al ptòun in bâs. Spiegasiòun: : '''({{int:cur}})''' = diferèinsi cun la versiòun d' adèsa, '''({{int:last}})''' = diferèinsi cun la versiòun ed préma, '''{{int:minoreditletter}}''' = mudéfica céca.",
'history-fieldset-title' => "Nâviga int la stòria 'd la pàgina",
'history-show-deleted' => 'Sōl quî scanşlê',
'histfirst' => 'préma',
# Diffs
'history-title' => '$1 stòria dal mudéfichi',
'lineno' => 'Rîga $1:',
-'compareselectedversions' => 'Cunfrûnta al revişiòun sernîdi.',
+'compareselectedversions' => 'Cunfrûnta al versiòun sernîdi.',
'editundo' => 'scanşèla',
'diff-multi' => "({{PLURAL:$2|'Na revişion ed mèz|$1 revişiòun ed mèz}} di {{PLURAL:$2|un utèint|$2 utèint}} mìa {{PLURAL:$1|fâta vèder|fâti vèder}})",
'filehist-current' => '(adès)',
'filehist-datetime' => 'Dâta/Ōra',
'filehist-thumb' => 'Miniadûra',
-'filehist-thumbtext' => 'Miniadûra ed la revişiòun dal $1.',
+'filehist-thumbtext' => 'Miniadûra ed la versiòundal $1.',
'filehist-user' => 'Utèint',
'filehist-dimensions' => 'Amzûri',
'filehist-comment' => 'Cumèint',
'sp-contributions-talk' => 'discusiòun',
'sp-contributions-search' => 'Sērca i lavōr fât',
'sp-contributions-username' => 'Indirés IP o nòm utèint',
-'sp-contributions-toponly' => "Fà vèder sōl i lavōr ch' în al j ûltmi revişiòun per la pàgina.",
+'sp-contributions-toponly' => "Fà vèder sōl i lavōr ch' în al j ûltmi versiòun per la pàgina.",
'sp-contributions-submit' => 'Sērca',
# What links here
'tooltip-ca-edit' => 'Ét pō mudifiche cla pàgina ché. Per piaşèir drōva al ptòun "Guêrda préma" préma \'d salvêr còl che t\'é fât.',
'tooltip-ca-addsection' => "Cumîncia 'na sesiòun nōva.",
'tooltip-ca-viewsource' => "Cla pàgina ché l'é sòta prutesiòun, mó 't pō vèder al só côdis surzéia.",
-'tooltip-ca-history' => 'Revişiòun fâti a cla pàgina ché.',
+'tooltip-ca-history' => 'Versiòun ed préma fâti a cla pàgina ché.',
'tooltip-ca-protect' => 'Prutēz cla pàgina ché',
'tooltip-ca-delete' => 'Scanşéla cla pàgina ché',
'tooltip-ca-move' => 'Spôsta cla pàgina ché (câmbia tétol)',
'tooltip-t-upload' => "Cârga un 'file'",
'tooltip-t-specialpages' => 'Elèinch ed tót al pàgini specêli',
'tooltip-t-print' => 'Per stampêr cla pàgina ché.',
-'tooltip-t-permalink' => "Colegamèint fés a cla revişiòun ché 'd la pàgina.",
+'tooltip-t-permalink' => "Colegamèint fés a cla versiòun ché 'd la pàgina.",
'tooltip-ca-nstab-main' => 'Guêrda la pàgina',
'tooltip-ca-nstab-user' => 'Guêrda la pàgina utèint',
'tooltip-ca-nstab-special' => "Còsta ché l'é 'na pàgina specêlal l'an pōl mìa èser mudifichêda",
'tooltip-save' => 'Sêlva al mudéfichi',
'tooltip-preview' => "Guêrda al mudéfichi préma 'd salvêr (cunsiliê préma 'd salvêr)",
'tooltip-diff' => "Guêrda 'l mudéfichi fâti al tèst",
-'tooltip-compareselectedversions' => "Guêrda al diferèinsi tr' al dō revişiòun sernîdi ed cla pàgina ché.",
+'tooltip-compareselectedversions' => "Guêrda al diferèinsi tr' al dō versiòun sernîdi ed cla pàgina ché.",
'tooltip-watch' => "Zûnta cla pàgina ché a la tó lésta di tgnû 'd ôc specêl.",
'tooltip-rollback' => "\"Rollback\" al scanşèla cun un cléch tót' al mudéfichi fâti a cla pàgina ché da l'ûltem ch' al gh'à més al mân.",
'tooltip-undo' => '"Scanşèla" al permèt de scanşlêr cla mudéfica ché e l\'arvés al mudèl ed mudéfica in môd "Guerda préma". E al permèt ed mèter dèinter \'na spiegasiòun int l\' elemèint ed la mudéfica.',
'version' => 'Versiòun',
'version-specialpages' => 'Pàgina specêla',
'version-other' => 'Êter',
-'version-version' => '(Versiòun $1)',
+'version-version' => '($1)',
'version-license' => 'Licèinsa Media Wiki',
'version-poweredby-others' => 'êter',
* @author Ladsgroup
* @author Leyth
* @author Mardetanha
+ * @author Mcuteangel
* @author Mehdi
* @author Mehran
* @author MehranVB
$messages = array(
# User preference toggles
-'tog-underline' => 'خط کشیدن زیر پیوندها:',
-'tog-justify' => 'بÙ\86دÙ\87ا تÙ\85اÙ\85â\80\8cÚ\86Û\8cÙ\86 Ù\86Ù\85اÛ\8cØ´ Û\8cابÙ\86د',
+'tog-underline' => 'پیوند خط کشی شده در زیر:',
+'tog-justify' => 'تÙ\88جÛ\8cÙ\87 پاراگراÙ\81',
'tog-hideminor' => 'تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند',
'tog-hidepatrolled' => 'ویرایشهای گشتخورده از فهرست تغییرات اخیر پنهان شوند',
'tog-newpageshidepatrolled' => 'صفحههای گشتخورده از فهرست صفحههای تازه پنهان شوند',
برای بررسی بستهشدهها [[Special:BlockList|فهرست بستهشدهها]] را ببینید.',
'ipb-blockingself' => 'شما در حال بستن خودتان هستید! آیا مطمئن هستید که میخواهید چنین کاری انجام دهید؟',
'ipb-confirmhideuser' => 'شما در حال بستن یک کاربر هستید که «پنهانسازی کاربر» برایش فعال شدهاست. این کار نام کاربر را از همهٔ فهرستها و سیاههها مخفی میکند. آیا مطمئن هستید که میخواهید آن را انجام دهید؟',
+'ipb-confirmaction' => 'اگر واقعاً مطمئنید که میخواهید آن را انجام دهید، لطفاً زمینهٔ "{{int:ipb-confirm}}" را در زیر بررسی کنید.',
'ipb-edit-dropdown' => 'ویرایش دلایل قطعدسترسی',
'ipb-unblock-addr' => 'باز کردن $1',
'ipb-unblock' => 'باز کردن نام کاربری یا نشانی آیپی',
'version-parser-function-hooks' => 'قلابهای عملگر تجزیهگر',
'version-hook-name' => 'نام قلاب',
'version-hook-subscribedby' => 'وارد شده توسط',
-'version-version' => '(نسخه $1)',
+'version-version' => '(نسخه $1)',
'version-svn-revision' => '(&رلم;r$2)',
'version-license' => 'اجازهنامهٔ مدیاویکی',
'version-ext-license' => 'مجوزها',
* @author Pxos
* @author Samoasambia
* @author Silvonen
+ * @author Smite
* @author Snidata
* @author Str4nd
* @author Stryn
'version-parser-function-hooks' => 'Jäsentimen laajennusfunktiot',
'version-hook-name' => 'Kytköspisteen nimi',
'version-hook-subscribedby' => 'Kytkökset',
-'version-version' => '(Versio $1)',
+'version-version' => '($1)',
'version-license' => 'MediaWikin lisenssi',
'version-ext-license' => 'Lisenssi',
'version-ext-colheader-name' => 'Laajennusosa',
'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
'limitreport-walltime' => 'Todellinen ajankäyttö',
'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-ppvisitednodes' => 'Esikääntäjän läpikäymien solmujen määrä',
'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
'passwordtooshort' => 'Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.',
'password-name-match' => 'Dü könst dan brükernööm ei üs paaswurd nem.',
'password-login-forbidden' => 'Didiar brükernööm mä detdiar paaswurd as ei tuläät.',
-'mailmypassword' => 'Schüür mi en nei paaswurd.',
+'mailmypassword' => 'Paaswurd turagsaat',
'passwordremindertitle' => 'Nei tidjwiis paaswurd för {{SITENAME}}',
'passwordremindertext' => 'En brüker (woorskiinelk dü, faan IP adres $1) hää am en nei paaswurd för {{SITENAME}} ($4) fraaget.
En nei paaswurd för di brüker "$2" as maaget wurden an het nü "$3".
# Special:PasswordReset
'passwordreset' => 'Paaswurd turagsaat',
'passwordreset-text-one' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
-'passwordreset-text-many' => '{{PLURAL:$1|Fal ian fial ütj, am din paaswurd turag tu saaten.}}',
+'passwordreset-text-many' => '{{PLURAL:$1|Fal ian faan jodiat fialen ütj, am en tidjwiis paaswurd tuschüürd tu fun.}}',
'passwordreset-legend' => 'Paaswurd turagsaat',
'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
'cantcreateaccount-text' => "Det iinrachten faan en brükerkonto faan det IP-adres '''($1)''' as faan [[User:$3|$3]] speret wurden.
Grünj för det sper: ''$2''",
+'cantcreateaccount-range-text' => "Det iinrachten faan brükerkontos uun det IP-adresfial '''$1''', huar uk din IP ('''$4''') uun as, as faan [[User:$3|$3]] speret wurden.
+
+Di grünj faan $3 wiar: ''$2''",
# History pages
'viewpagelogs' => 'Logbuken faan detdiar sidj uunwise',
'mergehistory-reason' => 'Grünj:',
# Merge log
-'mergelog' => 'Feriin-logbök',
+'mergelog' => 'Ferianangs-logbuk',
'pagemerge-logentry' => '[[$1]] efter [[$2]] tuupfeerd (werjuunen bit $3)',
'revertmerge' => 'Det tuupfeeren turagsaat',
'mergelogpagetext' => 'Diar as det logbuk faan a tuupfeerd sidjen.',
'prefs-tokenwatchlist' => 'Token',
'prefs-diffs' => 'Ferskeel',
'prefs-help-prefershttps' => 'Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.',
+'prefs-tabs-navigation-hint' => "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
# User preference: email validation using jQuery
'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
'recentchanges-label-bot' => 'Feranrang faan en bot',
'recentchanges-label-unpatrolled' => 'Detdiar feranrang as noch ei efterluket wurden',
'recentchanges-label-plusminus' => 'Feranert sidjengrate (am soföl bytes)',
+'recentchanges-legend-heading' => "'''Ferklaarang:'''",
'recentchanges-legend-newpage' => "(luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
'recentchanges-legend-plusminus' => "(''±123'')",
'rcnotefrom' => "Diar wurd a feranrangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranrangen).",
'rclistfrom' => 'Bluas feranrangen sant $1 wise.',
'rcshowhideminor' => '$1 letj feranrangen',
'rcshowhidebots' => '$1 bots',
-'rcshowhideliu' => '$1 uunmeldet brükern',
+'rcshowhideliu' => '$1 registriaret brükern',
'rcshowhideanons' => '$1 anonüüm brükern',
'rcshowhidepatr' => '$1 efterluket feranrangen',
'rcshowhidemine' => '$1 min bidracher',
[[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Detdiar datei as en duplikaat faan {{PLURAL:$1|detdiar datei|$1 datein}}:',
'file-deleted-duplicate' => "En duplikaat faan detdiar datei ([[:$1]]) as al ans stregen wurden. Luke iin uun logbuk för't striken, iar dü det noch ans huuchsjüürst.",
+'file-deleted-duplicate-notitle' => 'Detdiar datei as leetst iarst stregen wurden an di nööm as ferbürgen wurden.
+Dü skulst hoker fraage, di ferbürgen nöömer uunluke koon, am tu besnaakin, wat det diarmä üüb ham hää.',
'uploadwarning' => 'Wäärnang',
'uploadwarning-text' => 'Feranre det datei-beskriiwang an ferschük det noch ans nei.',
'savefile' => 'Datei seekre',
'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
'nlinks' => '$1 {{PLURAL:$1|link|links}}',
'nmembers' => '{{PLURAL:$1|1 iindrach|$1 iindracher}}',
+'nmemberschanged' => '$1 → $2 {{PLURAL:$2|lasmoot|lasmooten}}',
'nrevisions' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
'nviews' => '$1 {{PLURAL:$1|klik|kliks}}',
'nimagelinks' => 'Brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}',
'protectedpages' => 'Seekert sidjen',
'protectedpages-indef' => 'Bluas permanent seekert sidjen uunwise',
'protectedpages-cascade' => 'Bluas sidjen mä kaskaaden-seekerhaid',
+'protectedpages-noredirect' => 'Widjerfeerangen fersteeg',
'protectedpagesempty' => 'Uun uugenblak san sok sidjen ei seekert.',
'protectedtitles' => 'Seekert sidjennöömer',
'protectedtitlesempty' => 'Uun uugenblak san sok sidjen ei speret.',
'delete-edit-reasonlist' => "Grünjer för't striken bewerke",
'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
+'deleting-backlinks-warning' => "'''Paase üüb:''' Diar ferwise noch ööder sidjen üüb det sidj, diar dü strik wel.",
# Rollback
'rollback' => 'Feranrangen turagsaat',
Am det aptuheewen, gung tu't [[Special:BlockList|sperlist]].",
'ipb-blockingself' => 'Wel dü würelk di salew spere?',
'ipb-confirmhideuser' => 'Dü beest diarbi, en brüker uun det muude „brüker fersteeg“ tu sperin. Do woort di brükernööm uun aal a logbuken an listen ferbürgen. Wel dü det würelk du?',
+'ipb-confirmaction' => 'Wan dü was an seeker beest, dat dü det würelk du wel, do trak oner üüb det fial „{{int:ipb-confirm}}“.',
'ipb-edit-dropdown' => "Grünjer för't sperin bewerke",
'ipb-unblock-addr' => '„$1“ ei muar spere',
'ipb-unblock' => 'IP-adres/brüker ei muar spere',
'imgmultigo' => 'Widjer',
'imgmultigoto' => 'Gung tu sidj $1',
+# Language selector for translatable SVGs
+'img-lang-default' => '(standard spriak)',
+'img-lang-info' => 'Detdiar bil uun $1 amwerke. $2',
+'img-lang-go' => 'Widjer',
+
# Table pager
'ascending_abbrev' => 'ap',
'descending_abbrev' => 'deel',
'version-hook-name' => 'Hook nööm',
'version-hook-subscribedby' => 'Aprepen faan',
'version-version' => '(Werjuun $1)',
-'version-license' => 'Lisens',
+'version-license' => 'MediaWiki-lisens',
+'version-ext-license' => 'Lisens',
+'version-ext-colheader-name' => 'Ütjwidjang',
+'version-ext-colheader-version' => 'Werjuun',
+'version-ext-colheader-license' => 'Lisens',
+'version-ext-colheader-description' => 'Beskriiwang',
+'version-ext-colheader-credits' => 'Skriiwern',
+'version-license-title' => 'Lisens för $1',
+'version-license-not-found' => 'För detdiar ütjwidjang as nian lisens fünjen wurden.',
+'version-credits-title' => 'Soonk för $1',
+'version-credits-not-found' => 'För detdiar ütjwidjang as nään soonk fünjen wurden.',
'version-poweredby-credits' => "Detheer wääbsteed werket mä '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'öödern',
'version-poweredby-translators' => 'Auersaatern faan translatewiki.net',
'version-entrypoints-header-url' => 'URL',
# Special:Redirect
-'redirect' => 'Widjerfeerang üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect' => 'Widjerfeerang faan en brüker, en sidj, en sidjenwerjuun of en datei.',
'redirect-legend' => 'Widjerfeerang üüb en sidjenwerjuun of datei.',
-'redirect-summary' => 'Detdiar spezial-sidj feert widjer üüb en brükersidj, sidjenwerjuun of datei.
-An det woort so brükt: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Detdiar spezial-sidj feert widjer üüb en brükersidj, sidj, sidjenwerjuun of datei.
+An det woort so brükt: [[{{#Special:Redirect}}/user/101]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] of [[{{#Special:Redirect}}/file/Example.jpg]].',
'redirect-submit' => 'Widjer',
'redirect-lookup' => 'Schük:',
'redirect-value' => 'Käänang of dateinööm:',
'redirect-user' => 'Brüker-ID',
+'redirect-page' => 'Sidjenkäännumer (ID)',
'redirect-revision' => 'Sidjenwerjuun',
'redirect-file' => 'Dateinööm',
'redirect-not-exists' => 'Wäärs ei fünjen',
'api-error-overwrite' => 'Dü könst nian datei auerskriiw, wat al diar as.',
'api-error-stashfailed' => 'Intern feeler: Di server küd nian tidjwiis datei seekre.',
'api-error-publishfailed' => 'Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.',
+'api-error-stasherror' => "Bi't huuchschüüren faan detdiar datei as wat skiaf gingen.",
'api-error-timeout' => 'Di server hää ei rochttidjag swaaret (time-out).',
'api-error-unclassified' => 'Diar as irgentwat skiaf gingen.',
'api-error-unknown-code' => 'Ünbekäänd feeler: „$1“',
'expand_templates_input' => 'Skriiwfial:',
'expand_templates_output' => 'Resultaat',
'expand_templates_xml_output' => 'XML-resultaat',
+'expand_templates_html_output' => 'Rä HTML-ütjgoow',
'expand_templates_ok' => 'OK',
'expand_templates_remove_comments' => 'Komentaaren wechnem',
'expand_templates_remove_nowiki' => "<nowiki>-tags uun't resultaat ei uunwise",
'expand_templates_generate_xml' => 'XML-parser-buum uunwise',
+'expand_templates_generate_rawhtml' => 'Rä HTML uunwise',
'expand_templates_preview' => 'Föörskau',
);
'fileexists-shared-forbidden' => "Un file con questo nome esiste già nell'archivio di risorse multimediali condivise. Se si desidera ancora caricare il file, tornare indietro e modificare il nome con il quale caricare il file. [[File:$1|thumb|center|$1]]",
'file-exists-duplicate' => 'Questo file è un duplicato {{PLURAL:$1|del seguente|dei seguenti}} file:',
'file-deleted-duplicate' => 'Un file identico a questo ([[:$1]]) è stato cancellato in passato. Verificare la cronologia delle cancellazioni prima di caricarlo di nuovo.',
+'file-deleted-duplicate-notitle' => 'Un file identico a questo è stato cancellato in passato, ed il titolo è stato soppresso. Chiedi a qualcuno che ha la possibilità di vedere i file soppressi di esaminare la situazione prima di procedere nuovamente al caricamento.',
'uploadwarning' => 'Avviso di caricamento',
'uploadwarning-text' => 'Per favore modifica qui sotto la descrizione del file e prova di nuovo.',
'savefile' => 'Salva file',
'ipb-confirmhideuser' => 'Si sta per bloccare un utente con l\'opzione "Nascondi utente" abilitata.
In questo modo si evita che il nome utente compaia in tutte le liste e le voci di registro.
Sei sicuro di voler continuare?',
+'ipb-confirmaction' => 'Se sei sicuro di volerlo fare davvero, controlla il campo "{{int:ipb-confirm}}" in basso.',
'ipb-edit-dropdown' => 'Modifica i motivi per il blocco',
'ipb-unblock-addr' => 'Sblocca $1',
'ipb-unblock' => 'Sblocca un utente o un indirizzo IP',
'version-parser-function-hooks' => 'Hook per funzioni del parser',
'version-hook-name' => "Nome dell'hook",
'version-hook-subscribedby' => 'Sottoscrizioni',
-'version-version' => '(Versione $1)',
-'version-license' => 'Licenza',
+'version-version' => '($1)',
+'version-license' => 'Licenza MediaWiki',
+'version-ext-license' => 'Licenza',
+'version-ext-colheader-name' => 'Estensione',
+'version-ext-colheader-version' => 'Versione',
+'version-ext-colheader-license' => 'Licenza',
+'version-ext-colheader-description' => 'Descrizione',
+'version-ext-colheader-credits' => 'Autori',
+'version-license-title' => 'Licenza per $1',
+'version-license-not-found' => 'Per questa estensione non è stata trovata alcuna informazione dettagliata sulla licenza.',
+'version-credits-title' => 'Crediti per $1',
+'version-credits-not-found' => 'Per questa estensione non è stata trovata alcuna informazione dettagliata sui crediti.',
'version-poweredby-credits' => "Questo wiki è realizzato con '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
'version-poweredby-translators' => 'traduttori di translatewiki.net',
'difference-title' => '「$1」の版間の差分',
'difference-title-multipage' => 'ページ「$1」と「$2」の間の差分',
'difference-multipage' => '(ページ間の差分)',
-'lineno' => '$1行:',
+'lineno' => '行$1:',
'compareselectedversions' => '選択した版同士を比較',
'showhideselectedversions' => '選択した版を表示/非表示',
'editundo' => '取り消し',
'file-deleted-duplicate' => 'このファイル ([[:$1]]) と同一のファイルが以前に削除されています。
再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
'file-deleted-duplicate-notitle' => 'このファイルと同一のファイルが、以前に削除されページ名が秘匿されました。
-You should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.',
+再度アップロードをする前に、秘匿されたファイルのデータを閲覧する権限を持った利用者に連絡して、状況を精査してもらってください。',
'uploadwarning' => 'アップロード警告',
'uploadwarning-text' => '下記のファイル解説を修正して再試行してください。',
'savefile' => 'ファイルを保存',
'version-parser-function-hooks' => 'パーサー関数フック',
'version-hook-name' => 'フック名',
'version-hook-subscribedby' => '使用個所',
-'version-version' => '($1)',
+'version-version' => '(バージョン $1)',
'version-license' => 'MediaWiki のライセンス',
'version-ext-license' => 'ライセンス',
'version-ext-colheader-name' => '拡張機能',
*
* @author AlefZet
* @author Alibek Kisybay
+ * @author Amangeldy
* @author Arystanbek
* @author Bakytgul Salykhova
* @author Daniyar
'version-hook-subscribedby' => 'Тұзақ тартқыштары',
'version-version' => '(Нұсқасы: $1)',
'version-license' => 'Лицензиясы',
+'version-ext-license' => 'Лицензия',
+'version-ext-colheader-credits' => 'Автор(лары)',
'version-poweredby-others' => 'басқалар',
'version-software' => 'Орнатылған бағдарламалық жасақтама',
'version-software-product' => 'Өнім',
'passwordtooshort' => 'ពាក្យសម្ងាត់ត្រូវមានយ៉ាងតិចណាស់ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។',
'password-name-match' => 'ពាក្យសម្ងាត់ត្រូវតែខុសគ្នាពីអត្តនាមរបស់អ្នក។',
'password-login-forbidden' => 'ហាមប្រាមមិនអោយប្រើអត្តនាមនិងពាក្យសម្ងាត់នេះ។',
-'mailmypassword' => 'á\9e\95á\9f\92á\9e\89á\9e¾á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸',
+'mailmypassword' => 'á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89',
'passwordremindertitle' => 'ពាក្យសម្ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}',
'passwordremindertext' => 'មានអ្នកណាម្នាក់ (ប្រហែលជាអ្នក, ពីអាសយដ្ឋាន IP $1) បានស្នើសុំពាក្យសម្ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។
ពាក្យសម្ងាត់បណ្ដោះអាសន្នមួយសម្រាប់អ្នកប្រើប្រាស់ "$2" ត្រូវបានប្ដូរទៅជា "$3"។ បើសិនជានេះជាចេតនារបស់អ្នក សូមអ្នកកត់ឈ្មោះចូលហើយជ្រើសប្រើពាក្យសម្ងាត់ថ្មី។
'rclistfrom' => 'បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $1',
'rcshowhideminor' => '$1កំណែប្រែតិចតួច',
'rcshowhidebots' => '$1រូបយន្ត',
-'rcshowhideliu' => '$1á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9b',
+'rcshowhideliu' => '$1á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9aá\9e½á\9e\85',
'rcshowhideanons' => '$1អ្នកប្រើប្រាស់អនាមិក',
'rcshowhidepatr' => '$1កំណែប្រែដែលបានល្បាត',
'rcshowhidemine' => '$1កំណែប្រែរបស់ខ្ញុំ',
* @author ITurtle
* @author Idh0854
* @author Jmkim dot com
+ * @author Jskang
* @author Kaganer
* @author Klutzy
* @author Kwj2772
'gender-unknown' => '밝히고 싶지 않습니다.',
'gender-male' => '위키 문서를 편집하는 남자입니다',
'gender-female' => '위키 문서를 편집하는 여자입니다',
-'prefs-help-gender' => '이 사용자 환경 설정은 선택 사항입니다. 소프트웨어에서 이 설정을 사용해 사용자를 가리키고 다른 사용자에게 자신을 언급하는데 적절한 문법적 성별을 사용합니다. 이 정보는 공개됩니다.',
+'prefs-help-gender' => '이 항목은 선택 사항입니다.
+적절한 문법적 성별을 사용하여 당신을 지칭하거나 다른 사람들에게 당신을 언급하는 경우에 이 항목의 값이 사용됩니다.
+이것은 공개 항목입니다.',
'email' => '이메일',
'prefs-help-realname' => '실명은 선택 사항입니다.
실명을 입력하면 문서 기여에 자신의 이름이 들어가게 됩니다.',
[[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => '현재 올리고 있는 {{PLURAL:$1|파일}}이 아래 파일과 중복됩니다:',
'file-deleted-duplicate' => '이 파일과 같은 파일 ([[:$1]])이 이전에 삭제된 적이 있습니다. 파일을 다시 올리기 전에 문서의 삭제 기록을 확인해 주시기 바랍니다.',
+'file-deleted-duplicate-notitle' => '이 파일과 같은 파일이 삭제된 이력이 있습니다. 업로드하기에 앞서, 삭제된 파일의 이력을 확인할 수 있는 권한을 가진 담당자에게 먼저 문의하기 바랍니다.',
'uploadwarning' => '올리기 경고',
'uploadwarning-text' => '아래의 파일 설명을 수정하고 다시 시도해 주세요.',
'savefile' => '파일 저장',
'protectedpages' => '보호된 문서 목록',
'protectedpages-indef' => '오른쪽 조건에 맞는 보호만 보기',
'protectedpages-cascade' => '연쇄적 보호만 보기',
+'protectedpages-noredirect' => '넘겨주기 숨김',
'protectedpagesempty' => '보호되어 있는 문서가 없습니다.',
'protectedtitles' => '만들기 보호된 표제어 목록',
'protectedtitlesempty' => '해당 조건에 맞는 만들기 금지 표제어가 없습니다.',
'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
주의해 주세요.',
+'deleting-backlinks-warning' => "'''경고:''' 삭제하려는 문서로의 링크를 가진 다른 문서가 있습니다.",
# Rollback
'rollback' => '편집 되돌리기',
'version-hook-subscribedby' => '훅이 사용된 위치',
'version-version' => '(버전 $1)',
'version-license' => '미디어위키 라이선스',
+'version-ext-license' => '라이선스',
+'version-ext-colheader-name' => '확장기능',
+'version-ext-colheader-version' => '버전',
+'version-ext-colheader-license' => '라이선스',
+'version-ext-colheader-description' => '설명',
+'version-ext-colheader-credits' => '저자',
+'version-license-not-found' => '이 확장기능에 대한 라이선스 세부 정보가 없습니다.',
+'version-credits-not-found' => '이 확장기능에 대한 크레딧 세부 정보가 없습니다.',
'version-poweredby-credits' => "이 위키는 '''[https://www.mediawiki.org/ MediaWiki]'''(미디어위키)를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
'version-poweredby-others' => '그 외 다른 개발자',
'version-poweredby-translators' => 'translatewiki.net 번역자',
'version-parser-function-hooks' => 'Extensiones functionum programmatis analysis lexicalis',
'version-hook-name' => 'Nomen extensionis',
'version-hook-subscribedby' => 'Subscriptum ab',
-'version-version' => '(Versio $1)',
+'version-version' => '($1)',
'version-license' => 'Permissio',
'version-software-product' => 'Productum',
'version-software-version' => 'Versio',
'badaccess' => 'Yerro de permissión',
+'versionrequired' => 'Se nesesite la versyon $1 de MediaWiki',
+'versionrequiredtext' => 'Se nesesita versyon $1 de MediaWiki para uzar este pajina. Ver [[Special:Version|La pajina de versyon]].',
+
'ok' => 'DE ACORDDO',
'retrievedfrom' => 'Acòjido del adhresso "$1"',
'youhavenewmessages' => '{{PLURAL:$3|Tienes}} $1 ($2).',
+'youhavenewmessagesfromusers' => 'Tiene $1 de {{PLURAL:$3|otro usuario|$3 usuarios}}($2).',
+'youhavenewmessagesmanyusers' => 'Tiene $1 de munchos usuarios ($2).',
'newmessageslinkplural' => '{{PLURAL:$1|un muevo mesaje|999=mesajes muevos}}',
'newmessagesdifflinkplural' => '{{PLURAL:$1|ulitmo kambio|999=ultimos kambios}}',
'youhavenewmessagesmulti' => 'Tienes messajes nuevos en $1',
'page-rss-feed' => '"$1" Fuente RSS',
'page-atom-feed' => '"$1" Subscripción Atom',
'red-link-title' => '$1 (la hoja no egziste)',
+'sort-descending' => 'Atakanar en orden desendente',
+'sort-ascending' => 'Atakanar en orden asendente',
# Short words for each namespace, by default used in the namespace tab in monobook
'nstab-main' => 'Pajina',
'nstab-category' => 'Kategoriya',
# Main script and global functions
+'nosuchaction' => 'No egziste esa aksyon',
'nosuchspecialpage' => 'No ay tala hoja especial',
# General errors
'badtitletext' => 'El título de la hoja demandada está vazío, no es valible, o es un link interlingua o interwiki incorrecto.
Puede ser que contiene uno o más caracteres que no se pueden usar en los títulos.',
'viewsource' => 'Ver su manadero',
+'viewsource-title' => 'Ver la fuente de $1',
+'actionthrottled' => 'Aksyon limitada',
+
+# Virus scanner
+'virus-unknownscanner' => 'antivirus deskonosido:',
# Login and logout pages
'welcomeuser' => 'Bienvinidos, $1',
'userlogin-yourpassword-ph' => 'Eskriva tu kontrasenya',
'createacct-yourpassword-ph' => 'Eskriva una kontrasenya',
'yourpasswordagain' => 'Entra de muevo la parola',
+'createacct-yourpasswordagain' => 'Konfirme contrasenya',
'createacct-yourpasswordagain-ph' => 'Eskrive la kontrasenya de muevo',
'remembermypassword' => 'Acórdate de mi entrada de usador en este bilgisayar/orddênador (por un maksimum de {{PLURAL:$1|día|días}})',
+'yourdomainname' => 'Tu dominyo:',
+'password-change-forbidden' => 'No se puede kambiar contrasenyas en este viki.',
'login' => 'Entrar',
'nav-login-createaccount' => 'Entrar / Criar un cuento',
'loginprompt' => 'Kale tener "cookies" aktivadas enel navegador para enrejistrarse en {{SITENAME}}',
'createacct-another-submit' => 'Krear otro kuento',
'createacct-benefit-heading' => '{{SITENAME}} es izo por djente komo tu.',
'createacct-benefit-body2' => '{{PLURAL:$1|pajina|pajinas}}',
-'userexists' => 'El nombre que entrates ya se usa.
-Si puede ser, escoge un otro nombre.',
+'userexists' => 'El nombre de usuario que eskrivites ya se uza.
+Eskoje un nombre diferente.',
'createaccounterror' => 'No se pudo crear el cuento: $1',
+'password-name-match' => 'Tu contrasenya kale ser diferente de tu usuario.',
'mailmypassword' => 'Restableser kontrasenya',
'mailerror' => 'Falta al embiar korreo: $1',
'emailconfirmlink' => 'Confirma su adderesso de letra electrónica',
# Change password dialog
'changepassword' => 'Trocar el kóddiche',
+'resetpass_header' => 'Kambiar kontrasenya del kuento',
'oldpassword' => 'Kóddiche viejo:',
'newpassword' => 'Kóddiche muevo:',
+'retypenew' => 'Eskrive de muevo la kontrasenya mueva',
+'resetpass_forbidden' => 'No se puede kambiar las kontrasenyas',
+'resetpass-submit-loggedin' => 'Kambiar kontrasenya',
'resetpass-submit-cancel' => 'Anular',
# Special:PasswordReset
+'passwordreset' => 'Restableser kontrasenya',
+'passwordreset-legend' => 'Restableser kontrasenya',
'passwordreset-username' => 'Nombre de usador:',
'passwordreset-domain' => 'Dominio:',
'passwordreset-email' => 'Adresso de letral:',
Puedes [[Special:Search/{{PAGENAME}}|bushkar este titolo de oja]] en otras pajinas,
o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bushkar en los rejistros relasyonados]</span>.',
'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
+'updated' => '(Aktualizado)',
'note' => "'''Nota:'''",
'previewnote' => "¡Akórdate ke esto es sólo una previsualizasion i aínda no se enrejistró!'''
Los tus trokamientos no se tienen guadrados!",
# Content models
'content-model-wikitext' => 'vikiteksto',
+'content-model-javascript' => 'JavaScript',
'content-model-css' => 'CSS',
# Parser/template warnings
'history-feed-item-nocomment' => '$1 en $2',
# Revision deletion
+'rev-deleted-user' => '(se kito el nombre de usuario)',
'rev-delundel' => 'mostra/esconde',
'rev-showdeleted' => 'mostra',
'revdelete-show-file-submit' => 'Si',
'sharedupload' => 'Este arxivo es de $1 i puede ser usado por otros proyectos.',
'sharedupload-desc-here' => 'Esta hoja es de $1 y puede ser usado por otros projetos.
La descripción en su [$2 hoja de descripción del arxivo] está amostrada debaxo.',
+'filepage-nofile' => 'No egziste dingun archivo de este nombre.',
'uploadnewversion-linktext' => 'Subir una nueva versión de este arxivo',
'shared-repo-from' => 'de $1',
'listgrouprights' => 'Derechos del grupo de usuario',
'listgrouprights-group' => 'Grupo',
'listgrouprights-rights' => 'Derechos',
-'listgrouprights-helppage' => 'Ayudo:Derechos de grupo',
+'listgrouprights-helppage' => 'Help:Derechos de grupo',
'listgrouprights-members' => '(ver los miembros de este grupo)',
'listgrouprights-addgroup' => 'Anyadir {{PLURAL:$2|grupo|grupos}}: $1',
'listgrouprights-removegroup' => 'Kitar {{PLURAL:$2|grupo|grupos}}: $1',
+'listgrouprights-addgroup-all' => 'Anyadir todos los grupos',
+'listgrouprights-removegroup-all' => 'Kitar todos los grupos',
# Email user
'emailuser' => 'Embia korreo elektroniko a este usuario',
'emailsubject' => 'Sujeto:',
'emailmessage' => 'Mesaje:',
'emailsend' => 'Embiar',
+'emailsent' => 'Korreo elektroniko embiado',
# Watchlist
'watchlist' => 'Lista de akavidamiento',
Kuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
'ipb-blockingself' => 'Dir sidd am gaang Iech selwer ze spären! Sidd Dir sécher datt Dir dat maache wëllt?',
'ipb-confirmhideuser' => 'Dir sidd am Gaang e Benotzer ze späre mat der Funktioun "Benotzer verstoppen" ageschalt. Dëst hëlt den Numm vum Benotzer aus alle Lëschten a Logbicher eraus. Sidd Dir sécher datt Dir dat maache wëllt?',
+'ipb-confirmaction' => 'Wann Dir sécher sidd datt Dir dat wierklech maache wëllt da markéiert w.e.g. d\'"{{int:ipb-confirm}}" hei drënner.',
'ipb-edit-dropdown' => 'Spärgrënn änneren',
'ipb-unblock-addr' => 'Spär vum $1 ophiewen',
'ipb-unblock' => 'Spär vun enger IP-Adress oder engem Benotzer ophiewen',
'cantcreateaccount-text' => "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].
Grunnen som ble oppgitt av $3 er ''$2''",
+'cantcreateaccount-range-text' => "Opprettelsen av en brukerkonto fra IP-adresser i intervallet '''$1''', som inneholder din IP-adresse ('''$4'''), er blitt blokkert av [[User:$3|$3]].
+
+Årsaken angitt av $3 er ''$2''",
# History pages
'viewpagelogs' => 'Vis logger for denne siden',
'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
'recentchanges-label-plusminus' => 'Sidestørrelsen kan endres med dette antallet bytes',
+'recentchanges-legend-heading' => "'''Tegnforklaring:'''",
'recentchanges-legend-newpage' => '(se også [[Special:NewPages|liste av nye sider]])',
'rcnotefrom' => "Nedenfor er endringene siden '''$2''' (opp til '''$1''' vises).",
'rclistfrom' => 'Vis nye endringer med start fra $1',
Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
'file-exists-duplicate' => 'Denne filen er en dublett av følgende {{PLURAL:$1|fil|filer}}:',
'file-deleted-duplicate' => 'En fil identisk med denne filen ([[:$1]]) har tidligere blitt slettet. Du bør sjekke denne filens slettehistorikk før du prøver å laste den opp på nytt.',
+'file-deleted-duplicate-notitle' => 'En annen fil identisk med denne filen har tidligere blitt slettet og tittelen har blitt fjernet. Du bør sjekke med noen som kan se på fjernede fildata å vurdere saken før filen lastes opp igjen.',
'uploadwarning' => 'Opplastingsadvarsel',
'uploadwarning-text' => 'Vennligst endre filbeskrivelsen nedenfor og prøv igjen.',
'savefile' => 'Lagre fil',
'protectedpages' => 'Låste sider',
'protectedpages-indef' => 'Kun beskyttelser på ubestemt tid',
'protectedpages-cascade' => 'Kun dypbeskyttelse',
+'protectedpages-noredirect' => 'Skjul omdirigeringer',
'protectedpagesempty' => 'Ingen sider er for øyeblikket låst med disse paramterne.',
'protectedtitles' => 'Beskyttede titler',
'protectedtitlesempty' => 'Ingen titler beskyttes med disse parameterne for øyeblikket.',
'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1 revisjon|$1 revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1 revisjon|$1 revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
+'deleting-backlinks-warning' => "'''Advarsel:''' Andre sider har lenker til den siden du skal til å slette.",
# Rollback
'rollback' => 'Fjern redigeringer',
Se [[Special:BlockList|blokkeringslisten]] for alle blokkeringer.',
'ipb-blockingself' => 'Du er i ferd med å blokkere deg selv! Er du sikker på at du vil gjøre det?',
'ipb-confirmhideuser' => 'Du er i ferd med å blokkere en bruker med «skjul bruker» aktivert. Dette vil skjule brukerens navn i alle lister og loggoppføringer. Er du sikker på at du vil gjøre dette?',
+'ipb-confirmaction' => 'Marker feltet "{{int:ipb-confirm}}" nederst om du er sikker på at du virkelig vil gjøre det.',
'ipb-edit-dropdown' => 'Rediger blokkeringsgrunner',
'ipb-unblock-addr' => 'Avblokker $1',
'ipb-unblock' => 'Avblokker et brukernavn eller en IP-adresse',
# Language selector for translatable SVGs
'img-lang-default' => '(standardspråk)',
-'img-lang-info' => 'Fremstill dette bildet i $1 $2.',
+'img-lang-info' => 'Vis dette bildet i $1.$2',
'img-lang-go' => 'Start',
# Table pager
'version-ext-colheader-license' => 'Lisens',
'version-ext-colheader-description' => 'Beskrivelse',
'version-ext-colheader-credits' => 'Forfattere',
+'version-license-title' => 'Lisens for $1',
+'version-license-not-found' => 'Ingen detaljert lisensinformasjon ble funnet for denne utvidelsen.',
+'version-credits-title' => 'Anerkjennelser for $1',
+'version-credits-not-found' => 'Ingen detaljert anerkjennelsesinformasjon ble funnet for denne utvidelsen.',
'version-poweredby-credits' => "Denne wikien er drevet av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
'version-poweredby-translators' => 'translatewiki.net-oversettere',
'expand_templates_input' => 'Skriv inn tekst:',
'expand_templates_output' => 'Resultat',
'expand_templates_xml_output' => 'XML-resultat',
+'expand_templates_html_output' => 'Rå HTML-utskrift',
'expand_templates_ok' => 'OK',
'expand_templates_remove_comments' => 'Fjern kommentarer',
'expand_templates_remove_nowiki' => 'Ikke vis <nowiki>-merkelapper i resultatet',
Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocagi.",
'ipb-blockingself' => "A l'é an camin ch'as blòca chiel-midem! É-lo sigur ëd vorèj fé lòn?",
'ipb-confirmhideuser' => "A l'é an camin ch'a blòca n'utent con «stërmé l'utent» abilità. Sòn a gaverà lë stranòm ëd l'utent da tute le liste e le vos ëd registr. É-lo sigur ëd vorèj fé lòn?",
+'ipb-confirmaction' => "S'a l'é sigur ëd vorèj pròpe felo, për piasì ch'a marca ël camp «{{int:ipb-confirm}}» al fond.",
'ipb-edit-dropdown' => 'Modifiché le rason dël blocagi',
'ipb-unblock-addr' => 'Dësbloché $1',
'ipb-unblock' => "Dësbloché n'utent ò n'adrëssa IP",
'version-parser-function-hooks' => 'Gancio për le fonsion dël dëscompositor',
'version-hook-name' => 'Nòm dël gancio',
'version-hook-subscribedby' => 'A son scrivusse',
-'version-version' => '(Version $1)',
+'version-version' => '($1)',
'version-license' => 'Licensa MediaWiki',
'version-ext-license' => 'Licensa',
'version-ext-colheader-name' => 'Estension',
+'version-ext-colheader-version' => 'Version',
'version-ext-colheader-license' => 'Licensa',
'version-ext-colheader-description' => 'Descrission',
'version-ext-colheader-credits' => 'Autor',
'api-error-overwrite' => "Dzorascrive ansima a n'archivi esistent a l'é nen përmëttù.",
'api-error-stashfailed' => "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
'api-error-publishfailed' => "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
+'api-error-stasherror' => "A-i é staje n'eror durant ël cariament dl'archivi da stërmé.",
'api-error-timeout' => "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
'api-error-unclassified' => "A l'é capitaje n'eror nen conossù.",
'api-error-unknown-code' => 'Eror sconossù: «$1».',
'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
'version-hook-name' => 'Shown in [[Special:Version]]',
'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
-'version-version' => 'Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
+'version-version' => '{{Optional}}
+Used in [[Special:Version]]. Preceded by the MediaWiki extension name.
Parameters:
* $1 - version number of the extension',
'pagetitle' => '$1 — {{SITENAME}}',
'retrievedfrom' => 'Источник — «$1»',
'youhavenewmessages' => 'Вы получили $1 ($2).',
-'youhavenewmessagesfromusers' => 'Вы получили $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).',
+'youhavenewmessagesfromusers' => '{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).',
'youhavenewmessagesmanyusers' => 'Вы получили $1 от множества пользователей ($2).',
'newmessageslinkplural' => '{{PLURAL:$1|новое сообщение|999=новые сообщения}}',
'newmessagesdifflinkplural' => '{{PLURAL:$1|последнее изменение|999=последние изменения}}',
'diff-empty' => '(нет различий)',
'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные|1=не показана промежуточная версия, сделанная}} {{PLURAL:$2|$2 участником|$2 участниками|1=одним участником}})',
'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})',
-'difference-missing-revision' => '{{PLURAL:$2|$2 версия|$2 версий|$2 версии}} для этого сравнения ($1) {{PLURAL:$2|1=не обнаружена|не обнаружены}}.
+'difference-missing-revision' => 'Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).
-ÐÑ\82о обÑ\8bÑ\87но бÑ\8bваеÑ\82, еÑ\81ли пеÑ\80ейÑ\82и по устаревшей ссылке сравнения версий для страницы, которая была удалена.
+Такое обÑ\8bÑ\87но Ñ\81лÑ\83Ñ\87аеÑ\82Ñ\81Ñ\8f пÑ\80и пеÑ\80еÑ\85оде по устаревшей ссылке сравнения версий для страницы, которая была удалена.
Подробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].',
# Search results
'textmatches' => 'Совпадения в текстах страниц',
'notextmatches' => 'Нет совпадений в текстах страниц',
'prevn' => '{{PLURAL:$1|1=предыдущая|предыдущие}} $1',
-'nextn' => '{{PLURAL:$1|следующая|следующие|следующие}} $1',
+'nextn' => '{{PLURAL:$1|1=следующая|следующие}} $1',
'prevn-title' => '{{PLURAL:$1|Предыдущая $1 запись|Предыдущие $1 записей|Предыдущие $1 записи}}',
'nextn-title' => '{{PLURAL:$1|Следующая $1 запись|Следующие $1 записей|Следующие $1 записи}}',
'shown-title' => 'Показывать $1 {{PLURAL:$1|запись|записи|записей}} на странице',
'searchprofile-everything-tooltip' => 'Поиск на всех страницах (включая страницы обсуждений)',
'searchprofile-advanced-tooltip' => 'Искать в заданных пространствах имён',
'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слов|$2 слова}})',
-'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}}).',
+'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}})',
'search-result-score' => 'Релевантность: $1%.',
'search-redirect' => '(перенаправление с $1)',
'search-section' => '(раздел «$1»)',
'searcheverything-enable' => 'Поиск по всем пространствам имён',
'searchrelated' => 'связанный',
'searchall' => 'все',
-'showingresults' => "Ниже показаны до '''$1''' {{PLURAL:$1|1=результата|результатов}}, начиная с № '''$2'''.",
+'showingresults' => "Ниже {{PLURAL:$1|1=показан результат|показаны результаты}} с № '''$2''' и вплоть до № '''$1'''.",
'showingresultsnum' => "Ниже {{PLURAL:$3|1=показан|показаны}} '''$3''' {{PLURAL:$3|результат|результатов|результата}}, начиная с № '''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|1=Результат '''$1''' из '''$3'''|Результаты '''$1—$2''' из '''$3'''}} для «'''$4'''»",
'search-nonefound' => 'Соответствий запросу не найдено.',
'prefs-rc' => 'Свежие правки',
'prefs-watchlist' => 'Список наблюдения',
'prefs-watchlist-days' => 'Количество дней:',
-'prefs-watchlist-days-max' => 'Не более $1 {{PLURAL:$1|1=дня|дней}}',
+'prefs-watchlist-days-max' => 'Не более $1 {{PLURAL:$1|дня|дней}}',
'prefs-watchlist-edits' => 'Максимальное количество правок, отображаемых в расширенном списке наблюдения:',
'prefs-watchlist-edits-max' => 'Наибольшее значение: 1000',
'prefs-watchlist-token' => 'Токен списка наблюдения:',
'stub-threshold' => 'Порог для определения оформления <a href="#" class="stub">ссылок на заготовки</a> (в байтах):',
'stub-threshold-disabled' => 'Отключён',
'recentchangesdays' => 'Количество дней, за которые показывать свежие правки:',
-'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней|дней}})',
+'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней}})',
'recentchangescount' => 'Количество правок, отображаемое по умолчанию:',
'prefs-help-recentchangescount' => 'Включает свежие правки, истории страниц, журналы.',
'prefs-help-watchlist-token2' => 'Это секретный ключ для веб-канала вашего списка наблюдений.
'filetype-mime-mismatch' => 'Расширение файла «.$1» не соответствует его MIME-типу ($2).',
'filetype-badmime' => 'Файлы, имеющие MIME-тип «$1», не могут быть загружены.',
'filetype-bad-ie-mime' => 'Невозможно загрузить этот файл, так как Internet Explorer будет определять его как «$1», то есть неразрешённым и потенциально опасным типом файла.',
-'filetype-unwanted-type' => "'''\".\$1\"''' — нежелательный тип файла.
-{{PLURAL:\$3|1=Предпочтительным типом файла является|Предпочтительные типы файлов:}} \$2.",
+'filetype-unwanted-type' => "'''«.$1»''' — нежелательный тип файла.
+{{PLURAL:$3|1=Предпочтительным типом файла является|Предпочтительные типы файлов:}} $2.",
'filetype-banned-type' => "'''«.$1»''' — {{PLURAL:$4|1=запрещённый тип файла|запрещённые типы файлов}}.
{{PLURAL:$3|1=Разрешённым типом файла является|Разрешённые типы файлов:}} $2.",
'filetype-missing' => 'Отсутствует расширение у файла (например, «.jpg»).',
'backend-fail-closetemp' => 'Не удаётся закрыть временный файл.',
'backend-fail-read' => 'Не удалось прочитать файл $1.',
'backend-fail-create' => 'Не удалось записать файл $1.',
-'backend-fail-maxsize' => 'Не удалось записать файл $1, так как его размер превышает {{PLURAL:$2|$2 байт|$2 байт|$2 байта}}.',
+'backend-fail-maxsize' => 'Не удалось записать файл $1, так как его размер превышает $2 {{PLURAL:$2|байт|байт|байта}}.',
'backend-fail-readonly' => 'Хранилище «$1» сейчас находится в режиме «только чтение». Причина: «$2»',
'backend-fail-synced' => 'Файл «$1» находится в несогласованном состоянии во внутреннем хранилище',
'backend-fail-connect' => 'Не удалось подключиться к хранилищу «$1».',
'linksearch-ns' => 'Пространство имён:',
'linksearch-ok' => 'Найти',
'linksearch-text' => 'Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.
-Необходим по крайней мере домен верхнего уровня, например <code>*.org</code><br />
-Поддерживаемые {{PLURAL:$2|1=протокол|протоколы}}: <code>$1</code> (по умолчанию подставляется http://, если протокол явно не задан).',
+Необходимо указать по крайней мере домен верхнего уровня, например <code>*.org</code><br />
+{{PLURAL:$2|1=Поддерживаемый протокол|Поддерживаемые протоколы}}: <code>$1</code> (если протокол явно не задан, по умолчанию подставляется http://).',
'linksearch-line' => 'Ссылка на $1 из $2',
'linksearch-error' => 'Подстановочные символы могут использоваться только в начале адресов.',
# Special:ActiveUsers
'activeusers' => 'Список активных участников',
-'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|правка|правок|правки}} за {{PLURAL:$3|$3 последний день|последние $3 дней|последние $3 дня}}',
+'activeusers-intro' => 'Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня|1=последний день}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|правка|правок|правки}} за {{PLURAL:$3|$3 последний день|последние $3 дней|последние $3 дня|1=последний день}}',
'activeusers-from' => 'Показать участников, начиная с:',
'activeusers-hidebots' => 'Скрыть ботов',
'activeusers-hidesysops' => 'Скрыть администраторов',
'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 (<code>$2</code>)</span>',
'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 (<code>$2</code>)</span>',
'listgrouprights-addgroup' => 'может добавлять в {{PLURAL:$2|1=группу|группы}}: $1',
-'listgrouprights-removegroup' => 'может исключать из {{PLURAL:$2|группы|групп|групп}}: $1',
+'listgrouprights-removegroup' => 'может исключать из {{PLURAL:$2|1=группы|групп}}: $1',
'listgrouprights-addgroup-all' => 'может добавлять во все группы',
'listgrouprights-removegroup-all' => 'может исключать из всех групп',
-'listgrouprights-addgroup-self' => 'можеÑ\82 добавиÑ\82Ñ\8c {{PLURAL:$2|1=гÑ\80Ñ\83ппÑ\83|гÑ\80Ñ\83ппÑ\8b}} к Ñ\81воей Ñ\83Ñ\87Ñ\91Ñ\82ной запиÑ\81и: $1',
-'listgrouprights-removegroup-self' => 'может удалить {{PLURAL:$2|1=группу|группы}} со своей учётной записи: $1',
+'listgrouprights-addgroup-self' => 'можеÑ\82 добавлÑ\8fÑ\82Ñ\8c Ñ\81воÑ\8e Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e запиÑ\81Ñ\8c в {{PLURAL:$2|1=гÑ\80Ñ\83ппÑ\83|гÑ\80Ñ\83ппÑ\8b}}: $1',
+'listgrouprights-removegroup-self' => 'может удалять свою учётную запись из {{PLURAL:$2|1=группы|групп}}: $1',
'listgrouprights-addgroup-self-all' => 'Может добавлять все группы к своей учётной записи',
'listgrouprights-removegroup-self-all' => 'может удалять все группы со своей учётной записи',
'unwatchthispage' => 'Прекратить наблюдение',
'notanarticle' => 'Не статья',
'notvisiblerev' => 'Версия была удалена',
-'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждения.',
+'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждений.',
'wlheader-enotif' => 'Уведомления по эл. почте включены.',
'wlheader-showupdated' => "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
'watchmethod-recent' => 'просмотр последних изменений для наблюдаемых страниц',
'watchmethod-list' => 'просмотр наблюдаемых страниц для последних изменений',
'watchlistcontains' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|страница|страниц|страницы}}.',
'iteminvalidname' => 'Проблема с элементом «$1», недопустимое название…',
-'wlnote' => "Ниже {{PLURAL:$1|показано последнее $1 изменение|показаны последние $1 изменений|показаны последние $1 изменения}} за {{PLURAL:$2|последний|последние|последние}} '''$2''' {{PLURAL:$2|час|часов|часа}}, на момент времени $3 $4.",
+'wlnote' => "Ниже {{PLURAL:$1|показано $1 последнее изменение|показаны $1 последних изменений|показаны $1 последние изменения|1=показано последнее изменение}} за {{PLURAL:$2|'''$2''' последний час|последние '''$2''' часов|последние '''$2''' часа|1=последний час}}, по состоянию на $3 $4.",
'wlshowlast' => 'Показать за последние $1 часов $2 дней $3',
'watchlist-options' => 'Настройки списка наблюдения',
'exblank' => 'страница была пуста',
'delete-confirm' => '$1 — удаление',
'delete-legend' => 'Удаление',
-'historywarning' => "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий|версий}}:",
+'historywarning' => "'''Внимание:''' эта страница имеет историю изменений приблизительно из $1 {{PLURAL:$1|версии|версий}}:",
'confirmdeletetext' => 'Вы запросили полное удаление страницы (или изображения) и всей её истории изменений. Пожалуйста, подтвердите, что вы действительно желаете это сделать, понимаете последствия своих действий, и делаете это в соответствии [[{{MediaWiki:Policy-url}}|с правилами]].',
'actioncomplete' => 'Действие выполнено',
'actionfailed' => 'Действие не выполнено',
** по запросу автора
** неработающее перенаправление',
'delete-edit-reasonlist' => 'Править список причин',
-'delete-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий|версий}}.
-Удаление таких страниц было запрещено во избежание нарушений в работе сайта {{SITENAME}}.',
-'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий|версий}}.
-Её удаление может привести к нарушению нормальной работы базы данных сайта {{SITENAME}};
+'delete-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
+Удаление таких страниц было запрещено во избежание нарушений в работе сайта «{{SITENAME}}».',
+'delete-warning-toobig' => 'У этой страницы очень длинная история изменений, более $1 {{PLURAL:$1|версии|версий}}.
+Её удаление может привести к нарушению нормальной работы базы данных сайта «{{SITENAME}}»;
действуйте с осторожностью.',
'deleting-backlinks-warning' => "'''Предупреждение.''' Некоторые другие страницы ссылаются на данную удаляемую страницу.",
'protect-locked-dblock' => "Уровень защиты не может быть изменён, так как основная база данных временно заблокирована.
Текущие установки для страницы '''$1''':",
'protect-locked-access' => "У вашей учётной записи недостаточно прав для изменения уровня защиты страницы. Текущие установки для страницы '''$1''':",
-'protect-cascadeon' => 'ÐÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а заÑ\89иÑ\89ена в Ñ\81вÑ\8fзи Ñ\81 Ñ\82ем, Ñ\87Ñ\82о она вклÑ\8eÑ\87ена {{PLURAL:$1|1=в Ñ\83казаннÑ\83Ñ\8e ниже Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, на коÑ\82оÑ\80Ñ\83Ñ\8e|в нижеÑ\81ледÑ\83Ñ\8eÑ\89ие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, на коÑ\82оÑ\80Ñ\8bе}} установлена каскадная защита. Вы можете изменить уровень защиты этой страницы, но это не повлияет на каскадную защиту.',
+'protect-cascadeon' => 'ÐÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а заÑ\89иÑ\89ена в Ñ\81вÑ\8fзи Ñ\81 Ñ\82ем, Ñ\87Ñ\82о она вклÑ\8eÑ\87ена {{PLURAL:$1|1=в Ñ\83казаннÑ\83Ñ\8e ниже Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, длÑ\8f коÑ\82оÑ\80ой|в нижеÑ\81ледÑ\83Ñ\8eÑ\89ие Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, длÑ\8f коÑ\82оÑ\80Ñ\8bÑ\85}} установлена каскадная защита. Вы можете изменить уровень защиты этой страницы, но это не повлияет на каскадную защиту.',
'protect-default' => 'Без защиты',
'protect-fallback' => 'Разрешено только участникам с правами «$1»',
'protect-level-autoconfirmed' => 'Разрешено только автоподтверждённым участникам',
'undeletepage' => 'Просмотр и восстановление удалённых страниц',
'undeletepagetitle' => "'''Ниже перечислены удалённые версии страницы [[:$1]]'''.",
'viewdeletedpage' => 'Просмотр удалённых страниц',
-'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страниц были удалены|Следующие $1 страницы были удалены}}, однако {{PLURAL:$1|1=она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.
+'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страниц были удалены|Следующие $1 страницы были удалены|1=Следующая страница была удалена}}, однако {{PLURAL:$1|1=она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.
Архив может периодически очищаться.',
'undelete-fieldset-title' => 'Восстановить версии',
'undeleteextrahelp' => "Для полного восстановления истории страницы оставьте все отметки пустыми и нажмите '''«{{int:undeletebtn}}»'''.
Для частичного восстановления отметьте те версии страницы, которые нужно восстановить, и нажмите '''«{{int:undeletebtn}}»'''.",
-'undeleterevisions' => 'в архиве $1 {{PLURAL:$1|версия|версий|версии}}',
+'undeleterevisions' => '$1 {{PLURAL:$1|версия|версий|версии}} {{PLURAL:$1|помещена|помещены}} в архив',
'undeletehistory' => 'При восстановлении страницы восстанавливается и её история правок.
Если после удаления была создана новая страница с тем же названием, то восстановленные версии появятся в истории правок перед новыми версиями.',
'undeleterevdel' => 'Восстановление не будет произведено, если оно приведёт к частичному удалению последней версии страницы или файла.
'undeleteviewlink' => 'просмотреть',
'undeleteinvert' => 'Обратить выделение',
'undeletecomment' => 'Причина:',
-'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменений|изменения}} восстановлено',
-'undeletedrevisions-files' => '$1 {{PLURAL:$1|версия|версий|версии}} и $2 {{PLURAL:$2|файл|файлов|файла}} восстановлено',
-'undeletedfiles' => '$1 {{PLURAL:$1|файл восстановлен|файлов восстановлено|файла восстановлено}}',
+'undeletedrevisions' => '{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменений|изменения}}',
+'undeletedrevisions-files' => 'восстановлены $1 {{PLURAL:$1|версия|версий|версии}} и $2 {{PLURAL:$2|файл|файлов|файла}}',
+'undeletedfiles' => '{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файлов|файла}}',
'cannotundelete' => 'Ошибка восстановления:
$1',
'undeletedpage' => "'''Страница «$1» была восстановлена.'''
'movepage-page-exists' => 'Страница $1 уже существует и не может быть автоматически перезаписана.',
'movepage-page-moved' => 'Страница $1 была переименована в $2.',
'movepage-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
-'movepage-max-pages' => '$1 {{PLURAL:$1|страница была переименована|страниц было переименовано|страницы было переименовано}} — это максимум, больше страниц нельзя переименовать автоматически.',
+'movepage-max-pages' => '{{PLURAL:$1|Была переименована|Были переименованы|Было переименовано}} $1 {{PLURAL:$1|страница|страниц|страницы}} — это максимум; большее число страниц автоматически переименовать нельзя.',
'movelogpage' => 'Журнал переименований',
'movelogpagetext' => 'Ниже представлен список переименованных страниц.',
'movesubpage' => '{{PLURAL:$1|1=Подстраница|Подстраницы}}',
'importstart' => 'Импортирование страниц…',
'import-revision-count' => '$1 {{PLURAL:$1|версия|версий|версии}}',
'importnopages' => 'Нет страниц для импортирования.',
-'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записей|Импортировано $1 записи}} журнала.',
+'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записей|Импортированы $1 записи}} журнала.',
'importfailed' => 'Не удалось импортировать: $1',
'importunknownsource' => 'Неизвестный тип импортируемой страницы',
'importcantopen' => 'Невозможно открыть импортируемый файл',
'pageinfo-robot-noindex' => 'Не разрешено',
'pageinfo-views' => 'Количество просмотров',
'pageinfo-watchers' => 'Число наблюдающих',
-'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|1=следящего|следящих}}',
+'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|следящего|следящих}}',
'pageinfo-redirects-name' => 'Количество перенаправлений на эту страницу',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Подстраницы данной страницы',
'pageinfo-authors' => 'Общее число различных авторов',
'pageinfo-recent-edits' => 'Правок за последнее время (в течение $1)',
'pageinfo-recent-authors' => 'Уникальных авторов за последнее время',
-'pageinfo-magic-words' => '{{PLURAL:$1|1=Ð\9cагиÑ\87еÑ\81кое Ñ\81лово|Ð\9cагиÑ\87еÑ\81кие слова}} ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|1=Ð\92олÑ\88ебное Ñ\81лово|Ð\92олÑ\88ебнÑ\8bе слова}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|1=Скрытая категория|Скрытых категорий}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|1=Шаблон|Шаблонов}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|1=Включаемые страницы|Включаемых страниц}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|1=Включаемая страница|Включаемых страниц}} ($1)',
'pageinfo-toolboxlink' => 'Сведения о странице',
'pageinfo-redirectsto' => 'Перенаправление',
'pageinfo-redirectsto-info' => 'сведения',
# Special:NewFiles
'newimages' => 'Галерея новых файлов',
-'imagelisttext' => "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов|файлов}}, отсортированных $2.",
+'imagelisttext' => "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов}}, отсортированных $2.",
'newimages-summary' => 'На этой служебной странице показаны недавно загруженные файлы.',
'newimages-legend' => 'Фильтр',
'newimages-label' => 'Имя файла (или его часть):',
'livepreview-error' => 'Не удалось установить соединение: $1 «$2». Попробуйте воспользоваться обычным предпросмотром.',
# Friendlier slave lag warnings
-'lag-warn-normal' => 'Изменения, сделанные менее чем $1 {{PLURAL:$1|секунду|секунд|секунды}} назад, могут быть не показаны в этом списке.',
-'lag-warn-high' => 'Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее чем $1 {{PLURAL:$1|секунду|секунд|секунды}} назад, могут быть не показаны в этом списке.',
+'lag-warn-normal' => 'Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.',
+'lag-warn-high' => 'Из-за большого отставания в синхронизации серверов баз данных изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.',
# Watchlist editor
'watchlistedit-numitems' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|запись|записей|записи}}, не считая страниц обсуждений.',
# Special:Redirect
'redirect' => 'Перенаправление с файла, участника, страницы или идентификатора версии',
'redirect-legend' => 'Перенаправление на файл или страницу',
-'redirect-summary' => 'Эта специальная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии) или страницу участника (с числового идентификатора участника).
-Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].',
+'redirect-summary' => 'Эта служебная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии или страницы) или страницу участника (с числового идентификатора участника). Использование: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].',
'redirect-submit' => 'Перейти',
'redirect-lookup' => 'Поиск:',
'redirect-value' => 'Значение:',
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} страницу $3',
'logentry-delete-restore' => '$1 {{GENDER:$2|восстановил|восстановила}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|$5 записей}} журнала на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4',
'logentry-delete-event-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
'logentry-suppress-delete' => '$1 {{GENDER:$2|подавил|подавила}} страницу $3',
-'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|$5 записей}} журнала на $3: $4',
-'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
+'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4',
+'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} для странице $3: $4',
'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
'revdelete-content-hid' => 'содержание скрыто',
'userrights-reason' => 'Разлог:',
'userrights-no-interwiki' => 'Немате овлашћења да мењате корисничка права на другим викијима.',
'userrights-nodatabase' => 'База података $1 не постоји или није локална.',
-'userrights-nologin' => 'Ð\9cоÑ\80аÑ\82е Ñ\81е [[Special:UserLogin|пÑ\80иÑ\98авиÑ\82и]] Ñ\81 админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ким налогом да биÑ\81Ñ\82е додали корисничка права.',
+'userrights-nologin' => 'Ð\9cоÑ\80аÑ\82е Ñ\81е [[Special:UserLogin|пÑ\80иÑ\98авиÑ\82и]] Ñ\81 админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ким налогом да биÑ\81Ñ\82е меÑ\9aали корисничка права.',
'userrights-notallowed' => 'Немате овлашћења да додајете или уклањате корисничка права.',
'userrights-changeable-col' => 'Групе које можете да промените',
'userrights-unchangeable-col' => 'Групе које не можете да промените',
Погледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.',
'protectedarticle' => '{{GENDER:|је заштитио|је заштитила|је заштитио}} „[[$1]]“',
'modifiedarticleprotection' => '{{GENDER:|је променио|је променила|је променио}} степен заштите за „[[$1]]“',
-'unprotectedarticle' => '{{GENDER:|је уклонио|је уклонила}} заштиту са странице „[[$1]]“',
+'unprotectedarticle' => 'уклоњена заштита са странице „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|је преместио|је преместила|је преместио}} поставке заштите са „[[$2]]“ на „[[$1]]“',
'protect-title' => 'Степен заштите за „$1“',
'protect-title-notallowed' => 'Преглед степена заштите за „$1“',
'whatlinkshere-filters' => 'Филтери',
# Block/unblock
-'autoblockid' => 'Самоблокирање #$1',
+'autoblockid' => 'Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ко блокирање #$1',
'block' => 'Блокирај корисника',
'unblock' => 'Деблокирај корисника',
'blockip' => 'Блокирај корисника',
'ipblocklist-submit' => 'Претражи',
'ipblocklist-localblock' => 'Локално блокирање',
'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Друго блокирање|Друга блокирања}}',
-'infiniteblock' => 'никада',
+'infiniteblock' => 'трајно',
'expiringblock' => 'истиче дана $1 у $2',
'anononlyblock' => 'само анонимни',
'noautoblockblock' => 'аутоматско блокирање је онемогућено',
'change-blocklink' => 'промени блокирање',
'contribslink' => 'доприноси',
'emaillink' => 'пошаљи е-поруку',
-'autoblocker' => 'СамоблокиÑ\80ани Ñ\81Ñ\82е Ñ\98еÑ\80 делиÑ\82е Ð\98Ð\9f адÑ\80еÑ\81Ñ\83 Ñ\81 {{GENDER:$1|коÑ\80иÑ\81ником|коÑ\80иÑ\81ниÑ\86ом|коÑ\80иÑ\81ником}} [[User:$1|$1]].
-Разлог блокирања: "\'\'\'$2\'\'\'"',
+'autoblocker' => 'Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки Ñ\81Ñ\82е блокиÑ\80ани Ñ\98еÑ\80 делиÑ\82е Ð\98Ð\9f адÑ\80еÑ\81Ñ\83 Ñ\81 {{GENDER:$1|коÑ\80иÑ\81ником|коÑ\80иÑ\81ниÑ\86ом}} [[User:$1|$1]].
+Разлог блокирања: „$2“',
'blocklogpage' => 'Дневник блокирања',
'blocklog-showlog' => '{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана|Овај корисник је раније блокиран}}.
Историја блокирања се налази испод:',
'userrights-reason' => 'Razlog:',
'userrights-no-interwiki' => 'Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.',
'userrights-nodatabase' => 'Baza podataka $1 ne postoji ili nije lokalna.',
-'userrights-nologin' => 'Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste dodali korisnička prava.',
+'userrights-nologin' => 'Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste menjali korisnička prava.',
'userrights-notallowed' => 'Nemate ovlašćenja da dodajete ili uklanjate korisnička prava.',
'userrights-changeable-col' => 'Grupe koje možete da promenite',
'userrights-unchangeable-col' => 'Grupe koje ne možete da promenite',
'recentchanges-label-minor' => 'Manja izmena',
'recentchanges-label-bot' => 'Ovu izmenu je napravio bot',
'recentchanges-label-unpatrolled' => 'Ova izmena još nije pregledana',
+'recentchanges-label-plusminus' => 'Promena veličine stranice (u bajtovima)',
+'recentchanges-legend-heading' => "'''Legenda:'''",
'recentchanges-legend-newpage' => '([[Special:NewPages|spisak novih stranica]])',
'rcnotefrom' => 'Ispod su izmene od <b>$3; $4</b> (do <b>$1</b> izmena).',
'rclistfrom' => 'Prikaži nove izmene počev od $1',
Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.',
'protectedarticle' => '{{GENDER:|je zaštitio|je zaštitila|je zaštitio}} „[[$1]]“',
'modifiedarticleprotection' => '{{GENDER:|je promenio|je promenila|je promenio}} stepen zaštite za „[[$1]]“',
-'unprotectedarticle' => '{{GENDER:|je uklonio|je uklonila}} zaštitu sa stranice „[[$1]]“',
+'unprotectedarticle' => 'uklonjena zaštita sa stranice „[[$1]]“',
'movedarticleprotection' => '{{GENDER:|je premestio|je premestila|je premestio}} postavke zaštite sa „[[$2]]“ na „[[$1]]“',
'protect-title' => 'Stepen zaštite za „$1“',
'protect-title-notallowed' => 'Pregled stepena zaštite za „$1“',
'whatlinkshere-filters' => 'Filteri',
# Block/unblock
-'autoblockid' => 'Samoblokiranje #$1',
+'autoblockid' => 'Automatsko blokiranje #$1',
'block' => 'Blokiraj korisnika',
'unblock' => 'Deblokiraj korisnika',
'blockip' => 'Blokiraj korisnika',
'ipblocklist-submit' => 'Pretraži',
'ipblocklist-localblock' => 'Lokalno blokiranje',
'ipblocklist-otherblocks' => '{{PLURAL:$1|1=Drugo blokiranje|Druga blokiranja}}',
-'infiniteblock' => 'nikada',
+'infiniteblock' => 'trajno',
'expiringblock' => 'ističe dana $1 u $2',
'anononlyblock' => 'samo anonimni',
'noautoblockblock' => 'automatsko blokiranje je onemogućeno',
'change-blocklink' => 'promeni blokiranje',
'contribslink' => 'doprinosi',
'emaillink' => 'pošalji e-poruku',
-'autoblocker' => 'Samoblokirani ste jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom|korisnikom}} [[User:$1|$1]].
-Razlog blokiranja: "\'\'\'$2\'\'\'"',
+'autoblocker' => 'Automatski ste blokirani jer delite IP adresu s {{GENDER:$1|korisnikom|korisnicom}} [[User:$1|$1]].
+Razlog blokiranja: „$2“',
'blocklogpage' => 'Dnevnik blokiranja',
'blocklog-showlog' => '{{GENDER:$1|Ovaj korisnik je ranije blokiran|Ova korisnica je ranije blokirana|Ovaj korisnik je ranije blokiran}}.
Istorija blokiranja se nalazi ispod:',
'number_of_watching_users_pageview' => '[$1 bevakande {{PLURAL:$1|användare|användare}}]',
'rc_categories' => 'Begränsa till följande kategorier (separera med "|")',
'rc_categories_any' => 'Vilken som helst',
-'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} efter ändring',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte}} efter ändring',
'newsectionsummary' => '/* $1 */ nytt avsnitt',
'rc-enhanced-expand' => 'Visa detaljer',
'rc-enhanced-hide' => 'Göm detaljer',
'protectedpages' => 'Skyddade sidor',
'protectedpages-indef' => 'Endast skydd på obestämd tid',
'protectedpages-cascade' => 'Endast kaskaderande skydd',
+'protectedpages-noredirect' => 'Dölj omdirigeringar',
'protectedpagesempty' => 'Inga sidor är skyddade under de villkoren.',
'protectedtitles' => 'Skyddade titlar',
'protectedtitlesempty' => 'Just nu finns inga skyddade sidtitlar med de parametrarna.',
För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
'ipb-blockingself' => 'Du håller på att blockera dig själv! Är du säker på att du vill göra det?',
'ipb-confirmhideuser' => 'Du är på väg att blockera en användare med "göm användare" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?',
+'ipb-confirmaction' => 'Markera fältet "{{int:ipb-confirm}}" längst ned om du är säker på att du verkligen vill göra det.',
'ipb-edit-dropdown' => 'Redigera blockeringsanledningar',
'ipb-unblock-addr' => 'Ta bort blockering av $1',
'ipb-unblock' => 'Ta bort blockering av en användare eller IP-adress',
'version-hook-name' => 'Namn',
'version-hook-subscribedby' => 'Används av',
'version-version' => '(Version $1)',
-'version-license' => 'Licens',
+'version-license' => 'MediaWiki-licens',
+'version-ext-license' => 'Licens',
+'version-ext-colheader-name' => 'Tillägg',
+'version-ext-colheader-version' => 'Version',
+'version-ext-colheader-license' => 'Licens',
+'version-ext-colheader-description' => 'Beskrivning',
+'version-ext-colheader-credits' => 'Författare',
+'version-license-title' => 'Licens för $1',
+'version-license-not-found' => 'Ingen detaljerad licensinformation hittades för detta tillägg.',
+'version-credits-title' => 'Erkännande för $1',
+'version-credits-not-found' => 'Ingen detaljerad erkännandeinformation hittades för detta tillägg.',
'version-poweredby-credits' => "Den här wikin drivs av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andra',
'version-poweredby-translators' => 'översättare från translatewiki.net',
'youhavenewmessages' => 'உங்களுக்குப் $1 உள்ளன ($2).',
'youhavenewmessagesfromusers' => 'உங்களுக்கு $1 {{PLURAL:$3|வேறொரு பயனரிடம்|$3 பயனர்களிடம்}} இருந்து உள்ளது ($2).',
'youhavenewmessagesmanyusers' => 'உங்களுக்கு பல பயனர்களிடமிருந்து $1 பதிய செய்திகள் உள்ளன ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|புதிய செய்திகள்}}',
+'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|999=புதிய செய்திகள்}}',
'newmessagesdifflinkplural' => 'கடைசி {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
'youhavenewmessagesmulti' => '$1 இல் உங்களுக்கு புதிய செய்திகள் காத்திருக்கின்றன',
'editsection' => 'தொகு',
'passwordtooshort' => 'கடவுச்சொற்களில் குறைந்தது {{PLURAL:$1|1 எழுத்து முதல் |$1 எழுத்துக்களாவது}} இருக்க வேண்டும்.',
'password-name-match' => 'உங்கள் பயனர் பெயரிலிருந்து உங்கள் கடவுச்சொல் முற்றிலும் மாறுபட்டிருக்க வேண்டும்.',
'password-login-forbidden' => 'இந்த பயனர்பெயர் மற்றும் கடவுச்சொல்லை உபயோகிப்பது தடைசெய்யப்பட்டுள்ளது.',
-'mailmypassword' => 'பà¯\81திய à®\95à®\9fவà¯\81à®\9aà¯\8d à®\9aà¯\8aலà¯\8dலà¯\8aனà¯\8dà®±à¯\88 மினà¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\9aà¯\86யà¯\8dயவà¯\81à®®à¯\8d',
+'mailmypassword' => 'à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8dலà¯\88 à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88',
'passwordremindertitle' => '{{SITENAME}} தளத்திலிருந்தான கடவுச்சொல் நினைவூட்டல்',
'passwordremindertext' => 'யாரோ ஒருவர் (நீங்களாக இருக்கலாம், IP முகவரி $1 இலிருந்து)
{{SITENAME}} ($4) தளத்திற்கு புதிய கடவுச்சொல் ஒன்று அனுப்பும்படி கோரியுள்ளார். பயனர் "$2" க்கான தற்காலிக கடவுச்சொல் உருவாக்கப்பட்டுள்ளது. "$3" இதுவே அந்த கடவுச்சொல்லாகும். இந்த நடவடிக்கையே தாங்கள் எண்ணியதாக இருந்தால், தாங்கள் இப்பொழுது புகுபதிகை செய்து கடவுச்சொல்லை மாற்றிக்கொள்ளவும்.
{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.
நீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ
அல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.',
-'passwordreset-emailtext-user' => 'பயனரà¯\8d $1 {{SITENAME}} லிரà¯\81நà¯\8dதà¯\81 நினà¯\88வà¯\81பà®\9fà¯\81தà¯\8dதி à®\92னà¯\8dà®±à¯\88 à®\95à¯\80à®´à¯\8dவரà¯\81à®®à¯\8d à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95ணà®\95à¯\8dà®\95à¯\81 விவரà®\99à¯\8dà®\95ளை {{SITENAME}}
+'passwordreset-emailtext-user' => 'பயனரà¯\8d $1 {{SITENAME}} லிரà¯\81நà¯\8dதà¯\81 à®\95à®\9fவà¯\81à®\9aà¯\8dà®\9aà¯\8aலà¯\8d à®®à¯\80à®\9fà¯\8dà®\9fà®®à¯\88யினை {{SITENAME}}
($4) க்கு கோரியுள்ளார்.பின்வரும் பயனர் {{PLURAL:$3|account is|accounts are}}
இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.
$2
'revdelete-hide-text' => 'திருத்த உரையை மறை',
'revdelete-hide-image' => 'கோப்பின் உள்ளடக்கங்களை மறை',
'revdelete-hide-name' => 'செயற்பாட்டையும் இலக்கையும் மறை',
-'revdelete-hide-comment' => 'தà¯\8aà®\95à¯\81பà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\81à®°à¯\81à®\95à¯\8dà®\95தà¯\8dதà¯\88 மறà¯\88',
-'revdelete-hide-user' => 'தà¯\8aà®\95à¯\81பà¯\8dபவரினà¯\8d à®\90.பி./பயனரà¯\8dபà¯\86யரà¯\88 மறà¯\88',
+'revdelete-hide-comment' => 'தà¯\8aà®\95à¯\81பà¯\8dபà¯\81à®\9aà¯\8d à®\9aà¯\81à®°à¯\81à®\95à¯\8dà®\95à®®à¯\8d',
+'revdelete-hide-user' => 'தà¯\8aà®\95à¯\81பà¯\8dபவரினà¯\8d à®\90.பி./பயனரà¯\8dபà¯\86யரà¯\8d',
'revdelete-hide-restricted' => 'குறிப்புக்களை அதிகாரிகள் உட்பட எல்லோரிடமிருந்தும் மறைத்துவிடு (காட்டத்தேவையில்லை).',
'revdelete-radio-same' => '(தயவுசெய்து மாற்ற வேண்டாம்)',
'revdelete-radio-set' => 'மறைக்கப்பட்டது',
'gender-unknown' => 'நான் குறிப்பிட விரும்பவில்லை',
'gender-male' => 'ஆண்',
'gender-female' => 'பெண்',
-'prefs-help-gender' => 'விருப்பத் தேர்வுதான்: ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல். இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
+'prefs-help-gender' => 'விருப்பத்தேர்வை அமைப்பது இங்கள் விருப்பம்.
+ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல்.
+இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
'email' => 'மின்னஞ்சல்',
'prefs-help-realname' => 'உண்மையான பெயர் கட்டாயமற்றது. நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
'prefs-help-email' => 'மின்னஞ்சல் விருப்பத் தேர்வு, ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல்லை மீட்டமைக்க தேவைப்படும்.',
'right-ipblock-exempt' => 'ஐ.பி (IP) தடுப்புகளையும், தானியங்கியான தடுப்புகளையும், வரம்புவரையான தடுப்புகளையும் மீறிச் செயல்படுக.',
'right-proxyunbannable' => 'தானாக தடுப்புகப்பட்ட Proxies ஐ மீறு.',
'right-unblockself' => 'தங்களே தடுப்பு நீக்கு',
-'right-protect' => 'பாதுகாப்பு மட்டங்களை மாற்று மற்றும் பாதுகாக்கப்பட்ட பக்கங்களை திருத்து',
+'right-protect' => 'பாதà¯\81à®\95ாபà¯\8dபà¯\81 à®®à®\9fà¯\8dà®\9fà®\99à¯\8dà®\95ளà¯\88 மாறà¯\8dà®±à¯\81 மறà¯\8dà®±à¯\81à®®à¯\8d தà¯\8aà®\9fà®°à¯\8d-பாதà¯\81à®\95ாà®\95à¯\8dà®\95பà¯\8dபà®\9fà¯\8dà®\9f பà®\95à¯\8dà®\95à®\99à¯\8dà®\95ளà¯\88 திரà¯\81தà¯\8dதà¯\81',
'right-editprotected' => '( வடிவமான பாதுகாப்பு இல்லாமல்) பாதுகாக்கப்பட்ட பக்கங்களை திருத்து',
'right-editinterface' => 'பயனர் இடைமுகப்பை தொகுக்கவும்',
'right-editusercssjs' => 'மற்ற பயனர்களின் CSS மற்றும் JavaScript கோப்புகளை திருத்து',
'version-hook-name' => 'கொக்கியின் பெயர்',
'version-hook-subscribedby' => 'பயன்பாடு',
'version-version' => '(பதிப்பு $1)',
-'version-license' => 'à®\85னà¯\81மதி',
+'version-license' => 'à®®à¯\80à®\9fியாவிà®\95à¯\8dà®\95ி à®\89ரிமமà¯\8d',
'version-poweredby-credits' => "இந்த் விக்கி '''[https://www.mediawiki.org/ MediaWiki]''' இதன் மூலம் வழங்கப்படுகிறது, காப்புரிமை © 2001-$1 $2.",
'version-poweredby-others' => 'பிறர்',
'version-license-info' => 'மீடியாவிக்கியானது இலவச மென்பொருள்.இதை நீங்கள் மற்றவர்களுக்கு கொடுப்பது அல்லது திருத்தம் செய்வது இலவச மென்பொருள் அறக்கட்டளை வழங்கிய GNUவின் பொது உரிம விதிகளுக்குட்பட்டது;உரிமத்தின் இரண்டாவது பதிப்பு அல்லது அதற்கு மேற்பட்ட பதிப்பு (உங்கள் விருப்பத்திற்க்கேற்றவாறு).
'email-address-validity-invalid' => 'Введіть чинну адресу електронної пошти',
# User rights
-'userrights' => 'УпÑ\80авлÑ\96ння правами користувачів',
-'userrights-lookup-user' => 'УпÑ\80авлÑ\96ння групами користувача',
+'userrights' => 'Ð\9aеÑ\80Ñ\83вання правами користувачів',
+'userrights-lookup-user' => 'Ð\9aеÑ\80Ñ\83вання групами користувача',
'userrights-user-editname' => "Введіть ім'я користувача:",
'editusergroup' => 'Редагувати групи користувача',
'editinguser' => "Зміна прав користувача '''[[User:$1|$1]]''' $2",
'sp-contributions-uploads' => 'завантаження',
'sp-contributions-logs' => 'журнали',
'sp-contributions-talk' => 'обговорення',
-'sp-contributions-userrights' => 'управління правами користувача',
+'sp-contributions-userrights' => 'керування правами користувача',
'sp-contributions-blocked-notice' => 'Цей користувач наразі заблокований. Останній запис у журналі блокувань такий:',
'sp-contributions-blocked-notice-anon' => 'Доступ з цієї IP-адреси зараз заблокований.
Далі наведено останній запис з журналу блокувань:',
'exif-datetimemetadata' => 'Остання дата зміни метаданих',
'exif-nickname' => 'Неофіційна назва зображення',
'exif-rating' => 'Рейтинг (від 0 до 5)',
-'exif-rightscertificate' => 'Сертифікат управління правами',
+'exif-rightscertificate' => 'Сертифікат керування правами',
'exif-copyrighted' => 'Статус авторських прав',
'exif-copyrightowner' => 'Власник авторських прав',
'exif-usageterms' => 'Умови користування',
'version-parser-function-hooks' => 'Перехоплювачі функцій синтаксичного аналізатора',
'version-hook-name' => "Ім'я перехоплювача",
'version-hook-subscribedby' => 'Підписаний на',
-'version-version' => '(Версія $1)',
+'version-version' => '($1)',
'version-svn-revision' => '(r$2)',
'version-license' => 'Ліцензія MediaWik',
'version-ext-license' => 'Ліцензія',
'version-license-not-found' => 'Не знайдено докладних відомостей про ліцензію для цього розширення.',
'version-credits-title' => 'Кредити для $1',
'version-credits-not-found' => 'Детальної інформації про авторів не знайдено для цього розширення.',
-'version-poweredby-credits' => "Ця Вікі працює на системі управління вмістом '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Ця Вікі працює на системі керування вмістом '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'інші',
'version-poweredby-translators' => 'перекладачі translatewiki.net',
'version-credits-summary' => 'Нам хотілося б відзначити наступних осіб, що зробили внесок у [[Special:Version|MediaWiki]].',
'deletedtext' => '"$1" yoʻqotildi.
Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
'dellogpage' => 'Yoʻqotish qaydlari',
-'dellogpagetext' => 'Quyida oxirgi oʻchirish qaydlari keltirilgan',
+'dellogpagetext' => 'Quyida oxirgi yoʻqotish qaydlari keltirilgan',
'deletionlog' => 'yoʻqotish qaydlari',
'reverted' => 'Eski holiga keltirildi',
'deletecomment' => 'Sabab:',
# General errors
'error' => 'Petuz',
'databaseerror' => 'Andmusiden bazan petuz',
+'databaseerror-query' => 'Ecmine: $1',
'databaseerror-function' => 'Funkcii:$1',
'databaseerror-error' => 'Petuz: $1',
'laggedslavemode' => "Varutuz: voib olda, lehtpolen versijal ei ole jäl'gmäižid ližadusid.",
'mailerror' => 'E-počtan oigendamižen petuz: $1',
'emailauthenticated' => 'Teiden e-počtan adres vahvištoittihe datal $2 aigal $3.',
'emailnotauthenticated' => 'Teiden e-počtan adres ei ole völ vahvištoittud.
-Wiki-likutimen počtfunkcijad ei olgoi kävutamas.',
+Kirjeižid ei oigekoi ni-ühten funkcijan täht.',
'noemailprefs' => 'Kirjutagat e-počtan adres teiden järgendusihe, miše se oliži kävutamas.',
'emailconfirmlink' => 'Vahvištoitkat teiden e-počtan adres',
'invalidemailaddress' => 'Ningomal e-počtan adresal om vär format. Olgat hüväd, kirjutagat e-počtan adres oiktas formatas vai puhtastagat e-počtan pöud.',
'emaildisabled' => 'Nece sait ei voi oigeta e-počtad.',
'accountcreated' => 'Registracii om OK',
-'accountcreatedtext' => 'Registracii $1-kävutajan täht om sätud.',
+'accountcreatedtext' => 'Registracii [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]])-kävutajan täht om sätud.',
'createaccount-title' => '{{SITENAME}}: registracijan sädand.',
'usernamehasherror' => 'Kävutajan nimes ei voi olda mugošt znamad.',
'login-throttled' => 'Tö olet tehnu äjahkon naprindoid kirjutadas sistemha.
-Olgat hüväd, varastagat pordon aigad edel ut naprindad.',
+Olgat hüväd, varastagat $1 aigad edel ut naprindad.',
'login-abort-generic' => 'Teiden naprind tulda sistemha om satusetoi - Azotadud',
'loginlanguagelabel' => 'Kel’: $1',
'newpassword' => "Uz' peitsana:",
'retypenew' => "Toštkat uz' peitsana:",
'resetpass_submit' => 'Säta peitsana da kirjutadas sistemha',
-'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
+'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita!',
'resetpass_forbidden' => 'Ei voi vajehtada peitsanad',
'resetpass-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
'resetpass-submit-loggedin' => 'Vajehtada peitsana',
'passwordreset-email' => 'E-počtan adres:',
'passwordreset-emailelement' => 'Kävutajannimi: $1
Aigaline peitsana: $2',
-'passwordreset-emailsent' => 'Muštatai kirjeine oigetihe e-počtadme',
+'passwordreset-emailsent' => 'Muštatai kirjeine uden peitsananke oigetihe e-počtadme.',
# Special:ChangeEmail
'changeemail' => 'Toižetada e-počtan adres',
'revdelete-text' => "'''Čutud versijad ozutadas lehtpolen istorijas da aigkirjoiš, no järgeližed lugijad ei voiškakoi nähta niiden südäimišton erasid paloid.'''
Administratorad voiškatas lugeda peittud südäimištod da endištada sidä necen interfeisan kal't siloi, konz ei ole ližakaidendusid.",
'revdelete-legend' => 'Säta kaidendused',
-'revdelete-hide-text' => 'Peitta necen lehtpolen versijan tekst',
+'revdelete-hide-text' => 'Redakcijan tekst',
'revdelete-hide-image' => 'Peitta failan südäiolend',
'revdelete-hide-name' => 'Peitta tegend da sen objekt',
'revdelete-hide-comment' => 'Peitta toižetusiden kirjutez',
'listfiles_size' => 'Suruz’',
'listfiles_description' => 'Ümbrikirjutand',
'listfiles_count' => 'Versijad',
+'listfiles-latestversion' => 'Nügüdläine versii',
'listfiles-latestversion-yes' => 'Ka',
# File description page
'allpages-bad-ns' => '{{SITENAME}}-saital ei ole "$1"-nimiavarust.',
'allpages-hide-redirects' => 'Peitta läbikosketused',
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Ozutada möhembad.',
+
# Special:Categories
'categories' => 'Kategorijad',
'categoriespagetext' => '{{PLURAL:$1|Neciš kategorijas|Neniš kategorijoiš }} om lehtpolid vai mediafailoid.
# API errors
'api-error-empty-file' => "Teil oigetud fail om pall'az.",
+'api-error-fetchfileerror' => 'Südäipetuz: mi-se läksi värin failad sades.',
'api-error-filename-tooshort' => 'Lühudahk failannimi.',
'api-error-filetype-banned' => "Nece failtip om kel'tud.",
'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|om laskmatoi failantip|oma laskmatomad failantipad}}. Lasktud {{PLURAL:$3|failantip om|failantipad oma}} $2.',
'mostrevisions' => 'אַרטיקלען מיט די מערסטע באַאַרבעטונגען',
'prefixindex' => 'פּרעפֿיקס אינדעקס',
'prefixindex-namespace' => 'אלע בלעטער מיט פרעפֿיקס ($1 נאמענטייל)',
+'prefixindex-strip' => 'אפשניידן פרעפיקס אין ליסטע',
'shortpages' => 'קורצע בלעטער',
'longpages' => 'לאנגע בלעטער',
'deadendpages' => 'בלינדע בלעטער',
'protectedpages' => 'געשיצטע בלעטער',
'protectedpages-indef' => 'בלויז אומבאַשרענקטע באַשוצינגען',
'protectedpages-cascade' => 'בלויז קאַסקאַדירנדיקע באַשיצונגען',
+'protectedpages-noredirect' => 'פֿארהיילן ווייטערפֿירונגען',
'protectedpagesempty' => 'אצינד זענען קיין בלעטער נישט געשיצט מיט די דאזיגע פאַראַמעטערס.',
'protectedtitles' => 'געשיצטע קעפלעך',
'protectedtitlesempty' => 'אצינד זענען קיין קעפלעך נישט באַשיצט מיט די דאזיגע פאַראַמעטערס.',
'delete-edit-reasonlist' => 'רעדאַקטירן די אויסמעקן סיבות',
'delete-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אזעלכע בלעטער איז באַגרענעצט געווארן בכדי צו פֿאַרמײַדן א צופֿעליגע פֿאַרשטערונג פֿון {{SITENAME}}.',
'delete-warning-toobig' => 'דער בלאַט האט א גרויסע רעדאקטירונג היסטאריע, מער ווי $1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}. אויסמעקן אים קען פֿאַרשטערן דאַטנבאַזע אפעראַציעס פֿון {{SITENAME}}; זײַט פֿארזיכטיג איידער איר מעקט אויס.',
+'deleting-backlinks-warning' => "'''ווארענוג:''' אנדערע בלעטער פארבינדן צום בלאט איר האלט ביי אויסמעקן.",
# Rollback
'rollback' => 'צוריקדרייען רעדאַקטירונגען',
'ip_range_toolarge' => 'אָפשטאַנדן גרעסער ווי /$1 קען מען נישט בלאקירן.',
'proxyblocker' => 'פראקסי בלאקער',
'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
+'sorbsreason' => 'אייער IP־אדרעס געפינט זיך אין דער ליסטע פון אפענע פראקסיס אינעם DNSBL געניצט אין {{SITENAME}}.',
'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.',
'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
* @author Stevenliuyi
* @author Supaiku
* @author Tommyang
+ * @author User670839245
* @author Waihorace
* @author Wilsonmess
* @author Wmr89502270
'filename-tooshort' => '文件名过短。',
'filetype-banned' => '此类文件被禁止。',
'verification-error' => '文件未通过验证。',
-'hookaborted' => '您所尝试的修改被插件钩子舍弃。',
+'hookaborted' => '您所尝试的修改被一个扩展程序终止。',
'illegal-filename' => '文件名非法。',
'overwrite' => '不允许覆盖现有文件。',
'unknown-error' => '发生未知错误。',
* Evaluate a number against a set of plural rules. If a rule passes,
* return the index of plural rule.
*
- * @param int The number to be evaluated against the rules
- * @param array The associative array of plural rules in pluralform => rule format.
+ * @param int $number The number to be evaluated against the rules
+ * @param array $rules The associative array of plural rules in pluralform => rule format.
* @return int The index of the plural form which passed the evaluation
*/
public static function evaluate( $number, array $rules ) {
* Evaluate a compiled set of rules returned by compile(). Do not allow
* the user to edit the compiled form, or else PHP errors may result.
*
- * @param string The number to be evaluated against the rules, in English, or it
+ * @param string $number The number to be evaluated against the rules, in English, or it
* may be a type convertible to string.
- * @param array The associative array of plural rules in pluralform => rule format.
+ * @param array $rules The associative array of plural rules in pluralform => rule format.
* @return int The index of the plural form which passed the evaluation
*/
public static function evaluateCompiled( $number, array $rules ) {
/**
* Add another part to this range.
*
- * @param mixed The part to add, either a range object itself or a single number.
+ * @param CLDRPluralRuleEvaluator_Range|int $other The part to add, either
+ * a range object itself or a single number.
*/
function add( $other ) {
if ( $other instanceof self ) {
/**
* Convert a rule to RPN. This is the only public entry point.
*
- * @param $rule The rule to convert
+ * @param string $rule The rule to convert
* @return string The RPN representation of the rule
*/
public static function convert( $rule ) {
// Iterate through all tokens, saving the operators and operands to a
// stack per Dijkstra's shunting yard algorithm.
+ /** @var CLDRPluralRuleConverter_Operator $token */
while ( false !== ( $token = $this->nextToken() ) ) {
// In this grammar, there are only binary operators, so every valid
// rule string will alternate between operator and operand tokens.
* For the binary operator $op, pop its operands off the stack and push
* a fragment with rpn and type members describing the result of that
* operation.
+ *
+ * @param CLDRPluralRuleConverter_Operator $op
*/
protected function doOperation( $op ) {
if ( count( $this->operands ) < 2 ) {
/**
* Create a numerical expression object
*
+ * @param string $text
+ * @param int $pos
* @return CLDRPluralRuleConverter_Expression The numerical expression
*/
protected function newNumber( $text, $pos ) {
/**
* Create a binary operator
*
+ * @param string $type
+ * @param int $pos
+ * @param int $length
* @return CLDRPluralRuleConverter_Operator The operator
*/
protected function newOperator( $type, $pos, $length ) {
* validation.
*/
class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
- public $type, $rpn;
+ /** @var string */
+ public $type;
+
+ /** @var string */
+ public $rpn;
function __construct( $parser, $type, $rpn, $pos, $length ) {
parent::__construct( $parser, $pos, $length );
* messages), and the binary operator at that location.
*/
class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
- /**
- * The name
- *
- * @var string
- */
+ /** @var string The name */
public $name;
/**
*
* @param CLDRPluralRuleConverter $parser The parser
* @param string $name The operator name
- * @param int $pos The position
* @param int $pos The length
+ * @param int $length
*/
function __construct( $parser, $name, $pos, $length ) {
parent::__construct( $parser, $pos, $length );
$db->insert( 'externallinks',
array(
array(
+ 'el_id' => $db->nextSequenceValue( 'externallinks_el_id_seq' ),
'el_from' => $row->el_from,
'el_to' => $row->el_to,
'el_index' => "http:{$row->el_index}",
),
array(
+ 'el_id' => $db->nextSequenceValue( 'externallinks_el_id_seq' ),
'el_from' => $row->el_from,
'el_to' => $row->el_to,
'el_index' => "https:{$row->el_index}",
'postedit-confirmation',
),
),
+ 'mediawiki.action.view.redirectToFragment' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.redirectToFragment.js',
+ 'dependencies' => array(
+ 'jquery.client',
+ ),
+ 'position' => 'top',
+ ),
'mediawiki.action.view.rightClickEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
),
--- /dev/null
+/**
+ * JavaScript to scroll the page to an id, when a redirect with fragment is viewed.
+ */
+( function ( mw, $ ) {
+ var profile = $.client.profile(),
+ fragment = mw.config.get( 'wgRedirectToFragment' );
+
+ if ( fragment === null ) {
+ // nothing to do
+ return;
+ }
+
+ if ( profile.layout === 'webkit' && profile.layoutVersion < 420 ) {
+ // Released Safari w/ WebKit 418.9.1 messes up horribly
+ // Nightlies of 420+ are ok
+ return;
+ }
+ if ( !window.location.hash ) {
+ window.location.hash = fragment;
+
+ // Mozilla needs to wait until after load, otherwise the window doesn't
+ // scroll. See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
+ // There's no obvious way to detect this programmatically, so we use
+ // version-testing. If Firefox fixes the bug, they'll jump twice, but
+ // better twice than not at all, so make the fix hit future versions as
+ // well.
+ if ( profile.layout === 'gecko' ) {
+ $( function () {
+ if ( window.location.hash === fragment ) {
+ window.location.hash = fragment;
+ }
+ } );
+ }
+ }
+}( mediaWiki, jQuery ) );
// Cache hit stats
stats: { hits: 0, misses: 0, expired: 0 },
+ // Experiment data
+ experiment: ( function () {
+ var start = ( new Date() ).getTime(), id = 0, seed = 0;
+
+ try {
+ id = JSON.parse( localStorage.getItem( 'moduleStorageExperiment2' ) );
+ if ( typeof id !== 'number' ) {
+ id = Math.floor( Math.random() * Math.random() * 1e16 );
+ localStorage.setItem( 'moduleStorageExperiment2', id );
+ }
+ seed = id % 2000;
+ } catch ( e ) {}
+
+ return {
+ // Unique identifier for this browser. This allows us to group all
+ // datapoints generated by a particular browser, which in turn allows us
+ // to see how the initial load compares to subsequent page loads.
+ id: id,
+
+ // Group assignment may be 0 (not in experiment), 1 (control group), or 2
+ // (experimental group). Browsers that don't implement all the prerequisite APIs
+ // (JSON and Web Storage) are ineligible. Eligible browsers have a 0.1% chance
+ // of being included in the experiment, in which case they are equally likely to
+ // be assigned to either the experimental or control group.
+ group: seed === 1 ? 1 : ( seed === 2 ? 2 : 0 ),
+
+ // Assess module storage performance by measuring the time between this
+ // reference point and the window load event.
+ start: start
+ };
+ }() ),
+
/**
* Construct a JSON-serializable object representing the content of the store.
* @return {Object} Module store contents.
return;
}
- if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) || mw.config.get( 'debug' ) ) {
+ if ( ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) && mw.loader.store.experiment.group !== 2 )
+ || mw.config.get( 'debug' ) ) {
// Disabled by configuration, or because debug mode is set
mw.loader.store.enabled = false;
return;
clear: both;
}
-#mw_trackbacks {
- border: solid 1px #bbbbff;
- background-color: #eeeeff;
- padding: 0.2em;
-}
-
/**
* Data table style
*
}
}
-win.redirectToFragment = function ( fragment ) {
+/**
+ * Legacy function to scroll to an id while viewing the page over a redirect.
+ * Superseeded by module 'mediawiki.action.view.redirectToFragment' in version 1.23.
+ * Kepted because cache can contain still inline script calls to this function.
+ * Should be removed in version 1.24.
+ * @deprecated since 1.23 Use mediawiki.action.view.redirectToFragment instead
+ */
+mw.log.deprecate( win, 'redirectToFragment', function ( fragment ) {
var webKitVersion,
match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
if ( match ) {
} );
}
}
-};
+}, 'Use the module mediawiki.action.view.redirectToFragment instead.' );
/**
* User-agent sniffing.
* Bar
!!endarticle
+!!article
+Template:OpenTable
+!!text
+{|
+!!endarticle
+
###
### Basic tests
###
!! test
Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
!! input
-<b→> doesn't work! </b>
-
-<bä> doesn't work! </b>
+<b→> doesn't work! </b→>
-<boo> works fine </b>
+<bä> doesn't work! </bä>
-<s.foo>foo</s>
+<boo> works fine </boo>
<s.foo>s.foo</s.foo>
<sub-ID#1>
!! result
-<p><b→> doesn't work! </b>
-</p><p><bä> doesn't work! </b>
-</p><p><boo> works fine </b>
-</p><p><s.foo>foo</s>
+<p><b→> doesn't work! </b→>
+</p><p><bä> doesn't work! </bä>
+</p><p><boo> works fine </boo>
</p><p><s.foo>s.foo</s.foo>
</p><p><sub-ID#1>
</p>
!! end
+!! test
+Isolated close tags should be treated as literal text (bug 52760)
+!! input
+</b>
+
+<s.foo>s</s>
+!! result
+<p></b>
+</p><p><s.foo>s</s>
+</p>
+!! end
+
###
### Special characters
###
!! end
+## PHP parser emits output which is broken
+!! test
+Unclosed HTML p-tags should be handled properly
+!! options
+parsoid
+!! input
+<div><p>foo</div>
+a
+
+b
+!! result
+<div data-parsoid='{"stx":"html"}'><p data-parsoid='{"stx":"html", "autoInsertedEnd":true}'>foo</p></div>
+<p>a</p>
+<p>b</p>
+!! end
+
###
### Preformatted text
###
</p>
!! end
+!! test
+Empty pre; pre inside other HTML tags (bug 54946)
+!! input
+a
+
+<div><pre>
+foo
+</pre></div>
+<pre></pre>
+!! result
+<p>a
+</p>
+<div><pre>
+foo
+</pre></div>
+<pre></pre>
+
+!! end
+
+!! test
+HTML pre followed by indent-pre
+!! input
+<pre>foo</pre>
+ bar
+!! result
+<pre>foo</pre>
+<pre>bar
+</pre>
+!! end
+
+!!test
+Block tag pre
+!!options
+parsoid
+!!input
+<p><pre>foo</pre></p>
+!!result
+<p data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,3,3,0]}'></p><pre data-parsoid='{"stx":"html","dsr":[3,17,5,6]}'>foo</pre><p data-parsoid='{"autoInsertedStart":true,"stx":"html","dsr":[17,21,0,null]}'></p>
+!!end
+
!!test
Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
!!input
</pre>
!!end
+!! test
+Things that look like <pre> tags aren't treated as such
+!! input
+Barack Obama <President> of the United States
+!! result
+<p>Barack Obama <President> of the United States
+</p>
+!! end
+
+!! test
+Parsoid: handle pre with space after attribute
+!! options
+parsoid=wt2html
+!! input
+<pre style="width:50%;" >{{echo|foo}}</pre>
+!! result
+<pre style="width:50%;">{{echo|foo}}</pre>
+!! end
+
# TODO / maybe: fix wt2wt for this
!! test
Parsoid: Don't paragraph-wrap fosterable content
<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
!! end
+## Bug 56733
+!! test
+Templates parameters with special tokenizing behavior dont get modified because of arg escaping
+!! options
+parsoid
+!! input
+{{echo|a : b}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a : b"}},"i":0}}]}'>a<span typeof="mw:Placeholder" data-parsoid='{"isDisplayHack":true}'> </span>: b</p>
+!! end
+
###
### Parsoid-centric tests for testing RT edge cases for pre
###
!!test
3a. Indent-Pre and block tags (single-line html)
!!input
- <p> foo </p>
- <div> foo </div>
- <blockquote> foo </blockquote>
+ a <p> foo </p>
+ b <div> foo </div>
+ c <blockquote> foo </blockquote>
<span> foo </span>
!!result
- <p> foo </p>
- <div> foo </div>
- <blockquote> foo </blockquote>
+ a <p> foo </p>
+ b <div> foo </div>
+ c <blockquote> foo </blockquote>
<pre><span> foo </span>
</pre>
!!end
+!!test
+3c. Indent-Pre and block tags (multi-line html)
+!!input
+ a <span>foo</span>
+ b <div> foo </div>
+!!result
+<pre>a <span>foo</span>
+</pre>
+ b <div> foo </div>
+
+!!end
+
!!test
3b. Indent-Pre and block tags (pre-content on separate line)
!!input
!!end
+## NOTE: the leading white-space chars on empty line are significant
!! test
-5. White-space in indent-pre
-NOTE: the white-space char on 2nd line is significant
+5a. White-space in indent-pre
!! input
- a<br/>
+ a<br />
b
!! result
</pre>
!! end
+## NOTE: the leading white-space chars on empty line are significant
+!! test
+5b. White-space in indent-pre
+!! input
+ a
+
+ b
+
+
+ c
+!! result
+<pre>a
+
+b
+
+
+c
+</pre>
+!! end
+
+!! test
+5c. White-space in indent-pre
+!! input
+ ''a''
+ ''b''
+ ''c''
+!! result
+<pre><i>a</i>
+ <i>b</i>
+ <i>c</i>
+</pre>
+!! end
+
!! test
6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
!! input
<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
!! end
+!! test
+Parenthesis in external links, especially URL links
+!! options
+php
+!! input
+http://example.com)
+
+http://example.com/test)
+
+http://example.com/(test)
+
+http://example.com/((test)
+
+(http://example.com/(test))
+
+(http://example.com/(test)))))
+
+http://example.com/a)b
+
+[http://example.com) foo]
+!! result
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
+</p><p><a rel="nofollow" class="external free" href="http://example.com/test">http://example.com/test</a>)
+</p><p><a rel="nofollow" class="external free" href="http://example.com/(test)">http://example.com/(test)</a>
+</p><p><a rel="nofollow" class="external free" href="http://example.com/((test)">http://example.com/((test)</a>
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com/(test))">http://example.com/(test))</a>
+</p><p>(<a rel="nofollow" class="external free" href="http://example.com/(test)))))">http://example.com/(test)))))</a>
+</p><p><a rel="nofollow" class="external free" href="http://example.com/a)b">http://example.com/a)b</a>
+</p><p><a rel="nofollow" class="external text" href="http://example.com)">foo</a>
+</p>
+!! end
+
+!! test
+Parenthesis in external links, especially URL links (Parsoid)
+!! options
+parsoid
+!! input
+http://example.com)
+
+http://example.com/test)
+
+http://example.com/(test)
+
+http://example.com/((test)
+
+(http://example.com/(test))
+
+(http://example.com/(test)))))
+
+http://example.com/a)b
+
+[http://example.com) foo]
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)</p>
+<p><a rel="mw:ExtLink" href="http://example.com/test">http://example.com/test</a>)</p>
+<p><a rel="mw:ExtLink" href="http://example.com/(test)">http://example.com/(test)</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/((test)">http://example.com/((test)</a></p>
+<p>(<a rel="mw:ExtLink" href="http://example.com/(test))">http://example.com/(test))</a></p>
+<p>(<a rel="mw:ExtLink" href="http://example.com/(test)))))">http://example.com/(test)))))</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com/a)b">http://example.com/a)b</a></p>
+<p><a rel="mw:ExtLink" href="http://example.com)">foo</a></p>
+!! end
+
+!! test
+Parenthesis in external links, w/ transclusion or comment
+!! options
+parsoid
+!! input
+(http://example.com/{{echo|hi}})
+
+(http://example.com<!-- hi -->)
+!! result
+<p>(<a data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-mw=\"{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;hi&quot;}},&quot;i&quot;:0}}]}\" data-parsoid=\"{&quot;dsr&quot;:[20,31,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\">hi</span>"}]]}' typeof="mw:ExpandedAttrs" about="#mwt2" rel="mw:ExtLink" href="http://example.com/hi" data-parsoid='{"stx":"url","a":{"href":"http://example.com/hi"},"sa":{"href":"http://example.com/{{echo|hi}}"},"dsr":[1,31,0,0]}'>http://example.com/hi</a>)</p>
+
+<p>(<a rel="mw:ExtLink" href="http://example.com" data-parsoid='{"stx":"url","a":{"href":"http://example.com"},"sa":{"href":"http://example.com<!-- hi -->"},"dsr":[35,64,0,0]}'>http://example.com</a>)</p>
+!! end
+
###
### Quotes
###
!! input
{||}
!! result
+
!! end
+
# Parsoid team replies: empty table tags are legal in HTML5
!! test
A table with no data. (parsoid)
!! options
-parsoid
+parsoid=wt2html
!! input
{||}
!! result
<table></table>
+
+!! end
+
+!! test
+A table with stray table end tags on start tag line (wt2html)
+!! options
+parsoid=wt2html
+!! input
+{|style="color: red;"|}
+
+{|style="color: red;" |}
+|foo
+|}
+
+{|style="color: red;"|} id="foo"
+|foo
+|}
+
+{|style="color: red;" |} id="foo"
+|foo
+|}
+!! result
+<table style="color: red;"></table>
+
+<table style="color: red;">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+<table style="color: red;" id="foo">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+<table style="color: red;" id="foo">
+<tbody><tr>
+<td>foo</td>
+</tr></tbody>
+</table>
+
+!! end
+
+!! test
+A table with no data (take 2) (parsoid)
+!! options
+parsoid
+!! input
+{|
+|}
+!! result
+<table></table>
!! end
# A table with nothing but a caption is invalid XHTML, we might want to render
<tr><td>baz</td></tr></tbody></table><b>quux</b>
!! end
+!! test
+Parsoid: newline inducing block nodes don't suppress <nowiki>
+!! options
+parsoid=html2wt
+!! input
+<nowiki> </nowiki>a
+
+= foo =
+!! result
+ a<h1>foo</h1>
+!! end
+
###
### Internal links
###
</p>
!! end
+!! test
+Piped link with extlink-like text
+!! input
+[[Main Page|[bar]]]
+[[Main Page|This is a [bar]]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">[bar]</a>
+<a href="/wiki/Main_Page" title="Main Page">This is a [bar]</a>
+</p>
+!! end
+
!! test
Link with multiple pipes
!! input
<p data-parsoid='{"dsr":[19,30,0,0]}'><a rel="mw:ExtLink" href="//en.wikipedia.org/wiki/Foo" data-parsoid='{"stx":"simple","a":{"href":"//en.wikipedia.org/wiki/Foo"},"sa":{"href":":en:Foo"},"isIW":true,"dsr":[19,30,null,1]}'>en:Foo</a></p>
!! end
+!! test
+Interwiki links that cannot be represented in wiki syntax
+!! options
+parsoid
+!! input
+[[meatball:ok]]
+[[meatball:ok#foo|ok with fragment]]
+[[meatball:ok_as_well?|ok ending with ? mark]]
+[http://de.wikipedia.org/wiki/Foo?action=history has query]
+[http://de.wikipedia.org/wiki/#foo is just fragment]
+
+!! result
+<p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
+<a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/Foo?action=history">has query</a>
+<a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/#foo">is just fragment</a></p>
+!! end
+
###
### Interlanguage links
</p>
!!end
+!!test
+4. includeonly in table attributes
+!!input
+{|
+|- <noinclude>
+|-
+|a
+</noinclude>
+|- <includeonly>
+|-
+|b
+</includeonly>
+|}
+!!result
+<table>
+
+
+<tr>
+<td>a
+</td></tr>
+</table>
+
+!!end
+
###
### Testing parsing of templates where a template arg
### has the same name as the template itself.
<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
!! end
+!! test
+Image with caption, bug 53312 #1 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page stuff]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page stuff</figcaption></figure>
+!! end
+
+!! test
+Image with caption, bug 53312 #2 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page=]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=</figcaption></figure>
+!! end
+
+!! test
+Image with caption, bug 53312 #3 (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption page=stuff]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption page=stuff</figcaption></figure>
+!! end
+
!! test
Image with empty attribute (php)
!! options
SVG thumbnails with no language set
!! options
!! input
-[[File:Foobar.svg|thumb|width=200]]
+[[File:Foobar.svg|thumb|caption]]
!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
!! end
SVG thumbnails with language de
!! options
!! input
-[[File:Foobar.svg|thumb|width=200|lang=de]]
+[[File:Foobar.svg|thumb|caption|lang=de]]
!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
!! end
SVG thumbnails with invalid language code
!! options
!! input
-[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]]
+[[File:Foobar.svg|thumb|caption|lang=invalid.language.code]]
!! result
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
#</p>
!! test
-Caption with a template in it
+Parsoid-specific image handling - caption with a template in it
!! options
parsoid
!! input
-[[Image:Foobar.jpg|thumb|200px|This caption has a {{echo|transclusion}} in it.]]
+[[File:Foobar.jpg|thumb|200x200px|This caption has a {{echo|transclusion}} in it.]]
!! result
<figure typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>This caption has a <span about="#mwt1" typeof="mw:Transclusion" data-mw="{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}">transclusion</span> in it.</figcaption></figure>
!! end
!! test
-Caption with unbalanced tags in it
+Parsoid-specific image handling - caption with unbalanced tags in it
!! options
-parsoid
+parsoid=wt2html,wt2wt,html2html
!! input
foo
-[[Image:Foobar.jpg|thumb|200px|This caption has a <center>unbalanced tag in it.]]
+[[File:Foobar.jpg|thumb|200x200px|This caption has a <center>unbalanced tag in it.]]
bar
!! result
<p>foo</p>
<link rel="mw:PageProp/Category" href="Category:Foo#Bar">
!! end
+!! test
+Parsoid: Defaultsort
+!! options
+parsoid
+!! input
+{{DEFAULTSORT:Foo}}
+!! result
+<meta property="mw:PageProp/categorydefaultsort" content="Foo"/>
+!! end
+
###
### Inter-language links
###
</p>
!! end
+# TODO: generalize to PHP parser?
+!! test
+HTML5 tags
+!! options
+parsoid
+!! input
+<data value="5">five</data>
+<time datetime="2000-01-01T00:00Z">The new millenium started</time>
+<mark>This highlighted text</mark>
+!! result
+<p><data value="5">five</data>
+<time datetime="2000-01-01T00:00Z">The new millenium started</time>
+<mark>This highlighted text</mark></p>
+!! end
+
+!! test
+HTML tag with leading space is parsed as text
+!! input
+< div>foo< /div>
+!! result
+<p>< div>foo< /div>
+</p>
+!! end
###
### Nesting tests (see bug 41545, 50604, 51081)
</ol>
!!end
+## We don't bother wt2wt-ing non-standard whitespace
+!!test
+Ref: 16. Tokenizer should accept non-standard whitespace in <ref> and </ref> tags
+!!options
+parsoid=wt2html
+!!input
+A <ref >foo</ref >
+
+<references />
+!!result
+<p>A <span class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li></ol>
+!!end
+
!!test
References: 1. references tag without any refs should be handled properly
!!options
A <ref group="a">foo</ref>
B <ref group="b">bar</ref>
-<references group='a' />
+<references group="a" />
!!result
<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
A <ref group="a">afoo</ref>
B <ref>bfoo</ref>
-<references group="a"/>
+<references group="a" />
C <ref>cfoo</ref>
!!options
parsoid
!!input
-{{echo|<references />}}
+<ref>Foo</ref> {{echo|<references />}}
!!result
-<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'></ol>
+<span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"Foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> <ol class="references" typeof="mw:Extension/references mw:Transclusion" about="#mwt4" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> Foo</li></ol>
!!end
!! test
!! test
Headings: 1. Nested inside html
+(New headings and existing headings are handled differently)
!! options
-parsoid
+parsoid=html2wt
!! input
-=<nowiki>=foo=</nowiki>=
+= =foo= =
-==<nowiki>=foo=</nowiki>==
+== =foo= ==
-===<nowiki>=foo=</nowiki>===
+=== =foo= ===
+=<nowiki>=foo=</nowiki>=
+==<nowiki>=foo=</nowiki>==
+===<nowiki>=foo=</nowiki>===
====<nowiki>=foo=</nowiki>====
-
=====<nowiki>=foo=</nowiki>=====
-
======<nowiki>=foo=</nowiki>======
+
!! result
-<h1><span typeof="mw:Nowiki">=foo=</span></h1>
-<h2><span typeof="mw:Nowiki">=foo=</span></h2>
-<h3><span typeof="mw:Nowiki">=foo=</span></h3>
-<h4><span typeof="mw:Nowiki">=foo=</span></h4>
-<h5><span typeof="mw:Nowiki">=foo=</span></h5>
-<h6><span typeof="mw:Nowiki">=foo=</span></h6>
+<h1>=foo=</h1>
+<h2>=foo=</h2>
+<h3>=foo=</h3>
+
+<h1 data-parsoid='{}'>=foo=</h1>
+<h2 data-parsoid='{}'>=foo=</h2>
+<h3 data-parsoid='{}'>=foo=</h3>
+<h4 data-parsoid='{}'>=foo=</h4>
+<h5 data-parsoid='{}'>=foo=</h5>
+<h6 data-parsoid='{}'>=foo=</h6>
!!end
!! test
Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
!! options
-parsoid
+parsoid=html2wt
!! input
-=foo=
+= foo =
<nowiki>*</nowiki>bar
-=foo=
+= foo =
=bar
-=foo=
+= foo =
<nowiki>=bar=</nowiki>
!! result
<h1>foo</h1>*bar
!! test
Headings: 3. Nested inside html with wikitext split by html tags
!! options
-parsoid
+parsoid=html2wt
!! input
-=='''bold'''<nowiki>foo=</nowiki>=
+= ='''bold'''<nowiki>foo=</nowiki> =
!! result
<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
!!end
!! test
Headings: 4a. No escaping needed (testing just h1 and h2)
!! options
-parsoid
+parsoid=html2wt
!! input
-==foo=
+= =foo =
-=foo==
+= foo= =
= =foo= =
-==foo= bar=
+= =foo= bar =
-===foo==
+== =foo ==
-==foo===
+== foo= ==
-=''=''foo==
+= ''=''foo= =
-=<nowiki>=</nowiki>=
+= <nowiki>=</nowiki> =
!! result
<h1>=foo</h1>
<h1>foo=</h1>
!! test
Headings: 4b. No escaping needed (inside p-tags)
!! options
-parsoid
+parsoid=html2wt
!! input
===
=foo= x
parsoid
!! input
<!--c0--><nowiki>=a=</nowiki>
-<!--c1-->
-<nowiki>=a=</nowiki> <!--c2--> <!--c3-->
+
+<!--c1--><nowiki>=a=</nowiki> <!--c2--> <!--c3-->
!! result
<p><!--c0-->=a=</p>
<p><!--c1-->=a= <!--c2--> <!--c3--></p>
*''foo''*bar
*[[Foo]]: bar
+
+*[[Foo]]*bar
!! result
<ul>
<li>foo*bar
<li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
</li>
</ul>
+<ul>
+<li><a rel="mw:WikiLink" href="Foo">Foo</a>*bar
+</li>
+</ul>
!!end
!! test
!! test
Tables: 2a. Nested in td
!! options
-parsoid
+parsoid=html2wt
!! input
{|
|<nowiki>foo|bar</nowiki>
+|-
+|x<div><nowiki>a|b</nowiki></div>
|}
!! result
<table><tbody><tr>
-<td><span typeof="mw:Nowiki">foo|bar</span></td></tr></tbody></table>
+<td>foo|bar</td></tr>
+<tr><td>x<div>a|b</div></td>
+</tbody></table>
!! end
!! test
bar|baz
+bar
-bar
+|-
+|x
+<div>a|b</div>
|}
!! result
<table><tbody>
<p>bar|baz
+bar
-bar</p></td></tr>
+<tr><td>x
+<div>a|b</div></td>
</tbody></table>
!! end
-### SSS FIXME: Disabled right now because accurate html2wt
-### on this snippet requires data-parsoid flags that we've
-### stripped out of these tests. We should scheme how we
-### we want to handle these kind of tests that require
-### data-parsoid flags for accurate html2wt serialization
-
!! test
Tables: 4d. No escaping needed
!! options
-disabled
+parsoid
!! input
{|
+|[[Foo]]-bar
||+1
||-2
|}
!! result
<table>
-<tr>
-<td>+1
-</td>
-<td>-2
-</td></tr></table>
-
+<tbody><tr><td><a rel="mw:WikiLink" href="./Foo">Foo</a>-bar</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>+1</td>
+<td data-parsoid='{"startTagSrc":"|","attrSepSrc":"|"}'>-2</td></tr>
+</tbody></table>
!! end
#### --------------- Links ----------------
!! input
[http://google.com <nowiki>[google]</nowiki>]
[http://google.com <nowiki>google]</nowiki>]
+
+<nowiki>[http://google.com]</nowiki>
+
+<nowiki>[http://google.com google]</nowiki>
+
!! result
-<a href="http://google.com" rel="mw:ExtLink">[google]</a>
-<a href="http://google.com" rel="mw:ExtLink">google]</a>
+<p><a href="http://google.com" rel="mw:ExtLink">[google]</a>
+<a href="http://google.com" rel="mw:ExtLink">google]</a></p>
+<p>[http://google.com]</p>
+<p>[http://google.com google]</p>
!! end
!! test
''''foo'''
'''foo'''<nowiki/>'
'<nowiki/>'''foo'''<nowiki/>'
+''fools'<span> errand</span>''
+''<span>fool</span>'s errand''
!! result
<p><i>'foo'</i>
<i>''foo''</i>
'<b>foo</b>
<b>foo</b>'
'<b>foo</b>'</p>
+<i>fools'<span> errand</span></i>
+<i><span>fool</span>'s errand</i>
!! end
!! test
#### 1. a tags
#### 2. other tags
#### 3. multi-line html tag
+#### 4. extension tags
#### -----------------------------------------
!! test
1. a tags
4. extension tags
!! input
<nowiki><ref>foo</ref></nowiki>
+
+<nowiki><ref>bar</nowiki>
+
+baz<nowiki></ref></nowiki>
!! result
<p><ref>foo</ref>
+</p><p><ref>bar
+</p><p>baz</ref>
</p>
!! end
<td>b</td></tr></tbody></table>
!!end
+!!test
+Table in fosterable position
+!!options
+parsoid=wt2html,wt2wt
+!!input
+{{OpenTable}}
+<div>
+{|
+|}
+</div>
+|}
+!!result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"OpenTable","href":"./Template:OpenTable"},"params":{},"i":0}},"\n<div>"]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,19,null,null],"src":"{{OpenTable}}\n<div>","pi":[[]]}'></div><span about="#mwt1" data-parsoid="{}">
+</span>
+<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"dsr":[null,19,2,0]}'></table>
+
+<table data-parsoid='{"dsr":[20,25,2,2]}'>
+</table>
+!!end
+
# -----------------------------------------------------------------
# The following section of tests are primarily to spec requirements
# around serialization of new/edited content.
<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Wiki.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png" width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
!!end
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
!! test
Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
!! options
parsoid=html2wt
!! input
-
* foo
!! result
<ul>
</ul>
!! end
+!! test
+Lists: Serialize correctly even when list tags has unneeded whitespace between tags
+!! options
+parsoid=html2wt
+!! input
+* foo
+!! result
+<ul> <li>foo</li></ul>
+!! end
+
!! test
Don't strip leading whitespace when handling indent-pre suppressing tags
!! options
<div>foo</div>
<span>bar</span>
+
+<div>
+<span>foo</span>
+</div>
!! result
<p>foo</p>
<span>bar</span>
<div>foo</div>
<span>bar</span>
+
+<div>
+ <span>foo</span>
+</div>
!! end
-# Wacky -- the leading newline in input is required because
-# that is what the serializer emits. To be fixed. Not fixing
-# the test because this test is required to test serialization of
-# new content and preferred whitespace style.
!! test
Lists: Add space after bullets
!! options
parsoid=html2wt
!! input
-
* foo
* bar
* <span> baz</span>
</ul>
!! end
+!! test
+Headings: Add space before/after == (Bug 51744)
+!! options
+parsoid=html2wt
+!! input
+== foo ==
+
+== bar ==
+
+== baz ==
+
+== <span> baz</span> ==
+!! result
+<h2>foo</h2>
+<h2> bar</h2>
+<h2>baz </h2>
+<h2><span> baz</span></h2>
+!! end
+
!! test
Parsoid: Serialize positional parameters with = in them as named parameter
!! options
<p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
!! end
+#------------------------------------
+# End of I/B quote minimization tests
+#------------------------------------
+
!!test
-5. Bug 54262: New entities
+Bug 54262: New entities
!! options
parsoid=html2wt
!! input
<span typeof="mw:Entity">foo</span>
!! end
+## Note that there is no wikitext output for 'unknownproperty' ##
+## Unknown magic words are silently dropped ##
+
+!! test
+Magic words
+!! options
+parsoid=html2wt
+!! input
+__TOC__
+__NOTOC__
+__FORCETOC__
+__INDEX__
+__NOINDEX__
+__NOGALLERY__
+__NOEDITSECTION__
+__NOTITLECONVERT__
+__NOCONTENTCONVERT__
+!! result
+<meta property='mw:PageProp/toc' />
+<meta property='mw:PageProp/notoc' />
+<meta property='mw:PageProp/forcetoc' />
+<meta property='mw:PageProp/index' />
+<meta property='mw:PageProp/noindex' />
+<meta property='mw:PageProp/nogallery' />
+<meta property='mw:PageProp/noeditsection' />
+<meta property='mw:PageProp/notitleconvert' />
+<meta property='mw:PageProp/nocontentconvert' />
+<meta property='mw:PageProp/unknownproperty' />
+!! end
+
+!! test
+Consecutive <pre>s should not get merged
+!! options
+parsoid=html2wt,html2html
+!! input
+ a
+
+ b
+
+ c
+
+ d
+
+ e
+
+
+
+ f
+!! result
+<pre>a</pre><pre>b</pre>
+
+<pre>c
+</pre><pre>
+d</pre>
+
+<pre>e
+
+</pre><pre>
+
+f</pre>
+!! end
+
+!! test
+Edited ISBN links not serializable as ISBN links should serialize as wikilinks
+!! options
+parsoid=html2wt
+!! input
+[[Special:BookSources/1234567890|ISBN 1234567895]]
+!! result
+<a rel="mw:ExtLink" href="./Special:BookSources/1234567890">ISBN 1234567895</a>
+!! end
+
+!! test
+Edited RFC links not serializable as RFC links should serialize as extlinks
+!! options
+parsoid=html2wt
+!! input
+[//tools.ietf.org/html/rfc123 New RFC]
+!! result
+<a href="//tools.ietf.org/html/rfc123" rel="mw:ExtLink">New RFC</a>
+!! end
+
+!! test
+Edited PMID links not serializable as PMID links should serialize as extlinks
+!! options
+parsoid=html2wt
+!! input
+[//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract New PMID]
+!! result
+<a href="//www.ncbi.nlm.nih.gov/pubmed/123?dopt=Abstract" rel="mw:ExtLink">New PMID</a>
+!! end
+
# -----------------------------------------------------------------
# End of section for Parsoid-only html2wt tests for serialization
# of new content
--- /dev/null
+<?php
+
+class TestAutoloadedAliasedClassNew {
+}
--- /dev/null
+<?php
+
+/**
+ * @group HashRing
+ */
+class HashRingTest extends MediaWikiTestCase {
+ /**
+ * @covers HashRing
+ */
+ public function testHashRing() {
+ $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
+
+ $locations = array();
+ for ( $i = 0; $i < 20; $i++ ) {
+ $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
+ }
+ $expectedLocations = array(
+ "hello0" => "s5",
+ "hello1" => "s6",
+ "hello2" => "s2",
+ "hello3" => "s5",
+ "hello4" => "s6",
+ "hello5" => "s4",
+ "hello6" => "s5",
+ "hello7" => "s4",
+ "hello8" => "s5",
+ "hello9" => "s5",
+ "hello10" => "s3",
+ "hello11" => "s6",
+ "hello12" => "s1",
+ "hello13" => "s3",
+ "hello14" => "s3",
+ "hello15" => "s5",
+ "hello16" => "s4",
+ "hello17" => "s6",
+ "hello18" => "s6",
+ "hello19" => "s3"
+ );
+
+ $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+
+ $locations = array();
+ for ( $i = 0; $i < 5; $i++ ) {
+ $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
+ }
+
+ $expectedLocations = array(
+ "hello0" => array( "s5", "s6" ),
+ "hello1" => array( "s6", "s4" ),
+ "hello2" => array( "s2", "s1" ),
+ "hello3" => array( "s5", "s6" ),
+ "hello4" => array( "s6", "s4" ),
+ );
+ $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+ }
+}
+++ /dev/null
-<?php
-
-/**
- * @group HashRing
- */
-class HashRingTest extends MediaWikiTestCase {
- /**
- * @covers HashRing
- */
- public function testHashRing() {
- $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
-
- $locations = array();
- for ( $i = 0; $i < 20; $i++ ) {
- $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
- }
- $expectedLocations = array(
- "hello0" => "s5",
- "hello1" => "s6",
- "hello2" => "s2",
- "hello3" => "s5",
- "hello4" => "s6",
- "hello5" => "s4",
- "hello6" => "s5",
- "hello7" => "s4",
- "hello8" => "s5",
- "hello9" => "s5",
- "hello10" => "s3",
- "hello11" => "s6",
- "hello12" => "s1",
- "hello13" => "s3",
- "hello14" => "s3",
- "hello15" => "s5",
- "hello16" => "s4",
- "hello17" => "s6",
- "hello18" => "s6",
- "hello19" => "s3"
- );
-
- $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
-
- $locations = array();
- for ( $i = 0; $i < 5; $i++ ) {
- $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
- }
-
- $expectedLocations = array(
- "hello0" => array( "s5", "s6" ),
- "hello1" => array( "s6", "s4" ),
- "hello2" => array( "s2", "s1" ),
- "hello3" => array( "s5", "s6" ),
- "hello4" => array( "s6", "s4" ),
- );
- $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
- }
-}
}
if ( PHPUnit_Runner_Version::id() !== '@package_version@'
- && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' )
+ && version_compare( PHPUnit_Runner_Version::id(), '3.7.0', '<' )
) {
- die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+ die( 'PHPUnit 3.7.0 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
}
if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
'TestAutoloadedLocalClass' => __DIR__ . '/../data/autoloader/TestAutoloadedLocalClass.php',
'TestAutoloadedCamlClass' => __DIR__ . '/../data/autoloader/TestAutoloadedCamlClass.php',
'TestAutoloadedSerializedClass' => __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+ 'TestAutoloadedAliasedClass' => 'alias:TestAutoloadedAliasedClassNew',
+ 'TestAutoloadedAliasedClassDeprecated' => 'alias:TestAutoloadedAliasedClassNew?v=1.1',
+ 'TestAutoloadedAliasedClassNew' => __DIR__ . '/../data/autoloader/TestAutoloadedAliasedClassNew.php',
);
$this->setMwGlobals( 'wgAutoloadLocalClasses', $this->testLocalClasses + $wgAutoloadLocalClasses );
AutoLoader::resetAutoloadLocalClassesLower();
$expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
$actual = array();
- $files = array_unique( $expected );
+ // Check aliases
+ foreach ( $expected as $class => $file ) {
+ if ( substr( $file, 0, 6 ) !== 'alias:' ) {
+ // Not an alias, so should be an actual file
+ $files[] = $file;
+ } else {
+ $newClass = substr( $file, 6, strcspn( $file, '?', 6 ) );
+ if ( isset( $expected[$newClass] ) ) {
+ if ( substr( $expected[$newClass], 0, 6 ) !== 'alias:' ) {
+ // Alias pointing to an existing MediaWiki class
+ $actual[$class] = $file;
+ }
+ }
+ }
+ }
+
+ $files = array_unique( $files );
foreach ( $files as $file ) {
// Only prefix $IP if it doesn't have it already.
$this->assertFalse( $uncerealized instanceof __PHP_Incomplete_Class,
"unserialize() can load classes case-insensitively." );
}
+
+ function testAliasedClass() {
+ $this->assertSame( 'TestAutoloadedAliasedClassNew',
+ get_class( new TestAutoloadedAliasedClass ) );
+ }
+
+ function testAliasedClassDeprecated() {
+ wfSuppressWarnings();
+ $this->assertSame( 'TestAutoloadedAliasedClassNew',
+ get_class( new TestAutoloadedAliasedClassDeprecated ) );
+ wfRestoreWarnings();
+ }
}