"checkAnnotations": {
"preset": "jsduck5",
"extra": {
- "context": true,
- "source": true,
- "see": true,
- "private": true
+ "context": "some",
+ "source": "some",
+ "see": "some"
}
},
"checkParamNames": true,
rather than consume everything until the end of the page.
* New maintenance script resetUserEmail.php allows sysadmins to reset user emails in case
a user forgot password/account was stolen.
+* wfCheckEntropy() was removed (deprecated in 1.27).
== Compatibility ==
'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksDeletionUpdate.php',
'LinksUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
'ListDuplicatedFilesPage' => __DIR__ . '/includes/specials/SpecialListDuplicatedFiles.php',
+ 'ListToggle' => __DIR__ . '/includes/ListToggle.php',
'ListVariants' => __DIR__ . '/maintenance/language/listVariants.php',
'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
'LoadBalancer' => __DIR__ . '/includes/db/loadbalancer/LoadBalancer.php',
'WantedTemplatesPage' => __DIR__ . '/includes/specials/SpecialWantedtemplates.php',
'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php',
'WatchedItem' => __DIR__ . '/includes/WatchedItem.php',
+ 'WatchedItemStore' => __DIR__ . '/includes/WatchedItemStore.php',
'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php',
'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php',
'WebInstallerComplete' => __DIR__ . '/includes/installer/WebInstallerComplete.php',
"ext-iconv": "*",
"liuggio/statsd-php-client": "1.0.18",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.15.4",
+ "oojs/oojs-ui": "0.16.0",
"oyejorge/less.php": "1.7.0.10",
"php": ">=5.5.9",
"psr/log": "1.0.0",
"monolog/monolog": "~1.17.2",
"nikic/php-parser": "1.4.1",
"nmred/kafka-php": "0.1.5",
- "phpunit/phpunit": "3.7.37",
+ "phpunit/phpunit": "4.8.23",
"wikimedia/avro": "1.7.7"
},
"suggest": {
/**
* Whether to use PHP session handling ($_SESSION and session_*() functions)
+ *
+ * If the constant MW_NO_SESSION is defined, this is forced to 'disable'.
+ *
+ * If the constant MW_NO_SESSION_HANDLER is defined, this is ignored and PHP
+ * session handling will function independently of SessionHandler.
+ * SessionHandler and PHP's session handling may attempt to override each
+ * others' cookies.
+ *
* @since 1.27
* @var string
* - 'enable': Integrate with PHP's session handling as much as possible.
*/
$wgPHPSessionHandling = 'enable';
-/**
- * The number of different IPs in the same session within a period of $wgSuspiciousIpExpiry
- * that should cause warnings to be logged. This is meant more for debugging errors in the
- * authentication system than for detecting abuse.
- * @since 1.27
- */
-$wgSuspiciousIpPerSessionLimit = 2;
-
-/**
- * Like $wgSuspiciousIpPerSessionLimit but over all requests from the same user within
- * $wgSuspiciousIpExpiry, whether they are in the same session or not.
- * @since 1.27
- */
-$wgSuspiciousIpPerUserLimit = 5;
-
-/**
- * Time in seconds to remember IPs for, for the purposes of $wgSuspiciousIpPerSessionLimit and
- * $wgSuspiciousIpPerUserLimit.
- * @since 1.27
- */
-$wgSuspiciousIpExpiry = 600;
-
/**
* If enabled, will send MemCached debugging information to $wgDebugLogFile
*/
return Wikimedia\base_convert( $input, $sourceBase, $destBase, $pad, $lowercase, $engine );
}
-/**
- * Check if there is sufficient entropy in php's built-in session generation
- *
- * @deprecated since 1.27, PHP's session generation isn't used with
- * MediaWiki\\Session\\SessionManager
- * @return bool True = there is sufficient entropy
- */
-function wfCheckEntropy() {
- wfDeprecated( __FUNCTION__, '1.27' );
- return (
- ( wfIsWindows() && version_compare( PHP_VERSION, '5.3.3', '>=' ) )
- || ini_get( 'session.entropy_file' )
- )
- && intval( ini_get( 'session.entropy_length' ) ) >= 32;
-}
-
/**
* @deprecated since 1.27, PHP's session generation isn't used with
* MediaWiki\\Session\\SessionManager
function wfSetupSession( $sessionId = false ) {
wfDeprecated( __FUNCTION__, '1.27' );
- // If they're calling this, they probably want our session management even
- // if NO_SESSION was set for Setup.php.
- if ( !MediaWiki\Session\PHPSessionHandler::isInstalled() ) {
- MediaWiki\Session\PHPSessionHandler::install( SessionManager::singleton() );
- }
-
if ( $sessionId ) {
session_id( $sessionId );
}
interface LinkTarget {
/**
- * Get the namespace index
+ * Get the namespace index.
*
* @return int Namespace index
*/
public function getNamespace();
/**
- * Get the link fragment (i.e.\ the bit after the #) in text form
+ * Get the link fragment (i.e. the bit after the #) in text form.
*
* @return string link fragment
*/
public function getFragment();
/**
- * Get the main part with underscores
+ * Get the main part with underscores.
*
- * @return string Main part of the link, with underscores (for use in hrf attributes)
+ * @return string Main part of the link, with underscores (for use in href attributes)
*/
public function getDBkey();
/**
- * Returns the link in text form,
- * without namespace prefix or fragment.
+ * Returns the link in text form, without namespace prefix or fragment.
*
* This is computed from the DB key by replacing any underscores with spaces.
*
--- /dev/null
+<?php
+/**
+ * Class for generating clickable toggle links for a list of checkboxes.
+ *
+ * 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
+ */
+
+/**
+ * Class for generating clickable toggle links for a list of checkboxes.
+ *
+ * This is only supported on clients that have JavaScript enabled; it is hidden
+ * for clients that have it disabled.
+ *
+ * @since 1.27
+ */
+class ListToggle {
+ /** @var OutputPage */
+ private $output;
+
+ public function __construct( OutputPage $output ) {
+ $this->output = $output;
+
+ $output->addModules( 'mediawiki.checkboxtoggle' );
+ $output->addModuleStyles( 'mediawiki.checkboxtoggle.styles' );
+ }
+
+ private function checkboxLink( $checkboxType ) {
+ return Html::element(
+ 'a', [ 'href' => '#', 'class' => 'mw-checkbox-' . $checkboxType ],
+ $this->output->msg( 'checkbox-' . $checkboxType )->text()
+ );
+ }
+
+ /**
+ * @return string
+ */
+ public function getHTML() {
+ // Select: All, None, Invert
+ $links = [
+ $this->checkboxLink( 'all' ),
+ $this->checkboxLink( 'none' ),
+ $this->checkboxLink( 'invert' ),
+ ];
+
+ return Html::rawElement( 'div',
+ [
+ 'class' => 'mw-checkbox-toggle-controls'
+ ],
+ $this->output->msg( 'checkbox-select' )
+ ->rawParams( $this->output->getLanguage()->commaList( $links ) )->escaped()
+ );
+ }
+}
/**
* Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg:
- * $foo = Message::get( $key );
+ * $foo = new Message( $key );
* $string = "<abbr>$foo</abbr>";
*
* @since 1.18
*/
public static function transformResourcePath( Config $config, $path ) {
global $IP;
- $remotePath = $config->get( 'ResourceBasePath' );
+ $remotePathPrefix = $config->get( 'ResourceBasePath' );
+ if ( $remotePathPrefix === '' ) {
+ // The configured base path is required to be empty string for
+ // wikis in the domain root
+ $remotePath = '/';
+ } else {
+ $remotePath = $remotePathPrefix;
+ }
if ( strpos( $path, $remotePath ) !== 0 ) {
// Path is outside wgResourceBasePath, ignore.
return $path;
}
$path = RelPath\getRelativePath( $path, $remotePath );
- return self::transformFilePath( $remotePath, $IP, $path );
+ return self::transformFilePath( $remotePathPrefix, $IP, $path );
}
/**
* Caller is responsible for ensuring the file exists. Emits a PHP warning otherwise.
*
* @since 1.27
- * @param string $remotePath URL path that points to $localPath
+ * @param string $remotePath URL path prefix that points to $localPath
* @param string $localPath File directory exposed at $remotePath
* @param string $file Path to target file relative to $localPath
* @return string URL
*/
- public static function transformFilePath( $remotePath, $localPath, $file ) {
+ public static function transformFilePath( $remotePathPrefix, $localPath, $file ) {
$hash = md5_file( "$localPath/$file" );
if ( $hash === false ) {
wfLogWarning( __METHOD__ . ": Failed to hash $localPath/$file" );
$hash = '';
}
- return "$remotePath/$file?" . substr( $hash, 0, 5 );
+ return "$remotePathPrefix/$file?" . substr( $hash, 0, 5 );
}
/**
) {
$wgPHPSessionHandling = 'warn';
}
+if ( defined( 'MW_NO_SESSION' ) ) {
+ // If the entry point wants no session, force 'disable' here unless they
+ // specifically set it to the (undocumented) 'warn'.
+ $wgPHPSessionHandling = MW_NO_SESSION === 'warn' ? 'warn' : 'disable';
+}
Profiler::instance()->scopedProfileOut( $ps_default );
session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
}
- // Create the SessionManager singleton and set up our session handler
- MediaWiki\Session\PHPSessionHandler::install(
- MediaWiki\Session\SessionManager::singleton()
- );
+ // Create the SessionManager singleton and set up our session handler,
+ // unless we're specifically asked not to.
+ if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
+ MediaWiki\Session\PHPSessionHandler::install(
+ MediaWiki\Session\SessionManager::singleton()
+ );
+ }
// Initialize the session
try {
session_id( $session->getId() );
MediaWiki\quietCall( 'session_start' );
}
+
+ unset( $session );
+} else {
+ // Even if we didn't set up a global Session, still install our session
+ // handler unless specifically requested not to.
+ if ( !defined( 'MW_NO_SESSION_HANDLER' ) ) {
+ MediaWiki\Session\PHPSessionHandler::install(
+ MediaWiki\Session\SessionManager::singleton()
+ );
+ }
}
Profiler::instance()->scopedProfileOut( $ps_session );
wfDebug( "Fully initialised\n" );
$wgFullyInitialised = true;
-// T125455
-if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
- MediaWiki\Session\SessionManager::singleton()->checkIpLimits();
-}
-
Profiler::instance()->scopedProfileOut( $ps_extensions );
Profiler::instance()->scopedProfileOut( $ps_setup );
}
/**
- * Check if the given title already is watched by the user, and if so
- * add watches on a new title. To be used for page renames and such.
+ * @deprecated since 1.27. See WatchedItemStore::duplicateEntry
*
- * @param Title $ot Page title to duplicate entries from, if present
- * @param Title $nt Page title to add watches on
+ * @param Title $oldTitle
+ * @param Title $newTitle
*/
- public static function duplicateEntries( $ot, $nt ) {
- WatchedItem::doDuplicateEntries( $ot->getSubjectPage(), $nt->getSubjectPage() );
- WatchedItem::doDuplicateEntries( $ot->getTalkPage(), $nt->getTalkPage() );
+ public static function duplicateEntries( Title $oldTitle, Title $newTitle ) {
+ $store = WatchedItemStore::getDefaultInstance();
+ $store->duplicateEntry( $oldTitle->getSubjectPage(), $newTitle->getSubjectPage() );
+ $store->duplicateEntry( $oldTitle->getTalkPage(), $newTitle->getTalkPage() );
}
- /**
- * Handle duplicate entries. Backend for duplicateEntries().
- *
- * @param Title $ot
- * @param Title $nt
- *
- * @return bool
- */
- private static function doDuplicateEntries( $ot, $nt ) {
- $oldnamespace = $ot->getNamespace();
- $newnamespace = $nt->getNamespace();
- $oldtitle = $ot->getDBkey();
- $newtitle = $nt->getDBkey();
-
- $dbw = wfGetDB( DB_MASTER );
- $res = $dbw->select( 'watchlist',
- [ 'wl_user', 'wl_notificationtimestamp' ],
- [ 'wl_namespace' => $oldnamespace, 'wl_title' => $oldtitle ],
- __METHOD__, 'FOR UPDATE'
- );
- # Construct array to replace into the watchlist
- $values = [];
- foreach ( $res as $s ) {
- $values[] = [
- 'wl_user' => $s->wl_user,
- 'wl_namespace' => $newnamespace,
- 'wl_title' => $newtitle,
- 'wl_notificationtimestamp' => $s->wl_notificationtimestamp,
- ];
- }
-
- if ( empty( $values ) ) {
- // Nothing to do
- return true;
- }
-
- # Perform replace
- # Note that multi-row replace is very efficient for MySQL but may be inefficient for
- # some other DBMSes, mostly due to poor simulation by us
- $dbw->replace(
- 'watchlist',
- [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
- $values,
- __METHOD__
- );
-
- return true;
- }
}
--- /dev/null
+<?php
+
+/**
+ * Storage layer class for WatchedItems.
+ * Database interaction
+ *
+ * @author Addshore
+ *
+ * @since 1.27
+ */
+class WatchedItemStore {
+
+ /**
+ * @var LoadBalancer
+ */
+ private $loadBalancer;
+
+ public function __construct( LoadBalancer $loadBalancer ) {
+ $this->loadBalancer = $loadBalancer;
+ }
+
+ /**
+ * @return self
+ */
+ public static function getDefaultInstance() {
+ static $instance;
+ if ( !$instance ) {
+ $instance = new self( wfGetLB() );
+ }
+ return $instance;
+ }
+
+ /**
+ * Check if the given title already is watched by the user, and if so
+ * add a watch for the new title.
+ *
+ * To be used for page renames and such.
+ * This must be called separately for Subject and Talk pages
+ *
+ * @param LinkTarget $oldTarget
+ * @param LinkTarget $newTarget
+ */
+ public function duplicateEntry( LinkTarget $oldTarget, LinkTarget $newTarget ) {
+ $dbw = $this->loadBalancer->getConnection( DB_MASTER, [ 'watchlist' ] );
+
+ $result = $dbw->select(
+ 'watchlist',
+ [ 'wl_user', 'wl_notificationtimestamp' ],
+ [
+ 'wl_namespace' => $oldTarget->getNamespace(),
+ 'wl_title' => $oldTarget->getDBkey(),
+ ],
+ __METHOD__,
+ [ 'FOR UPDATE' ]
+ );
+
+ $newNamespace = $newTarget->getNamespace();
+ $newDBkey = $newTarget->getDBkey();
+
+ # Construct array to replace into the watchlist
+ $values = [];
+ foreach ( $result as $row ) {
+ $values[] = [
+ 'wl_user' => $row->wl_user,
+ 'wl_namespace' => $newNamespace,
+ 'wl_title' => $newDBkey,
+ 'wl_notificationtimestamp' => $row->wl_notificationtimestamp,
+ ];
+ }
+
+ if ( !empty( $values ) ) {
+ # Perform replace
+ # Note that multi-row replace is very efficient for MySQL but may be inefficient for
+ # some other DBMSes, mostly due to poor simulation by us
+ $dbw->replace(
+ 'watchlist',
+ [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
+ $values,
+ __METHOD__
+ );
+ }
+
+ $this->loadBalancer->reuseConnection( $dbw );
+ }
+
+}
$this->buttons .= Xml::tags( 'div', [ 'class' =>
'mw-history-revisionactions' ], $actionButtons );
}
+
+ if ( $user->isAllowed( 'deleterevision' ) || $this->showTagEditUI ) {
+ $this->buttons .= ( new ListToggle( $this->getOutput() ) )->getHTML();
+ }
+
$this->buttons .= '</div>';
$s .= $this->buttons;
"Red Winged Duck"
]
},
- "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Дакумэнтацыя]]\n* [[mw:API:FAQ|Частыя пытаньні]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым значэньне загалоўку і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце [[mw:API:Errors_and_warnings|API: Памылкі і папярэджаньні]].",
+ "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Дакумэнтацыя]]\n* [[mw:API:FAQ|Частыя пытаньні]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым значэньне загалоўку і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце [[mw:API:Errors_and_warnings|API: Памылкі і папярэджаньні]].\n\n<strong>Тэставаньне:</strong> для зручнасьці праверкі API-запытаў, глядзіце [[Special:ApiSandbox]].",
"apihelp-main-param-action": "Дзеяньне для выкананьня.",
"apihelp-main-param-format": "Фармат вываду.",
"apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі <samp>maxlag</samp> з паведамленьнем кшталту <samp>Чаканьне $host: $lag сэкундаў затрымкі</samp>.<br />Глядзіце [[mw:Manual:Maxlag_parameter|Інструкцыя:Парамэтар maxlag]] дзеля дадатковай інфармацыі.",
"apihelp-createaccount-param-reason": "Raggiona, a facoltativa, d' 'a criaziona 'e nu cunto a mpizzà int' 'e reggistre.",
"apihelp-createaccount-param-language": "Codece 'e llengua a mpustà comme predefinita pe' n'utente (opzionale, 'e default fosse 'a lengue d' 'e cuntenute).",
"apihelp-delete-description": "Scancella 'na paggena.",
+ "apihelp-edit-param-prependtext": "Azzecca stu testo addò 'o cap' 'e paggena. Se mettesse ncuoll'a $1text.",
+ "apihelp-edit-param-appendtext": "Azzecca stu testo addò 'o cap' 'e paggena. Se mettesse ncuoll'a $1text.\n\nAusate $1section=new pe' ne puté appennere na seziona nova, ato che ausà stu parammetro.",
+ "apihelp-edit-param-undo": "Torna arrèto sta verziona. Miette ncuollo 'o $1text, $1prependtext e $1appendtext.",
+ "apihelp-edit-param-undoafter": "Torna arreto tuttuquante verziune 'e $1undo a cchesta. Si chesto nun fosse mpustato, avit'a ffà surtanto turnà arreto na verziona.",
+ "apihelp-edit-param-redirect": "Risolve automaticamente 'e redirect.",
+ "apihelp-edit-param-contentformat": "Serializaziona 'e furmatt' 'e cuntenute ausata p' 'o testo trasuto.",
+ "apihelp-edit-param-contentmodel": "Mudell' 'e cuntenute d' 'e cuntenute nuove nuove.",
+ "apihelp-edit-param-token": "'O token s'avess'a mannà sempe comm'a ll'urdemo parammetro, o minimo minimo aropp'a 'o parammetro 'e $1text.",
"apihelp-edit-example-edit": "Cagna paggena.",
+ "apihelp-edit-example-prepend": "Pre-appenne <kbd>__NOTOC__</kbd> a na paggena.",
+ "apihelp-edit-example-undo": "Torna arreto 'e verziune 13579 nfin'a 13585 cu n'autosommario.",
"apihelp-emailuser-description": "E-mail a n'utente.",
+ "apihelp-emailuser-param-target": "Utente a 'e quale s'avess'a mannà na mmasciata mail.",
+ "apihelp-emailuser-param-subject": "Oggetto d' 'a mail.",
+ "apihelp-emailuser-param-text": "Testo d' 'a mail.",
+ "apihelp-emailuser-param-ccme": "Manna na copia 'e sta mail a mme.",
+ "apihelp-emailuser-example-email": "Manna na e-mail a ll'utente <kbd>WikiSysop</kbd> c' 'o testo <kbd>Content</kbd>.",
+ "apihelp-expandtemplates-description": "Spannere tuttuquante 'e template dint' 'o wikitesto.",
+ "apihelp-expandtemplates-param-title": "Titolo d' 'a paggena.",
+ "apihelp-expandtemplates-param-text": "Wikitesto 'a scagnà/convertire.",
+ "apihelp-expandtemplates-param-revid": "ID 'e cagnamento, pe' <nowiki>{{REVISIONID}}</nowiki> e variabbele ca s'assummigliassero.",
+ "apihelp-expandtemplates-param-prop": "Quale nfurmaziune s'avess'a piglià.\n\nTenite a mmente ca nun s'è scigliuto valore nisciuno, 'o risultato cuntenesse 'o codice wiki, ma l'output sarrà fatto comm'a nu furmato obsoleto.",
+ "apihelp-expandtemplates-paramvalue-prop-wikitext": "'O wikitext spannuto.",
+ "apihelp-expandtemplates-paramvalue-prop-categories": "Ogne categurìa prisente int'a 'o valore 'e trasuta nun fosse rappresentato comm'asciuta 'e wikitesto.",
+ "apihelp-expandtemplates-paramvalue-prop-properties": "'E pruprietà 'e pagena definite p' 'e parole magiche spannute dint' 'o wikitesto.",
+ "apihelp-expandtemplates-paramvalue-prop-volatile": "Si l'output fosse volatile e nun s'avess'ausà n'atavota addò servesse dint' 'a paggena.",
+ "apihelp-expandtemplates-paramvalue-prop-ttl": "'O tiempo massimo aropp' 'o quale 'e caches d' 'o risultato s'avessero a nzegnà invalide.",
"apihelp-feedwatchlist-param-feedformat": "'O furmato d' 'o feed.",
"apihelp-login-example-login": "Tràse.",
"apihelp-move-description": "Mòve paggena.",
"apihelp-expandtemplates-paramvalue-prop-parsetree": "Cây phân tích XML của đầu vào.",
"apihelp-feedcontributions-description": "Trả về nguồn cấp đóng góp người dùng.",
"apihelp-feedcontributions-param-feedformat": "Định dạng nguồn cấp.",
+ "apihelp-feedcontributions-param-user": "Người dùng nhận được những đóng góp gì.",
"apihelp-feedcontributions-param-year": "Từ năm (trở về trước).",
"apihelp-feedcontributions-param-month": "Từ tháng (trở về trước).",
"apihelp-feedcontributions-param-deletedonly": "Chỉ hiện các đóng góp đã xóa.",
"apihelp-feedcontributions-example-simple": "Trả về các đóng góp của người dùng <kbd>Ví dụ</kbd>.",
"apihelp-feedrecentchanges-description": "Trả về nguồn cấp thay đổi gần đây.",
"apihelp-feedrecentchanges-param-feedformat": "Định dạng nguồn cấp.",
+ "apihelp-feedrecentchanges-param-days": "Ngày để giới hạn kết quả.",
+ "apihelp-feedrecentchanges-param-limit": "Số kết quả lớn nhất để cho ra.",
"apihelp-feedrecentchanges-param-hideminor": "Ẩn thay đổi nhỏ.",
"apihelp-feedrecentchanges-param-hidebots": "Ẩn thay đổi do bot thực hiện.",
"apihelp-feedrecentchanges-param-hideanons": "Ẩn thay đổi do người dùng vô danh thực hiện.",
"apihelp-feedrecentchanges-param-hidemyself": "Ẩn thay đổi do người dùng hiện tại thực hiện.",
"apihelp-feedrecentchanges-param-tagfilter": "Lọc theo thẻ.",
"apihelp-feedrecentchanges-example-simple": "Xem thay đổi gần đây.",
+ "apihelp-feedrecentchanges-example-30days": "Hiển thị các thay đổi trong 30 ngày gần đây.",
"apihelp-feedwatchlist-description": "Trả về nguồn cấp danh sách theo dõi.",
"apihelp-feedwatchlist-param-feedformat": "Định dạng nguồn cấp.",
"apihelp-feedwatchlist-example-default": "Xem nguồn cấp danh sách theo dõi.",
+ "apihelp-filerevert-description": "Phục hồi một tập tin sang một phiên bản cũ.",
"apihelp-filerevert-param-comment": "Tải lên bình luận.",
"apihelp-filerevert-param-archivename": "Tên lưu trữ của bản sửa đổi để trở lại .",
"apihelp-filerevert-example-revert": "Hoàn nguyên <kbd>Wiki.png</kbd> veef phiên bản <kbd>2011-03-05T15:27:40Z</kbd>.",
"apihelp-help-description": "Hiển thị trợ giúp cho các mô-đun xác định.",
"apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.",
+ "apihelp-help-example-main": "Trợ giúp cho các mô-đun chính.",
"apihelp-help-example-recursive": "Tất cả trợ giúp trong một trang",
"apihelp-help-example-help": "Trợ giúp cho chính bản thân module trợ giúp",
"apihelp-help-example-query": "Trợ giúp cho hai module con truy vấn",
"apihelp-imagerotate-param-rotation": "Độ xoay hình ảnh theo chiều kim đồng hồ.",
"apihelp-imagerotate-example-simple": "Xoay <kbd>Tập tin:Ví dụ.jpg</kbd> <kbd>90</kbd> độ.",
"apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong <kbd>Thể loại:Búng</kbd> <kbd>180</kbd> độ.",
+ "apihelp-import-param-interwikisource": "Dành cho các nhập khẩu interwiki: wiki để nhập từ.",
"apihelp-login-param-name": "Tên người dùng.",
"apihelp-login-param-password": "Mật khẩu.",
"apihelp-login-param-domain": "Tên miền (tùy chọn).",
*
* @since 1.21
*
- * @param bool $hasLinks If it is known whether this content contains
+ * @param bool|null $hasLinks If it is known whether this content contains
* links, provide this information here, to avoid redundant parsing to
* find out.
*
*/
protected function rootValueTable( $val ) {
if ( is_object( $val ) ) {
- return self::objectTable( $val );
+ return $this->objectTable( $val );
}
if ( is_array( $val ) ) {
// Wrap arrays in another array so that they're visually boxed in a container.
// Otherwise they are visually indistinguishable from a single value.
- return self::arrayTable( [ $val ] );
+ return $this->arrayTable( [ $val ] );
}
return Html::rawElement( 'table', [ 'class' => 'mw-json mw-json-single-value' ],
Html::rawElement( 'tbody', [],
Html::rawElement( 'tr', [],
- Html::element( 'td', [], self::primitiveValue( $val ) )
+ Html::element( 'td', [], $this->primitiveValue( $val ) )
)
)
);
*/
protected function objectRow( $key, $val ) {
$th = Html::element( 'th', [], $key );
- $td = self::valueCell( $val );
+ $td = $this->valueCell( $val );
return Html::rawElement( 'tr', [], $th . $td );
}
* @return string HTML.
*/
protected function arrayRow( $val ) {
- $td = self::valueCell( $val );
+ $td = $this->valueCell( $val );
return Html::rawElement( 'tr', [], $td );
}
*/
protected function valueCell( $val ) {
if ( is_object( $val ) ) {
- return Html::rawElement( 'td', [], self::objectTable( $val ) );
+ return Html::rawElement( 'td', [], $this->objectTable( $val ) );
}
if ( is_array( $val ) ) {
- return Html::rawElement( 'td', [], self::arrayTable( $val ) );
+ return Html::rawElement( 'td', [], $this->arrayTable( $val ) );
}
- return Html::element( 'td', [ 'class' => 'value' ], self::primitiveValue( $val ) );
+ return Html::element( 'td', [ 'class' => 'value' ], $this->primitiveValue( $val ) );
}
/**
}
/**
- * @param bool $hasLinks
+ * @param bool|null $hasLinks
*
* @return bool Always false.
*
* Returns true if this content is not a redirect, and $wgArticleCountMethod
* is "any".
*
- * @param bool $hasLinks If it is known whether this content contains links,
+ * @param bool|null $hasLinks If it is known whether this content contains links,
* provide this information here, to avoid redundant parsing to find out.
*
* @return bool
* Returns true if this content is not a redirect, and this content's text
* is countable according to the criteria defined by $wgArticleCountMethod.
*
- * @param bool $hasLinks If it is known whether this content contains
+ * @param bool|null $hasLinks If it is known whether this content contains
* links, provide this information here, to avoid redundant parsing to
* find out (default: null).
- * @param Title $title Optional title, defaults to the title from the current main request.
+ * @param Title|null $title Optional title, defaults to the title from the current main request.
*
* @return bool
*/
* @param string $fname
* @param string $flush Flush flag, set to 'flush' to disable warnings about
* explicitly committing implicit transactions, or calling commit when no
- * transaction is in progress. This will silently break any ongoing
- * explicit transaction. Only set the flush flag if you are sure that it
- * is safe to ignore these warnings in your context.
+ * transaction is in progress.
+ *
+ * This will trigger an exception if there is an ongoing explicit transaction.
+ *
+ * Only set the flush flag if you are sure that these warnings are not applicable,
+ * and no explicit transactions are open.
+ *
* @throws DBUnexpectedError
*/
public function commit( $fname = __METHOD__, $flush = '' );
* Override the necessary bits of the config to run an installation.
*/
public static function overrideConfig() {
- define( 'MW_NO_SESSION', 1 );
+ // Use PHP's built-in session handling, since MediaWiki's
+ // SessionHandler can't work before we have an object cache set up.
+ define( 'MW_NO_SESSION_HANDLER', 1 );
// Don't access the database
$GLOBALS['wgUseDatabaseMessages'] = false;
// Some of the environment checks make shell requests, remove limits
$GLOBALS['wgMaxShellMemory'] = 0;
+ // Override the default CookieSessionProvider with a dummy
+ // implementation that won't stomp on PHP's cookies.
$GLOBALS['wgSessionProviders'] = [
[
'class' => 'InstallerSessionProvider',
] ]
]
];
+
+ // Don't try to use any object cache for SessionManager either.
+ $GLOBALS['wgSessionCacheType'] = CACHE_NONE;
}
/**
"Revi",
"Alex00728",
"Hwangjy9",
- "Macofe"
+ "Macofe",
+ "Mooozi"
]
},
"config-desc": "미디어위키를 위한 설치 관리자",
"config-localsettings-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면, 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력하세요.\n<code>LocalSettings.php</code>에서 찾을 수 있습니다.",
"config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> 파일을 감지했습니다.\n이 설치를 업그레이드하려면 <code>update.php</code>를 대신 실행하세요",
"config-localsettings-key": "업그레이드 키:",
- "config-localsettings-badkey": "ì \9cê³µí\95\9c í\82¤ê°\80 ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.",
+ "config-localsettings-badkey": "ì\97\85ê·¸ë \88ì\9d´ë\93\9c í\82¤ê°\80 ì\9e\98못ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.",
"config-upgrade-key-missing": "미디어위키의 기존 설치를 감지했습니다.\n이 설치를 업그레이드하려면, <code>LocalSettings.php</code>의 아래에 다음 줄을 넣으세요:\n\n$1",
"config-localsettings-incomplete": "기존 <code>LocalSettings.php</code>가 완전하지 않은 것 같습니다.\n$1 변수가 설정되어 있지 않습니다.\n이 변수가 설정되도록 <code>LocalSettings.php</code>를 바꾸고 \"{{int:Config-continue}}\"을 클릭하세요.",
"config-localsettings-connection-error": "<code>LocalSettings.php</code>에 지정한 설정을 사용하여 데이터베이스에 연결할 때 오류가 발생했습니다. 이러한 설정을 고치고 다시 시도하세요.\n\n$1",
"config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 <code>./configure --with-mysql</code>을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 <code>php5-mysql</code> 모듈도 설치해야 합니다.",
"config-outdated-sqlite": "<strong>경고:</strong> 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.",
"config-no-fts3": "<strong>경고:</strong> SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.",
- "config-register-globals-error": "<strong>오류: PHP의 <code>[http://php.net/register_globals register_globals]</code> 옵션이 활성화되어 있습니다.\n설치를 계속하려면 비활성화해야 합니다.</strong>\n어떻게 하는지에 대한 도움말에 대해서는 [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals]를 보세요.",
- "config-magic-quotes-gpc": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
- "config-magic-quotes-runtime": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상이 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
- "config-magic-quotes-sybase": "<strong>치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]이 활성화되어 있습니다!</strong>\n이 옵션은 데이터를 입력하는 데 예기치 않는 손상을 일으킵니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
"config-mbstring": "<strong>치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화되어 있습니다!</strong>\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.",
- "config-safe-mode": "<strong>경고:</strong> PHP의 [http://www.php.net/features.safe-mode 안전 모드]가 활성화되어 있습니다!\n특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
"config-xml-bad": "PHP의 XML 모듈이 없습니다.\n미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.\nphp-xml 패키지를 설치해야할 수도 있습니다.",
"config-pcre-old": "<strong>치명:</strong> PCRE $1 또는 그 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].",
"config-pcre-no-utf8": "<strong>치명:</strong> PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.",
{
"@metadata": {
"authors": [
- "HalanTul"
+ "HalanTul",
+ "Мария Олесова"
]
},
"config-desc": "MediaWiki инсталлятора",
"config-title": "MediaWiki $1 туруоруу",
"config-information": "Бу туһунан",
+ "config-localsettings-key": "Саҥатытыы күлүүһэ:",
+ "config-localsettings-badkey": "Саҥатытыыга сыыһа күлүүһү ыйдыҥ.",
+ "config-your-language-help": "Туруоруу кэмигэр туттуллар тылы тал.",
+ "config-wiki-language": "Биики туттуохтаах тыла:",
+ "config-back": "← Төттөрү",
+ "config-continue": "Салгыы →",
+ "config-page-language": "Тыла",
+ "config-page-dbconnect": "Билии олоҕор холбонуу",
+ "config-page-upgrade": "Баар туруорууну саҥатытыы",
+ "config-page-dbsettings": "Билии олоҕун бэлэмнээһин",
+ "config-page-name": "Аат",
+ "config-page-options": "Туруоруулар",
+ "config-page-install": "Туруоруу",
+ "config-page-complete": "Бэлэм!",
+ "config-page-restart": "Туруорууну саҥаттан саҕалыырга",
+ "config-page-upgradedoc": "Саҥатытыы",
+ "config-page-existingwiki": "Баар биики",
+ "config-help-restart": "Харайыллыбыт көрдөрүүлэри сотуоххун уонна туруоруу кэмин саҥаттан ыытыаххын баҕараҕын дуо?",
+ "config-restart": "Сөп, саҥаттан саҕалыырга",
+ "config-env-good": "Тас кэккэ бэрэбиэркэтэ ситиһиилээхтик ыытылынна. \nMediaWiki туруоруоххун сөп.",
+ "config-db-type": "Билии олоҕун көрүҥэ:",
+ "config-db-wiki-settings": "Бу биики тэҥнэбилэ",
+ "config-db-name": "Билии олоҕун көрүҥэ:",
+ "config-db-name-oracle": "Билии олоҕун исхиэмэтэ:",
+ "config-db-install-account": "Туруорууга учуоттуур суруйуу",
+ "config-db-username": "Билии олоҕун көрүҥэ:",
"mainpagetext": "'''«MediaWiki» сөпкө туруорулунна.'''",
"mainpagedocfooter": "Биики программатын туһунан [//meta.wikimedia.org/wiki/Help:Contents справочникка] көрүөххүн сөп.\n\n== Саҕаланыыта ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Конфигурация уларытыытын параметрдара]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]"
}
protected function doGet( $key, $flags = 0 ) {
$ret = parent::doGet( $key, $flags );
- if ( $ret === false ) {
+ if ( $ret === false && !$this->hasKey( $key ) ) {
$ret = $this->backend->doGet( $key, $flags );
- if ( $ret !== false ) {
- $this->set( $key, $ret, 0, self::WRITE_CACHE_ONLY );
- }
+ $this->set( $key, $ret, 0, self::WRITE_CACHE_ONLY );
}
return $ret;
}
return true;
}
+ /**
+ * Does this bag have a non-null value for the given key?
+ *
+ * @param string $key
+ * @return bool
+ * @since 1.27
+ */
+ protected function hasKey( $key ) {
+ return isset( $this->bag[$key] );
+ }
+
protected function doGet( $key, $flags = 0 ) {
- if ( !isset( $this->bag[$key] ) ) {
+ if ( !$this->hasKey( $key ) ) {
return false;
}
$key = parent::getMessageKey();
if ( in_array( $this->entry->getSubtype(), [ 'event', 'revision' ] ) ) {
if ( count( $this->getMessageParameters() ) < 5 ) {
+ // Messages: logentry-delete-event-legacy, logentry-delete-revision-legacy,
+ // logentry-suppress-event-legacy, logentry-suppress-revision-legacy
return "$key-legacy";
}
}
$key = parent::getMessageKey();
$params = $this->getMessageParameters();
if ( isset( $params[5] ) && $params[5] ) {
+ // Messages: logentry-patrol-patrol-auto
$key .= '-auto';
}
$key = parent::getMessageKey();
$params = $this->getMessageParameters();
if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+ // Messages: logentry-rights-rights-legacy
$key .= '-legacy';
}
$key .= ( $remove ? ( $add ? '' : '-remove' ) : '-add' );
if ( isset( $params[3] ) && $params[3] ) {
+ // Messages: logentry-tag-update-add-revision, logentry-tag-update-remove-revision,
+ // logentry-tag-update-revision
$key .= '-revision';
} else {
+ // Messages: logentry-tag-update-add-logentry, logentry-tag-update-remove-logentry,
+ // logentry-tag-update-logentry
$key .= '-logentry';
}
/**
* Send mail using a PEAR mailer
*
- * @param UserMailer $mailer
+ * @param Mail_smtp $mailer
* @param string $dest
* @param string $headers
* @param string $body
*/
public static function send( $to, $from, $subject, $body, $options = [] ) {
global $wgAllowHTMLEmail;
- $contentType = 'text/plain; charset=UTF-8';
+
if ( !is_array( $options ) ) {
// Old calling style
wfDeprecated( __METHOD__ . ' with $replyto as 5th parameter', '1.26' );
$options['contentType'] = func_get_arg( 5 );
}
}
+ if ( !isset( $options['contentType'] ) ) {
+ $options['contentType'] = 'text/plain; charset=UTF-8';
+ }
if ( !is_array( $to ) ) {
$to = [ $to ];
$body = str_replace( "\n", "\r\n", $body );
}
$headers['MIME-Version'] = '1.0';
- $headers['Content-type'] = ( is_null( $contentType ) ?
- 'text/plain; charset=UTF-8' : $contentType );
+ $headers['Content-type'] = $contentType;
$headers['Content-transfer-encoding'] = '8bit';
}
* @param File $file
* @return bool
*/
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return true;
}
return $scaler;
}
- function makeParamString( $params ) {
+ public function makeParamString( $params ) {
$res = parent::makeParamString( $params );
if ( isset( $params['interlace'] ) && $params['interlace'] ) {
return "interlaced-{$res}";
}
}
- function parseParamString( $str ) {
+ public function parseParamString( $str ) {
$remainder = preg_replace( '/^interlaced-/', '', $str );
$params = parent::parseParamString( $remainder );
if ( $params === false ) {
return $params;
}
- function validateParam( $name, $value ) {
+ public function validateParam( $name, $value ) {
if ( $name === 'interlace' ) {
return $value === false || $value === true;
} else {
* @param File $file
* @return bool
*/
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return true;
}
* @param File $file
* @return bool
*/
- function isMultiPage( $file ) {
+ public function isMultiPage( $file ) {
return true;
}
/**
* @return array
*/
- function getParamMap() {
+ public function getParamMap() {
return [
'img_width' => 'width',
'img_page' => 'page',
* @param mixed $value
* @return bool
*/
- function validateParam( $name, $value ) {
+ public function validateParam( $name, $value ) {
if ( $name === 'page' && trim( $value ) !== (string)intval( $value ) ) {
// Extra junk on the end of page, probably actually a caption
// e.g. [[File:Foo.djvu|thumb|Page 3 of the document shows foo]]
* @param array $params
* @return bool|string
*/
- function makeParamString( $params ) {
+ public function makeParamString( $params ) {
$page = isset( $params['page'] ) ? $params['page'] : 1;
if ( !isset( $params['width'] ) ) {
return false;
* @param string $str
* @return array|bool
*/
- function parseParamString( $str ) {
+ public function parseParamString( $str ) {
$m = false;
if ( preg_match( '/^page(\d+)-(\d+)px$/', $str, $m ) ) {
return [ 'width' => $m[2], 'page' => $m[1] ];
* @param File $file
* @return bool
*/
- function canRender( $file ) {
+ public function canRender( $file ) {
return ( $file->getWidth() && $file->getHeight() );
}
- function getParamMap() {
+ public function getParamMap() {
return [ 'img_width' => 'width' ];
}
- function validateParam( $name, $value ) {
+ public function validateParam( $name, $value ) {
if ( in_array( $name, [ 'width', 'height' ] ) ) {
if ( $value <= 0 ) {
return false;
}
}
- function makeParamString( $params ) {
+ public function makeParamString( $params ) {
if ( isset( $params['physicalWidth'] ) ) {
$width = $params['physicalWidth'];
} elseif ( isset( $params['width'] ) ) {
return "{$width}px";
}
- function parseParamString( $str ) {
+ public function parseParamString( $str ) {
$m = false;
if ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
return [ 'width' => $m[1] ];
return true;
}
- function validateParam( $name, $value ) {
+ public function validateParam( $name, $value ) {
if ( $name === 'quality' ) {
return self::validateQuality( $value );
} else {
return $value === 'low';
}
- function makeParamString( $params ) {
+ public function makeParamString( $params ) {
// Prepend quality as "qValue-". This has to match parseParamString() below
$res = parent::makeParamString( $params );
if ( $res && isset( $params['quality'] ) ) {
return $res;
}
- function parseParamString( $str ) {
+ public function parseParamString( $str ) {
// $str contains "qlow-200px" or "200px" strings because thumb.php would strip the filename
// first - check if the string begins with "qlow-", and if so, treat it as quality.
// Pass the first portion, or the whole string if "qlow-" not found, to the parent
* Get an associative array mapping magic word IDs to parameter names.
* Will be used by the parser to identify parameters.
*/
- abstract function getParamMap();
+ abstract public function getParamMap();
/**
* Validate a thumbnail parameter at parse time.
* @param string $name
* @param mixed $value
*/
- abstract function validateParam( $name, $value );
+ abstract public function validateParam( $name, $value );
/**
* Merge a parameter array into a string appropriate for inclusion in filenames
* @param array $params Array of parameters that have been through normaliseParams.
* @return string
*/
- abstract function makeParamString( $params );
+ abstract public function makeParamString( $params );
/**
* Parse a param string made with makeParamString back into an array
* @param string $str The parameter string without file name (e.g. 122px)
* @return array|bool Array of parameters or false on failure.
*/
- abstract function parseParamString( $str );
+ abstract public function parseParamString( $str );
/**
* Changes the parameter array as necessary, ready for transformation.
* @param File $file
* @return bool
*/
- function canRender( $file ) {
+ public function canRender( $file ) {
return true;
}
* @param File $file
* @return bool
*/
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return false;
}
* @param File $file
* @return bool
*/
- function isMultiPage( $file ) {
+ public function isMultiPage( $file ) {
return false;
}
}
}
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return true;
}
* @param mixed $value Parameter value
* @return bool Validity
*/
- function validateParam( $name, $value ) {
+ public function validateParam( $name, $value ) {
if ( in_array( $name, [ 'width', 'height' ] ) ) {
// Reject negative heights, widths
return ( $value > 0 );
* @param array $params Name=>value pairs of parameters
* @return string Filename to use
*/
- function makeParamString( $params ) {
+ public function makeParamString( $params ) {
$lang = '';
if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) {
$params['lang'] = strtolower( $params['lang'] );
return "$lang{$params['width']}px";
}
- function parseParamString( $str ) {
+ public function parseParamString( $str ) {
$m = false;
if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) {
return [ 'width' => array_pop( $m ), 'lang' => $m[1] ];
}
}
- function getParamMap() {
+ public function getParamMap() {
return [ 'img_lang' => 'lang', 'img_width' => 'width' ];
}
* @param File $file
* @return bool
*/
- function canRender( $file ) {
+ public function canRender( $file ) {
global $wgTiffThumbnailType;
return (bool)$wgTiffThumbnailType
* @param File $file
* @return bool
*/
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return true;
}
* @param File $file
* @return bool
*/
- function mustRender( $file ) {
+ public function mustRender( $file ) {
return true;
}
if ( $this->userObj === null ) {
$username = $this->getUser();
if ( $username ) {
- // Optimize: Avoid loading a new User object if possible
- global $wgUser;
- if ( is_object( $wgUser ) && $wgUser->getName() === $username ) {
- $this->userObj = $wgUser;
- } else {
- $this->userObj = User::newFromName( $username );
- }
+ $this->userObj = User::newFromName( $username );
} else {
$this->userObj = new User; // Anonymous user
}
return;
}
+ if ( defined( 'MW_NO_SESSION_HANDLER' ) ) {
+ throw new \BadMethodCallException( 'MW_NO_SESSION_HANDLER is defined' );
+ }
+
self::$instance = new self( $manager );
// Close any auto-started session, before we replace it
* @param bool $closing Whether the session is being closed
*/
public function save( $closing = false ) {
- if ( $this->provider->getManager()->isUserSessionPrevented( $this->user->getName() ) ) {
+ $anon = $this->user->isAnon();
+
+ if ( !$anon && $this->provider->getManager()->isUserSessionPrevented( $this->user->getName() ) ) {
$this->logger->debug(
'SessionBackend "{session}" not saving, user {user} was ' .
'passed to SessionManager::preventSessionsForUser',
// Ensure the user has a token
// @codeCoverageIgnoreStart
- $anon = $this->user->isAnon();
if ( !$anon && !$this->user->getToken( false ) ) {
$this->logger->debug(
'SessionBackend "{session}" creating token for user {user} on save',
namespace MediaWiki\Session;
use Psr\Log\LoggerInterface;
-use Psr\Log\LogLevel;
use BagOStuff;
use CachedBagOStuff;
use Config;
* @return Session
*/
public function getSessionFromInfo( SessionInfo $info, WebRequest $request ) {
+ if ( defined( 'MW_NO_SESSION' ) ) {
+ if ( MW_NO_SESSION === 'warn' ) {
+ // Undocumented safety case for converting existing entry points
+ $this->logger->error( 'Sessions are supposed to be disabled for this entry point' );
+ } else {
+ throw new \BadMethodCallException( 'Sessions are disabled for this entry point' );
+ }
+ }
+
$id = $info->getId();
if ( !isset( $this->allSessionBackends[$id] ) ) {
self::$globalSessionRequest = null;
}
- /**
- * Do a sanity check to make sure the session is not used from many different IP addresses
- * and store some data for later sanity checks.
- * FIXME remove this once SessionManager is considered stable
- * @private For use in Setup.php only
- * @param Session $session Defaults to the global session.
- */
- public function checkIpLimits( Session $session = null ) {
- $session = $session ?: self::getGlobalSession();
-
- try {
- $ip = $session->getRequest()->getIP();
- } catch ( \MWException $e ) {
- return;
- }
- if ( $ip === '127.0.0.1' || \IP::isConfiguredProxy( $ip ) ) {
- return;
- }
- $now = time();
-
- // Record (and possibly log) that the IP is using the current session.
- // Don't touch the stored data unless we are adding a new IP or re-adding an expired one.
- // This is slightly inaccurate (when an existing IP is seen again, the expiry is not
- // extended) but that shouldn't make much difference and limits the session write frequency
- // to # of IPs / $wgSuspiciousIpExpiry.
- $data = $session->get( 'SessionManager-ip', [] );
- if (
- !isset( $data[$ip] )
- || $data[$ip] < $now
- ) {
- $data[$ip] = time() + $this->config->get( 'SuspiciousIpExpiry' );
- foreach ( $data as $key => $expires ) {
- if ( $expires < $now ) {
- unset( $data[$key] );
- }
- }
- $session->set( 'SessionManager-ip', $data );
-
- $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'session-ip' );
- $logLevel = count( $data ) >= $this->config->get( 'SuspiciousIpPerSessionLimit' )
- ? LogLevel::WARNING : ( count( $data ) === 1 ? LogLevel::DEBUG : LogLevel::INFO );
- $logger->log(
- $logLevel,
- 'Same session used from {count} IPs',
- [
- 'count' => count( $data ),
- 'ips' => $data,
- 'session' => $session->getId(),
- 'user' => $session->getUser()->getName(),
- 'persistent' => $session->isPersistent(),
- ]
- );
- }
-
- // Now do the same thing globally for the current user.
- // We are using the object cache and assume it is shared between all wikis of a farm,
- // and further assume that the same name belongs to the same user on all wikis. (It's either
- // that or a central ID lookup which would mean an extra SQL query on every request.)
- if ( $session->getUser()->isLoggedIn() ) {
- $userKey = 'SessionManager-ip:' . md5( $session->getUser()->getName() );
- $data = $this->store->get( $userKey ) ?: [];
- if (
- !isset( $data[$ip] )
- || $data[$ip] < $now
- ) {
- $data[$ip] = time() + $this->config->get( 'SuspiciousIpExpiry' );
- foreach ( $data as $key => $expires ) {
- if ( $expires < $now ) {
- unset( $data[$key] );
- }
- }
- $this->store->set( $userKey, $data, $this->config->get( 'SuspiciousIpExpiry' ) );
- $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'session-ip' );
- $logLevel = count( $data ) >= $this->config->get( 'SuspiciousIpPerUserLimit' )
- ? LogLevel::WARNING : ( count( $data ) === 1 ? LogLevel::DEBUG : LogLevel::INFO );
- $logger->log(
- $logLevel,
- 'Same user had sessions from {count} IPs',
- [
- 'count' => count( $data ),
- 'ips' => $data,
- 'session' => $session->getId(),
- 'user' => $session->getUser()->getName(),
- 'persistent' => $session->isPersistent(),
- ]
- );
- }
- }
- }
-
/**@}*/
}
[
'class' => 'mw-ui-input-inline mw-autocomplete-user',
'tabindex' => 1,
- 'autofocus' => $this->requestedUser === '',
- ]
+ ] + (
+ // Set autofocus on blank input
+ $this->requestedUser === '' ? [ 'autofocus' => '' ] : []
+ )
) . '<br />';
$out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
function doBatchLookups() {
# Do a link batch query
$this->mResult->seek( 0 );
- $revIds = [];
+ $parentRevIds = [];
+ $this->mParentLens = [];
$batch = new LinkBatch();
# Give some pointers to make (last) links
foreach ( $this->mResult as $row ) {
if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
- $revIds[] = $row->rev_parent_id;
+ $parentRevIds[] = $row->rev_parent_id;
}
if ( isset( $row->rev_id ) ) {
+ $this->mParentLens[$row->rev_id] = $row->rev_len;
if ( $this->contribs === 'newbie' ) { // multiple users
$batch->add( NS_USER, $row->user_name );
$batch->add( NS_USER_TALK, $row->user_name );
$batch->add( $row->page_namespace, $row->page_title );
}
}
- $this->mParentLens = Revision::getParentLengths( $this->mDbSecondary, $revIds );
+ # Fetch rev_len for revisions not already scanned above
+ $this->mParentLens += Revision::getParentLengths(
+ $this->mDbSecondary,
+ array_diff( $parentRevIds, array_keys( $this->mParentLens ) )
+ );
$batch->execute();
$this->mResult->seek( 0 );
}
$name,
[
'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
- 'autofocus' => true,
+ 'autofocus' => '',
]
) .
' ' .
) . "\n";
}
- // Select: All, None, Invert
- $links = [];
- $links[] = Html::element(
- 'a', [ 'href' => '#', 'class' => 'mw-checkbox-all' ],
- $this->msg( 'checkbox-all' )->text()
- );
- $links[] = Html::element(
- 'a', [ 'href' => '#', 'class' => 'mw-checkbox-none' ],
- $this->msg( 'checkbox-none' )->text()
- );
- $links[] = Html::element(
- 'a', [ 'href' => '#', 'class' => 'mw-checkbox-invert' ],
- $this->msg( 'checkbox-invert' )->text()
- );
-
- $buttons .= Html::rawElement( 'p',
- [
- 'class' => "mw-checkbox-toggle-controls"
- ],
- $this->msg( 'checkbox-select' )
- ->rawParams( $this->getLanguage()->commaList( $links ) )->escaped()
- );
-
- $this->getOutput()->addModules( 'mediawiki.checkboxtoggle' );
- $this->getOutput()->addModuleStyles( 'mediawiki.checkboxtoggle.styles' );
+ $buttons .= ( new ListToggle( $this->getOutput() ) )->getHTML();
$s .= $buttons . $formcontents . $buttons;
$s .= Html::closeElement( 'form' );
* Return a string of the MediaWiki version with Git revision if available.
*
* @param string $flags
+ * @param Language|string|null $lang
* @return mixed
*/
- public static function getVersion( $flags = '' ) {
+ public static function getVersion( $flags = '', $lang = null ) {
global $wgVersion, $IP;
$gitInfo = self::getGitHeadSha1( $IP );
$version = "$wgVersion ($shortSha1)";
} else {
$shortSha1 = substr( $gitInfo, 0, 7 );
- $shortSha1 = wfMessage( 'parentheses' )->params( $shortSha1 )->escaped();
+ $msg = wfMessage( 'parentheses' );
+ if ( $lang !== null ) {
+ $msg->inLanguage( $lang );
+ }
+ $shortSha1 = $msg->params( $shortSha1 )->escaped();
$version = "$wgVersion $shortSha1";
}
$this->mOptionOverrides = null;
$this->mOptionsLoaded = false;
- $loggedOut = $this->mRequest ? $this->mRequest->getSession()->getLoggedOutTimestamp() : 0;
+ $loggedOut = $this->mRequest && !defined( 'MW_NO_SESSION' )
+ ? $this->mRequest->getSession()->getLoggedOutTimestamp() : 0;
if ( $loggedOut !== 0 ) {
$this->mTouched = wfTimestamp( TS_MW, $loggedOut );
} else {
if ( is_null( $this->mRights ) ) {
$this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
- $allowedRights = $this->getRequest()->getSession()->getAllowedUserRights();
- if ( $allowedRights !== null ) {
- $this->mRights = array_intersect( $this->mRights, $allowedRights );
+ // Deny any rights denied by the user's session, unless this
+ // endpoint has no sessions.
+ if ( !defined( 'MW_NO_SESSION' ) ) {
+ $allowedRights = $this->getRequest()->getSession()->getAllowedUserRights();
+ if ( $allowedRights !== null ) {
+ $this->mRights = array_intersect( $this->mRights, $allowedRights );
+ }
}
Hooks::run( 'UserGetRights', [ $this, &$this->mRights ] );
}
}
- // Remove any rights that aren't allowed to the global-session user
- $allowedRights = SessionManager::getGlobalSession()->getAllowedUserRights();
- if ( $allowedRights !== null && !in_array( $right, $allowedRights, true ) ) {
- $cache[$right] = false;
- return false;
+ // Remove any rights that aren't allowed to the global-session user,
+ // unless there are no sessions for this endpoint.
+ if ( !defined( 'MW_NO_SESSION' ) ) {
+ $allowedRights = SessionManager::getGlobalSession()->getAllowedUserRights();
+ if ( $allowedRights !== null && !in_array( $right, $allowedRights, true ) ) {
+ $cache[$right] = false;
+ return false;
+ }
}
// Allow extensions to say false
"grant-editpage": "تعديل صفحات موجودة",
"grant-editprotected": "تعديل صفحات محمية",
"grant-highvolume": "تعديل كبير الحجم",
+ "grant-protect": "حماية وإزالة حماية الصفحات",
+ "grant-rollback": "استرجاع التغييرات في الصفحات",
"grant-sendemail": "إرسال بريد إلكتروني للمستخدمين الآخرين",
"grant-uploadeditmovefile": "رفع وإزاحة ونقل الملفات",
"grant-uploadfile": "ارفع ملفات جديدة",
"recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
"recentchanges-page-added-to-category": "[[:$1]] أضيفت إلى التصنيف",
"recentchanges-page-added-to-category-bundled": "أضيفت [[:$1]] و{{PLURAL:$2|صفحة واحدة|صفحتان|$2 صفحات}} إلى التصنيف",
+ "recentchanges-page-removed-from-category": "أزيلت [[$1:]] من التصنيف",
"recentchanges-page-removed-from-category-bundled": "أزيلت [[:$1]] و{{PLURAL:$2|صفحة واحدة|صفحتان|$2 صفحات}} من التصنيف",
"autochange-username": "تغيير آلي لميدياويكي",
"upload": "ارفع ملفا",
"apisandbox-results": "النتائج",
"apisandbox-request-url-label": "مسار الطلب:",
"apisandbox-request-time": "وقت الطلب: $1",
+ "apisandbox-alert-page": "هناك حقول غير صالحة في هذه الصفحة.",
"apisandbox-alert-field": "قيمة هذا الحقل غير صالحة.",
"booksources": "مصادر كتاب",
"booksources-search-legend": "البحث عن مصادر الكتب",
"wlshowhidebots": "البوتات",
"wlshowhideliu": "المسجلين",
"wlshowhideanons": "المجهولين",
+ "wlshowhidepatr": "التعديلات المراجعة",
"wlshowhidemine": "تعديلاتي",
"wlshowhidecategorization": "تصنيف الصفحات",
"watchlist-options": "خيارات قائمة المراقبة",
"block-log-flags-hiddenname": "اسم المستخدم مخفي",
"range_block_disabled": "إمكانية مدير النظام لمنع نطاق معطلة.",
"ipb_expiry_invalid": "تاريخ الانتهاء غير صحيح.",
+ "ipb_expiry_old": "توقيت انتهاء المنع واقع في الماضي.",
"ipb_expiry_temp": "عمليات منع أسماء المستخدمين المخفية يجب أن تكون دائمة.",
"ipb_hide_invalid": "غير قادر على منع الحساب؛ لديه أكثر من {{PLURAL:$1|تعديل واحد|$1 تعديل}}.",
"ipb_already_blocked": "\"$1\" ممنوع حالياً",
"tooltip-feed-rss": "تلقيم أر إس إس لهذه الصفحة",
"tooltip-feed-atom": "تلقيم أتوم لهذه الصفحة",
"tooltip-t-contributions": "رؤية قائمة مساهمات هذا المستخدم",
- "tooltip-t-emailuser": "أرسل رسالة لهذا المستخدم",
+ "tooltip-t-emailuser": "أرسل رسالة {{GENDER:$1|لهذا المستخدم|لهذه المستخدمة}}",
"tooltip-t-info": "المزيد من المعلومات عن هذه الصفحة",
"tooltip-t-upload": "ارفع ملفات",
"tooltip-t-specialpages": "قائمة بكل الصفحات الخاصة",
"svg-long-error": "ملف SVG غير صالح: $1",
"show-big-image": "الملف الأصلي",
"show-big-image-preview": "حجم هذه المعاينة: $1.",
+ "show-big-image-preview-differ": "حجم معاينة $3 لذلك الملف ذي الامتداد $2: $1.",
"show-big-image-other": "{{PLURAL:$2||البعد الآخر|البعدان الآخران|الأبعاد الأخرى}}: $1.",
"show-big-image-size": "$1 × $2 بكسل",
"file-info-gif-looped": "ملفوف",
"expand_templates_generate_xml": "اعرض شجرة XML parse",
"expand_templates_generate_rawhtml": "أظهر خام HTML",
"expand_templates_preview": "عرض مسبق",
+ "expand_templates_input_missing": "يجب تقديم بعض المدخلات النصية على الأقل.",
"pagelanguage": "تغيير لغة الصفحة",
"pagelang-name": "صفحة",
"pagelang-language": "اللغة",
"right-changetags": "дадаваць і выдаляць адвольныя [[Special:Tags|меткі]] да асобных вэрсіяў і запісаў у журнале падзеяў",
"grant-generic": "Набор правоў «$1»",
"grant-group-page-interaction": "Узаемадзеньне з старонкамі",
+ "grant-group-file-interaction": "Узаемадзеяньне з мэдыяфайламі",
+ "grant-group-watchlist-interaction": "Узаемадзеяньне з вашым сьпісам назіраньня",
+ "grant-group-email": "Адпраўка лістоў электроннай пошты",
"grant-createaccount": "Стварыць рахункі",
"grant-createeditmovepage": "Ствараць, рэдагаваць і пераносіць старонкі",
"grant-delete": "Выдаляць старонкі, вэрсіі і запісы журналу",
"passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
"passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
"changeemail": "Змяніць або выдаліць адрас электроннай пошты",
- "changeemail-header": "Змена электроннага адрасу акаўнта",
+ "changeemail-header": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Калі хочаце выдаліць адрас электроннай пошты, злучаны з вашым уліковым запісам, пакіньце поле новага адраса электроннай пошты пустым пры адпраўцы формы.",
+ "changeemail-passwordrequired": "Вам трэба будзе ўвесці свой пароль, каб пацвердзіць гэта змяненне.",
"changeemail-no-info": "Каб звяртацца непасрэдна да гэтай старонкі, вам варта прадставіцца сістэме.",
"changeemail-oldemail": "Бягучы адрас электроннай пошты:",
"changeemail-newemail": "Новы адрас электроннай пошты:",
+ "changeemail-newemail-help": "Гэта поле павінна застацца пустым, калі вы хочаце выдаліць свой адрас электроннай пошты. Вы не зможаце скінуць забыты пароль і не будзеце атрымліваць лісты з гэтай Вікі пасля выдалення.",
"changeemail-none": "(няма)",
"changeemail-password": "Ваш {{SITENAME}} пароль:",
"changeemail-submit": "Змяніць адрас электроннай пошты:",
"changeemail-throttled": "Надта многа спроб увайсці пад гэтым рахункам. Пачакайце $1 перад тым, як спрабаваць ізноў.",
+ "changeemail-nochange": "Калі ласка, увядзіце іншы адрас электроннай пошты.",
"resettokens": "Скінуць токены",
"resettokens-text": "Вы можаце пераўстанавіць токены, якія дазваляюць атрымліваць доступ да пэўных прыватных звестак, звязаных з вашым уліковым запісам.\n\nВы мусіце скінуць токены, калі выпадкова падзяліліся імі з кім-небудзь, ці ваш уліковы запіс быў скампраметаваны.",
"resettokens-no-tokens": "Няма чаго скідваць.",
"pool-timeout": "Aet eur dreist d'an termen gortoz evit ar stankadenn",
"pool-queuefull": "Soulgarget eo ar servijerioù",
"pool-errorunknown": "Fazi dianav",
+ "poolcounter-usage-error": "Fazi implij : $1",
"aboutsite": "Diwar-benn {{SITENAME}}",
"aboutpage": "Project:Diwar-benn",
"copyright": "Danvez a c'haller implijout dindan $1 nemet ha notet e vefe ar c'hontrol.",
"filerenameerror": "Dibosupl da adenvel « $1 » e « $2 ».",
"filedeleteerror": "Dibosupl eo diverkañ « $1 ».",
"directorycreateerror": "N'eus ket bet gallet krouiñ kavlec'h \"$1\".",
+ "directoryreadonlyerror": "Kavlec'h «$1» lenn hepken",
+ "directorynotreadableerror": "Ne c'haller ket lenn ar c'havlec'h « $1 ».",
"filenotfound": "N'haller ket kavout ar restr \"$1\".",
"unexpected": "Talvoudenn dic'hortoz : \"$1\"=\"$2\".",
"formerror": "Fazi: Dibosupl eo kinnig ar furmskrid",
"resetpass_submit": "Cheñch ar ger-tremen ha kevreañ",
"changepassword-success": "Cheñchet eo bet ho ker-tremen !",
"changepassword-throttled": "Betek re hoc'h heus klasket kevreañ en aner.\nGortozit $1, mar plij, a-raok esaeañ en-dro.",
+ "botpasswords-label-appid": "Anv ar robot",
"botpasswords-label-create": "Krouiñ",
+ "botpasswords-label-update": "Hizivaat",
"botpasswords-label-cancel": "Nullañ",
"botpasswords-label-delete": "Dilemel",
+ "botpasswords-label-resetpassword": "Adderaouekaat ar ger-tremen",
+ "botpasswords-bad-appid": "N'eo ket reizh anv ar robot « $1 »",
+ "botpasswords-insert-failed": "C'hwitet eo ouzhpennadenn ar robot « $1 ». Hag ouzhpennet eo bet ?",
+ "botpasswords-update-failed": "C'hwitet eo bet hizivadur anv ar robot « $1 ». Ha dilamet eo bet ?",
+ "botpasswords-created-title": "Ger-tremen robotoù krouet",
+ "botpasswords-created-body": "Krouet mat eo bet ar ger-tremen « $1 ».",
+ "botpasswords-updated-title": "Ger-tremen robotoù hizivaet",
+ "botpasswords-updated-body": "Hizivaet mat eo bet ar ger-tremen « $1 ».",
+ "botpasswords-deleted-title": "Ger-tremen robotoù dilamet",
+ "botpasswords-deleted-body": "Ar ger-tremen robotoù « $1 » zo bet dilamet.",
+ "botpasswords-newpassword": "<strong>\"$2\"</strong> eo ar ger-tremen evit kevreañ gant <strong>$1</strong>. Enrollit anezhañ, par plij, evit ober dave dezhañ diwezhatoc'h.</em>",
+ "botpasswords-no-provider": "N'eo ket hegerz BotPasswordsSessionProvider.",
"resetpass_forbidden": "N'haller ket cheñch ar gerioù-termen",
"resetpass-no-info": "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
"resetpass-submit-loggedin": "Cheñch ger-tremen",
"upload-dialog-button-done": "Graet",
"upload-dialog-button-save": "Enrollañ",
"upload-dialog-button-upload": "Enporzhiañ",
- "upload-form-label-select-file": "Diuzañ ur restr",
"upload-form-label-infoform-title": "Munudoù",
"upload-form-label-infoform-name": "Anv",
"upload-form-label-infoform-description": "Deskrivadur",
"suppress": "Dindan evezh",
"querypage-disabled": "Diweredekaet eo bet ar bajenn dibar-mañ evit aesaat d'ar reizhiad un tammig.",
"apihelp-no-such-module": "N'eo ket bet kavet ar vodulenn \"$1\".",
+ "apisandbox": "Poull-traezh API",
+ "apisandbox-api-disabled": "Diweredekaet eo API war al lec'hienn-mañ.",
+ "apisandbox-intro": "Grit gant ar bajenn-mañ evit amprouiñ '''servij Web API MediaWiki'''.\nKit da deuler ur sell war [//www.mediawiki.org/wiki/API:Main_page titouroù an API] evit gouzout hiroc'h war an doare da embreger API. Da skouer :\n[//www.mediawiki.org/wiki/API#A_simple_example gwelet danvez ur bennbajenn]. Dibabit un oberiadenn bennak evit gwelet skouerioù all",
+ "apisandbox-submit": "Sevel ar goulenn",
+ "apisandbox-reset": "Riñsañ",
+ "apisandbox-examples": "Skouer",
+ "apisandbox-results": "Disoc'h",
+ "apisandbox-request-url-label": "Goulenn URL :",
+ "apisandbox-request-time": "Pad ar goulenn: $1",
"booksources": "Oberennoù dave",
"booksources-search-legend": "Klask en oberennoù dave",
"booksources-isbn": "ISBN :",
"protect_change": "хийца",
"protectthispage": "Ларъе хӀара агӀо",
"unprotect": "Ларъяр хийцар",
- "unprotectthispage": "Хийца хӀокху агӀона ларъяр",
+ "unprotectthispage": "ХӀокху агӀонан ларъяр хийца",
"newpage": "Керла агӀонаш",
- "talkpage": "Ð\94ийÑ\86аÑ\80е йилла Ñ\85Ó\80аÑ\80а агÓ\80о",
+ "talkpage": "Ð¥Ó\80аÑ\80а агÓ\80о йийÑ\86аÑ\80е йилла",
"talkpagelinktext": "Дийцаре",
"specialpage": "Белхан агӀо",
"personaltools": "Долахь болу гӀирсаш",
"templatepage": "Хьажа кепа агӀоне",
"viewhelppage": "Схьаэца гӀо",
"categorypage": "Хьажа категорешан агӀоне",
- "viewtalkpage": "Ð¥Ñ\8cажа дийÑ\86аÑ\80е",
+ "viewtalkpage": "Ð\94ийÑ\86аÑ\80е Ñ\85Ñ\8cажа",
"otherlanguages": "Кхечу маттахь дерш",
- "redirectedfrom": "(ДӀасахьажийна кху $1)",
+ "redirectedfrom": "($1 дӀасахьажийна кхузе)",
"redirectpagesub": "АгӀо-дӀасахьажорг",
"redirectto": "ДӀасахьажор тӀе:",
"lastmodifiedat": "ХӀокху агӀон тӀаьххьаралера хийцам: $1, $2.",
"logouttext": "'''Ахьа болх дӀаберзийна.'''\n\nЦхьайолу агӀонаш чохь хьо хьай цӀарца болх беш сана хила тарло ишта ца хилийта керлаякха браузеран кэш.",
"cannotlogoutnow-title": "ХӀинца чудаха таро яц",
"welcomeuser": "Марша ДогӀийла, $1!",
- "welcomecreation-msg": "Хьан декъашхочун дӀаяздар кхоьлина.\nДиц ма делахь {{SITENAME}} сайтан [[Special:Preferences|декъашхочун гӀирс]].",
+ "welcomecreation-msg": "Хьан хьесапан (учётни) дӀаяздар кхоьллина.\nДиц ма делахь {{SITENAME}} сайтан [[Special:Preferences|декъашхочун гӀирс]] чекхбаккха.",
"yourname": "Декъашхочун цӀе:",
"userlogin-yourname": "Декъашхочун цӀе",
"userlogin-yourname-ph": "Язъе декъашхочун цӀе",
"undo-summary-username-hidden": "Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина",
"cantcreateaccounttitle": "Декъашхочун дӀаяздар кхолла йиш яц",
"viewpagelogs": "Гайта хӀокху агӀонан тептар",
- "nohistory": "ХӀокху агӀона хийцамаш бина хила бац.",
+ "nohistory": "ХӀокху агӀонан хийцамаш ца бина.",
"currentrev": "Карара верси",
"currentrev-asof": "Карара верси $1",
"revisionasof": "Верси $1",
"searchprofile-advanced-tooltip": "Дехарца йолу цӀерийн анашкахь лахар",
"search-result-size": "$1 ({{PLURAL:$2|$2 дош|$2 дешнаш}})",
"search-result-category-size": "$1 {{PLURAL:$1|юкъаяр}} ($2 {{PLURAL:$2|1=бухара категори|бухара категореш}}, $3 {{PLURAL:$3|1=файл|файлаш}}).",
- "search-redirect": "(дlасахьажийна $1)",
+ "search-redirect": "(дӀасахьажийна $1)",
"search-section": "(дакъа $1)",
"search-category": "(категори $1)",
"search-file-match": "(файлан чулацаме тера хилар)",
"action-createpage": "агӀонаш кхолла",
"action-createtalk": "дийцаре агӀонаш кхоллар",
"action-createaccount": "хӀара декъашхочун дӀаяздар кхоллар",
- "action-history": "хӀокху агӀона исторега хьажар",
+ "action-history": "хӀокху агӀонан исторешка хьажар",
"action-minoredit": "жима нисдар сана билгало",
"action-move": "хӀокху агӀон цӀе хийца",
"action-move-subpages": "хӀокху агӀона цӀе хийцар цуна массо бухара агӀонийн а",
"action-writeapi": "нисдеш лелойо API",
"action-delete": "дӀаяккха хӀара агӀо",
"action-deleterevision": "агӀона хӀара верси дӀаяккхар",
- "action-deletedhistory": "хӀокху агӀона дӀаяккхинцу исторега хьажар",
+ "action-deletedhistory": "хӀокху агӀонан дӀаяьккхинчу исторешка хьажар",
"action-browsearchive": "ДӀаяхна агӀонаш лахар",
"action-undelete": "хӀара агӀо меттахӀоттор",
"action-suppressrevision": "хӀокху къайлаха йолу агӀон версеш хьажар а, меттахӀоттор а",
"removedwatchtext": "АгӀо «[[:$1]]» дӀаяьккхина яра хьан [[Special:Watchlist|тергаме могӀанан юкъар]].",
"removedwatchtext-short": "«$1» агӀо хьан тергаман магӀам чура дӀаяьккхина.",
"watch": "Тидам бе",
- "watchthispage": "ТеÑ\80гам бé Ñ\85Ó\80окÑ\85Ñ\83 агÓ\80она",
+ "watchthispage": "Ð¥Ó\80окÑ\85Ñ\83 агÓ\80онан Ñ\82идам беÑ\88 Ñ\85ила",
"unwatch": "Тергамах къаста",
"unwatchthispage": "ДӀадаккха терго яр",
"notanarticle": "Яззам бац",
"tooltip-n-help": "ГӀоде меттиг",
"tooltip-t-whatlinkshere": "Массо агӀон могӀам, хӀокху агӀонтӀе хьажийна йолу",
"tooltip-t-recentchangeslinked": "ТӀаьххьарлера хийцамаш хӀокху агӀонашкахь, хьажийна хӀара агӀо болу",
- "tooltip-feed-rss": "ХӀокху агӀона трансляци RSS-рца",
+ "tooltip-feed-rss": "RSS-ехь йолу хӀокху агӀонан трансляци",
"tooltip-feed-atom": "Хьагайтар оцу Atom цани хlокху агlон",
"tooltip-t-contributions": "ХӀокху декъашхочо хийцина йолу агӀонийн могӀам",
"tooltip-t-emailuser": "ДӀабахьийта хаам оцу декъашхона",
"newarticletextanon": "{{int:newarticletext|$1}}",
"talkpagetext": "<!-- MediaWiki:talkpagetext -->",
"anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
- "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
+ "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
"noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
"noarticletextanon": "{{int:noarticletext}}",
"missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
"shown-title": "दर एका पानार {{PLURAL:$1|निकाल}} दाखय",
"viewprevnext": "पळयात ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-exists": "ह्या'''विकीचेर \"[[:$1]]\" ह्या नांवाचें पान आसा .''' {{PLURAL:$2|0=|See also the other search results found.}}",
- "searchmenu-new": "<strong>ह्या विकीचेर \"[[:$1]]\" हें पान रोचात!<strong> {{PLURAL:$2|सोदून मेळिल्लें पानय पळेयात.|सोदून मेळिल्ले निकाळय पळेयात.}}",
+ "searchmenu-new": "<strong>ह्या विकीचेर \"[[:$1]]\" हें पान रोचात!</strong> {{PLURAL:$2|सोदून मेळिल्लें पानय पळेयात.|सोदून मेळिल्ले निकाळय पळेयात.}}",
"searchprofile-articles": "मजकूराचीं पानां",
"searchprofile-images": "भोवमाध्यम",
"searchprofile-everything": "सगळें",
"qbmyoptions": "Mhoji panam",
"faq": "Porot porot vicharlele prosn",
"faqpage": "Project:Porot porot vicharlele prosn",
- "actions": "Karvaio",
+ "actions": "Kornnio",
"namespaces": "Nanvthollam",
"variants": "Dusre",
"navigation-heading": "Dixa-niontron suchi",
"shown-title": "Dor eka panar {{PLURAL:$1|porinam}} dakhoi",
"viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) poloi",
"searchmenu-exists": "'''Hea Wikicher \"[[:$1]]\" nanvanche pan asa.'''",
- "searchmenu-new": "<strong>\"[[:$1]]\" hem pan hea vikint roch!<strong> {{PLURAL:$2|0=|Tujea sodan mellelem panui polloi.|Tujea sodan mellelem panamui polloi.}}",
+ "searchmenu-new": "<strong>\"[[:$1]]\" hem pan hea vikint roch!</strong> {{PLURAL:$2|0=|Tujea sodan mellelem panui polloi.|Tujea sodan mellelem panamui polloi.}}",
"searchprofile-articles": "Mozkurachim panam",
"searchprofile-images": "Bhovmadhiom",
"searchprofile-everything": "Sogllem",
"Դավիթ Սարոյան",
"Beko",
"Vahe Gharakhanyan",
- "Aram1985"
+ "Aram1985",
+ "KeepingCalm"
]
},
"tog-underline": "ընդգծել հղումները՝",
"permalink": "Մշտական հղում",
"print": "Տպել",
"view": "Դիտել",
- "view-foreign": "Նայել $1-ում",
+ "view-foreign": "Նայել $1ում",
"edit": "Խմբագրել",
"edit-local": "Խմբագրել տեղային նկարագրությունը",
"create": "Ստեղծել",
"actionthrottledtext": "Որպես հակա-սպամային միջոց, այս գործողության չափից շատ կատարումը կարճ ժամանակահատվածի ընթացքում սահմանափակված է։ Խնդրում ենք փորձել կրկին մի քանի րոպե անց։",
"protectedpagetext": "Այս էջը պաշտպանված է խմբագումներից։",
"viewsourcetext": "Դուք կարող եք դիտել և պատճենել այս էջի ելատեքստը.",
- "viewyourtext": "Դուք կարող եք դիտել «ձեր ներդրումների» աղբյուրը և պատճենել այս էջ",
+ "viewyourtext": "Դուք կարող եք դիտել և պատճենել <strong>ձեր խմբագրումների</strong> ելատեքստը այդ էջում։",
"protectedinterface": "Այս էջը պարունակում է ծրագրային ապահովման միջերեսի տեքստ, և պաշտպանված է չարաշահումների կանխարգելման նպատակով։\nԲոլոր վիքիների թարգմանությունները փոփոխելու կամ ավելացնելու համար, խնդրում ենք այցելել ՄեդիաՎիքիի տեղայնացման նախագիծը՝ [//translatewiki.net/ translatewiki.net]։",
"editinginterface": "'''Ուշադրություն՝''' Դուք խմբագրում եք ծրագրային ապահովման միջերեսի տեքստ պարունակող էջ։\nԱյս էջի փոփոխությունը կանդրադառնա այլ մասնակիցներին տեսանելի միջերեսը այս վիքիի վրա։\nԹարգմանությունների համար նախընտրելի է օգտագործել [//translatewiki.net/wiki/Main_Page?setlang=hy translatewiki.net]՝ Մեդիավիքի ծրագրի տեղայնացման նախագիծը։",
- "cascadeprotected": "Ô±ÕµÕ½ Õ§Õ»Õ¨ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® Õ§ ÕÕ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ«Ö\81, Ö\84Õ¡Õ¶Õ« Õ¸Ö\80 Õ¨Õ¶Õ¤Õ£Ö\80Õ¯Õ¾Õ¡Õ® Õ§ Õ°Õ¥Õ¿Ö\87ÕµÕ¡Õ¬ {{PLURAL:$1|Õ§Õ»Õ«|Õ§Õ»Õ¥Ö\80Õ«}} Õ¿Õ¥Ö\84Õ½Õ¿Õ¸Ö\82Õ´, {{PLURAL:$1|Õ¸Ö\80Õ¨|Õ¸Ö\80Õ¸Õ¶Ö\84}} ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¥Õ¬ {{PLURAL:$1|Õ§|Õ¥Õ¶}} Õ¯Õ¡Õ½Õ¯Õ¡Õ¤Õ¡ÕµÕ«Õ¶ Õ°Õ¶Õ¡Ö\80Õ¡Õ¾Õ¸Ö\80ությամբ.\n$2",
+ "cascadeprotected": "Ô±ÕµÕ½ Õ§Õ»Õ¨ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¡Õ® Õ§ ÕÕ´Õ¢Õ¡Õ£Ö\80Õ¸Ö\82Õ´Õ«Ö\81, Ö\84Õ¡Õ¶Õ« Õ¸Ö\80 Õ¨Õ¶Õ¤Õ£Ö\80Õ¯Õ¾Õ¡Õ® Õ§ Õ°Õ¥Õ¿Ö\87ÕµÕ¡Õ¬ {{PLURAL:$1|Õ§Õ»Õ«|Õ§Õ»Õ¥Ö\80Õ«}} Õ¿Õ¥Ö\84Õ½Õ¿Õ¸Ö\82Õ´, {{PLURAL:$1|Õ¸Ö\80Õ¨|Õ¸Ö\80Õ¸Õ¶Ö\84}} ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶Õ¾Õ¥Õ¬ {{PLURAL:$1|Õ§|Õ¥Õ¶}} Õ¯Õ¡Õ½Õ¯Õ¡Õ¤Õ¡ÕµÕ«Õ¶ ÕºÕ¡Õ·Õ¿ÕºÕ¡Õ¶ությամբ.\n$2",
"namespaceprotected": "Դուք չունեք «$1» անվանատարածքի էջերի խմբագրման իրավունք։",
"customcssprotected": "Դուք չեք կարող խմբագրել այս CSS էջը, քանի որ այն պարունակում է այլ մասնակցի անձնական նախընտրանքներ։",
"customjsprotected": "Դուք չեք կարող խմբագրել այս ՋավաՍկրիպտ էջը, քանի որ այն պարունակում է այլ մասնակցի անձնական նախընտրանքներ։",
"filepage-nofile-link": "Այս անունով նիշք գոյություն չունի, դուք կարող եք [$1 բեռնել այն]:",
"uploadnewversion-linktext": "Բեռնել այս նիշքի նոր տարբերակ",
"shared-repo-from": "$1-ից",
+ "shared-repo": "ընդհանուր շտեմարան",
"shared-repo-name-wikimediacommons": "Վիքիպահեստ",
"upload-disallowed-here": "Դուք չեք կարող վերագրել այս նիշքը։",
"filerevert": "Հետ շրջել $1-ը",
"Tagir",
"Умар",
"아라",
- "Shirayuki"
+ "Shirayuki",
+ "ElizaMag"
]
},
"tog-underline": "Хьожадерга |ок|алтакадар:",
"disclaimers": "Бокъонах юхавалаp",
"disclaimerpage": "Project:Бокъонах юхавалаp",
"edithelp": "Хувцама куцтохкам",
+ "helppage-top-gethelp": "Г|о",
"mainpage": "Кертера оагӀув",
"mainpage-description": "Кертера оагӀув",
"policy-url": "Project:Бокъонаш",
"nstab-template": "ЧIабал",
"nstab-help": "Куцтохкам",
"nstab-category": "Катаг",
+ "mainpage-nstab": "Кертера оагӀув",
"nosuchaction": "Цу тайпара дулархIам бац",
"nosuchspecialpage": "Изза мо гӀон оагӀув яц",
"error": "ГӀалат",
"mailerror": "Хоам дIабохьийташ гIалат даьннад: $1",
"emailconfirmlink": "Доаржален хоамни хьожадорг дIачIоагIаде",
"loginlanguagelabel": "Мотт: $1",
+ "pt-login": "Чувала/яла",
+ "pt-createaccount": "Дакъалаьцархо кхолла",
"changepassword": "КъайладIоaгIа дIахувцар",
"oldpassword": "Къаьна къайладIоагӀа:",
"newpassword": "Керда къайладIоагӀа:",
"move-page-legend": "ОагIува цIи хувца",
"movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
"movepagetalktext": "ТIатеха дувцама оагIув, ший лоIамахь цIи хувлургья, '''ер дага а доацар, доаца:'''\n\n*Изза мо цIи йолаш яьсса дувцама оагIув я е\n*Оаш кIалхахь белгало даьдац.\n\nИз иштта дале, кулги новкъосталца оагIувнаш вIашагIатоха е дIадехьаяккха деза шун.",
- "movearticle": "ОагIува цIи хувца",
"newtitle": "Керда цIи",
"move-watch": "Ер оагIув теркама дагаршкахь чуяккха",
"movepagebtn": "ОагIува цIи хувца",
"htmlform-selectorother-other": "Кхыдола",
"rightsnone": "(а)",
"revdelete-summary": "хувцамий лоацам",
+ "searchsuggest-search": "Лаха",
"special-characters-group-latin": "Лаьтмий",
"special-characters-group-greek": "Джелтий",
"special-characters-group-cyrillic": "Цырилиций",
"action-viewmywatchlist": "skoða vaktlistann þinn",
"action-viewmyprivateinfo": "skoða persónuupplýsingar þínar",
"action-editmyprivateinfo": "breyta persónuupplýsingum þínum",
+ "action-managechangetags": "búa til og eyða merkjum úr gagnagrunni",
"nchanges": "$1 {{PLURAL:$1|breyting|breytingar}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|síðan síðustu heimsókn}}",
"enhancedrc-history": "breytingaskrá",
"upload-prohibited": "{{PLURAL:$2|Óheimiluð skrárgerð|Óheimilaðar skrárgerðir}}: $1.",
"uploadlogpage": "Innhlaðningarskrá",
"uploadlogpagetext": "Fyrir neðan er listi yfir nýlegustu innhlöðnu skrárnar.\nSjá [[Special:NewFiles|myndasafn nýrra mynda]] fyrir myndrænna yfirlit.",
- "filename": "Skráarnafn",
+ "filename": "Skráarheiti",
"filedesc": "Lýsing",
"fileuploadsummary": "Ágrip:",
"filereuploadsummary": "Skráarbreytingar:",
"ignorewarning": "Hunsa viðvaranir og vista þessa skrá",
"ignorewarnings": "Hunsa allar viðvaranir",
"minlength1": "Skráarnöfn þurfa að vera að minnsta kosti einn stafur að lengd",
- "illegalfilename": "Skráarnafnið „$1“ inniheldur stafi sem eru ekki leyfðir í síðutitlum.\nGjörðu svo vel og endurnefndu skrána og hladdu henni inn aftur.",
+ "illegalfilename": "Skráarheitið „$1“ inniheldur stafi sem eru ekki leyfðir í síðutitlum.\nEndurnefndu skrána og reyndu að hlaða henni inn aftur.",
"filename-toolong": "Skráarnöfn mega ekki vera lengri en 240 bæt.",
"badfilename": "Skáarnafninu hefur verið breytt í „$1“.",
"filetype-mime-mismatch": "Skráarendingin \".$1\" samræmist ekki MIME-gerð skrárinnar ($2).",
"filetype-missing": "Skráin hefur engan viðauka (dæmi \".jpg\").",
"empty-file": "Skráin sem þú valdir var tóm.",
"file-too-large": "Skráin sem þú valdir er of stór.",
- "filename-tooshort": "Skráarnafnið er of stutt",
+ "filename-tooshort": "Skráarheitið er of stutt",
"filetype-banned": "Þessi skráarending er bönnuð.",
"verification-error": "Þessi skrá stóðst ekki sannprófun.",
"hookaborted": "Hætt var við breytinguna sem þú reyndir að gera af viðbót.",
- "illegal-filename": "Þetta skráarnafn er ekki leyft.",
+ "illegal-filename": "Þetta skráarheiti er ekki leyft.",
"overwrite": "Óheimilt er að skrifa yfir skrá sem er þegar til.",
"unknown-error": "Óþekkt villa kom upp.",
"tmp-create-error": "Gat ekki búið til bráðabirgðaskrá.",
"filepageexists": "Myndasíðan fyrir þessa síðu hefur þegar verið búin til <strong>[[:$1]]</strong>, en engin skrá er til með þessu nafni.\nLýsingin sem þú skrifaðir verður ekki birt á myndasíðunni.\nTil þess að lýsingin geti birst á síðunni, þá þarft þú að breyta síðunni sérstaklega.\n[[$1|thumb]]",
"fileexists-extension": "Skrá með svipuðu nafni er til: [[$2|thumb]]\n*Nafn skrárinnar sem hlaða á inn: <strong>[[:$1]]</strong>\n*Nafn skrárinnar sem er þegar til: <strong>[[:$2]]</strong>\nVilt þú kannski nota annað nafn sem er meira lýsandi fyrir skrána ?",
"fileexists-thumbnail-yes": "Skráin virðist vera smækkuð mynd <em>(smámynd)</em>.\n[[$1|thumb]]\nAthugaðu skrána <strong>[[:$1]]</strong>.\nEf sú skrá er sama myndin í upprunalegri stærð er ekki þörf á að hlaða inn annarri smámynd. \\",
- "file-thumbnail-no": "Skráin er líklega smámynd, því skráarnafnið byrjar á <strong>$1</strong>.\nEf skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.",
+ "file-thumbnail-no": "Skráin er líklega smámynd, því skráarheitið byrjar á <strong>$1</strong>.\nEf skráin er í fullri upplausn haltu þá áfram að hlaða henni inn, en ef ekki breyttu þá skráarnafninu.",
"fileexists-forbidden": "Skrá með þessu nafni er þegar til og ekki er hægt að skrifa yfir skránna.\nEf þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.\n[[File:$1|thumb|center|$1]]",
"fileexists-shared-forbidden": "Skrá með þessu nafni er þegar til í sameiginlega myndasafninu.\nEf þú villt hlaða inn skránni þinni engu að síður, farðu þá til baka og veldu annað skráarnafn.\n[[File:$1|thumb|center|$1]]",
"file-exists-duplicate": "Þessi skrá er afrit eftirfarandi {{PLURAL:$1|skráar|skráa}}:",
"uploadvirus": "Skráin inniheldur veiru! Nánari upplýsingar: $1",
"uploadjava": "Þessi skrá er ZIP skrá sem inniheldur Java .class skráarsnið.\nUpphlöðun Java skráa er óheimil, því þær hunsa öryggis hömlur.",
"upload-source": "Upprunaleg skrá",
- "sourcefilename": "Upprunalegt skráarnafn:",
+ "sourcefilename": "Upprunalegt skráarheiti:",
"sourceurl": "Uppruni:",
"destfilename": "Móttökuskráarnafn:",
"upload-maxfilesize": "Hámarks skráarstærð: $1",
"filedelete-maintenance": "Á meðan viðhaldi stendur er lokað fyrir eyðingu og endurvakningu skráa.",
"filedelete-maintenance-title": "Mistókst að eyða skrá",
"mimesearch": "MIME-leit",
- "mimesearch-summary": "Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.\n\nLeitarstrengurinn á að vera á þessu formi: efnistag/myndasnið eða efnistag/*, t.d. <code>image/jpeg</code>.",
+ "mimesearch-summary": "Þessi síða gerir þér kleift að leita eftir skrám eftir MIME-gerð þeirra.\n\nLeitarstrengurinn á að vera á þessu formi: efnistag/myndasnið eða efnismerki/*, t.d. <code>image/jpeg</code>.",
"mimetype": "MIME-tegund:",
"download": "Hlaða niður",
"unwatchedpages": "Óvaktaðar síður",
"undelete-search-prefix": "Sýna síður sem byrja á:",
"undelete-search-submit": "Leita",
"undelete-no-results": "Engar samsvarandi síður fundust í eyðingarskjalasafninu.",
- "undelete-filename-mismatch": "Endurvakningu skráar mistókst með tímastipilinn $1: Skráarnafnið stenst ekki.",
+ "undelete-filename-mismatch": "Ekki er hægt að endurvekja útgáfu skráar með tímamerkið $1: Skráarheiti samsvara ekki.",
"undelete-bad-store-key": "Endurvakningu útgáfu skráar mistókst með tímastipilinn $1: Skráin fannst ekki fyrir eyðingu.",
"undelete-cleanup-error": "Villa við eyðingu ónotaðs skjalasafns $1",
"undelete-missing-filearchive": "Mistókst að endurvekja skjalasafn með auðkenninu $1 því það er ekki til í gagnabankanum.\nMögulega er þegar búið að endurvekja það.",
"import-interwiki-history": "Afrita allar breytingar þessarar síðu",
"import-interwiki-templates": "Hafa með öll sniðmát",
"import-interwiki-submit": "Flytja inn",
- "import-upload-filename": "Skráarnafn:",
+ "import-mapping-namespace": "Flytja inn í nafnsvið:",
+ "import-mapping-subpage": "Flytja inn sem undirsíður eftirfarandi síðu:",
+ "import-upload-filename": "Skráarheiti:",
"import-comment": "Athugasemdir:",
"importtext": "Flyttu út skrána út af upprunalegu wiki með því að nota [[Special:Export|Flytja út síður]].\nVistaðu skrána á tölvunni þinni og sendu hana svo inn hér.",
"importstart": "Flyt inn síður...",
"pageinfo-watchers": "Fjöldi notenda, sem vakta síðuna",
"pageinfo-few-watchers": "Vöktuð af færri en $1 {{PLURAL:$1|notanda|notendum}}",
"pageinfo-redirects-name": "Fjöldi tilvísana til þessarar síðu",
+ "pageinfo-redirects-value": "$1",
"pageinfo-subpages-name": "Undirsíður þessarar síðu",
"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|tilvísun|tilvísanir}}; $3 {{PLURAL:$3|ekki tilvísun|ekki tilvísanir}})",
"pageinfo-firstuser": "Stofnandi síðunnar",
"pageinfo-protect-cascading-yes": "Já",
"pageinfo-protect-cascading-from": "Keðjuvörn stafar frá",
"pageinfo-category-info": "Flokkaupplýsingar",
+ "pageinfo-category-total": "Heildarfjöldi meðlima",
"pageinfo-category-pages": "Fjöldi síðna",
"pageinfo-category-subcats": "Fjöldi undirflokka",
"pageinfo-category-files": "Fjöldi skráa",
"markaspatrolleddiff": "Merkja sem yfirfarið",
"markaspatrolledtext": "Merkja þessa síðu sem yfirfarna",
+ "markaspatrolledtext-file": "Merkja þessa útgáfu skrár sem yfirfarna",
"markedaspatrolled": "Merkja sem yfirfarið",
"markedaspatrolledtext": "Valda breytingin [[:$1]] hefur verið merkt sem yfirfarin.",
"rcpatroldisabled": "Slökkt á yfirferð nýlegra breytinga",
"markedaspatrollederrornotify": "Mistókst að merkja síðuna sem yfirfarna.",
"patrol-log-page": "Yfirferðarskrá",
"patrol-log-header": "Þetta er skrá yfir yfirfarnar breytingar.",
- "log-show-hide-patrol": "$1 Listi yfir vaktaðar síður",
+ "log-show-hide-patrol": "$1 listi yfir yfirfarnar síður",
+ "log-show-hide-tag": "$1 merkjaannáll",
"deletedrevision": "Eyddi gamla útgáfu $1",
"filedeleteerror-short": "Villa við eyðingu: $1",
"filedeleteerror-long": "Það kom upp villa við eyðingu skrárinnar: $1",
"mediawarning": "'''AÐVÖRUN''': Þessi skrá kann að hafa meinfýsinn kóða, ef keyrður kann hann að stofna kerfinu þínu í hættu.",
"imagemaxsize": "Takmarka myndastærð:<br />''(fyrir skráarsíður)''",
"thumbsize": "Stærð smámynda:",
+ "widthheight": "$1 × $2",
"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|síða|síður}}",
"file-info": "stærð skráar: $1, MIME-tegund: $2",
"file-info-size": "$1 × $2 mynddílar, skráarstærð: $3, MIME-gerð: $4",
"svg-long-error": "Ógild SVG skrá: $1",
"show-big-image": "Upphafleg skrá",
"show-big-image-preview": "Stærð þessarar forskoðunar: $1",
+ "show-big-image-preview-differ": "Stærð þessarar $3 forskoðunar á $2 skránni: $1.",
"show-big-image-other": "{{PLURAL:$2|Önnur upplausn|Aðrar upplausnir}}: $1.",
"show-big-image-size": "$1 × $2 mynddílar",
"file-info-gif-looped": "síendurtekin hreyfimynd",
"imagelisttext": "Hér fyrir neðan er $1 {{PLURAL:$1|skrá|skrám}} raðað $2.",
"newimages-summary": "Þessi kerfissíða sýnir nýlega innhlaðnar skrár.",
"newimages-legend": "Sía",
- "newimages-label": "Skráarnafn (eða hluti þess):",
+ "newimages-label": "Skráarheiti (eða hluti þess):",
"newimages-showbots": "Birta innsend gögn frá vélmennum",
+ "newimages-hidepatrolled": "Fela yfirfarnar innsendingar",
"noimages": "Ekkert að sjá.",
"ilsubmit": "Leita",
"bydate": "eftir dagsetningu",
"sp-newimages-showfrom": "Leita af nýjum skráum frá $2, $1",
+ "video-dims": "$1, $2 × $3",
+ "seconds-abbrev": "$1 sek",
+ "minutes-abbrev": "$1 mín",
+ "hours-abbrev": "$1 klst",
+ "days-abbrev": "$1 d",
"seconds": "$1 {{PLURAL:$1|sekúndu|sekúndum}}",
"minutes": "$1 {{PLURAL:$1|mínútu|mínútum}}",
"hours": "$1 {{PLURAL:$1|klukkutíma|klukkutímum}}",
"exif-source": "Uppruni",
"exif-editstatus": "Ritstjórnarleg staða myndar",
"exif-urgency": "Nauðsyn",
- "exif-locationdest": "Staður á myndinni",
+ "exif-locationdest": "Staður á mynd",
+ "exif-locationdestcode": "Kóði staðar á mynd",
"exif-objectcycle": "Tími dags sem efnið er ætlað fyrir",
"exif-contact": "Samskipta upplýsingar",
"exif-writer": "Ritari myndlýsingar",
"exif-languagecode": "Tungumál",
+ "exif-iimversion": "IIM útgáfa",
"exif-iimcategory": "Flokkur",
"exif-iimsupplementalcategory": "Undirflokkar",
"exif-datetimeexpires": "Ekki nota eftir",
"exif-originaldocumentid": "Einstakt auðkenni upphafslegs skjals",
"exif-licenseurl": "Vefslóð höfundarleyfis",
"exif-morepermissionsurl": "Aðrar leyfisupplýsingar",
- "exif-attributionurl": "Þegar þetta verk er endurnotað, tengdu á",
+ "exif-attributionurl": "Þegar þetta verk er endurnýtt, tengdu á",
+ "exif-preferredattributionname": "Þegar þetta verk er endurnýtt, vísaðu í",
"exif-pngfilecomment": "PNG athugasemd",
"exif-disclaimer": "Fyrirvari",
"exif-contentwarning": "Viðvörun innihalds myndar",
"exif-giffilecomment": "GIF athugasemd",
"exif-intellectualgenre": "Tegund hlutar",
+ "exif-subjectnewscode": "Kóði efnis í flokkunarkerfi",
"exif-scenecode": "IPTC kóði myndefnis",
- "exif-event": "Lýsir viðburðinum",
- "exif-organisationinimage": "Lýsir félaginu",
+ "exif-event": "Atburður á mynd",
+ "exif-organisationinimage": "Stofnun/félag á mynd",
+ "exif-personinimage": "Persóna á mynd",
"exif-originalimageheight": "Hæð myndarinnar fyrir skerðingu",
"exif-originalimagewidth": "Breidd myndar fyrir skerðingu",
- "exif-compression-1": "Ósamþjappað",
+ "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+ "exif-subjectnewscode-value": "$2 ($1)",
+ "exif-compression-1": "Óþjappað",
+ "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length kóðun",
+ "exif-compression-3": "CCITT Group 3 Fax kóðun",
+ "exif-compression-4": "CCITT Group 4 Fax kóðun",
+ "exif-compression-5": "LZW",
+ "exif-compression-6": "JPEG (eldra)",
+ "exif-compression-7": "JPEG",
+ "exif-compression-8": "Afþjappa (Adobe)",
+ "exif-compression-32773": "PackBits (Macintosh RLE)",
+ "exif-compression-32946": "Afþjappa (PKZIP)",
+ "exif-compression-34712": "JPEG2000",
"exif-copyrighted-true": "Höfundaréttarvarið",
"exif-copyrighted-false": "Höfundaréttarstaða ekki tilgreind",
+ "exif-photometricinterpretation-0": "Svarthvítt (hvítt er 0)",
+ "exif-photometricinterpretation-1": "Svarthvítt (svart er 0)",
+ "exif-photometricinterpretation-2": "RGB",
+ "exif-photometricinterpretation-3": "Litaspjald",
+ "exif-photometricinterpretation-4": "Gegnsæismaski",
+ "exif-photometricinterpretation-5": "Aðskilið (líklegast CMYK)",
+ "exif-photometricinterpretation-6": "YCbCr",
+ "exif-photometricinterpretation-8": "CIE L*a*b*",
+ "exif-photometricinterpretation-9": "CIE L*a*b* (ICC kóðun)",
+ "exif-photometricinterpretation-10": "CIE L*a*b* (ITU kóðun)",
+ "exif-photometricinterpretation-32803": "Litsíunarfylki",
+ "exif-photometricinterpretation-34892": "Línulegt RAW",
"exif-unknowndate": "Óþekkt dagsetning",
"exif-orientation-1": "Venjuleg",
"exif-orientation-2": "Speglað lárétt",
- "exif-orientation-3": "Snýr 180°",
+ "exif-orientation-3": "Snúið 180°",
"exif-orientation-4": "Speglað lóðrétt",
"exif-orientation-5": "Snúið 90° rangsælis og speglað lóðrétt",
- "exif-orientation-6": "Snýr 90° rangsælis",
+ "exif-orientation-6": "Snúið 90° rangsælis",
"exif-orientation-7": "Snúið 90° réttsælis og speglað lóðrétt",
- "exif-orientation-8": "Snýr 90° réttsælis",
+ "exif-orientation-8": "Snúið 90° réttsælis",
"exif-planarconfiguration-2": "planar snið",
+ "exif-xyresolution-i": "$1 pát",
+ "exif-xyresolution-c": "$1 p/sm",
"exif-colorspace-65535": "Ókvarðað",
"exif-componentsconfiguration-0": "er ekki til",
+ "exif-componentsconfiguration-1": "Y",
+ "exif-componentsconfiguration-2": "Cb",
+ "exif-componentsconfiguration-3": "Cr",
+ "exif-componentsconfiguration-4": "R",
+ "exif-componentsconfiguration-5": "G",
+ "exif-componentsconfiguration-6": "B",
"exif-exposureprogram-0": "Ekki skilgreind",
"exif-exposureprogram-1": "Handvirk",
"exif-exposureprogram-2": "Hefðbundin stilling",
"exif-exposureprogram-3": "Forgangur ljósops",
"exif-exposureprogram-4": "Forgangur lokara",
+ "exif-exposureprogram-5": "Listræn forritun (styður frekar dýpt sjónsviðs)",
+ "exif-exposureprogram-6": "Sportleg forritun (styður frekar hraða myndatöku)",
"exif-exposureprogram-7": "Andlitsmynda stilling (fyrir nærmyndir með bakrunninn í þoku)",
"exif-exposureprogram-8": "Landslags stilling (fyrir landslagsmyndir með skarpan bakrunn)",
"exif-subjectdistance-value": "$1 metrar",
"exif-lightsource-0": "Óþekkt",
"exif-lightsource-1": "Dagsbirta",
"exif-lightsource-2": "Flúrljós",
- "exif-lightsource-3": "Wolfram ljós (hvítglóandi ljós)",
+ "exif-lightsource-3": "Tungsten ljós (glóðarpera)",
"exif-lightsource-4": "Leiftur",
"exif-lightsource-9": "Gott veður",
"exif-lightsource-10": "Skýjað",
"exif-lightsource-13": "Dagur hvít flúrlýsing (N 4600 - 5400K)",
"exif-lightsource-14": "Köld hvít flúrlýsing (W 3900 - 4500K)",
"exif-lightsource-15": "Hvít flúrlýsing (WW 3200 - 3700K)",
- "exif-lightsource-17": "Staðaljós A",
- "exif-lightsource-18": "Staðaljós B",
- "exif-lightsource-19": "Staðaljós C",
+ "exif-lightsource-17": "Staðalljós A",
+ "exif-lightsource-18": "Staðalljós B",
+ "exif-lightsource-19": "Staðalljós C",
+ "exif-lightsource-20": "D55",
+ "exif-lightsource-21": "D65",
+ "exif-lightsource-22": "D75",
+ "exif-lightsource-23": "D50",
"exif-lightsource-24": "ISO stúdíótungsten",
- "exif-lightsource-255": "Önnur ljósuppspretta",
- "exif-flash-fired-0": "Leifturljósið var slökkt",
+ "exif-lightsource-255": "Annar ljósgjafi",
+ "exif-flash-fired-0": "Leifturljósið hleypti ekki af",
"exif-flash-fired-1": "Leifturljósið kviknaði",
"exif-flash-mode-1": "skyldubundið leifturljós",
"exif-flash-mode-2": "skyldubundin bæling leifturljóss",
"exif-flash-redeye-1": "lagfæring rauðra-augna",
"exif-focalplaneresolutionunit-2": "tommur",
"exif-sensingmethod-1": "Óskilgreint",
- "exif-sensingmethod-2": "Einnar-kísilflögu litsviðs skynjari",
- "exif-sensingmethod-3": "Tveggja-kísilflögu litsviðs skynjari",
- "exif-sensingmethod-4": "Þriggja-kísilflögu litsviðs skynjari",
- "exif-sensingmethod-5": "Raðbundinn litsviðs skynjari",
+ "exif-sensingmethod-2": "Einnar-kísilflögu litsviðsskynjari",
+ "exif-sensingmethod-3": "Tveggja-kísilflögu litsviðsskynjari",
+ "exif-sensingmethod-4": "Þriggja-kísilflögu litsviðsskynjari",
+ "exif-sensingmethod-5": "Raðbundinn litsviðsskynjari",
+ "exif-sensingmethod-7": "Þrílínulegur skynjari",
"exif-filesource-3": "Stafræn ljósmyndavél",
"exif-customrendered-0": "Venjuleg vinnsla",
"exif-customrendered-1": "Sérstök vinnsla",
"exif-exposuremode-0": "Sjálfvirk lýsing",
"exif-exposuremode-1": "Handstillt lýsing",
+ "exif-exposuremode-2": "Sjálfvirk mislýsing (auto bracket)",
"exif-whitebalance-0": "Sjálfgefinn ljóshiti",
"exif-whitebalance-1": "Handstilltur ljóshiti",
"exif-scenecapturetype-0": "Staðlað",
"watchlistedit-clear-titles": "Síður:",
"watchlistedit-clear-submit": "Hreinsa vaktlistann (þetta er endanlegt!)",
"watchlistedit-clear-done": "Vaktlistinn þinn hefur verið hreinsaður.",
+ "watchlistedit-clear-removed": "$1 {{PLURAL:$1|síða var fjarlægð|síður voru fjarlægðar}}:",
+ "watchlistedit-too-many": "Það eru of margar síður til að hægt sé að birta þær hér.",
"watchlisttools-clear": "Hreinsa vaktlistann",
"watchlisttools-view": "Sýna viðeigandi breytingar",
"watchlisttools-edit": "Skoða og breyta vaktlistanum",
"version-antispam": "Varnir gegn amasendingum",
"version-other": "Aðrar",
"version-mediahandlers": "Rekill margmiðlunarskráa",
- "version-parser-extensiontags": "Tögg í viðauka þáttagreiningar",
+ "version-parser-extensiontags": "Merki í viðauka þáttunar",
"version-hook-subscribedby": "Í áskrift af",
"version-version": "($1)",
"version-no-ext-name": "[ekkert nafn]",
"redirect-user": "Notandanúmer",
"redirect-page": "Auðkennisnúmer síðu",
"redirect-revision": "Útgáfa síðu",
- "redirect-file": "Skráarnafn",
+ "redirect-file": "Skráarheiti",
"redirect-not-exists": "Gildi fannst ekki",
"fileduplicatesearch": "Leita að afriti",
"fileduplicatesearch-summary": "Leita að afritum sem hafa sama hakk gildi.",
"fileduplicatesearch-legend": "Leita að afriti",
- "fileduplicatesearch-filename": "Skráarnafn:",
+ "fileduplicatesearch-filename": "Skráarheiti:",
"fileduplicatesearch-submit": "Leita",
"fileduplicatesearch-info": "$1 × $2 mynddílar<br />Skráarstærð: $3<br />MIME-gerð: $4",
"fileduplicatesearch-result-1": "Skráin „$1“ hefur engin nákvæmlega eins afrit.",
"blankpage": "Tóm síða",
"intentionallyblankpage": "Þessi síða er viljandi höfð tóm.",
"external_image_whitelist": "#Ekki breyta þessari línu<pre>\n#Settu brot úr reglulegum segðum (bara þann hluta sem er á milli //) hér fyrir neðan\n#Þær verða bornar saman við vefslóðir ytri mynda\n#Þær sem passa saman verða sýndar sem myndir, en hinar eingöngu sem tengill á myndina\n#Línur sem byrja á # verða sýndar sem athugasemdir\n#Þetta er hástafafrjálst\n\n#Settu allar reglulegar segðir fyrir ofan þessa línu. Ekki breyta þessari línu.</pre>",
- "tags": "Breyta virkum tögum",
- "tag-filter": "[[Special:Tags|Tagg]]sía:",
+ "tags": "Breyta virkum merkjum",
+ "tag-filter": "[[Special:Tags|Merkja]]sía:",
"tag-filter-submit": "Sía",
- "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tagg|Tögg}}]]: $2)",
- "tags-title": "Tög",
- "tags-intro": "Þessi síða sýnir tögg, sem hugbúnaðurinn gæti merkt breytingar með, og merkingu þeirra.",
- "tags-tag": "Heiti taggs",
+ "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merki|Merki}}]]: $2)",
+ "tags-title": "Merki",
+ "tags-intro": "Þessi síða sýnir merkin sem hugbúnaðurinn gæti merkt breytingar með, og hvað þau þýða.",
+ "tags-tag": "Heiti merkis",
"tags-display-header": "Útlit í breytingaskrám",
"tags-description-header": "Tæmandi merkingarlýsing",
"tags-source-header": "Frumrit",
"tags-activate": "virkja",
"tags-deactivate": "óvirkja",
"tags-hitcount": "$1 {{PLURAL:$1|breyting|breytingar}}",
- "tags-manage-no-permission": "Þú hefur ekki leyfi til að stjórna breytingartöggum.",
- "tags-create-heading": "Stofna nýtt tagg",
+ "tags-manage-no-permission": "Þú hefur ekki leyfi til að stjórna breytingamerkjum.",
+ "tags-manage-blocked": "Þú hefur ekki leyfi til að breyta merkjum á meðan þú ert bannaður.",
+ "tags-create-heading": "Búa til nýtt merki",
+ "tags-create-explanation": "Sjálfgefið eru ný merki tiltæk notendum og vélmennum.",
"tags-create-tag-name": "Heiti merkis",
"tags-create-reason": "Ástæða:",
"tags-create-submit": "Stofna",
- "tags-create-no-name": "Þú verður að gefa upp heiti taggsins.",
- "tags-create-invalid-title-chars": "Taggheiti mega ekki að innihalda stafi sem ekki má nota í síðutitlum.",
- "tags-create-already-exists": "Taggið \"$1\" er nú þegar til.",
- "tags-delete-title": "Eyða taggi",
+ "tags-create-no-name": "Þú verður að gefa upp heiti merkisins.",
+ "tags-create-invalid-chars": "Heiti merkja mega ekki innihalda kommur (<code>,</code>) eða öfug skástrik (<code>/</code>).",
+ "tags-create-invalid-title-chars": "Heiti merkja mega ekki innihalda stafi sem ekki má nota í síðutitlum.",
+ "tags-create-already-exists": "Merkið \"$1\" er nú þegar til.",
+ "tags-delete-title": "Eyða merki",
+ "tags-delete-explanation-initial": "Þú ert við það að eyða merkinu \"$1\" úr gagnagrunninum.",
"tags-delete-reason": "Ástæða:",
- "tags-delete-not-found": "Tagið \"$1\" er ekki til.",
- "tags-activate-title": "Virkja tagg",
+ "tags-delete-submit": "Eyða þessu merki endanlega",
+ "tags-delete-not-found": "Merkið \"$1\" er ekki til.",
+ "tags-activate-title": "Virkja merki",
+ "tags-activate-question": "Þú ert í þann mund að virkja merkið \"$1\".",
"tags-activate-reason": "Ástæða:",
- "tags-activate-not-found": "Tagið \"$1\" er ekki til.",
+ "tags-activate-not-allowed": "Það er ekki hægt að virkja merkið \"$1\".",
+ "tags-activate-not-found": "Merkið \"$1\" er ekki til.",
"tags-activate-submit": "Virkja",
- "tags-deactivate-title": "Óvirkja tagg",
+ "tags-deactivate-title": "Gera merki óvirkt",
"tags-deactivate-reason": "Ástæða:",
"tags-deactivate-submit": "Óvirkja",
- "tags-edit-title": "Breyta töggum",
- "tags-edit-manage-link": "Stjórna töggum",
+ "tags-edit-title": "Breyta merkjum",
+ "tags-edit-manage-link": "Sýsla með merki",
"tags-edit-existing-tags": "Fyrirliggjandi merki:",
"tags-edit-existing-tags-none": "''Ekkert''",
"tags-edit-new-tags": "Ný merki:",
"tags-edit-chosen-placeholder": "Veldu einhver merki",
"tags-edit-chosen-no-results": "Engin merki fundust sem samsvara",
"tags-edit-reason": "Ástæða:",
+ "tags-edit-none-selected": "Vinsamlega veldu a.m.k. eitt merki til að bæta við eða fjarlægja.",
"comparepages": "Bera saman síður",
"compare-page1": "Síða 1",
"compare-page2": "Síða 2",
"compare-title-not-exists": "Umbeðinn titill er ekki til.",
"compare-revision-not-exists": "Umbeðin útgáfa er ekki til.",
"dberr-problems": "Því miður!Tæknilegir örðugleikar eru á þessari síðu.",
- "dberr-again": "Reyndu að bíða í nokkrar mínútur og endurhladdu síðan síðuna.",
+ "dberr-again": "Reyndu að bíða í nokkrar mínútur og endurhlaða síðan síðuna.",
"dberr-info": "(Mistókst að fá aðgang að gagnaþjóni: $1)",
"dberr-info-hidden": "(Mistókst að fá aðgang að gagnaþjóni)",
"dberr-usegoogle": "Þú getur notað Google til að leita á meðan.",
"logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
"logentry-upload-upload": "$1 {{GENDER:$2|hlóð inn}} $3",
"logentry-upload-overwrite": "$1 {{GENDER:$2|hlóð inn}} nýrri útgáfu af $3",
+ "log-name-managetags": "Breytingaskrá yfir sýsl með merki",
+ "logentry-managetags-create": "$1 {{GENDER:$2|bjó til}} merkið \"$4\"",
"rightsnone": "(engum)",
"revdelete-summary": "breytingarágrip",
"feedback-adding": "Bæti við svörun á síðuna...",
"api-error-fileexists-forbidden": "Skrá með nafninu \"$1\" er þegar til og ekki er hægt að yfirskrifa hana.",
"api-error-fileexists-shared-forbidden": "Skrá með nafninu \"$1\" er þegar til á miðlæga gagnaþjóninum og ekki er hægt að yfirskrifa hana.",
"api-error-file-too-large": "Skráin sem þú valdir er of stór.",
- "api-error-filename-tooshort": "Skráarnafnið er of stutt",
+ "api-error-filename-tooshort": "Skráarheitið er of stutt",
"api-error-filetype-banned": "Þessi gerð skráar er bönnuð.",
"api-error-filetype-banned-type": "$1 {{PLURAL:$4|er óleyfileg skráargerð|eru óleyfilegar skráargerðir}}. {{PLURAL:$3|Leyfð skráargerð er|Leyfðar skráargerðir eru}} $2.",
"api-error-filetype-missing": "Skráin hefur enga skráarendingu.",
"api-error-hookaborted": "Hætt var við breytinguna sem þú reyndir að gera með viðbót.",
"api-error-http": "Innri villa: Get ekki tengst vefþjón.",
- "api-error-illegal-filename": "Þetta skráarnafn er ekki leyft.",
+ "api-error-illegal-filename": "Þetta skráarheiti er ekki leyft.",
"api-error-internal-error": "Innri villa: Mistókst að vinna úr upphali þínu.",
"api-error-invalid-file-key": "Innri villa: Skrá fannst ekki í bráðabirgðageymslu.",
"api-error-missingparam": "Innri villa: Breytur vantar í beiðni.",
"recentchangeslinked-summary": "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).\nLe pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in <strong>grassetto</strong>.",
"recentchangeslinked-page": "Nome della pagina:",
"recentchangeslinked-to": "Mostra solo le modifiche alle pagine collegate a quella specificata",
- "recentchanges-page-added-to-category": "[[:$1]] aggiunto alla categoria",
+ "recentchanges-page-added-to-category": "[[:$1]] aggiunta alla categoria",
"recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è aggiunta|$2 pagine sono aggiunte}} alla categoria",
- "recentchanges-page-removed-from-category": "[[:$1]] rimosso dalla categoria",
- "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|una pagina è rimossa|$2 pagine sono rimosse}} dalla categoria",
+ "recentchanges-page-removed-from-category": "[[:$1]] rimossa dalla categoria",
+ "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|un'altra pagina|altre $2 pagine}} rimosse dalla categoria",
"autochange-username": "Modifica automatica MediaWiki",
"upload": "Carica un file",
"uploadbtn": "Carica",
"policy-url": "Project:정책",
"portal": "사용자 모임",
"portal-url": "Project:사용자 모임",
- "privacy": "개인 정보 정책",
- "privacypage": "Project:개인 정보 정책",
+ "privacy": "개인정보 정책",
+ "privacypage": "Project:개인정보 정책",
"badaccess": "권한 오류",
"badaccess-group0": "요청한 명령을 실행할 권한이 없습니다.",
"badaccess-groups": "요청한 명령은 {{PLURAL:$2|다음|다음 중 하나의}} 권한을 가진 사용자에게 제한됩니다: $1.",
"previewnote": "'''이 화면은 미리 보기입니다.'''\n편집한 내용은 아직 저장하지 않았습니다!",
"continue-editing": "편집 영역으로 가기",
"previewconflict": "이 미리 보기는 저장할 때의 모습으로 위쪽 편집창의 문서를 반영합니다.",
- "session_fail_preview": "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.'''\n다시 시도하세요.\n다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요.",
+ "session_fail_preview": "세션 데이터가 없어져 편집을 저장하지 못했습니다.\n\n로그아웃 되었는지도 모릅니다. '''아직 로그인 상태인지 확인하고 다시 시도해주세요.'''\n다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요. 그리고 브라우저 설정에서 쿠키 사용을 허용하는지 확인하세요.",
"session_fail_preview_html": "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.'''\n\n{{SITENAME}}에서 HTML 입력을 허용하기 때문에, 자바스크립트 공격을 막기 위해 미리 보기는 숨겨져 있습니다.\n\n'''적합하게 편집을 시도했다면 다시 시도하세요'''\n다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인하세요.",
"token_suffix_mismatch": "'''저장하려는 내용의 문장 부호가 망가져 있습니다.'''\n문서 보호를 위해 해당 내용을 저장하지 않습니다.\n버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.",
"edit_form_incomplete": "'''편집의 일부 내용이 서버에 전달되지 않았습니다. 편집이 손상되지 않았는지 확인하고 다시 시도해 주십시오.'''",
"import-nonewrevisions": "Nisciuna verziona mpurtata (Tutt' 'e verziune so' state già mpurtate o pure zumpajeno pe' bbia 'e cocch'errore).",
"xml-error-string": "$1 a 'a linea $2, culonne $3 (byte $4): $5",
"import-upload": "Carreca 'e date 'e XML",
- "import-token-mismatch": "Se so' perdut' 'e date d' 'a sessione.\nProva n'ata vota.",
+ "import-token-mismatch": "Se so' perdut' 'e date d' 'a sessione.\n\nPuò darse ca site asciuto/a. <strong>Pe' piacere cuntrullate si site ancora dinto e tentate n'ata vota</strong>.\n\nSi chesto nun funziunasse ancora, tentate 'e ve n'[[Special:UserLogout|ascì]] e trasì n'ata vota dinto, cuntrullate si 'o navigatore vuosto premmettesse 'e cookies 'e stu sito.",
"import-invalid-interwiki": "Nun se può mpurtà d' 'a wiki specificata.",
"import-error-edit": "'A paggena \"$1\" nun è stata mpurtata pecché nun avite 'o permesso p' 'a putè cagnà.",
"import-error-create": "'A paggena \"$1\" nun è stata mpurtata pecché nun avite 'o permesso p' 'a putè crià.",
"expand_templates_generate_xml": "Fà vedè l'arvero 'e l'analisi XML",
"expand_templates_generate_rawhtml": "Fà verè 'o codece HTML 'n cruro",
"expand_templates_preview": "Anteprimma",
- "expand_templates_preview_fail_html": "<em>Siccomme {{SITENAME}} téne 'o HTML 'ncruro appicciato e se songhe spierze 'e date d' 'a sessiona, 'a previsualizzaziona s'è annascunnuta comm'a na prutezione annanz'e uerre 'e JavaScript.</em>\n\n<strong>Si chist'è nu tentativo giustificato 'e previsualizzaziona, pe' piacere facite n'ata vota.</strong>\nSi nun funziona ancora, facite d'[[Special:UserLogout|ascì]] e trasì n'ata vota.",
+ "expand_templates_preview_fail_html": "<em>Siccomme {{SITENAME}} téne 'o HTML 'ncruro appicciato e se songhe spierze 'e date d' 'a sessiona, 'a previsualizzaziona s'è annascunnuta comm'a na prutezione annanz'e uerre 'e JavaScript.</em>\n\n<strong>Si chist'è nu tentativo giustificato 'e previsualizzaziona, pe' piacere facite n'ata vota.</strong>\nSi nun funziona ancora, facite d'[[Special:UserLogout|ascì]] e trasì n'ata vota.\n\nSi chesto nun funziunasse ancora, tentate 'e ve n'[[Special:UserLogout|ascì]] e trasì n'ata vota dinto, cuntrullate si 'o navigatore vuosto premmettesse 'e cookies 'e stu sito.",
"expand_templates_preview_fail_html_anon": "<em>Siccomme {{SITENAME}} téne 'o HTML 'ncruro e vuje nun site trasute 'o sito, 'a previsualizzaziona s'è annascunnuta comm'a na prutezione annanz'e uerre 'e JavaScript.</em>\n\n<strong>Si chist'è nu tentativo giustificato 'e previsualizzaziona, pe' piacere facite d'[[Special:UserLogout|ascì]] e trasì n'ata vota.</strong>",
"expand_templates_input_missing": "Avita dà minimo nu poco 'e testo scritto.",
"pagelanguage": "Cagna 'o nomme d' 'a paggena",
"tog-hideminor": "Amagar los cambiaments menors dins los darrièrs cambiaments",
"tog-hidepatrolled": "Amagar las modificacions susvelhadas dins los darrièrs cambiaments",
"tog-newpageshidepatrolled": "Amagar las paginas susvelhadas de la lista de las paginas novèlas",
+ "tog-hidecategorization": "Amagar la categorizacion de las paginas",
"tog-extendwatchlist": "Espandir la lista de seguiment per afichar totas las modificacions e non pas solament las mai recentas",
"tog-usenewrc": "Agropar los cambiaments per pagina dins los darrièrs cambiaments e la lista de seguiment",
"tog-numberheadings": "Numerotar automaticament los títols",
"october-date": "$1 d'octobre",
"november-date": "$1 de novembre",
"december-date": "$1 de decembre",
+ "period-am": "AM",
+ "period-pm": "PM",
"pagecategories": "{{PLURAL:$1|Categoria|Categorias}}",
"category_header": "Articles dins la categoria « $1 »",
"subcategories": "Soscategorias",
"virus-scanfailed": "Fracàs de la recèrca (còde $1)",
"virus-unknownscanner": "antivirús desconegut :",
"logouttext": "'''Ara, sètz desconnectat.'''\n\nNotatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connectat, fins al moment qu'escafaretz l'escondedor de vòstre navigador.",
+ "cannotlogoutnow-title": "Impossible de se desconnectar ara",
"welcomeuser": "Benvenguda, $1 !",
"welcomecreation-msg": "Vòstre compte d'utilizaire es estat creat.\nDoblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
"yourname": "Nom d'utilizaire :",
"remembermypassword": "Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})",
"userlogin-remembermypassword": "Gardar ma sesilha activa",
"userlogin-signwithsecure": "Utilizar una connexion securizada",
+ "cannotloginnow-title": "Impossible de se connectar ara",
"yourdomainname": "Vòstre domeni",
"password-change-forbidden": "Podètz pas modificar los senhals sus aqueste wiki.",
"externaldberror": "Siá una error s’es producha amb la banca de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.",
"special-characters-group-greek": "Grèc",
"special-characters-group-cyrillic": "Cirillic",
"special-characters-group-arabic": "Arabi",
- "special-characters-group-arabicextended": "arabi espandit",
+ "special-characters-group-arabicextended": "Arabi espandit",
"special-characters-group-persian": "Pèrse",
"special-characters-group-hebrew": "Ebrieu",
"special-characters-group-bangla": "Bengali",
"allmessages-filter-translate": "Kiännä",
"thumbnail-more": "Suurendua",
"filemissing": "Failua ei ole",
- "tooltip-pt-userpage": "Sinun käyttäisivu",
- "tooltip-pt-mytalk": "Sinun paginsivu",
- "tooltip-pt-preferences": "Sinun azetukset",
+ "tooltip-pt-userpage": "{{GENDER:|}} käyttäisivu",
+ "tooltip-pt-mytalk": "{{GENDER:|}} paginsivu",
+ "tooltip-pt-preferences": "{{GENDER:|}} azetukset",
"tooltip-pt-watchlist": "Listu sivulois kudamien muutoksii valvot",
- "tooltip-pt-mycontris": "Luvettelo sinun kirjutuksis",
+ "tooltip-pt-mycontris": "Luvettelo {{GENDER:|}} kirjutuksis",
"tooltip-pt-login": "Täs voibi registriiruijakseh, ga se ei ole vältämätöi",
"tooltip-pt-logout": "Kirjuttai ullos",
"tooltip-pt-createaccount": "Voit registriiruijakseh da kirjuttuakseh järjestelmäh, ga se ei ole vältämätöi",
"tooltip-t-whatlinkshere": "Kaikkien sivuloin luvettelo, kudamis on linki täh sivuh",
"tooltip-t-recentchangeslinked": "Jälgimäzet muutokset sivuloil, kudamile on linki täl sivul",
"tooltip-feed-atom": "Atom-syöttö täh sivuh",
- "tooltip-t-contributions": "Listu tämän käyttäjän kirjutuksis",
+ "tooltip-t-contributions": "Listu tämän käyttäjän kirjutuksis {{GENDER:$1|this user}}",
"tooltip-t-upload": "Ližiä tiijostot",
"tooltip-t-specialpages": "Kaikkien erikozien sivuloin luvettelo",
"tooltip-t-print": "Tämän sivun tulostettavu versii",
"previewnote": "<strong>To jest tylko podgląd.</strong>\nZmiany nie zostały jeszcze zapisane!",
"continue-editing": "Przejdź do pola edycji",
"previewconflict": "Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.",
- "session_fail_preview": "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.\nSpróbuj jeszcze raz.\nJeśli to nie pomoże – [[Special:UserLogout|wyloguj się]] i zaloguj ponownie.'''",
- "session_fail_preview_html": "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.'''\n\n''Ponieważ w {{GRAMMAR:MS.lp|{{SITENAME}}}} włączona została opcja „surowy HTML”, podgląd został ukryty w celu zabezpieczenia przed atakami z użyciem JavaScriptu.''\n\n'''Jeśli jest to uprawniona próba dokonania edycji, spróbuj jeszcze raz.\nJeśli to nie pomoże – [[Special:UserLogout|wyloguj się]] i zaloguj ponownie.'''",
+ "session_fail_preview": "Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.\n\nByć może doszło do wylogowania. <strong>Proszę upewnij się, czy nadal jesteś zalogowany (zalogowana) i wtedy spróbuj ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
+ "session_fail_preview_html": "Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.\n\n<em>Ponieważ w {{GRAMMAR:MS.lp|{{SITENAME}}}} włączona została opcja „surowy HTML”, podgląd został ukryty w celu zabezpieczenia przed atakami z użyciem JavaScriptu.</em>\n\n<strong>Jeśli jest to uprawniona próba dokonania edycji, spróbuj jeszcze raz.<strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
"token_suffix_mismatch": "'''Twoja edycja została odrzucona, ponieważ twój klient pomieszał znaki interpunkcyjne w żetonie edycyjnym.\nTwoja edycja została odrzucona by zapobiec zniszczeniu tekstu strony.\nTakie problemy zdarzają się w wypadku korzystania z wadliwych anonimowych sieciowych usług proxy.'''",
"edit_form_incomplete": "'''Niektóre informacje wprowadzone do formularza nie dotarły do serwera. Upewnij się, że wprowadzone dane nie uległy uszkodzeniu i spróbuj ponownie.'''",
"editing": "Edytujesz $1",
"grant-uploadfile": "Przesyłanie nowych plików",
"grant-basic": "Podstawowe uprawnienia",
"grant-viewdeleted": "Wyświetlanie usuniętych plików i stron",
- "grant-viewmywatchlist": "Zobacz listę obserwowanych",
+ "grant-viewmywatchlist": "Zobacz swoją listę obserwowanych",
"newuserlogpage": "Nowi użytkownicy",
"newuserlogpagetext": "To jest rejestr ostatnio utworzonych kont użytkowników",
"rightslog": "Uprawnienia",
"import-nonewrevisions": "Nie zaimportowano żadnych wersji (wszystkie były już obecne albo pominięte z powodu błędów).",
"xml-error-string": "$1 linia $2, kolumna $3 (bajt $4): $5",
"import-upload": "Prześlij dane w formacie XML",
- "import-token-mismatch": "Utracono dane sesji. Proszę spróbować ponownie.",
+ "import-token-mismatch": "Utracono dane sesji. \n\nByć może doszło do wylogowania. <strong>Proszę upewnij się, czy nadal jesteś zalogowany (zalogowana) i wtedy spróbuj ponownie.</strong>\nJeśli to nie pomoże – spróbuj [[Special:UserLogout|wylogować się]] i zalogować ponownie, a także upewnij się, że twoja przeglądarka akceptuje ciasteczka z tej witryny.",
"import-invalid-interwiki": "Nie można importować z podanej wiki.",
"import-error-edit": "Strona „$1” nie została zaimportowana, ponieważ nie jesteś uprawniony do jej edytowania.",
"import-error-create": "Strona „$1” nie została zaimportowana, ponieważ nie jesteś uprawniony do jej utworzenia.",
"lastmodifiedatby": "Ostatnia edycja tej strony: $2, $1 (autor zmian: $3)",
"othercontribs": "Inni autorzy: $1.",
"others": "inni",
- "siteusers": "{{PLURAL:$2|użytkownik|użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}{{PLURAL:$2||:}} $1",
+ "siteusers": "{{PLURAL:$2|użytkownik |użytkownicy}}{{GRAMMAR:D.lp|{{SITENAME}}}}{{PLURAL:$2||:}} $1",
"anonusers": "{{PLURAL:$2|niezalogowany użytkownik|niezalogowani użytkownicy}} {{GRAMMAR:D.lp|{{SITENAME}}}}{{PLURAL:$2||:}} $1",
"creditspage": "Autorzy",
"nocredits": "Brak informacji o autorach tej strony.",
"version-libraries-license": "Licencja",
"version-libraries-description": "Opis",
"version-libraries-authors": "Autorzy",
- "redirect": "Przekierowanie według pliku, użytkownika, strony lub identyfikatora wersji",
+ "redirect": "Przekierowanie z identyfikatora pliku, użytkownika, strony, wersji lub wpisu rejestru",
"redirect-legend": "Przekieruj do pliku lub strony",
"redirect-summary": "Ta strona specjalna przekierowuje do: pliku (o podanej nazwie), do strony (o podanym numerze wersji lub identyfikatorze strony) albo do strony użytkownika (o podanym identyfikatorze numerycznym). Sposób użycia: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] albo [[{{#Special:Redirect}}/user/101]].",
"redirect-submit": "Przejdź",
"userrights-user-editname": "Forneça um nome de usuário:",
"editusergroup": "Editar grupos {{GENDER:$1|do(a) usuário(a)}}",
"editinguser": "Modificando privilégios d{{GENDER:$1|o usuário|a usuária|o(a) usuário(a)}} <strong>[[User:$1|$1]]</Strong> $2",
- "userrights-editusergroup": "Editar grupos do usuário",
+ "userrights-editusergroup": "Editar grupos {{GENDER:$1|do usuário|da usuária|do(a) usuário(a)}}",
"saveusergroups": "Salvar grupos de{{GENDER:$1|usuário}}",
"userrights-groupsmember": "Membro de:",
"userrights-groupsmember-auto": "Membro implícito de:",
"mergehistory-fail-bad-timestamp": "Registo data/hora inválido",
"mergehistory-fail-invalid-source": "Página de origem inválida.",
"mergehistory-fail-invalid-dest": "Página de destino inválida.",
+ "mergehistory-fail-permission": "Permissões insuficientes para fundir os históricos.",
"mergehistory-fail-self-merge": "As páginas de origem e de destino não podem ser a mesma.",
"mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
"mergehistory-no-source": "A página de origem $1 não existe.",
"userrights-user-editname": "Introduza um nome de utilizador:",
"editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
"editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}} <strong>[[User:$1|$1]]</strong> $2",
- "userrights-editusergroup": "Editar grupos do utilizador",
+ "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
"saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
"userrights-groupsmember": "Membro de:",
"userrights-groupsmember-auto": "Membro implícito de:",
"right-createpage": "Criar páginas (que não sejam páginas de discussão)",
"right-createtalk": "Criar páginas de discussão",
"right-createaccount": "Criar novas contas de utilizador",
+ "right-autocreateaccount": "Aceder ao sistema automaticamente com uma conta de usuario externa",
"right-minoredit": "Marcar edições como menores",
"right-move": "Mover páginas",
"right-move-subpages": "Mover páginas com as suas subpáginas",
"right-managechangetags": "Criar e eliminar [[Special:Tags|etiquetas]] da base de dados",
"right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações",
"right-changetags": "Adicionar ou remover [[Special:Tags|etiquetas]] arbitrárias em revisões e entradas de registo individuais",
- "grant-generic": "Pacote de direitos \"$1\"",
+ "grant-generic": "Conjunto de direitos \"$1\"",
"grant-group-page-interaction": "Interagir com páginas",
"grant-group-file-interaction": "Interagir com conteúdo multimédia",
"grant-group-watchlist-interaction": "Interagir com a sua lista de vigiados",
"sqlite-no-fts": "Shown on [[Special:Version]].\nParameters:\n* $1 - version",
"logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
"logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}",
- "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $3 - the name of the log page inside parenthesis",
+ "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events",
"logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3",
- "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}\n* $3 - the name of the log page inside parenthesis",
+ "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}",
"logentry-delete-revision-legacy": "{{Logentry|[[Special:Log/delete]]}}",
"logentry-suppress-delete": "{{Logentry}}\n\n'Hid' is a possible alternative to 'suppressed' in this message.",
- "logentry-suppress-event": "{{Logentry}}\n{{Logentryparam}}\n$3 is the name of the log page inside parenthesis",
+ "logentry-suppress-event": "{{Logentry}}\n{{Logentryparam}}\n* $5 - count of affected log events",
"logentry-suppress-revision": "{{Logentry}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3.",
- "logentry-suppress-event-legacy": "{{Logentry}}\n$3 is the name of the log page inside parenthesis",
+ "logentry-suppress-event-legacy": "{{Logentry}}",
"logentry-suppress-revision-legacy": "{{Logentry}}",
"revdelete-content-hid": "Used on\n* {{msg-mw|logentry-delete-event}}\n* {{msg-mw|logentry-delete-revision}}\n* {{msg-mw|logentry-suppress-event}}\n* {{msg-mw|logentry-suppress-event}}",
"revdelete-summary-hid": "Used on\n* {{msg-mw|logentry-delete-event}}\n* {{msg-mw|logentry-delete-revision}}\n* {{msg-mw|logentry-suppress-event}}\n* {{msg-mw|logentry-suppress-event}}",
"Krivoshapkina",
"Macofe",
"Matma Rex",
- "Мария Олесова"
+ "Мария Олесова",
+ "Ай-Куо"
]
},
"tog-underline": "Сигэлэри аннынан тардыы:",
"databaseerror-query": "Ыйытык: $1",
"databaseerror-function": "Функция: $1",
"databaseerror-error": "Алҕас: $1",
+ "transaction-duration-limit-exceeded": "\nРепликация оҥорорго улахан лаг мэһэйдээбэтин туһугар транзакция тохтотуллубута, сурутуу уһуна ($1) ($2){{PLURAL:$2|}}лимиты таһынан ааһарын быһыытынан.\nЭн биир олорууга хас да элэмиэни уларытар буоллаххына, ол оннугар элбэх улахана суох операциялары оҥорорго холонон көрүҥ.",
"laggedslavemode": "Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп",
"readonly": "Билии олоҕун уларытар бобуллубут",
"enterlockreason": "Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.",
"missingarticle-rev": "(#-с торум: $1)",
"missingarticle-diff": "(Уратыта: $1, $2)",
"readonly_lag": "Билии олоҕун хос сиэрбэрдэрэ сүрүн сиэрбэри кытта мэнэйдэһэр кэмнэригэр билии олоҕо хатанна",
+ "nonwrite-api-promise-error": " HTTP-аат 'Promise-Non-Write-API-Action'ыытылынна, ол гынан баран ыйытык суруйуу API-модулугар барбыта.",
"internalerror": "Ис алҕас (внутренняя ошибка)",
"internalerror_info": "Ис алҕас: $1",
"internalerror-fatal-exception": "\"$1\" тииптээх төлөрүйбэт туорааһын",
"mypreferencesprotected": "Бэйэҥ туруорууларгын уларытар кыаҕыҥ суох эбит.",
"ns-specialprotected": "{{ns:special}} ааттаах сирэйдэр уларытыллыбаттар.",
"titleprotected": "Бу бас тыл оҥоһулларын [[User:$1|$1]] боппут.\nТөрүөтэ - ''$2''",
- "filereadonlyerror": "«$1» билэни уларытар сатаммата, тоҕо диэтэххэ «$2» «ааҕарга эрэ» диэн эрэсиимҥэ турар эбит.\n\nБу эрэсиими туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: «''$3''».",
+ "filereadonlyerror": "«$1» билэни уларытар сатаммата, тоҕо диэтэххэ «$2» «ааҕарга эрэ» диэн эрэсиимҥэ турар эбит.\n\nБу эрэсиими туруорбут систиэмэлээх дьаһабыл маннык быһаарыыны хаалларбыт: «''$3''».",
"invalidtitle-knownnamespace": "«$2» аат далыгар маннык тиэкистээх «$3» сатаммат аат",
"invalidtitle-unknownnamespace": "Биллибэт аат дала $1 нүөмэрдээх, \"$2\" тиэкистээх сатаммат аат",
"exception-nologin": "Ааккын билиһиннэрбэтэххин",
"changepassword-success": "Киирии тылыҥ этэҥҥэ уларыйда!",
"changepassword-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
"botpasswords": "Оруобаттар аһарыктара",
+ "botpasswords-summary": "<em>Хатыыр тыллара</em> туттааччы учуоттуур сурутуутугар API-нан логины уонна хатыыр тылы туттубакка эрэ киирэр кыах биэрэр. Кыттааччы бота хатыыр тыллаах киириитигэр бырааба хааччахтаныан сөп.\nЭн ити тоҕо наадатын билбэт буоллаххына, бука, итини гымматыҥ ордук.Ким даҕаны эйигиттэн хаһан даҕаны эн оҥорбутуҥ уонна биллэрбитиҥ диэн ыйытыа суохтаах.",
"botpasswords-disabled": "Оруобаттар аһарыктара араарыллыбыттар.",
"botpasswords-no-central-id": "Оруобат аһарыгын туһанарга кииннэммит ааккынан киириэхтээххин.",
"botpasswords-existing": "Билигин баар оруобат аһарыктара",
"botpasswords-label-delete": "Сот",
"botpasswords-label-resetpassword": "Аһарыгы саҥаттан",
"botpasswords-label-grants": "Туттуллар көҥүллэр:",
+ "botpasswords-help-grants": " Кыттааччы учуоттуур суруйуутугар баар ыйыллыбыт кыттааччы быраабыгар киирэргэ кыах биэрэр. к. [[Special:ListGrants|көҥүллэр табылыыссаларын]] эбии информацияны ылар туһугар.",
"botpasswords-label-restrictions": "Туттарга хааччахтаах:",
"botpasswords-label-grants-column": "Көҥүллэннэ",
"botpasswords-bad-appid": "Маннык аат «$1» сатаммат.",
"botpasswords-insert-failed": "«$1» диэн ааттаах оруобаты эбэр табыллыбата. Баҕар хайыы-үйэ эбиллибитэ буолаарай?",
+ "botpasswords-update-failed": "\"$1\" диэн ааттаах ботаны кыайан саҥардыбатыбыт. Баҕар, сотторуллубута буолуо?",
"botpasswords-created-title": "Оруобат аһарыга оҥоһулунна",
"botpasswords-created-body": "«$1» оруобат аһарыга бигэргэтилиннэ.",
"botpasswords-updated-title": "Оруобат аһарыга саҥардылынна",
"botpasswords-updated-body": "«$1» оруобат аһарыга уларытылынна.",
"botpasswords-deleted-title": "Оруобат аһарыга сотулунна",
"botpasswords-deleted-body": "«$1» оруобат аһарыга сотулунна.",
+ "botpasswords-newpassword": "\nСаҥа хатыыр тыл <strong>$1</strong> — <strong>$2</strong> аннынан киириигэ. <em> суруй аныгыскыга туттарга.</em>",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider кыаллыбат.",
"botpasswords-restriction-failed": "Буот аһарыгын кытта сыһыаннаах хааччахтан киирии сатаммата.",
+ "botpasswords-invalid-name": " туттааччы аата ыйыллыбыт (\"$1\") араарааччы бот хатыыр ааты илдьэ сылдьыбат.",
+ "botpasswords-not-exist": "«$1» кыттааччыга «$2» диэн ааттаммыт оруобакка аналлаах аһарыга суох эбит.",
"resetpass_forbidden": "Киирии тылы уларытар сатаммат",
"resetpass-no-info": "Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.",
"resetpass-submit-loggedin": "Киирии тылы уларытыы",
"previewnote": "'''Бу барыллаан көрүү эрэ.'''\nАтын уларытыы бигэргэтиллэ илик!",
"continue-editing": "Уларытар сиргэ",
"previewconflict": "Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.",
- "session_fail_preview": "'''Сиэрбэр сессия идентификаторын сүтэрэн кэбиһэн эн уларытыыгын кыайан киллэрбэтэ.\nӨссө холонон көр.\nОлох сатамматаҕына биикиттэн [[Special:UserLogout|тахсан]] баран өссө киирэн көрөөр.'''",
+ "session_fail_preview": "'''Сиэрбэр сессия идентификаторын сүтэрэн кэбиһэн эн уларытыыгын кыайан киллэрбэтэ.\nБаҕар, үлэ сеансын бүтэрбитиҥ буолуо. <strong>Баһаалыста, көҥүлү ааспыккын бил уонна өссө холонон көр.\n<strong>\nОлох сатамматаҕына биикиттэн [[Special:UserLogout|тахсан]] баран өссө киирэн көрөөр, ону сэргэ браузерыҥ бу саайтан cookies диэни ыларга көҥүллүүрүн бэрэбиэркэлээҥ.'''",
"session_fail_preview_html": "'''Сессия дааннайдарын сүтэрэн кэбиһэн сиэрбэр эн уларытыыгын киллэрбэтэ.'''\n\n''{{SITENAME}} ыраас HTML тылы көҥүллүүр буолан JavaScript туһананнар куһаҕаны оҥоруохтарын сөп, онон эрдэ көрдөрүү араарыллыбыт.''\n\n'''Өскө бу уларытыы туох да куһаҕаны аҕалыа диэбэт буоллаххына хатылаа. Ол сатамматаҕына [[Special:UserLogout|тахсан баран]] өссө киирэн көрөөр.'''",
"token_suffix_mismatch": "'''Эн уларытыыҥ киирбэтэ, тоҕо диэтэххэ эн бырагырааммаҥ сорох сурук бэлиэлэрин сыыһа көрөр эбит.\nЫстатыйаны буорту гынымаары уларытыыҥ ылыныллыбата.\nИтинник сыыһалар үксүн прокси-сиэрбэрдэри туһаннахха тахсааччылар.'''",
"edit_form_incomplete": "'''Уларытыы сорҕото сиэрбэргэ тиийбэтэ. Үчүгэйдик сыныйан көр, Эн уларытыыларыҥ туох да омсото суохтар дуо. Онтон өссө боруобалаа.'''",
"mergehistory-fail-bad-timestamp": "Кэм бэлиэтэ алҕастаах.",
"mergehistory-fail-invalid-source": "Сирэй төрүтэ алҕастаах.",
"mergehistory-fail-invalid-dest": "Барыахтаах сирэйиҥ алҕастаах.",
+ "mergehistory-fail-no-change": "Устуоруйа холбоһуутугар ханнык да биэрсийэ холбоһуута буолбата. Баһаалыста сирэйи уонна быстах кэмнээх кэмнэбили өссө төгүл бэрэбиэркэлээ.",
"mergehistory-fail-permission": "Устуоруйаны холбуурга быраап тиийбэт",
"mergehistory-fail-self-merge": "Саҕалыыр уонна түмүктүүр сирэйдэриҥ атын буолуохтаахтар",
"mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1 барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
"apisandbox-submit": "Ыйытык оҥоруу",
"apisandbox-reset": "Сот",
"apisandbox-retry": "Хатылаа",
+ "apisandbox-helpurls": "Көмө сигэлэр",
+ "apisandbox-examples": "Холобурдар",
"apisandbox-dynamic-parameters": "Дьайыы кээмэйдэрэ.",
"apisandbox-dynamic-parameters-add-label": "Кэриҥи эбии.",
"apisandbox-dynamic-parameters-add-placeholder": "Кэриҥ аата.",
+ "apisandbox-dynamic-error-exists": "«$1» диэн ааттаах параметр хайыы үйэ баар эбит.",
"apisandbox-deprecated-parameters": "Эргэрбит кэриҥнэр.",
+ "apisandbox-fetch-token": "Токены аптамаатынан толоруу",
+ "apisandbox-submit-invalid-fields-title": "Сорҕото алҕастаах",
"apisandbox-submit-invalid-fields-message": "Бука диэн бэлиэтэммит хонууну көннөр уонна хаттаан ук.",
"apisandbox-results": "Түмүк",
+ "apisandbox-sending-request": "API-көрдөбүлү ыытыы…",
+ "apisandbox-loading-results": "API-түмүгүн ылыы…",
"apisandbox-results-fixtoken": "Токены көннөрөн баран саҥаттан ыыт.",
"booksources": "Кинигэлэр источниктара",
"booksources-search-legend": "Кинигэ туһунан көрдөө",
"tags-deactivate-not-allowed": "\"$1\" тиэги араарар табыллыбат.",
"tags-deactivate-submit": "араар",
"tags-apply-no-permission": "Бэйэҥ уларытыыгар уларытыы тиэгин туруорар кыаҕыҥ суох эбит.",
+ "tags-apply-blocked": "Хатана сылдьар кэмҥитигэр көннөрүүлэргитигэр уларытыы бэлиэлэрин туттаргыт табыллыбат.",
"tags-apply-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
"tags-apply-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
"tags-update-no-permission": "Сурунаал тус-туспа торумнарын уонна суруктарын тиэгин эбэр уонна уларытар кыаҕыҥ суох эбит.",
"Matma Rex",
"Anj.balaji",
"Dineshkumar Ponnusamy",
- "Sharanrajindia"
+ "Sharanrajindia",
+ "Maathavan"
]
},
"tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
"right-blockemail": "பயனர் மின்னஞ்சல் அனுப்புவதை தடுக்கவும்",
"right-hideuser": "பயனர்பெயரை தடுத்து, மறைக்கவும்",
"right-ipblock-exempt": "ஐ.பி (IP) தடுப்புகளையும், தானியங்கியான தடுப்புகளையும், வரம்புவரையான தடுப்புகளையும் மீறிச் செயல்படுக.",
- "right-proxyunbannable": "தானாக தடுப்புகப்பட்ட Proxies ஐ மீறு.",
"right-unblockself": "நீங்களே தடுப்பு நீக்குக",
"right-protect": "பாதுகாப்பு மட்டங்களை மாற்று மற்றும் தொடர்-பாதுகாக்கப்பட்ட பக்கங்களை திருத்து",
"right-editprotected": "\"{{int:protect-level-sysop}}\" ஆல் பாதுகாக்கப்பட்ட பக்கங்களை திருத்து",
"right-managechangetags": "தரவுதளத்திலிருந்து [[Special:Tags|அடையாளங்களை]] உருவாக்கு மற்றும் நீக்கு",
"right-applychangetags": "ஒருவரின் மாற்றத்துடன் [[Special:Tags|அடையாளங்களை]] செயற்படுத்து",
"right-changetags": "தனியொருவரின் திருத்தம் மற்றும் செயற்பாட்டு பதிவுகளில் [[Special:Tags|அடையாளங்களை]] சேர் அல்லது நீக்கு",
+ "grant-group-administration": "நிர்வாக நடவடிக்கைகளை செயல்படுத்து",
"newuserlogpage": "பயனர் உருவாக்கம் பற்றிய குறிப்பு",
"newuserlogpagetext": "இது பயனர் படைப்புகளின் பதிவு ஆகும்.",
"rightslog": "பயனர் உரிமைகள் பதிகை",
"watchthisupload": "இந்த கோப்பினைக் கவனி",
"filewasdeleted": "இப்பெயரைக் கொண்ட கோப்பு முன்பு பதிவேற்றப்பட்டு பின்னர் நீக்கப்பட்டது. பதிவேற்றத்துக்குப் முன்னர் $1 ஐச் சரிபார்க்கவும்.",
"filename-bad-prefix": "நீங்கள் பதிவேற்ற எத்தனிக்கும் கோப்பின் பெயர் '''\"$1\"''' என்பதுடன் தொடங்குகிறது, பொதுவாக இது எண்மருவி கமெராக்கலால் தானியக்கமாக வழங்கப்புடும் பெயராகும். அருள் கூர்ந்து கோப்பிற்கு விளக்கமான பெயரொன்றைக் கொடுக்கவும்.",
- "upload-success-subj": "வெற்றிகரமான பதிவேற்றம்",
- "upload-success-msg": "[$2] லிருந்து உங்கள் தகவலேற்றம் நடக்கவில்லை.அது [[:{{ns:file}}:$1]] இங்கு கிடைக்கப்பெறும்.",
- "upload-failure-subj": "பதிவேற்றத்தில் ஏற்பட்டத் தொல்லை",
- "upload-failure-msg": "[$2] லிருந்து உங்கள் தகவலேற்றத்தில் சிக்கல் உள்ளது.\n$1",
- "upload-warning-subj": "பதிவேற்றல் எச்சரிக்கை",
- "upload-warning-msg": "$2 லிருந்து உங்கள் தகவலேற்றத்தில் சிக்கல் உள்ளது. அதை சரி செய்ய நீங்கள் இங்கே செல்லலாம் [[Special:Upload/stash/$1|upload form]].",
"upload-proto-error": "பிழையான நெறி",
"upload-proto-error-text": "தொலைவுப் பதிவேற்றத்துக்கு யு.ஆர்.எல். <code>http://</code> அல்லது <code>ftp://</code> என்ற முன்னொட்டுடன் தொடங்கவேண்டும்.",
"upload-file-error": "உள்ளகத் தவறு",
"querypage-disabled": "செயல்பாட்டு காரணங்களுக்காக இந்த சிறப்புப் பக்கம் முடக்கப்பட்டுள்ளது.",
"apihelp": "ஏபிஐ உதவி",
"apihelp-no-such-module": "''$1'' என்ற மாடுயூல் காணப்படவில்லை.",
+ "apisandbox": "API மணற்தொட்டி",
+ "apisandbox-api-disabled": "இத் தளத்தில் API செயலிழக்கம் செய்யப்பட்டுள்ளது.",
+ "apisandbox-submit": "கோரிக்கை செய்",
+ "apisandbox-reset": "வெறுமையாக்கு",
+ "apisandbox-examples": "உதாரணம்",
+ "apisandbox-results": "முடிவு",
+ "apisandbox-request-time": "வேண்டுகோள் நேரம்: $1",
"booksources": "நூல் மூலங்கள்",
"booksources-search-legend": "நூல் மூலங்களைத் தேடு",
"booksources-search": "தேடுக",
"wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
"wlnote": "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
"wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு",
- "watchlistall2": "அனைத்து",
"watchlist-options": "கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்",
"watching": "கவனிக்கப்படுகிறது...",
"unwatching": "கவனிப்பு விடப்படுகிறது...",
"tooltip-t-recentchangeslinked": "இப்பக்கத்துடன் இணைக்கப்பட்ட பக்கங்களில் மாற்றங்கள்",
"tooltip-feed-rss": "இப்பக்கத்துக்கான ஆர்.எஸ்.எஸ். ஓடை கிடையாது",
"tooltip-feed-atom": "இப்பக்கத்துக்கான அடொம் ஓடை கிடையாது",
- "tooltip-t-contributions": "இப்பயனரின் பங்களிப்புக்களின் பட்டியலைப் பார்",
+ "tooltip-t-contributions": "{{GENDER:$1|இப்பயனரின்}} பங்களிப்புக்களின் பட்டியலைப் பார்",
"tooltip-t-emailuser": "இப் பயனருக்கு மின்னஞ்சல் செய்",
"tooltip-t-info": "இப்பக்கத்தைப்பற்றி மேலதிக விபரம்",
"tooltip-t-upload": "கோப்புகளைப் பதிவேற்றுக",
"special-characters-group-lao": "இலாவோ",
"special-characters-group-khmer": "கெமெர்",
"special-characters-title-minus": "கழித்தல் குறி",
- "api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்."
+ "api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்.",
+ "randomrootpage": "தற்போக்கு வேர்ப் பக்கம்"
}
"pageinfo-robot-index": "İzin verilmiş",
"pageinfo-robot-noindex": "İzin verilmedi",
"pageinfo-watchers": "Sayfanın izleyici sayısı",
+ "pageinfo-visiting-watchers": "Son değişiklikleri görüntüleyen izleyici sayısı",
"pageinfo-few-watchers": "$1 {{PLURAL:$1|izleyiciden|izleyiciden}} az",
"pageinfo-redirects-name": "Bu sayfaya yönlendirme sayısı",
"pageinfo-redirects-value": "$1",
"previewnote": "<strong>Исегездә тотыгыз, бу алдан карау гына.</strong>\nТәзәтмәләрегез әлегә сакланмаган!",
"continue-editing": "Үзгәртүне дәвам итү",
"previewconflict": "Әлеге алдан карау битендә сакланачак текстның ничек күренәчәге күрсәтелә.",
- "session_fail_preview": "'''Кызганычка, сезнең сессия идентификаторыгыз югалды. Нәтиҗәдә сервер үзгәртүләрегезне кабул итә алмый.\nТагын бер тапкыр кабатлавыгыз сорала.\nБу хата тагын кабатланса, [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез.'''",
+ "session_fail_preview": "Кызганычка каршы сессия барышы югалы, шуңа күрә без сезнең төзәтмәләрнегезне кабул итә алмадык.\n\nБәлки сез хисап язмагыздан чыккансыздыр. <strong>Зинһар, керүегез турында инаныгыз һәм тагын бер тапкыр кабатлап карагыз.</strong>\nӘгәрдә бу ысул ярдәм итмәсәс, системадан [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез. Шулай ук сезгә браузерыгызның cookies файлларын кабул итүне тикшерүне карап чыгуны тәкъдим итәбез.",
"session_fail_preview_html": "'''Кызганычка, сезнең сессия турында мәгълүматлар югалды. Нәтиҗәдә сервер үзгәртүләрегезне кабул итә алмый.'''\n\n''{{SITENAME}} чиста HTML кулланырга рөхсәт итә, ә бу үз чиратында JavaScript-атакалар оештыру өчен кулланылырга мөмкин. Шул сәбәпле сезнең өчен алдан карау мөмкинлеге ябык.''\n\n'''Әгәр сез үзгәртүне яхшы ният белән башкарасыз икән, тагын бер тапкыр кабатлап карагыз. Хата кабатланса, сайттан [[Special:UserLogout|чыгыгыз]] һәм яңадан керегез.'''",
"token_suffix_mismatch": "'''Сезнең үзгәртү кабул ителмәде.'''\nСәбәбе: браузерыгыз үзгәртү өлкәсендәге пунктуацияне дөрес күрсәтми, нәтиҗәдә текст бозылырга мөмкин.\nМондый хаталар аноним web-проксилар кулланганда килеп чыгарга мөмкин.",
"edit_form_incomplete": "'''Төзәтү кырларының кайбер өлешләре серверга барып ирешмәде. Сезнең үзгәртүләр бозылмаганмы - игътибар белән тикшерегез һәм яңадан җибәреп карагыз.'''",
"restoreprefs": "Відновити всі стандартні налаштування (у всіх розділах)",
"prefs-editing": "Редагування",
"rows": "Рядків:",
- "columns": "Ð\9aолонок:",
+ "columns": "СÑ\82овпÑ\86Ñ\96в:",
"searchresultshead": "Пошук",
"stub-threshold": "Поріг для визначення оформлення посилань на стаби ($1):",
"stub-threshold-sample-link": "зразок",
"rcshowhidemine-show": "показати",
"rcshowhidemine-hide": "приховати",
"rcshowhidecategorization": "$1 категоризацію сторінок",
- "rcshowhidecategorization-show": "Ð\9fоказати",
+ "rcshowhidecategorization-show": "показати",
"rcshowhidecategorization-hide": "Приховати",
"rclinks": "Показати останні $1 редагувань за $2 днів<br />$3",
"diff": "різн.",
"october-date": "$1 tháng 10",
"november-date": "$1 tháng 11",
"december-date": "$1 tháng 12",
+ "period-am": "Sáng",
+ "period-pm": "Chiều",
"pagecategories": "{{PLURAL:$1}}Thể loại",
"category_header": "Các trang trong thể loại “$1”",
"subcategories": "Thể loại con",
"botpasswords-label-delete": "Xoá",
"botpasswords-label-resetpassword": "Đặt lại mật khẩu",
"botpasswords-label-grants": "Các quyền có liên quan:",
+ "botpasswords-insert-failed": "Không thể thêm tên bot \"$1\". Nó đã được thêm vào chưa?",
"botpasswords-created-title": "Mật khẩu bot đã được tạo",
+ "botpasswords-created-body": "Mật khẩu bot \"$1\" đã được tạo thành công.",
"botpasswords-updated-title": "Mật khẩu Bot đã được cập nhật",
+ "botpasswords-updated-body": "Mật khẩu bot \"$1\" đã được cập nhật thành công.",
"botpasswords-deleted-title": "Bot mật khẩu đã bị xóa",
+ "botpasswords-deleted-body": "Mật khẩu bot \"$1\" đã bị xóa.",
+ "botpasswords-no-provider": "BotPasswordsSessionProvider không có sẵn.",
"botpasswords-restriction-failed": "Mật khẩu bot giới hạn ngăn chặn đăng nhập này.",
"resetpass_forbidden": "Không được đổi mật khẩu",
"resetpass-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
"passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
"passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
"passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
- "passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử để tái tạo mật khẩu sẽ được gửi cho bạn.",
- "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử tương ứng đã được đăng ký, chúng tôi sẽ gửi thông tin để đặt lại mật khẩu qua thư điện tử.",
+ "passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử dùng để tái tạo mật khẩu sẽ được gửi cho bạn.",
+ "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
"passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
"passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
"changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
"right-createpage": "Tạo trang (không phải trang thảo luận)",
"right-createtalk": "Tạo trang thảo luận",
"right-createaccount": "Mở tài khoản mới",
+ "right-autocreateaccount": "Tự động đăng nhập bằng một tài khoản người dùng bên ngoài",
"right-minoredit": "Đánh dấu sửa đổi nhỏ",
"right-move": "Di chuyển trang",
"right-move-subpages": "Di chuyển trang cùng với các trang con của nó",
"action-createpage": "tạo trang",
"action-createtalk": "tạo trang thảo luận",
"action-createaccount": "mở tài khoản này",
+ "action-autocreateaccount": "tự động tạo tài khoản người dùng bên ngoài này",
"action-history": "xem lịch sử của trang này",
"action-minoredit": "đánh dấu đây là sửa đổi nhỏ",
"action-move": "di chuyển trang này",
"apisandbox-api-disabled": "API đã bị vô hiệu hóa trên trang web này.",
"apisandbox-intro": "Trang này dùng để thử nghiệm với '''API dịch vụ Web của MediaWiki'''.\nHãy tra cứu [//www.mediawiki.org/wiki/API:Main_page tài liệu API] để biết chi tiết về cách sử dụng API. Ví dụ: [//www.mediawiki.org/wiki/API#A_simple_example lấy nội dung của Trang Chính]. Chọn một tác vụ để xem thêm ví dụ.\n\nLưu ý rằng, mặc dù đây là một chỗ thử, nhưng các tác vụ của bạn tại trang này có thể thực hiện các thay đổi trên wiki.",
"apisandbox-fullscreen": "Mở rộng bảng điều khiển",
+ "apisandbox-unfullscreen": "Hiển thị trang",
"apisandbox-submit": "Yêu cầu",
"apisandbox-reset": "Tẩy trống",
"apisandbox-retry": "Thử lại",
"apisandbox-loading": "Đang tải thông tin cho mô-đun API \"$1\"...",
"apisandbox-no-parameters": "Mô-đun API này không có thông số.",
+ "apisandbox-helpurls": "Các đường dẫn trợ giúp",
"apisandbox-examples": "Các ví dụ",
"apisandbox-dynamic-parameters": "Tham số bổ sung",
"apisandbox-dynamic-parameters-add-label": "Thêm tham số:",
"apisandbox-dynamic-parameters-add-placeholder": "Tên tham số",
"apisandbox-dynamic-error-exists": "Một tham số có tên \"$1\" đã tồn tại.",
+ "apisandbox-fetch-token": "Tự động điền token này",
"apisandbox-results": "Kết quả",
+ "apisandbox-sending-request": "Đang gửi yêu cầu API...",
"apisandbox-loading-results": "Nhận kết quả API...",
"apisandbox-results-error": "Một lỗi xuất hiện khi tải các đáp ứng truy vấn API: $1.",
"apisandbox-request-url-label": "URL của yêu cầu:",
- "apisandbox-request-time": "Thời gian xử lý: $1",
+ "apisandbox-request-time": "Thời gian yêu cầu: {{PLURAL:$1|$1 ms}}",
+ "apisandbox-alert-page": "Các miền trên Trang này là không hợp lệ.",
"booksources": "Nguồn sách",
"booksources-search-legend": "Tìm kiếm nguồn sách",
"booksources-search": "Tìm kiếm",
"log-title-wildcard": "Tìm các tựa trang bắt đầu bằng các chữ này",
"showhideselectedlogentries": "Thay đổi mức khả kiến của các mục nhật trình đã chọn",
"log-edit-tags": "Sửa đổi thẻ đánh dấu của các mục nhật trình đã chọn.",
+ "checkbox-select": "Chọn: $1",
+ "checkbox-all": "Tất cả",
+ "checkbox-none": "Không",
+ "checkbox-invert": "Đảo ngược",
"allpages": "Mọi trang",
"nextpage": "Trang sau ($1)",
"prevpage": "Trang trước ($1)",
"hebrew-calendar-m11": "Av",
"hebrew-calendar-m12": "Elul",
"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|thảo luận]])",
+ "timezone-local": "Địa phương",
"duplicate-defaultsort": "Cảnh báo: Từ khóa xếp mặc định “$2” ghi đè từ khóa trước, “$1”.",
"duplicate-displaytitle": "<strong>Cảnh báo:</strong> Tên hiển thị “$2” ghi đè tên hiển thị “$1” bên trên.",
"invalid-indicator-name": "<strong>Lỗi:</strong> Không thể để trống thuộc tính <code>name</code> của cái chỉ trạng thái trang.",
"version-libraries-license": "Giấy phép",
"version-libraries-description": "Miêu tả",
"version-libraries-authors": "Tác giả",
- "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc số phiên bản",
+ "redirect": "Đổi hướng đến tập tin, người dùng, trang, hoặc ID đăng nhập",
"redirect-legend": "Đổi hướng đến tập tin hoặc trang",
"redirect-summary": "Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản hoặc số trang được cho vào), hoặc trang cá nhân (theo số thành viên). Cách sử dụng: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], hoặc [[{{#Special:Redirect}}/user/101]].",
"redirect-submit": "Đi",
"expand_templates_preview": "Xem trước",
"expand_templates_preview_fail_html": "<em>{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.</em>\n\n<strong>Nếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.</strong>\nNếu vẫn không được, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.",
"expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} cho phép mã nguồn HTML thô và dữ liệu phiên bị mất, nên bản xem trước bị ẩn để tránh tấn công JavaScript.</em>\n\n<strong>Nếu bạn thực sự muốn xem trước mã nguồn này, xin hãy thử lại nữa.</strong>\nNếu vẫn không được, hãy [[Special:UserLogin|đăng nhập]] và thử lại lần nữa.",
- "pagelanguage": "Chọn ngôn ngữ trang",
+ "pagelanguage": "Thay đổi ngôn ngữ của trang",
"pagelang-name": "Trang",
"pagelang-language": "Ngôn ngữ",
"pagelang-use-default": "Sử dụng ngôn ngữ mặc định",
"mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
"mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
"api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ.",
+ "sessionprovider-nocookies": "Cookie có thể bị vô hiệu hóa. Đảm bảo bạn đã bật cookie và bắt đầu một lần nữa.",
"randomrootpage": "Trang gốc ngẫu nhiên"
}
"grunt-cli": "0.1.13",
"grunt-banana-checker": "0.4.0",
"grunt-contrib-copy": "0.8.2",
- "grunt-contrib-jshint": "0.12.0",
+ "grunt-contrib-jshint": "1.0.0",
"grunt-contrib-watch": "0.6.1",
"grunt-jscs": "2.7.0",
"grunt-jsonlint": "1.0.7",
--- /dev/null
+{
+ "@metadata": {
+ "authors": [
+ "Luuva"
+ ]
+ },
+ "ooui-dialog-message-accept": "Liáu-kái",
+ "ooui-dialog-message-reject": "Chhú-siau",
+ "ooui-dialog-process-error": "Ū mi̍h bô hó-sè",
+ "ooui-dialog-process-dismiss": "Koaiⁿ tiāu",
+ "ooui-dialog-process-retry": "Koh chhì khòaⁿ-māi",
+ "ooui-dialog-process-continue": "Kè-sio̍k",
+ "ooui-selectfile-button-select": "Soán-tek 1-ê tóng-àn",
+ "ooui-selectfile-not-supported": "Só͘ soán ê tóng-àn bô siū chi-chhî",
+ "ooui-selectfile-placeholder": "Iáu-bē soán tóng-àn",
+ "ooui-selectfile-dragdrop-placeholder": "Kā tóng-àn tàn chia"
+}
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-element-hidden {
display: none !important;
.oo-ui-indicatorElement.oo-ui-indicatorElement-indicator {
opacity: 0.8;
}
+.oo-ui-labelElement .oo-ui-labelElement-label-highlight {
+ font-weight: bold;
+}
.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
}
width: 100%;
max-width: 50em;
}
+.oo-ui-dropdownInputWidget .oo-ui-dropdownWidget,
+.oo-ui-dropdownInputWidget select {
+ display: block;
+}
.oo-ui-dropdownInputWidget select {
- display: inline-block;
width: 100%;
resize: none;
-webkit-box-sizing: border-box;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
- display: inline-block;
+ display: block;
width: 100%;
resize: none;
-webkit-box-sizing: border-box;
}
.oo-ui-dropdownWidget-handle {
width: 100%;
- display: inline-block;
+ display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
cursor: default;
opacity: 0.2;
}
-.oo-ui-comboBoxInputWidget > .oo-ui-selectWidget {
- margin-top: -3px;
-}
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-element-hidden {
display: none !important;
background-position: center center;
background-repeat: no-repeat;
}
+.oo-ui-labelElement .oo-ui-labelElement-label-highlight {
+ font-weight: bold;
+}
.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
}
width: 100%;
max-width: 50em;
}
+.oo-ui-dropdownInputWidget .oo-ui-dropdownWidget,
+.oo-ui-dropdownInputWidget select {
+ display: block;
+}
.oo-ui-dropdownInputWidget select {
- display: inline-block;
width: 100%;
resize: none;
-webkit-box-sizing: border-box;
}
.oo-ui-textInputWidget input,
.oo-ui-textInputWidget textarea {
- display: inline-block;
+ display: block;
width: 100%;
resize: none;
-webkit-box-sizing: border-box;
}
.oo-ui-dropdownWidget-handle {
width: 100%;
- display: inline-block;
+ display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
margin-right: 2em;
}
-.oo-ui-dropdownWidget .oo-ui-selectWidget {
- border-top-color: #ffffff;
-}
.oo-ui-comboBoxInputWidget {
display: inline-block;
position: relative;
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
if ( immediate && !timeout ) {
func.apply( context, args );
}
- clearTimeout( timeout );
- timeout = setTimeout( later, wait );
+ if ( !timeout || wait ) {
+ clearTimeout( timeout );
+ timeout = setTimeout( later, wait );
+ }
};
};
* @param {HTMLElement} node
* @param {string} eventName
* @param {Function} handler
- * @deprecated
+ * @deprecated since 0.15.0
*/
OO.ui.addCaptureEventListener = function ( node, eventName, handler ) {
node.addEventListener( eventName, handler, true );
* @param {HTMLElement} node
* @param {string} eventName
* @param {Function} handler
- * @deprecated
+ * @deprecated since 0.15.0
*/
OO.ui.removeCaptureEventListener = function ( node, eventName, handler ) {
node.removeEventListener( eventName, handler, true );
}
if ( domPromise ) {
// pick up dynamic state, like focus, value of form inputs, scroll position, etc.
- state = data.gatherPreInfuseState( $elem );
+ state = data.constructor.static.gatherPreInfuseState( $elem, data );
// restore dynamic state after the new element is re-inserted into DOM under infused parent
domPromise.done( data.restorePreInfuseState.bind( data, state ) );
infusedChildren = $elem.data( 'ooui-infused-children' );
if ( infusedChildren && infusedChildren.length ) {
infusedChildren.forEach( function ( data ) {
- var state = data.gatherPreInfuseState( $elem );
+ var state = data.constructor.static.gatherPreInfuseState( $elem, data );
domPromise.done( data.restorePreInfuseState.bind( data, state ) );
} );
}
* as a plaintext string, a jQuery selection of elements, or a function that will produce a string
* in the future. See the [OOjs UI documentation on MediaWiki] [2] for examples.
* [2]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Icons,_Indicators,_and_Labels#Labels
- * @cfg {boolean} [autoFitLabel=true] Fit the label to the width of the parent element.
- * The label will be truncated to fit if necessary.
*/
OO.ui.mixin.LabelElement = function OoUiMixinLabelElement( config ) {
// Configuration initialization
// Properties
this.$label = null;
this.label = null;
- this.autoFitLabel = config.autoFitLabel === undefined || !!config.autoFitLabel;
// Initialization
this.setLabel( config.label || this.constructor.static.label );
*/
OO.ui.mixin.LabelElement.static.label = null;
+/* Static methods */
+
+/**
+ * Highlight the first occurrence of the query in the given text
+ *
+ * @param {string} text Text
+ * @param {string} query Query to find
+ * @return {jQuery} Text with the first match of the query
+ * sub-string wrapped in highlighted span
+ */
+OO.ui.mixin.LabelElement.static.highlightQuery = function ( text, query ) {
+ var $result = $( '<span>' ),
+ offset = text.toLowerCase().indexOf( query.toLowerCase() );
+
+ if ( !query.length || offset === -1 ) {
+ return $result.text( text );
+ }
+ $result.append(
+ document.createTextNode( text.slice( 0, offset ) ),
+ $( '<span>' )
+ .addClass( 'oo-ui-labelElement-label-highlight' )
+ .text( text.slice( offset, offset + query.length ) ),
+ document.createTextNode( text.slice( offset + query.length ) )
+ );
+ return $result.contents();
+};
+
/* Methods */
/**
return this;
};
+/**
+ * Set the label as plain text with a highlighted query
+ *
+ * @param {string} text Text label to set
+ * @param {string} query Substring of text to highlight
+ * @chainable
+ */
+OO.ui.mixin.LabelElement.prototype.setHighlightedQuery = function ( text, query ) {
+ return this.setLabel( this.constructor.static.highlightQuery( text, query ) );
+};
+
/**
* Get the label.
*
* Fit the label.
*
* @chainable
+ * @deprecated since 0.16.0
*/
OO.ui.mixin.LabelElement.prototype.fitLabel = function () {
- if ( this.$label && this.$label.autoEllipsis && this.autoFitLabel ) {
- this.$label.autoEllipsis( { hasSpan: false, tooltip: true } );
- }
-
return this;
};
OO.ui.mixin.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
// Properties
- this.newItems = null;
this.autoHide = config.autoHide === undefined || !!config.autoHide;
this.filterFromInput = !!config.filterFromInput;
this.$input = config.$input ? config.$input : config.input ? config.input.$input : null;
* @inheritdoc
*/
OO.ui.MenuSelectWidget.prototype.addItems = function ( items, index ) {
- var i, len, item;
-
// Parent method
OO.ui.MenuSelectWidget.parent.prototype.addItems.call( this, items, index );
- // Auto-initialize
- if ( !this.newItems ) {
- this.newItems = [];
- }
-
- for ( i = 0, len = items.length; i < len; i++ ) {
- item = items[ i ];
- if ( this.isVisible() ) {
- // Defer fitting label until item has been attached
- item.fitLabel();
- } else {
- this.newItems.push( item );
- }
- }
-
// Reevaluate clipping
this.clip();
* @inheritdoc
*/
OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
- var i, len, change;
+ var change;
visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
change = visible !== this.isVisible();
this.bindKeyDownListener();
this.bindKeyPressListener();
- if ( this.newItems && this.newItems.length ) {
- for ( i = 0, len = this.newItems.length; i < len; i++ ) {
- this.newItems[ i ].fitLabel();
- }
- this.newItems = null;
- }
this.toggleClipping( true );
if ( this.getSelectedItem() ) {
/**
* Set the directionality of the input, either RTL (right-to-left) or LTR (left-to-right).
*
- * @deprecated since v0.13.1, use #setDir directly
+ * @deprecated since v0.13.1; use #setDir directly
* @param {boolean} isRTL Directionality is right-to-left
* @chainable
*/
* @protected
*/
OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
- return $( '<input type="checkbox" />' );
+ return $( '<input>' ).attr( 'type', 'checkbox' );
};
/**
if ( config.$input ) {
return config.$input.addClass( 'oo-ui-element-hidden' );
}
- return $( '<input type="hidden">' );
+ return $( '<input>' ).attr( 'type', 'hidden' );
};
/**
* @protected
*/
OO.ui.RadioInputWidget.prototype.getInputElement = function () {
- return $( '<input type="radio" />' );
+ return $( '<input>' ).attr( 'type', 'radio' );
};
/**
* @protected
*/
OO.ui.RadioSelectInputWidget.prototype.getInputElement = function () {
- return $( '<input type="hidden">' );
+ return $( '<input>' ).attr( 'type', 'hidden' );
};
/**
OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
return config.multiline ?
$( '<textarea>' ) :
- $( '<input type="' + this.getSaneType( config ) + '" />' );
+ $( '<input>' ).attr( 'type', this.getSaneType( config ) );
};
/**
* This method returns a promise that resolves with a boolean `true` if the current value is
* considered valid according to the supplied {@link #validate validation pattern}.
*
- * @deprecated
+ * @deprecated since v0.12.3
* @return {jQuery.Promise} A promise that resolves to a boolean `true` if the value is valid.
*/
OO.ui.TextInputWidget.prototype.isValid = function () {
*/
OO.ui.TextInputWidget.prototype.setLabelPosition = function ( labelPosition ) {
this.labelPosition = labelPosition;
- this.updatePosition();
+ if ( this.label ) {
+ // If there is no label and we only change the position, #updatePosition is a no-op,
+ // but it takes really a lot of work to do nothing.
+ this.updatePosition();
+ }
return this;
};
/**
* @class
- * @deprecated Use OO.ui.ComboBoxInputWidget instead.
+ * @deprecated since 0.13.2; use OO.ui.ComboBoxInputWidget instead
*/
OO.ui.ComboBoxWidget = OO.ui.ComboBoxInputWidget;
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-popupTool .oo-ui-popupWidget-popup,
.oo-ui-popupTool .oo-ui-popupWidget-anchor {
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
-.oo-ui-draggableElement {
- cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
+.oo-ui-draggableElement-handle.oo-ui-widget-enabled {
+ cursor: move;
+ cursor: url(images/grab.cur );
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: grab;
+}
+.oo-ui-draggableElement-placeholder {
+ opacity: 0.2;
}
-.oo-ui-draggableElement-dragging {
- cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
- background: rgba(0, 0, 0, 0.2);
- opacity: 0.4;
+.oo-ui-draggableElement.oo-ui-widget-enabled:active {
+ cursor: move;
+ cursor: url(images/grabbing.cur );
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: grabbing;
}
.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
display: inline-block;
}
-.oo-ui-draggableGroupElement-placeholder {
- position: absolute;
- display: block;
- background: rgba(0, 0, 0, 0.4);
-}
.oo-ui-lookupElement > .oo-ui-menuSelectWidget {
z-index: 1;
width: 100%;
}
.oo-ui-capsuleMultiSelectWidget-handle {
width: 100%;
- display: inline-block;
+ display: block;
position: relative;
}
.oo-ui-capsuleMultiSelectWidget-content {
.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
opacity: 0.2;
}
-.oo-ui-capsuleMultiSelectWidget .oo-ui-selectWidget {
- border-top-color: #ffffff;
-}
.oo-ui-capsuleItemWidget {
position: relative;
display: inline-block;
text-overflow: ellipsis;
overflow: hidden;
}
-.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
- margin-top: -1.6em;
- padding-left: 0.3em;
-}
.oo-ui-capsuleItemWidget:focus {
outline: none;
border-color: #087ecc;
}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
- padding-right: 1.3375em;
-}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
- position: absolute;
- right: 0.4em;
- top: 0;
- width: 0.9375em;
- height: 100%;
- background-repeat: no-repeat;
-}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicator-clear {
- cursor: pointer;
-}
.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
opacity: 0.5;
-webkit-transform: translate3d(0, 0, 0);
background: #eeeeee;
border-color: #cccccc;
}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
- opacity: 0.2;
+.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
+ float: right;
+ margin-top: -0.1em;
+ margin-right: -0.4em;
}
.oo-ui-searchWidget-query {
position: absolute;
.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
width: 2.25em;
}
-.oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+.oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-right-width: 0;
}
-.oo-ui-numberInputWidget-plusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+.oo-ui-numberInputWidget-plusButton.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
border-left-width: 0;
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
-.oo-ui-draggableElement {
- cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
+.oo-ui-draggableElement-handle.oo-ui-widget-enabled {
+ cursor: move;
+ cursor: url(images/grab.cur );
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: grab;
+}
+.oo-ui-draggableElement-placeholder {
+ opacity: 0.2;
}
-.oo-ui-draggableElement-dragging {
- cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
- background: rgba(0, 0, 0, 0.2);
- opacity: 0.4;
+.oo-ui-draggableElement.oo-ui-widget-enabled:active {
+ cursor: move;
+ cursor: url(images/grabbing.cur );
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: grabbing;
}
.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
display: inline-block;
}
-.oo-ui-draggableGroupElement-placeholder {
- position: absolute;
- display: block;
- background: rgba(0, 0, 0, 0.4);
-}
.oo-ui-lookupElement > .oo-ui-menuSelectWidget {
z-index: 1;
width: 100%;
}
.oo-ui-capsuleMultiSelectWidget-handle {
width: 100%;
- display: inline-block;
+ display: block;
position: relative;
}
.oo-ui-capsuleMultiSelectWidget-content {
.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
opacity: 0.2;
}
-.oo-ui-capsuleMultiSelectWidget .oo-ui-selectWidget {
- border-top-color: #ffffff;
-}
.oo-ui-capsuleItemWidget {
position: relative;
display: inline-block;
text-overflow: ellipsis;
overflow: hidden;
}
-.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
- margin-top: -1.6em;
- padding-left: 0.3em;
-}
.oo-ui-capsuleItemWidget:focus {
outline: none;
border-color: #347bff;
}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
- padding-right: 1.3375em;
-}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
- position: absolute;
- right: 0.4em;
- top: 0;
- width: 0.9375em;
- height: 100%;
- background-repeat: no-repeat;
-}
-.oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-indicator-clear {
- cursor: pointer;
-}
.oo-ui-capsuleItemWidget.oo-ui-widget-disabled {
color: #cccccc;
text-shadow: 0 1px 1px #ffffff;
border-color: #dddddd;
background-color: #f3f3f3;
}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
- opacity: 0.2;
+.oo-ui-capsuleItemWidget > .oo-ui-buttonElement {
+ float: right;
+ margin-top: -0.2em;
+ margin-left: 0.4em;
}
.oo-ui-searchWidget-query {
position: absolute;
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
* @class
*
* @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element
*/
-OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement() {
+OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {
+ config = config || {};
+
// Properties
this.index = null;
+ this.$handle = config.$handle || this.$element;
+ this.wasHandleUsed = null;
// Initialize and events
- this.$element
+ this.$element.addClass( 'oo-ui-draggableElement' )
+ // We make the entire element draggable, not just the handle, so that
+ // the whole element appears to move. wasHandleUsed prevents drags from
+ // starting outside the handle
.attr( 'draggable', true )
- .addClass( 'oo-ui-draggableElement' )
.on( {
+ mousedown: this.onDragMouseDown.bind( this ),
dragstart: this.onDragStart.bind( this ),
dragover: this.onDragOver.bind( this ),
dragend: this.onDragEnd.bind( this ),
drop: this.onDrop.bind( this )
} );
+ this.$handle.addClass( 'oo-ui-draggableElement-handle' );
};
OO.initClass( OO.ui.mixin.DraggableElement );
/* Methods */
+/**
+ * Respond to mousedown event.
+ *
+ * @private
+ * @param {jQuery.Event} event jQuery event
+ */
+OO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {
+ this.wasHandleUsed =
+ // Optimization: if the handle is the whole element this is always true
+ this.$handle[ 0 ] === this.$element[ 0 ] ||
+ // Check the mousedown occurred inside the handle
+ OO.ui.contains( this.$handle[ 0 ], e.target, true );
+};
+
/**
* Respond to dragstart event.
*
* @fires dragstart
*/
OO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {
- var dataTransfer = e.originalEvent.dataTransfer;
+ var element = this,
+ dataTransfer = e.originalEvent.dataTransfer;
+
+ if ( !this.wasHandleUsed ) {
+ return false;
+ }
+
// Define drop effect
dataTransfer.dropEffect = 'none';
dataTransfer.effectAllowed = 'move';
} catch ( err ) {
// The above is only for Firefox. Move on if it fails.
}
- // Add dragging class
- this.$element.addClass( 'oo-ui-draggableElement-dragging' );
+ // Briefly add a 'clone' class to style the browser's native drag image
+ this.$element.addClass( 'oo-ui-draggableElement-clone' );
+ // Add placeholder class after the browser has rendered the clone
+ setTimeout( function () {
+ element.$element
+ .removeClass( 'oo-ui-draggableElement-clone' )
+ .addClass( 'oo-ui-draggableElement-placeholder' );
+ } );
// Emit event
this.emit( 'dragstart', this );
return true;
* @fires dragend
*/
OO.ui.mixin.DraggableElement.prototype.onDragEnd = function () {
- this.$element.removeClass( 'oo-ui-draggableElement-dragging' );
+ this.$element.removeClass( 'oo-ui-draggableElement-placeholder' );
this.emit( 'dragend' );
};
// Properties
this.orientation = config.orientation || 'vertical';
this.dragItem = null;
- this.itemDragOver = null;
this.itemKeys = {};
- this.sideInsertion = '';
+ this.dir = null;
+ this.itemsOrder = null;
// Events
this.aggregate( {
} );
this.connect( this, {
itemDragStart: 'onItemDragStart',
- itemDrop: 'onItemDrop',
- itemDragEnd: 'onItemDragEnd'
- } );
- this.$element.on( {
- dragover: this.onDragOver.bind( this ),
- dragleave: this.onDragLeave.bind( this )
+ itemDrop: 'onItemDropOrDragEnd',
+ itemDragEnd: 'onItemDropOrDragEnd'
} );
// Initialize
if ( Array.isArray( config.items ) ) {
this.addItems( config.items );
}
- this.$placeholder = $( '<div>' )
- .addClass( 'oo-ui-draggableGroupElement-placeholder' );
this.$element
.addClass( 'oo-ui-draggableGroupElement' )
.append( this.$status )
- .toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' )
- .prepend( this.$placeholder );
+ .toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );
};
/* Setup */
/* Events */
/**
- * A 'reorder' event is emitted when the order of items in the group changes.
+ * An item has been dragged to a new position, but not yet dropped.
+ *
+ * @event drag
+ * @param {OO.ui.mixin.DraggableElement} item Dragged item
+ * @param {number} [newIndex] New index for the item
+ */
+
+/**
+ * And item has been dropped at a new position.
*
* @event reorder
* @param {OO.ui.mixin.DraggableElement} item Reordered item
* @param {OO.ui.mixin.DraggableElement} item Dragged item
*/
OO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
- var i, len;
-
- // Map the index of each object
- for ( i = 0, len = this.items.length; i < len; i++ ) {
- this.items[ i ].setIndex( i );
- }
-
+ // Make a shallow copy of this.items so we can re-order it during previews
+ // without affecting the original array.
+ this.itemsOrder = this.items.slice();
+ this.updateIndexes();
if ( this.orientation === 'horizontal' ) {
- // Set the height of the indicator
- this.$placeholder.css( {
- height: item.$element.outerHeight(),
- width: 2
- } );
- } else {
- // Set the width of the indicator
- this.$placeholder.css( {
- height: 2,
- width: item.$element.outerWidth()
- } );
+ // Calculate and cache directionality on drag start - it's a little
+ // expensive and it shouldn't change while dragging.
+ this.dir = this.$element.css( 'direction' );
}
this.setDragItem( item );
};
/**
- * Respond to item drag end event
- *
- * @private
+ * Update the index properties of the items
*/
-OO.ui.mixin.DraggableGroupElement.prototype.onItemDragEnd = function () {
- this.unsetDragItem();
- return false;
+OO.ui.mixin.DraggableGroupElement.prototype.updateIndexes = function () {
+ var i, len;
+
+ // Map the index of each object
+ for ( i = 0, len = this.itemsOrder.length; i < len; i++ ) {
+ this.itemsOrder[ i ].setIndex( i );
+ }
};
/**
- * Handle drop event and switch the order of the items accordingly
+ * Handle drop or dragend event and switch the order of the items accordingly
*
* @private
* @param {OO.ui.mixin.DraggableElement} item Dropped item
- * @fires reorder
*/
-OO.ui.mixin.DraggableGroupElement.prototype.onItemDrop = function ( item ) {
- var toIndex = item.getIndex();
- // Check if the dropped item is from the current group
+OO.ui.mixin.DraggableGroupElement.prototype.onItemDropOrDragEnd = function () {
+ var targetIndex, originalIndex,
+ item = this.getDragItem();
+
// TODO: Figure out a way to configure a list of legally droppable
// elements even if they are not yet in the list
- if ( this.getDragItem() ) {
- // If the insertion point is 'after', the insertion index
- // is shifted to the right (or to the left in RTL, hence 'after')
- if ( this.sideInsertion === 'after' ) {
- toIndex++;
- }
- // Emit change event
- this.emit( 'reorder', this.getDragItem(), toIndex );
+ if ( item ) {
+ originalIndex = this.items.indexOf( item );
+ // If the item has moved forward, add one to the index to account for the left shift
+ targetIndex = item.getIndex() + ( item.getIndex() > originalIndex ? 1 : 0 );
+ this.reorder( this.getDragItem(), targetIndex );
+ this.emit( 'reorder', this.getDragItem(), targetIndex );
+ this.updateIndexes();
}
this.unsetDragItem();
// Return false to prevent propogation
return false;
};
-/**
- * Handle dragleave event.
- *
- * @private
- */
-OO.ui.mixin.DraggableGroupElement.prototype.onDragLeave = function () {
- // This means the item was dragged outside the widget
- this.$placeholder
- .css( 'left', 0 )
- .addClass( 'oo-ui-element-hidden' );
-};
-
/**
* Respond to dragover event
*
* @private
- * @param {jQuery.Event} event Event details
+ * @param {jQuery.Event} event Dragover event
+ * @fires reorder
*/
OO.ui.mixin.DraggableGroupElement.prototype.onDragOver = function ( e ) {
var dragOverObj, $optionWidget, itemOffset, itemMidpoint, itemBoundingRect,
- itemSize, cssOutput, dragPosition, itemIndex, itemPosition,
+ itemSize, cssOutput, dragPosition, overIndex, itemPosition, after,
+ targetIndex = null,
+ item = this.getDragItem(),
+ dragItemIndex = item.getIndex(),
clientX = e.originalEvent.clientX,
clientY = e.originalEvent.clientY;
itemOffset = $optionWidget.offset();
itemBoundingRect = $optionWidget[ 0 ].getBoundingClientRect();
itemPosition = $optionWidget.position();
- itemIndex = $optionWidget.data( 'index' );
+ overIndex = $optionWidget.data( 'index' );
}
if (
itemOffset &&
- this.isDragging() &&
- itemIndex !== this.getDragItem().getIndex()
+ overIndex !== dragItemIndex
) {
if ( this.orientation === 'horizontal' ) {
// Calculate where the mouse is relative to the item width
itemMidpoint = itemBoundingRect.left + itemSize / 2;
dragPosition = clientX;
// Which side of the item we hover over will dictate
- // where the placeholder will appear, on the left or
+ // where to drop the selected item, on the left or
// on the right
cssOutput = {
left: dragPosition < itemMidpoint ? itemPosition.left : itemPosition.left + itemSize,
itemMidpoint = itemBoundingRect.top + itemSize / 2;
dragPosition = clientY;
// Which side of the item we hover over will dictate
- // where the placeholder will appear, on the top or
+ // where to drop the selected item, on the top or
// on the bottom
cssOutput = {
top: dragPosition < itemMidpoint ? itemPosition.top : itemPosition.top + itemSize,
}
// Store whether we are before or after an item to rearrange
// For horizontal layout, we need to account for RTL, as this is flipped
- if ( this.orientation === 'horizontal' && this.$element.css( 'direction' ) === 'rtl' ) {
- this.sideInsertion = dragPosition < itemMidpoint ? 'after' : 'before';
+ if ( this.orientation === 'horizontal' && this.dir === 'rtl' ) {
+ after = dragPosition < itemMidpoint;
} else {
- this.sideInsertion = dragPosition < itemMidpoint ? 'before' : 'after';
+ after = dragPosition > itemMidpoint;
+ }
+ targetIndex = overIndex + ( after ? 1 : 0 );
+ // Check the targetIndex isn't immediately to the left or right of the current item (a no-op)
+ if ( targetIndex === dragItemIndex || targetIndex === dragItemIndex + 1 ) {
+ targetIndex = null;
}
- // Add drop indicator between objects
- this.$placeholder
- .css( cssOutput )
- .removeClass( 'oo-ui-element-hidden' );
- } else {
- // This means the item was dragged outside the widget
- this.$placeholder
- .css( 'left', 0 )
- .addClass( 'oo-ui-element-hidden' );
+ }
+ if ( targetIndex !== null ) {
+ if ( targetIndex > 0 ) {
+ this.$group.children().eq( targetIndex - 1 ).after( item.$element );
+ } else {
+ this.$group.prepend( item.$element );
+ }
+ // Move item in itemsOrder array. Needs to account for left shift if the item is moved forward.
+ this.itemsOrder.splice( targetIndex - ( targetIndex > dragItemIndex ? 1 : 0 ), 0,
+ this.itemsOrder.splice( dragItemIndex, 1 )[ 0 ]
+ );
+ this.updateIndexes();
+ this.emit( 'drag', item, targetIndex );
}
// Prevent default
e.preventDefault();
};
+/**
+ * Reorder the items in the group
+ *
+ * @param {OO.ui.mixin.DraggableElement} item Reordered item
+ * @param {number} newIndex New index
+ */
+OO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex ) {
+ this.addItems( [ item ], newIndex );
+};
+
/**
* Set a dragged item
*
*/
OO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {
this.dragItem = item;
+ this.$element.on( 'dragover', this.onDragOver.bind( this ) );
+ this.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );
};
/**
*/
OO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {
this.dragItem = null;
- this.itemDragOver = null;
- this.$placeholder.addClass( 'oo-ui-element-hidden' );
- this.sideInsertion = '';
+ this.$element.off( 'dragover' );
+ this.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );
};
/**
return this.dragItem;
};
-/**
- * Check if an item in the group is currently being dragged.
- *
- * @return {Boolean} Item is being dragged
- */
-OO.ui.mixin.DraggableGroupElement.prototype.isDragging = function () {
- return this.getDragItem() !== null;
-};
-
/**
* RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as
* the {@link OO.ui.mixin.LookupElement}.
* @cfg {string} [notsupported] Text to display when file support is missing in the browser.
* @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
* @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
- * @cfg {boolean} [dragDropUI=false] Deprecated alias for showDropTarget
* @cfg {Number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
* preview (for performance)
*/
OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
var dragHandler;
- // TODO: Remove in next release
- if ( config && config.dragDropUI ) {
- config.showDropTarget = true;
- }
-
// Configuration initialization
config = $.extend( {
accept: null,
OO.ui.mixin.IconElement.call( this, config );
OO.ui.mixin.IndicatorElement.call( this, config );
OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$info } ) );
- OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, { autoFitLabel: true } ) );
+ OO.ui.mixin.LabelElement.call( this, config );
// Properties
this.$info = $( '<span>' );
OO.ui.SelectFileWidget.static.isSupported = function () {
var $input;
if ( OO.ui.SelectFileWidget.static.isSupportedCache === null ) {
- $input = $( '<input type="file">' );
+ $input = $( '<input>' ).attr( 'type', 'file' );
OO.ui.SelectFileWidget.static.isSupportedCache = $input[ 0 ].files !== undefined;
}
return OO.ui.SelectFileWidget.static.isSupportedCache;
return;
}
- this.$input = $( '<input type="file">' );
+ this.$input = $( '<input>' ).attr( 'type', 'file' );
this.$input.on( 'change', this.onFileSelectedHandler );
this.$input.on( 'click', function ( e ) {
// Prevents dropTarget to get clicked which calls
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-actionWidget.oo-ui-pendingElement-pending {
background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:27Z
+ * Date: 2016-02-22T22:33:37Z
*/
.oo-ui-window {
background: transparent;
/*!
- * OOjs UI v0.15.4
+ * OOjs UI v0.16.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2016 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-02-17T02:03:23Z
+ * Date: 2016-02-22T22:33:33Z
*/
( function ( OO ) {
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #ffffff }</style>
- <path d="M12 8C7 8 1 14 1 14s6 6 11 6l11-6s-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+ <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
<circle cx="12" cy="14" r="2"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M12 8C7 8 1 14 1 14s6 6 11 6l11-6s-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
+ <path d="M12 8c-5 0-11 6-11 6s6 6 11 6 11-6 11-6-6-6-11-6zm0 10c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"/>
<circle cx="12" cy="14" r="2"/>
</svg>
width: 5em;
}
+.mw-apisandbox-help-field {
+ border-bottom: 1px solid rgba( 0, 0, 0, 0.1 );
+}
+
+.mw-apisandbox-help-field:last-child {
+ border-bottom: none;
+}
+
.mw-apisandbox-optionalWidget {
width: 100%;
}
// I'm surprised this doesn't seem to exist in jQuery or mw.util.
params = {};
- hash = hash.replace( '+', '%20' );
+ hash = hash.replace( /\+/g, '%20' );
re = /([^&=#]+)=?([^&#]*)/g;
while ( ( m = re.exec( hash ) ) ) {
params[ decodeURIComponent( m[ 1 ] ) ] = decodeURIComponent( m[ 2 ] );
classes: [ 'mw-apisandbox-spacer' ]
} ), {
align: 'inline',
+ classes: [ 'mw-apisandbox-help-field' ],
label: dl
}
);
widget,
{
align: 'left',
+ classes: [ 'mw-apisandbox-widget-field' ],
label: prefix + pi.parameters[ i ].name,
$label: $widgetLabel
}
font-size: 1em;
// Container layout
display: inline-block;
+ min-width: 4em;
+ max-width: 28.75em; // equivalent to 460px, @see T95367
padding: .5em 1em;
margin: 0;
+ border-radius: @borderRadius;
.box-sizing( border-box );
// Disable weird iOS styling
*display: inline;
zoom: 1;
- // Container styling
- .button-colors( #fff, #ccc, #777 );
- border-radius: @borderRadius;
- min-width: 4em;
-
// Ensure that buttons and inputs are nicely aligned when they have differing heights
vertical-align: middle;
// Content styling
+ .button-colors( #fff, @colorGray12, @colorGray7 );
text-align: center;
font-weight: bold;
&.mw-ui-block {
display: block;
width: 100%;
+ margin-left: auto;
+ margin-right: auto;
}
// Progressive buttons
};
/**
- * @private
* Get nonce for iframe IDs on the page.
*
+ * @private
* @return {number}
*/
function getNonce() {
}
/**
- * @private
* Given a non-empty object, return one of its keys.
*
+ * @private
* @param {Object} obj
* @return {string}
*/
}
/**
- * @private
* Get new iframe object for an upload.
*
+ * @private
* @return {HTMLIframeElement}
*/
function getNewIframe( id ) {
}
/**
- * @private
* Shortcut for getting hidden inputs
*
+ * @private
* @return {jQuery}
*/
function getHiddenInput( name, val ) {
$wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
$wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
$wgExtraInterlanguageLinkPrefixes, $wgLocalInterwikis,
- $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
+ $parserMemc, $wgThumbnailScriptPath, $wgScriptPath, $wgResourceBasePath,
$wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
$wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
+ $wgScriptPath = '';
$wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
$wgStylePath = '/skins';
+ $wgResourceBasePath = '';
$wgExtensionAssetsPath = '/extensions';
+ $wgArticlePath = '/wiki/$1';
$wgThumbnailScriptPath = false;
$wgLockManagers = [ [
'name' => 'fsLockManager',
'wgServer' => 'http://example.org',
'wgServerName' => 'example.org',
'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
+ 'wgScriptPath' => '',
'wgArticlePath' => '/wiki/$1',
'wgActionPaths' => [],
'wgLockManagers' => [ [
<table><pre></pre></table>
!! html/parsoid
-<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"a":{"<pre":null},"sa":{"<pre":""},"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<pre <pre>x</pre>"}},"i":0}}]}'>x</pre>
+<pre about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"a":{"<pre":null},"sa":{"<pre":""},"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<pre <pre>x</pre>"}},"i":0}}]}'>x</pre>
<p><pre </p>
<!-- should be ignored -->
1 = foo}}
-{{echo|1<!-- should be ignored --> = foo}}
+{{echo|1<!-- should be ignored -->=foo}}
-{{echo|<!-- should be ignored -->1 = foo}}
+{{echo|<!-- should be ignored -->1=foo}}
!!html/parsoid
<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo","key":{"wt":"1\n<!-- should be ignored -->"}}},"i":0}}]}'>foo</p>
!! html/php+tidy
<p>bar foo</p>
!! html/parsoid
-<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"","named":true,"spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"blank_param","href":"./Template:Blank_param"},"params":{"1":{"wt":"bar"},"":{"wt":"foo"}},"i":0}}]}'>bar
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"},{"k":"","named":true}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"blank_param","href":"./Template:Blank_param"},"params":{"1":{"wt":"bar"},"":{"wt":"foo"}},"i":0}}]}'>bar
foo</p>
!! end
<dt><div data-parsoid='{"stx":"html"}'>a:b</div></dt>
<dt><div data-parsoid='{"stx":"html","autoInsertedEnd":true}'>a</div></dt>
<dd>b</dd>
-<dt><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a:b"}},"i":0}}]}'>a:b</span></dt>
-<dt><i about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"''a:b''"}},"i":0}}]}'>a:b</i>
+<dt><span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a:b"}},"i":0}}]}'>a:b</span></dt>
+<dt><i about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"''a:b''"}},"i":0}}]}'>a:b</i>
<dl><dt><dl><dt><i>a:b</i></dt></dl></dt></dl></dt></dl>
!! end
</p><p>(<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>)
</p>
!! html/parsoid
-<p>(<a 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}}"}}' data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[20,31,null,null]}\" 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}}]}\">hi</span>"}]]}'>http://example.com/hi</a>)</p>
+<p>(<a 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}}"}}' data-mw='{"attribs":[[{"txt":"href"},{"html":"http://example.com/<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[20,31,null,null]}\" 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}}]}\">hi</span>"}]]}'>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 -->"}}'>http://example.com</a>)</p>
!! end
!! html/parsoid
<table>
-<tbody><tr><th typeof="mw:Transclusion" about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":["!a ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b!!c"}},"i":0}}]}'>a b</th><th about="#mwt1">c</th></tr>
+<tbody><tr><th typeof="mw:Transclusion" about="#mwt1" data-parsoid='{"autoInsertedEnd":true,"pi":[[{"k":"1"}]]}' data-mw='{"parts":["!a ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b!!c"}},"i":0}}]}'>a b</th><th about="#mwt1">c</th></tr>
!! end
!! test
</tbody></table>
!! end
+!! test
+Break on | in element attribute in template
+!! options
+parsoid=wt2html,html2html
+!! wikitext
+{{echo|1=<div class="hi|ho">ha</div>}}
+!! html/php
+<p>ho">ha</div>
+</p>
+!! html/parsoid
+<span typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"ho\">ha</div>"}},"i":0}}]}'>ho">ha</span>
+!! end
+
!! test
Indented table markup mixed with indented pre content (proposed in bug 6200)
!! wikitext
!! wikitext
{{echo|Some [[Fool]]}}s
!! html
-<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" title="Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]"}},"i":0}},"s"]}' data-parsoid='{"pi":[[{"k":"1"}]]}'>Some </span><a rel="mw:WikiLink" href="./Fool" title="Fool" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a></p>
!! end
!! test
!! wikitext
{{echo|Some [[Fool]]s are '''bold and foolish'''}}
!! html
-<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are '''bold and foolish'''"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>Some <a rel="mw:WikiLink" href="./Fool" title="Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b>bold and foolish</b></p>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Some [[Fool]]s are '''bold and foolish'''"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1"}]]}'>Some <a rel="mw:WikiLink" href="./Fool" title="Fool" data-parsoid='{"stx":"simple","a":{"href":"./Fool"},"sa":{"href":"Fool"},"tail":"s"}'>Fools</a> are <b>bold and foolish</b></p>
!! end
!! article
!! wikitext
#REDIRECT [[{{echo|Foo}}bar]]
!! html/parsoid
-<link typeof="mw:ExpandedAttrs" rel="mw:PageProp/redirect" href="./Foobar" data-mw='{"attribs":[[{"txt":"href"},{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[12,24,null,null]}\" 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;Foo&quot;}},&quot;i&quot;:0}}]}\">Foo</span>bar"}]]}'/>
+<link typeof="mw:ExpandedAttrs" rel="mw:PageProp/redirect" href="./Foobar" data-mw='{"attribs":[[{"txt":"href"},{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[12,24,null,null]}\" 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;Foo&quot;}},&quot;i&quot;:0}}]}\">Foo</span>bar"}]]}'/>
!! end
!! test
!! html/parsoid
<dl><dt> hi</dt>
-<dd> <li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>ho</li>"}},"i":0}}]}'>ho</li></dd></dl>
+<dd> <li about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>ho</li>"}},"i":0}}]}'>ho</li></dd></dl>
!! end
!! test
!! wikitext
{{SCRIPTPATH}}
!! html
-<p>/
-</p>
+
!! end
!! test
!! test
Template with thumb image (with link in description)
!! wikitext
-{{paramtest|param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
+{{paramtest|param=[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
!! html/php
This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&action=edit&redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
|}
!! html/parsoid
<table>
-<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
+<tbody><tr><td> Test <ref about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"#tag:ref","function":"#tag"},"params":{"1":{"wt":"One two \"[[three]]\" four"}},"i":0}}]}'>One two "<a rel="mw:WikiLink" href="./Three" title="Three">three</a>" four</ref></td></tr>
</tbody></table>
!! end
</tr>
</table>
!! html/parsoid
-<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]],"firstWikitextNode":"table"}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n<p>ha</p>"}},"i":0}},"\n","{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n<p>ho</p>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}}hi"}},"i":2}},"\n|}"]}'>ha</p><table about="#mwt1" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"","html":""},{"html":""}]]}'>
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1"}],[{"k":"1"}],[{"k":"1"}]],"firstWikitextNode":"table"}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n<p>ha</p>"}},"i":0}},"\n","{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"\n<p>ho</p>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}}hi"}},"i":2}},"\n|}"]}'>ha</p><table about="#mwt1" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"","html":""},{"html":""}]]}'>
</table><p about="#mwt1">ho</p><table about="#mwt1" typeof="mw:ExpandedAttrs" data-mw='{"attribs":[[{"txt":"","html":""},{"html":""}]]}'>
Un-closed <includeonly>
!! wikitext
<includeonly>
-!! html
+!! html/php
+!! html/parsoid
+<meta typeof="mw:Includes/IncludeOnly" data-parsoid='{"src":"<includeonly>"}'/>
!! end
## We used to, but no longer wt2wt this test since the default serializer
b}}
!! html
-<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b<table></table>c"}},"i":0}},"d"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>ab</p><table about="#mwt1" data-parsoid='{"stx":"html"}'></table><p about="#mwt1">cd</p>
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b<table></table>c"}},"i":0}},"d"]}' data-parsoid='{"pi":[[{"k":"1"}]]}'>ab</p><table about="#mwt1" data-parsoid='{"stx":"html"}'></table><p about="#mwt1">cd</p>
-<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>ab</p><span about="#mwt2">
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}' data-parsoid='{"pi":[[{"k":"1"}]]}'>ab</p><span about="#mwt2">
</span><table about="#mwt2" data-parsoid='{"stx":"html"}'></table><span about="#mwt2">
</span><p about="#mwt2">cd</p>
-<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}'>a</p><span about="#mwt3">
+<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}' data-parsoid='{"pi":[[{"k":"1"}]]}'>a</p><span about="#mwt3">
</span><table about="#mwt3" data-parsoid='{"stx":"html"}'></table><span about="#mwt3">
<div style="background:#f9f9f9;">foo</div>
!! html/parsoid
-<div style="background:#f9f9f9;" about="#mwt3" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html"}' data-mw='{"attribs":[[{"txt":"style","html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[5,49,null,null]}\" 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;style{{=}}\\&quot;background:&amp;#35;f9f9f9;\\&quot;&quot;}},&quot;i&quot;:0}}]}\">style</span><span typeof=\"mw:Nowiki\" about=\"#mwt1\" data-parsoid=\"{}\">=</span><span about=\"#mwt1\" data-parsoid=\"{}\">\"background:</span><span typeof=\"mw:Entity\" about=\"#mwt1\" data-parsoid=\"{&quot;src&quot;:&quot;&amp;#35;&quot;,&quot;srcContent&quot;:&quot;#&quot;}\">#</span><span about=\"#mwt1\" data-parsoid=\"{}\">f9f9f9;\"</span>"},{"html":""}]]}'>foo</div>
+<div style="background:#f9f9f9;" about="#mwt3" typeof="mw:ExpandedAttrs" data-parsoid='{"stx":"html"}' data-mw='{"attribs":[[{"txt":"style","html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[5,49,null,null]}\" 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;style{{=}}\\&quot;background:&amp;#35;f9f9f9;\\&quot;&quot;}},&quot;i&quot;:0}}]}\">style</span><span typeof=\"mw:Nowiki\" about=\"#mwt1\" data-parsoid=\"{}\">=</span><span about=\"#mwt1\" data-parsoid=\"{}\">\"background:</span><span typeof=\"mw:Entity\" about=\"#mwt1\" data-parsoid=\"{&quot;src&quot;:&quot;&amp;#35;&quot;,&quot;srcContent&quot;:&quot;#&quot;}\">#</span><span about=\"#mwt1\" data-parsoid=\"{}\">f9f9f9;\"</span>"},{"html":""}]]}'>foo</div>
!! end
!! test
{{echo|<div>foo}}
{{echo|</table>}}
!! html/parsoid
-<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>foo"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</table>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'>foo
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>foo"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</table>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1"}],[{"k":"1"}],[{"k":"1"}]]}'>foo
</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
</table>
!! end
{{echo|<div>}}
{{echo|</div>}}
!! html/parsoid
-<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<table><tr><td><table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'><tbody><tr data-parsoid='{"stx":"html"}'><td data-parsoid='{"stx":"html"}'><div data-parsoid='{"stx":"html"}'>
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<table><tr><td><table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1"}],[{"k":"1"}],[{"k":"1"}]]}'><tbody><tr data-parsoid='{"stx":"html"}'><td data-parsoid='{"stx":"html"}'><div data-parsoid='{"stx":"html"}'>
</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
</table></td></tr></tbody></table>
!! end
<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
!! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[24,38,null,null]}\" 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;137px&quot;}},&quot;i&quot;:0}}]}\">137px</span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[24,38,null,null]}\" 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;137px&quot;}},&quot;i&quot;:0}}]}\">137px</span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
!! end
!! test
<div class="thumb tright"><div class="thumbinner" style="width:139px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" width="137" height="16" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/206px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/274px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is a caption</div></div></div>
!! html/parsoid
-<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt3" data-mw='{"attribs":[["thumbnail",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[18,32,null,null]}\" 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;thumb&quot;}},&quot;i&quot;:0}}]}\">thumb</span>"}],["width",{"html":"<span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[33,47,null,null]}\" 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;137px&quot;}},&quot;i&quot;:0}}]}\">137px</span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
+<figure typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt3" data-mw='{"attribs":[["thumbnail",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[18,32,null,null]}\" 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;thumb&quot;}},&quot;i&quot;:0}}]}\">thumb</span>"}],["width",{"html":"<span about=\"#mwt2\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[33,47,null,null]}\" 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;137px&quot;}},&quot;i&quot;:0}}]}\">137px</span>"}]]}'><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/137px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="16" width="137"/></a><figcaption>This is a caption</figcaption></figure>
!! end
!! test
<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" width="50" height="6" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/75px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/100px-Foobar.jpg 2x" /></a>
</p>
!! html/parsoid
-<p><span typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}' data-mw='{"attribs":[["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;dsr&quot;:[18,31,null,null]}\" 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;50px&quot;}},&quot;i&quot;:0}}]}\">50px</span>"}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
+<p><span typeof="mw:Image mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"width","ak":"{{echo|50px}}"}]}' data-mw='{"attribs":[["width",{"html":"<span about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;dsr&quot;:[18,31,null,null]}\" 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;50px&quot;}},&quot;i&quot;:0}}]}\">50px</span>"}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="6" width="50"/></a></span></p>
!! end
## Parsoid does not provide editing support for images where templates produce multiple image attributes.
<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a link and a bold template." src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a> <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>This is the image caption</div></div></div>
!! html/parsoid
-<figure class="mw-default-size" typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"This is the image caption"},{"ck":"alt","ak":"alt=This is a [[link]] and a {{echo|''bold template''}}."}]}' data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["alt",{"html":"alt=This is a <a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=\"{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Link&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;link&quot;},&quot;dsr&quot;:[65,73,2,2]}\">link</a> and a <i about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;dsr&quot;:[80,106,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\" 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;''bold template''&quot;}},&quot;i&quot;:0}}]}\">bold template</i>."}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img alt="This is a link and a bold template." resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"alt":"This is a link and a bold template.","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=This is a [[link]] and a {{echo|''bold template''}}.","resource":"Image:Foobar.jpg"}}'/></a><figcaption>This is the image caption</figcaption></figure>
+<figure class="mw-default-size" typeof="mw:Image/Thumb mw:ExpandedAttrs" about="#mwt2" data-parsoid='{"optList":[{"ck":"thumbnail","ak":"thumb"},{"ck":"caption","ak":"This is the image caption"},{"ck":"alt","ak":"alt=This is a [[link]] and a {{echo|''bold template''}}."}]}' data-mw='{"attribs":[["thumbnail",{"html":"thumb"}],["alt",{"html":"alt=This is a <a rel=\"mw:WikiLink\" href=\"./Link\" title=\"Link\" data-parsoid=\"{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Link&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;link&quot;},&quot;dsr&quot;:[65,73,2,2]}\">link</a> and a <i about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{&quot;dsr&quot;:[80,106,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]]}\" 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;''bold template''&quot;}},&quot;i&quot;:0}}]}\">bold template</i>."}]]}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img alt="This is a link and a bold template." resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220" data-parsoid='{"a":{"alt":"This is a link and a bold template.","resource":"./File:Foobar.jpg","height":"25","width":"220"},"sa":{"alt":"alt=This is a [[link]] and a {{echo|''bold template''}}.","resource":"Image:Foobar.jpg"}}'/></a><figcaption>This is the image caption</figcaption></figure>
!! end
###################
<references />
!! html/parsoid
-<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|<ref>{{echo|foo}}</ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: <span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion mw:Extension/ref\" data-parsoid=\"{&quot;dsr&quot;:[64,96,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]]}\" 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;<ref>{{echo|foo}}</ref>&quot;}},&quot;i&quot;:0}}]}\"><a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span class=\"mw-reflink-text\">[1]</span></a></span><meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&quot;group&quot;:&quot;&quot;,&quot;name&quot;:&quot;&quot;,&quot;content&quot;:&quot;foo&quot;,&quot;hasRefInRef&quot;:false,&quot;dsr&quot;:[64,96,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;,&quot;spc&quot;:[&quot;&quot;,&quot;&quot;,&quot;&quot;,&quot;&quot;]}]],&quot;tmp&quot;:{}}\" 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;<ref>{{echo|foo}}</ref>&quot;}},&quot;i&quot;:0}}]}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image" data-parsoid='{"optList":[{"ck":"caption","ak":"Undisplayed caption in inline image with ref: {{echo|<ref>{{echo|foo}}</ref>}}"}]}' data-mw='{"caption":"Undisplayed caption in inline image with ref: <span about=\"#mwt2\" class=\"mw-ref\" id=\"cite_ref-1\" rel=\"dc:references\" typeof=\"mw:Transclusion mw:Extension/ref\" data-parsoid=\"{&quot;dsr&quot;:[64,96,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]]}\" 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;<ref>{{echo|foo}}</ref>&quot;}},&quot;i&quot;:0}}]}\"><a href=\"#cite_note-1\" style=\"counter-reset: mw-Ref 1;\"><span class=\"mw-reflink-text\">[1]</span></a></span><meta typeof=\"mw:Transclusion mw:Extension/ref/Marker\" about=\"#mwt2\" data-parsoid=\"{&quot;group&quot;:&quot;&quot;,&quot;name&quot;:&quot;&quot;,&quot;content&quot;:&quot;foo&quot;,&quot;hasRefInRef&quot;:false,&quot;dsr&quot;:[64,96,null,null],&quot;pi&quot;:[[{&quot;k&quot;:&quot;1&quot;}]],&quot;tmp&quot;:{}}\" 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;<ref>{{echo|foo}}</ref>&quot;}},&quot;i&quot;:0}}]}\">"}'><a href="./File:Foobar.jpg" data-parsoid='{"a":{"href":"./File:Foobar.jpg"},"sa":{}}'><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="220" width="1941" data-parsoid='{"a":{"resource":"./File:Foobar.jpg","height":"220","width":"1941"},"sa":{"resource":"File:Foobar.jpg"}}'/></a></span></p>
<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text" data-parsoid="{}">foo</span></li></ol>
!! end
* {{echo|a
[[Category:Foo]]}}
!! html/parsoid
-<ul><li> <span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n[[Category:Foo]]"}},"i":0}}]}'>a
+<ul><li> <span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n[[Category:Foo]]"}},"i":0}}]}'>a
</span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/></li></ul>
!! end
!! html/parsoid
<ul><li> a</li></ul>
-<link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"},"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]]\n[[Category:Bar]]"}},"i":0}}]}'/><span about="#mwt1">
+<link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Foo]]\n[[Category:Bar]]"}},"i":0}}]}'/><span about="#mwt1">
</span><link rel="mw:PageProp/Category" href="./Category:Bar" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Bar"},"sa":{"href":"Category:Bar"}}'/>
<link rel="mw:PageProp/Category" href="./Category:Baz" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:Baz"}}'/>
!! end
</ol>
!!end
-!!test
+## Don't expect this to rt since we're dropping content
+!! test
References: 5. ref tags in references should be processed while ignoring all other content
+!! options
+parsoid=wt2html,html2html
!! wikitext
A <ref name="a" />
B <ref name="b">bar</ref>
B <span about="#mwt4" class="mw-ref" id="cite_ref-b_2-0" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-b-2"},"attrs":{"name":"b"}}'><a href="#cite_note-b-2"><span class="mw-reflink-text">[2]</span></a></span></p>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[59,82,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}'><a href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\"><span class=\"mw-reflink-text\">[1]</span></a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{},"body":{"html":"\n<span about=\"#mwt8\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[59,82,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-a-1\"},\"attrs\":{\"name\":\"a\"}}'><a href=\"#cite_note-a-1\" style=\"counter-reset: mw-Ref 1;\"><span class=\"mw-reflink-text\">[1]</span></a></span>\n"}}'><li about="#cite_note-a-1" id="cite_note-a-1"><a href="#cite_ref-a_1-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-a-1" class="mw-reference-text">foo</span></li><li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">bar</span></li>
</ol>
-!!end
+!! end
-!!test
+!! test
References: 6. <references /> from a transclusion
!! wikitext
<ref>Foo</ref> {{echo|<references />}}
!! html/parsoid
<p><span about="#mwt3" class="mw-ref" id="cite_ref-1" rel="dc:references" typeof="mw:Extension/ref" data-mw='{"name":"ref","body":{"id":"mw-reference-text-cite_note-1"},"attrs":{}}'><a href="#cite_note-1"><span class="mw-reflink-text">[1]</span></a></span></p> <ol class="mw-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"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">Foo</span></li>
</ol>
-!!end
+!! end
!! test
References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
<li about="#cite_note-1" id="cite_note-1"><a href="#cite_ref-1" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-1" class="mw-reference-text">foo bar for a</span></li>
</ol>
-<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[96,119,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}'><a href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\"><span class=\"mw-reflink-text\">[X 1]</span></a></span>\n"},"attrs":{"group":"X"}}'>
+<ol class="mw-references" typeof="mw:Extension/references" about="#mwt8" data-mw-group="X" data-mw='{"name":"references","attrs":{"group":"X"},"body":{"html":"\n<span about=\"#mwt10\" class=\"mw-ref\" rel=\"dc:references\" typeof=\"mw:Extension/ref\" data-parsoid='{\"dsr\":[96,119,14,6]}' data-mw='{\"name\":\"ref\",\"body\":{\"id\":\"mw-reference-text-cite_note-b-2\"},\"attrs\":{\"name\":\"b\"}}'><a href=\"#cite_note-b-2\" style=\"counter-reset: mw-Ref 1;\" data-mw-group=\"X\"><span class=\"mw-reflink-text\">[X 1]</span></a></span>\n"}}'>
<li about="#cite_note-b-2" id="cite_note-b-2"><a href="#cite_ref-b_2-0" data-mw-group="X" rel="mw:referencedBy"><span class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-b-2" class="mw-reference-text">foo</span></li>
</ol>
!! end
!! html/parsoid
<h1>=<b>bold</b>foo=</h1>
!! wikitext
-= ='''bold'''<nowiki>foo=</nowiki> =
+= ='''bold'''foo= =
!!end
!! test
<nowiki>;</nowiki>Foo<nowiki>:</nowiki>bar
!!end
+## Making these next 3 tests Parsoid-only since they are html2wt tests
+## to test wikitext escaping, and insignificant whitespace diffs
+## cause PHP parser tests to barf
!! test
-Lists: 1. Nested inside html
+Lists: 1. Nested inside html (No unnecessary escapes)
!! options
parsoid=html2wt
!! html/parsoid
-<ul><li>*foo</li></ul>
-<ul><li>#foo</li></ul>
-<ul><li>:foo</li></ul>
-<ul><li>;foo</li></ul>
-<ol><li>*foo</li></ol>
-<ol><li>#foo</li></ol>
-<ol><li>:foo</li></ol>
-<ol><li>;foo</li></ol>
+<ul>
+<li>*foo</li>
+<li>#foo</li>
+<li>:foo</li>
+<li>;foo</li>
+<li data-parsoid='{}'>*foo</li>
+<li data-parsoid='{}'>#foo</li>
+<li data-parsoid='{}'>:foo</li>
+<li data-parsoid='{}'>;foo</li>
+</ul>
+<ol>
+<li>*foo</li>
+<li>#foo</li>
+<li>:foo</li>
+<li>;foo</li>
+<li data-parsoid='{}'>*foo</li>
+<li data-parsoid='{}'>#foo</li>
+<li data-parsoid='{}'>:foo</li>
+<li data-parsoid='{}'>;foo</li>
+</ol>
!! wikitext
+* *foo
+* #foo
+* :foo
+* ;foo
*<nowiki>*foo</nowiki>
-
*<nowiki>#foo</nowiki>
-
*<nowiki>:foo</nowiki>
-
*<nowiki>;foo</nowiki>
+# *foo
+# #foo
+# :foo
+# ;foo
#<nowiki>*foo</nowiki>
-
#<nowiki>#foo</nowiki>
-
#<nowiki>:foo</nowiki>
-
#<nowiki>;foo</nowiki>
!!end
<dl><dt>:foo</dt>
<dd>bar</dd></dl>
<dl><dd>:foo</dd></dl>
-
!! wikitext
-;<nowiki>;foo</nowiki>
+; ;foo
-;<nowiki>:foo</nowiki>
+; <nowiki>:foo</nowiki>
-;<nowiki>:foo</nowiki>
-:bar
+; <nowiki>:foo</nowiki>
+: bar
-:<nowiki>:foo</nowiki>
+: :foo
!!end
!! test
-Lists: 3. Only bullets at start of text should be escaped
+Lists: 3. Only bullets at start of text in wikitext-generated HTML should be escaped
!! options
parsoid=html2wt
!! html/parsoid
-<ul><li>*foo*bar</li></ul>
-<ul><li>*foo<i>it</i>*bar</li></ul>
-
+<ul>
+<li>*foo*bar</li>
+<li data-parsoid='{}'>*foo<i>it</i>*bar</li>
+</ul>
!! wikitext
-*<nowiki>*foo*bar</nowiki>
-
+* *foo*bar
*<nowiki>*foo</nowiki>''it''*bar
!!end
<a rel="mw:ExtLink" href="http://google.com">google]</a></p>
<p>[http://google.com]</p>
<p>[http://google.com google]</p>
+<p>[<a rel="mw:ExtLink" href="http://google.com">http://google.com</a>]</p>
+<p>[<a rel="mw:ExtLink" href="http://google.com" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://google.com"}},"i":0}}]}'>http://google.com</a>]</p>
!! wikitext
[http://google.com <nowiki>[google]</nowiki>]
[http://google.com <nowiki>google]</nowiki>]
<nowiki>[http://google.com google]</nowiki>
+[http://google.com<nowiki>]</nowiki>
+
+[{{echo|http://google.com}}<nowiki>]</nowiki>
!! html/php
<p><a rel="nofollow" class="external text" href="http://google.com">[google]</a>
<a rel="nofollow" class="external text" href="http://google.com">google]</a>
</p><p>[http://google.com]
</p><p>[http://google.com google]
+</p><p>[<a rel="nofollow" class="external free" href="http://google.com">http://google.com</a>]
+</p><p>[<a rel="nofollow" class="external free" href="http://google.com">http://google.com</a>]
</p>
!! end
parsoid=html2wt
!! html/parsoid
<p><a rel="mw:ExtLink" href="http://google.com">[google</a></p>
+<p>[<a ref="mw:ExtLink" href="http://google.com"></a>]</p>
!! wikitext
[http://google.com [google]
+
+[[http://google.com]]
!! html/php
<p><a rel="nofollow" class="external text" href="http://google.com">[google</a>
+</p><p>[<a rel="nofollow" class="external autonumber" href="http://google.com">[1]</a>]
</p>
!! end
!! wikitext
<table>{{echo|hi</table>hello}}
!! html/parsoid
-<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi</table>hello"}},"i":0}}]}' data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"pi":[[{"k":"1","spc":["","","",""]}]]}'>hi</p><table about="#mwt2" data-parsoid='{"stx":"html"}'></table><p about="#mwt2">hello</p>
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi</table>hello"}},"i":0}}]}' data-parsoid='{"fostered":true,"autoInsertedEnd":true,"autoInsertedStart":true,"pi":[[{"k":"1"}]]}'>hi</p><table about="#mwt2" data-parsoid='{"stx":"html"}'></table><p about="#mwt2">hello</p>
!!end
!!test
Table in fosterable position
!!options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
!! wikitext
{{OpenTable}}
<div>
</div>
|}
!! html/parsoid
-<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,"pi":[[]]}'></div><span about="#mwt1">
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"OpenTable","href":"./Template:OpenTable"},"params":{},"i":0}},"\n<div>\n"]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[]]}'></div><span about="#mwt1">
</span>
<table about="#mwt1" data-parsoid='{"autoInsertedEnd":true}'></table>
}}
</table>
!! html/parsoid
-<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n<td>foo</td>\n"}},"i":0}},"\n</table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1","spc":["","","",""]}]]}'>
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n",{"template":{"target":{"wt":"#if:","function":"#if"},"params":{"1":{"wt":"\n<td>foo</td>\n"}},"i":0}},"\n</table>"]}' data-parsoid='{"stx":"html","pi":[[{"k":"1"}]]}'>
</table>
!! end
!! end
+!! test
+T115289: Unclosed table
+!! wikitext
+{{echo|<table>}}<!--c-->[[Category:Two]]
+!! html/parsoid
+<link rel="mw:PageProp/Category" href="./Category:Two" about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"simple","a":{"href":"./Category:Two"},"sa":{"href":"Category:Two"},"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<table>"}},"i":0}},"<!--c-->[[Category:Two]]"]}'/><table about="#mwt1" data-parsoid='{"stx":"html","autoInsertedEnd":true}'><!--c--></table>
+!! end
+
+!! test
+T115289: Don't migrate newlines out of tables with fostered content
+!! wikitext
+<table><td></td>{{echo|<tr>[[Category:One]]}}<!--c-->[[Category:Two]]
+!! html/parsoid
+<link rel="mw:PageProp/Category" href="./Category:One" about="#mwt2" typeof="mw:Transclusion" data-parsoid='{"stx":"simple","a":{"href":"./Category:One"},"sa":{"href":"Category:One"},"fostered":true,"pi":[[{"k":"1"}]]}' data-mw='{"parts":["<table><td></td>",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<tr>[[Category:One]]"}},"i":0}},"<!--c-->[[Category:Two]]"]}'/><link rel="mw:PageProp/Category" href="./Category:Two" about="#mwt2"/><table about="#mwt2" data-parsoid='{"stx":"html","autoInsertedEnd":true,"dsr":[0,53,7,0]}'><tbody><tr><td></td></tr><tr><!--c--></tr></tbody></table>
+!! end
+
+!! test
+T73074: More fostering fun
+!! wikitext
+<table><td></td>{{echo|<tr>}}<!--c-->[[Category:Two]]
+!! html/parsoid
+<link rel="mw:PageProp/Category" href="./Category:Two" data-parsoid='{"stx":"simple","a":{"href":"./Category:Two"},"sa":{"href":"Category:Two"},"fostered":true}'/><table data-parsoid='{"stx":"html","autoInsertedEnd":true}'><tbody><tr data-parsoid='{"autoInsertedEnd":true,"autoInsertedStart":true}'><td data-parsoid='{"stx":"html"}'></td></tr><tr about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<tr>"}},"i":0}},"<!--c-->[[Category:Two]]"]}'><!--c--></tr></tbody></table>
+!! end
+
!!test
Support <object> element with .data attribute
!!options
<!--Orig params with data-parsoid has heuristics for handling = chars-->
<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
-<p data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"2","spc":["","","",""]}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
+<p data-parsoid='{"pi":[[{"k":"1"},{"k":"2"}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
!! wikitext
-{{echo|1 = f=oo}}
+{{echo|1=f=oo}}
-{{echo|1 = f=oo|2 = bar}}
+{{echo|1=f=oo|2=bar}}
<!--Orig params with data-parsoid has heuristics for handling = chars-->
<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
!! html/parsoid
<p><a rel="mw:ExtLink" href="http://stuff?is=ok" about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://stuff?is=ok"}},"i":0}}]}'>http://stuff?is=ok</a></p>
!! wikitext
-{{echo|1 = http://stuff?is=ok}}
+{{echo|1=http://stuff?is=ok}}
!! end
!! test
!! options
parsoid=html2wt
!! html/parsoid
-<span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span><table about="#mwt2" typeof="mw:Transclusion mw:ExpandedAttrs" data-parsoid='{"a":{"{{echo|c\n{{!}}d\n}}":null},"sa":{"{{echo|c\n{{!}}d\n}}":""},"firstWikitextNode":"table","pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c\n{{!}}d\n"}},"i":0}},"\n|}"]}'>
+<span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a"}},"i":0}}]}'>a</span><table about="#mwt2" typeof="mw:Transclusion mw:ExpandedAttrs" data-parsoid='{"a":{"{{echo|c\n{{!}}d\n}}":null},"sa":{"{{echo|c\n{{!}}d\n}}":""},"firstWikitextNode":"table","pi":[[{"k":"1"}]]}' data-mw='{"parts":["{|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"c\n{{!}}d\n"}},"i":0}},"\n|}"]}'>
<tbody><tr><td>d
</td></tr>
</tbody></table>
* @ingroup Testing
*/
-$otions = [ 'quick', 'color', 'quiet', 'help', 'show-output',
+$options = [ 'quick', 'color', 'quiet', 'help', 'show-output',
'record', 'run-disabled', 'run-parsoid' ];
-$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion' ];
+$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion', 'file' ];
require_once __DIR__ . '/../maintenance/commandLine.inc';
require_once __DIR__ . '/TestsAutoLoader.php';
--- /dev/null
+<?php
+
+/**
+ * @author Addshore
+ *
+ * @covers WatchedItemStore
+ */
+class WatchedItemStoreTest extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
+ */
+ private function getMockDb() {
+ return $this->getMock( 'IDatabase' );
+ }
+
+ /**
+ * @return PHPUnit_Framework_MockObject_MockObject|LoadBalancer
+ */
+ private function getMockLoadBalancer( $mockDb ) {
+ $mock = $this->getMockBuilder( 'LoadBalancer' )
+ ->disableOriginalConstructor()
+ ->getMock();
+ $mock->expects( $this->any() )
+ ->method( 'getConnection' )
+ ->will( $this->returnValue( $mockDb ) );
+ return $mock;
+ }
+
+ private function getFakeRow( $userId, $timestamp ) {
+ $fakeRow = new stdClass();
+ $fakeRow->wl_user = $userId;
+ $fakeRow->wl_notificationtimestamp = $timestamp;
+ return $fakeRow;
+ }
+
+ public function testDuplicateEntry_nothingToDuplicate() {
+ $mockDb = $this->getMockDb();
+ $mockDb->expects( $this->exactly( 1 ) )
+ ->method( 'select' )
+ ->will( $this->returnValue( new FakeResultWrapper( [] ) ) );
+
+ $store = new WatchedItemStore( $this->getMockLoadBalancer( $mockDb ) );
+
+ $store->duplicateEntry(
+ Title::newFromText( 'Old_Title' ),
+ Title::newFromText( 'New_Title' )
+ );
+ }
+
+ public function testDuplicateEntry_somethingToDuplicate() {
+ $fakeRows = [
+ $this->getFakeRow( 1, '20151212010101' ),
+ $this->getFakeRow( 2, null ),
+ ];
+
+ $mockDb = $this->getMockDb();
+ $mockDb->expects( $this->at( 0 ) )
+ ->method( 'select' )
+ ->will( $this->returnValue( new FakeResultWrapper( $fakeRows ) ) );
+ $mockDb->expects( $this->at( 1 ) )
+ ->method( 'replace' )
+ ->with(
+ 'watchlist',
+ [ [ 'wl_user', 'wl_namespace', 'wl_title' ] ],
+ [
+ [
+ 'wl_user' => 1,
+ 'wl_namespace' => 0,
+ 'wl_title' => 'New_Title',
+ 'wl_notificationtimestamp' => '20151212010101',
+ ],
+ [
+ 'wl_user' => 2,
+ 'wl_namespace' => 0,
+ 'wl_title' => 'New_Title',
+ 'wl_notificationtimestamp' => null,
+ ],
+ ],
+ $this->isType( 'string' )
+ );
+
+ $store = new WatchedItemStore( $this->getMockLoadBalancer( $mockDb ) );
+
+ $store->duplicateEntry(
+ Title::newFromText( 'Old_Title' ),
+ Title::newFromText( 'New_Title' )
+ );
+ }
+
+}
class LegacyLoggerTest extends MediaWikiTestCase {
/**
- * @covers LegacyLogger::interpolate
+ * @covers MediaWiki\Logger\LegacyLogger::interpolate
* @dataProvider provideInterpolate
*/
public function testInterpolate( $message, $context, $expect ) {
}
/**
- * @covers LegacyLogger::shouldEmit
+ * @covers MediaWiki\Logger\LegacyLogger::shouldEmit
* @dataProvider provideShouldEmit
*/
public function testShouldEmit( $level, $config, $expected ) {
class MonologSpiTest extends MediaWikiTestCase {
/**
- * @covers MonologSpi::mergeConfig
+ * @covers MediaWiki\Logger\MonologSpi::mergeConfig
*/
public function testMergeConfig() {
$base = [
}
/**
- * @covers LineFormatter::normalizeException
+ * @covers MediaWiki\Logger\Monolog\LineFormatter::normalizeException
*/
public function testNormalizeExceptionNoTrace() {
$fixture = new LineFormatter();
}
/**
- * @covers LineFormatter::normalizeException
+ * @covers MediaWiki\Logger\Monolog\LineFormatter::normalizeException
*/
public function testNormalizeExceptionTrace() {
$fixture = new LineFormatter();
}
/**
- * @dataProvider provider_testSanitzeHdrs
- * @covers SwiftFileBackend::sanitzeHdrs
+ * @dataProvider provider_testSanitizeHdrs
+ * @covers SwiftFileBackend::sanitizeHdrs
* @covers SwiftFileBackend::getCustomHeaders
*/
- public function testSanitzeHdrs( $raw, $sanitized ) {
+ public function testSanitizeHdrs( $raw, $sanitized ) {
$hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
$this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrs() has expected result' );
}
- public static function provider_testSanitzeHdrs() {
+ public static function provider_testSanitizeHdrs() {
return [
[
[
/**
* @covers ProcessCacheLRU::get
* @covers ProcessCacheLRU::set
- * @covers ProcessCacheLRU::het
+ * @covers ProcessCacheLRU::has
*/
public function testAddAndGetAKey() {
$oneCache = new ProcessCacheLRUTestable( 1 );
/**
* @covers ProcessCacheLRU::get
* @covers ProcessCacheLRU::set
- * @covers ProcessCacheLRU::het
+ * @covers ProcessCacheLRU::has
*/
public function testRecentlyAccessedKeyStickIn() {
$cache = new ProcessCacheLRUTestable( 2 );
$cache->delete( 'foo', CachedBagOStuff::WRITE_CACHE_ONLY );
$this->assertEquals( 'old', $cache->get( 'foo' ) ); // Reloaded from backend
}
+
+ public function testCacheBackendMisses() {
+ $backend = new HashBagOStuff;
+ $cache = new CachedBagOStuff( $backend );
+
+ // First hit primes the cache with miss from the backend
+ $this->assertEquals( false, $cache->get( 'foo' ) );
+
+ // Change the value in the backend
+ $backend->set( 'foo', true );
+
+ // Second hit returns the cached miss
+ $this->assertEquals( false, $cache->get( 'foo' ) );
+
+ // But a fresh value is read from the backend
+ $backend->set( 'bar', true );
+ $this->assertEquals( true, $cache->get( 'bar' ) );
+ }
}
/**
* @dataProvider provideSwappingICCProfile
- * @covers BitmapHandler::swapICCProfile
+ * @covers ExifBitmapHandler::swapICCProfile
*/
public function testSwappingICCProfile(
$sourceFilename, $controlFilename, $newProfileFilename, $oldProfileName
/**
* Test for multi-section, hostile XML
- * @covers checkParseSafety
+ * @covers XMPReader::checkParseSafety
*/
public function testCheckParseSafety() {
$this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
}
- /**
- * @depends testImplementsSetMagic
- * @covers Article::__call
- */
- public function testImplementsCallMagic() {
- $this->article->mLatest = 33;
- $this->article->mDataLoaded = true;
- $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
- }
-
/**
* @covers Article::__get
* @covers Article::__set
$tmpGlobals['wgSitename'] = 'MediaWiki';
$tmpGlobals['wgServer'] = 'http://example.org';
$tmpGlobals['wgServerName'] = 'example.org';
+ $tmpGlobals['wgScriptPath'] = '';
$tmpGlobals['wgScript'] = '/index.php';
- $tmpGlobals['wgScriptPath'] = '/';
+ $tmpGlobals['wgResourceBasePath'] = '';
+ $tmpGlobals['wgStylePath'] = '/skins';
+ $tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
$tmpGlobals['wgArticlePath'] = '/wiki/$1';
$tmpGlobals['wgActionPaths'] = [];
$tmpGlobals['wgVariantArticlePath'] = false;
- $tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
- $tmpGlobals['wgStylePath'] = '/skins';
$tmpGlobals['wgEnableUploads'] = true;
$tmpGlobals['wgUploadNavigationUrl'] = false;
$tmpGlobals['wgThumbnailScriptPath'] = false;
/**
* @group large
*/
-class BcryptPasswordTestCase extends PasswordTestCase {
+class BcryptPasswordTest extends PasswordTestCase {
protected function getTypeConfigs() {
return [ 'bcrypt' => [
'class' => 'BcryptPassword',
$this->assertEquals( 'somevalue', $extracted['globals']['egBar'] );
}
- public static function provideExtracttExtensionMessagesFiles() {
+ public static function provideExtractExtensionMessagesFiles() {
$dir = __DIR__ . '/FooBar/';
return [
[
}
/**
- * @covers ExtensionProcessor::extracttExtensionMessagesFiles
- * @dataProvider provideExtracttExtensionMessagesFiles
+ * @covers ExtensionProcessor::extractExtensionMessagesFiles
+ * @dataProvider provideExtractExtensionMessagesFiles
*/
- public function testExtracttExtensionMessagesFiles( $input, $expected ) {
+ public function testExtractExtensionMessagesFiles( $input, $expected ) {
$processor = new ExtensionProcessor();
$processor->extractInfo( $this->dir, $input + self::$default, 1 );
$out = $processor->getExtractedInfo();
namespace MediaWiki\Session;
use AuthPlugin;
-use MediaWiki\Logger\LoggerFactory;
use MediaWikiTestCase;
use Psr\Log\LogLevel;
use User;
], $logger->getBuffer() );
$logger->clearBuffer();
}
-
- /**
- * @dataProvider provideCheckIpLimits
- */
- public function testCheckIpLimits( $ip, $sessionData, $userData, $logLevel1, $logLevel2 ) {
- $this->setMwGlobals( [
- 'wgSuspiciousIpPerSessionLimit' => 5,
- 'wgSuspiciousIpPerUserLimit' => 10,
- 'wgSuspiciousIpExpiry' => 600,
- 'wgSquidServers' => [ '11.22.33.44' ],
- ] );
- $manager = new SessionManager();
- $logger = $this->getMock( '\Psr\Log\LoggerInterface' );
- $this->setLogger( 'session-ip', $logger );
- $request = new \FauxRequest();
- $request->setIP( $ip );
-
- $session = $manager->getSessionForRequest( $request );
- /** @var SessionBackend $backend */
- $backend = \TestingAccessWrapper::newFromObject( $session )->backend;
- $data = &$backend->getData();
- $data = [ 'SessionManager-ip' => $sessionData ];
- $backend->setUser( User::newFromName( 'UTSysop' ) );
- $manager = \TestingAccessWrapper::newFromObject( $manager );
- $manager->store->set( 'SessionManager-ip:' . md5( 'UTSysop' ), $userData );
-
- $logger->expects( $this->exactly( isset( $logLevel1 ) + isset( $logLevel2 ) ) )->method( 'log' );
- if ( $logLevel1 ) {
- $logger->expects( $this->at( 0 ) )->method( 'log' )->with( $logLevel1,
- 'Same session used from {count} IPs', $this->isType( 'array' ) );
- }
- if ( $logLevel2 ) {
- $logger->expects( $this->at( isset( $logLevel1 ) ) )->method( 'log' )->with( $logLevel2,
- 'Same user had sessions from {count} IPs', $this->isType( 'array' ) );
- }
-
- $manager->checkIpLimits( $session );
- }
-
- public function provideCheckIpLimits() {
- $future = time() + 1000;
- $past = time() - 1000;
- return [
- // DEBUG log for first new IP
- [ '1.2.3.4', [], [], LogLevel::DEBUG, LogLevel::DEBUG ],
- // no log for same IP
- [ '1.2.3.4', [ '1.2.3.4' => $future ], [ '1.2.3.4' => $future ],
- null, null ],
- [ '1.2.3.4', [], [ '1.2.3.4' => $future ],
- LogLevel::DEBUG, null ],
- // INFO log for second new IP
- [ '1.2.3.4', [ '10.20.30.40' => $future ], [ '10.20.30.40' => $future ],
- LogLevel::INFO, LogLevel::INFO ],
- // WARNING above $wgSuspiciousIpPerSessionLimit
- [ '1.2.3.4', array_fill_keys( range( 1, 5 ), $future ),
- array_fill_keys( range( 1, 5 ), $future ), LogLevel::WARNING, LogLevel::INFO ],
- // WARNING above $wgSuspiciousIpPerUserLimit
-
- [ '1.2.3.4', array_fill_keys( range( 1, 2 ), $future ),
- array_fill_keys( range( 1, 12 ), $future ), LogLevel::INFO, LogLevel::WARNING ],
- // expired keys ignored
- [ '1.2.3.4', [ '1.2.3.4' => $past ], [ '1.2.3.4' => $past ],
- LogLevel::DEBUG, LogLevel::DEBUG ],
- [ '1.2.3.4', array_fill_keys( range( 1, 5 ), $past ),
- array_fill_keys( range( 1, 5 ), $past ), LogLevel::DEBUG, LogLevel::DEBUG ],
- // special IPs are ignored
- [ '127.0.0.1', [], [], null, null ],
- [ '11.22.33.44', [], [], null, null ],
- ];
- }
}
}
/**
- * @covers FileContentsHasher::getFileContentHash
+ * @covers FileContentsHasher::getFileContentsHash
* @covers FileContentsHasher::getFileContentsHashInternal
* @dataProvider provideSingleFile
*/
}
/**
- * @covers FileContentsHasher::getFileContentHash
+ * @covers FileContentsHasher::getFileContentsHash
* @covers FileContentsHasher::getFileContentsHashInternal
* @dataProvider provideMultipleFiles
*/
preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
"UID $id has the right format" );
- $id = UIDGenerator::newRawUUIDv1( UIDGenerator::QUICK_RAND );
+ $id = UIDGenerator::newRawUUIDv1();
$this->assertEquals( true,
preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
"UID $id has the right format" );
* Returns true if this content is countable as a "real" wiki page, provided
* that it's also in a countable location (e.g. a current revision in the main namespace).
*
- * @param bool $hasLinks If it is known whether this content contains links,
+ * @param bool|null $hasLinks If it is known whether this content contains links,
* provide this information here, to avoid redundant parsing to find out.
* @return bool
*/
* Returns true if this content is countable as a "real" wiki page, provided
* that it's also in a countable location (e.g. a current revision in the main namespace).
*
- * @param bool $hasLinks If it is known whether this content contains links,
+ * @param bool|null $hasLinks If it is known whether this content contains links,
* provide this information here, to avoid redundant parsing to find out.
* @return bool
*/
$_SERVER['argv'] = array_values( $_SERVER['argv'] );
}
- if ( !wfIsWindows() ) {
- # If we are not running on windows then we can enable phpunit colors
- # Windows does not come anymore with ANSI.SYS loaded by default
- # PHPUnit uses the suite.xml parameters to enable/disable colors
- # which can be then forced to be enabled with --colors.
- # The below code injects a parameter just like if the user called
- # Probably fix bug 29226
- $key = array_search( '--colors', $_SERVER['argv'] );
- if ( $key === false ) {
- array_splice( $_SERVER['argv'], 1, 0, '--colors' );
- }
- }
-
# Makes MediaWiki PHPUnit directory includable so the PHPUnit will
# be able to resolve relative files inclusion such as suites/*
# PHPUnit uses stream_resolve_include_path() internally
<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Colors don't work on Windows!
-phpunit.php enables colors for other OSs at runtime
--->
<phpunit bootstrap="./bootstrap.php"
- colors="false"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"
+
+ colors="true"
backupGlobals="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
timeoutForSmallTests="10"
timeoutForMediumTests="30"
timeoutForLargeTests="60"
- strict="true"
+ beStrictAboutTestsThatDoNotTestAnything="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutTestSize="true"
verbose="true">
<testsuites>
<testsuite name="includes">