* Linker::makeKnownLinkObj() was removed (deprecated since 1.16).
* Linker::makeLinkObj() was removed (deprecated since 1.16).
* wfMsgForContentNoTrans() was removed (deprecated since 1.18).
+* ChangesList::usePatrol was removed (deprecated since 1.22).
+* wfMsgNoTrans() was removed (deprecated since 1.18).
+* Linker::makeImageLink2 was removed (deprecated since 1.20).
+* Title::userIsWatching() was removed (deprecated since 1.20).
+* Removed WaitForSlave maintenance script; use SELECT MASTER_POS_WAIT()
+ database function directly instead.
+* wfMsg() was removed (deprecated since 1.18).
+* wfMsgForContent() was removed (deprecated since 1.18).
+* wfMsgReal() was removed (deprecated since 1.18).
+* wfMsgGetKey() was removed (deprecated since 1.18).
+* wfMsgHtml() was removed (deprecated since 1.18).
+* wfMsgWikiHtml() was removed (deprecated since 1.18).
+* wfMsgExt() was removed (deprecated since 1.18).
== Compatibility ==
'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php',
'DeprecatedInterfaceFinder' => __DIR__ . '/maintenance/findDeprecated.php',
'DerivativeContext' => __DIR__ . '/includes/context/DerivativeContext.php',
- 'DerivativeRequest' => __DIR__ . '/includes/WebRequest.php',
+ 'DerivativeRequest' => __DIR__ . '/includes/DerivativeRequest.php',
'DerivativeResourceLoaderContext' => __DIR__ . '/includes/resourceloader/DerivativeResourceLoaderContext.php',
'DescribeFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
'Diff' => __DIR__ . '/includes/diff/DairikiDiff.php',
'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
'EmailConfirmation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
- 'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
+ 'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialEmailInvalidate.php',
'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
'EmptyBagOStuff' => __DIR__ . '/includes/libs/objectcache/EmptyBagOStuff.php',
'FakeResultWrapper' => __DIR__ . '/includes/db/DatabaseUtility.php',
'Fallback' => __DIR__ . '/includes/Fallback.php',
'FatalError' => __DIR__ . '/includes/exception/FatalError.php',
- 'FauxRequest' => __DIR__ . '/includes/WebRequest.php',
+ 'FauxRequest' => __DIR__ . '/includes/FauxRequest.php',
'FauxResponse' => __DIR__ . '/includes/WebResponse.php',
'FeedItem' => __DIR__ . '/includes/Feed.php',
'FeedUtils' => __DIR__ . '/includes/FeedUtils.php',
'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
+ 'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
'MediaWiki\\Tidy\\Html5Depurate' => __DIR__ . '/includes/tidy/Html5Depurate.php',
'MediaWiki\\Tidy\\RaggettBase' => __DIR__ . '/includes/tidy/RaggettBase.php',
'MediaWiki\\Tidy\\RaggettExternal' => __DIR__ . '/includes/tidy/RaggettExternal.php',
'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
- 'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+ 'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchNearMatchResultSet.php',
'SearchOracle' => __DIR__ . '/includes/search/SearchOracle.php',
'SearchPostgres' => __DIR__ . '/includes/search/SearchPostgres.php',
'SearchResult' => __DIR__ . '/includes/search/SearchResult.php',
'SpecialWhatLinksHere' => __DIR__ . '/includes/specials/SpecialWhatlinkshere.php',
'SqlBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
'SqlDataUpdate' => __DIR__ . '/includes/deferred/SqlDataUpdate.php',
- 'SqlSearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+ 'SqlSearchResultSet' => __DIR__ . '/includes/search/SqlSearchResultSet.php',
'Sqlite' => __DIR__ . '/maintenance/sqlite.inc',
'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
'SqliteMaintenance' => __DIR__ . '/maintenance/sqlite.php',
'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
'WANObjectCache' => __DIR__ . '/includes/libs/objectcache/WANObjectCache.php',
- 'WaitForSlave' => __DIR__ . '/maintenance/waitForSlave.php',
'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
'WantedPagesPage' => __DIR__ . '/includes/specials/SpecialWantedpages.php',
"zordius/lightncandy": "0.23"
},
"require-dev": {
- "jakub-onderka/php-parallel-lint": "0.9",
+ "jakub-onderka/php-parallel-lint": "0.9.2",
"justinrainbow/json-schema": "~1.3",
"mediawiki/mediawiki-codesniffer": "0.5.1",
"monolog/monolog": "~1.17.2",
"ValidSkinNames": {
"type": "object"
},
+ "FeedClasses": {
+ "type": "object",
+ "description": "Available feeds objects"
+ },
"SkinOOUIThemes": {
"type": "object"
},
$block = self::newFromRow( $row );
# Don't use expired blocks
- if ( $block->deleteIfExpired() ) {
+ if ( $block->isExpired() ) {
continue;
}
$blocks = array();
foreach ( $rows as $row ) {
$block = self::newFromRow( $row );
- if ( !$block->deleteIfExpired() ) {
+ if ( !$block->isExpired() ) {
$blocks[] = $block;
}
}
// quick due to the small number of entries.
$totalcnt = $rescnt;
$category = $this->cat;
- wfGetDB( DB_MASTER )->onTransactionIdle( function () use ( $category ) {
+ DeferredUpdates::addCallableUpdate( function () use ( $category ) {
$category->refreshCounts();
} );
} else {
/**
* List of Ajax-callable functions.
* Extensions acting as Ajax callbacks must register here
+ * @deprecated (officially) since 1.27; use the API instead
*/
$wgAjaxExportList = array();
--- /dev/null
+<?php
+/**
+ * Deal with importing all those nasty globals and things
+ *
+ * Copyright © 2003 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * 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
+ */
+
+/**
+ * Similar to FauxRequest, but only fakes URL parameters and method
+ * (POST or GET) and use the base request for the remaining stuff
+ * (cookies, session and headers).
+ *
+ * @ingroup HTTP
+ * @since 1.19
+ */
+class DerivativeRequest extends FauxRequest {
+ private $base;
+
+ /**
+ * @param WebRequest $base
+ * @param array $data Array of *non*-urlencoded key => value pairs, the
+ * fake GET/POST values
+ * @param bool $wasPosted Whether to treat the data as POST
+ */
+ public function __construct( WebRequest $base, $data, $wasPosted = false ) {
+ $this->base = $base;
+ parent::__construct( $data, $wasPosted );
+ }
+
+ public function getCookie( $key, $prefix = null, $default = null ) {
+ return $this->base->getCookie( $key, $prefix, $default );
+ }
+
+ public function checkSessionCookie() {
+ return $this->base->checkSessionCookie();
+ }
+
+ public function getHeader( $name, $flags = 0 ) {
+ return $this->base->getHeader( $name, $flags );
+ }
+
+ public function getAllHeaders() {
+ return $this->base->getAllHeaders();
+ }
+
+ public function getSessionData( $key ) {
+ return $this->base->getSessionData( $key );
+ }
+
+ public function setSessionData( $key, $data ) {
+ $this->base->setSessionData( $key, $data );
+ }
+
+ public function getAcceptLang() {
+ return $this->base->getAcceptLang();
+ }
+
+ public function getIP() {
+ return $this->base->getIP();
+ }
+
+ public function getProtocol() {
+ return $this->base->getProtocol();
+ }
+
+ public function getElapsedTime() {
+ return $this->base->getElapsedTime();
+ }
+}
--- /dev/null
+<?php
+/**
+ * Deal with importing all those nasty globals and things
+ *
+ * Copyright © 2003 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * 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
+ */
+
+/**
+ * WebRequest clone which takes values from a provided array.
+ *
+ * @ingroup HTTP
+ */
+class FauxRequest extends WebRequest {
+ private $wasPosted = false;
+ private $session = array();
+ private $requestUrl;
+ protected $cookies = array();
+
+ /**
+ * @param array $data Array of *non*-urlencoded key => value pairs, the
+ * fake GET/POST values
+ * @param bool $wasPosted Whether to treat the data as POST
+ * @param array|null $session Session array or null
+ * @param string $protocol 'http' or 'https'
+ * @throws MWException
+ */
+ public function __construct( $data = array(), $wasPosted = false,
+ $session = null, $protocol = 'http'
+ ) {
+ $this->requestTime = microtime( true );
+
+ if ( is_array( $data ) ) {
+ $this->data = $data;
+ } else {
+ throw new MWException( "FauxRequest() got bogus data" );
+ }
+ $this->wasPosted = $wasPosted;
+ if ( $session ) {
+ $this->session = $session;
+ }
+ $this->protocol = $protocol;
+ }
+
+ /**
+ * Initialise the header list
+ */
+ protected function initHeaders() {
+ // Nothing to init
+ }
+
+ /**
+ * @param string $name
+ * @param string $default
+ * @return string
+ */
+ public function getText( $name, $default = '' ) {
+ # Override; don't recode since we're using internal data
+ return (string)$this->getVal( $name, $default );
+ }
+
+ /**
+ * @return array
+ */
+ public function getValues() {
+ return $this->data;
+ }
+
+ /**
+ * @return array
+ */
+ public function getQueryValues() {
+ if ( $this->wasPosted ) {
+ return array();
+ } else {
+ return $this->data;
+ }
+ }
+
+ public function getMethod() {
+ return $this->wasPosted ? 'POST' : 'GET';
+ }
+
+ /**
+ * @return bool
+ */
+ public function wasPosted() {
+ return $this->wasPosted;
+ }
+
+ public function getCookie( $key, $prefix = null, $default = null ) {
+ if ( $prefix === null ) {
+ global $wgCookiePrefix;
+ $prefix = $wgCookiePrefix;
+ }
+ $name = $prefix . $key;
+ return isset( $this->cookies[$name] ) ? $this->cookies[$name] : $default;
+ }
+
+ /**
+ * @since 1.26
+ * @param string $name Unprefixed name of the cookie to set
+ * @param string|null $value Value of the cookie to set
+ * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
+ */
+ public function setCookie( $key, $value, $prefix = null ) {
+ $this->setCookies( array( $key => $value ), $prefix );
+ }
+
+ /**
+ * @since 1.26
+ * @param array $cookies
+ * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
+ */
+ public function setCookies( $cookies, $prefix = null ) {
+ if ( $prefix === null ) {
+ global $wgCookiePrefix;
+ $prefix = $wgCookiePrefix;
+ }
+ foreach ( $cookies as $key => $value ) {
+ $name = $prefix . $key;
+ $this->cookies[$name] = $value;
+ }
+ }
+
+ public function checkSessionCookie() {
+ return false;
+ }
+
+ /**
+ * @since 1.25
+ */
+ public function setRequestURL( $url ) {
+ $this->requestUrl = $url;
+ }
+
+ /**
+ * @since 1.25 MWException( "getRequestURL not implemented" )
+ * no longer thrown.
+ */
+ public function getRequestURL() {
+ if ( $this->requestUrl === null ) {
+ throw new MWException( 'Request URL not set' );
+ }
+ return $this->requestUrl;
+ }
+
+ public function getProtocol() {
+ return $this->protocol;
+ }
+
+ /**
+ * @param string $name
+ * @param string $val
+ */
+ public function setHeader( $name, $val ) {
+ $this->setHeaders( array( $name => $val ) );
+ }
+
+ /**
+ * @since 1.26
+ * @param array $headers
+ */
+ public function setHeaders( $headers ) {
+ foreach ( $headers as $name => $val ) {
+ $name = strtoupper( $name );
+ $this->headers[$name] = $val;
+ }
+ }
+
+ /**
+ * @param string $key
+ * @return array|null
+ */
+ public function getSessionData( $key ) {
+ if ( isset( $this->session[$key] ) ) {
+ return $this->session[$key];
+ }
+ return null;
+ }
+
+ /**
+ * @param string $key
+ * @param array $data
+ */
+ public function setSessionData( $key, $data ) {
+ $this->session[$key] = $data;
+ }
+
+ /**
+ * @return array|mixed|null
+ */
+ public function getSessionArray() {
+ return $this->session;
+ }
+
+ /**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return string
+ */
+ public function getRawQueryString() {
+ return '';
+ }
+
+ /**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return string
+ */
+ public function getRawPostString() {
+ return '';
+ }
+
+ /**
+ * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+ * @return string
+ */
+ public function getRawInput() {
+ return '';
+ }
+
+ /**
+ * @param array $extWhitelist
+ * @return bool
+ */
+ public function checkUrlExtension( $extWhitelist = array() ) {
+ return true;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getRawIP() {
+ return '127.0.0.1';
+ }
+}
return call_user_func_array( 'Message::newFallbackSequence', $args );
}
-/**
- * Get a message from anywhere, for the current user language.
- *
- * Use wfMsgForContent() instead if the message should NOT
- * change depending on the user preferences.
- *
- * @deprecated since 1.18
- *
- * @param string $key Lookup key for the message, usually
- * defined in languages/Language.php
- *
- * Parameters to the message, which can be used to insert variable text into
- * it, can be passed to this function in the following formats:
- * - One per argument, starting at the second parameter
- * - As an array in the second parameter
- * These are not shown in the function definition.
- *
- * @return string
- */
-function wfMsg( $key ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $args = func_get_args();
- array_shift( $args );
- return wfMsgReal( $key, $args );
-}
-
-/**
- * Same as above except doesn't transform the message
- *
- * @deprecated since 1.18
- *
- * @param string $key
- * @return string
- */
-function wfMsgNoTrans( $key ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $args = func_get_args();
- array_shift( $args );
- return wfMsgReal( $key, $args, true, false, false );
-}
-
-/**
- * Get a message from anywhere, for the current global language
- * set with $wgLanguageCode.
- *
- * Use this if the message should NOT change dependent on the
- * language set in the user's preferences. This is the case for
- * most text written into logs, as well as link targets (such as
- * the name of the copyright policy page). Link titles, on the
- * other hand, should be shown in the UI language.
- *
- * Note that MediaWiki allows users to change the user interface
- * language in their preferences, but a single installation
- * typically only contains content in one language.
- *
- * Be wary of this distinction: If you use wfMsg() where you should
- * use wfMsgForContent(), a user of the software may have to
- * customize potentially hundreds of messages in
- * order to, e.g., fix a link in every possible language.
- *
- * @deprecated since 1.18
- *
- * @param string $key Lookup key for the message, usually
- * defined in languages/Language.php
- * @return string
- */
-function wfMsgForContent( $key ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- global $wgForceUIMsgAsContentMsg;
- $args = func_get_args();
- array_shift( $args );
- $forcontent = true;
- if ( is_array( $wgForceUIMsgAsContentMsg )
- && in_array( $key, $wgForceUIMsgAsContentMsg )
- ) {
- $forcontent = false;
- }
- return wfMsgReal( $key, $args, true, $forcontent );
-}
-
-/**
- * Really get a message
- *
- * @deprecated since 1.18
- *
- * @param string $key Key to get.
- * @param array $args
- * @param bool $useDB
- * @param string|bool $forContent Language code, or false for user lang, true for content lang.
- * @param bool $transform Whether or not to transform the message.
- * @return string The requested message.
- */
-function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
- $message = wfMsgReplaceArgs( $message, $args );
- return $message;
-}
-
-/**
- * Fetch a message string value, but don't replace any keys yet.
- *
- * @deprecated since 1.18
- *
- * @param string $key
- * @param bool $useDB
- * @param string|bool $langCode Code of the language to get the message for, or
- * behaves as a content language switch if it is a boolean.
- * @param bool $transform Whether to parse magic words, etc.
- * @return string
- */
-function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- Hooks::run( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
-
- $cache = MessageCache::singleton();
- $message = $cache->get( $key, $useDB, $langCode );
- if ( $message === false ) {
- $message = '<' . htmlspecialchars( $key ) . '>';
- } elseif ( $transform ) {
- $message = $cache->transform( $message );
- }
- return $message;
-}
-
/**
* Replace message parameter keys on the given formatted output.
*
return $message;
}
-/**
- * Return an HTML-escaped version of a message.
- * Parameter replacements, if any, are done *after* the HTML-escaping,
- * so parameters may contain HTML (eg links or form controls). Be sure
- * to pre-escape them if you really do want plaintext, or just wrap
- * the whole thing in htmlspecialchars().
- *
- * @deprecated since 1.18
- *
- * @param string $key
- * @param string $args,... Parameters
- * @return string
- */
-function wfMsgHtml( $key ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $args = func_get_args();
- array_shift( $args );
- return wfMsgReplaceArgs( htmlspecialchars( wfMsgGetKey( $key ) ), $args );
-}
-
-/**
- * Return an HTML version of message
- * Parameter replacements, if any, are done *after* parsing the wiki-text message,
- * so parameters may contain HTML (eg links or form controls). Be sure
- * to pre-escape them if you really do want plaintext, or just wrap
- * the whole thing in htmlspecialchars().
- *
- * @deprecated since 1.18
- *
- * @param string $key
- * @param string $args,... Parameters
- * @return string
- */
-function wfMsgWikiHtml( $key ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $args = func_get_args();
- array_shift( $args );
- return wfMsgReplaceArgs(
- MessageCache::singleton()->parse( wfMsgGetKey( $key ), null,
- /* can't be set to false */ true, /* interface */ true )->getText(),
- $args );
-}
-
-/**
- * Returns message in the requested format
- *
- * @deprecated since 1.18
- *
- * @param string $key Key of the message
- * @param array $options Processing rules.
- * Can take the following options:
- * parse: parses wikitext to HTML
- * parseinline: parses wikitext to HTML and removes the surrounding
- * p's added by parser or tidy
- * escape: filters message through htmlspecialchars
- * escapenoentities: same, but allows entity references like   through
- * replaceafter: parameters are substituted after parsing or escaping
- * parsemag: transform the message using magic phrases
- * content: fetch message for content language instead of interface
- * Also can accept a single associative argument, of the form 'language' => 'xx':
- * language: Language object or language code to fetch message for
- * (overridden by content).
- * Behavior for conflicting options (e.g., parse+parseinline) is undefined.
- *
- * @return string
- */
-function wfMsgExt( $key, $options ) {
- wfDeprecated( __METHOD__, '1.21' );
-
- $args = func_get_args();
- array_shift( $args );
- array_shift( $args );
- $options = (array)$options;
- $validOptions = array( 'parse', 'parseinline', 'escape', 'escapenoentities', 'replaceafter',
- 'parsemag', 'content' );
-
- foreach ( $options as $arrayKey => $option ) {
- if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
- // An unknown index, neither numeric nor "language"
- wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING );
- } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option, $validOptions ) ) {
- // A numeric index with unknown value
- wfWarn( "wfMsgExt called with incorrect parameter $option", 1, E_USER_WARNING );
- }
- }
-
- if ( in_array( 'content', $options, true ) ) {
- $forContent = true;
- $langCode = true;
- $langCodeObj = null;
- } elseif ( array_key_exists( 'language', $options ) ) {
- $forContent = false;
- $langCode = wfGetLangObj( $options['language'] );
- $langCodeObj = $langCode;
- } else {
- $forContent = false;
- $langCode = false;
- $langCodeObj = null;
- }
-
- $string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false );
-
- if ( !in_array( 'replaceafter', $options, true ) ) {
- $string = wfMsgReplaceArgs( $string, $args );
- }
-
- $messageCache = MessageCache::singleton();
- $parseInline = in_array( 'parseinline', $options, true );
- if ( in_array( 'parse', $options, true ) || $parseInline ) {
- $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj );
- if ( $string instanceof ParserOutput ) {
- $string = $string->getText();
- }
-
- if ( $parseInline ) {
- $string = Parser::stripOuterParagraph( $string );
- }
- } elseif ( in_array( 'parsemag', $options, true ) ) {
- $string = $messageCache->transform( $string,
- !$forContent, $langCodeObj );
- }
-
- if ( in_array( 'escape', $options, true ) ) {
- $string = htmlspecialchars( $string );
- } elseif ( in_array( 'escapenoentities', $options, true ) ) {
- $string = Sanitizer::escapeHtmlAllowEntities( $string );
- }
-
- if ( in_array( 'replaceafter', $options, true ) ) {
- $string = wfMsgReplaceArgs( $string, $args );
- }
-
- return $string;
-}
-
/**
* Fetch server name for use in error reporting etc.
* Use real server name if available, so we know which machine
return str_replace( "\n", ' ', $prefix . $s . $postfix );
}
- /**
- * See makeImageLink()
- * When this function is removed, remove if( $parser instanceof Parser ) check there too
- * @deprecated since 1.20
- */
- public static function makeImageLink2( Title $title, $file, $frameParams = array(),
- $handlerParams = array(), $time = false, $query = "", $widthOption = null ) {
- return self::makeImageLink( null, $title, $file, $frameParams,
- $handlerParams, $time, $query, $widthOption );
- }
-
/**
* Get the link parameters for MediaTransformOutput::toHtml() from given
* frame parameters supplied by the Parser.
/** @var string */
private $mPageTitleActionText = '';
- /** @var array */
- private $mParseWarnings = array();
-
/** @var int Cache stuff. Looks like mEnableClientCache */
protected $mCdnMaxage = 0;
/** @var int Upper limit on mCdnMaxage */
$this->mNewSectionLink = $parserOutput->getNewSection();
$this->mHideNewSectionLink = $parserOutput->getHideNewSection();
- $this->mParseWarnings = $parserOutput->getWarnings();
if ( !$parserOutput->isCacheable() ) {
$this->enableClientCache( false );
}
*/
public $mDefaultNamespace = NS_MAIN;
- /**
- * @var bool Is $wgUser watching this page? null if unfilled, accessed
- * through userIsWatching()
- */
- protected $mWatched = null;
-
/** @var int The page length, 0 for special pages */
protected $mLength = -1;
return $s;
}
- /**
- * Is $wgUser watching this page?
- *
- * @deprecated since 1.20; use User::isWatched() instead.
- * @return bool
- */
- public function userIsWatching() {
- global $wgUser;
-
- if ( is_null( $this->mWatched ) ) {
- if ( NS_SPECIAL == $this->mNamespace || !$wgUser->isLoggedIn() ) {
- $this->mWatched = false;
- } else {
- $this->mWatched = $wgUser->isWatched( $this );
- }
- }
- return $this->mWatched;
- }
-
/**
* Can $user perform $action on this page?
* This skips potentially expensive cascading permission checks
* URL or via a POSTed form stripping illegal input characters and
* normalizing Unicode sequences.
*
- * Usually this is used via a global singleton, $wgRequest. You should
- * not create a second WebRequest object; make a FauxRequest object if
- * you want to pass arbitrary data to some function in place of the web
- * input.
- *
* @ingroup HTTP
*/
class WebRequest {
$this->ip = $ip;
}
}
-
-/**
- * WebRequest clone which takes values from a provided array.
- *
- * @ingroup HTTP
- */
-class FauxRequest extends WebRequest {
- private $wasPosted = false;
- private $session = array();
- private $requestUrl;
- protected $cookies = array();
-
- /**
- * @param array $data Array of *non*-urlencoded key => value pairs, the
- * fake GET/POST values
- * @param bool $wasPosted Whether to treat the data as POST
- * @param array|null $session Session array or null
- * @param string $protocol 'http' or 'https'
- * @throws MWException
- */
- public function __construct( $data = array(), $wasPosted = false,
- $session = null, $protocol = 'http'
- ) {
- $this->requestTime = microtime( true );
-
- if ( is_array( $data ) ) {
- $this->data = $data;
- } else {
- throw new MWException( "FauxRequest() got bogus data" );
- }
- $this->wasPosted = $wasPosted;
- if ( $session ) {
- $this->session = $session;
- }
- $this->protocol = $protocol;
- }
-
- /**
- * Initialise the header list
- */
- protected function initHeaders() {
- // Nothing to init
- }
-
- /**
- * @param string $name
- * @param string $default
- * @return string
- */
- public function getText( $name, $default = '' ) {
- # Override; don't recode since we're using internal data
- return (string)$this->getVal( $name, $default );
- }
-
- /**
- * @return array
- */
- public function getValues() {
- return $this->data;
- }
-
- /**
- * @return array
- */
- public function getQueryValues() {
- if ( $this->wasPosted ) {
- return array();
- } else {
- return $this->data;
- }
- }
-
- public function getMethod() {
- return $this->wasPosted ? 'POST' : 'GET';
- }
-
- /**
- * @return bool
- */
- public function wasPosted() {
- return $this->wasPosted;
- }
-
- public function getCookie( $key, $prefix = null, $default = null ) {
- if ( $prefix === null ) {
- global $wgCookiePrefix;
- $prefix = $wgCookiePrefix;
- }
- $name = $prefix . $key;
- return isset( $this->cookies[$name] ) ? $this->cookies[$name] : $default;
- }
-
- /**
- * @since 1.26
- * @param string $name Unprefixed name of the cookie to set
- * @param string|null $value Value of the cookie to set
- * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
- */
- public function setCookie( $key, $value, $prefix = null ) {
- $this->setCookies( array( $key => $value ), $prefix );
- }
-
- /**
- * @since 1.26
- * @param array $cookies
- * @param string|null $prefix Cookie prefix. Defaults to $wgCookiePrefix
- */
- public function setCookies( $cookies, $prefix = null ) {
- if ( $prefix === null ) {
- global $wgCookiePrefix;
- $prefix = $wgCookiePrefix;
- }
- foreach ( $cookies as $key => $value ) {
- $name = $prefix . $key;
- $this->cookies[$name] = $value;
- }
- }
-
- public function checkSessionCookie() {
- return false;
- }
-
- /**
- * @since 1.25
- */
- public function setRequestURL( $url ) {
- $this->requestUrl = $url;
- }
-
- /**
- * @since 1.25 MWException( "getRequestURL not implemented" )
- * no longer thrown.
- */
- public function getRequestURL() {
- if ( $this->requestUrl === null ) {
- throw new MWException( 'Request URL not set' );
- }
- return $this->requestUrl;
- }
-
- public function getProtocol() {
- return $this->protocol;
- }
-
- /**
- * @param string $name
- * @param string $val
- */
- public function setHeader( $name, $val ) {
- $this->setHeaders( array( $name => $val ) );
- }
-
- /**
- * @since 1.26
- * @param array $headers
- */
- public function setHeaders( $headers ) {
- foreach ( $headers as $name => $val ) {
- $name = strtoupper( $name );
- $this->headers[$name] = $val;
- }
- }
-
- /**
- * @param string $key
- * @return array|null
- */
- public function getSessionData( $key ) {
- if ( isset( $this->session[$key] ) ) {
- return $this->session[$key];
- }
- return null;
- }
-
- /**
- * @param string $key
- * @param array $data
- */
- public function setSessionData( $key, $data ) {
- $this->session[$key] = $data;
- }
-
- /**
- * @return array|mixed|null
- */
- public function getSessionArray() {
- return $this->session;
- }
-
- /**
- * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
- * @return string
- */
- public function getRawQueryString() {
- return '';
- }
-
- /**
- * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
- * @return string
- */
- public function getRawPostString() {
- return '';
- }
-
- /**
- * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
- * @return string
- */
- public function getRawInput() {
- return '';
- }
-
- /**
- * @param array $extWhitelist
- * @return bool
- */
- public function checkUrlExtension( $extWhitelist = array() ) {
- return true;
- }
-
- /**
- * @return string
- */
- protected function getRawIP() {
- return '127.0.0.1';
- }
-}
-
-/**
- * Similar to FauxRequest, but only fakes URL parameters and method
- * (POST or GET) and use the base request for the remaining stuff
- * (cookies, session and headers).
- *
- * @ingroup HTTP
- * @since 1.19
- */
-class DerivativeRequest extends FauxRequest {
- private $base;
-
- /**
- * @param WebRequest $base
- * @param array $data Array of *non*-urlencoded key => value pairs, the
- * fake GET/POST values
- * @param bool $wasPosted Whether to treat the data as POST
- */
- public function __construct( WebRequest $base, $data, $wasPosted = false ) {
- $this->base = $base;
- parent::__construct( $data, $wasPosted );
- }
-
- public function getCookie( $key, $prefix = null, $default = null ) {
- return $this->base->getCookie( $key, $prefix, $default );
- }
-
- public function checkSessionCookie() {
- return $this->base->checkSessionCookie();
- }
-
- public function getHeader( $name, $flags = 0 ) {
- return $this->base->getHeader( $name, $flags );
- }
-
- public function getAllHeaders() {
- return $this->base->getAllHeaders();
- }
-
- public function getSessionData( $key ) {
- return $this->base->getSessionData( $key );
- }
-
- public function setSessionData( $key, $data ) {
- $this->base->setSessionData( $key, $data );
- }
-
- public function getAcceptLang() {
- return $this->base->getAcceptLang();
- }
-
- public function getIP() {
- return $this->base->getIP();
- }
-
- public function getProtocol() {
- return $this->base->getProtocol();
- }
-
- public function getElapsedTime() {
- return $this->base->getElapsedTime();
- }
-}
$this->addWhereIf( 'page_is_redirect = 1', isset( $show['redirect'] ) );
if ( isset( $show['unpatrolled'] ) ) {
- // See ChangesList:isUnpatrolled
+ // See ChangesList::isUnpatrolled
if ( $user->useRCPatrol() ) {
$this->addWhere( 'rc_patrolled = 0' );
} elseif ( $user->useNPPatrol() ) {
}
}
- /**
- * Check whether to enable recent changes patrol features
- *
- * @deprecated since 1.22
- * @return bool
- */
- public static function usePatrol() {
- global $wgUser;
-
- wfDeprecated( __METHOD__, '1.22' );
-
- return $wgUser->useRCPatrol();
- }
-
/**
* Returns the string which indicates the number of watching users
* @param int $count Number of user watching a page
/** @var TransactionProfiler */
protected $trxProfiler;
- /**
- * A string describing the current software version, and possibly
- * other details in a user-friendly way. Will be listed on Special:Version, etc.
- * Use getServerVersion() to get machine-friendly information.
- *
- * @return string Version information from the database server
- */
public function getServerInfo() {
return $this->getServerVersion();
}
return wfSetBit( $this->mFlags, DBO_DEBUG, $debug );
}
- /**
- * Turns buffering of SQL result sets on (true) or off (false). Default is
- * "on".
- *
- * Unbuffered queries are very troublesome in MySQL:
- *
- * - If another query is executed while the first query is being read
- * out, the first query is killed. This means you can't call normal
- * MediaWiki functions while you are reading an unbuffered query result
- * from a normal wfGetDB() connection.
- *
- * - Unbuffered queries cause the MySQL server to use large amounts of
- * memory and to hold broad locks which block other queries.
- *
- * If you want to limit client-side memory, it's almost always better to
- * split up queries into batches using a LIMIT clause than to switch off
- * buffering.
- *
- * @param null|bool $buffer
- * @return null|bool The previous value of the flag
- */
public function bufferResults( $buffer = null ) {
if ( is_null( $buffer ) ) {
return !(bool)( $this->mFlags & DBO_NOBUFFER );
return wfSetBit( $this->mFlags, DBO_IGNORE, $ignoreErrors );
}
- /**
- * Gets the current transaction level.
- *
- * Historically, transactions were allowed to be "nested". This is no
- * longer supported, so this function really only returns a boolean.
- *
- * @return int The previous value
- */
public function trxLevel() {
return $this->mTrxLevel;
}
- /**
- * Get the UNIX timestamp of the time that the transaction was established
- *
- * This can be used to reason about the staleness of SELECT data
- * in REPEATABLE-READ transaction isolation level.
- *
- * @return float|null Returns null if there is not active transaction
- * @since 1.25
- */
public function trxTimestamp() {
return $this->mTrxLevel ? $this->mTrxTimestamp : null;
}
- /**
- * Get/set the table prefix.
- * @param string $prefix The table prefix to set, or omitted to leave it unchanged.
- * @return string The previous table prefix.
- */
public function tablePrefix( $prefix = null ) {
return wfSetVar( $this->mTablePrefix, $prefix );
}
- /**
- * Get/set the db schema.
- * @param string $schema The database schema to set, or omitted to leave it unchanged.
- * @return string The previous db schema.
- */
public function dbSchema( $schema = null ) {
return wfSetVar( $this->mSchema, $schema );
}
$this->fileHandle = $fh;
}
- /**
- * Get properties passed down from the server info array of the load
- * balancer.
- *
- * @param string $name The entry of the info array to get, or null to get the
- * whole array
- *
- * @return array|mixed|null
- */
public function getLBInfo( $name = null ) {
if ( is_null( $name ) ) {
return $this->mLBInfo;
}
}
- /**
- * Set the LB info array, or a member of it. If called with one parameter,
- * the LB info array is set to that parameter. If it is called with two
- * parameters, the member with the given name is set to the given value.
- *
- * @param string $name
- * @param array $value
- */
public function setLBInfo( $name, $value = null ) {
if ( is_null( $value ) ) {
$this->mLBInfo = $name;
return false;
}
- /**
- * Returns true if this database does an implicit sort when doing GROUP BY
- *
- * @return bool
- */
public function implicitGroupby() {
return true;
}
- /**
- * Returns true if this database does an implicit order by when the column has an index
- * For example: SELECT page_title FROM page LIMIT 1
- *
- * @return bool
- */
public function implicitOrderby() {
return true;
}
return false;
}
- /**
- * Return the last query that went through DatabaseBase::query()
- * @return string
- */
public function lastQuery() {
return $this->mLastQuery;
}
- /**
- * Returns true if the connection may have been used for write queries.
- * Should return true if unsure.
- *
- * @return bool
- */
public function doneWrites() {
return (bool)$this->mDoneWrites;
}
- /**
- * Returns the last time the connection may have been used for write queries.
- * Should return a timestamp if unsure.
- *
- * @return int|float UNIX timestamp or false
- * @since 1.24
- */
public function lastDoneWrites() {
return $this->mDoneWrites ?: false;
}
- /**
- * @return bool Whether there is a transaction open with possible write queries
- * @since 1.27
- */
public function writesPending() {
return $this->mTrxLevel && $this->mTrxDoneWrites;
}
- /**
- * Returns true if there is a transaction open with possible write
- * queries or transaction pre-commit/idle callbacks waiting on it to finish.
- *
- * @return bool
- */
public function writesOrCallbacksPending() {
return $this->mTrxLevel && (
$this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
);
}
- /**
- * Get the time spend running write queries for this
- *
- * High times could be due to scanning, updates, locking, and such
- *
- * @return float|bool Returns false if not transaction is active
- * @since 1.26
- */
public function pendingWriteQueryDuration() {
return $this->mTrxLevel ? $this->mTrxWriteDuration : false;
}
- /**
- * Is a connection to the database open?
- * @return bool
- */
public function isOpen() {
return $this->mOpened;
}
- /**
- * Set a flag for this connection
- *
- * @param int $flag DBO_* constants from Defines.php:
- * - DBO_DEBUG: output some debug info (same as debug())
- * - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
- * - DBO_TRX: automatically start transactions
- * - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
- * and removes it in command line mode
- * - DBO_PERSISTENT: use persistant database connection
- */
public function setFlag( $flag ) {
$this->mFlags |= $flag;
}
- /**
- * Clear a flag for this connection
- *
- * @param int $flag DBO_* constants from Defines.php:
- * - DBO_DEBUG: output some debug info (same as debug())
- * - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
- * - DBO_TRX: automatically start transactions
- * - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
- * and removes it in command line mode
- * - DBO_PERSISTENT: use persistant database connection
- */
public function clearFlag( $flag ) {
$this->mFlags &= ~$flag;
}
- /**
- * Returns a boolean whether the flag $flag is set for this connection
- *
- * @param int $flag DBO_* constants from Defines.php:
- * - DBO_DEBUG: output some debug info (same as debug())
- * - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
- * - DBO_TRX: automatically start transactions
- * - DBO_PERSISTENT: use persistant database connection
- * @return bool
- */
public function getFlag( $flag ) {
return !!( $this->mFlags & $flag );
}
- /**
- * General read-only accessor
- *
- * @param string $name
- * @return string
- */
public function getProperty( $name ) {
return $this->$name;
}
- /**
- * @return string
- */
public function getWikiID() {
if ( $this->mTablePrefix ) {
return "{$this->mDBname}-{$this->mTablePrefix}";
);
}
- /**
- * Closes a database connection.
- * if it is open : commits any open transactions
- *
- * @throws MWException
- * @return bool Operation success. true if already closed.
- */
public function close() {
if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
throw new MWException( "Transaction idle callbacks still pending." );
*/
abstract protected function closeConnection();
- /**
- * @param string $error Fallback error message, used if none is given by DB
- * @throws DBConnectionError
- */
function reportConnectionError( $error = 'Unknown error' ) {
$myError = $this->lastError();
if ( $myError ) {
return !in_array( $verb, array( 'BEGIN', 'COMMIT', 'ROLLBACK', 'SHOW', 'SET' ) );
}
- /**
- * Run an SQL query and return the result. Normally throws a DBQueryError
- * on failure. If errors are ignored, returns false instead.
- *
- * In new code, the query wrappers select(), insert(), update(), delete(),
- * etc. should be used where possible, since they give much better DBMS
- * independence and automatically quote or validate user input in a variety
- * of contexts. This function is generally only useful for queries which are
- * explicitly DBMS-dependent and are unsupported by the query wrappers, such
- * as CREATE TABLE.
- *
- * However, the query wrappers themselves should call this function.
- *
- * @param string $sql SQL query
- * @param string $fname Name of the calling function, for profiling/SHOW PROCESSLIST
- * comment (you can use __METHOD__ or add some extra info)
- * @param bool $tempIgnore Whether to avoid throwing an exception on errors...
- * maybe best to catch the exception instead?
- * @throws MWException
- * @return bool|ResultWrapper True for a successful write query, ResultWrapper object
- * for a successful read query, or false on failure if $tempIgnore set
- */
public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
global $wgUser;
return $res;
}
- /**
- * Report a query error. Log the error, and if neither the object ignore
- * flag nor the $tempIgnore flag is set, throw a DBQueryError.
- *
- * @param string $error
- * @param int $errno
- * @param string $sql
- * @param string $fname
- * @param bool $tempIgnore
- * @throws DBQueryError
- */
public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
if ( $this->ignoreErrors() || $tempIgnore ) {
wfDebug( "SQL ERROR (ignored): $error\n" );
}
}
- /**
- * Free a result object returned by query() or select(). It's usually not
- * necessary to call this, just use unset() or let the variable holding
- * the result object go out of scope.
- *
- * @param mixed $res A SQL result
- */
public function freeResult( $res ) {
}
- /**
- * A SELECT wrapper which returns a single field from a single result row.
- *
- * Usually throws a DBQueryError on failure. If errors are explicitly
- * ignored, returns false on failure.
- *
- * If no result rows are returned from the query, false is returned.
- *
- * @param string|array $table Table name. See DatabaseBase::select() for details.
- * @param string $var The field name to select. This must be a valid SQL
- * fragment: do not use unvalidated user input.
- * @param string|array $cond The condition array. See DatabaseBase::select() for details.
- * @param string $fname The function name of the caller.
- * @param string|array $options The query options. See DatabaseBase::select() for details.
- *
- * @return bool|mixed The value from the field, or false on failure.
- * @throws DBUnexpectedError
- */
public function selectField(
$table, $var, $cond = '', $fname = __METHOD__, $options = array()
) {
}
}
- /**
- * A SELECT wrapper which returns a list of single field values from result rows.
- *
- * Usually throws a DBQueryError on failure. If errors are explicitly
- * ignored, returns false on failure.
- *
- * If no result rows are returned from the query, false is returned.
- *
- * @param string|array $table Table name. See DatabaseBase::select() for details.
- * @param string $var The field name to select. This must be a valid SQL
- * fragment: do not use unvalidated user input.
- * @param string|array $cond The condition array. See DatabaseBase::select() for details.
- * @param string $fname The function name of the caller.
- * @param string|array $options The query options. See DatabaseBase::select() for details.
- * @param string|array $join_conds The join conditions. See DatabaseBase::select() for details.
- *
- * @return bool|array The values from the field, or false on failure
- * @throws DBUnexpectedError
- * @since 1.25
- */
public function selectFieldValues(
$table, $var, $cond = '', $fname = __METHOD__, $options = array(), $join_conds = array()
) {
return '';
}
- /**
- * Execute a SELECT query constructed using the various parameters provided.
- * See below for full details of the parameters.
- *
- * @param string|array $table Table name
- * @param string|array $vars Field names
- * @param string|array $conds Conditions
- * @param string $fname Caller function name
- * @param array $options Query options
- * @param array $join_conds Join conditions
- *
- *
- * @param string|array $table
- *
- * May be either an array of table names, or a single string holding a table
- * name. If an array is given, table aliases can be specified, for example:
- *
- * array( 'a' => 'user' )
- *
- * This includes the user table in the query, with the alias "a" available
- * for use in field names (e.g. a.user_name).
- *
- * All of the table names given here are automatically run through
- * DatabaseBase::tableName(), which causes the table prefix (if any) to be
- * added, and various other table name mappings to be performed.
- *
- *
- * @param string|array $vars
- *
- * May be either a field name or an array of field names. The field names
- * can be complete fragments of SQL, for direct inclusion into the SELECT
- * query. If an array is given, field aliases can be specified, for example:
- *
- * array( 'maxrev' => 'MAX(rev_id)' )
- *
- * This includes an expression with the alias "maxrev" in the query.
- *
- * If an expression is given, care must be taken to ensure that it is
- * DBMS-independent.
- *
- *
- * @param string|array $conds
- *
- * May be either a string containing a single condition, or an array of
- * conditions. If an array is given, the conditions constructed from each
- * element are combined with AND.
- *
- * Array elements may take one of two forms:
- *
- * - Elements with a numeric key are interpreted as raw SQL fragments.
- * - Elements with a string key are interpreted as equality conditions,
- * where the key is the field name.
- * - If the value of such an array element is a scalar (such as a
- * string), it will be treated as data and thus quoted appropriately.
- * If it is null, an IS NULL clause will be added.
- * - If the value is an array, an IN (...) clause will be constructed
- * from its non-null elements, and an IS NULL clause will be added
- * if null is present, such that the field may match any of the
- * elements in the array. The non-null elements will be quoted.
- *
- * Note that expressions are often DBMS-dependent in their syntax.
- * DBMS-independent wrappers are provided for constructing several types of
- * expression commonly used in condition queries. See:
- * - DatabaseBase::buildLike()
- * - DatabaseBase::conditional()
- *
- *
- * @param string|array $options
- *
- * Optional: Array of query options. Boolean options are specified by
- * including them in the array as a string value with a numeric key, for
- * example:
- *
- * array( 'FOR UPDATE' )
- *
- * The supported options are:
- *
- * - OFFSET: Skip this many rows at the start of the result set. OFFSET
- * with LIMIT can theoretically be used for paging through a result set,
- * but this is discouraged in MediaWiki for performance reasons.
- *
- * - LIMIT: Integer: return at most this many rows. The rows are sorted
- * and then the first rows are taken until the limit is reached. LIMIT
- * is applied to a result set after OFFSET.
- *
- * - FOR UPDATE: Boolean: lock the returned rows so that they can't be
- * changed until the next COMMIT.
- *
- * - DISTINCT: Boolean: return only unique result rows.
- *
- * - GROUP BY: May be either an SQL fragment string naming a field or
- * expression to group by, or an array of such SQL fragments.
- *
- * - HAVING: May be either an string containing a HAVING clause or an array of
- * conditions building the HAVING clause. If an array is given, the conditions
- * constructed from each element are combined with AND.
- *
- * - ORDER BY: May be either an SQL fragment giving a field name or
- * expression to order by, or an array of such SQL fragments.
- *
- * - USE INDEX: This may be either a string giving the index name to use
- * for the query, or an array. If it is an associative array, each key
- * gives the table name (or alias), each value gives the index name to
- * use for that table. All strings are SQL fragments and so should be
- * validated by the caller.
- *
- * - EXPLAIN: In MySQL, this causes an EXPLAIN SELECT query to be run,
- * instead of SELECT.
- *
- * And also the following boolean MySQL extensions, see the MySQL manual
- * for documentation:
- *
- * - LOCK IN SHARE MODE
- * - STRAIGHT_JOIN
- * - HIGH_PRIORITY
- * - SQL_BIG_RESULT
- * - SQL_BUFFER_RESULT
- * - SQL_SMALL_RESULT
- * - SQL_CALC_FOUND_ROWS
- * - SQL_CACHE
- * - SQL_NO_CACHE
- *
- *
- * @param string|array $join_conds
- *
- * Optional associative array of table-specific join conditions. In the
- * most common case, this is unnecessary, since the join condition can be
- * in $conds. However, it is useful for doing a LEFT JOIN.
- *
- * The key of the array contains the table name or alias. The value is an
- * array with two elements, numbered 0 and 1. The first gives the type of
- * join, the second is an SQL fragment giving the join condition for that
- * table. For example:
- *
- * array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
- *
- * @return ResultWrapper|bool If the query returned no rows, a ResultWrapper
- * with no rows in it will be returned. If there was a query error, a
- * DBQueryError exception will be thrown, except if the "ignore errors"
- * option was set, in which case false will be returned.
- */
public function select( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array() ) {
$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
return $this->query( $sql, $fname );
}
- /**
- * The equivalent of DatabaseBase::select() except that the constructed SQL
- * is returned, instead of being immediately executed. This can be useful for
- * doing UNION queries, where the SQL text of each query is needed. In general,
- * however, callers outside of Database classes should just use select().
- *
- * @param string|array $table Table name
- * @param string|array $vars Field names
- * @param string|array $conds Conditions
- * @param string $fname Caller function name
- * @param string|array $options Query options
- * @param string|array $join_conds Join conditions
- *
- * @return string SQL query string.
- * @see DatabaseBase::select()
- */
public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
$options = array(), $join_conds = array()
) {
return $sql;
}
- /**
- * Single row SELECT wrapper. Equivalent to DatabaseBase::select(), except
- * that a single row object is returned. If the query returns no rows,
- * false is returned.
- *
- * @param string|array $table Table name
- * @param string|array $vars Field names
- * @param array $conds Conditions
- * @param string $fname Caller function name
- * @param string|array $options Query options
- * @param array|string $join_conds Join conditions
- *
- * @return stdClass|bool
- */
public function selectRow( $table, $vars, $conds, $fname = __METHOD__,
$options = array(), $join_conds = array()
) {
return $obj;
}
- /**
- * Estimate the number of rows in dataset
- *
- * MySQL allows you to estimate the number of rows that would be returned
- * by a SELECT query, using EXPLAIN SELECT. The estimate is provided using
- * index cardinality statistics, and is notoriously inaccurate, especially
- * when large numbers of rows have recently been added or deleted.
- *
- * For DBMSs that don't support fast result size estimation, this function
- * will actually perform the SELECT COUNT(*).
- *
- * Takes the same arguments as DatabaseBase::select().
- *
- * @param string $table Table name
- * @param string $vars Unused
- * @param array|string $conds Filters on the table
- * @param string $fname Function name for profiling
- * @param array $options Options for select
- * @return int Row count
- */
public function estimateRowCount(
$table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
) {
return $rows;
}
- /**
- * Get the number of rows in dataset
- *
- * This is useful when trying to do COUNT(*) but with a LIMIT for performance.
- *
- * Takes the same arguments as DatabaseBase::select().
- *
- * @since 1.27 Added $join_conds parameter
- *
- * @param array|string $tables Table names
- * @param string $vars Unused
- * @param array|string $conds Filters on the table
- * @param string $fname Function name for profiling
- * @param array $options Options for select
- * @param array $join_conds Join conditions (since 1.27)
- * @return int Row count
- */
public function selectRowCount(
$tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
) {
return $sql;
}
- /**
- * Determines whether a field exists in a table
- *
- * @param string $table Table name
- * @param string $field Filed to check on that table
- * @param string $fname Calling function name (optional)
- * @return bool Whether $table has filed $field
- */
public function fieldExists( $table, $field, $fname = __METHOD__ ) {
$info = $this->fieldInfo( $table, $field );
return (bool)$info;
}
- /**
- * Determines whether an index exists
- * Usually throws a DBQueryError on failure
- * If errors are explicitly ignored, returns NULL on failure
- *
- * @param string $table
- * @param string $index
- * @param string $fname
- * @return bool|null
- */
public function indexExists( $table, $index, $fname = __METHOD__ ) {
if ( !$this->tableExists( $table ) ) {
return null;
}
}
- /**
- * Query whether a given table exists
- *
- * @param string $table
- * @param string $fname
- * @return bool
- */
public function tableExists( $table, $fname = __METHOD__ ) {
$table = $this->tableName( $table );
$old = $this->ignoreErrors( true );
return (bool)$res;
}
- /**
- * Determines if a given index is unique
- *
- * @param string $table
- * @param string $index
- *
- * @return bool
- */
public function indexUnique( $table, $index ) {
$indexInfo = $this->indexInfo( $table, $index );
return implode( ' ', $options );
}
- /**
- * INSERT wrapper, inserts an array into a table.
- *
- * $a may be either:
- *
- * - A single associative array. The array keys are the field names, and
- * the values are the values to insert. The values are treated as data
- * and will be quoted appropriately. If NULL is inserted, this will be
- * converted to a database NULL.
- * - An array with numeric keys, holding a list of associative arrays.
- * This causes a multi-row INSERT on DBMSs that support it. The keys in
- * each subarray must be identical to each other, and in the same order.
- *
- * $options is an array of options, with boolean options encoded as values
- * with numeric keys, in the same style as $options in
- * DatabaseBase::select(). Supported options are:
- *
- * - IGNORE: Boolean: if present, duplicate key errors are ignored, and
- * any rows which cause duplicate key errors are not inserted. It's
- * possible to determine how many rows were successfully inserted using
- * DatabaseBase::affectedRows().
- *
- * @param string $table Table name. This will be passed through
- * DatabaseBase::tableName().
- * @param array $a Array of rows to insert
- * @param string $fname Calling function name (use __METHOD__) for logs/profiling
- * @param array $options Array of options
- *
- * @throws DBQueryError Usually throws a DBQueryError on failure. If errors are explicitly ignored,
- * returns success.
- *
- * @return bool
- */
public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
# No rows to insert, easy just return now
if ( !count( $a ) ) {
return implode( ' ', $opts );
}
- /**
- * UPDATE wrapper. Takes a condition array and a SET array.
- *
- * @param string $table Name of the table to UPDATE. This will be passed through
- * DatabaseBase::tableName().
- * @param array $values An array of values to SET. For each array element,
- * the key gives the field name, and the value gives the data to set
- * that field to. The data will be quoted by DatabaseBase::addQuotes().
- * @param array $conds An array of conditions (WHERE). See
- * DatabaseBase::select() for the details of the format of condition
- * arrays. Use '*' to update all rows.
- * @param string $fname The function name of the caller (from __METHOD__),
- * for logging and profiling.
- * @param array $options An array of UPDATE options, can be:
- * - IGNORE: Ignore unique key conflicts
- * - LOW_PRIORITY: MySQL-specific, see MySQL manual.
- * @return bool
- */
function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
$table = $this->tableName( $table );
$opts = $this->makeUpdateOptions( $options );
return $this->query( $sql, $fname );
}
- /**
- * Makes an encoded list of strings from an array
- *
- * @param array $a Containing the data
- * @param int $mode Constant
- * - LIST_COMMA: Comma separated, no field names
- * - LIST_AND: ANDed WHERE clause (without the WHERE). See the
- * documentation for $conds in DatabaseBase::select().
- * - LIST_OR: ORed WHERE clause (without the WHERE)
- * - LIST_SET: Comma separated with field names, like a SET clause
- * - LIST_NAMES: Comma separated field names
- * @throws MWException|DBUnexpectedError
- * @return string
- */
public function makeList( $a, $mode = LIST_COMMA ) {
if ( !is_array( $a ) ) {
throw new DBUnexpectedError( $this, 'DatabaseBase::makeList called with incorrect parameters' );
return $list;
}
- /**
- * Build a partial where clause from a 2-d array such as used for LinkBatch.
- * The keys on each level may be either integers or strings.
- *
- * @param array $data Organized as 2-d
- * array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
- * @param string $baseKey Field name to match the base-level keys to (eg 'pl_namespace')
- * @param string $subKey Field name to match the sub-level keys to (eg 'pl_title')
- * @return string|bool SQL fragment, or false if no items in array
- */
public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
$conds = array();
return $valuename;
}
- /**
- * @param string $field
- * @return string
- */
public function bitNot( $field ) {
return "(~$field)";
}
- /**
- * @param string $fieldLeft
- * @param string $fieldRight
- * @return string
- */
public function bitAnd( $fieldLeft, $fieldRight ) {
return "($fieldLeft & $fieldRight)";
}
- /**
- * @param string $fieldLeft
- * @param string $fieldRight
- * @return string
- */
public function bitOr( $fieldLeft, $fieldRight ) {
return "($fieldLeft | $fieldRight)";
}
- /**
- * Build a concatenation list to feed into a SQL query
- * @param array $stringList List of raw SQL expressions; caller is
- * responsible for any quoting
- * @return string
- */
public function buildConcat( $stringList ) {
return 'CONCAT(' . implode( ',', $stringList ) . ')';
}
- /**
- * Build a GROUP_CONCAT or equivalent statement for a query.
- *
- * This is useful for combining a field for several rows into a single string.
- * NULL values will not appear in the output, duplicated values will appear,
- * and the resulting delimiter-separated values have no defined sort order.
- * Code using the results may need to use the PHP unique() or sort() methods.
- *
- * @param string $delim Glue to bind the results together
- * @param string|array $table Table name
- * @param string $field Field name
- * @param string|array $conds Conditions
- * @param string|array $join_conds Join conditions
- * @return string SQL text
- * @since 1.23
- */
public function buildGroupConcatField(
$delim, $table, $field, $conds = '', $join_conds = array()
) {
return '(' . $this->selectSQLText( $table, $fld, $conds, null, array(), $join_conds ) . ')';
}
- /**
- * Change the current database
- *
- * @todo Explain what exactly will fail if this is not overridden.
- *
- * @param string $db
- *
- * @return bool Success or failure
- */
public function selectDB( $db ) {
# Stub. Shouldn't cause serious problems if it's not overridden, but
# if your database engine supports a concept similar to MySQL's
return true;
}
- /**
- * Get the current DB name
- * @return string
- */
public function getDBname() {
return $this->mDBname;
}
- /**
- * Get the server hostname or IP address
- * @return string
- */
public function getServer() {
return $this->mServer;
}
}
}
- /**
- * Adds quotes and backslashes.
- *
- * @param string|Blob $s
- * @return string
- */
public function addQuotes( $s ) {
if ( $s instanceof Blob ) {
$s = $s->fetch();
return addcslashes( $s, '\%_' );
}
- /**
- * LIKE statement wrapper, receives a variable-length argument list with
- * parts of pattern to match containing either string literals that will be
- * escaped or tokens returned by anyChar() or anyString(). Alternatively,
- * the function could be provided with an array of aforementioned
- * parameters.
- *
- * Example: $dbr->buildLike( 'My_page_title/', $dbr->anyString() ) returns
- * a LIKE clause that searches for subpages of 'My page title'.
- * Alternatively:
- * $pattern = array( 'My_page_title/', $dbr->anyString() );
- * $query .= $dbr->buildLike( $pattern );
- *
- * @since 1.16
- * @return string Fully built LIKE statement
- */
public function buildLike() {
$params = func_get_args();
return " LIKE {$this->addQuotes( $s )} ";
}
- /**
- * Returns a token for buildLike() that denotes a '_' to be used in a LIKE query
- *
- * @return LikeMatch
- */
public function anyChar() {
return new LikeMatch( '_' );
}
- /**
- * Returns a token for buildLike() that denotes a '%' to be used in a LIKE query
- *
- * @return LikeMatch
- */
public function anyString() {
return new LikeMatch( '%' );
}
- /**
- * Returns an appropriately quoted sequence value for inserting a new row.
- * MySQL has autoincrement fields, so this is just NULL. But the PostgreSQL
- * subclass will return an integer, and save the value for insertId()
- *
- * Any implementation of this function should *not* involve reusing
- * sequence numbers created for rolled-back transactions.
- * See http://bugs.mysql.com/bug.php?id=30767 for details.
- * @param string $seqName
- * @return null|int
- */
public function nextSequenceValue( $seqName ) {
return null;
}
return '';
}
- /**
- * REPLACE query wrapper.
- *
- * REPLACE is a very handy MySQL extension, which functions like an INSERT
- * except that when there is a duplicate key error, the old row is deleted
- * and the new row is inserted in its place.
- *
- * We simulate this with standard SQL with a DELETE followed by INSERT. To
- * perform the delete, we need to know what the unique indexes are so that
- * we know how to find the conflicting rows.
- *
- * It may be more efficient to leave off unique indexes which are unlikely
- * to collide. However if you do this, you run the risk of encountering
- * errors which wouldn't have occurred in MySQL.
- *
- * @param string $table The table to replace the row(s) in.
- * @param array $uniqueIndexes Is an array of indexes. Each element may be either
- * a field name or an array of field names
- * @param array $rows Can be either a single row to insert, or multiple rows,
- * in the same format as for DatabaseBase::insert()
- * @param string $fname Calling function name (use __METHOD__) for logs/profiling
- */
public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
$quotedTable = $this->tableName( $table );
return $this->query( $sql, $fname );
}
- /**
- * INSERT ON DUPLICATE KEY UPDATE wrapper, upserts an array into a table.
- *
- * This updates any conflicting rows (according to the unique indexes) using
- * the provided SET clause and inserts any remaining (non-conflicted) rows.
- *
- * $rows may be either:
- * - A single associative array. The array keys are the field names, and
- * the values are the values to insert. The values are treated as data
- * and will be quoted appropriately. If NULL is inserted, this will be
- * converted to a database NULL.
- * - An array with numeric keys, holding a list of associative arrays.
- * This causes a multi-row INSERT on DBMSs that support it. The keys in
- * each subarray must be identical to each other, and in the same order.
- *
- * It may be more efficient to leave off unique indexes which are unlikely
- * to collide. However if you do this, you run the risk of encountering
- * errors which wouldn't have occurred in MySQL.
- *
- * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
- * returns success.
- *
- * @since 1.22
- *
- * @param string $table Table name. This will be passed through DatabaseBase::tableName().
- * @param array $rows A single row or list of rows to insert
- * @param array $uniqueIndexes List of single field names or field name tuples
- * @param array $set An array of values to SET. For each array element, the
- * key gives the field name, and the value gives the data to set that
- * field to. The data will be quoted by DatabaseBase::addQuotes().
- * @param string $fname Calling function name (use __METHOD__) for logs/profiling
- * @throws Exception
- * @return bool
- */
public function upsert( $table, array $rows, array $uniqueIndexes, array $set,
$fname = __METHOD__
) {
return $ok;
}
- /**
- * DELETE where the condition is a join.
- *
- * MySQL overrides this to use a multi-table DELETE syntax, in other databases
- * we use sub-selects
- *
- * For safety, an empty $conds will not delete everything. If you want to
- * delete all rows where the join condition matches, set $conds='*'.
- *
- * DO NOT put the join condition in $conds.
- *
- * @param string $delTable The table to delete from.
- * @param string $joinTable The other table.
- * @param string $delVar The variable to join on, in the first table.
- * @param string $joinVar The variable to join on, in the second table.
- * @param array $conds Condition array of field names mapped to variables,
- * ANDed together in the WHERE clause
- * @param string $fname Calling function name (use __METHOD__) for logs/profiling
- * @throws DBUnexpectedError
- */
public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
$fname = __METHOD__
) {
return '';
}
- /**
- * DELETE query wrapper.
- *
- * @param array $table Table name
- * @param string|array $conds Array of conditions. See $conds in DatabaseBase::select()
- * for the format. Use $conds == "*" to delete all rows
- * @param string $fname Name of the calling function
- * @throws DBUnexpectedError
- * @return bool|ResultWrapper
- */
public function delete( $table, $conds, $fname = __METHOD__ ) {
if ( !$conds ) {
throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
return $this->query( $sql, $fname );
}
- /**
- * INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
- * into another table.
- *
- * @param string $destTable The table name to insert into
- * @param string|array $srcTable May be either a table name, or an array of table names
- * to include in a join.
- *
- * @param array $varMap Must be an associative array of the form
- * array( 'dest1' => 'source1', ...). Source items may be literals
- * rather than field names, but strings should be quoted with
- * DatabaseBase::addQuotes()
- *
- * @param array $conds Condition array. See $conds in DatabaseBase::select() for
- * the details of the format of condition arrays. May be "*" to copy the
- * whole table.
- *
- * @param string $fname The function name of the caller, from __METHOD__
- *
- * @param array $insertOptions Options for the INSERT part of the query, see
- * DatabaseBase::insert() for details.
- * @param array $selectOptions Options for the SELECT part of the query, see
- * DatabaseBase::select() for details.
- *
- * @return ResultWrapper
- */
public function insertSelect( $destTable, $srcTable, $varMap, $conds,
$fname = __METHOD__,
$insertOptions = array(), $selectOptions = array()
. "{$limit} ";
}
- /**
- * Returns true if current database backend supports ORDER BY or LIMIT for separate subqueries
- * within the UNION construct.
- * @return bool
- */
public function unionSupportsOrderAndLimit() {
return true; // True for almost every DB supported
}
- /**
- * Construct a UNION query
- * This is used for providing overload point for other DB abstractions
- * not compatible with the MySQL syntax.
- * @param array $sqls SQL statements to combine
- * @param bool $all Use UNION ALL
- * @return string SQL fragment
- */
public function unionQueries( $sqls, $all ) {
$glue = $all ? ') UNION ALL (' : ') UNION (';
return '(' . implode( $glue, $sqls ) . ')';
}
- /**
- * Returns an SQL expression for a simple conditional. This doesn't need
- * to be overridden unless CASE isn't supported in your DBMS.
- *
- * @param string|array $cond SQL expression which will result in a boolean value
- * @param string $trueVal SQL expression to return if true
- * @param string $falseVal SQL expression to return if false
- * @return string SQL fragment
- */
public function conditional( $cond, $trueVal, $falseVal ) {
if ( is_array( $cond ) ) {
$cond = $this->makeList( $cond, LIST_AND );
return " (CASE WHEN $cond THEN $trueVal ELSE $falseVal END) ";
}
- /**
- * Returns a comand for str_replace function in SQL query.
- * Uses REPLACE() in MySQL
- *
- * @param string $orig Column to modify
- * @param string $old Column to seek
- * @param string $new Column to replace with
- *
- * @return string
- */
public function strreplace( $orig, $old, $new ) {
return "REPLACE({$orig}, {$old}, {$new})";
}
- /**
- * Determines how long the server has been up
- * STUB
- *
- * @return int
- */
public function getServerUptime() {
return 0;
}
- /**
- * Determines if the last failure was due to a deadlock
- * STUB
- *
- * @return bool
- */
public function wasDeadlock() {
return false;
}
- /**
- * Determines if the last failure was due to a lock timeout
- * STUB
- *
- * @return bool
- */
public function wasLockTimeout() {
return false;
}
- /**
- * Determines if the last query error was something that should be dealt
- * with by pinging the connection and reissuing the query.
- * STUB
- *
- * @return bool
- */
public function wasErrorReissuable() {
return false;
}
- /**
- * Determines if the last failure was due to the database being read-only.
- * STUB
- *
- * @return bool
- */
public function wasReadOnlyError() {
return false;
}
* Returns whatever the callback function returned on its successful,
* iteration, or false on error, for example if the retry limit was
* reached.
- *
* @return mixed
- * @throws DBQueryError
+ * @throws DBUnexpectedError
+ * @throws Exception
*/
public function deadlockLoop() {
$args = func_get_args();
$this->begin( __METHOD__ );
$retVal = null;
+ /** @var Exception $e */
$e = null;
do {
try {
}
}
- /**
- * Wait for the slave to catch up to a given master position.
- *
- * @param DBMasterPos $pos
- * @param int $timeout The maximum number of seconds to wait for
- * synchronisation
- * @return int Zero if the slave was past that position already,
- * greater than zero if we waited for some period of time, less than
- * zero if we timed out.
- */
public function masterPosWait( DBMasterPos $pos, $timeout ) {
# Real waits are implemented in the subclass.
return 0;
}
- /**
- * Get the replication position of this slave
- *
- * @return DBMasterPos|bool False if this is not a slave.
- */
public function getSlavePos() {
# Stub
return false;
}
- /**
- * Get the position of this master
- *
- * @return DBMasterPos|bool False if this is not a master
- */
public function getMasterPos() {
# Stub
return false;
}
- /**
- * Run an anonymous function as soon as there is no transaction pending.
- * If there is a transaction and it is rolled back, then the callback is cancelled.
- * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
- * Callbacks must commit any transactions that they begin.
- *
- * This is useful for updates to different systems or when separate transactions are needed.
- * For example, one might want to enqueue jobs into a system outside the database, but only
- * after the database is updated so that the jobs will see the data when they actually run.
- * It can also be used for updates that easily cause deadlocks if locks are held too long.
- *
- * @param callable $callback
- * @since 1.20
- */
final public function onTransactionIdle( $callback ) {
$this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() );
if ( !$this->mTrxLevel ) {
}
}
- /**
- * Run an anonymous function before the current transaction commits or now if there is none.
- * If there is a transaction and it is rolled back, then the callback is cancelled.
- * Callbacks must not start nor commit any transactions.
- *
- * This is useful for updates that easily cause deadlocks if locks are held too long
- * but where atomicity is strongly desired for these updates and some related updates.
- *
- * @param callable $callback
- * @since 1.22
- */
final public function onTransactionPreCommitOrIdle( $callback ) {
if ( $this->mTrxLevel ) {
$this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() );
}
}
- /**
- * Begin an atomic section of statements
- *
- * If a transaction has been started already, just keep track of the given
- * section name to make sure the transaction is not committed pre-maturely.
- * This function can be used in layers (with sub-sections), so use a stack
- * to keep track of the different atomic sections. If there is no transaction,
- * start one implicitly.
- *
- * The goal of this function is to create an atomic section of SQL queries
- * without having to start a new transaction if it already exists.
- *
- * Atomic sections are more strict than transactions. With transactions,
- * attempting to begin a new transaction when one is already running results
- * in MediaWiki issuing a brief warning and doing an implicit commit. All
- * atomic levels *must* be explicitly closed using DatabaseBase::endAtomic(),
- * and any database transactions cannot be began or committed until all atomic
- * levels are closed. There is no such thing as implicitly opening or closing
- * an atomic section.
- *
- * @since 1.23
- * @param string $fname
- * @throws DBError
- */
final public function startAtomic( $fname = __METHOD__ ) {
if ( !$this->mTrxLevel ) {
$this->begin( $fname );
$this->mTrxAtomicLevels[] = $fname;
}
- /**
- * Ends an atomic section of SQL statements
- *
- * Ends the next section of atomic SQL statements and commits the transaction
- * if necessary.
- *
- * @since 1.23
- * @see DatabaseBase::startAtomic
- * @param string $fname
- * @throws DBError
- */
final public function endAtomic( $fname = __METHOD__ ) {
if ( !$this->mTrxLevel ) {
throw new DBUnexpectedError( $this, 'No atomic transaction is open.' );
$this->endAtomic( $fname );
}
- /**
- * Begin a transaction. If a transaction is already in progress,
- * that transaction will be committed before the new transaction is started.
- *
- * Note that when the DBO_TRX flag is set (which is usually the case for web
- * requests, but not for maintenance scripts), any previous database query
- * will have started a transaction automatically.
- *
- * Nesting of transactions is not supported. Attempts to nest transactions
- * will cause a warning, unless the current transaction was started
- * automatically because of the DBO_TRX flag.
- *
- * @param string $fname
- * @throws DBError
- */
final public function begin( $fname = __METHOD__ ) {
if ( $this->mTrxLevel ) { // implicit commit
if ( $this->mTrxAtomicLevels ) {
$this->mTrxLevel = 1;
}
- /**
- * Commits a transaction previously started using begin().
- * If no transaction is in progress, a warning is issued.
- *
- * Nesting of transactions is not supported.
- *
- * @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.
- * @throws DBUnexpectedError
- */
final public function commit( $fname = __METHOD__, $flush = '' ) {
if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
// There are still atomic sections open. This cannot be ignored
}
}
- /**
- * Rollback a transaction previously started using begin().
- * If no transaction is in progress, a warning is issued.
- *
- * No-op on non-transactional databases.
- *
- * @param string $fname
- * @param string $flush Flush flag, set to 'flush' to disable warnings about
- * calling rollback 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.
- * @throws DBUnexpectedError
- * @since 1.23 Added $flush parameter
- */
final public function rollback( $fname = __METHOD__, $flush = '' ) {
if ( $flush !== 'flush' ) {
if ( !$this->mTrxLevel ) {
'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
}
- /**
- * List all tables on the database
- *
- * @param string $prefix Only show tables with this prefix, e.g. mw_
- * @param string $fname Calling function name
- * @throws MWException
- * @return array
- */
function listTables( $prefix = null, $fname = __METHOD__ ) {
throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
}
throw new MWException( 'DatabaseBase::isView is not implemented in descendant class' );
}
- /**
- * Convert a timestamp in one of the formats accepted by wfTimestamp()
- * to the format used for inserting into timestamp fields in this DBMS.
- *
- * The result is unquoted, and needs to be passed through addQuotes()
- * before it can be included in raw SQL.
- *
- * @param string|int $ts
- *
- * @return string
- */
public function timestamp( $ts = 0 ) {
return wfTimestamp( TS_MW, $ts );
}
- /**
- * Convert a timestamp in one of the formats accepted by wfTimestamp()
- * to the format used for inserting into timestamp fields in this DBMS. If
- * NULL is input, it is passed through, allowing NULL values to be inserted
- * into timestamp fields.
- *
- * The result is unquoted, and needs to be passed through addQuotes()
- * before it can be included in raw SQL.
- *
- * @param string|int $ts
- *
- * @return string
- */
public function timestampOrNull( $ts = null ) {
if ( is_null( $ts ) ) {
return null;
}
}
- /**
- * Ping the server and try to reconnect if it there is no connection
- *
- * @return bool Success or failure
- */
public function ping() {
# Stub. Not essential to override.
return true;
return 0;
}
- /**
- * Return the maximum number of items allowed in a list, or 0 for unlimited.
- *
- * @return int
- */
function maxListLen() {
return 0;
}
- /**
- * Some DBMSs have a special format for inserting into blob fields, they
- * don't allow simple quoted strings to be inserted. To insert into such
- * a field, pass the data through this function before passing it to
- * DatabaseBase::insert().
- *
- * @param string $b
- * @return string
- */
public function encodeBlob( $b ) {
return $b;
}
- /**
- * Some DBMSs return a special placeholder object representing blob fields
- * in result objects. Pass the object through this function to return the
- * original string.
- *
- * @param string|Blob $b
- * @return string
- */
public function decodeBlob( $b ) {
if ( $b instanceof Blob ) {
$b = $b->fetch();
return $b;
}
- /**
- * Override database's default behavior. $options include:
- * 'connTimeout' : Set the connection timeout value in seconds.
- * May be useful for very long batch queries such as
- * full-wiki dumps, where a single query reads out over
- * hours or days.
- *
- * @param array $options
- * @return void
- */
public function setSessionOptions( array $options ) {
}
}
}
- /**
- * Set variables to be used in sourceFile/sourceStream, in preference to the
- * ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
- * all. If it's set to false, $GLOBALS will be used.
- *
- * @param bool|array $vars Mapping variable name to value.
- */
public function setSchemaVars( $vars ) {
$this->mSchemaVars = $vars;
}
return array();
}
- /**
- * Check to see if a named lock is available (non-blocking)
- *
- * @param string $lockName Name of lock to poll
- * @param string $method Name of method calling us
- * @return bool
- * @since 1.20
- */
public function lockIsFree( $lockName, $method ) {
return true;
}
- /**
- * Acquire a named lock
- *
- * Named locks are not related to transactions
- *
- * @param string $lockName Name of lock to aquire
- * @param string $method Name of method calling us
- * @param int $timeout
- * @return bool
- */
public function lock( $lockName, $method, $timeout = 5 ) {
return true;
}
- /**
- * Release a lock
- *
- * Named locks are not related to transactions
- *
- * @param string $lockName Name of lock to release
- * @param string $method Name of method calling us
- *
- * @return int Returns 1 if the lock was released, 0 if the lock was not established
- * by this thread (in which case the lock is not released), and NULL if the named
- * lock did not exist
- */
public function unlock( $lockName, $method ) {
return true;
}
- /**
- * Check to see if a named lock used by lock() use blocking queues
- *
- * @return bool
- * @since 1.26
- */
public function namedLocksEnqueue() {
return false;
}
return 'SearchEngineDummy';
}
- /**
- * Find out when 'infinity' is. Most DBMSes support this. This is a special
- * keyword for timestamps in PostgreSQL, and works with CHAR(14) as well
- * because "i" sorts after all numbers.
- *
- * @return string
- */
public function getInfinity() {
return 'infinity';
}
- /**
- * Encode an expiry time into the DBMS dependent format
- *
- * @param string $expiry Timestamp for expiry, or the 'infinity' string
- * @return string
- */
public function encodeExpiry( $expiry ) {
return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
? $this->getInfinity()
: $this->timestamp( $expiry );
}
- /**
- * Decode an expiry time into a DBMS independent format
- *
- * @param string $expiry DB timestamp field value for expiry
- * @param int $format TS_* constant, defaults to TS_MW
- * @return string
- */
public function decodeExpiry( $expiry, $format = TS_MW ) {
return ( $expiry == '' || $expiry == 'infinity' || $expiry == $this->getInfinity() )
? 'infinity'
: wfTimestamp( $format, $expiry );
}
- /**
- * Allow or deny "big selects" for this session only. This is done by setting
- * the sql_big_selects session variable.
- *
- * This is a MySQL-specific feature.
- *
- * @param bool|string $value True for allow, false for deny, or "default" to
- * restore the initial value
- */
public function setBigSelects( $value = true ) {
// no-op
}
/**
* Like a Http:get request, but with custom User-Agent.
- * @see Http:get
+ * @see Http::get
* @param string $url
* @param string $timeout
* @param array $options
* click handling code in JavaScript. Use a HTMLSubmitField if you merely
* wish to add a submit button to a form.
*
+ * Additional recognized configuration parameters include:
+ * - flags: OOUI flags for the button, see OOUI\\FlaggedElement
+ * - buttonlabel-message: Message to use for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel' and 'buttonlabel-raw'.
+ * - buttonlabel: Text to display for the button display text, instead
+ * of the value from 'default'. Overrides 'buttonlabel-raw'.
+ * - buttonlabel-raw: HTMLto display for the button display text, instead
+ * of the value from 'default'.
+ *
+ * Note that the buttonlabel parameters are not supported on IE6 and IE7 due to
+ * bugs in those browsers. If detected, they will be served buttons using the
+ * value of 'default' as the button label.
+ *
* @since 1.22
*/
class HTMLButtonField extends HTMLFormField {
protected $buttonType = 'button';
+ protected $buttonLabel = null;
/** @var array $mFlags Flags to add to OOUI Button widget */
protected $mFlags = array();
if ( isset( $info['flags'] ) ) {
$this->mFlags = $info['flags'];
}
+
+ # Generate the label from a message, if possible
+ if ( isset( $info['buttonlabel-message'] ) ) {
+ $msgInfo = $info['buttonlabel-message'];
+
+ if ( is_array( $msgInfo ) ) {
+ $msg = array_shift( $msgInfo );
+ } else {
+ $msg = $msgInfo;
+ $msgInfo = array();
+ }
+
+ $this->buttonLabel = $this->msg( $msg, $msgInfo )->parse();
+ } elseif ( isset( $info['buttonlabel'] ) ) {
+ if ( $info['buttonlabel'] === ' ' ) {
+ // Apparently some things set   directly and in an odd format
+ $this->buttonLabel = ' ';
+ } else {
+ $this->buttonLabel = htmlspecialchars( $info['buttonlabel'] );
+ }
+ } elseif ( isset( $info['buttonlabel-raw'] ) ) {
+ $this->buttonLabel = $info['buttonlabel-raw'];
+ }
+
parent::__construct( $info );
}
$attr = array(
'class' => 'mw-htmlform-submit ' . $this->mClass . $flags,
'id' => $this->mID,
+ 'type' => $this->buttonType,
+ 'name' => $this->mName,
+ 'value' => $value,
) + $this->getAttributes( array( 'disabled', 'tabindex' ) );
- return Html::input( $this->mName, $value, $this->buttonType, $attr );
+ if ( $this->isBadIE() ) {
+ return Html::element( 'input', $attr );
+ } else {
+ return Html::rawElement( 'button', $attr, $this->buttonLabel ?: htmlspecialchars( $value ) );
+ }
}
/**
return new OOUI\ButtonInputWidget( array(
'name' => $this->mName,
'value' => $value,
- 'label' => $value,
+ 'label' => !$this->isBadIE() && $this->buttonLabel
+ ? new OOUI\HtmlSnippet( $this->buttonLabel )
+ : $value,
'type' => $this->buttonType,
'classes' => array( 'mw-htmlform-submit', $this->mClass ),
'id' => $this->mID,
'flags' => $this->mFlags,
+ 'useInputTag' => $this->isBadIE(),
) + $this->getAttributes( array( 'disabled', 'tabindex' ), array( 'tabindex' => 'tabIndex' ) ) );
}
public function validate( $value, $alldata ) {
return true;
}
+
+ /**
+ * IE<8 has bugs with <button>, so we'll need to avoid them.
+ * @return bool Whether the request is from a bad version of IE
+ */
+ private function isBadIE() {
+ $request = $this->mParent
+ ? $this->mParent->getRequest()
+ : RequestContext::getMain()->getRequest();
+ return preg_match( '/MSIE [1-7]\./i', $request->getHeader( 'User-Agent' ) );
+ }
}
}
/**
- * Set the introductory message, overwriting any existing message.
+ * Set the introductory message HTML, overwriting any existing message.
* @since 1.19
*
- * @param string $msg Complete text of message to display
+ * @param string $msg Complete HTML of message to display
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
}
/**
- * Add introductory text.
+ * Add HTML to introductory message.
*
- * @param string $msg Complete text of message to display
+ * @param string $msg Complete HTML of message to display
*
* @return HTMLForm $this for chaining calls (since 1.20)
*/
}
/**
- * Add header text, inside the form.
+ * Add HTML to the header, inside the form.
*
- * @param string $msg Complete text of message to display
+ * @param string $msg Additional HTML to display in header
* @param string|null $section The section to add the header to
*
* @return HTMLForm $this for chaining calls (since 1.20)
* Set header text, inside the form.
* @since 1.19
*
- * @param string $msg Complete text of message to display
+ * @param string $msg Complete HTML of header to display
* @param string|null $section The section to add the header to
*
* @return HTMLForm $this for chaining calls (since 1.20)
*
* @param string|null $section The section to get the header text for
* @since 1.26
- * @return string
+ * @return string HTML
*/
function getHeaderText( $section = null ) {
if ( is_null( $section ) ) {
/**
* Add a button to the form
*
- * @param string $name Field name.
- * @param string $value Field value
- * @param string $id DOM id for the button (default: null)
- * @param array $attribs
- *
+ * @since 1.27 takes an array as shown. Earlier versions accepted
+ * 'name', 'value', 'id', and 'attribs' as separate parameters in that
+ * order.
+ * @note Custom labels ('label', 'label-message', 'label-raw') are not
+ * supported for IE6 and IE7 due to bugs in those browsers. If detected,
+ * they will be served buttons using 'value' as the button label.
+ * @param array $data Data to define the button:
+ * - name: (string) Button name.
+ * - value: (string) Button value.
+ * - label-message: (string, optional) Button label message key to use
+ * instead of 'value'. Overrides 'label' and 'label-raw'.
+ * - label: (string, optional) Button label text to use instead of
+ * 'value'. Overrides 'label-raw'.
+ * - label-raw: (string, optional) Button label HTML to use instead of
+ * 'value'.
+ * - id: (string, optional) DOM id for the button.
+ * - attribs: (array, optional) Additional HTML attributes.
+ * - flags: (string|string[], optional) OOUI flags.
* @return HTMLForm $this for chaining calls (since 1.20)
*/
- public function addButton( $name, $value, $id = null, $attribs = null ) {
- $this->mButtons[] = compact( 'name', 'value', 'id', 'attribs' );
+ public function addButton( $data ) {
+ if ( !is_array( $data ) ) {
+ $args = func_get_args();
+ if ( count( $args ) < 2 || count( $args ) > 4 ) {
+ throw new InvalidArgumentException(
+ 'Incorrect number of arguments for deprecated calling style'
+ );
+ }
+ $data = array(
+ 'name' => $args[0],
+ 'value' => $args[1],
+ 'id' => isset( $args[2] ) ? $args[2] : null,
+ 'attribs' => isset( $args[3] ) ? $args[3] : null,
+ );
+ } else {
+ if ( !isset( $data['name'] ) ) {
+ throw new InvalidArgumentException( 'A name is required' );
+ }
+ if ( !isset( $data['value'] ) ) {
+ throw new InvalidArgumentException( 'A value is required' );
+ }
+ }
+ $this->mButtons[] = $data + array(
+ 'id' => null,
+ 'attribs' => null,
+ 'flags' => null,
+ );
return $this;
}
*
* @param bool|string|array|Status $submitResult Output from HTMLForm::trySubmit()
*
- * @return string
+ * @return string HTML
*/
function getHTML( $submitResult ) {
# For good measure (it is the default)
) . "\n";
}
+ // IE<8 has bugs with <button>, so we'll need to avoid them.
+ $isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
+
foreach ( $this->mButtons as $button ) {
$attrs = array(
'type' => 'submit',
'value' => $button['value']
);
+ if ( isset( $button['label-message'] ) ) {
+ $label = $this->msg( $button['label-message'] )->parse();
+ } elseif ( isset( $button['label'] ) ) {
+ $label = htmlspecialchars( $button['label'] );
+ } elseif ( isset( $button['label-raw'] ) ) {
+ $label = $button['label-raw'];
+ } else {
+ $label = htmlspecialchars( $button['value'] );
+ }
+
if ( $button['attribs'] ) {
$attrs += $button['attribs'];
}
$attrs['class'][] = 'mw-ui-button';
}
- $buttons .= Html::element( 'input', $attrs ) . "\n";
+ if ( $isBadIE ) {
+ $buttons .= Html::element( 'input', $attrs ) . "\n";
+ } else {
+ $buttons .= Html::rawElement( 'button', $attrs, $label ) . "\n";
+ }
}
$html = Html::rawElement( 'span',
function getButtons() {
$buttons = '';
+ // IE<8 has bugs with <button>, so we'll need to avoid them.
+ $isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
+
if ( $this->mShowSubmit ) {
$attribs = array( 'infusable' => true );
$attribs['label'] = $this->getSubmitText();
$attribs['value'] = $this->getSubmitText();
$attribs['flags'] = $this->mSubmitFlags;
+ $attribs['useInputTag'] = $isBadIE;
$buttons .= new OOUI\ButtonInputWidget( $attribs );
}
$buttons .= new OOUI\ButtonInputWidget( array(
'type' => 'reset',
'label' => $this->msg( 'htmlform-reset' )->text(),
+ 'useInputTag' => $isBadIE,
) );
}
$attrs['id'] = $button['id'];
}
+ if ( $isBadIE ) {
+ $label = $button['value'];
+ } elseif ( isset( $button['label-message'] ) ) {
+ $label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() );
+ } elseif ( isset( $button['label'] ) ) {
+ $label = $button['label'];
+ } elseif ( isset( $button['label-raw'] ) ) {
+ $label = new OOUI\HtmlSnippet( $button['label-raw'] );
+ } else {
+ $label = $button['value'];
+ }
+
$attrs['classes'] = isset( $attrs['class'] ) ? (array)$attrs['class'] : array();
$buttons .= new OOUI\ButtonInputWidget( array(
'type' => 'submit',
'name' => $button['name'],
'value' => $button['value'],
- 'label' => $button['value'],
+ 'label' => $label,
+ 'flags' => $button['flags'],
+ 'useInputTag' => $isBadIE,
) + $attrs );
}
$page = WikiPage::factory( $this->title );
$page->loadPageData( 'fromdbmaster' );
if ( !$page->exists() ) {
- # must create the page...
+ // must create the page...
$pageId = $page->insertOn( $dbw );
$created = true;
$oldcountable = null;
}
}
+ if ( !$pageId ) {
+ // This seems to happen if two clients simultaneously try to import the
+ // same page
+ wfDebug( __METHOD__ . ': got invalid $pageId when importing revision of [[' .
+ $this->title->getPrefixedText() . ']], timestamp ' . $this->timestamp . "\n" );
+ return false;
+ }
+
// Select previous version to make size diffs correct
+ // @todo This assumes that multiple revisions of the same page are imported
+ // in order from oldest to newest.
$prevId = $dbw->selectField( 'revision', 'rev_id',
array(
'rev_page' => $pageId,
"config-magic-quotes-sybase": "'''Фатално: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
"config-mbstring": "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.",
"config-safe-mode": "'''Предупреждение:''' PHP работи в [http://www.php.net/features.safe-mode безопасен режим].\nТова може да създаде проблеми, особено ако качването на файлове е разрешено, както и при поддръжката на <code>math</code>.",
- "config-xml-bad": "Ð\9bипÑ\81ва XML модÑ\83лÑ\8aÑ\82 на PHP.\nÐ\9cедиÑ\8fУики Ñ\81е нÑ\83ждае оÑ\82 нÑ\8fкои Ñ\84Ñ\83нкÑ\86ии оÑ\82 Ñ\82ози модÑ\83л и нÑ\8fма да Ñ\80абоÑ\82и пÑ\80и налиÑ\87наÑ\82а конÑ\84игÑ\83Ñ\80аÑ\86иÑ\8f.\nÐ\9fÑ\80и Mandrake, необÑ\85одимо е да Ñ\81е инÑ\81Ñ\82алиÑ\80а пакеÑ\82Ñ\8aт php-xml.",
+ "config-xml-bad": "Ð\97а PHP липÑ\81ва XML модÑ\83л.\nÐ\9cедиÑ\8fÑ\83ики нÑ\8fма да Ñ\80абоÑ\82и в Ñ\82ази конÑ\84игÑ\83Ñ\80аÑ\86иÑ\8f, Ñ\82Ñ\8aй каÑ\82о Ñ\81е изиÑ\81ква Ñ\84Ñ\83нкÑ\86ионалноÑ\81Ñ\82 на Ñ\82ози модÑ\83л.\nÐ\9cоже би Ñ\89е Ñ\82Ñ\80Ñ\8fбва да инÑ\81Ñ\82алиÑ\80аÑ\82е RPM-пакет php-xml.",
"config-pcre-old": "<strong>Фатална грешка:</strong> Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].",
"config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.",
"config-memory-raised": "<code>memory_limit</code> на PHP е $1, увеличаване до $2.",
"config-db-install-account": "Потребителска сметка за инсталацията",
"config-db-username": "Потребителско име за базата от данни:",
"config-db-password": "Парола за базата от данни:",
- "config-db-password-empty": "Въведете парола за новия потребител на базата от данни: $1.\nВъпреки че е допустимо да се създават потребители без пароли, това е незащитено действие.",
- "config-db-username-empty": "Необходимо е да се въведе стойност за „{{int:config-db-username}}“.",
"config-db-install-username": "Въвежда се потребителско име, което ще се използва за свързване с базата от данни по време на процеса по инсталация.\nТова не е потребителско име за сметка в МедияУики; това е потребителско име за базата от данни.",
"config-db-install-password": "Въвежда се парола, която ще бъде използвана за свързване с базата от данни по време на инсталационния процес.\nТова не е парола за сметка в МедияУики; това е парола за базата от данни.",
"config-db-install-help": "Въвеждат се потребителско име и парола, които ще бъдат използвани за свързване с базата от данни по време на инсталационния процес.",
"config-nofile": "Файлът „$1“ не може да бъде открит. Да не е бил изтрит?",
"config-extension-link": "Знаете ли, че това уики поддържа [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions разширения]?\n\nМожете да разгледате [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category разширенията по категория] или [//www.mediawiki.org/wiki/Extension_Matrix Матрицата на разширенията] за пълен списък на разширенията.",
"mainpagetext": "'''Уикито беше успешно инсталирано.'''",
- "mainpagedocfooter": "Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]"
+ "mainpagedocfooter": "Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на уики софтуера.\n\n== Първи стъпки ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Настройки за конфигуриране]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
}
"config-unicode-using-intl": "Χρησιμοποιώντας την [http://pecl.php.net/intl επέκταση intl PECL] για κανονικοποίηση Unicode.",
"config-unicode-pure-php-warning": "<strong>Προειδοποίηση:</strong> Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].",
"config-outdated-sqlite": "<strong>Προειδοποίηση:</strong> έχετε την SQLite $1, που είναι χαμηλότερα απαιτούμενη έκδοση $2. SQLite δεν θα είναι διαθέσιμη.",
+ "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-safe-mode": "<strong>Προειδοποίηση:</strong> Το PHP [http://www.php.net/features.safe-mode safe mode] είναι ενεργό.\nΑυτό μπορεί να προκαλέσει προβλήματα, ιδιαίτερα εάν η χρήση αρχείων και υποστήριξη <code>math</code>.",
"config-xml-bad": "Το PHP XML module λείπει.\nΤο MediaWiki απαιτεί λειτουργίες σε αυτήν την ενότητα και δεν θα λειτουργήσει με αυτή την παραμετροποίηση. \nΜπορεί να χρειαστεί να εγκαταστήσετε το πακέτο php-xml RPM.",
"config-pcre-no-utf8": "<strong>Κρίσιμο:</strong> Το PCRE module της PHP φαίνεται να είναι μεταγλωτισμένο χωρίς υποσήριξη PCRE_UTF8.\nΤο MediaWiki απαιτεί υποστήριξη UTF-8 για να λειτουργήσει σωστά.",
"config-memory-raised": "Το <code>memory_limit</code> της PHP είναι $1 και αυξήθηκε σε $2.",
"config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
"config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
"config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
+ "config-db-install-help": "Εισάγετε το όνομα χρήστη και τον κωδικό πρόσβασης που θα χρησιμοποιηθεί για τη σύνδεση με τη βάση δεδομένων κατά τη διάρκεια της διαδικασίας εγκατάστασης.",
"config-db-account-lock": "Χρησιμοποιήστε το ίδιο όνομα χρήστη και κωδικό πρόσβασης στη διάρκεια της κανονικής λειτουργίας",
"config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
+ "config-db-wiki-help": "Εισάγετε το όνομα χρήστη και τον κωδικό πρόσβασης που θα χρησιμοποιηθεί για τη σύνδεση με τη βάση δεδομένων κατά τη διάρκεια της κανονικής λειτουργίας του wiki.\nΕάν ο λογαριασμός δεν υπάρχει, και o λογαριασμός εγκατάστασης έχει επαρκή δικαιώματα, αυτός ο λογαριασμός χρήστη θα δημιουργηθεί με τα ελάχιστα δικαιώματα που απαιτούνται για να λειτουργήσετε το wiki.",
"config-db-prefix": "Πρόθεμα πίνακα βάσης δεδομένων:",
"config-db-prefix-help": "Εάν χρειάζεστε να μοιραστείτε μία βάση δεδομένων μεταξύ πολλαπλών wikis, ή μεταξύ του MediaWiki και μιας άλλης web εφαρμογής, μπορείτε να επιλέξετε να προσθέσετε ένα πρόθεμα όλα τα ονόματα πίνακα για να αποφεύγονται οι συγκρούσεις.\nΜην χρησιμοποιείτε κενά διαστήματα.\n\nΑυτό το πεδίο αφήνεται συνήθως άδειο.",
"config-db-charset": "Σύνολο χαρακτήρων βάσης δεδομένων",
"config-oracle-temp-ts": "Тимчасовий простір таблиць:",
"config-type-mysql": "MySQL (або сумісний)",
"config-type-mssql": "Microsoft SQL Server",
- "config-support-info": "MediaWiki підтримує таки системи баз даних:\n\n$1\n\nЯкщо Ви не бачите серед перерахованих систему баз даних, яку використовуєте, виконайте вказівки, вказані вище, щоб увімкнути підтримку.",
+ "config-support-info": "MediaWiki підтримує такі системи баз даних:\n\n$1\n\nЯкщо Ви не бачите серед перерахованих систему баз даних, яку використовуєте, виконайте вказівки, вказані вище, щоб увімкнути підтримку.",
"config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] є основною для MediaWiki і найкраще підтримується. MediaWiki також працює із [{{int:version-db-mariadb-url}} MariaDB] та [{{int:version-db-percona-url}} Percona Server], які сумісні з MySQL. ([http://www.php.net/manual/en/mysqli.installation.php як зібрати PHP з допомогою MySQL])",
"config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — популярна відкрита СУБД, альтернатива MySQL. Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]).",
"config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)",
'APIPropModules',
'APIListModules',
'ValidSkinNames',
+ 'FeedClasses',
);
/**
--- /dev/null
+<?php
+/**
+ * A SearchResultSet wrapper for SearchEngine::getNearMatch
+ */
+class SearchNearMatchResultSet extends SearchResultSet {
+ private $fetched = false;
+
+ /**
+ * @param Title|null $match Title if matched, else null
+ */
+ public function __construct( $match ) {
+ $this->result = $match;
+ }
+
+ public function numRows() {
+ return $this->result ? 1 : 0;
+ }
+
+ public function next() {
+ if ( $this->fetched || !$this->result ) {
+ return false;
+ }
+ $this->fetched = true;
+ return SearchResult::newFromTitle( $this->result );
+ }
+}
return $this->containedSyntax;
}
}
-
-/**
- * This class is used for different SQL-based search engines shipped with MediaWiki
- * @ingroup Search
- */
-class SqlSearchResultSet extends SearchResultSet {
- protected $resultSet;
- protected $terms;
- protected $totalHits;
-
- function __construct( $resultSet, $terms, $total = null ) {
- $this->resultSet = $resultSet;
- $this->terms = $terms;
- $this->totalHits = $total;
- }
-
- function termMatches() {
- return $this->terms;
- }
-
- function numRows() {
- if ( $this->resultSet === false ) {
- return false;
- }
-
- return $this->resultSet->numRows();
- }
-
- function next() {
- if ( $this->resultSet === false ) {
- return false;
- }
-
- $row = $this->resultSet->fetchObject();
- if ( $row === false ) {
- return false;
- }
-
- return SearchResult::newFromTitle(
- Title::makeTitle( $row->page_namespace, $row->page_title )
- );
- }
-
- function free() {
- if ( $this->resultSet === false ) {
- return false;
- }
-
- $this->resultSet->free();
- }
-
- function getTotalHits() {
- if ( !is_null( $this->totalHits ) ) {
- return $this->totalHits;
- } else {
- // Special:Search expects a number here.
- return $this->numRows();
- }
- }
-}
-
-/**
- * A SearchResultSet wrapper for SearchEngine::getNearMatch
- */
-class SearchNearMatchResultSet extends SearchResultSet {
- private $fetched = false;
-
- /**
- * @param Title|null $match Title if matched, else null
- */
- public function __construct( $match ) {
- $this->result = $match;
- }
-
- public function numRows() {
- return $this->result ? 1 : 0;
- }
-
- public function next() {
- if ( $this->fetched || !$this->result ) {
- return false;
- }
- $this->fetched = true;
- return SearchResult::newFromTitle( $this->result );
- }
-}
--- /dev/null
+<?php
+/**
+ * This class is used for different SQL-based search engines shipped with MediaWiki
+ * @ingroup Search
+ */
+class SqlSearchResultSet extends SearchResultSet {
+ protected $resultSet;
+ protected $terms;
+ protected $totalHits;
+
+ function __construct( $resultSet, $terms, $total = null ) {
+ $this->resultSet = $resultSet;
+ $this->terms = $terms;
+ $this->totalHits = $total;
+ }
+
+ function termMatches() {
+ return $this->terms;
+ }
+
+ function numRows() {
+ if ( $this->resultSet === false ) {
+ return false;
+ }
+
+ return $this->resultSet->numRows();
+ }
+
+ function next() {
+ if ( $this->resultSet === false ) {
+ return false;
+ }
+
+ $row = $this->resultSet->fetchObject();
+ if ( $row === false ) {
+ return false;
+ }
+
+ return SearchResult::newFromTitle(
+ Title::makeTitle( $row->page_namespace, $row->page_title )
+ );
+ }
+
+ function free() {
+ if ( $this->resultSet === false ) {
+ return false;
+ }
+
+ $this->resultSet->free();
+ }
+
+ function getTotalHits() {
+ if ( !is_null( $this->totalHits ) ) {
+ return $this->totalHits;
+ } else {
+ // Special:Search expects a number here.
+ return $this->numRows();
+ }
+ }
+}
--- /dev/null
+<?php
+
+namespace MediaWiki\Site;
+
+use FormatJson;
+use Http;
+use UtfNormal\Validator;
+
+/**
+ * Service for normalizing a page name using a MediaWiki api.
+ *
+ * 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
+ *
+ * @since 1.27
+ *
+ * @license GNU GPL v2+
+ * @author John Erling Blad < jeblad@gmail.com >
+ * @author Daniel Kinzler
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Marius Hoch
+ */
+class MediaWikiPageNameNormalizer {
+
+ /**
+ * Returns the normalized form of the given page title, using the
+ * normalization rules of the given site. If the given title is a redirect,
+ * the redirect weill be resolved and the redirect target is returned.
+ *
+ * @note This actually makes an API request to the remote site, so beware
+ * that this function is slow and depends on an external service.
+ *
+ * @see Site::normalizePageName
+ *
+ * @since 1.27
+ *
+ * @param string $pageName
+ * @param string $apiUrl
+ *
+ * @return string
+ * @throws \MWException
+ */
+ public function normalizePageName( $pageName, $apiUrl ) {
+
+ // Check if we have strings as arguments.
+ if ( !is_string( $pageName ) ) {
+ throw new \MWException( '$pageName must be a string' );
+ }
+
+ // Go on call the external site
+
+ // Make sure the string is normalized into NFC (due to T42017)
+ // but do nothing to the whitespaces, that should work appropriately.
+ // @see https://phabricator.wikimedia.org/T42017
+ $pageName = Validator::cleanUp( $pageName );
+
+ // Build the args for the specific call
+ $args = array(
+ 'action' => 'query',
+ 'prop' => 'info',
+ 'redirects' => true,
+ 'converttitles' => true,
+ 'format' => 'json',
+ 'titles' => $pageName,
+ // @todo options for maxlag and maxage
+ // Note that maxlag will lead to a long delay before a reply is made,
+ // but that maxage can avoid the extreme delay. On the other hand
+ // maxage could be nice to use anyhow as it stops unnecessary requests.
+ // Also consider smaxage if maxage is used.
+ );
+
+ $url = wfAppendQuery( $apiUrl, $args );
+
+ // Go on call the external site
+ // @todo we need a good way to specify a timeout here.
+ $ret = Http::get( $url, array(), __METHOD__ );
+
+ if ( $ret === false ) {
+ wfDebugLog( "MediaWikiSite", "call to external site failed: $url" );
+ return false;
+ }
+
+ $data = FormatJson::decode( $ret, true );
+
+ if ( !is_array( $data ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned bad json: " . $ret );
+ return false;
+ }
+
+ $page = static::extractPageRecord( $data, $pageName );
+
+ if ( isset( $page['missing'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! "
+ . $ret );
+ return false;
+ }
+
+ if ( isset( $page['invalid'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! "
+ . $ret );
+ return false;
+ }
+
+ if ( !isset( $page['title'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> did not return a page title! " . $ret );
+ return false;
+ }
+
+ return $page['title'];
+ }
+
+ /**
+ * Get normalization record for a given page title from an API response.
+ *
+ * @param array $externalData A reply from the API on a external server.
+ * @param string $pageTitle Identifies the page at the external site, needing normalization.
+ *
+ * @return array|bool A 'page' structure representing the page identified by $pageTitle.
+ */
+ private static function extractPageRecord( $externalData, $pageTitle ) {
+ // If there is a special case with only one returned page
+ // we can cheat, and only return
+ // the single page in the "pages" substructure.
+ if ( isset( $externalData['query']['pages'] ) ) {
+ $pages = array_values( $externalData['query']['pages'] );
+ if ( count( $pages ) === 1 ) {
+ return $pages[0];
+ }
+ }
+ // This is only used during internal testing, as it is assumed
+ // a more optimal (and lossfree) storage.
+ // Make initial checks and return if prerequisites are not meet.
+ if ( !is_array( $externalData ) || !isset( $externalData['query'] ) ) {
+ return false;
+ }
+ // Loop over the tree different named structures, that otherwise are similar
+ $structs = array(
+ 'normalized' => 'from',
+ 'converted' => 'from',
+ 'redirects' => 'from',
+ 'pages' => 'title'
+ );
+ foreach ( $structs as $listId => $fieldId ) {
+ // Check if the substructure exist at all.
+ if ( !isset( $externalData['query'][$listId] ) ) {
+ continue;
+ }
+ // Filter the substructure down to what we actually are using.
+ $collectedHits = array_filter(
+ array_values( $externalData['query'][$listId] ),
+ function ( $a ) use ( $fieldId, $pageTitle ) {
+ return $a[$fieldId] === $pageTitle;
+ }
+ );
+ // If still looping over normalization, conversion or redirects,
+ // then we need to keep the new page title for later rounds.
+ if ( $fieldId === 'from' && is_array( $collectedHits ) ) {
+ switch ( count( $collectedHits ) ) {
+ case 0:
+ break;
+ case 1:
+ $pageTitle = $collectedHits[0]['to'];
+ break;
+ default:
+ return false;
+ }
+ } elseif ( $fieldId === 'title' && is_array( $collectedHits ) ) {
+ // If on the pages structure we should prepare for returning.
+
+ switch ( count( $collectedHits ) ) {
+ case 0:
+ return false;
+ case 1:
+ return array_shift( $collectedHits );
+ default:
+ return false;
+ }
+ }
+ }
+ // should never be here
+ return false;
+ }
+
+}
<?php
+
+use MediaWiki\Site\MediaWikiPageNameNormalizer;
+
/**
* Class representing a MediaWiki site.
*
* @throws MWException
*/
public function normalizePageName( $pageName ) {
-
- // Check if we have strings as arguments.
- if ( !is_string( $pageName ) ) {
- throw new MWException( '$pageName must be a string' );
- }
-
- // Go on call the external site
if ( defined( 'MW_PHPUNIT_TEST' ) ) {
// If the code is under test, don't call out to other sites, just
// normalize locally.
$t = Title::newFromText( $pageName );
return $t->getPrefixedText();
} else {
+ static $mediaWikiPageNameNormalizer = null;
- // Make sure the string is normalized into NFC (due to T42017)
- // but do nothing to the whitespaces, that should work appropriately.
- // @see https://phabricator.wikimedia.org/T42017
- $pageName = UtfNormal\Validator::cleanUp( $pageName );
-
- // Build the args for the specific call
- $args = array(
- 'action' => 'query',
- 'prop' => 'info',
- 'redirects' => true,
- 'converttitles' => true,
- 'format' => 'json',
- 'titles' => $pageName,
- // @todo options for maxlag and maxage
- // Note that maxlag will lead to a long delay before a reply is made,
- // but that maxage can avoid the extreme delay. On the other hand
- // maxage could be nice to use anyhow as it stops unnecessary requests.
- // Also consider smaxage if maxage is used.
- );
-
- $url = wfAppendQuery( $this->getFileUrl( 'api.php' ), $args );
-
- // Go on call the external site
- // @todo we need a good way to specify a timeout here.
- $ret = Http::get( $url, array(), __METHOD__ );
- }
-
- if ( $ret === false ) {
- wfDebugLog( "MediaWikiSite", "call to external site failed: $url" );
- return false;
- }
-
- $data = FormatJson::decode( $ret, true );
-
- if ( !is_array( $data ) ) {
- wfDebugLog( "MediaWikiSite", "call to <$url> returned bad json: " . $ret );
- return false;
- }
-
- $page = static::extractPageRecord( $data, $pageName );
-
- if ( isset( $page['missing'] ) ) {
- wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! "
- . $ret );
- return false;
- }
-
- if ( isset( $page['invalid'] ) ) {
- wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! "
- . $ret );
- return false;
- }
-
- if ( !isset( $page['title'] ) ) {
- wfDebugLog( "MediaWikiSite", "call to <$url> did not return a page title! " . $ret );
- return false;
- }
-
- return $page['title'];
- }
-
- /**
- * Get normalization record for a given page title from an API response.
- *
- * @since 1.21
- *
- * @param array $externalData A reply from the API on a external server.
- * @param string $pageTitle Identifies the page at the external site, needing normalization.
- *
- * @return array|bool A 'page' structure representing the page identified by $pageTitle.
- */
- private static function extractPageRecord( $externalData, $pageTitle ) {
- // If there is a special case with only one returned page
- // we can cheat, and only return
- // the single page in the "pages" substructure.
- if ( isset( $externalData['query']['pages'] ) ) {
- $pages = array_values( $externalData['query']['pages'] );
- if ( count( $pages ) === 1 ) {
- return $pages[0];
- }
- }
- // This is only used during internal testing, as it is assumed
- // a more optimal (and lossfree) storage.
- // Make initial checks and return if prerequisites are not meet.
- if ( !is_array( $externalData ) || !isset( $externalData['query'] ) ) {
- return false;
- }
- // Loop over the tree different named structures, that otherwise are similar
- $structs = array(
- 'normalized' => 'from',
- 'converted' => 'from',
- 'redirects' => 'from',
- 'pages' => 'title'
- );
- foreach ( $structs as $listId => $fieldId ) {
- // Check if the substructure exist at all.
- if ( !isset( $externalData['query'][$listId] ) ) {
- continue;
+ if ( $mediaWikiPageNameNormalizer === null ) {
+ $mediaWikiPageNameNormalizer = new MediaWikiPageNameNormalizer();
}
- // Filter the substructure down to what we actually are using.
- $collectedHits = array_filter(
- array_values( $externalData['query'][$listId] ),
- function ( $a ) use ( $fieldId, $pageTitle ) {
- return $a[$fieldId] === $pageTitle;
- }
+
+ return $mediaWikiPageNameNormalizer->normalizePageName(
+ $pageName,
+ $this->getFileUrl( 'api.php' )
);
- // If still looping over normalization, conversion or redirects,
- // then we need to keep the new page title for later rounds.
- if ( $fieldId === 'from' && is_array( $collectedHits ) ) {
- switch ( count( $collectedHits ) ) {
- case 0:
- break;
- case 1:
- $pageTitle = $collectedHits[0]['to'];
- break;
- default:
- return false;
- }
- } elseif ( $fieldId === 'title' && is_array( $collectedHits ) ) {
- // If on the pages structure we should prepare for returning.
- switch ( count( $collectedHits ) ) {
- case 0:
- return false;
- case 1:
- return array_shift( $collectedHits );
- default:
- return false;
- }
- }
}
- // should never be here
- return false;
}
/**
$classes .= ' catlinks-allhidden';
}
- return "<div id='catlinks' class='$classes'>{$catlinks}</div>";
+ return "<div id='catlinks' class='$classes' data-mw='interface'>{$catlinks}</div>";
}
/**
}
/**
- * Some special pages (for example SpecialListusers) might not return the
+ * Some special pages (for example SpecialListusers used to) might not return the
* current object formatted, but return the previous one instead.
* Setting this to return true will ensure formatResult() is called
* one more time to make sure that the very last result is formatted
* as well.
+ *
+ * @deprecated since 1.27
+ *
* @return bool
*/
function tryLastResult() {
// @codingStandardsIgnoreEnd
$line = $this->formatResult( $skin, $row );
if ( $line ) {
- $attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
- ? ' class="not-patrolled"'
- : '';
$html[] = $this->listoutput
? $line
- : "<li{$attr}>{$line}</li>\n";
+ : "<li>{$line}</li>\n";
}
}
$row = null;
$line = $this->formatResult( $skin, $row );
if ( $line ) {
- $attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
- ? ' class="not-patrolled"'
- : '';
$html[] = $this->listoutput
? $line
- : "<li{$attr}>{$line}</li>\n";
+ : "<li>{$line}</li>\n";
}
}
? 'resetpass-submit-loggedin'
: 'resetpass_submit'
);
- $form->addButton( 'wpCancel', $this->msg( 'resetpass-submit-cancel' )->text() );
+ $form->addButton( array(
+ 'name' => 'wpCancel',
+ 'value' => $this->msg( 'resetpass-submit-cancel' )->text()
+ ) );
$form->setHeaderText( $this->msg( 'resetpass_text' )->parseAsBlock() );
if ( $this->mPreTextMessage instanceof Message ) {
$form->addPreText( $this->mPreTextMessage->parseAsBlock() );
<?php
/**
- * Implements Special:Confirmemail and Special:Invalidateemail
+ * Implements Special:Confirmemail
*
* 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
}
}
}
-
-/**
- * Special page allows users to cancel an email confirmation using the e-mail
- * confirmation code
- *
- * @ingroup SpecialPage
- */
-class EmailInvalidation extends UnlistedSpecialPage {
- public function __construct() {
- parent::__construct( 'Invalidateemail', 'editmyprivateinfo' );
- }
-
- function execute( $code ) {
- // Ignore things like master queries/connections on GET requests.
- // It's very convenient to just allow formless link usage.
- Profiler::instance()->getTransactionProfiler()->resetExpectations();
-
- $this->setHeaders();
- $this->checkReadOnly();
- $this->checkPermissions();
- $this->attemptInvalidate( $code );
- }
-
- /**
- * Attempt to invalidate the user's email address and show success or failure
- * as needed; if successful, link to main page
- *
- * @param string $code Confirmation code
- */
- function attemptInvalidate( $code ) {
- $user = User::newFromConfirmationCode( $code, User::READ_LATEST );
- if ( !is_object( $user ) ) {
- $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
-
- return;
- }
-
- $user->invalidateEmail();
- $user->saveSettings();
- $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
-
- if ( !$this->getUser()->isLoggedIn() ) {
- $this->getOutput()->returnToMain();
- }
- }
-}
--- /dev/null
+<?php
+/**
+ * Implements Special:EmailInvalidation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Special page allows users to cancel an email confirmation using the e-mail
+ * confirmation code
+ *
+ * @ingroup SpecialPage
+ */
+class EmailInvalidation extends UnlistedSpecialPage {
+ public function __construct() {
+ parent::__construct( 'Invalidateemail', 'editmyprivateinfo' );
+ }
+
+ function execute( $code ) {
+ // Ignore things like master queries/connections on GET requests.
+ // It's very convenient to just allow formless link usage.
+ Profiler::instance()->getTransactionProfiler()->resetExpectations();
+
+ $this->setHeaders();
+ $this->checkReadOnly();
+ $this->checkPermissions();
+ $this->attemptInvalidate( $code );
+ }
+
+ /**
+ * Attempt to invalidate the user's email address and show success or failure
+ * as needed; if successful, link to main page
+ *
+ * @param string $code Confirmation code
+ */
+ function attemptInvalidate( $code ) {
+ $user = User::newFromConfirmationCode( $code, User::READ_LATEST );
+ if ( !is_object( $user ) ) {
+ $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+ return;
+ }
+
+ $user->invalidateEmail();
+ $user->saveSettings();
+ $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
+
+ if ( !$this->getUser()->isLoggedIn() ) {
+ $this->getOutput()->returnToMain();
+ }
+ }
+}
$form = $this->getUploadForm( $warningHtml, $sessionKey, /* $hideIgnoreWarning */ true );
$form->setSubmitText( $this->msg( 'upload-tryagain' )->text() );
- $form->addButton( 'wpUploadIgnoreWarning', $this->msg( 'ignorewarning' )->text() );
- $form->addButton( 'wpCancelUpload', $this->msg( 'reuploaddesc' )->text() );
+ $form->addButton( array(
+ 'name' => 'wpUploadIgnoreWarning',
+ 'value' => $this->msg( 'ignorewarning' )->text()
+ ) );
+ $form->addButton( array(
+ 'name' => 'wpCancelUpload',
+ 'value' => $this->msg( 'reuploaddesc' )->text()
+ ) );
$this->showUploadForm( $form );
"databasenotlocked": "وئریلنلر بازاسی باغلانماییب.",
"lockedbyandtime": "({{Gender: $1 | $1}} طرفیندن $2 $3 اعتبار ایله)",
"move-page": "$1 داشینیر",
- "move-page-legend": "صحیفهنین آدینی دییش",
+ "move-page-legend": "صفحهنین آدینی دَییش",
"movepagetext": "آشاغیداکی فورمدان ایستیفاده ائتمک، صحیفهنین آدینی، بوتون تاریخچهسینی ده کؤچورمکله، یئنی باشلیغا دییشهجک.\nاسکی باشلیق یئنی باشلیغا یوللاندیریلاجاقدیر.\nاسکی صحیفهیه اولان یوللاندیرماقلاری، اوتوماتیک گونجللهیه بیلرسینیز.\nبو سئچیمی ائتمهدیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق یوللاندیرمالاری]] یوخلاماغی یاددان چیخارمایین.\nباغلانتیلاری اویغون یئره یوللاندیرماسیندان آرخایین اولماق، سیزین مسئولیتینیزدهدیر.\n\nنظره آلین کی، هدف باشلیق آلتیندا بیر صحیفه مؤوجود اولسا، یئردییشمه '''باش توتمایاجاق'''، مگر بوکی او سونراکی صحیفه یوللاندیرما اولا و اؤنجه دَییشمه گئچمیشی ده اولمایا. بو او دئمکدیر کی، سهواً آدینی دییشدیگینیز صحیفهلری گئری قایتارا بیلمک اولار، بونونلا یاناشی آرتیق مؤوجود اولان صحیفهنین اوزرینه باشقا صحیفه یازا بیلمزسینیز.\n\n'''خبردارلیق!'''\nبو یئردییشمه مشهور صحیفه اوچون اساسلی و گؤزلنیلمز اولا بیلر؛ اونا گؤره ده بو دییشیکلیگی یئرینه یئتیرمزدن اول، بونون مومکون نتیجهلرینی باشا دوشدوگونوزدن آرخایین اولون.",
- "movepagetext-noredirectfixer": "آشاغیداکی فورمو دولدورماق بیر صحیفنی یئنیدن آدلاندیریر، بوتون کئچمیشینی یئنی آدا داشیییر.\nکؤهنه مؤوزو یئنی باشلیغا بیر ایستیقامتلندیرمه صحیفهسی اولار.\n[[Special:DoubleRedirects|جوت]] یا دا [[Special:BrokenRedirects|نوزوک ایستیقامتلندیرمهلر]] صحیفهلرینی ایداره ائدین.\nعلاقهلرین گئتمهلری لازیم اولان یئرلره گئتدیکلرینی عمین اولماق سیزین سوروملولوغونوزدادیر.\n\nیئنی باشلیقدا مؤوجود بیر صحیفه وارسا، بوش یا دا بیر ایستیقامتلندیرمه اولمادیقجا و دییشیکلیک کئچمیشی اولمادیغی تقدیرده، سهیف 'تاشینمایاجاکتیر.\nبو بو معنانی وئرر، بیر صحیفنی اشتباه ائتسهنیز صحیفنی کؤهنه آدییلا یئنیدن آدلاندیرا بیلریک، بو مؤوجود صحیفهنین اوزرینه یازماز.\n\n' 'خبردارلیق!'\nبو مشهور بیر صحیفه اوچون تأثیرلی و گؤزلنیلمز بیر دییشیکلیک اولا بیلر؛\nخاهیش ائدیریک راتیفیکاسیا ائتمهدن اول بونون نتیجهلرینی آنلادیغینیزدان امین اولون.",
+ "movepagetext-noredirectfixer": "آشاغیداکی فوْرمو دوْلدورماق بیر صفحهنی یئنیدن آدلاندیریر، بۆتون گئچمیشینی یئنی آدا داشیییر.\nکؤهنه موضوعو یئنی باشلیغا بیر یوْللاندیرما صفحهسی اوْلار.\n[[Special:DoubleRedirects|ایکیقات]] یوْخسا [[Special:BrokenRedirects|خطالی یوْللاندیرمالار]] صفحهلرینی یوْخلایین.\nباغلانتیلارین گئتمهلری گرک اولان یئرلره گئتدیکلرینی آرخایین اوْلماق سیزین مسعولیتینیزدیر.\n\nیئنی باشلیقدا مؤوجود بیر صفحه وارسا، بوْش یوْخسا بیر یوْللاندیرما اوْلمادیقجا و دییشیکلیک گئچمیشی اوْلمازسا، صفحه داشینمایاجاق.\nبۇ یانی، بیر صفحهنی اشتباه ائتسهنیز صفحهنی کؤهنه آدییلا یئنیدن آدلاندیرا بیلرسینیز، آنجاق بیر صفحهنی قاباقجادان مووجود اوْلان صفحهیه یوْللاندیرا بیلمزسینیز.\n\n' 'تذکور!'\nچوْخ گؤروشلو صفحهلرین یوْللاندیرماسی گؤزلهنیلمز اثرلری اوْلا بیلر. لوطفا یوْللاندیرمادان قاباق، ایشینیزین نتیجهسیندن آرخایین اوْلون.",
"movepagetalktext": "اویغون دانیشیق صحیفهسی آوتوماتیک حرکت ائدهجک 'گر:'\n* بوش اولمایان دانیشیق صحیفهسی یئنی آدلا آرتیق مؤوجوددورسا، و یا\n* سیز بایراغی آشاغیدان گؤتورسهنیز.\n\nهمین حاللاردا ، احتیاج یارانارسا سیز صحیفهلری الله بیرلشدیرمک مجبوریتینده قالاجاقسینیز",
"moveuserpage-warning": "' 'خبردارلیق:' بیر ایستیفادهچی صحیفهسینی داشیماق اوزرسینیز. خاهیش ائدیریک یالنیز صحیفهنین تاشیناجاغینا، آنجاق ایستیفادهچینین یئنیدن آدلاندیریلمایاجاغینا دقت ائدین.",
"movenologintext": "صحیفهنین آدینی دییشیکلیک اوچون قئیدیاتلی و [[Special:UserLogin|سیستئمه]] داخیل اولمانیز لازیمدیر.",
"cant-move-user-page": "ایستیفادهچی صحیفهلرینین آدینی دییشه بیلمزسینیز (باشلیقلاردان باشقا).",
"cant-move-to-user-page": "بیر صحیفنی، بیر ایستیفادهچی صحیفهسینه داشیماغا ایجازه وئریلمیر (بیر ایستیفادهچی آلتسایفاسی خاریجینده).",
"newtitle": "یئنی باشلیق",
- "move-watch": "بو صحیفنی ایزله",
- "movepagebtn": "صحیفهنین آدینی دییش",
+ "move-watch": "بۇ صفحهنی ایزله",
+ "movepagebtn": "صفحهنین آدینی دَییش",
"pagemovedsub": "یئردییشمه ائدیلمیشدیر",
"movepage-moved": "'\"$1\" صحیفهسی \"$2\" صحیفهسینه یئرلشدیریلمیشدیر",
"movepage-moved-redirect": "یؤنلندیرمه یارادیلدی.",
"movepage-moved-noredirect": "یؤنلندیرمهنین یارادیلماسینین قارشییس آلیندی.",
"articleexists": "بو آددا صحیفه آرتیق مؤوجوددور و یا سیزین سئچدیگینیز آد اویغون دئییل.\nزحمت اولماسا باشقا آد سئچین.",
"cantmove-titleprotected": "بیر صحیفنی بو مؤوقئیه داشییا بیلمز، چونکی یئنی موضونون یارادیلماسی قورونور",
- "movetalk": "بو صحیفهنین دانیشیق صحیفهسینین ده آدینی دییشدیر.",
+ "movetalk": "بۇ صفحهنین دانیشیق صفحهسینین ده آدینی دَییشدیر.",
"move-subpages": "یاریم صحیفهلری کؤچور ($1-ا قدر)",
"move-talk-subpages": "دانیشیق صحیفهلرینین آلت صحیفهلرینی کؤچور ($1-ا قدر)",
"movepage-page-exists": "$1 ماددهسی اونسوز دا وار اولماقدادیر، و آوتوماتیک اولاراق یئنیدن یازیلا بیلمز.",
"upload-form-label-select-file": "Абраць файл",
"upload-form-label-infoform-title": "Падрабязнасьці",
"upload-form-label-infoform-name": "Назва",
+ "upload-form-label-infoform-name-tooltip": "Унікальнае апісаньне файлу, якое будзе выкарыстоўвацца як яго назва. Вы можаце карыстацца звычайнай мовай з прабеламі. Не дадавайце пашырэньне файлу.",
"upload-form-label-infoform-description": "Апісаньне",
+ "upload-form-label-infoform-description-tooltip": "Коратка апішыце ўсё значнае пра гэтую працу.\nДля фота, узгадайце пра асноўныя аб’екты, выпадак ці месца.",
"upload-form-label-usage-title": "Выкарыстаньне",
"upload-form-label-usage-filename": "Назва файлу",
"foreign-structured-upload-form-label-own-work": "Гэта мая ўласная праца",
"delete-confirm": "Выдаліць «$1»",
"delete-legend": "Выдаліць",
"historywarning": "<strong>Папярэджаньне</strong>: старонка, якую Вы зьбіраецеся выдаліць, мае гісторыю з $1 {{PLURAL:$1|вэрсіі|вэрсіяў|вэрсіяў}}:",
+ "historyaction-submit": "Паказаць",
"confirmdeletetext": "Зараз Вы выдаліце старонку разам з усёй гісторыяй зьменаў.\nКалі ласка, пацьвердзіце, што Вы зьбіраецеся гэта зрабіць і што Вы разумееце ўсе наступствы, а таксама робіце гэта ў адпаведнасьці з [[{{MediaWiki:Policy-url}}|правіламі]].",
"actioncomplete": "Дзеяньне выкананае",
"actionfailed": "Дзеяньне ня выкананае",
"whatlinkshere-hidelinks": "$1 спасылкі",
"whatlinkshere-hideimages": "$1 спасылкі на выявы",
"whatlinkshere-filters": "Фільтры",
+ "whatlinkshere-submit": "Перайсьці",
"autoblockid": "Аўтаматычнае блякаваньне №$1",
"block": "Заблякаваць удзельніка",
"unblock": "Разблякаваць удзельніка",
"export-download": "Захаваць як файл",
"export-templates": "Разам з шаблёнамі",
"export-pagelinks": "Уключыць зьвязаныя старонкі да глыбіні:",
+ "export-manual": "Дадаць старонкі ўручную:",
"allmessages": "Сыстэмныя паведамленьні",
"allmessagesname": "Назва",
"allmessagesdefault": "Тэкст па змоўчаньні",
"exif-compression-4": "CCITT Група 4 факсымільнае кадаваньне",
"exif-copyrighted-true": "Ахоўваецца аўтарскім правам",
"exif-copyrighted-false": "Статус аўтарскіх правоў ня вызначаны",
+ "exif-photometricinterpretation-1": "Чорны і белы (чорны — 0)",
"exif-unknowndate": "Невядомая дата",
"exif-orientation-1": "Звычайная",
"exif-orientation-2": "Адлюстраваная па гарызанталі",
"directorynotreadableerror": "Директория \"$1\" не може да бъде четена.",
"filenotfound": "Файлът „$1“ не беше намерен.",
"unexpected": "Неочаквана стойност: „$1“=„$2“.",
- "formerror": "Възникна грешка при изпращане на формуляра",
+ "formerror": "Възникна грешка при изпращане на формуляра.",
"badarticleerror": "Действието не може да бъде изпълнено на тази страница.",
"cannotdelete": "Указаната страница или файл \"$1\" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.",
"cannotdelete-title": "Страницата „$1“ не може да бъде изтрита",
- "delete-hook-aborted": "Изтриването беше прекъснато от кука.\nНе беше посочена причина за това.",
+ "delete-hook-aborted": "Изтриването беше прекъснато от софтуерно прехващане.\nНе беше посочена причина за това.",
"no-null-revision": "Не може да бъде създадена празна версия на страницата „$1“",
"badtitle": "Невалидно заглавие",
"badtitletext": "Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.",
"title-invalid-talk-namespace": "Желаното заглавие на страница се отнася към беседа, която не съществува",
"title-invalid-characters": "Желаното заглавие на статия съдържа невалидни знаци: „$1“",
"title-invalid-relative": "Заглавието съдържа относителен път. Относителни заглавия на статии (./,../) са невалидни, защото често ще са недостижимо, когато биват извиквани от браузъра на потребителя.",
- "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от вълчнички (<nowiki>~~~</nowiki>).",
+ "title-invalid-magic-tilde": "Желаното заглавие на статия съдържа невалидна поредица от тилди (<nowiki>~~~</nowiki>).",
"title-invalid-too-long": "Желаното заглавие на статия е твърде дълго. Трябва да е не по-дълго от $1 {{PLURAL:$1|байт|байта}} в кодиране UTF-8.",
"title-invalid-leading-colon": "Желаното заглавие на статия съдържа невалидно двоеточие в началото.",
"perfcached": "Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.",
"mypreferencesprotected": "Нямате права да редактирате настройките си.",
"ns-specialprotected": "Специалните страници не могат да бъдат редактирани.",
"titleprotected": "Тази страница е била защитена срещу създаване от [[User:$1|$1]].\nПосочената причина е ''$2''.",
- "filereadonlyerror": "ФайлÑ\8aÑ\82 â\80\9e$1â\80\9c не може да бÑ\8aде пÑ\80оменен, Ñ\82Ñ\8aй каÑ\82о Ñ\84айловоÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e$2â\80\9c е в Ñ\80ежим Ñ\81амо за Ñ\87еÑ\82ене.\n\nÐ\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8aÑ\82, който го е заключил, е посочил следната причина: „$3“.",
+ "filereadonlyerror": "ФайлÑ\8aÑ\82 â\80\9e$1â\80\9c не може да бÑ\8aде пÑ\80оменен, Ñ\82Ñ\8aй каÑ\82о Ñ\84айловоÑ\82о Ñ\85Ñ\80анилиÑ\89е â\80\9e$2â\80\9c е в Ñ\80ежим Ñ\81амо за Ñ\87еÑ\82ене.\n\nСиÑ\81Ñ\82емниÑ\8fÑ\82 админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80, който го е заключил, е посочил следната причина: „$3“.",
"invalidtitle-knownnamespace": "Невалидно заглавие с именно пространство „$2“ и текст „$3“",
"invalidtitle-unknownnamespace": "Невалидно заглавие с неразпознато именно пространство номер $1 и текст „$2“",
"exception-nologin": "Не сте влезли в системата",
"yourname": "Потребителско име:",
"userlogin-yourname": "Потребителско име",
"userlogin-yourname-ph": "Въведете вашето потребителско име",
- "createacct-another-username-ph": "Ð\92Ñ\8aвежда Ñ\81е поÑ\82Ñ\80ебиÑ\82елÑ\81коÑ\82о име",
+ "createacct-another-username-ph": "Ð\92Ñ\8aведеÑ\82е поÑ\82Ñ\80ебиÑ\82елÑ\81ко име",
"yourpassword": "Парола:",
"userlogin-yourpassword": "Парола",
"userlogin-yourpassword-ph": "Въведете вашата парола",
"createacct-emailrequired": "Адрес за електронна поща",
"createacct-emailoptional": "Адрес за електронна поща (незадължително)",
"createacct-email-ph": "Въведете Вашия адрес за електронна поща",
- "createacct-another-email-ph": "Ð\92Ñ\8aвежда Ñ\81е електронна поща",
+ "createacct-another-email-ph": "Ð\92Ñ\8aведеÑ\82е електронна поща",
"createaccountmail": "Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу",
"createacct-realname": "Истинско име (незадължително)",
"createaccountreason": "Причина:",
"mediastatistics-table-mimetype": "MIME тип",
"mediastatistics-header-audio": "Аудио",
"mediastatistics-header-video": "Видео",
+ "mediastatistics-header-total": "Всички файлове",
"json-error-syntax": "Синтактична грешка",
"headline-anchor-title": "Препратка към този раздел",
"special-characters-group-latin": "Латиница",
"Ibrahim khashrowdi",
"Rachitrali",
"Mjbmr",
- "Macofe"
+ "Macofe",
+ "Hosseinblue"
]
},
"tog-underline": "لینکانی جهلگا خط کشیتین",
"allmessages-prefix": "فیلتر کورتین بئ اساس پدوند:",
"allmessages-language": "زبان:",
"allmessages-filter-submit": "برا",
- "allmessages-filter-translate": "ترجمه",
+ "allmessages-filter-translate": "چاوواشەکِردن زوون",
"thumbnail-more": "ٹُوه کورتین",
"filemissing": "فایل وجود نداریت",
"thumbnail_error": "خطا بئ ناحُنی ئی جۆڑ کورتین ئی وختا: $1",
"content-model-text": "text net",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
+ "content-model-json": "JSON",
"content-json-empty-object": "Objecte buit",
"content-json-empty-array": "Matriu buida",
"duplicate-args-warning": "<strong>Avís:</strong> [[:$1]] crida [[:$2]] amb més d'un valor pel paràmetre «$3». Només s'utilitzarà el darrer valor proporcionat.",
"foreign-structured-upload-form-label-infoform-date": "Data",
"foreign-structured-upload-form-label-not-own-work-local-local": "També podeu provar [[Special:Upload|la pàgina de càrrega per defecte]].",
"foreign-structured-upload-form-label-own-work-message-default": "Entenc que esteu carregant el fitxer en un repositori compartit. Confirmo que ho estic fent seguint les condicions d'ús i les polítiques de llicenciament que s'hi apliquen.",
+ "foreign-structured-upload-form-3-label-yes": "Sí",
+ "foreign-structured-upload-form-3-label-no": "No",
"backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
"backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
"backend-fail-notexists": "El fitxer $1 no existeix.",
"usereditcount": "$1 {{PLURAL:$1|modificació|modificacions}}",
"usercreated": "{{GENDER:$3|Creat}}: $1 a les $2",
"newpages": "Pàgines noves",
+ "newpages-submit": "Mostra",
"newpages-username": "Nom d'usuari:",
"ancientpages": "Pàgines més antigues",
"move": "Reanomena",
"specialloguserlabel": "Realitzador:",
"speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
"log": "Registres",
+ "logeventslist-submit": "Mostra",
"all-logs-page": "Tots els registres públics",
"alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).",
"logempty": "No hi ha cap coincidència en el registre.",
"cachedspecial-viewing-cached-ts": "Esteu veient una versió a la memòria cau de la pàgina, que podria no ser completament actual.",
"cachedspecial-refresh-now": "Mostra la darrera.",
"categories": "Categories",
+ "categories-submit": "Mostra",
"categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories sol·licitades]].",
"categoriesfrom": "Mostra les categories que comencen a:",
"special-categories-sort-count": "ordena per recompte",
"delete-confirm": "Elimina «$1»",
"delete-legend": "Elimina",
"historywarning": "<strong>Avís:</strong> la pàgina que esteu a punt d'eliminar té un historial amb $1 {{PLURAL:$1|revisió|revisions}}:",
+ "historyaction-submit": "Mostra",
"confirmdeletetext": "Esteu a punt d'esborrar de forma permanent una pàgina o imatge i tot el seu historial de la base de dades.\nConfirmeu que realment ho voleu fer, que enteneu les\nconseqüències, i que el que esteu fent està d'acord amb la [[{{MediaWiki:Policy-url}}|política]] del projecte.",
"actioncomplete": "Acció realitzada",
"actionfailed": "L'acció ha fallat",
"intentionallyblankpage": "Ena pel bi zanayişî weng mendo.",
"external_image_whitelist": " #no satır zey xo verde/raverde<pre>\n#parçeyê ifadeya rêzbiyayeyani (têna zerreyê ıney de // ) u çıtayo/çiyo zi mende cêr de têare kerê.\n#ney URL ya (hotlink) resmê teberi de hemcıta benî.\n#Ê yê ke hemcıt (eşleşmek-hemçift) biyê zey resımi asenî, eqsê hal de zi zey gıreyê resmi aseno.\nsatır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.\n#herfa gırd û qıci ferq nêkeno\n\n#parçeyê ifadeya rêzbiyayeyani bıerzê serê ney satıri. no satır zey xo verde/raverde </pre>",
"tags": "Etiketê vurnayîşê raştî",
- "tag-filter": "Avrêcê [[Special:Tags|Etiketi]]:",
+ "tag-filter": "Parzûnê [[Special:Tags|etiketi]]:",
"tag-filter-submit": "Avrêc",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2)",
"tags-title": "Etiketan",
"Babanwalia",
"Henares",
"MarcoAurelio",
- "Macofe"
+ "Macofe",
+ "Fitoschido"
]
},
"tog-underline": "Surrayal atihus:",
"wlheader-showupdated": "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
"wlnote": "Embahu {{PLURAL:$1|es el úrtimu chambu|son los úrtimus '''$1''' chambus}} enas úrtimas {{PLURAL:$2|oras|'''$2''' oras}}.",
"wlshowlast": "Muestral úrtimus $1 oras $2 dias",
+ "watchlistall2": "tó",
"watchlist-options": "Ocionis de la mi lista e seguimientu",
"watching": "Vehilandu...",
"unwatching": "Abaldonandu la vehiláncia en...",
"modifiedarticleprotection": "chambau el nivel de proteción a \"[[$1]]\"",
"unprotectedarticle": "\"[[$1]]\" esprotehiu",
"protect-title": "Estableciendu nivel de proteción pa \"$1\"",
- "prot_1movedto2": "[[$1]] s´á moviu a [[$2]]",
+ "prot_1movedto2": "[[$1]] s’á moviu a [[$2]]",
"protect-legend": "Confirmal proteción",
"protectcomment": "Razón:",
"protectexpiry": "Acabiha:",
"newtitle": "Nuevu entítulu:",
"move-watch": "Vehilal esta páhina",
"movepagebtn": "Movel páhina",
- "pagemovedsub": "S´á moviu la páhina",
+ "pagemovedsub": "S’á moviu la páhina",
"movepage-moved": "S'á muau '''\"$1\" a \"$2\"'''",
"movepage-moved-redirect": "Á siu criá una redireción.",
"articleexists": "Ya desisti una páhina con esi nombri u nu se premiti el nombri qu´as lihiu.\nPol favol, escrebi otru entítulu.",
"movelogpagetext": "Embahu ai una lista colas páhinas movias.",
"movereason": "Razón:",
"revertmove": "revertil",
- "delete_and_move": "Esborral i movel",
"delete_and_move_text": "==Es mestel esborral==\n\nYa desisti la páhina \"[[:$1]]\". Te petaria esborrala pa premitil el treslau?",
"delete_and_move_confirm": "Sí, esborral la páhina",
"delete_and_move_reason": "Esborrá pa premitil el treslau",
"undelete_short": "احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}",
"viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذفشده|$1 ویرایش حذفشده}}",
"protect": "محافظت",
- "protect_change": "تغییر",
+ "protect_change": "گؤەڕانن/تغییر",
"protectthispage": "محافظت از این صفحه",
- "unprotect": "تغییر محافظت",
+ "unprotect": "گؤەڕانن/تغییر محافظت",
"unprotectthispage": "تغییر محافظت این صفحه",
"newpage": "صفحهٔ تازه",
"talkpage": "بحث دربارهٔ این صفحه",
"php-mail-error-unknown": "خطای ناشناخته در تابع mail() پیاچپی",
"user-mail-no-addy": "تلاش برای ارسال ایمیل بدون آدرس ایمیل.",
"user-mail-no-body": "سعی کردید نامهای الکترونیکی با محتوایی بسیار کوتاه و یا خالی بفرستید.",
- "changepassword": "تغییر گذرواژه",
+ "changepassword": "گؤەڕانن/تغییر رمز",
"resetpass_announce": "شما باید برای پایان ورود به سامانه، گذرواژهٔ جدیدی را تنظیم کنید.",
"resetpass_text": "<!-- اینجا متن اضافه کنید -->",
"resetpass_header": "تغییر گذرواژهٔ حساب کاربری",
"revdelete-hide-comment": "خلاصهٔ ویرایش",
"revdelete-hide-user": "نام کاربری/نشانی آیپی",
"revdelete-hide-restricted": "فرونشانی اطلاعات برای مدیران به همراه دیگران",
- "revdelete-radio-same": "(بدون تغییر)",
+ "revdelete-radio-same": "(بدون گؤەڕانن/تغییر)",
"revdelete-radio-set": "پنهان",
"revdelete-radio-unset": "نمایان",
"revdelete-suppress": "از دسترسی مدیران به داده نیز مانند سایر کاربران جلوگیری به عمل آید.",
"revdelete-failure": "'''پیدایی نسخهها قابل به روز کردن نیست:'''\n$1",
"logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
"logdelete-failure": "'''پیدایی سیاههها قابل تنظیم نیست:'''\n$1",
- "revdel-restore": "تغییر پیدایی",
+ "revdel-restore": "گؤەڕانن/تغییر پیدایی",
"pagehist": "تاریخچهٔ صفحه",
"deletedhist": "تاریخچهٔ حذفشده",
"revdelete-hide-current": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، نسخهٔ اخیر است و قابل پنهان کردن نیست.",
"upload-form-label-select-file": "یک فایل انتخاب کنید",
"upload-form-label-infoform-title": "جزئیات",
"upload-form-label-infoform-name": "نام",
+ "upload-form-label-infoform-name-tooltip": "یک عنوان توضیحی برای پرونده که به عنوان نام پرونده استفاده میشود. ممکن است از زبان ساده همرا با فاصله استفاده شود. شامل پسوند پرونده نباشد.",
"upload-form-label-infoform-description": "توضیحات",
+ "upload-form-label-infoform-description-tooltip": "به صورت خلاصه هرچیز سرشناسی که در مورد اثر باشد را توضیح دهید.\nبرای تصویر موارد اصلی مانند محل وقوع یا موقعیت را شرح دهید.",
"upload-form-label-usage-title": "کاربرد",
"upload-form-label-usage-filename": "نام پرونده",
"foreign-structured-upload-form-label-own-work": "این کار خودم است",
"export-download": "ذخیره به صورت پرونده",
"export-templates": "شامل شدن الگوها",
"export-pagelinks": "شامل شدن صفحههای پیوند شده تا این عمق:",
+ "export-manual": "افزودن صفحات به صورت دستی:",
"allmessages": "پیغامهای سامانه",
"allmessagesname": "نام",
"allmessagesdefault": "متن پیشفرض پیغام",
"allmessagesnotsupportedDB": "این صفحه نمیتواند استفاده شود به این دلیل که <bdi>'''$wgUseDatabaseMessages'''</bdi> غیرفعال شدهاست.",
"allmessages-filter-legend": "پالایه",
"allmessages-filter": "پالودن بر اساس وضعیت شخصیسازی:",
- "allmessages-filter-unmodified": "تغییر نیافته",
+ "allmessages-filter-unmodified": "نەگؤەڕیائە/تغییرنیافتە",
"allmessages-filter-all": "همه",
"allmessages-filter-modified": "تغییر یافته",
"allmessages-prefix": "پالودن بر اساس پسوند:",
"expand_templates_preview": "پیشنمایش",
"expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
"expand_templates_preview_fail_html_anon": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
+ "expand_templates_input_missing": "شما نیازمندید که حداقل متنهایی را برای وارد کردن تهیه کنید.",
"pagelanguage": "صفحه انتخاب زبان",
"pagelang-name": "صفحه",
"pagelang-language": "زبان",
"upload-form-label-select-file": "Sélectionner un fichier",
"upload-form-label-infoform-title": "Détails",
"upload-form-label-infoform-name": "Nom",
+ "upload-form-label-infoform-name-tooltip": "Un titre descriptif unique pour le fichier, qui servira comme nom de fichier. Vous pouvez utiliser du langage courant avec des espaces. Ne pas inclure l’extension du fichier.",
"upload-form-label-infoform-description": "Description",
+ "upload-form-label-infoform-description-tooltip": "Décrire brièvement tout ce qu’il y a de particulier concernant cette œuvre.\nPour une photo, mentionner les choses principales qui sont vues, l’occasion, ou l’endroit.",
"upload-form-label-usage-title": "Utilisation",
"upload-form-label-usage-filename": "Nom du fichier",
"foreign-structured-upload-form-label-own-work": "Je suis l’auteur de cette œuvre",
"export-download": "Enregistrer dans un fichier",
"export-templates": "Inclure les modèles",
"export-pagelinks": "Inclure les pages liées à une profondeur de :",
+ "export-manual": "Ajouter des pages manuellement :",
"allmessages": "Messages système",
"allmessagesname": "Nom du message",
"allmessagesdefault": "Message par défaut",
"expand_templates_preview": "Aperçu du rendu",
"expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter.",
"expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
+ "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
"pagelanguage": "Sélecteur de langue de la page",
"pagelang-name": "Page",
"pagelang-language": "Langue",
"upload-form-label-select-file": "בחירת קובץ",
"upload-form-label-infoform-title": "פרטים",
"upload-form-label-infoform-name": "שם",
+ "upload-form-label-infoform-name-tooltip": "כותרת המהווה תיאור ייחודי לקובץ, שתשמש כשם הקובץ. ניתן להשתמש בשפה טבעית עם רווחים. אין לכלול סיומת קובץ.",
"upload-form-label-infoform-description": "תיאור",
+ "upload-form-label-infoform-description-tooltip": "תיאור קצר של כל העובדות החשובות על הקובץ.\nאם הקובץ הוא תמונה, יש לציין את הדברים העיקריים המתוארים בתמונה, את האירוע, או את המיקום.",
"upload-form-label-usage-title": "שימושים",
"upload-form-label-usage-filename": "שם הקובץ",
"foreign-structured-upload-form-label-own-work": "אני יצרתי את הקובץ",
"export-download": "שמירה כקובץ",
"export-templates": "לכלול תבניות",
"export-pagelinks": "לכלול דפים מקושרים עד לעומק של:",
+ "export-manual": "הוספה ידנית של דפים:",
"allmessages": "הודעות המערכת",
"allmessagesname": "שם",
"allmessagesdefault": "טקסט ברירת המחדל של ההודעה",
"expand_templates_preview": "תצוגה מקדימה",
"expand_templates_preview_fail_html": "<em>מכיוון שב{{GRAMMAR:תחילית|{{SITENAME}}}} מופעלת הצגת HTML גולמית ואירע אבדן מידע כניסה, התצוגה המקדימה מוסתרת, וזאת כאמצעי זהירות מפני התקפות JavaScript.</em>\n\n<strong>אם זה ניסיון תקין להציג תצוגה מקדימה, יש לנסות שוב.</strong>\nאם זה עדיין לא עובד, יש לנסות [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס שוב.",
"expand_templates_preview_fail_html_anon": "<em>מכיוון שב{{GRAMMAR:תחילית|{{SITENAME}}}} מופעלת הצגת HTML גולמית ולא נכנסת לחשבון, התצוגה המקדימה מוסתרת, וזאת כאמצעי זהירות מפני התקפות JavaScript.</em>\n\n<strong>אם זה ניסיון תקין להציג תצוגה מקדימה, יש [[Special:UserLogin|להיכנס לחשבון]] ולנסות שוב.</strong>",
+ "expand_templates_input_missing": "יש לכתוב טקסט (לפחות טקסט קצר).",
"pagelanguage": "בורר שפת הדף",
"pagelang-name": "דף",
"pagelang-language": "שפה",
"filehist-filesize": "Veličina datoteke",
"filehist-comment": "Komentar",
"imagelinks": "Upotreba datoteke",
- "linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedećih stranice povezuju}} na ovu datoteku:",
+ "linkstoimage": "{{PLURAL:$1|Sljedeća stranica povezuje|$1 sljedeće stranice povezuju|$1 sljedećih stranica povezuje}} na ovu datoteku:",
"linkstoimage-more": "Više od $1 {{PLURAL:$1|stranice povezuje|stranica povezuje}} na ovu datoteku.\nSljedeći popis prikazuje {{PLURAL:$1|stranice koje|prvih $1 stranica koje}} vode na ovu datoteku.\n[[Special:WhatLinksHere/$2|Ovdje se nalazi]] potpuni popis.",
"nolinkstoimage": "Nijedna stranica ne povezuje na ovu sliku.",
"morelinkstoimage": "Pogledaj [[Special:WhatLinksHere/$1|više poveznica]] za ovu datoteku.",
"permalink": "Hivatkozás erre a változatra",
"print": "Nyomtatás",
"view": "Olvasás",
- "view-foreign": "Megtekintés ezen: $1",
+ "view-foreign": "Megtekintés itt: $1",
"edit": "Szerkesztés",
"edit-local": "Helyi leírás szerkesztése",
"create": "Létrehozás",
"whatlinkshere-hidelinks": "linkek $1",
"whatlinkshere-hideimages": "fájlhivatkozások $1",
"whatlinkshere-filters": "Elemek szűrése",
+ "whatlinkshere-submit": "Indítás",
"autoblockid": "$1. autoblokk",
"block": "Felhasználó blokkolása",
"unblock": "Felhasználó blokkolásának feloldása",
"Ilham",
"Matma Rex",
"WongKentir",
- "Rachmat.Wahidi"
+ "Rachmat.Wahidi",
+ "Arief"
]
},
"tog-underline": "Garis bawahi pranala:",
"passwordreset-emailtext-ip": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat\ndetail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut\nterkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
"passwordreset-emailtext-user": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat detail akun untuk {{SITENAME}} ($4).\n{{PLURAL:$3|Akun|Akun-akun}} berikut terkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
"passwordreset-emailelement": "Nama pengguna: \n$1\n\nSandi sementara: \n$2",
- "passwordreset-emailsent": "Surel setel ulang kata sandi telah dikirimkan.",
+ "passwordreset-emailsentemail": "Surel setel ulang kata sandi telah dikirimkan.",
"passwordreset-emailsent-capture": "Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.",
"passwordreset-emailerror-capture": "Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1",
"changeemail": "Ubah alamat surel",
"prefs-help-prefershttps": "Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.",
"prefswarning-warning": "Perubahan preferensi anda belum tersimpan. Apabila anda meninggalkan halaman ini tanpa men-klik \"$1\" preferensi anda tidak akan diperbarui.",
"prefs-tabs-navigation-hint": "Tip: Anda dapat menggunakan tombol panah kiri dan kanan untuk bernavigasi antartab di dalam daftar tab.",
- "email-address-validity-valid": "Alamat surel tampaknya sah",
- "email-address-validity-invalid": "Masukkan alamat surel yang sah",
"userrights": "Manajemen hak pengguna",
"userrights-lookup-user": "Mengatur kelompok pengguna",
"userrights-user-editname": "Masukkan nama pengguna:",
"upload-form-label-select-file": "Pilih berkas",
"upload-form-label-infoform-title": "Rincian",
"upload-form-label-infoform-name": "Nama",
+ "upload-form-label-infoform-name-tooltip": "Judul singkat yang unik untuk berkas, yang akan menjadi nama berkas. Anda dapat gunakan bahasa yang sederhana berikut spasi. Jangan menyertakan ekstensi berkas.",
"upload-form-label-infoform-description": "Deskripsi",
+ "upload-form-label-infoform-description-tooltip": "Jelaskan dengan singkat hal-hal penting tentang karya ini.\nUntuk foto, sebutkan hal-hal utama yang ditampilkan, kesempatan atau tempat yang ditampilkan di foto.",
"upload-form-label-usage-title": "Penggunaan",
"upload-form-label-usage-filename": "Nama berkas",
"foreign-structured-upload-form-label-own-work": "Ini adalah karya saya sendiri",
"movenosubpage": "Halaman ini tak memiliki subhalaman.",
"movereason": "Alasan:",
"revertmove": "batalkan",
- "delete_and_move": "Hapus dan pindahkan",
"delete_and_move_text": "==Penghapusan diperlukan==\nHalaman yang dituju, \"[[:$1]]\", telah mempunyai isi. Apakah Anda hendak menghapusnya untuk memberikan ruang bagi pemindahan?",
"delete_and_move_confirm": "Ya, hapus halaman tersebut",
"delete_and_move_reason": "Dihapus untuk mengantisipasikan pemindahan halaman dari \"[[$1]]\"",
"mediastatistics": "Statistik media",
"mediastatistics-summary": "Statistik mengenai jenis berkas yang diunggah. Hanya mencakup versi terbaru dari berkas. Berkas lama dan berkas yang sudah dihapus tidak termasuk.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 bita}} ($2; $3%)",
+ "mediastatistics-bytespertype": "Total ukuran file untuk bagian ini: {{PLURAL: $ 1 | $ 1 byte | $ 1 byte}} ($ 2; $ 3%).",
+ "mediastatistics-allbytes": "Total ukuran untuk semua file: {{PLURAL: $ 1 | $ 1 byte | $ 1 byte}} ($ 2).",
"mediastatistics-table-mimetype": "Tipe MIME",
"mediastatistics-table-extensions": "Ekstensi",
"mediastatistics-table-count": "Jumlah file",
"laggedslavemode": "<strong>Ballaag:</strong> Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
"readonly": "Narikepan ti database",
"enterlockreason": "Agikabil ti rason para iti pannakarikep, mangiraman ti maysa a karkulo no kaanonto a malukatan",
- "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
+ "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
"missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
"missingarticle-rev": "(rebision#: $1)",
"missingarticle-diff": "(Dip: $1, $2)",
"mypreferencesprotected": "Awan pammalubosmo nga agurnos kadagiti kakaykayatam.",
"ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
"titleprotected": "Daytoy a titulo ket nasalakniban manipud iti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
- "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ta ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
+ "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ta ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador ti sistema a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
"invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken teksto \"$3\"",
"invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken teksto \"$2\"",
"exception-nologin": "Saan a nakastrek",
"passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
"passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
"passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
- "passwordreset-emailsent": "No daytoy ket nairehistro nga adres ti esurat para iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
+ "passwordreset-emailsentemail": "No daytoy nga adres ti esurat ket mainaig iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
"passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
"passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
"changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
"copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
"editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
"longpageerror": "<strong>Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
- "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
+ "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
"protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
"semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
"cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
"permissionserrors": "Biddut ti pammalubos",
"permissionserrorstext": "Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:",
"permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
- "contentmodelediterror": "Saanmo a maurnos daytoy a rebision gapu ta ti modelo ti linaon ket <code>$1</code>, ken ti agdama a linaon ti panid ket <code>$2</code>.",
+ "contentmodelediterror": "Saanmo a maurnos daytoy a rebision gapu ta ti modelo ti linaon ket <code>$1</code>, a maigiddiat manipud iti agdama a modelo ti linaon ti panid ti <code>$2</code>.",
"recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
"moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
"moveddeleted-notice-recent": "Pasensian, daytoy a panid ket kaik-ikkat idi (iti kaunegan dagiti 24 nga oras).\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
"prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
"prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
"prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
- "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umisu",
- "email-address-validity-invalid": "Ikabil ti umisu nga esurat a pagtaengan",
"userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
"userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
"userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
"recentchanges-label-plusminus": "Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte",
"recentchanges-legend-heading": "'''Leyenda:'''",
"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
+ "recentchanges-submit": "Ipakita",
"rcnotefrom": "Dita baba ket {{PLURAL:$5|ti sinukatan|dagiti sinukatan}} manipud idi <strong>$3, $4</strong> (aginggana iti <strong>$1</strong> a naipakita).",
"rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $2, $3",
"rcshowhideminor": "$1 dagiti bassit a panagurnos",
"foreign-structured-upload-form-label-own-work": "Daytoy ket bukodko nga obra",
"foreign-structured-upload-form-label-infoform-categories": "Katkategoria",
"foreign-structured-upload-form-label-infoform-date": "Petsa",
+ "foreign-structured-upload-form-3-label-yes": "Wen",
+ "foreign-structured-upload-form-3-label-no": "Saan",
"backend-fail-stream": "Saan a maipan ti papeles $1.",
"backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
"backend-fail-notexists": "Awan ti papeles ti $1.",
"mostrevisions": "Dagiti panid a kaaduan kadagiti rebision",
"prefixindex": "Amin a pampanid nga addaan iti pasakbay",
"prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
+ "prefixindex-submit": "Ipakita",
"prefixindex-strip": "Ikkaten ti pasakbay iti listaan",
"shortpages": "Dagiti ababa a panid",
"longpages": "Dagiti atiddog a panid",
"protectedpages-performer": "Nangsalaknib nga agar-aramat",
"protectedpages-params": "Dagiti parametro ti panagsalaknib",
"protectedpages-reason": "Rason",
+ "protectedpages-submit": "Ipakita dagiti panid",
"protectedpages-unknown-timestamp": "Di ammo",
"protectedpages-unknown-performer": "Di ammo nga agar-aramat",
"protectedtitles": "Dagiti nasalakniban a titulo",
"protectedtitles-summary": "Daytoy a panid ket ilistana dagiti titulo nga agdama a nasalakniban manipud ti pannakapartuat. Para iti listaan dagiti adda a panid a nasalakniban, kitaen ti [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]..",
"protectedtitlesempty": "Awan dagiti titulo nga agdama a nasalakniban kadagitoy a parametro.",
+ "protectedtitles-submit": "Ipakita dagiti titulo",
"listusers": "Listaan ti agar-aramat",
"listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga addaan kadagiti inurnos",
"listusers-creationsort": "Ilasin babaen ti petsa a pannakapartuat",
"usereditcount": "$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}",
"usercreated": "{{GENDER:$3|Pinartuat}} idi $1, $2",
"newpages": "Baro a pampanid",
+ "newpages-submit": "Ipakita",
"newpages-username": "Nagan ti agar-aramat:",
"ancientpages": "Dagiti kadaanan a panid",
"move": "Iyalis",
"specialloguserlabel": "Nangitungpal:",
"speciallogtitlelabel": "Puntaan (titulo wenno {{ns:user}}:nagan ti agar-aramat para iti agar-aramat):",
"log": "Dagiti listaan",
+ "logeventslist-submit": "Ipakita",
"all-logs-page": "Amin a listaan a publiko",
"alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
"logempty": "Awan dagiti maipada a banag iti listaan.",
"cachedspecial-viewing-cached-ts": "Kitkitaem ti maysa a naidulin a bersion iti daytoy a panid, a mabalin daytoy a saan a kompleto nga agpayso.",
"cachedspecial-refresh-now": "Kitaen ti kinaudian.",
"categories": "Katkategoria",
+ "categories-submit": "Ipakita",
"categoriespagetext": "Ti sumaganad a {{PLURAL:$1|kategoria ket aglaon|katkategoria ket aglaon}} kadagiti panid wenno midia.\n[[Special:UnusedCategories|Dagiti saan a nausar a kategoria]] ket saan a maiparang ditoy.\nKitaen met [[Special:WantedCategories|dagiti makiddaw a kategoria]].",
"categoriesfrom": "Ipakita dagiti kategoria a mangrugi iti:",
"special-categories-sort-count": "ilasin babaen ti bilang",
"activeusers-hidebots": "Ilemmeng dagiti bot",
"activeusers-hidesysops": "Ilemmeng dagiti administrador",
"activeusers-noresult": "Awan ti nasarakan nga agar-aramat.",
+ "activeusers-submit": "Ipakita dagiti aktibo nga agar-aramat",
"listgrouprights": "Dagiti karbengan ti grupo ti agar-aramat",
"listgrouprights-summary": "Dagiti sumaganad a listaan ti grupo ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti mainaig a karbengan ti panagserrekda.\nAdda pay mabalin nga [[{{MediaWiki:Listgrouprights-helppage}}|adu a pakaammo]] a maipanggep kadagiti kabukbuodan a karbengan.",
"listgrouprights-key": "Leyenda: \n* <span class=\"listgrouprights-granted\">Naited a karbengan</span> \n* <span class=\"listgrouprights-revoked\">Naukas a karbengan</span>",
"wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw",
"watchlistall2": "amin",
"watchlist-hide": "Ilemmeng",
- "wlshowtime": "Ipakita ti naudi:",
+ "watchlist-submit": "Ipakita",
+ "wlshowtime": "Ipakita a paset ti panawen:",
"wlshowhideminor": "dagiti bassit a panagurnos",
"wlshowhidebots": "dagiti bot",
"wlshowhideliu": "dagiti nakarehistro nga agar-aramat",
"wlshowhideanons": "dagiti di ammo nga agar-aramat",
"wlshowhidepatr": "dagiti napatrulian a panagurnos",
"wlshowhidemine": "dagiti inurnosko",
+ "wlshowhidecategorization": "pannakaikategoria ti panid",
"watchlist-options": "Dagiti pagpilian ti listaan a bambantayan",
"watching": "Bambantayan...",
"unwatching": "Saanen a bantayan...",
"delete-confirm": "Ikkaten ti \"$1\"",
"delete-legend": "Ikkaten",
"historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna iti $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
+ "historyaction-submit": "Ipakita",
"confirmdeletetext": "Mangrugrugika a mangikkat iti maysa a panid a kakuyog amin ti pakasaritaanna.\nPangngaasi a pasingkedam a naikeddeng a kayatmo nga aramiden daytoy, a maawatam ti pagbnagan ti panangikkatmo, ken aramidem daytoy a kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
"actioncomplete": "Nalpasen ti aramid",
"actionfailed": "Napaay ti aramid",
"whatlinkshere-hidelinks": "$1 dagiti silpo",
"whatlinkshere-hideimages": "$1 dagiti silpo ti papeles",
"whatlinkshere-filters": "Dagiti sagat",
+ "whatlinkshere-submit": "Inkan",
"autoblockid": "Auto a panagserra #$1",
"block": "Seraan ti agar-aramat",
"unblock": "Ikkaten ti serra ti agar-aramat",
"move-page-legend": "Iyalis ti panid",
"movepagetext": "Ti panagusar ti porma dita baba, ket mangnagan manen ti panid, a mangiyalis amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin a baw-ing a panid iti baro a titulo.\nMapabarom a kas automatiko dagiti baw-ing a nakatudo dita kasisigud a titulo.\nNo agpilika a saanmo a kayat, siguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRenbbengmo ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no ti kinaudi ket maysa a baw-ing ken awan ti napalabas a pakasaritaan ti panag-urnos. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saan mo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim a pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
"movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nPasaruduam a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addan sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Ballaag!</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
- "movepagetalktext": "Ti mainaig a tungtungan ti panid ket automatikonto a maiyalis a karamanna <strong>malaksid:</strong>\n*Ti addan ti awan linaon a tungtungan ti panid babaen ti baro a nagan, wenno\n*No ikkatem ti kur-itna ti kahon iti baba.\n\nKadagitoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
+ "movepagetalktext": "No kur-item daytoy a kahon, automatikonto a maiyalis ti mainaig a tungtungan a panid, malaksid no addanto idiay iti adda linaon a tungtungan a panid.\n\nIti daytoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
"moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
"movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
"movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
"export-download": "Idulin a kas papeles",
"export-templates": "Mangiraman kadagiti plantilia",
"export-pagelinks": "Mangiraman kadagiti nakasilpo a panid iti kauneg iti:",
+ "export-manual": "Manual nga inayon dagiti panid:",
"allmessages": "Dagiti mensahe ti sistema",
"allmessagesname": "Nagan",
"allmessagesdefault": "Kasisigud a testo ti mensahe",
"exif-compression-1": "Saan a napespes",
"exif-copyrighted-true": "Nakarbengan ti kopia",
"exif-copyrighted-false": "Saan a naisaad ti kasasaad ti karbengan ti kopia",
+ "exif-photometricinterpretation-1": "Nangisit ken puraw (Ti nangisit ket 0)",
"exif-unknowndate": "Di ammo a petsa",
"exif-orientation-1": "Kadawyan",
"exif-orientation-2": "Horisontal a binaliktad",
"pagelang-language": "Pagsasao",
"pagelang-use-default": "Usaren ti kasisigud a pagsasao",
"pagelang-select-lang": "Agpili iti pagsasao",
+ "pagelang-submit": "Ited",
"right-pagelang": "Baliwan ti pagsasao ti panid",
"action-pagelang": "baliwan ti pagsasao ti panid",
"log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
"mediastatistics-header-video": "Dagiti video",
"mediastatistics-header-office": "Opisina",
"mediastatistics-header-text": "Tekstual",
+ "mediastatistics-header-total": "Amin a papeles",
"json-error-unknown": "Adda idi parikut ti JSON. Biddut: $1",
"json-error-state-mismatch": "Imbalido wenno nadadael a JSON",
"json-error-syntax": "Biddut ti sintaksis",
"upload-form-label-select-file": "Seleziona file",
"upload-form-label-infoform-title": "Dettagli",
"upload-form-label-infoform-name": "Nome",
+ "upload-form-label-infoform-name-tooltip": "Un titolo breve e distintivo per il file, che verrà utilizzato come suo nome. Puoi usare un linguaggio semplice con spazi. Non includere l'estensione del file.",
"upload-form-label-infoform-description": "Descrizione",
+ "upload-form-label-infoform-description-tooltip": "Descrivi sinteticamente tutto quanto sia degno di nota a proposito di quest'opera.\nPer le foto, indica le cose principali che vi sono rappresentate, l'occasione e/o il luogo in cui sono state scattate.",
"upload-form-label-usage-title": "Utilizzo",
"upload-form-label-usage-filename": "Nome del file",
"foreign-structured-upload-form-label-own-work": "Questo è un mio lavoro",
"export-download": "Richiedi il salvataggio come file",
"export-templates": "Includi i template",
"export-pagelinks": "Includi pagine correlate ad una profondità di:",
+ "export-manual": "Aggiungi pagine manualmente:",
"allmessages": "Messaggi di sistema",
"allmessagesname": "Nome",
"allmessagesdefault": "Testo predefinito",
"expand_templates_preview": "Anteprima",
"expand_templates_preview_fail_html": "<em>Dato che {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta per precauzione contro gli attacchi a JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe comunque non dovesse funzionare, prova ad [[Special:UserLogout|uscire]] ed a rientrare.",
"expand_templates_preview_fail_html_anon": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e non hai effettuato l'accesso, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, [[Special:UserLogin|entra]] e riprova.</strong>",
+ "expand_templates_input_missing": "Devi inserire del testo come input.",
"pagelanguage": "Seleziona lingua della pagina",
"pagelang-name": "Pagina",
"pagelang-language": "Lingua",
"upload-form-label-select-file": "ファイル選択",
"upload-form-label-infoform-title": "詳細",
"upload-form-label-infoform-name": "名前",
+ "upload-form-label-infoform-name-tooltip": "ファイル固有の説明的な表題。ファイル名として使われます。平易な言葉を使い、空白を入れることができます。拡張子は含めないでください。",
"upload-form-label-infoform-description": "説明",
+ "upload-form-label-infoform-description-tooltip": "この作品に対して特筆すべきことをすべて説明します。\n写真であれば、主に何が写っているのか、いつ、どこで撮ったものなのかについて述べてください。",
"upload-form-label-usage-title": "使用法",
"upload-form-label-usage-filename": "ファイル名",
"foreign-structured-upload-form-label-own-work": "これはあなた自身による作業です",
"expand_templates_preview": "プレビュー",
"expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]して再度ログインしてみてください。",
"expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ではHTMLソースが有効になっており、ログインしていないため、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、[[Special:UserLogin|ログイン]]してもう一度試してください。</strong>",
+ "expand_templates_input_missing": "文章を入力してください。",
"pagelanguage": "ページ言語選択",
"pagelang-name": "ページ",
"pagelang-language": "言語",
"session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>Сондықтан {{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз.</strong> \nЕгер бұл әлі істемесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
"token_suffix_mismatch": "<strong>Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.</strong>\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.",
"edit_form_incomplete": "<strong>Өңдеу пішінінің кейбір бөліктері серверге жетпеді; өңдемелеріңіздің бұзылмағандығына екі рет бақылау жүргізіңіз және қайта байқап көріңіз.</strong>",
- "editing": "Өңдеп жатырсыз:",
+ "editing": "Өңдеп жатырсыз: $1",
"creating": "Жаңадан бастау: $1",
- "editingsection": "$1 бетінің бөлімін өңдеп жатырсыз",
- "editingcomment": "$1 бетін өңдеп жатырсыз (жаңа бөлім)",
+ "editingsection": "Өңдеп жатырсыз: $1 бетінің бөлімі",
+ "editingcomment": "Өңдеп жатырсыз: $1 (жаңа бөлім)",
"editconflict": "Өңдемелер қақтығысы: $1",
"explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
"yourtext": "Мәтініңіз",
"tog-hideminor": "Celare recensiones minores in indice nuper mutatorum",
"tog-hidepatrolled": "Redactiones censae inter nuper mutatas celandae",
"tog-newpageshidepatrolled": "Paginae censae inter nouissime creatas celandae",
- "tog-extendwatchlist": "Extendere indicem paginarum observatarum ut omnes emendationes monstrentur, non solum emendationes recentissimae",
+ "tog-extendwatchlist": "In indice paginarum observatarum omnes, non solum recentissimas mutationes ostendere",
"tog-usenewrc": "Indice nuper mutatarum excelsa uti",
"tog-numberheadings": "Subtituli numeris adornandi",
"tog-showtoolbar": "Affigere trabem redigentem",
"tog-editondblclick": "Percussus duplex redactionem hortetur",
"tog-editsectiononrightclick": "Paginarum segmenta dextero percussu in titulis redigenda",
- "tog-watchcreations": "Paginas quas creo et fasciculos quos impono in paginarum observatarum indicem addere",
- "tog-watchdefault": "Paginas et fasciculos quos recenseo in paginarum observatarum indicem addere",
- "tog-watchmoves": "Paginas et fasciculos quos moveo in paginarum observatarum indicem addere",
+ "tog-watchcreations": "Paginas, quas creavero, et fasciculos, quos imposuero, observare",
+ "tog-watchdefault": "Paginas et fasciculos, quos recensuero, observare",
+ "tog-watchmoves": "Paginas et fasciculos, quos movero, observare",
"tog-watchdeletion": "Paginas et fasciculos quos deleo in paginarum observatarum indicem addere",
"tog-minordefault": "Notare omnes recensiones quasi minores",
"tog-previewontop": "Monstrare praevisum ante capsam recensiti, non post ipsam",
"tog-previewonfirst": "Praevisum monstrare recensione incipiente",
- "tog-enotifwatchlistpages": "Mittere mihi litteras electronicas si pagina a me observata vel fasciculus a me observatus mutatur",
- "tog-enotifusertalkpages": "Mittere mihi litteras electronicas si mea disputatio mutatur",
- "tog-enotifminoredits": "Mittere mihi litteras electronicas etiam pro recensionibus minoribus",
- "tog-enotifrevealaddr": "Monstrare inscriptio mea electronica in nuntiis notificantibus",
+ "tog-enotifwatchlistpages": "Mutata vel pagina vel fasciculo observando certior fiam",
+ "tog-enotifusertalkpages": "De mutata disputationis pagina mea certior fiam",
+ "tog-enotifminoredits": "Etiam de minoribus recensionibus certior fiam",
+ "tog-enotifrevealaddr": "Ostendatur inscriptio mea electronica in nuntiis notificantibus",
"tog-shownumberswatching": "Numerum usorum observantium monstrare",
"tog-oldsig": "Subscriptio, qua nunc uteris:",
"tog-fancysig": "Subscriptio vicitext (sine nexu automatico)",
"tog-uselivepreview": "Praevisum viventem adhibere",
"tog-forceeditsummary": "Si recensionem non summatim descripsero, me roga si continuare velim",
- "tog-watchlisthideown": "Celare recensiones meas in paginarum observatarum indice",
- "tog-watchlisthidebots": "Celare recensiones automatarias in paginarum observatarum indice",
- "tog-watchlisthideminor": "Celare recensiones minores in paginarum observatarum indice",
- "tog-watchlisthideliu": "Celare recensiones usorum notorum in paginarum observatarum indice",
- "tog-watchlisthideanons": "Celare recensiones usorum ignotorum in paginarum observatarum indice",
- "tog-watchlisthidepatrolled": "Recensiones vigilatae paginas custoditas celare",
- "tog-ccmeonemails": "Mitte mihi transcriptiones litterarum quas ad alios usores mitto",
+ "tog-watchlisthideown": "Recensiones meas in paginarum observatarum indice supprimere",
+ "tog-watchlisthidebots": "Recensiones per automaton factas in paginarum observatarum indice supprimere",
+ "tog-watchlisthideminor": "Minores recensiones in paginarum observatarum indice supprimere",
+ "tog-watchlisthideliu": "Recensiones ab usoribus notis factas in paginarum observatarum indice supprimere",
+ "tog-watchlistreloadautomatically": "Quamprimum aliquis selectus mutatus erit, indicem paginarum observatarum reficere (JavaScript required)",
+ "tog-watchlisthideanons": "Recensiones ab usoribus ignotis factas in paginarum observatarum indice supprimere",
+ "tog-watchlisthidepatrolled": "Recensiones custoditarum paginarum supprimere",
+ "tog-ccmeonemails": "Transcriptiones earum, quas ad alios usores misero litteras, mihi ipsi mittantur",
"tog-diffonly": "Nihil nisi differentiam in pagina factam ostendatur",
"tog-showhiddencats": "Categorias celatas monstrare",
"tog-norollbackdiff": "Post reversionem paginae differentia neglegatur",
"noemail": "Nulla inscriptio electronica invenitur per usorem \"$1\".",
"mailerror": "Error in litteras electronicas inmittendas: $1",
"acct_creation_throttle_hit": "His superioribus 24 horis ex isto loco IP iam {{PLURAL:$1|nomen impositum est|$1 nomina imposita sunt}}.\nNon autem licet plura sibi imponere. Igitur hodie ex hoc loco IP cetera nomina tibi non imponi possunt.",
- "emailauthenticated": "Tua inscriptio electronica recognita est $3, $2.",
+ "emailauthenticated": "Inscriptio tua electronica recognita est $3, $2.",
"emailconfirmlink": "Inscriptionem tuam electronicam adfirmare",
"emaildisabled": "Huic paginae litteras electronicas mittere non licet.",
"accountcreated": "Nomen impositum",
"last": "prox",
"page_first": "prim",
"page_last": "ult",
- "histlegend": "Selige pro dissimilitudine: indica emendationes in botones radiales et \"intrare\" in claviatura vel \"comparatio\" imprime ut conferas.<br />\nTitulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,\n'''({{int:last}})''' = dissimilis ab emendatione proxima, '''{{int:minoreditletter}}''' = recensio minor.",
+ "histlegend": "Ad seligendas differentias nota diversarum redactionum bullas et agi iube!<br />\nLegenda: '''({{int:cur}})''' = differentiam monstrabit inter hanc et novissimam redactionem,\n'''({{int:last}})''' = differentiam monstrabit inter hanc et superiorem redactionem,\n'''({{int:minoreditletter}})''' = recensio minor.",
"history-fieldset-title": "Quaerere in paginae historia",
"history-show-deleted": "Solum recensiones deletas monstrare",
"histfirst": "veterrima",
"revertmerge": "Inconfundere",
"history-title": "Historia paginae \"$1\"",
"lineno": "Linea $1:",
- "compareselectedversions": "Conferre emendationes selectas",
+ "compareselectedversions": "Redactiones selectas conferre",
"showhideselectedversions": "Monstrare/celare emendationes selectas",
"editundo": "abrogare",
"diff-empty": "(eadem)",
"skin-preview": "Praevisum",
"datedefault": "Nullum praeferentiae",
"prefs-user-pages": "Paginae usoris",
- "prefs-personal": "Minutiae rationis",
+ "prefs-personal": "Proprietates",
"prefs-rc": "Nuper mutata",
"prefs-watchlist": "Paginae observatae",
"prefs-watchlist-days": "Numerus dierum displicandus in paginis tuis observatis:",
"prefs-watchlist-edits-max": "Numerus maximus: 1000",
"prefs-misc": "Misc",
"prefs-resetpass": "Tesseram mutare",
- "prefs-email": "Optiones inscriptionis electronicae",
+ "prefs-email": "Modi de inscriptione electronica servandi",
"prefs-rendering": "Conspectus",
"saveprefs": "Servare praeferentias",
"prefs-editing": "Mensura capsae verbi",
"timezoneregion-europe": "Europa",
"timezoneregion-indian": "Oceanus Indicus",
"timezoneregion-pacific": "Oceanus Pacificus",
- "allowemail": "Sinere litteras electronicas inscriptioni electronicae meae mittere",
+ "allowemail": "Aliis usoribus concedere, ut litteras electronicas mittant",
"prefs-searchoptions": "Quaerere",
"prefs-namespaces": "Spatia nominalia",
"default": "praedeterminatum",
"prefs-emailconfirm-label": "Adfirmatio inscriptionis electronicae:",
"youremail": "Inscriptio electronica:",
"username": "Nomen usoris:",
+ "prefs-memberingroups": "{{PLURAL:$1|Categoria, cui|Categoriae, quibus}} $2 attribuitur:",
"prefs-registration": "Tempus, quo nomen impositum est:",
"yourrealname": "Nomen verum:",
"yourlanguage": "Lingua:",
"yourvariant": "Differentia linguae contentorum:",
"yournick": "Subscriptio nova:",
- "prefs-help-signature": "Cum in paginis disputationum scribas, \"<nowiki>~~~~</nowiki>\" conscribe, quod in subscriptionem tuam et indicationem temporis convertetur.",
+ "prefs-help-signature": "Commentationibus ad quanque disputationem factis ne subscribe nisi quater undulam (<nowiki>~</nowiki>) ponens! Quae quatuor undulae (<nowiki>~~~~</nowiki>) automatice in subscriptionem tuam et tempus subscribendi convertentur.",
"badsig": "Subscriptio cruda non est valida; scrutina affixa HTML.",
"badsiglength": "Subscriptio tua nimis longa est.\n{{PLURAL:$1|Una littera est|$1 litterae sunt}} longitudo maxima.",
"yourgender": "Sexus:",
"gender-unknown": "Indefinitus",
"gender-male": "masculinus",
"gender-female": "femininus",
+ "prefs-help-gender": "Liber vel libera es istum delectum habere.\nQuodsi feceris, programma eo utetur ad te rite iuxta genus tuum aut appellandum aut appellandam.\nQuod datum ab omnibus videbitur.",
"email": "Litterae electronicae",
"prefs-help-realname": "Nomen verum non necesse est.\nSi vis id dare, opera tua tibi ascribentur.",
- "prefs-help-email": "Non necesse est inscriptionem electronicam dare. Qua tamen data licebit tibi tesseram novam tribuere, si eius oblitus eris.",
- "prefs-help-email-others": "Si vis, sinit etiam aliis tecum loqui per tuam paginam usoris vel disputationis, nisi te reveles.",
+ "prefs-help-email": "Non necesse est inscriptionem electronicam dare. Qua tamen data tessera tibi tribui poterit nova, si prioris oblitus eris.",
+ "prefs-help-email-others": "Praeterea, si libeat, aliis concedas tibi nuntia per nexum in pagina vel disputatione tua positum mitttere electronicas.\nInscriptio tua electronica usoribus tibi scribentis non erit visibilis.",
"prefs-help-email-required": "Inscriptio electronica necesse est.",
"prefs-info": "Generalia",
"prefs-i18n": "Sermonis delectus",
"prefs-signature": "Subscriptio",
"prefs-preview": "Praevisum",
- "prefs-advancedwatchlist": "Praeferentiae monstrare",
+ "prefs-advancedwatchlist": "Indicis modi speciales",
"prefs-displayrc": "Praeferentiae vultus",
"prefs-displaywatchlist": "Praeferentiae vultus",
"prefs-diffs": "Differentiae",
"userrights-unchangeable-col": "Greges quos tibi non oportet mutare",
"group": "Grex:",
"group-user": "Usores",
- "group-autoconfirmed": "Usores adfirmati automaticale",
+ "group-autoconfirmed": "Usores automatice confirmati",
"group-bot": "Automata",
"group-sysop": "Magistratus",
"group-bureaucrat": "Grapheocrates",
"group-suppress": "Censurae",
"group-all": "(omnes)",
"group-user-member": "{{GENDER:$1|Usor}}",
- "group-autoconfirmed-member": "{{GENDER:$1|Usor adfirmatus automaticale}}",
+ "group-autoconfirmed-member": "{{GENDER:$1|Usor automatice confirmatus}}",
"group-bot-member": "{{GENDER:$1|Automaton}}",
"group-sysop-member": "{{GENDER:$1|Magistratus}}",
"group-bureaucrat-member": "{{GENDER:$1|Grapheocrates}}",
"group-suppress-member": "{{GENDER:$1|Censura}}",
"grouppage-user": "{{ns:project}}:Usores",
- "grouppage-autoconfirmed": "{{ns:project}}:Usores adfirmati automaticale",
+ "grouppage-autoconfirmed": "{{ns:project}}:Usores automatice confirmati",
"grouppage-bot": "{{ns:project}}:Automata",
"grouppage-sysop": "{{ns:project}}:Magistratus",
"grouppage-bureaucrat": "{{ns:project}}:Grapheocrates",
"movethispage": "Movere hanc paginam",
"notargettitle": "Nullus scopus",
"notargettext": "Paginam aut usorem non notavisti.",
- "pager-newer-n": "{{PLURAL:$1|novior 1|noviores $1}}",
- "pager-older-n": "{{PLURAL:$1|senior 1|seniores $1}}",
+ "pager-newer-n": "{{PLURAL:$1|recentiorem 1|recentiores $1}}",
+ "pager-older-n": "{{PLURAL:$1|superiorem 1|superiores $1}}",
"suppress": "Censura",
"booksources": "Librorum fontes",
"booksources-search-legend": "Fontes impressas quaerere",
"notvisiblerev": "Emendatio deleta est",
"watchlist-details": "{{PLURAL:$1|$1 paginam|$1 paginas}} observas.",
"wlheader-enotif": "Mutationes si quae factae erunt, electronice tibi nuntiabuntur.",
- "wlheader-showupdated": "Paginae nondum a te inspectae typis <strong>crassioribus</strong> ostenduntur.",
+ "wlheader-showupdated": "Paginae nondum a te inspectae <strong>typis crassioribus</strong> ostenduntur.",
"wlnote": "{{PLURAL:$1|Indicatur mutatio novissima|Indicantur '''$1''' mutationes novissimae}} abhinc {{PLURAL:$2|superiorem horam|superiores '''$2''' horas}} (ab $3, $4) factae.",
"wlshowlast": "Monstrare proximas $1 horas $2 dies",
"watchlistall2": "omnes",
"contributions-title": "Conlationes usoris $1",
"mycontris": "Conlationes",
"anoncontribs": "Conlationes",
- "contribsub2": "Pro $1 ($2)",
+ "contribsub2": "factae ab usore \"$1\" ($2)",
"nocontribs": "Nullae mutationes inventae sunt ex his indiciis.",
"uctop": "(vertex)",
"month": "Ab mense (et prior):",
"tooltip-save": "Servare mutationes tuas",
"tooltip-preview": "Praevidere mutationes tuas, quaesumus hoc utere antequam servas!",
"tooltip-diff": "Monstrare mutationes textui tuas",
- "tooltip-compareselectedversions": "Inspicere, quantum contenta inter versiones selectas distent",
+ "tooltip-compareselectedversions": "Inspicere, quatenus contenta redactionum selectarum inter se distent",
"tooltip-watch": "Addere hanc paginam tuis paginis observatis",
"tooltip-recreate": "Recreare hanc paginam etiamsi deleta est",
"tooltip-upload": "Incipere imponere",
"foreign-structured-upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
"foreign-structured-upload-form-label-infoform-categories": "Kategorien",
"foreign-structured-upload-form-label-infoform-date": "Datum",
+ "foreign-structured-upload-form-3-label-question-website": "Hutt Dir dëst Bild vun engem Internetsite erofgelueden, oder beim Sichen no engem Bild fonnt?",
+ "foreign-structured-upload-form-3-label-question-ownwork": "Hutt Dir dëst Bild (Foto, Zeechnung, asw.) selwer gemaacht?",
"foreign-structured-upload-form-3-label-yes": "Jo",
"foreign-structured-upload-form-3-label-no": "Neen",
"backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
"export-download": "Als XML-Datei späicheren",
"export-templates": "Inklusiv Schablounen",
"export-pagelinks": "Verlinkte Säiten mat exportéieren, bis zu enger Déift vun:",
+ "export-manual": "Säite manuell derbäisetzen:",
"allmessages": "All Systemmessagen",
"allmessagesname": "Numm",
"allmessagesdefault": "Standardtext",
"undelete_short": "احیای {{PLURAL:$1|یإ دةسکاری|$1 دةسکاری}}",
"viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذفشده|$1 ویرایش حذفشده}}",
"protect": "پروژۀ",
- "protect_change": "تغییر/آلِشت",
+ "protect_change": "گؤەڕانن/تغییر",
"protectthispage": "محافظت إژ ئئ وةڵگة",
- "unprotect": "تغییر محافظت",
+ "unprotect": "گؤەڕانن/تغییر محافظت",
"unprotectthispage": "تغییر محافظت ئئ وةڵگة",
"newpage": "وةڵگة تازۀ",
"talkpage": "گةپ دةربارة ئئ وةڵگة",
"nstab-main": "وةڵگة/پەڕە",
"nstab-user": "وۀلگۀ کاربۀر",
"nstab-media": "وةڵگة رسانه",
- "nstab-special": "Ù\88Û\80Ù\84Ú¯Û\80/Ù¾Û\80رÛ\80 Ù\88Û\8cÚ\98Û\80",
+ "nstab-special": "Ù\88Û\95ÚµÚ¯Û\95(Ù¾Û\95Ú\95Û\95)Ù\88Û\8cÚ\98Û\95",
"nstab-project": "وۀلگۀ پروژۀ",
"nstab-image": "فایل",
"nstab-mediawiki": "پیغام",
"nav-login-createaccount": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
"userlogin": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
"userloginnocreate": "نؤم هۀتن سیستم",
- "logout": "دةرچئن/خروج",
- "userlogout": "دةرچئن/خروج",
+ "logout": "دەرچێن|خروج",
+ "userlogout": "دەرچێن|خروج",
"notloggedin": "وارد سیستم نؤینۀ",
"userlogin-noaccount": "حساوو کاربۀری نرین؟",
"userlogin-joinproject": "{{SITENAME}}نام نؤیسی کۀن",
"pt-login": "نؤم هۀتن.",
"pt-login-button": "نؤم هۀتن سیستم",
"pt-createaccount": "حساووئ أرا ووژتان بِسازِن",
- "pt-userlogout": "دةرچئن/خروج",
+ "pt-userlogout": "دەرچێن|خروج",
"php-mail-error-unknown": "خطای ناشناخته در تابع mail() پیاچپی",
"user-mail-no-addy": "تلاش برای ارسال ایمیل بدون آدرس ایمیل.",
"user-mail-no-body": "سعی کردید ایمیلی با محتوای بیدلیل کوتاه و یا خالی بفرستید.",
"changepassword": "تغییردائن رمز",
"resetpass_announce": "شما باید برای پایان ورود به سامانه، گذرواژهٔ جدیدی را تنظیم کنید.",
- "resetpass_header": "تغییر گذرواژهٔ حساب کاربری",
+ "resetpass_header": "گؤەڕانن/تغییر رمز حساب کاربری",
"oldpassword": "گذرواژهٔ پیشین:",
"newpassword": "گذرواژهٔ تازه:",
"retypenew": "گذرواژهٔ تازه را دوباره وارد کنید",
"changeemail-newemail-help": "برای حذف ایمیل باید این بخش را خالی رها کنید در نتیجه امکان بازگردانی گذرواژه و دریافت ایمیل از ویکی برای شما مقدور نخواهد بود.",
"changeemail-none": "(هؤیچ کام)",
"changeemail-password": "گذرواژهٔ {{SITENAME}} هؤمة:",
- "changeemail-submit": "تغییر ایمیل",
+ "changeemail-submit": "گؤەڕانن/تغییر ایمیل",
"changeemail-throttled": "شما به مراتب برای ورود تلاش کردهاید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
"changeemail-nochange": "لطفاً رایانامهٔ جدید و متفاوتی وارد کنید.",
"resettokens": "بازنشانی شناسانندهها",
"revdelete-hide-comment": "خلاصة دةسکاری",
"revdelete-hide-user": "نام کاربری/نشانی آیپی",
"revdelete-hide-restricted": "فرونشانی اطلاعات برای مدیران به همراه دیگران",
- "revdelete-radio-same": "(بدون تغییر)",
+ "revdelete-radio-same": "(بدون گؤەڕانن/تغییر )",
"revdelete-radio-set": "آشاریا/پنهان",
"revdelete-radio-unset": "دیارۀ-نمایان",
"revdelete-suppress": "از دسترسی مدیران به داده نیز مانند سایر کاربران جلوگیری به عمل آید.",
"revdelete-failure": "'''پیدایی ورژن ها قابل به روز کردن نیست:'''\n$1",
"logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
"logdelete-failure": "'''پیدایی سیاههها قابل تنظیم نیست:'''\n$1",
- "revdel-restore": "تغییر پیدایی",
+ "revdel-restore": "گؤەڕانن/تغییر پیدایی",
"pagehist": "تاریخ وةڵگة",
"deletedhist": "تاریخچهٔ پاک شده",
"revdelete-hide-current": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، ورژن اخیر است و قابل پنهان کردن نیست.",
"sessionfailure-title": "خطای نشست کاربری",
"sessionfailure": "به نظر میرسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربودهشدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحهای که از آن به اینجا رسیدهاید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
"changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
- "changecontentmodel-legend": "تغییر نوع محتوی",
+ "changecontentmodel-legend": "گؤەڕانن/تغییر نوع محتوی",
"changecontentmodel-title-label": "عنوان وةڵگة",
"changecontentmodel-model-label": "نمونه محتوای جدید",
"changecontentmodel-reason-label": ":دةلیل",
- "changecontentmodel-success-title": "نمونه محتوی تغییر یافت",
+ "changecontentmodel-success-title": "نمونه محتوی گؤەڕیا/تغییر یافت",
"changecontentmodel-success-text": "نوع محتوی [[:$1]] تغییر یافت",
"changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمیتواند به گونهای از $2 تبدیل شود.",
"changecontentmodel-nodirectediting": "نمونه محتوی $1 امکان ویرایش مستقیم را پشتیبانی نمیکند",
"modifiedarticleprotection": "وضعیت محافظت «[[$1]]» را تغییر داد",
"unprotectedarticle": "صفحهٔ «[[$1]]» را از محافظت بیرون آورد",
"movedarticleprotection": "تنظیمات محافظت را از «[[$2]]» به «[[$1]]» منتقل کرد",
- "protect-title": "تغییر وضعیت محافظت «$1»",
+ "protect-title": "گؤەڕانن/تغییر وضعیت محافظت «$1»",
"protect-title-notallowed": "مشاهده سطح حفاظت \" $1 \"",
"prot_1movedto2": "[[$1]] به [[$2]] منتقل بی",
"protect-badnamespace-title": "فضای نام بدون محافظت",
"allmessagesnotsupportedDB": "این صفحه نمیتواند استفاده شود به این دلیل که <bdi>'''$wgUseDatabaseMessages'''</bdi> غیرفعال شدهاست.",
"allmessages-filter-legend": "پالانۀل/فیلترۀل",
"allmessages-filter": "پالودن بر اساس وضعیت شخصیسازی:",
- "allmessages-filter-unmodified": "تغییر نیافته",
+ "allmessages-filter-unmodified": "نگؤەڕیائە/تغییرنیافته",
"allmessages-filter-all": "کۆل",
- "allmessages-filter-modified": "تغییر یافته",
+ "allmessages-filter-modified": "گؤەڕیائە/تغییریافته",
"allmessages-prefix": "پالودن بر اساس پسوند:",
"allmessages-language": ":زوون",
"allmessages-filter-submit": "بِچۆ",
- "allmessages-filter-translate": "Ú\86اÙ\88Ù\88اشÛ\80گر زوون",
+ "allmessages-filter-translate": "Ú\86اÙ\88Ù\88اشÛ\95Ú©Ù\90ردÙ\86 زوون",
"thumbnail-more": "کۀلنگ کِردن",
"filemissing": "پرونده وجود ندارد",
"thumbnail_error": "خطا در ایجاد بندانگشتی: $1",
"tooltip-pt-mycontris": "فهرست مشارکتهای شما",
"tooltip-pt-anoncontribs": "لیست دةسکاریةل دؤرس بی/سازریا إژ ئئ آدرس ای پی",
"tooltip-pt-login": "توصیه مۀکیم بونإ نام سامانه ، هۀرچۀند اجباری نیۀ",
- "tooltip-pt-logout": "دةرچئن/خروج",
+ "tooltip-pt-logout": "دەرچێن|خروج",
"tooltip-pt-createaccount": "مکئس تانۀ مۀکیم حساووئ بسازن و بونإ سامانۀ؛ هرچۀند حساوو کاربری سازین دل .بخوایۀ",
"tooltip-ca-talk": "گۀپ/قسۀ دۀربارۀ بنچۀک/محتوا وۀلگۀ",
"tooltip-ca-edit": "ئئ وۀلگۀ دۀسکاری کۀن",
"tooltip-ca-viewsource": ".ئئ وۀلگۀ محافظۀت بیۀ\nمۀتؤنین متن مبدأ/بنچۀک بؤینین",
"tooltip-ca-history": "ورژن دؤمائن/پئش ئئ وۀلگۀ",
"tooltip-ca-protect": "محافظت إژ ئئ وةڵگة",
- "tooltip-ca-unprotect": "تغییر محافظت ئئ وةڵگة",
+ "tooltip-ca-unprotect": "گؤەڕانن/تغییر محافظت ئئ وةڵگة",
"tooltip-ca-delete": "حةذف ئئ وةڵگة",
"tooltip-ca-undelete": "بازگرداندن نسخههای صفحهٔ حذفشده",
"tooltip-ca-move": "جاوواز کردن ئئ وۀلگۀ",
"pageinfo-hidden-categories": "{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )",
"pageinfo-templates": "{{PLURAL:$1|الگو|الگوها}} استفادهشده ($1)",
"pageinfo-transclusions": "{{PLURAL:$1|صفحهٔ|صفحههای}} تراگنجانششده در ($1)",
- "pageinfo-toolboxlink": "اطÙ\84اعات Ù\88Û\80Ù\84Ú¯Û\80/Ù¾Û\80رÛ\80",
+ "pageinfo-toolboxlink": "اطÙ\84اعات Ù\88Û\95ÚµÚ¯Û\95(Ù¾Û\95Ú\95Û\95)",
"pageinfo-redirectsto": "تغییرمسیر به",
"pageinfo-redirectsto-info": "زانستةنیةل",
"pageinfo-contentpage": "شمرده شده به عنوان صفحهٔ محتوایی",
"exif-serialnumber": "شماره سریال دوربین",
"exif-cameraownername": "صاحب دوربین",
"exif-label": "برچسب",
- "exif-datetimemetadata": "تاریخ آخرین تغییر فراداده",
+ "exif-datetimemetadata": "تاریخ آخرین گؤەڕانن/تغییر فراداده",
"exif-nickname": "نام غیررسمی تصویر",
"exif-rating": "امتیاز (از 5)",
"exif-rightscertificate": "گواهینامه مدیریت حقوق",
"blankpage": "وةڵگة خالی",
"intentionallyblankpage": "این وةڵگة به طور عمدی خالی گذاشته شده است.",
"external_image_whitelist": " #این سطر را همانگونه که هست رها کنید<pre>\n#عبارتهای باقاعده (regex) را در زیر قرار دهید (فقط بخشی که بین // قرار میگیرد)\n#آنها با نشانی اینترنتی تصاویر خارجی پیوند داده شده تطبیق داده میشوند\n#مواردی که مطابق باشند به صورت تصویر نمایش مییابند، و در غیر این صورت تنها یک پیوند به تصویر نمایش مییابد\n#سطرهایی که با # آغاز شوند به عنوان توضیحات در نظر گرفته میشوند\n#این سطرها به کوچکی و بزرگی حروف حساس هستند\n\n#عبارتهای باقاعده (regex) را زیر این سطر قرار دهید. این سطر را همانگونه که هست رها کنید</pre>",
- "tags": "برچسبهای تغییر مجاز",
+ "tags": "برچسبهای گؤەڕانن/تغییر مجاز",
"tag-filter": ":فیلتر کۀ[[Special:Tags|برچسبۀل]]",
"tag-filter-submit": "پالانۀل/فیلترۀل",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|بۀرچۀسب|بۀرچۀسبۀل}}]]:$2)",
"pagelang-use-default": "استفاده إژ زوون پئش فرض",
"pagelang-select-lang": "زوون انتخاب کۀ",
"pagelang-submit": "تائید کردن",
- "right-pagelang": "تغییر وةڵگة زوون",
- "action-pagelang": "تغییر زوون وةڵگة",
+ "right-pagelang": "گؤەڕانن/تغییر وةڵگة زوون",
+ "action-pagelang": "گؤەڕانن/تغییر زوون وةڵگة",
"log-name-pagelang": "تغییر سیاههٔ زبان",
"log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
"logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای $3 از $4 به $5 .",
"special-characters-title-minus": "علامت منفی",
"mw-widgets-dateinput-no-date": "هیچ دادهای انتخاب نشده",
"mw-widgets-titleinput-description-new-page": "ئئ وةڵگة هنوز/حالی وجود نِئرێ",
- "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
+ "mw-widgets-titleinput-description-redirect": "گؤەڕانن/تغییر مسیر به $1",
"api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
}
"createaccountreason": "कारण:",
"createacct-reason": "कारण:",
"createacct-reason-ph": "अहा इगो आर दोसर खाता कियाक बनउने जा रहल छि",
- "createacct-captcha": "सुरक्षा जाँच",
- "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखु",
"createacct-submit": "अपन खाता बनाउ",
"createacct-another-submit": "दोसर खाता बनाउ",
"createacct-benefit-heading": "{{SITENAME}} अहि जोका लोकनिसभ द्वारा बनावल गेल अछि।",
"passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{ अन्तर्जालक नाम}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि| लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
"passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
"passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
- "passwordreset-emailsent": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
+ "passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
"passwordreset-emailsent-capture": "एकटा स्मरण ई-पत्र पठाएल गेल अछि, जे नीचाँ देखाएल अछि।",
"passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
"changeemail": "ई-पत्र संकेत बदलू",
- "changeemail-text": "अपन ई-पत्र संकेत बदलबा लेल ऐ आवेदनकेँ भरू। अहाँकेँ ऐ परिवर्तनक अनुमोदन लेल अपन कूटशब्द भरए पड़त।",
+ "changeemail-header": "ई-पत्र पता खाता बदलू",
"changeemail-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे देखबाले सम्प्रवेशित हुअए पड़त।",
"changeemail-oldemail": "अखुनका ई-पत्र संकेत:",
"changeemail-newemail": "नव ई-पत्र संकेत:",
"prefs-diffs": "अन्तर निर्धारक सभ",
"prefs-help-prefershttps": "इ प्राथमिकता अहाँके फेर स सम्प्रवेश करलाक बाद प्रभाव पडत।",
"prefs-tabs-navigation-hint": "सुझाव: अहाँ टैब्स सूचीमे टैब्सके बीच आवागमन करवाक लेल बाम आर दाहिना बागलके कुंजिसभके उपयोग कइर सकैत छी।",
- "email-address-validity-valid": "ई-पत्र संकेत मान्य बुझाइत अछि",
- "email-address-validity-invalid": "एकटा मान्य ई-पत्र संकेत लिखू",
"userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
"userrights-lookup-user": "प्रयोक्ता संवर्ग सभक प्रबन्ध करू",
"userrights-user-editname": "एकटा प्रयोक्तानाम लिखू:",
"nchanges": "$1 {{PLURAL:$1|परिवर्त्तन|परिवर्त्तन}}",
"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बेर देखला के बाद स}}",
"enhancedrc-history": "इतिहास",
- "recentchanges": "लगक परिवर्तन सभ",
+ "recentchanges": "लगक परिवर्तनसभ",
"recentchanges-legend": "नव परिवर्तन सभक विकल्प सभ",
"recentchanges-summary": "ई पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।",
"recentchanges-noresult": "इ अवधिके दौरान इ मापदंडके पूर्ण करेत समय कोनो परिवर्तन नै केएल गेल अछि।",
"wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
"wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
"wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन",
+ "watchlistall2": "सभ",
"watchlist-options": "साकांक्षसूचीक विकल्प सभ",
"watching": "ताकिमे...",
"unwatching": "छोड़ल ...",
"movenosubpage": "अहि पन्ना कऽ कोनो उप पन्ना नहि अछि।",
"movereason": "कारण:",
"revertmove": "फेरसँ वएह",
- "delete_and_move": "मेटाउ आ हटू",
"delete_and_move_text": "==हटाबैक जरूरत==\nलक्ष्य पृष्ठ \"[[:$1]]\" पहिने सें अस्तित्व में अछि. \nनाम के बदलहि ले की अहां एकरा हटाबय चाहैत छी ?",
"delete_and_move_confirm": "हँ, पन्ना मेटाउ",
"delete_and_move_reason": "\"[[$1]]\" सँ घसकेबा लेल जगह बनेबा लेल मेटाएल गेल",
"passwordreset-emailtext-ip": "Некој (веројатно вие, од IP-адресата $1) побара измена на вашата\nлозинка за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во\n{{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
"passwordreset-emailtext-user": "Корисникот $1 на {{SITENAME}} побара измена на вашата лозинка на {{SITENAME}}\n($4). Оваа е-поштенска адреса е наведена во {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
"passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
- "passwordreset-emailsentemail": "Ð\90ко ова е Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80анаÑ\82а е-поÑ\88Ñ\82а за вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
- "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта, тогаш ќе ви биде испратена порака за промена на лозинката.",
+ "passwordreset-emailsentemail": "Ð\90ко ова е Ñ\80егиÑ\81Ñ\82Ñ\80иÑ\80анаÑ\82а е-поÑ\88Ñ\82а повÑ\80зана Ñ\81о вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
+ "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
"passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
"passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
"changeemail": "Смени или отстрани е-пошта",
"upload-form-label-select-file": "Одберете податотека",
"upload-form-label-infoform-title": "Подробно",
"upload-form-label-infoform-name": "Назив",
+ "upload-form-label-infoform-name-tooltip": "Краток и единствен наслов на податотеката, кој ќе служи како нејзин назив. Можете да користите прост јазик со меѓупростор, но не пишувајте ја податотечната наставка.",
"upload-form-label-infoform-description": "Опис",
+ "upload-form-label-infoform-description-tooltip": "Накратко опишете го сето она што е значајно за делото. Ако е фотографија, споменете ги главните нешта што се прикажани на неа, настанот или местото.",
"upload-form-label-usage-title": "Употреба",
"upload-form-label-usage-filename": "Назив на податотеката",
"foreign-structured-upload-form-label-own-work": "Ова е мое дело",
"export-download": "Зачувај како податотека",
"export-templates": "Вклучи и шаблони",
"export-pagelinks": "Вклучи поврзани страници до длабочина од:",
+ "export-manual": "Додајте страници рачно:",
"allmessages": "Системски пораки",
"allmessagesname": "Име",
"allmessagesdefault": "Текст по основно",
"size-zetapixel": "$1 ЗП",
"size-yottapixel": "$1 ЈП",
"bitrate-bits": "$1 б/с",
- "bitrate-kilobits": "$1 кб/с",
+ "bitrate-kilobits": "$1 Ð\9aб/с",
"bitrate-megabits": "$1 Мб/с",
"bitrate-gigabits": "$1 Гб/с",
"bitrate-terabits": "$1 Тб/с",
"expand_templates_preview": "Преглед",
"expand_templates_preview_fail_html": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML и се јави губиток на седнички податоци, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
"expand_templates_preview_fail_html_anon": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML, а вие не сте најавени, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
+ "expand_templates_input_missing": "Треба да внесете некаков текст.",
"pagelanguage": "Изборник за јазик на страницата",
"pagelang-name": "Страница",
"pagelang-language": "Јазик",
"mediastatistics": "Статистики за слики и снимки",
"mediastatistics-summary": "Статистики за подигнати типови податотеки. Се зема предвид само последната верзија на податотеката. Старите и избришаните верзии не се бројат.",
"mediastatistics-nbytes": "{{PLURAL:$1|Еден бајт|$1 бајти}} ($2; $3%)",
- "mediastatistics-bytespertype": "Вкупен обем на пасусот: $1 бајти.",
- "mediastatistics-allbytes": "Вкупен обем на сите податотеки: $1 бајти.",
+ "mediastatistics-bytespertype": "Вкупен обем на пасусот: {{PLURAL:$1|$1 бајт|$1 бајти}} ($2; $3%).",
+ "mediastatistics-allbytes": "Вкупен обем на сите податотеки: {{PLURAL:$1|$1 бајт|$1 бајти}} ($2).",
"mediastatistics-table-mimetype": "MIME-тип",
"mediastatistics-table-extensions": "Можни додатоци",
"mediastatistics-table-count": "Број на податотеки",
"upload-form-label-select-file": "പ്രമാണം തിരഞ്ഞെടുക്കുക",
"upload-form-label-infoform-title": "വിശദാംശങ്ങൾ",
"upload-form-label-infoform-name": "പേര്",
+ "upload-form-label-infoform-name-tooltip": "പ്രമാണത്തിനുള്ള ചെറിയ അനന്യമായ തലക്കെട്ട്. വാക്കുകൾക്കിടയിൽ ഇടവിട്ടുള്ള ലളിതഭാഷ ഉപയോഗിക്കാം. പ്രമാണത്തിന്റെ എക്സ്റ്റെൻഷൻ ഉൾപ്പെടുത്തരുത്.",
"upload-form-label-infoform-description": "വിവരണം",
+ "upload-form-label-infoform-description-tooltip": "ഈ കൃതിയെക്കുറിച്ചുള്ള ശ്രദ്ധേയമായ എല്ലാം ചുരുക്കി ചേർക്കുക.\nഒരു ഫോട്ടോയിൽ, പതിഞ്ഞിരിക്കുന്ന പ്രധാന കാര്യം, വേള, സ്ഥലം തുടങ്ങിയ വിവരങ്ങൾ ഉൾപ്പെടുത്താം.",
"upload-form-label-usage-title": "ഉപയോഗം",
"upload-form-label-usage-filename": "പ്രമാണത്തിന്റെ പേര്",
"foreign-structured-upload-form-label-own-work": "ഇതെന്റെ സ്വന്തം സൃഷ്ടി ആണ്",
"wlshowhideanons": "അജ്ഞാത ഉപയോക്താക്കൾ",
"wlshowhidepatr": "റോന്തു ചുറ്റിയ മാറ്റങ്ങൾ",
"wlshowhidemine": "എന്റെ തിരുത്തുകൾ",
+ "wlshowhidecategorization": "താൾ വർഗ്ഗീകരണം",
"watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
"watching": "ശ്രദ്ധിക്കുന്നു...",
"unwatching": "അവഗണിക്കുന്നു...",
"rollback-success": "$1 ചെയ്ത തിരുത്ത് തിരസ്ക്കരിച്ചിരിക്കുന്നു; $2 ചെയ്ത തൊട്ടു മുൻപത്തെ പതിപ്പിലേക്ക് സേവ് ചെയ്യുന്നു.",
"sessionfailure-title": "സെഷൻ പരാജയപ്പെട്ടിരിക്കുന്നു",
"sessionfailure": "താങ്കളുടെ ലോഗിൻ സെഷനിൽ പ്രശ്നങ്ങളുള്ളതായി കാണുന്നു;\nസെഷൻ തട്ടിയെടുക്കൽ ഒഴിവാക്കാനുള്ള മുൻകരുതലായി ഈ പ്രവൃത്തി റദ്ദാക്കിയിരിക്കുന്നു.\nദയവായി പിന്നോട്ട് പോയി താങ്കൾ വന്ന താളിൽ ചെന്ന്, വീണ്ടും ശ്രമിക്കുക.",
+ "changecontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
"changecontentmodel-title-label": "താളിന്റെ തലക്കെട്ട്",
"changecontentmodel-model-label": "പുതിയ ഉള്ളടക്ക രീതി",
"changecontentmodel-reason-label": "കാരണം:",
"export-download": "ഒരു പ്രമാണമാക്കി സൂക്ഷിക്കുക",
"export-templates": "ഫലകങ്ങളും ഉൾപ്പെടുത്തുക",
"export-pagelinks": "ഉൾപ്പെടുത്തേണ്ട കണ്ണികളുള്ള താളുകളുടെ ആഴം:",
+ "export-manual": "താളുകൾ ചേർക്കുക:",
"allmessages": "സന്ദേശസഞ്ചയം",
"allmessagesname": "പേര്",
"allmessagesdefault": "സ്വതേയുള്ള ഉള്ളടക്കം",
"logentry-suppress-block": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തെ $1 {{GENDER:$2|തടഞ്ഞിരിക്കുന്നു}}",
"logentry-suppress-reblock": "$5 $6 കാലത്തേക്ക് {{GENDER:$4|$3}} എന്ന അംഗത്വത്തിന്റെ തടയൽ സജ്ജീകരണങ്ങൾ $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
"logentry-import-upload": "പ്രമാണ അപ്ലോഡ് വഴി $3 എന്ന താൾ $1 {{GENDER:$2|ഇറക്കുമതി ചെയ്തിരിക്കുന്നു}}",
+ "logentry-import-upload-details": "പ്രമാണം അപ്ലോഡ് ചെയ്യുക വഴി $3 ($4 {{PLURAL:$4|നാൾപ്പതിപ്പ്|നാൾപ്പതിപ്പുകൾ}}) $1 {{GENDER:$2|ഇറക്കുമതി ചെയ്തിരിക്കുന്നു}}",
"logentry-import-interwiki": "മറ്റൊരു വിക്കിയിൽ നിന്നും $3 എന്ന താൾ $1 {{GENDER:$2|ഇറക്കുമതി ചെയ്തിരിക്കുന്നു}}",
+ "logentry-import-interwiki-details": "$5 വിക്കിയിൽ നിന്നും $3 ($4 {{PLURAL:$4|നാൾപ്പതിപ്പ്|നാൾപ്പതിപ്പുകൾ}}) $1 {{GENDER:$2|ഇറക്കുമതി ചെയ്തിരിക്കുന്നു}}",
"logentry-merge-merge": "$3 എന്ന താൾ $4 എന്നതിലേക്ക് ($5 നാൾപ്പതിപ്പ് വരെ), $1 {{GENDER:$2|ലയിപ്പിച്ചു}}",
"logentry-move-move": "$1 എന്ന ഉപയോക്താവ് $3 എന്ന താൾ $4 എന്നാക്കി {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
"logentry-move-move-noredirect": "$3 എന്ന താൾ $4 എന്ന തലക്കെട്ടിലേയ്ക്ക് തിരിച്ചുവിടലില്ലാതെ $1 {{GENDER:$2|മാറ്റി}}",
"expand_templates_preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
"expand_templates_preview_fail_html": "<em>{{SITENAME}} സംരംഭത്തിൽ അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ സജ്ജമാക്കിയിരിക്കുന്നതിനാലും, സെഷൻ വിവരങ്ങൾ നഷ്ടപ്പെട്ടിരിക്കുന്നതിനാലും, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണങ്ങൾക്കെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ എങ്ങനെയുണ്ടെന്ന് കാണൽ മറച്ചിരിക്കുകയാണ്.</em>\n\n<strong>ഇത് എങ്ങനെയുണ്ടെന്ന് കാണാനുള്ള യഥാർത്ഥശ്രമമാണെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</strong>\nഇപ്പോഴും പ്രവർത്തിക്കുന്നില്ലെങ്കിൽ, [[Special:UserLogout|പുറത്ത് കടന്ന്]] വീണ്ടും പ്രവേശിച്ച ശേഷം പരീക്ഷിക്കുക.",
"expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} സംരംഭത്തിൽ അസംസ്കൃത എച്ച്.റ്റി.എം.എൽ സജ്ജമാക്കിയിരിക്കുന്നതിനാലും, സെഷൻ വിവരങ്ങൾ നഷ്ടപ്പെട്ടിരിക്കുന്നതിനാലും, ജാവാസ്ക്രിപ്റ്റ് ആക്രമണങ്ങൾക്കെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ എങ്ങനെയുണ്ടെന്ന് കാണൽ മറച്ചിരിക്കുകയാണ്.</em>\n\n<strong>ഇത് എങ്ങനെയുണ്ടെന്ന് കാണാനുള്ള യഥാർത്ഥശ്രമമാണെങ്കിൽ [[Special:UserLogin|പ്രവേശിച്ച ശേഷം]] വീണ്ടും ശ്രമിക്കുക.</strong>",
+ "expand_templates_input_missing": "ചില വിവരങ്ങളെങ്കിലും താങ്കൾ നൽകിയിരിക്കണം.",
"pagelanguage": "താളിന്റെ ഭാഷാ തിരഞ്ഞെടുപ്പ് സൗകര്യം",
"pagelang-name": "താൾ",
"pagelang-language": "ഭാഷ",
"pagelang-use-default": "സ്വതേയുള്ള ഭാഷ ഉപയോഗിക്കുക",
"pagelang-select-lang": "ഭാഷ തിരഞ്ഞെടുക്കുക",
+ "pagelang-submit": "സമർപ്പിക്കുക",
"right-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
"action-pagelang": "താളിന്റെ ഭാഷ മാറ്റുക",
"log-name-pagelang": "ഭാഷ മാറ്റലിന്റെ രേഖ",
"mediastatistics": "മീഡിയ സ്ഥിതിവിവരക്കണക്കുകൾ",
"mediastatistics-summary": "അപ്ലോഡ് ചെയ്തിട്ടുള്ള പ്രമാണ തരങ്ങളെക്കുറിച്ചുള്ള സ്ഥിതിവിവരക്കണക്കുകൾ. ഇത് പ്രമാണത്തിന്റെ ഏറ്റവും പുതിയ പതിപ്പ് മാത്രമേ ഉൾക്കൊള്ളുന്നുള്ളു. പഴയ അഥവാ മായ്ക്കപ്പെട്ട പ്രമാണപതിപ്പുകൾ ഉൾക്കൊള്ളുന്നില്ല.",
"mediastatistics-nbytes": "{{PLURAL:$1|ഒരു ബൈറ്റ്|$1 ബൈറ്റ്}} ($2; $3%)",
+ "mediastatistics-bytespertype": "ഈ ഭാഗത്തിന്റെ ആകെ പ്രമാണ വലിപ്പം: {{PLURAL:$1|$1 ബൈറ്റ്|$1 ബൈറ്റുകൾ}} ($2; $3%).",
+ "mediastatistics-allbytes": "എല്ലാ പ്രമാണങ്ങളുടേയും ആകെ പ്രമാണവലിപ്പം: {{PLURAL:$1|$1 ബൈറ്റ്|$1 ബൈറ്റുകൾ}} ($2).",
"mediastatistics-table-mimetype": "മൈം(MIME) തരം",
"mediastatistics-table-extensions": "സാദ്ധ്യതയുള്ള എക്സ്റ്റെൻഷനുകൾ",
"mediastatistics-table-count": "പ്രമാണങ്ങളുടെ എണ്ണം",
"mediastatistics-header-text": "എഴുത്ത്",
"mediastatistics-header-executable": "എക്സിക്യൂട്ടബിളുകൾ",
"mediastatistics-header-archive": "ചുരുക്കിയ ഫയൽതരങ്ങൾ",
+ "mediastatistics-header-total": "എല്ലാ പ്രമാണങ്ങളും",
"json-warn-trailing-comma": "ജെസണിൽ നിന്നും $1 എന്നതിന്റെ പിന്നാലെയുള്ള {{PLURAL:$1|കോമ|കോമകൾ}} നീക്കി",
"json-error-unknown": "ജെസണിൽ ഒരു പ്രശ്നമുണ്ടായി. പിഴവ്: $1",
"json-error-depth": "സ്റ്റാക്കിന്റെ പരമാവധി ആഴം അധികരിച്ചിരിക്കുന്നു",
"searcharticle": "Vàje",
"history": "Verziune 'e primma",
"history_short": "Cronologgia",
- "updatedmarker": "cagnamiénte 'e mija urdema visita",
+ "updatedmarker": "cagnamiénte 'e ll'urdema visita d' 'a mia",
"printableversion": "Verzione pe' stampa",
"permalink": "Jonta permanente",
"print": "Stampà",
"passwordreset-emailtext-ip": "Coccherun (può darse ca sì tu, cu n'indirizzo IP $1) ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
"passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
"passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
- "passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail riggistrato, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
- "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail riggistrato ca currispunnesse a chesto, allora se mannarrà na mmasciata pe' riabbià 'a password.",
+ "passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail suoccio a 'o cunto vuost, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
+ "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail suòccio a stu nomme utente, allora se mannarrà na mmasciata pe' riabbià 'a password.",
"passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
"passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
"changeemail": "Cagna o lèva l'indirizzo e-mail",
"upload-form-label-select-file": "Sceglie file",
"upload-form-label-infoform-title": "Dettaglie",
"upload-form-label-infoform-name": "Nomme",
+ "upload-form-label-infoform-name-tooltip": "Nu titolo unico e distintivo p' 'o file, ca serverrà comm'o nomme file. Putite ausà lenguaggio semprice ch' 'e spazi. Nun azzeccà l'estensione d' 'o file.",
"upload-form-label-infoform-description": "Descrizzione",
+ "upload-form-label-infoform-description-tooltip": "Facite 'a descriziona sintetica 'e tuttuquanto fosse degno 'e nota a proposito 'e st'opera. P' 'e foto, facite assapé 'e ccosi principale ca songo rappresentate, l'accasione e/o luogo dint' 'o quale so' state scattate.",
"upload-form-label-usage-title": "Aúso",
"upload-form-label-usage-filename": "Nomme d' 'o file",
"foreign-structured-upload-form-label-own-work": "Chest'è fatica mia",
"export-download": "Astipa comm'a nu file",
"export-templates": "Include 'e template",
"export-pagelinks": "Include 'e paggene cullegate ca spuntassero nfin' 'a na prufunnità 'e:",
+ "export-manual": "Nzérta paggene manualmente:",
"allmessages": "'Mmasciate d''o sistema",
"allmessagesname": "Nomme",
"allmessagesdefault": "Mmasciata 'e testo predefinita",
"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_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": "Scigliete 'a lengua d' 'a paggena pe' bbìa e stu strumiento",
"pagelang-name": "Paggena",
"pagelang-language": "Lengua",
"mediastatistics": "Statistiche d' 'e media",
"mediastatistics-summary": "Statistiche ncopp' 'e tipe d' 'e file carrecate. Ce truvate azzeccata sulamente 'a verziona cchiù recente d' 'o file. Verziune viecchie o scancellate se so' luvate.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
- "mediastatistics-bytespertype": "Dimenziona d' 'o file 'e sta seziona: $1 byte.",
- "mediastatistics-allbytes": "Dimenziona sana 'e file pe' tuttuquante 'e file: $1 byte.",
+ "mediastatistics-bytespertype": "Dimenziona d' 'o file 'e sta seziona: {{PLURAL:$1|$1 byte}} ($2; $3%).",
+ "mediastatistics-allbytes": "Dimenziona sana 'e file pe' tuttuquante 'e file: {{PLURAL:$1|$1 byte}} ($2).",
"mediastatistics-table-mimetype": "Tipo 'e MIME",
"mediastatistics-table-extensions": "Estenziune pussibbele",
"mediastatistics-table-count": "Nummero 'e file",
"laggedslavemode": "Uwaga! Ta strona może nie zawierać najnowszych aktualizacji.",
"readonly": "Baza danych jest zablokowana",
"enterlockreason": "Podaj powód zablokowania bazy oraz szacunkowy termin jej odblokowania",
- "readonlytext": "Baza danych jest obecnie zablokowana – nie można wprowadzać nowych informacji ani modyfikować istniejących. Powodem są prawdopodobnie czynności administracyjne. Po ich zakończeniu przywrócona zostanie pełna funkcjonalność bazy.\n\nAdministrator, który zablokował bazę, podał następujące wyjaśnienie: $1",
+ "readonlytext": "Baza danych jest obecnie zablokowana – nie można wprowadzać nowych informacji ani modyfikować istniejących. Powodem są prawdopodobnie czynności administracyjne. Po ich zakończeniu przywrócona zostanie pełna funkcjonalność bazy.\n\nAdministrator systemu, który zablokował bazę, podał następujące wyjaśnienie: $1",
"missing-article": "W bazie danych nie odnaleziono treści strony „$1” $2.\n\nZazwyczaj jest to spowodowane odwołaniem do nieaktualnego linku prowadzącego do różnicy pomiędzy dwoma wersjami strony lub do wersji z historii usuniętej strony.\n\nJeśli tak nie jest, możliwe, że problem został wywołany przez błąd w oprogramowaniu.\nMożna zgłosić ten fakt [[Special:ListUsers/sysop|administratorowi]], podając adres URL.",
"missingarticle-rev": "(wersja $1)",
"missingarticle-diff": "(różnica: $1, $2)",
"upload-form-label-select-file": "Wybierz plik",
"upload-form-label-infoform-title": "Szczegóły",
"upload-form-label-infoform-name": "Nazwa",
+ "upload-form-label-infoform-name-tooltip": "Podaj krótką, opisującą i unikalną nazwę, która będzie służyła jako nazwa pliku. Możesz używać prostego języka i spacji. Nie dodawaj rozszerzenia pliku.",
"upload-form-label-infoform-description": "Opis",
+ "upload-form-label-infoform-description-tooltip": "Krótko opisz wszystko istotne, co dotyczy tej pracy.\nW przypadku zdjęcia wymień najważniejsze ujęte obiekty, sytuację lub miejsce.",
"upload-form-label-usage-title": "Korzystanie",
"upload-form-label-usage-filename": "Nazwa pliku",
"foreign-structured-upload-form-label-own-work": "To moja własna praca",
"wlshowhideanons": "anonimowych",
"wlshowhidepatr": "sprawdzone edycje",
"wlshowhidemine": "moje edycje",
+ "wlshowhidecategorization": "kategoryzację stron",
"watchlist-options": "Opcje obserwowanych",
"watching": "Dodaję do obserwowanych...",
"unwatching": "Przestaję obserwować...",
"upload-form-label-select-file": "Label for the select file widget\n{{Identical|Select file}}",
"upload-form-label-infoform-title": "Title for the information form\n{{Identical|Detail}}",
"upload-form-label-infoform-name": "Label for the file name input\n{{Identical|Name}}",
- "upload-form-label-infoform-name-tooltip": "The tooltip documenting the title field for the file - used as the filename on-wiki.",
+ "upload-form-label-infoform-name-tooltip": "The tooltip documenting the title field for the file - used as the filename on-wiki.\n\nIdentical to {{msg-mw|mwe-upwiz-tooltip-title}}.",
"upload-form-label-infoform-description": "Label for the file description input\n{{Identical|Description}}",
- "upload-form-label-infoform-description-tooltip": "The tooltip documenting the description fields on the details page.",
+ "upload-form-label-infoform-description-tooltip": "The tooltip documenting the description fields on the details page.\n\nIdentical to {{msg-mw|mwe-upwiz-tooltip-description}}.",
"upload-form-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}",
"upload-form-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}",
"foreign-structured-upload-form-label-own-work": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Label for own work confirmation checkbox",
"passwordreset-emailtext-ip": "Cineva (probabil dumneavoastră, de la adresa IP $1) a solicitat resetarea parolei \npentru {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}\ncu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere \nsau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,\nputeți ignora acest mesaj, continuând să utilizați vechea parolă.",
"passwordreset-emailtext-user": "Utilizatorul $1 de pe {{SITENAME}} a solicitat o resetare a parolei dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă altcineva a făcut această solicitare, ori dacă v-ați reamintit parola originală și nu mai doriți modificarea ei, puteți ignora acest mesaj, continuând cu vechea parolă.",
"passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
- "passwordreset-emailsentemail": "Dacă aceasta este o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
- "passwordreset-emailsentusername": "Dacă există o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
+ "passwordreset-emailsentemail": "Dacă această adresă de e-mail este asociată contului dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
+ "passwordreset-emailsentusername": "Dacă există o adresă de e-mail asociată acestui nume de utilizator, atunci se va trimite un e-mail de resetare a parolei.",
"passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
"passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
"changeemail": "Modificare sau înlăturare adresă de e-mail",
"upload-form-label-select-file": "Selectează fișier",
"upload-form-label-infoform-title": "Detalii",
"upload-form-label-infoform-name": "Nume",
+ "upload-form-label-infoform-name-tooltip": "Un titlu unic, descriptiv, care va deveni și numele fișierului. Puteți folosi limbaj simplu cu spații. Nu includeți extensia fișierului.",
"upload-form-label-infoform-description": "Descriere",
+ "upload-form-label-infoform-description-tooltip": "Descrieți pe scurt orice este notabil despre lucrare.\nPentru o fotografie, menționați principalele lucruri care sunt reprezentate, evenimentul sau locul.",
"upload-form-label-usage-title": "Utilizare",
"upload-form-label-usage-filename": "Numele fișierului",
"foreign-structured-upload-form-label-own-work": "Aceasta este propria mea operă",
"wlshowhideanons": "utilizatori anonimi",
"wlshowhidepatr": "modificări patrulate",
"wlshowhidemine": "modificările mele",
+ "wlshowhidecategorization": "categorisirea paginilor",
"watchlist-options": "Opțiuni listă de pagini urmărite",
"watching": "Se urmărește...",
"unwatching": "Așteptați...",
"export-download": "Salvează ca fișier",
"export-templates": "Include formate",
"export-pagelinks": "Includere pagini legate de la o adâncime de:",
+ "export-manual": "Adăugați pagini manual:",
"allmessages": "Toate mesajele",
"allmessagesname": "Nume",
"allmessagesdefault": "Textul standard",
"expand_templates_preview": "Previzualizare",
"expand_templates_preview_fail_html": "<em>Întrucât la {{SITENAME}} este activat HTML brut și a avut loc o pierdere a sesiunii de date, previzualizarea a fost ascunsă ca măsură de precauție împotriva atacurilor prin JavaScript.</em>\n\n<strong>Dacă aceasta este o încercare legitimă de a previzualiza, încercați din nou.</strong>\nDacă nici astfel nu funcționează, încercați să [[Special:UserLogout|închideţi sesiunea]] şi să vă autentificaţi din nou.",
"expand_templates_preview_fail_html_anon": "<em>Întrucât la {{SITENAME}} este activat HTML brut și nu v-ați autentificat, previzualizarea a fost ascunsă ca măsură de precauție împotriva atacurilor prin JavaScript.</em>\n\n<strong>Dacă aceasta este o încercare legitimă de a previzualiza, [[Special:UserLogin|autentificați-vă]] și încercați din nou.</strong>",
+ "expand_templates_input_missing": "Trebuie să furnizați cel puțin un text ca date de intrare.",
"pagelanguage": "Selector limbă pagină",
"pagelang-name": "Pagină",
"pagelang-language": "Limbă",
"pagelang-use-default": "Folosește limba implicită",
"pagelang-select-lang": "Alege limba",
+ "pagelang-submit": "Trimite",
"right-pagelang": "Modifică limba paginii",
"action-pagelang": "modificați limba paginii",
"log-name-pagelang": "Jurnal modificare limbă",
"mediastatistics": "Statistici multimedia",
"mediastatistics-summary": "Statistici despre tipurile fișierelor încărcate. Sunt incluse doar cele mai recente versiuni ale fișierelor. Versiunile mai vechi sau șterse ale fișierelor sunt excluse.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 octet|$1 octeți|$1 de octeți}} ($2; $3%)",
+ "mediastatistics-bytespertype": "Dimensiunea totală a fișierului pentru această secțiune: {{PLURAL:$1|$1 octet|$1 octeți|$1 de octeți}} ($2; $3%).",
+ "mediastatistics-allbytes": "Dimensiunea totală pentru toate fișierele: {{PLURAL:$1|$1 octet|$1 octeți|$1 de octeți}} ($2).",
"mediastatistics-table-mimetype": "Tip MIME",
"mediastatistics-table-extensions": "Extensii posibile",
"mediastatistics-table-count": "Număr de fișiere",
"mediastatistics-header-text": "Text",
"mediastatistics-header-executable": "Executabile",
"mediastatistics-header-archive": "Formate comprimate",
+ "mediastatistics-header-total": "Toate fișierele",
"json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulă|virgule|de virgule}} în exces înlăturat{{PLURAL:$1|ă|e}} din JSON",
"json-error-unknown": "A apărut o problemă cu JSON. Eroare: $1",
"json-error-depth": "S-a depășit adâncimea maximă a stivei",
"passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
"passwordreset-emailtext-user": "Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дней|$5 дня|1=один день}}.\nВы должны представиться системе и выбрать новый пароль.\nЕсли вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
"passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
- "passwordreset-emailsentemail": "Если это адрес электронной почты, на которую зарегистрирована ваша учётная запись, вам будет отправлено письмо для сброса пароля.",
- "passwordreset-emailsentusername": "Если есть соответствующий зарегистрированный адрес электронной почты, будет отправлено письмо для восстановления пароля.",
+ "passwordreset-emailsentemail": "Если это адрес электронной почты связан с вашей учётной записью, вам будет отправлено письмо для сброса пароля.",
+ "passwordreset-emailsentusername": "Если есть адрес электронной почты, связанный с этим именем участника, то будет отправлено письмо для восстановления пароля.",
"passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
"passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
"changeemail": "Изменить или удалить адрес электронной почты",
"showhideselectedversions": "Показать/скрыть выбранные версии",
"editundo": "отменить",
"diff-empty": "(нет различий)",
- "diff-multi-sameuser": "(не {{PLURAL:$1|показана одна промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} этого же участника)",
+ "diff-multi-sameuser": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} этого же участника)",
"diff-multi-otherusers": "(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})",
"diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})",
"difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
"prefs-help-gender": "Этот параметр задавать необязательно.\nДвижок использует это значение, чтобы обращаться к вам и упоминать вас в правильном грамматическом роде.\nЭта информация будет общедоступной.",
"email": "Электронная почта",
"prefs-help-realname": "Вводить настоящее имя необязательно.\nЕсли вы заполните его, оно может быть использовано для указания авторства ваших работ.",
- "prefs-help-email": "Адрес электронной почты указывать необязательно, но он будет необходим в том случае, если вы забудете пароль.",
+ "prefs-help-email": "Адрес почты не обязателен, но это единственный способ восстановить забытый пароль.",
"prefs-help-email-others": "Он также позволит другим участникам связаться с вами по электронной почте с помощью ссылки на вашей персональной странице или на вашей странице обсуждения. При этом ваш адрес электронной почты не будет никому раскрыт.",
"prefs-help-email-required": "Необходимо указать адрес электронной почты.",
"prefs-info": "Основные сведения",
"export-download": "Предложить сохранить как файл",
"export-templates": "Включить шаблоны",
"export-pagelinks": "Включить связанные страницы глубиной:",
+ "export-manual": "Добавить страницы вручную:",
"allmessages": "Системные сообщения",
"allmessagesname": "Сообщение",
"allmessagesdefault": "Текст по умолчанию",
"mediastatistics": "Медиа-статистика",
"mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
"mediastatistics-nbytes": "$1 байт{{PLURAL:$1||а|ов}} ($2; $3%)",
- "mediastatistics-bytespertype": "Общий размер файла для этого раздела: $1 байт{{PLURAL:$1||ов|а}}.",
- "mediastatistics-allbytes": "Общий размер всех файлов: $1 байт{{PLURAL:$1||ов|а}}.",
+ "mediastatistics-bytespertype": "Общий размер файла для этого раздела: $1 байт{{PLURAL:$1||ов|а}} ($2; $3%).",
+ "mediastatistics-allbytes": "Общий размер всех файлов: $1 байт{{PLURAL:$1||ов|а}} ($2).",
"mediastatistics-table-mimetype": "MIME-тип",
"mediastatistics-table-extensions": "Возможные расширения",
"mediastatistics-table-count": "Количество файлов",
"passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
"passwordreset-emailtext-user": "Användaren $1 på {{SITENAME}} begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
"passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
- "passwordreset-emailsentemail": "Om detta är en registrerad e-postadress för ditt konto kommer en lösenordsåterställning skickas via e-post.",
- "passwordreset-emailsentusername": "Om det finns en motsvarande e-postadress för ditt konto kommer en lösenordsåterställning skickas via e-post.",
+ "passwordreset-emailsentemail": "Om denna e-postadress är associerad med ditt konto kommer en lösenordsåterställning skickas via e-post.",
+ "passwordreset-emailsentusername": "Om det finns en e-postadress som associeras med detta användarnamn kommer en lösenordsåterställning skickas via e-post.",
"passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
"passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
"changeemail": "Ändra eller ta bort e-postadress",
"upload-form-label-select-file": "Välj fil",
"upload-form-label-infoform-title": "Detaljer",
"upload-form-label-infoform-name": "Namn",
+ "upload-form-label-infoform-name-tooltip": "En unik beskrivande titel för filen, som kommer att fungera som ett filnamn. Du kan använda klarspråk med mellanslag. Ta inte med filändelsen.",
"upload-form-label-infoform-description": "Beskrivning",
+ "upload-form-label-infoform-description-tooltip": "Beskriv kortfattat allt anmärkningsvärt om verket.\nFör ett foto, nämn huvudmotiv, tillfälle eller plats.",
"upload-form-label-usage-title": "Användning",
"upload-form-label-usage-filename": "Filnamn",
"foreign-structured-upload-form-label-own-work": "Detta är mitt eget verk",
"export-download": "Ladda ner som fil",
"export-templates": "Inkludera mallar",
"export-pagelinks": "Inkludera länkade sidor till ett djup på:",
+ "export-manual": "Lägg till sidor manuellt:",
"allmessages": "Systemmeddelanden",
"allmessagesname": "Namn",
"allmessagesdefault": "Standardtext",
"mediastatistics": "Mediastatistik",
"mediastatistics-summary": "Statistik om uppladdade filtyper. Detta inkluderar bara den senaste versionen av en fil. Äldre eller raderade filversioner exkluderas.",
"mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
- "mediastatistics-bytespertype": "Total filstorlek för detta avsnitt: $1 byte.",
- "mediastatistics-allbytes": "Total filstorlek för alla filer: $1 byte.",
+ "mediastatistics-bytespertype": "Total filstorlek för detta avsnitt: {{PLURAL:$1|$1 byte}} ($2; $3%).",
+ "mediastatistics-allbytes": "Total filstorlek för alla filer: {{PLURAL:$1|$1 byte}} ($2).",
"mediastatistics-table-mimetype": "MIME-typ",
"mediastatistics-table-extensions": "Möjliga tillägg",
"mediastatistics-table-count": "Antal filer",
"editold": "үзгәртү",
"viewsourceold": "башлангыч кодны карау",
"editlink": "үзгәртү",
- "viewsourcelink": "башлангыч кодны карау",
+ "viewsourcelink": "чыганак кодны карау",
"editsectionhint": "$1 бүлеген үзгәртү",
"toc": "Эчтәлек",
"showtoc": "күрсәтү",
"red-link-title": "$1 (мондый бит юк)",
"sort-descending": "Кимү буенча урнаштыру",
"sort-ascending": "Арту буенча урнаштыру",
- "nstab-main": "Ð\91иÑ\82",
+ "nstab-main": "Ð\9cÓ\99калÓ\99",
"nstab-user": "Кулланучы",
"nstab-media": "Мультимедиа",
"nstab-special": "Махсус бит",
"perfcachedts": "Бу мәгълүматлар кэштан алынган, ул соңгы тапкыр $1 яңартылды. Кэшта иң күбе {{PLURAL:$4|язма}} саклана",
"querypage-no-updates": "Хәзер бу битне яңартып булмый. Монда күрсәтелгән мәгълүматлар кабул ителмәячәк.",
"viewsource": "Карау",
- "viewsource-title": "$1 биÑ\82енең Ñ\8fÑ\85ма Ñ\82екÑ\81Ñ\82ын карау",
+ "viewsource-title": "$1 биÑ\82енең Ñ\87Ñ\8bганагын карау",
"actionthrottled": "Тизлек киметелгән",
"actionthrottledtext": "Спамга каршы көрәш өчен, аз вакыт эчендә бу гамәлне еш куллану тыелган һәм СЕз бирелгән вакытны бетергәнсез инде. Зинһар, соңарак кабатлагыз.",
"protectedpagetext": "Бу бит үзгәртүләрдән һәм башка төрле гамәлләрдән якланган.",
"logout": "Чыгу",
"userlogout": "Чыгу",
"notloggedin": "Сез хисап язмагызга кермәгәнсез",
- "userlogin-noaccount": "Ð\90ккаÑ\83нÑ\82 юкмы?",
- "userlogin-joinproject": "Проектка керү",
+ "userlogin-noaccount": "ХиÑ\81ап Ñ\8fзмагÑ\8bз юкмы?",
+ "userlogin-joinproject": "{{SITENAME}} проектына керү",
"nologin": "Кулланучы исемең юкмы? '''$1'''",
"nologinlink": "Хисап язмасы төзү",
"createaccount": "Яңа кулланучыны теркәү",
"nowiki_tip": "Вики-форматлауны исәпкә алмау",
"image_sample": "Мисал.jpg",
"image_tip": "Куелган файл",
- "media_tip": "Ð\9cедиа-Ñ\84айлга сылтама",
+ "media_tip": "Файлга сылтама",
"sig_tip": "Имза һәм вакыт",
"hr_tip": "Горизонталь сызык (еш кулланмагыз)",
"summary": "Үзгәртүләр тасвирламасы:",
"edit-gone-missing": "Битне яңартып булмый.\nУл бетерелгән булырга мөмкин.",
"edit-conflict": "Үзгәртүләр конфликты.",
"edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
+ "postedit-confirmation-created": "Бит төзелде",
"edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
"editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
"duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
"nextn": "чираттагы {{PLURAL:$1|$1}}",
"prevn-title": "Алдагы $1 {{PLURAL:$1|язма}}",
"nextn-title": "{{PLURAL:$1|Киләсе $1 язма}}",
- "shown-title": "Сәхифәдә $1 {{PLURAL:$1|1=язма|язма}} күрсәтелсен",
+ "shown-title": "Сәхифәдә $1 {{PLURAL:$1|язма}} күрсәтелсен",
"viewprevnext": "Күрсәтелүе: ($1 {{int:pipe-separator}} $2) ($3)",
"searchmenu-exists": "<strong>Бу вики-проектта «[[:$1]]» исемле бит бар инде</strong>{{PLURAL:$2|0=|Башка эзләү нәтиҗәләрен дә карап ал.}}",
"searchmenu-new": "<strong>«Әлеге [[:$1]]» вики-проектта бит ясарга!</strong>\n{{PLURAL:$2|0=|Шулай ук, эзләү ярдәмендә табылган битне карагыз.|Шулай ук, эзләү ярдәмендә табылган битләрне карагыз.}}",
"searchprofile-images-tooltip": "Файллар эзләү",
"searchprofile-everything-tooltip": "Барлык битләрдән эзләү",
"searchprofile-advanced-tooltip": "Бирелгән исемнәр мәйданында эзләү",
- "search-result-size": "$1 ({{PLURAL:$2|1 сүз|$2 сүз}})",
+ "search-result-size": "$1 ({{PLURAL:$2|$2 сүз}})",
"search-result-category-size": "{{PLURAL:$1|1=1 әгъза|$1 әгъза}} ({{PLURAL:$2|1=1 асттөркем|$2 асттөркем}}, {{PLURAL:$3|1=1 файл|$3 файл}})",
"search-redirect": "(юнәлтү $1)",
"search-section": "($1 бүлеге)",
"enhancedrc-history": "тарих",
"recentchanges": "Соңгы үзгәртүләр",
"recentchanges-legend": "Соңгы үзгәртүләр көйләүләре",
- "recentchanges-summary": "Ð\91Ñ\83 биÑ\82Ñ\82Ó\99 {{grammar:genitive|{{SITENAME}}}} пÑ\80оекÑ\82Ñ\8bнÑ\8bÒ£ Ñ\81оңгÑ\8b үзгÓ\99Ñ\80Ñ\82үлÓ\99Ñ\80е күÑ\80Ñ\81Ó\99Ñ\82елÓ\99.",
+ "recentchanges-summary": "ТөÑ\80ле биÑ\82лÓ\99Ñ\80дÓ\99 Ñ\8dÑ\88лÓ\99нгÓ\99н Ñ\81оңгÑ\8b үзгÓ\99Ñ\80Ñ\82үлÓ\99Ñ\80 иÑ\81емлеге.",
"recentchanges-feed-description": "Бу агымда соңгы үзгәртүләрне күзәтү.",
"recentchanges-label-newpage": "Бу үзгәртү белән яңа бит төзелгән",
"recentchanges-label-minor": "Бу кече үзгәртү",
"recentchanges-label-unpatrolled": "Үзгәртүне әлегә тикшермәгәннәр",
"recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
"recentchanges-legend-heading": "'''Легенда: '''",
- "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|яңа бит]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (шулай ук [[Special:NewPages|яңа битләр исемлеген]] карагыз)",
"rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
"rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
"rcshowhideminor": "кече үзгәртүләрне $1",
- "rcshowhideminor-show": "күÑ\80Ñ\81Ó\99Ñ\82",
- "rcshowhideminor-hide": "яшер",
+ "rcshowhideminor-show": "Ð\9aÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯",
+ "rcshowhideminor-hide": "Яшер",
"rcshowhidebots": "ботларны $1",
"rcshowhidebots-show": "Күрсәт",
- "rcshowhidebots-hide": "яшер",
+ "rcshowhidebots-hide": "Яшер",
"rcshowhideliu": "теркәлгән кулланучыларны $1",
"rcshowhideliu-show": "күрсәт",
- "rcshowhideliu-hide": "яшер",
+ "rcshowhideliu-hide": "Яшер",
"rcshowhideanons": "кермәгән кулланучыларны $1",
- "rcshowhideanons-show": "күÑ\80Ñ\81Ó\99Ñ\82",
- "rcshowhideanons-hide": "яшер",
+ "rcshowhideanons-show": "Ð\9aÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯",
+ "rcshowhideanons-hide": "Яшер",
"rcshowhidepatr": "тикшерелгән үзгәртүләрне $1",
"rcshowhidepatr-hide": "яшер",
"rcshowhidemine": "минем үзгәртүләремне $1",
- "rcshowhidemine-show": "күÑ\80Ñ\81Ó\99Ñ\82",
- "rcshowhidemine-hide": "яшер",
+ "rcshowhidemine-show": "Ð\9aÒ¯Ñ\80Ñ\81Ó\99Ñ\82Ò¯",
+ "rcshowhidemine-hide": "Яшер",
"rclinks": "Соңгы $2 көн эчендә соңгы $1 үзгәртүне күрсәт<br />$3",
"diff": "аерма",
"hist": "тарих",
- "hide": "яшер",
- "show": "күрсәт",
+ "hide": "Яшер",
+ "show": "Ð\9aүрсәт",
"minoreditletter": "к",
"newpageletter": "Я",
"boteditletter": "б",
"recentchangeslinked-feed": "Бәйләнешле үзгәртүләр",
"recentchangeslinked-toolbox": "Бәйләнешле үзгәртүләр",
"recentchangeslinked-title": "\"$1\" битенә бәйләнешле үзгәртүләр",
- "recentchangeslinked-summary": "Бу күрсәтелгән бит белән сылталган (йә күрсәтелгән төркемгә керткән) битләрнең үзгәртелмәләре исемлеге.\n[[Special:Watchlist|Күзәтү исемлегегезгә]] керә торган битләр '''калын'''.",
+ "recentchangeslinked-summary": "Бу күрсәтелгән бит белән сылталган (йә күрсәтелгән төркемгә керткән) битләрнең үзгәртелмәләре исемлеге.\n[[Special:Watchlist|Күзәтү исемлегегезгә]] керә торган битләр '''калын''' итеп күрсәтелгән.",
"recentchangeslinked-page": "Битнең исеме:",
"recentchangeslinked-to": "Моның урынына бу биткә бәйле булган битләрдәге үзгәртүләрне күрсәтү",
"upload": "Файлны йөкләү",
"listfiles_count": "Юрамалар",
"file-anchor-link": "Файл",
"filehist": "Файлның тарихы",
- "filehist-help": "Ð\94аÑ\82ага/Ñ\81Ó\99гаÑ\82Ñ\8cкÓ\99, Ñ\88Ñ\83л вакÑ\8bÑ\82Ñ\82а биÑ\82нең нинди бÑ\83лганлÑ\8bгÑ\8bн күÑ\80Ò¯ Ó©Ñ\87ен басыгыз.",
+ "filehist-help": "ФайлнÑ\8bÒ£ нинди бÑ\83лганлÑ\8bгÑ\8bн күÑ\80Ò¯ Ó©Ñ\87ен даÑ\82ага/Ñ\81Ó\99гаÑ\82Ñ\8cкÓ\99 басыгыз.",
"filehist-deleteall": "Барысын да юк ит",
"filehist-deleteone": "бетерү",
"filehist-revert": "кайтару",
"filehist-current": "хәзерге",
"filehist-datetime": "Дата/вакыт",
"filehist-thumb": "Миниатюра",
- "filehist-thumbtext": "$1 көнне булган версиянең эскизы",
+ "filehist-thumbtext": "$1 көнне булган юрама эскизы",
"filehist-nothumb": "Миниатюрасы юк",
"filehist-user": "Кулланучы",
"filehist-dimensions": "Зурлык",
"whatlinkshere-prev": "{{PLURAL:$1|1=алдагы}} $1",
"whatlinkshere-next": "{{PLURAL:$1|1=киләсе}} $1",
"whatlinkshere-links": "← сылтамалар",
- "whatlinkshere-hideredirs": "юнәлтүләрне $1",
- "whatlinkshere-hidetrans": "кертүләрне $1",
- "whatlinkshere-hidelinks": "сылтамаларны $1",
+ "whatlinkshere-hideredirs": "Юнәлтүләрне $1",
+ "whatlinkshere-hidetrans": "Ð\9aертүләрне $1",
+ "whatlinkshere-hidelinks": "Сылтамаларны $1",
"whatlinkshere-hideimages": "$1 файл сылтамалары",
"whatlinkshere-filters": "Фильтрлар",
"blockip": "{{GENDER:$1|Кулланучыны}} тыю",
"tooltip-pt-mytalk": "Бәхәс битегез",
"tooltip-pt-preferences": "Көйләнмәләрегез",
"tooltip-pt-watchlist": "Сез күзәтелгән төзәтмәле битләр исемлеге",
- "tooltip-pt-mycontris": "Сезнең кеÑ\80Ñ\82еменгезне иÑ\81емлеге",
+ "tooltip-pt-mycontris": "Сезнең кеÑ\80Ñ\82емегез",
"tooltip-pt-login": "Сез хисап язмасы төзи алыр идегез, әмма бу мәҗбүри түгел.",
"tooltip-pt-logout": "Чыгу",
"tooltip-pt-createaccount": "Сезгә аккаунт ясарга һәм системага керергә киңәш итәбез, әмма бу мәҗбүри түгел.",
"tooltip-ca-watch": "Бу битне сезнең күзәтү исемлегезгә өстәү",
"tooltip-ca-unwatch": "Бу битне сезнең күзәтү исемлегездә бетерү",
"tooltip-search": "{{SITENAME}} эчендә эзләү",
- "tooltip-search-go": "Нәк шундый исеме белән биткә күчәрү",
+ "tooltip-search-go": "Нәкъ шундый исеме белән биткә күчәрү",
"tooltip-search-fulltext": "Бу текст белән битләрне табу",
- "tooltip-p-logo": "Баш бит",
- "tooltip-n-mainpage": "Ð\91аÑ\88 биÑ\82не кеÑ\80еп Ñ\87Ñ\8bгÑ\83",
+ "tooltip-p-logo": "Баш биткә күчү",
+ "tooltip-n-mainpage": "Ð\91аÑ\88 биÑ\82кÓ\99 күÑ\87Ò¯",
"tooltip-n-mainpage-description": "Баш биткә күчү",
"tooltip-n-portal": "Проект турында, сез нәрсә итә аласыз һәм нәрсә кайда була дип турында.",
"tooltip-n-currentevents": "Агымдагы вакыйгалар турында мәгълүматны табу",
"tooltip-t-recentchangeslinked": "Бу биттән сылтаган битләрдә ахыргы үзгәртүләр",
"tooltip-feed-rss": "Бу бит өчен RSS трансляциясе",
"tooltip-feed-atom": "Бу бит өчен Atom трансляциясе",
- "tooltip-t-contributions": "Ð\9aÑ\83лланÑ\83Ñ\87Ñ\8b кеÑ\80Ñ\82еменең иÑ\81емлегене карау",
+ "tooltip-t-contributions": "Ð\91Ñ\83 кÑ\83лланÑ\83Ñ\87Ñ\8bнÑ\8bÒ£ кеÑ\80Ñ\82ем иÑ\81емлеген карау",
"tooltip-t-emailuser": "Бу кулланучыга хат җибәрү",
"tooltip-t-upload": "Файлларны йөкләү",
"tooltip-t-specialpages": "Барлык махсус битләр исемлеге",
"tooltip-ca-nstab-category": "Төркем битен карау",
"tooltip-minoredit": "Бу үзгәртүне кече дип билгелү",
"tooltip-save": "Үзгәртүләрегезне саклау",
- "tooltip-preview": "Сезнең үзгÓ\99Ñ\80Ñ\82үлÓ\99Ñ\80егезнең алдан каÑ\80авÑ\8b, Ñ\81аклаÑ\83дан кадÓ\99Ñ\80 монÑ\8b кÑ\83лланÑ\8bгÑ\8bз Ó\99ле!",
+ "tooltip-preview": "Ð\90лдан каÑ\80аÑ\83, Ñ\81аклаÑ\83 алдÑ\8bннан үзгÓ\99Ñ\80Ñ\82үлÓ\99Ñ\80егезнең каÑ\80ап Ñ\87Ñ\8bгÑ\8bгÑ\8bз!",
"tooltip-diff": "Сезнең үзгәртүләрегезне күрсәтү.",
"tooltip-compareselectedversions": "Бу битнең сайланган ике юрамасы арасында аерманы карау",
"tooltip-watch": "Бу битне күзәтү исемлегемә өстәү",
"exif-software": "Программалы тәэмин ителеш",
"exif-artist": "Автор",
"exif-copyright": "Автор хокуклары хуҗасы",
- "exif-exifversion": "Exif версиясе",
+ "exif-exifversion": "Exif юрамасы",
"exif-flashpixversion": "FlashPix юрамасын тәэмин итү",
"exif-colorspace": "Төсләр тирәлеге",
"exif-componentsconfiguration": "Төсләр төзелешенең конфигурациясе",
"specialpages-group-users": "Кулланучылар һәм аларның хокуклары",
"specialpages-group-highuse": "Еш кулланылучы битләр",
"specialpages-group-pages": "Битләр исемлеге",
- "specialpages-group-pagetools": "Бит өчен җиһазлар",
+ "specialpages-group-pagetools": "Бит өчен кораллар",
"specialpages-group-wiki": "Мәгълүмат һәм җиһазлар",
"specialpages-group-redirects": "Күчерелүче махсус битләр",
"specialpages-group-spam": "Спамга каршы кораллар",
"intentionallyblankpage": "Бу бит махсус буш калдырылган",
"external_image_whitelist": "#Бу юлны ничек бар, шулаө калдырыгыз<pre>\n#Монда даими фразаларның фрагментларын куегыз (// арасында торган өлешен)\n#алар тышкы сурәтләрнең URL белән бәйләнерләр.\n#Туры килгәннәре сурәт буларак, туры килмәгәннәре сурәткә сылтама буларак күрсәтеләчәкләр.\n# # билгесе белән башланучы юллар шәрехнамә дип саналалар.\n#Юллар регистрга игътибар бирмиләр.\n\n#Даими фразаларның фрагментларын бу кыр өстендә куегыз. Бу кырны ничек бар, шулай калдырыгыз.</pre>",
"tags": "Гамәлдә булучы үзгәртүләр билгеләре",
- "tag-filter": "[[Special:Tags|Tag]] фильтры:",
+ "tag-filter": "[[Special:Tags|Билгеләр]] фильтры:",
"tag-filter-submit": "Фильтрлау",
"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Билге|Билгеләр}}]]: $2)",
"tags-title": "Теглар",
"revdelete-uname-unhid": "кулланучының исеме ачылган",
"revdelete-restricted": "чикләүләр идарәчеләргә дә кулланыла",
"revdelete-unrestricted": "чикләүләр идарәчеләр өчен бетерелгән",
- "logentry-move-move": "$1 $3 сәхифәсен $4 {{GENDER:$2|итеп күчерде}}",
+ "logentry-move-move": "$1 $3 битенең исемен {{GENDER:$2| үзгәртте}}. Яңа исеме: $4",
"logentry-move-move-noredirect": "$1 юнәлтү калдырмыйча $3 сәхифәсен $4 итеп күчерде",
"logentry-move-move_redir": "$1 юнәлтү аша $3 сәхифәсен $4 итеп күчерде",
"logentry-move-move_redir-noredirect": "$1 юнәлтү аша, юнәлтү калдырмыйча $3 сәхифәсен $4 итеп күчерде",
"nstab-template": "قېلىپ",
"nstab-help": "ياردەم بەت",
"nstab-category": "تۈر",
+ "mainpage-nstab": "باش بەت",
"nosuchaction": "بۇنداق مەشغۇلات يوق",
"nosuchactiontext": "بۇ مەشغۇلات بېكىتكەن URL ئىناۋەتسىز.\n\nURL نى خاتا كىرگۈزۈپ قالدىڭىز ياكى خاتا ئۇلانمىغا ئەگەشتىڭىز.\n\n {{SITENAME}} بېكەت يۇمشاق دېتالىنىڭ خاتالىقى بولۇشى مۇمكىن.",
"nosuchspecialpage": "بۇنىڭغا ئوخشاش ئالاھىدە بەت يوق",
"createaccountreason": "سەۋەب:",
"createacct-reason": "سەۋەبى",
"createacct-reason-ph": "نېمىشقا باشقا ھېسابات قۇرماقچى بولدىڭىز",
- "createacct-captcha": "بىخەتەرلىك تەكشۈرۈشى",
- "createacct-imgcaptcha-ph": "ئۈستىدە كۆرگىنىڭىزنى كىرگۈزۈڭ",
"createacct-submit": "ھېساباتىڭىزنى قۇرۇڭ",
"createacct-another-submit": "باشقا ھېسابات قۇرىمەن",
"createacct-benefit-heading": "{{SITENAME}} سىزگە ئوخشاش كىشىلەر تەرىپىدىن قۇرۇلغان.",
"loginlanguagelabel": "تىل: $1",
"suspicious-userlogout": "تىزىمدىن چىقىش ئىلتىماسىڭىز رەت قىلىندى، چۈنكى ئۇ بەلكىم بۇزۇلغان توركۆرگۈ ياكى غەملەك ۋاكالەتچىسى يوللىغان بولۇشى مۇمكىن.",
"createacct-another-realname-tip": "ھەقىقىي ئىسمىڭىز ئىختىيارى.\nئەگەر تەمىنلەشنى تاللىسىڭىز، ئۇ سىزنىڭ تۆھپىڭىزنىڭ ئىمزاسى بولىدۇ.",
+ "pt-login": "تىزىمغا كىرىڭ",
+ "pt-createaccount": "ھېسابات قۇر",
"php-mail-error-unknown": "PHP نىڭ mail() فونكسىيەسىدىكى يوچۇن خاتالىق",
"user-mail-no-addy": "ئېلخەت ئادرېسسىز خەت يوللاشنى سىنىدى.",
"user-mail-no-body": "بوش ياكى مەزمۇنى قىسقا مۇۋاپىق بولمىغان تورخەت ئەۋەتىشنى سىنىدى.",
"passwordreset-emailtext-ip": "باشقىلار (بەلكىم سىز، IP ئادرېسى $1) {{SITENAME}} ($4) دىكى پارولنى قايتا بېكىتىشنى ئىلتىماس قىلدى. تۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}ى مۇشۇ ئېلخەتكە باغلانغان:\n\n$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
"passwordreset-emailtext-user": "{{SITENAME}} دىكى ئىشلەتكۈچى $1 بېكەت {{SITENAME}} ($4) دىكى پارولىڭىزنى قايتا بېكىتىشنى ئىلتىماس قىلدى .\nتۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}($4)ى مۇشۇ ئېلخەتكە باغلانغان:\n\n$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
"passwordreset-emailelement": "ئىشلەتكۈچى نامى: \n$1\n\nۋاقىتلىق پارول: \n$2",
- "passwordreset-emailsent": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى.",
+ "passwordreset-emailsentemail": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى.",
"passwordreset-emailsent-capture": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى، تۆۋەندە كۆرسىتىلىدۇ.",
"passwordreset-emailerror-capture": "ھاسىل قىلىنغان پارولنى قايتا بېكىتىش ئېلخېتى تۆۋەندە كۆرسىتىلگەندەك ئەمما ئۇنى {{GENDER:$2|ئىشلەتكۈچى}}گە يوللىيالمىدى: $1",
"changeemail": "ئېلخەت ئادرېس ئۆزگەرت",
- "changeemail-text": "بۇ جەدۋەل تاماملانسا ئېلخەت ئادرېسىڭىزنى ئۆزگەرتىدۇ. سىز ئىم كىرگۈزۈپ بۇ ئۆزگەرتىشنى جەزملەيسىز.",
+ "changeemail-header": "ھېساباتنىڭ ئېلخەت ئادرېسىنى ئۆزگەرت",
"changeemail-no-info": "سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.",
"changeemail-oldemail": "نۆۋەتتىكى ئېلخەت ئادرېسى:",
"changeemail-newemail": "يېڭى ئېلخەت ئادرېسى:",
"prefs-tokenwatchlist": "ئاچقۇچ",
"prefs-diffs": "پەرقلەر",
"prefs-help-prefershttps": "بۇ سەپلەك، سىز قايتا تىزىمغا كىرگەندە ئىشلەيدۇ.",
- "email-address-validity-valid": "ئېلخەت ئادرېسى ئىناۋەتلىك",
- "email-address-validity-invalid": "ئىناۋەتلىك ئېلخەت ئادرېسىدىن بىرنى كىرگۈزۈڭ",
"userrights": "ئىشلەتكۈچى ھوقۇقى باشقۇرۇش",
"userrights-lookup-user": "ئىشلەتكۈچى گۇرۇپپىسى باشقۇرۇش",
"userrights-user-editname": "ئىشلەتكۈچى ئاتى كىرگۈزۈڭ:",
"wlheader-showupdated": "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
"wlnote": "تۆۋەندىكىسى يېقىنقى {{PLURAL:$2|سائەت}} ئىچىدىكى ئاخىرقى '{{PLURAL:$1| قېتىملىق}} ئۆزگەرتىش، $3 $4 گىچە.",
"wlshowlast": "يېقىنقى $1 سائەت $2 كۈن نىڭ ئۆزگەرتىشىنى كۆرسەت",
+ "watchlistall2": "ھەممىسى",
"watchlist-options": "كۆزەت تىزىملىك تاللانما",
"watching": "كۆزەت قىلىۋاتىدۇ…",
"unwatching": "كۆزەت قىلمايۋاتىدۇ…",
"movenosubpage": "بۇ بەتنىڭ تارماق بېتى يوق",
"movereason": "سەۋەب:",
"revertmove": "قايتۇر",
- "delete_and_move": "ئۆچۈرۈپ يۆتكە",
"delete_and_move_text": "== ئۆچۈرۈش زۆرۈر ==\nنىشان بەت \"[[:$1]]\" مەۋجۇد.\nيۆتكەشكە قولاي بولۇشى ئۈچۈن بۇ بەتنى ئۆچۈرەمسىز؟",
"delete_and_move_confirm": "ھەئە، بۇ بەتنى ئۆچۈر",
"delete_and_move_reason": " \"[[$1]]\" يۆتكەشكە قولاي بولۇشى ئۈچۈن ئۆچۈرۈۋېتىلدى",
"tooltip-pt-mycontris": "تۆھپە تىزىملىكىڭىز",
"tooltip-pt-login": "تىزىمغا كىرىشىڭىزنى تەۋسىيە قىلىمىز ئەمما مەجبۇرىي ئەمەس",
"tooltip-pt-logout": "تىزىمدىن چىق",
+ "tooltip-pt-createaccount": "ھېساباتتىن بىرنى قۇرۇپ تىزىمغا كىرىشىڭىزنى تەۋسىيە قىلىمىز، ئەمما بۇ مەجبۇرىي ئەمەس.",
"tooltip-ca-talk": "بەت مەزمۇنى ھەققىدىكى مۇنازىرە",
"tooltip-ca-edit": "بۇ بەتنى تەھرىرلىيەلەيسىز.\nساقلاشتىن ئىلگىرى ئالدىن كۆزەت كۇنۇپكىسىنى ئىشلىتىڭ",
"tooltip-ca-addsection": "يېڭى بىر مۇنازىرە باشلاڭ",
"upload-form-label-select-file": "Обрати файл",
"upload-form-label-infoform-title": "Деталі",
"upload-form-label-infoform-name": "Назва",
+ "upload-form-label-infoform-name-tooltip": "Унікальна описова назва файлу. Ви можете використовувати простий текст з пробілами. Не вказуйте розширення файла.",
"upload-form-label-infoform-description": "Опис",
+ "upload-form-label-infoform-description-tooltip": "Коротко напишіть усе основне та цікаве про цю роботу.\nНаприклад, для фото опишіть, що сфотографовано, місце та нагоду знімка.",
"upload-form-label-usage-title": "Використання",
"upload-form-label-usage-filename": "Назва файлу",
"foreign-structured-upload-form-label-own-work": "Це моя власна робота",
"export-download": "Зберегти як файл",
"export-templates": "Включити шаблони",
"export-pagelinks": "Включити пов'язані сторінки з глибиною:",
+ "export-manual": "Додати сторінки вручну:",
"allmessages": "Системні повідомлення",
"allmessagesname": "Назва",
"allmessagesdefault": "Стандартний текст",
"expand_templates_preview": "Попередній перегляд",
"expand_templates_preview_fail_html": "<em>Оскільки {{SITENAME}} має ввімкненим сирий HTML і відбулась втрата даних сесії, попередній перегляд прихований як захід безпеки від JavaScript-атак.</em>\n\n<strong>Якщо це правомірна спроба попереднього перегляду, будь ласка, спробуйте знову.</strong>\nЯкщо це досі не працює, спробуйте [[Special:UserLogout|вийти із системи]] та знову ввійти до неї.",
"expand_templates_preview_fail_html_anon": "<em>Оскільки {{SITENAME}} має ввімкненим сирий HTML, а Ви не ввійшли до системи, попередній перегляд прихований як захід безпеки від JavaScript-атак.</em>\n\n<strong>Якщо це правомірна спроба попереднього перегляду, будь ласка, [[Special:UserLogin|увійдіть до системи]] та спробуйте знову.</strong>",
+ "expand_templates_input_missing": "Ви повинні надати принаймні деякий вхідний текст.",
"pagelanguage": "Вибір мови сторінки",
"pagelang-name": "Сторінка",
"pagelang-language": "Мова",
"upload-form-label-select-file": "选择文件",
"upload-form-label-infoform-title": "详细信息",
"upload-form-label-infoform-name": "名称",
+ "upload-form-label-infoform-name-tooltip": "用于文件的唯一描述性标题,它将用作文件名。您可以使用带空格的普通语言。不要包含文件扩展名。",
"upload-form-label-infoform-description": "说明",
+ "upload-form-label-infoform-description-tooltip": "简单描述有关作品的任何显著信息。\n对于照片,可提及描述的主要事物、场景或地点。",
"upload-form-label-usage-title": "用法",
"upload-form-label-usage-filename": "文件名",
"foreign-structured-upload-form-label-own-work": "这是我的作品",
"export-download": "另存为文件",
"export-templates": "包含模板",
"export-pagelinks": "包含链接页面的搜索深度:",
+ "export-manual": "手动添加页面:",
"allmessages": "系统消息",
"allmessagesname": "名称",
"allmessagesdefault": "默认信息文字",
"expand_templates_preview": "预览",
"expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录。",
"expand_templates_preview_fail_html_anon": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请尝试[[Special:UserLogin|登录]]并重试。</strong>",
+ "expand_templates_input_missing": "您需要提供至少一些输入文本。",
"pagelanguage": "页面语言选择器",
"pagelang-name": "页面",
"pagelang-language": "语言",
*/
private $mDb = null;
+ /** @var float UNIX timestamp */
+ private $lastSlaveWait = 0.0;
+
/**
* Used when creating separate schema files.
* @var resource
}
/**
- * Commit a transcation on a DB
+ * Commit the transcation on a DB handle and wait for slaves to catch up
*
* This method makes it clear that commit() is called from a maintenance script,
* which has outermost scope. This is safe, unlike $dbw->commit() called in other places.
*
* @param IDatabase $dbw
* @param string $fname Caller name
+ * @return bool Whether the slave wait succeeded
* @since 1.27
*/
protected function commitTransaction( IDatabase $dbw, $fname ) {
$dbw->commit( $fname );
+
+ $ok = wfWaitForSlaves( $this->lastSlaveWait, false, '*', 30 );
+ $this->lastSlaveWait = microtime( true );
+
+ return $ok;
}
/**
- * Rollback a transcation on a DB
+ * Rollback the transcation on a DB handle
*
* This method makes it clear that rollback() is called from a maintenance script,
* which has outermost scope. This is safe, unlike $dbw->rollback() called in other places.
$this->reporting = !$this->hasOption( 'quiet' );
if ( $this->hasOption( 'pagelist' ) ) {
- $olddir = getcwd();
- chdir( $originalDir );
- $pages = file( $this->getOption( 'quiet' ) );
- chdir( $olddir );
+ $filename = $this->getOption( 'pagelist' );
+ $pages = file( $filename );
if ( $pages === false ) {
- echo "Unable to open file {$options['pagelist']}\n";
- die( 1 );
+ $this->fatalError( "Unable to open file {$filename}\n" );
}
$pages = array_map( 'trim', $pages );
$this->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
+++ /dev/null
-<?php
-/**
- * Wait for the slaves to catch up to the master position.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- * @see wfWaitForSlaves()
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script to wait for the slaves to catch up to the master position.
- *
- * @ingroup Maintenance
- */
-class WaitForSlave extends Maintenance {
- public function execute() {
- wfWaitForSlaves();
- }
-}
-
-$maintClass = "WaitForSlave";
-require_once RUN_MAINTENANCE_IF_MAIN;
"grunt-jscs": "2.5.0",
"grunt-jsonlint": "1.0.7",
"grunt-karma": "0.12.1",
- "karma": "0.13.10",
+ "karma": "0.13.19",
"karma-chrome-launcher": "0.2.0",
"karma-firefox-launcher": "0.1.6",
"karma-qunit": "0.1.5",
);
}
if ( response.parse.categorieshtml ) {
- $( '#catlinks' ).replaceWith( response.parse.categorieshtml[ '*' ] );
+ $content = $( $.parseHTML( response.parse.categorieshtml[ '*' ] ) );
+ mw.hook( 'wikipage.categories' ).fire( $content );
+ $( '.catlinks[data-mw="interface"]' ).replaceWith( $content );
}
if ( response.parse.templates ) {
newList = [];
-/*global OO*/
+/*global OO */
( function ( mw, $ ) {
/**
- * This is a factory for MessagePoster objects, which allows a pluggable to way to script leaving a
- * talk page message.
+ * Factory for MessagePoster objects. This provides a pluggable to way to script the action
+ * of adding a message to someone's talk page.
*
* @class mw.messagePoster.factory
* @singleton
*/
- function MwMessagePosterFactory() {
+ function MessagePosterFactory() {
this.contentModelToClass = {};
}
- OO.initClass( MwMessagePosterFactory );
+ OO.initClass( MessagePosterFactory );
// Note: This registration scheme is currently not compatible with LQT, since that doesn't
- // have its own content model, just islqttalkpage. LQT pages will be passed to the wikitext
+ // have its own content model, just islqttalkpage. LQT pages will be passed to the wikitext
// MessagePoster.
/**
- * Registers a MessagePoster subclass for a given content model.
+ * Register a MessagePoster subclass for a given content model.
*
* @param {string} contentModel Content model of pages this MessagePoster can post to
- * @param {Function} messagePosterConstructor Constructor for MessagePoster
+ * @param {Function} constructor Constructor of a MessagePoster subclass
*/
- MwMessagePosterFactory.prototype.register = function ( contentModel, messagePosterConstructor ) {
+ MessagePosterFactory.prototype.register = function ( contentModel, constructor ) {
if ( this.contentModelToClass[ contentModel ] !== undefined ) {
- throw new Error( 'The content model \'' + contentModel + '\' is already registered.' );
+ throw new Error( 'Content model "' + contentModel + '" is already registered' );
}
- this.contentModelToClass[ contentModel ] = messagePosterConstructor;
+ this.contentModelToClass[ contentModel ] = constructor;
};
/**
- * Unregisters a given content model
- * This is exposed for testing and should not normally be needed.
+ * Unregister a given content model.
+ * This is exposed for testing and should not normally be used.
*
* @param {string} contentModel Content model to unregister
*/
- MwMessagePosterFactory.prototype.unregister = function ( contentModel ) {
+ MessagePosterFactory.prototype.unregister = function ( contentModel ) {
delete this.contentModelToClass[ contentModel ];
};
/**
- * Creates a MessagePoster, given a title. A promise for this is returned.
- * This works by determining the content model, then loading the corresponding
- * module (which will register the MessagePoster class), and finally constructing it.
+ * Create a MessagePoster for given a title.
*
- * This does not require the message and should be called as soon as possible, so it does the
- * API and ResourceLoader requests in the background.
+ * A promise for this is returned. It works by determining the content model, then loading
+ * the corresponding module (which registers the MessagePoster class), and finally constructing
+ * an object for the given title.
+ *
+ * This does not require the message and should be called as soon as possible, so that the
+ * API and ResourceLoader requests run in the background.
*
* @param {mw.Title} title Title that will be posted to
* @param {string} [apiUrl] api.php URL if the title is on another wiki
* - error Error explanation
* - details Further error details
*/
- MwMessagePosterFactory.prototype.create = function ( title, apiUrl ) {
- var pageId, page, contentModel, moduleName, api,
- factory = this;
-
- if ( apiUrl ) {
- api = new mw.ForeignApi( apiUrl );
- } else {
- api = new mw.Api();
- }
+ MessagePosterFactory.prototype.create = function ( title, apiUrl ) {
+ var factory = this,
+ api = apiUrl ? new mw.ForeignApi( apiUrl ) : new mw.Api();
return api.get( {
action: 'query',
prop: 'info',
indexpageids: true,
titles: title.getPrefixedDb()
- } ).then( function ( result ) {
- if ( result.query.pageids && result.query.pageids.length > 0 ) {
- pageId = result.query.pageids[ 0 ];
- page = result.query.pages[ pageId ];
-
- contentModel = page.contentmodel;
- moduleName = 'mediawiki.messagePoster.' + contentModel;
- return mw.loader.using( moduleName ).then( function () {
- return factory.createForContentModel(
- contentModel,
- title,
- api
- );
- }, function () {
- return $.Deferred().reject( 'failed-to-load-module', 'Failed to load the \'' + moduleName + '\' module' );
- } );
- } else {
+ } ).then( function ( data ) {
+ var pageId, page, contentModel, moduleName;
+ if ( !data.query.pageids[ 0 ] ) {
return $.Deferred().reject( 'unexpected-response', 'Unexpected API response' );
}
- }, function ( errorCode, details ) {
- return $.Deferred().reject( 'content-model-query-failed', errorCode, details );
- } ).promise();
+ pageId = data.query.pageids[ 0 ];
+ page = data.query.pages[ pageId ];
+
+ contentModel = page.contentmodel;
+ moduleName = 'mediawiki.messagePoster.' + contentModel;
+ return mw.loader.using( moduleName ).then( function () {
+ return factory.createForContentModel(
+ contentModel,
+ title,
+ api
+ );
+ }, function () {
+ return $.Deferred().reject( 'failed-to-load-module', 'Failed to load "' + moduleName + '"' );
+ } );
+ }, function ( error, details ) {
+ return $.Deferred().reject( 'content-model-query-failed', error, details );
+ } );
};
/**
* Creates a MessagePoster instance, given a title and content model
*
* @private
- *
* @param {string} contentModel Content model of title
* @param {mw.Title} title Title being posted to
* @param {mw.Api} api mw.Api instance that the instance should use
* @return {mw.messagePoster.MessagePoster}
*
*/
- MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
+ MessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
return new this.contentModelToClass[ contentModel ]( title, api );
};
mw.messagePoster = {
- factory: new MwMessagePosterFactory()
+ factory: new MessagePosterFactory()
};
}( mediaWiki, jQuery ) );
function humanSize( bytes ) {
if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
var i = 0,
- units = [ '', ' kB', ' MB', ' GB', ' TB', ' PB' ];
+ units = [ '', ' KiB', ' MiB', ' GiB', ' TiB', ' PiB' ];
for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
// Maintain one decimal for kB and above, but don't
} );
}
+ $nodes = $( '.catlinks[data-mw="interface"]' );
+ if ( $nodes.length ) {
+ /**
+ * Fired when categories are being added to the DOM
+ *
+ * It is encouraged to fire it before the main DOM is changed (when $content
+ * is still detached). However, this order is not defined either way, so you
+ * should only rely on $content itself.
+ *
+ * This includes the ready event on a page load (including post-edit loads)
+ * and when content has been previewed with LivePreview.
+ *
+ * @event wikipage_categories
+ * @member mw.hook
+ * @param {jQuery} $content The most appropriate element containing the content,
+ * such as .catlinks
+ */
+ mw.hook( 'wikipage.categories' ).fire( $nodes );
+ }
} );
}( mediaWiki, jQuery ) );
+++ /dev/null
-<?php
-/**
- * Integration test that checks import success and
- * LinkCache integration.
- *
- * @group medium
- * @group Database
- *
- * @author mwjames
- */
-class ImportLinkCacheIntegrationTest extends MediaWikiTestCase {
-
- private $importStreamSource;
-
- protected function setUp() {
- parent::setUp();
-
- $file = dirname( __DIR__ ) . '/data/import/ImportLinkCacheIntegrationTest.xml';
-
- $this->importStreamSource = ImportStreamSource::newFromFile( $file );
-
- if ( !$this->importStreamSource->isGood() ) {
- throw new Exception( "Import source for {$file} failed" );
- }
- }
-
- public function testImportForImportSource() {
-
- $this->doImport( $this->importStreamSource );
-
- // Imported title
- $loremIpsum = Title::newFromText( 'Lorem ipsum' );
-
- $this->assertSame(
- $loremIpsum->getArticleID(),
- $loremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
- );
-
- $categoryLoremIpsum = Title::newFromText( 'Category:Lorem ipsum' );
-
- $this->assertSame(
- $categoryLoremIpsum->getArticleID(),
- $categoryLoremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
- );
-
- $page = new WikiPage( $loremIpsum );
- $page->doDeleteArticle( 'import test: delete page' );
-
- $page = new WikiPage( $categoryLoremIpsum );
- $page->doDeleteArticle( 'import test: delete page' );
- }
-
- /**
- * @depends testImportForImportSource
- */
- public function testReImportForImportSource() {
-
- $this->doImport( $this->importStreamSource );
-
- // ReImported title
- $loremIpsum = Title::newFromText( 'Lorem ipsum' );
-
- $this->assertSame(
- $loremIpsum->getArticleID(),
- $loremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
- );
-
- $categoryLoremIpsum = Title::newFromText( 'Category:Lorem ipsum' );
-
- $this->assertSame(
- $categoryLoremIpsum->getArticleID(),
- $categoryLoremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
- );
- }
-
- private function doImport( $importStreamSource ) {
-
- $importer = new WikiImporter(
- $importStreamSource->value,
- ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
- );
- $importer->setDebug( true );
-
- $reporter = new ImportReporter(
- $importer,
- false,
- '',
- false
- );
-
- $reporter->setContext( new RequestContext() );
- $reporter->open();
- $exception = false;
-
- try {
- $importer->doImport();
- } catch ( Exception $e ) {
- $exception = $e;
- }
-
- $result = $reporter->close();
-
- $this->assertFalse(
- $exception
- );
-
- $this->assertTrue(
- $result->isGood()
- );
- }
-
-}
+++ /dev/null
-<?php
-
-/**
- * Test class for Import methods.
- *
- * @group Database
- *
- * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
- */
-class ImportTest extends MediaWikiLangTestCase {
-
- private function getDataSource( $xml ) {
- return new ImportStringSource( $xml );
- }
-
- /**
- * @covers WikiImporter::handlePage
- * @dataProvider getRedirectXML
- * @param string $xml
- * @param string|null $redirectTitle
- */
- public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
- $source = $this->getDataSource( $xml );
-
- $redirect = null;
- $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
- $sRevCount, $pageInfo ) use ( &$redirect ) {
- if ( array_key_exists( 'redirect', $pageInfo ) ) {
- $redirect = $pageInfo['redirect'];
- }
- };
-
- $importer = new WikiImporter(
- $source,
- ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
- );
- $importer->setPageOutCallback( $callback );
- $importer->doImport();
-
- $this->assertEquals( $redirectTitle, $redirect );
- }
-
- public function getRedirectXML() {
- // @codingStandardsIgnoreStart Generic.Files.LineLength
- return array(
- array(
- <<< EOF
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
- <page>
- <title>Test</title>
- <ns>0</ns>
- <id>21</id>
- <redirect title="Test22"/>
- <revision>
- <id>20</id>
- <timestamp>2014-05-27T10:00:00Z</timestamp>
- <contributor>
- <username>Admin</username>
- <id>10</id>
- </contributor>
- <comment>Admin moved page [[Test]] to [[Test22]]</comment>
- <model>wikitext</model>
- <format>text/x-wiki</format>
- <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
- <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
- </revision>
- </page>
-</mediawiki>
-EOF
- ,
- 'Test22'
- ),
- array(
- <<< EOF
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.9/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version="0.9" xml:lang="en">
- <page>
- <title>Test</title>
- <ns>0</ns>
- <id>42</id>
- <revision>
- <id>421</id>
- <timestamp>2014-05-27T11:00:00Z</timestamp>
- <contributor>
- <username>Admin</username>
- <id>10</id>
- </contributor>
- <text xml:space="preserve" bytes="4">Abcd</text>
- <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
- <model>wikitext</model>
- <format>text/x-wiki</format>
- </revision>
- </page>
-</mediawiki>
-EOF
- ,
- null
- ),
- );
- // @codingStandardsIgnoreEnd
- }
-
- /**
- * @covers WikiImporter::handleSiteInfo
- * @dataProvider getSiteInfoXML
- * @param string $xml
- * @param array|null $namespaces
- */
- public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
- $source = $this->getDataSource( $xml );
-
- $importNamespaces = null;
- $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
- $importNamespaces = $siteinfo['_namespaces'];
- };
-
- $importer = new WikiImporter(
- $source,
- ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
- );
- $importer->setSiteInfoCallback( $callback );
- $importer->doImport();
-
- $this->assertEquals( $importNamespaces, $namespaces );
- }
-
- public function getSiteInfoXML() {
- // @codingStandardsIgnoreStart Generic.Files.LineLength
- return array(
- array(
- <<< EOF
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
- <siteinfo>
- <namespaces>
- <namespace key="-2" case="first-letter">Media</namespace>
- <namespace key="-1" case="first-letter">Special</namespace>
- <namespace key="0" case="first-letter" />
- <namespace key="1" case="first-letter">Talk</namespace>
- <namespace key="2" case="first-letter">User</namespace>
- <namespace key="3" case="first-letter">User talk</namespace>
- <namespace key="100" case="first-letter">Portal</namespace>
- <namespace key="101" case="first-letter">Portal talk</namespace>
- </namespaces>
- </siteinfo>
-</mediawiki>
-EOF
- ,
- array(
- '-2' => 'Media',
- '-1' => 'Special',
- '0' => '',
- '1' => 'Talk',
- '2' => 'User',
- '3' => 'User talk',
- '100' => 'Portal',
- '101' => 'Portal talk',
- )
- ),
- );
- // @codingStandardsIgnoreEnd
- }
-
-}
--- /dev/null
+<?php
+/**
+ * Integration test that checks import success and
+ * LinkCache integration.
+ *
+ * @group medium
+ * @group Database
+ *
+ * @author mwjames
+ */
+class ImportLinkCacheIntegrationTest extends MediaWikiTestCase {
+
+ private $importStreamSource;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $file = dirname( __DIR__ ) . '/../data/import/ImportLinkCacheIntegrationTest.xml';
+
+ $this->importStreamSource = ImportStreamSource::newFromFile( $file );
+
+ if ( !$this->importStreamSource->isGood() ) {
+ throw new Exception( "Import source for {$file} failed" );
+ }
+ }
+
+ public function testImportForImportSource() {
+
+ $this->doImport( $this->importStreamSource );
+
+ // Imported title
+ $loremIpsum = Title::newFromText( 'Lorem ipsum' );
+
+ $this->assertSame(
+ $loremIpsum->getArticleID(),
+ $loremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
+ );
+
+ $categoryLoremIpsum = Title::newFromText( 'Category:Lorem ipsum' );
+
+ $this->assertSame(
+ $categoryLoremIpsum->getArticleID(),
+ $categoryLoremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
+ );
+
+ $page = new WikiPage( $loremIpsum );
+ $page->doDeleteArticle( 'import test: delete page' );
+
+ $page = new WikiPage( $categoryLoremIpsum );
+ $page->doDeleteArticle( 'import test: delete page' );
+ }
+
+ /**
+ * @depends testImportForImportSource
+ */
+ public function testReImportForImportSource() {
+
+ $this->doImport( $this->importStreamSource );
+
+ // ReImported title
+ $loremIpsum = Title::newFromText( 'Lorem ipsum' );
+
+ $this->assertSame(
+ $loremIpsum->getArticleID(),
+ $loremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
+ );
+
+ $categoryLoremIpsum = Title::newFromText( 'Category:Lorem ipsum' );
+
+ $this->assertSame(
+ $categoryLoremIpsum->getArticleID(),
+ $categoryLoremIpsum->getArticleID( Title::GAID_FOR_UPDATE )
+ );
+ }
+
+ private function doImport( $importStreamSource ) {
+
+ $importer = new WikiImporter(
+ $importStreamSource->value,
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
+ $importer->setDebug( true );
+
+ $reporter = new ImportReporter(
+ $importer,
+ false,
+ '',
+ false
+ );
+
+ $reporter->setContext( new RequestContext() );
+ $reporter->open();
+ $exception = false;
+
+ try {
+ $importer->doImport();
+ } catch ( Exception $e ) {
+ $exception = $e;
+ }
+
+ $result = $reporter->close();
+
+ $this->assertFalse(
+ $exception
+ );
+
+ $this->assertTrue(
+ $result->isGood()
+ );
+ }
+
+}
--- /dev/null
+<?php
+
+/**
+ * Test class for Import methods.
+ *
+ * @group Database
+ *
+ * @author Sebastian Brückner < sebastian.brueckner@student.hpi.uni-potsdam.de >
+ */
+class ImportTest extends MediaWikiLangTestCase {
+
+ private function getDataSource( $xml ) {
+ return new ImportStringSource( $xml );
+ }
+
+ /**
+ * @covers WikiImporter
+ * @dataProvider getUnknownTagsXML
+ * @param string $xml
+ * @param string $text
+ * @param string $title
+ */
+ public function testUnknownXMLTags( $xml, $text, $title ) {
+ $source = $this->getDataSource( $xml );
+
+ $importer = new WikiImporter(
+ $source,
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
+
+ $importer->doImport();
+ $title = Title::newFromText( $title );
+ $this->assertTrue( $title->exists() );
+
+ $this->assertEquals( WikiPage::factory( $title )->getContent()->getNativeData(), $text );
+ }
+
+ public function getUnknownTagsXML() {
+ // @codingStandardsIgnoreStart Generic.Files.LineLength
+ return array(
+ array(
+ <<< EOF
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
+ <page unknown="123" dontknow="533">
+ <title>TestImportPage</title>
+ <unknowntag>Should be ignored</unknowntag>
+ <ns>0</ns>
+ <id unknown="123" dontknow="533">14</id>
+ <revision>
+ <id unknown="123" dontknow="533">15</id>
+ <unknowntag>Should be ignored</unknowntag>
+ <timestamp>2016-01-03T11:18:43Z</timestamp>
+ <contributor>
+ <unknowntag>Should be ignored</unknowntag>
+ <username unknown="123" dontknow="533">Admin</username>
+ <id>1</id>
+ </contributor>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="0">noitazinagro tseb eht si ikiWaideM</text>
+ <sha1>phoiac9h4m842xq45sp7s6u21eteeq1</sha1>
+ <unknowntag>Should be ignored</unknowntag>
+ </revision>
+ </page>
+ <unknowntag>Should be ignored</unknowntag>
+</mediawiki>
+EOF
+ ,
+ 'noitazinagro tseb eht si ikiWaideM',
+ 'TestImportPage'
+ )
+ );
+ // @codingStandardsIgnoreEnd
+ }
+
+ /**
+ * @covers WikiImporter::handlePage
+ * @dataProvider getRedirectXML
+ * @param string $xml
+ * @param string|null $redirectTitle
+ */
+ public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
+ $source = $this->getDataSource( $xml );
+
+ $redirect = null;
+ $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
+ $sRevCount, $pageInfo ) use ( &$redirect ) {
+ if ( array_key_exists( 'redirect', $pageInfo ) ) {
+ $redirect = $pageInfo['redirect'];
+ }
+ };
+
+ $importer = new WikiImporter(
+ $source,
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
+ $importer->setPageOutCallback( $callback );
+ $importer->doImport();
+
+ $this->assertEquals( $redirectTitle, $redirect );
+ }
+
+ public function getRedirectXML() {
+ // @codingStandardsIgnoreStart Generic.Files.LineLength
+ return array(
+ array(
+ <<< EOF
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
+ <page>
+ <title>Test</title>
+ <ns>0</ns>
+ <id>21</id>
+ <redirect title="Test22"/>
+ <revision>
+ <id>20</id>
+ <timestamp>2014-05-27T10:00:00Z</timestamp>
+ <contributor>
+ <username>Admin</username>
+ <id>10</id>
+ </contributor>
+ <comment>Admin moved page [[Test]] to [[Test22]]</comment>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
+ <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
+ </revision>
+ </page>
+</mediawiki>
+EOF
+ ,
+ 'Test22'
+ ),
+ array(
+ <<< EOF
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.9/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version="0.9" xml:lang="en">
+ <page>
+ <title>Test</title>
+ <ns>0</ns>
+ <id>42</id>
+ <revision>
+ <id>421</id>
+ <timestamp>2014-05-27T11:00:00Z</timestamp>
+ <contributor>
+ <username>Admin</username>
+ <id>10</id>
+ </contributor>
+ <text xml:space="preserve" bytes="4">Abcd</text>
+ <sha1>n7uomjq96szt60fy5w3x7ahf7q8m8rh</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
+ </revision>
+ </page>
+</mediawiki>
+EOF
+ ,
+ null
+ ),
+ );
+ // @codingStandardsIgnoreEnd
+ }
+
+ /**
+ * @covers WikiImporter::handleSiteInfo
+ * @dataProvider getSiteInfoXML
+ * @param string $xml
+ * @param array|null $namespaces
+ */
+ public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
+ $source = $this->getDataSource( $xml );
+
+ $importNamespaces = null;
+ $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
+ $importNamespaces = $siteinfo['_namespaces'];
+ };
+
+ $importer = new WikiImporter(
+ $source,
+ ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+ );
+ $importer->setSiteInfoCallback( $callback );
+ $importer->doImport();
+
+ $this->assertEquals( $importNamespaces, $namespaces );
+ }
+
+ public function getSiteInfoXML() {
+ // @codingStandardsIgnoreStart Generic.Files.LineLength
+ return array(
+ array(
+ <<< EOF
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
+ <siteinfo>
+ <namespaces>
+ <namespace key="-2" case="first-letter">Media</namespace>
+ <namespace key="-1" case="first-letter">Special</namespace>
+ <namespace key="0" case="first-letter" />
+ <namespace key="1" case="first-letter">Talk</namespace>
+ <namespace key="2" case="first-letter">User</namespace>
+ <namespace key="3" case="first-letter">User talk</namespace>
+ <namespace key="100" case="first-letter">Portal</namespace>
+ <namespace key="101" case="first-letter">Portal talk</namespace>
+ </namespaces>
+ </siteinfo>
+</mediawiki>
+EOF
+ ,
+ array(
+ '-2' => 'Media',
+ '-1' => 'Special',
+ '0' => '',
+ '1' => 'Talk',
+ '2' => 'User',
+ '3' => 'User talk',
+ '100' => 'Portal',
+ '101' => 'Portal talk',
+ )
+ ),
+ );
+ // @codingStandardsIgnoreEnd
+ }
+
+}
--- /dev/null
+<?php
+
+use MediaWiki\Site\MediaWikiPageNameNormalizer;
+
+/**
+ * @covers MediaWiki\Site\MediaWikiPageNameNormalizer
+ *
+ * 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
+ *
+ * @since 1.27
+ *
+ * @group Site
+ * @group medium
+ *
+ * @author Marius Hoch
+ */
+class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
+
+ protected function setUp() {
+ parent::setUp();
+
+ static $connectivity = null;
+
+ if ( $connectivity === null ) {
+ // Check whether we have (reasonable fast) connectivity
+ $res = Http::get(
+ 'https://www.wikidata.org/w/api.php?action=query&meta=siteinfo&format=json',
+ array( 'timeout' => 3 ),
+ __METHOD__
+ );
+
+ if ( $res === false || strpos( $res, '"sitename":"Wikidata"' ) === false ) {
+ $connectivity = false;
+ } else {
+ $connectivity = true;
+ }
+ }
+
+ if ( !$connectivity ) {
+ $this->markTestSkipped( 'MediaWikiPageNameNormalizerTest needs internet connectivity.' );
+ }
+ }
+
+ /**
+ * @dataProvider normalizePageTitleProvider
+ */
+ public function testNormalizePageTitle( $expected, $pageName ) {
+ $normalizer = new MediaWikiPageNameNormalizer();
+
+ $this->assertSame(
+ $expected,
+ $normalizer->normalizePageName( $pageName, 'https://www.wikidata.org/w/api.php' )
+ );
+ }
+
+ public function normalizePageTitleProvider() {
+ // Note: This makes (very conservative) assumptions about pages on Wikidata
+ // existing or not.
+ return array(
+ 'universe (Q1)' => array(
+ 'Q1', 'Q1'
+ ),
+ 'Q404 redirects to Q395' => array(
+ 'Q395', 'Q404'
+ ),
+ 'there is no Q0' => array(
+ false, 'Q0'
+ )
+ );
+ }
+
+}
function () {
mw.messagePoster.factory.register( TEST_MODEL, testMessagePosterConstructor );
},
- new RegExp( 'The content model \'' + TEST_MODEL + '\' is already registered.' ),
+ new RegExp( 'Content model "' + TEST_MODEL + '" is already registered' ),
'Throws exception is same model is registered a second time'
);
} );