* Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
the sidebar just before its display.
* (bug 49156) Added the mediawiki.cookie ResourceLoader module, which wraps
- jQuery.cookie so that getting/setting a cookie is syntactically and functionally
- similar to using the WebRequest#getCookie/WebResponse#setcookie methods.
+ jquery.cookie so that getting/setting a cookie is syntactically and
+ functionally similar to using the WebRequest::getCookie() and
+ WebResponse::setcookie() methods.
* (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1. A new configuration option,
$wgIncludejQueryMigrate, also loads the jQuery Migrate hack to let extensions
and gadgets use the long-deprecated functions that were removed in jQuery 1.9.
can probably be changed to no longer special-case redirects.
* Header font set to a serif font stack. See
https://www.mediawiki.org/wiki/Typography_refresh for further information.
-* (bug 65567) Added a new hook, "BeforeHttpsRedirect", to allow cancellation of the HTTP
- to HTTPS redirect due to forceHTTPS cookie, userRequires, etc. This is only for page views,
- since this hook doesn't affect UserLogin, OAuth, CentralAuth, etc.
- ATTENTION: This hook is likely to be removed soon due to overall design of the system.
+* (bug 65567) Added a new hook, "BeforeHttpsRedirect", to allow cancellation of
+ the HTTP to HTTPS redirect due to forceHTTPS cookie, userRequires, etc. This
+ is only for page views, since this hook doesn't affect UserLogin, OAuth,
+ CentralAuth, etc. ATTENTION: This hook is likely to be removed soon due to
+ overall design of the system.
* (bug 17367) It is now possible to add pages to your watchlist from
Special:UnwatchedPages without reloading the special page.
* New methods setVolatile and isVolatile are added to PPFrame, so that
extensions such as Cite.php can mark that their output is volatile and
shouldn't be cached.
-* (bug 52817) Advanced search options are now saved on the search page itself, rather
- than in a dedicated pane in the preferences panel.
+* (bug 52817) Advanced search options are now saved on the search page itself,
+ rather than in a dedicated pane in the preferences panel.
* (bug 44591) The dropdown actions menu (little triangle next to page tabs) in
the Vector skin has gained a label that should make it more discoverable.
* MWCryptHKDF added for fast, cryptographically secure random number generation
* (bug 49116) Footer copyright notice is now always displayed in user language
rather than content language (same as copyright notice for editing interface).
* (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
- restriction was present in the parameters. Images with both the "frame"
+ restriction was present in the parameters. Images with both the "frame"
option and a size specification set will now always ignore the provided
size and display an unscaled image, as the documentation has always
claimed it would.
* The deprecated 'SpecialVersionExtensionTypes' hook was removed.
* (bug 63891) Add 'X-Robots-Tag: noindex' header in action=render pages.
* SpecialPage no longer supports the syntax for invoking wfSpecial*() functions.
- All special pages should subclass SpecialPage and implement the execute() method.
+ Special pages should subclass SpecialPage and implement the execute() method.
* (bug 63755) The deprecated constants RC_MOVE and RC_MOVE_OVER_REDIRECT were
removed.
* Special:MostLinkedTemplates has been renamed to Special:MostTranscludedPages.
+* The skin autodiscovery mechanism has been deprecated and will be removed in
+ MediaWiki 1.25. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery
+ for migration guide for creators and users of custom skins that relied on it.
==== Renamed classes ====
* CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
* To register a new one:
* @code
* $wgRecentChangesFlags['flag'] => array(
+ * // message for the letter displayed next to rows on changes lists
* 'letter' => 'letter-msg',
- * 'title' => 'tooltip-msg'
+ * // message for the tooltip of the letter
+ * 'title' => 'tooltip-msg',
+ * // optional (defaults to 'tooltip-msg'), message to use in the legend box
+ * 'legend' => 'legend-msg',
+ * // optional (defaults to 'flag'), CSS class to put on changes lists rows
+ * 'class' => 'css-class',
* );
* @endcode
*
- * Optional 'class' allows to set a css class different than the flag name.
- *
* @since 1.22
*/
$wgRecentChangesFlags = array(
- 'newpage' => array( 'letter' => 'newpageletter',
- 'title' => 'recentchanges-label-newpage' ),
- 'minor' => array( 'letter' => 'minoreditletter',
- 'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
- 'bot' => array( 'letter' => 'boteditletter',
- 'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
- 'unpatrolled' => array( 'letter' => 'unpatrolledletter',
- 'title' => 'recentchanges-label-unpatrolled' ),
+ 'newpage' => array(
+ 'letter' => 'newpageletter',
+ 'title' => 'recentchanges-label-newpage',
+ 'legend' => 'recentchanges-legend-newpage',
+ ),
+ 'minor' => array(
+ 'letter' => 'minoreditletter',
+ 'title' => 'recentchanges-label-minor',
+ 'legend' => 'recentchanges-legend-minor',
+ 'class' => 'minoredit',
+ ),
+ 'bot' => array(
+ 'letter' => 'boteditletter',
+ 'title' => 'recentchanges-label-bot',
+ 'legend' => 'recentchanges-legend-bot',
+ 'class' => 'botedit',
+ ),
+ 'unpatrolled' => array(
+ 'letter' => 'unpatrolledletter',
+ 'title' => 'recentchanges-label-unpatrolled',
+ 'legend' => 'recentchanges-legend-unpatrolled',
+ ),
);
/** @} */ # end RC/watchlist }
// Expiry selected from list
$this->mExpiry[$action] = '';
$this->mExpirySelection[$action] = $requestExpirySelection;
- } elseif ( $existingExpiry == 'infinity' ) {
- // Existing expiry is infinite, use "infinite" in drop-down
- $this->mExpiry[$action] = '';
- $this->mExpirySelection[$action] = 'infinite';
} elseif ( $existingExpiry ) {
// Use existing expiry in its own list item
$this->mExpiry[$action] = '';
$this->mExpirySelection[$action] = $existingExpiry;
} else {
+ // Catches 'infinity' - Existing expiry is infinite, use "infinite" in drop-down
// Final default: infinite
$this->mExpiry[$action] = '';
$this->mExpirySelection[$action] = 'infinite';
// This is one of the reasons we should have never used autodiscovery in the first
// place. This hack can be safely removed when autodiscovery is gone.
if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) {
+ wfLogWarning(
+ "An old copy of the $aSkin skin was found in your skins/ directory. " .
+ "You should remove it to avoid problems in the future." .
+ "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details."
+ );
continue;
}
+ wfLogWarning(
+ "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " .
+ "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " .
+ "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this."
+ );
$wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
}
}
* @since 1.21
*/
public function dieUsageMsgOrDebug( $error ) {
- global $wgDebugAPI;
- if ( $wgDebugAPI !== true ) {
+ if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
$this->dieUsageMsg( $error );
}
if ( is_string( $error ) ) {
$error = array( $error );
}
-
$parsed = $this->parseMsg( $error );
$this->setWarning( '$wgDebugAPI: ' . $parsed['code'] . ' - ' . $parsed['info'] );
}
$result = array();
if ( $status->isGood() ) {
// Success!
- global $wgEmailAuthentication;
$user = $status->getValue();
if ( $params['language'] ) {
'createaccount-title',
'createaccount-text'
) );
- } elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+ } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) && Sanitizer::validateEmail( $user->getEmail() ) ) {
// Send out an email authentication message if needed
$status->merge( $user->sendConfirmationMail() );
}
}
public function getAllowedParams() {
- global $wgEmailConfirmToEdit;
-
return array(
'name' => array(
ApiBase::PARAM_TYPE => 'user',
'token' => null,
'email' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => $wgEmailConfirmToEdit
+ ApiBase::PARAM_REQUIRED => $this->getConfig()->get( 'EmailConfirmToEdit' ),
),
'realname' => null,
'mailpassword' => array(
);
// 'passwordtooshort' has parameters. :(
- global $wgMinimalPasswordLength;
$errors[] = array(
'code' => 'passwordtooshort',
- 'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )
+ 'info' => wfMessage( 'passwordtooshort', $this->getConfig()->get( 'MinimalPasswordLength' ) )
->inLanguage( 'en' )->useDatabase( false )->parse()
);
$status = $ep->internalAttemptSave( $result, $user->isAllowed( 'bot' ) && $params['bot'] );
$wgRequest = $oldRequest;
- global $wgMaxArticleSize;
switch ( $status->value ) {
case EditPage::AS_HOOK_ERROR:
case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
case EditPage::AS_CONTENT_TOO_BIG:
- $this->dieUsageMsg( array( 'contenttoobig', $wgMaxArticleSize ) );
+ $this->dieUsageMsg( array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ) );
case EditPage::AS_READ_ONLY_PAGE_ANON:
$this->dieUsageMsg( 'noedit-anon' );
}
public function getPossibleErrors() {
- global $wgMaxArticleSize;
-
return array_merge( parent::getPossibleErrors(),
$this->getTitleOrPageIdErrorMessage(),
array(
array( 'spamdetected', 'spam' ),
array( 'summaryrequired' ),
array( 'blockedtext' ),
- array( 'contenttoobig', $wgMaxArticleSize ),
+ array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ),
array( 'noedit-anon' ),
array( 'noedit' ),
array( 'actionthrottledtext' ),
public function execute() {
$params = $this->extractRequestParams();
- global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
- if ( !$wgFeed ) {
+ $config = $this->getConfig();
+ if ( !$config->get( 'Feed' ) ) {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+ $feedClasses = $config->get( 'FeedClasses' );
+ if ( !isset( $feedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
- global $wgMiserMode;
- if ( $params['showsizediff'] && $wgMiserMode ) {
+ if ( $params['showsizediff'] && $this->getConfig()->get( 'MiserMode' ) ) {
$this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
}
$msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
- $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+ $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg . ' [' . $config->get( 'LanguageCode' ) . ']';
$feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
$target = $params['user'] == 'newbies'
? 'newbies'
: Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
- $feed = new $wgFeedClasses[$params['feedformat']] (
+ $feed = new $feedClasses[$params['feedformat']] (
$feedTitle,
htmlspecialchars( $msg ),
$feedUrl
'showSizeDiff' => $params['showsizediff'],
) );
- if ( $pager->getLimit() > $wgFeedLimit ) {
- $pager->setLimit( $wgFeedLimit );
+ $feedLimit = $this->getConfig()->get( 'FeedLimit' );
+ if ( $pager->getLimit() > $feedLimit ) {
+ $pager->setLimit( $feedLimit );
}
$feedItems = array();
}
public function getAllowedParams() {
- global $wgFeedClasses;
- $feedFormatNames = array_keys( $wgFeedClasses );
+ $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
return array(
'feedformat' => array(
* as an RSS/Atom feed.
*/
public function execute() {
- global $wgFeed, $wgFeedClasses;
+ $config = $this->getConfig();
$this->params = $this->extractRequestParams();
- if ( !$wgFeed ) {
+ if ( !$config->get( 'Feed' ) ) {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if ( !isset( $wgFeedClasses[$this->params['feedformat']] ) ) {
+ $feedClasses = $config->get( 'FeedClasses' );
+ if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
}
public function getAllowedParams() {
- global $wgFeedClasses, $wgAllowCategorizedRecentChanges, $wgFeedLimit;
- $feedFormatNames = array_keys( $wgFeedClasses );
+ $config = $this->getConfig();
+ $feedFormatNames = array_keys( $config->get( 'FeedClasses' ) );
$ret = array(
'feedformat' => array(
'limit' => array(
ApiBase::PARAM_DFLT => 50,
ApiBase::PARAM_MIN => 1,
- ApiBase::PARAM_MAX => $wgFeedLimit,
+ ApiBase::PARAM_MAX => $config->get( 'FeedLimit' ),
ApiBase::PARAM_TYPE => 'integer',
),
'from' => array(
'showlinkedto' => false,
);
- if ( $wgAllowCategorizedRecentChanges ) {
+ if ( $config->get( 'AllowCategorizedRecentChanges' ) ) {
$ret += array(
'categories' => array(
ApiBase::PARAM_TYPE => 'string',
* Wrap the result as an RSS/Atom feed.
*/
public function execute() {
- global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
+ $config = $this->getConfig();
+ $feedClasses = $config->get( 'FeedClasses' );
try {
$params = $this->extractRequestParams();
- if ( !$wgFeed ) {
+ if ( !$config->get( 'Feed' ) ) {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+ if ( !isset( $feedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
'wlprop' => 'title|user|comment|timestamp|ids',
'wldir' => 'older', // reverse order - from newest to oldest
'wlend' => $endTime, // stop at this time
- 'wllimit' => min( 50, $wgFeedLimit )
+ 'wllimit' => min( 50, $this->getConfig()->get( 'FeedLimit' ) )
);
if ( $params['wlowner'] !== null ) {
$msg = wfMessage( 'watchlist' )->inContentLanguage()->text();
- $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+ $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - ' . $msg . ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
$feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
- $feed = new $wgFeedClasses[$params['feedformat']] (
+ $feed = new $feedClasses[$params['feedformat']] (
$feedTitle,
htmlspecialchars( $msg ),
$feedUrl
$this->getMain()->setCacheMaxAge( 0 );
// @todo FIXME: Localise brackets
- $feedTitle = $wgSitename . ' - Error - ' .
+ $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - Error - ' .
wfMessage( 'watchlist' )->inContentLanguage()->text() .
- ' [' . $wgLanguageCode . ']';
+ ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
$feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
$feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
$msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
- $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
+ $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
if ( $e instanceof UsageException ) {
$errorCode = $e->getCodeString();
}
public function getAllowedParams( $flags = 0 ) {
- global $wgFeedClasses;
- $feedFormatNames = array_keys( $wgFeedClasses );
+ $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
$ret = array(
'feedformat' => array(
ApiBase::PARAM_DFLT => 'rss',
$this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
//Set X-Frame-Options API results (bug 39180)
- global $wgApiFrameOptions;
- if ( $wgApiFrameOptions ) {
- $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $wgApiFrameOptions" );
+ $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
+ if ( $apiFrameOptions ) {
+ $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
}
if ( $isHtml ) {
}
public function getAllowedParams() {
- global $wgImportSources;
-
return array(
'token' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_TYPE => 'upload',
),
'interwikisource' => array(
- ApiBase::PARAM_TYPE => $wgImportSources
+ ApiBase::PARAM_TYPE => $this->getConfig()->get( 'ImportSources' ),
),
'interwikipage' => null,
'fullhistory' => false,
$loginForm = new LoginForm();
$loginForm->setContext( $context );
- global $wgCookiePrefix, $wgPasswordAttemptThrottle;
-
$authRes = $loginForm->authenticateUserData();
switch ( $authRes ) {
case LoginForm::SUCCESS:
$result['lguserid'] = intval( $user->getId() );
$result['lgusername'] = $user->getName();
$result['lgtoken'] = $user->getToken();
- $result['cookieprefix'] = $wgCookiePrefix;
+ $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
$result['sessionid'] = session_id();
break;
case LoginForm::NEED_TOKEN:
$result['result'] = 'NeedToken';
$result['token'] = $loginForm->getLoginToken();
- $result['cookieprefix'] = $wgCookiePrefix;
+ $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
$result['sessionid'] = session_id();
break;
case LoginForm::THROTTLED:
$result['result'] = 'Throttled';
- $result['wait'] = intval( $wgPasswordAttemptThrottle['seconds'] );
+ $throttle = $this->getConfig()->get( 'PasswordAttemptThrottle' );
+ $result['wait'] = intval( $throttle['seconds'] );
break;
case LoginForm::USER_BLOCKED:
}
}
- global $wgAPIModules, $wgAPIFormatModules;
+ $config = $this->getConfig();
$this->mModuleMgr = new ApiModuleManager( $this );
$this->mModuleMgr->addModules( self::$Modules, 'action' );
- $this->mModuleMgr->addModules( $wgAPIModules, 'action' );
+ $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
$this->mModuleMgr->addModules( self::$Formats, 'format' );
- $this->mModuleMgr->addModules( $wgAPIFormatModules, 'format' );
+ $this->mModuleMgr->addModules( $config->get( 'APIFormatModules' ), 'format' );
$this->mResult = new ApiResult( $this );
$this->mEnableWrite = $enableWrite;
* @return bool False if the caller should abort (403 case), true otherwise (all other cases)
*/
protected function handleCORS() {
- global $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions;
-
$originParam = $this->getParameter( 'origin' ); // defaults to null
if ( $originParam === null ) {
// No origin parameter, nothing to do
return false;
}
+ $config = $this->getConfig();
$matchOrigin = self::matchOrigin(
$originParam,
- $wgCrossSiteAJAXdomains,
- $wgCrossSiteAJAXdomainExceptions
+ $config->get( 'CrossSiteAJAXdomains' ),
+ $config->get( 'CrossSiteAJAXdomainExceptions' )
);
if ( $matchOrigin ) {
}
protected function sendCacheHeaders() {
- global $wgUseXVO, $wgVaryOnXFP;
$response = $this->getRequest()->response();
$out = $this->getOutput();
- if ( $wgVaryOnXFP ) {
+ $config = $this->getConfig();
+
+ if ( $config->get( 'VaryOnXFP' ) ) {
$out->addVaryHeader( 'X-Forwarded-Proto' );
}
if ( $this->mCacheMode == 'private' ) {
$response->header( 'Cache-Control: private' );
-
return;
}
+ $useXVO = $config->get( 'UseXVO' );
if ( $this->mCacheMode == 'anon-public-user-private' ) {
$out->addVaryHeader( 'Cookie' );
$response->header( $out->getVaryHeader() );
- if ( $wgUseXVO ) {
+ if ( $useXVO ) {
$response->header( $out->getXVO() );
if ( $out->haveCacheVaryCookies() ) {
// Logged in, mark this request private
$response->header( 'Cache-Control: private' );
-
return;
}
// Logged out, send normal public headers below
// Send public headers
$response->header( $out->getVaryHeader() );
- if ( $wgUseXVO ) {
+ if ( $useXVO ) {
$response->header( $out->getXVO() );
}
* @return string
*/
protected function substituteResultWithError( $e ) {
- global $wgShowHostnames;
-
$result = $this->getResult();
// Printer may not be initialized if the extractRequestParams() fails for the main module
// Update raw mode flag for the selected printer.
$result->setRawMode( $this->mPrinter->getNeedsRawData() );
+ $config = $this->getConfig();
+
if ( $e instanceof UsageException ) {
// User entered incorrect parameters - print usage screen
$errMessage = $e->getMessageArray();
ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
}
} else {
- global $wgShowSQLErrors, $wgShowExceptionDetails;
// Something is seriously wrong
- if ( ( $e instanceof DBQueryError ) && !$wgShowSQLErrors ) {
+ if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
$info = 'Database query error';
} else {
$info = "Exception Caught: {$e->getMessage()}";
);
ApiResult::setContent(
$errMessage,
- $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : ''
+ $config->get( 'ShowExceptionDetails' ) ? "\n\n{$e->getTraceAsString()}\n\n" : ''
);
}
if ( !is_null( $requestid ) ) {
$result->addValue( null, 'requestid', $requestid );
}
- if ( $wgShowHostnames ) {
+ if ( $config->get( 'ShowHostnames' ) ) {
// servedby is especially useful when debugging errors
$result->addValue( null, 'servedby', wfHostName() );
}
* @return array
*/
protected function setupExecuteAction() {
- global $wgShowHostnames;
-
// First add the id to the top element
$result = $this->getResult();
$requestid = $this->getParameter( 'requestid' );
$result->addValue( null, 'requestid', $requestid );
}
- if ( $wgShowHostnames ) {
+ if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
$servedby = $this->getParameter( 'servedby' );
if ( $servedby ) {
$result->addValue( null, 'servedby', wfHostName() );
protected function checkMaxLag( $module, $params ) {
if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
// Check for maxlag
- global $wgShowHostnames;
$maxLag = $params['maxlag'];
list( $host, $lag ) = wfGetLB()->getMaxLag();
if ( $lag > $maxLag ) {
$response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
$response->header( 'X-Database-Lag: ' . intval( $lag ) );
- if ( $wgShowHostnames ) {
+ if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
$this->dieUsage( "Waiting for $host: $lag seconds lagged", 'maxlag' );
}
* @param bool $isError
*/
protected function printResult( $isError ) {
- global $wgDebugAPI;
- if ( $wgDebugAPI !== false ) {
+ if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
$this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
}
* @return string
*/
public function makeHelpMsg() {
- global $wgMemc, $wgAPICacheHelpTimeout;
+ global $wgMemc;
$this->setHelp();
// Get help text from cache if present
$key = wfMemcKey( 'apihelp', $this->getModuleName(),
str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
- if ( $wgAPICacheHelpTimeout > 0 ) {
+
+ $cacheHelpTimeout = $this->getConfig()->get( 'APICacheHelpTimeout' );
+ if ( $cacheHelpTimeout > 0 ) {
$cached = $wgMemc->get( $key );
if ( $cached ) {
return $cached;
}
}
$retval = $this->reallyMakeHelpMsg();
- if ( $wgAPICacheHelpTimeout > 0 ) {
- $wgMemc->set( $key, $retval, $wgAPICacheHelpTimeout );
+ if ( $cacheHelpTimeout > 0 ) {
+ $wgMemc->set( $key, $retval, $cacheHelpTimeout );
}
return $retval;
}
public function execute() {
- global $wgEnableOpenSearchSuggest, $wgSearchSuggestCacheExpiry;
$params = $this->extractRequestParams();
$search = $params['search'];
$limit = $params['limit'];
$suggest = $params['suggest'];
// Some script that was loaded regardless of wgEnableOpenSearchSuggest, likely cached.
- if ( $suggest && !$wgEnableOpenSearchSuggest ) {
+ if ( $suggest && !$this->getConfig()->get( 'EnableOpenSearchSuggest' ) ) {
$searches = array();
} else {
// Open search results may be stored for a very long time
- $this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
+ $this->getMain()->setCacheMaxAge( $this->getConfig()->get( 'SearchSuggestCacheExpiry' ) );
$this->getMain()->setCacheMode( 'public' );
$searcher = new StringPrefixSearch;
}
public function getAllowedParams() {
- global $wgOpenSearchDefaultLimit;
-
return array(
'search' => null,
'limit' => array(
- ApiBase::PARAM_DFLT => $wgOpenSearchDefaultLimit,
+ ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
ApiBase::PARAM_TYPE => 'limit',
ApiBase::PARAM_MIN => 1,
ApiBase::PARAM_MAX => 100,
'and will be removed in MediaWiki 1.24. Use "prop=langlinks" ' .
'to generate your own HTML.' );
- global $wgContLang, $wgHideInterlanguageLinks;
+ global $wgContLang;
- if ( $wgHideInterlanguageLinks || count( $languages ) == 0 ) {
+ if ( $this->getConfig()->get( 'HideInterlanguageLinks' ) || count( $languages ) == 0 ) {
return '';
}
*/
class ApiProtect extends ApiBase {
public function execute() {
- global $wgRestrictionLevels;
$params = $this->extractRequestParams();
$pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
$this->dieUsageMsg( array( 'protect-invalidaction', $p[0] ) );
}
- if ( !in_array( $p[1], $wgRestrictionLevels ) && $p[1] != 'all' ) {
+ if ( !in_array( $p[1], $this->getConfig()->get( 'RestrictionLevels' ) ) && $p[1] != 'all' ) {
$this->dieUsageMsg( array( 'protect-invalidlevel', $p[1] ) );
}
- if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) ) {
+ if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'infinity', 'never' ) ) ) {
$expiryarray[$p[0]] = $db->getInfinity();
} else {
$exp = strtotime( $expiry[$i] );
'expiry' => array(
'Expiry timestamps. If only one timestamp is ' .
'set, it\'ll be used for all protections.',
- 'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.'
+ 'Use \'infinite\', \'indefinite\', \'infinity\' or \'never\', for a never-expiring protection.'
),
'reason' => 'Reason for (un)protecting',
'cascade' => array(
if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
- global $wgEnableParserCache;
-
$popts = $page->makeParserOptions( 'canonical' );
# Parse content; note that HTML generation is only needed if we want to cache the result.
$content = $page->getContent( Revision::RAW );
+ $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
$p_result = $content->getParserOutput(
$title,
$page->getLatest(),
$popts,
- $wgEnableParserCache
+ $enableParserCache
);
# Update the links tables
$r['linkupdate'] = '';
- if ( $wgEnableParserCache ) {
+ if ( $enableParserCache ) {
$pcache = ParserCache::singleton();
$pcache->save( $p_result, $page, $popts );
}
$this->mModuleMgr = new ApiModuleManager( $this );
// Allow custom modules to be added in LocalSettings.php
- global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
+ $config = $this->getConfig();
$this->mModuleMgr->addModules( self::$QueryPropModules, 'prop' );
- $this->mModuleMgr->addModules( $wgAPIPropModules, 'prop' );
+ $this->mModuleMgr->addModules( $config->get( 'APIPropModules' ), 'prop' );
$this->mModuleMgr->addModules( self::$QueryListModules, 'list' );
- $this->mModuleMgr->addModules( $wgAPIListModules, 'list' );
+ $this->mModuleMgr->addModules( $config->get( 'APIListModules' ), 'list' );
$this->mModuleMgr->addModules( self::$QueryMetaModules, 'meta' );
- $this->mModuleMgr->addModules( $wgAPIMetaModules, 'meta' );
+ $this->mModuleMgr->addModules( $config->get( 'APIMetaModules' ), 'meta' );
// Create PageSet that will process titles/pageids/revids/generator
$this->mPageSet = new ApiPageSet( $this );
}
if ( !is_null( $params['mime'] ) ) {
- global $wgMiserMode;
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
}
if ( in_array( '*', $params['messages'] ) ) {
$message_names = Language::getMessageKeysFor( $langObj->getCode() );
if ( $params['includelocal'] ) {
- global $wgLanguageCode;
$message_names = array_unique( array_merge(
$message_names,
// Pass in the content language code so we get local messages that have a
// MediaWiki:msgkey page. We might theoretically miss messages that have no
// MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
// just a stupid case.
- MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+ MessageCache::singleton()->getAllMessageKeys( $this->getConfig()->get( 'LanguageCode' ) )
) );
}
sort( $message_names );
}
public function getAllowedParams() {
- global $wgRestrictionLevels;
-
return array(
'from' => null,
'continue' => null,
ApiBase::PARAM_ISMULTI => true
),
'prlevel' => array(
- ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+ ApiBase::PARAM_TYPE => $this->getConfig()->get( 'RestrictionLevels' ),
ApiBase::PARAM_ISMULTI => true
),
'prfiltercascade' => array(
}
if ( $params['activeusers'] ) {
- global $wgActiveUserDays;
$this->addTables( 'recentchanges' );
$this->addJoinConds( array( 'recentchanges' => array(
$this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
$this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
- $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
+ $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $this->getConfig()->get( 'ActiveUserDays' ) * 24 * 3600 );
$this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
$this->addOption( 'GROUP BY', $userFieldToSort );
}
public function getParamDescription() {
- global $wgActiveUserDays;
-
return array(
'from' => 'The user name to start enumerating from',
'to' => 'The user name to stop enumerating at',
),
'limit' => 'How many total user names to return',
'witheditsonly' => 'Only list users who have made edits',
- 'activeusers' => "Only list users active in the last {$wgActiveUserDays} days(s)"
+ 'activeusers' => "Only list users active in the last {$this->getConfig()->get( 'ActiveUserDays' )} days(s)"
);
}
);
$this->profileDBOut();
- global $wgAPIMaxDBRows;
- if ( $rowcount > $wgAPIMaxDBRows ) {
+ if ( $rowcount > $this->getConfig()->get( 'APIMaxDBRows' ) ) {
return false;
}
$this->addWhereFld( 'ipb_auto', 0 );
}
if ( isset( $params['ip'] ) ) {
- global $wgBlockCIDRLimit;
+ $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
if ( IP::isIPv4( $params['ip'] ) ) {
$type = 'IPv4';
- $cidrLimit = $wgBlockCIDRLimit['IPv4'];
+ $cidrLimit = $blockCIDRLimit['IPv4'];
$prefixLen = 0;
} elseif ( IP::isIPv6( $params['ip'] ) ) {
$type = 'IPv6';
- $cidrLimit = $wgBlockCIDRLimit['IPv6'];
+ $cidrLimit = $blockCIDRLimit['IPv6'];
$prefixLen = 3; // IP::toHex output is prefixed with "v6-"
} else {
$this->dieUsage( 'IP parameter is not valid', 'param_ip' );
}
public function getParamDescription() {
- global $wgBlockCIDRLimit;
+ $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
$p = $this->getModulePrefix();
return array(
'ip' => array(
'Get all blocks applying to this IP or CIDR range, including range blocks.',
"Cannot be used together with bkusers. CIDR ranges broader than " .
- "IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+ "IPv4/{$blockCIDRLimit['IPv4']} or IPv6/{$blockCIDRLimit['IPv6']} " .
"are not accepted"
),
'limit' => 'The maximum amount of blocks to list',
}
public function getPossibleErrors() {
- global $wgBlockCIDRLimit;
+ $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
return array_merge( parent::getPossibleErrors(),
$this->getRequireMaxOneParameterErrorMessages( array( 'users', 'ip' ) ),
array(
array(
'code' => 'cidrtoobroad',
- 'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+ 'info' => "IPv4 CIDR ranges broader than /{$blockCIDRLimit['IPv4']} are not accepted"
),
array(
'code' => 'cidrtoobroad',
- 'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+ 'info' => "IPv6 CIDR ranges broader than /{$blockCIDRLimit['IPv6']} are not accepted"
),
array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
// Scanning large datasets for rare categories sucks, and I already told
// how to have efficient subcategory access :-) ~~~~ (oh well, domas)
- global $wgMiserMode;
$miser_ns = array();
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$miser_ns = $params['namespace'];
} else {
$this->addWhereFld( 'page_namespace', $params['namespace'] );
}
public function getParamDescription() {
- global $wgMiserMode;
$p = $this->getModulePrefix();
$desc = array(
'title' => "Which category to enumerate (required). Must include " .
'limit' => 'The maximum number of pages to return.',
);
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$desc['namespace'] = array(
$desc['namespace'],
"NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
$this->addOption( 'USE INDEX', 'el_index' );
$this->addWhere( 'page_id=el_from' );
- global $wgMiserMode;
$miser_ns = array();
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$miser_ns = $params['namespace'];
} else {
$this->addWhereFld( 'page_namespace', $params['namespace'] );
}
public function getParamDescription() {
- global $wgMiserMode;
$p = $this->getModulePrefix();
$desc = array(
'prop' => array(
'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
);
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$desc['namespace'] = array(
$desc['namespace'],
"NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
* @return array Array of parameters for transform.
*/
protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
- global $wgThumbLimits;
-
if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
// We want to limit only by height in this situation, so pass the
// image's full width as the limiting width. But some file types
// don't have a width of their own, so pick something arbitrary so
// thumbnailing the default icon works.
if ( $image->getWidth() <= 0 ) {
- $thumbParams['width'] = max( $wgThumbLimits );
+ $thumbParams['width'] = max( $this->getConfig()->get( 'ThumbLimits' ) );
} else {
$thumbParams['width'] = $image->getWidth();
}
* @return void
*/
public function requestExtraData( $pageSet ) {
- global $wgDisableCounters, $wgContentHandlerUseDB;
-
$pageSet->requestField( 'page_restrictions' );
// when resolving redirects, no page will have this field
if ( !$pageSet->isResolvingRedirects() ) {
$pageSet->requestField( 'page_is_redirect' );
}
$pageSet->requestField( 'page_is_new' );
- if ( !$wgDisableCounters ) {
+ $config = $this->getConfig();
+ if ( !$config->get( 'DisableCounters' ) ) {
$pageSet->requestField( 'page_counter' );
}
$pageSet->requestField( 'page_touched' );
$pageSet->requestField( 'page_latest' );
$pageSet->requestField( 'page_len' );
- if ( $wgContentHandlerUseDB ) {
+ if ( $config->get( 'ContentHandlerUseDB' ) ) {
$pageSet->requestField( 'page_content_model' );
}
}
: array();
$this->pageIsNew = $pageSet->getCustomField( 'page_is_new' );
- global $wgDisableCounters;
-
- if ( !$wgDisableCounters ) {
+ if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
$this->pageCounter = $pageSet->getCustomField( 'page_counter' );
}
$this->pageTouched = $pageSet->getCustomField( 'page_touched' );
$pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
if ( $titleExists ) {
- global $wgDisableCounters;
-
$pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
$pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] );
- $pageInfo['counter'] = $wgDisableCounters
+ $pageInfo['counter'] = $this->getConfig()->get( 'DisableCounters' )
? ''
: intval( $this->pageCounter[$pageid] );
$pageInfo['length'] = intval( $this->pageLength[$pageid] );
* Get the count of watchers and put it in $this->watchers
*/
private function getWatcherInfo() {
- global $wgUnwatchedPageThreshold;
-
if ( count( $this->everything ) == 0 ) {
return;
}
$user = $this->getUser();
$canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
- if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+ $unwatchedPageThreshold = $this->getConfig()->get( 'UnwatchedPageThreshold' );
+ if ( !$canUnwatchedpages && !is_int( $unwatchedPageThreshold ) ) {
return;
}
) );
$this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
if ( !$canUnwatchedpages ) {
- $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+ $this->addOption( 'HAVING', "COUNT(*) >= $unwatchedPageThreshold" );
}
$res = $this->select( __METHOD__ );
$prefix = $params['prefix'];
if ( !is_null( $prefix ) ) {
- global $wgMiserMode;
- if ( $wgMiserMode ) {
+ if ( $this->getConfig()->get( 'MiserMode' ) ) {
$this->dieUsage( 'Prefix search disabled in Miser Mode', 'prefixsearchdisabled' );
}
return $vals;
}
+ /**
+ * @return array
+ */
private function getAllowedLogActions() {
- global $wgLogActions, $wgLogActionsHandlers;
-
- return array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) );
+ $config = $this->getConfig();
+ return array_keys( array_merge( $config->get( 'LogActions' ), $config->get( 'LogActionsHandlers' ) ) );
}
public function getCacheMode( $params ) {
}
public function getAllowedParams( $flags = 0 ) {
- global $wgLogTypes;
-
+ $config = $this->getConfig();
return array(
'prop' => array(
ApiBase::PARAM_ISMULTI => true,
)
),
'type' => array(
- ApiBase::PARAM_TYPE => $wgLogTypes
+ ApiBase::PARAM_TYPE => $config->get( 'LogTypes' )
),
'action' => array(
// validation on request is done in execute()
}
public function getResultProperties() {
- global $wgLogTypes;
-
return array(
'ids' => array(
'logid' => 'integer',
),
'type' => array(
'type' => array(
- ApiBase::PROP_TYPE => $wgLogTypes
+ ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' )
),
'action' => 'string'
),
}
public function getAllowedParams() {
- global $wgRestrictionLevels;
-
return array(
'namespace' => array(
ApiBase::PARAM_ISMULTI => true,
),
'level' => array(
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+ ApiBase::PARAM_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
),
'limit' => array(
ApiBase::PARAM_DFLT => 10,
}
public function getResultProperties() {
- global $wgRestrictionLevels;
-
return array(
'' => array(
'ns' => 'namespace',
),
'level' => array(
'level' => array(
- ApiBase::PROP_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+ ApiBase::PROP_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
)
)
);
public function __construct( ApiQuery $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'qp' );
// Build mapping from special page names to QueryPage classes
- global $wgAPIUselessQueryPages;
+ $uselessQueryPages = $this->getConfig()->get( 'APIUselessQueryPages' );
$this->qpMap = array();
foreach ( QueryPage::getPages() as $page ) {
- if ( !in_array( $page[1], $wgAPIUselessQueryPages ) ) {
+ if ( !in_array( $page[1], $uselessQueryPages ) ) {
$this->qpMap[$page[1]] = $page[0];
}
}
* @param ApiPageSet $resultPageSet
*/
public function run( $resultPageSet = null ) {
- global $wgQueryCacheLimit;
-
$params = $this->extractRequestParams();
$result = $this->getResult();
if ( $ts ) {
$r['cachedtimestamp'] = wfTimestamp( TS_ISO_8601, $ts );
}
- $r['maxresults'] = $wgQueryCacheLimit;
+ $r['maxresults'] = $this->getConfig()->get( 'QueryCacheLimit' );
}
}
$result->addValue( array( 'query' ), $this->getModuleName(), $r );
}
public function getResultProperties() {
- global $wgLogTypes;
$props = array(
'' => array(
'type' => array(
ApiBase::PROP_NULLABLE => true
),
'logtype' => array(
- ApiBase::PROP_TYPE => $wgLogTypes,
+ ApiBase::PROP_TYPE => $config->get( 'LogTypes' ),
ApiBase::PROP_NULLABLE => true
),
'logaction' => array(
}
if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
- global $wgAPIMaxUncachedDiffs;
static $n = 0; // Number of uncached diffs we've had
- if ( $n < $wgAPIMaxUncachedDiffs ) {
+ if ( $n < $config->get( 'APIMaxUncachedDiffs' ) ) {
$vals['diff'] = array();
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $title );
}
public function getAllowedParams() {
- global $wgSearchType;
-
$params = array(
'search' => array(
ApiBase::PARAM_TYPE => 'string',
$alternatives[0] = self::BACKEND_NULL_PARAM;
}
$params['backend'] = array(
- ApiBase::PARAM_DFLT => $wgSearchType,
+ ApiBase::PARAM_DFLT => $this->getConfig()->get( 'SearchType' ),
ApiBase::PARAM_TYPE => $alternatives,
);
}
}
protected function appendGeneralInfo( $property ) {
- global $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
+ global $wgContLang;
+
+ $config = $this->getConfig();
$data = array();
$mainPage = Title::newMainPage();
$data['mainpage'] = $mainPage->getPrefixedText();
$data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
- $data['sitename'] = $GLOBALS['wgSitename'];
+ $data['sitename'] = $config->get( 'Sitename' );
// wgLogo can either be a relative or an absolute path
// make sure we always return an absolute path
- $data['logo'] = wfExpandUrl( $GLOBALS['wgLogo'], PROTO_RELATIVE );
+ $data['logo'] = wfExpandUrl( $config->get( 'Logo' ), PROTO_RELATIVE );
+
+ $data['generator'] = "MediaWiki {$config->get( 'Version' )}";
- $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
$data['phpversion'] = phpversion();
$data['phpsapi'] = PHP_SAPI;
- $data['dbtype'] = $GLOBALS['wgDBtype'];
+ $data['dbtype'] = $config->get( 'DBtype' );
$data['dbversion'] = $this->getDB()->getServerVersion();
$allowFrom = array( '' );
$allowException = true;
- if ( !$GLOBALS['wgAllowExternalImages'] ) {
- if ( $GLOBALS['wgEnableImageWhitelist'] ) {
+ if ( !$config->get( 'AllowExternalImages' ) ) {
+ if ( $config->get( 'EnableImageWhitelist' ) ) {
$data['imagewhitelistenabled'] = '';
}
- $allowFrom = $GLOBALS['wgAllowExternalImagesFrom'];
+ $allowFrom = $config->get( 'AllowExternalImagesFrom' );
$allowException = !empty( $allowFrom );
}
if ( $allowException ) {
$this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
}
- if ( !$wgDisableLangConversion ) {
+ if ( !$config->get( 'DisableLangConversion' ) ) {
$data['langconversion'] = '';
}
- if ( !$wgDisableTitleConversion ) {
+ if ( !$config->get( 'DisableTitleConversion' ) ) {
$data['titleconversion'] = '';
}
$data['linktrail'] = '';
}
- $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
+ global $IP;
+ $git = SpecialVersion::getGitHeadSha1( $IP );
if ( $git ) {
$data['git-hash'] = $git;
$data['git-branch'] =
SpecialVersion::getGitCurrentBranch( $GLOBALS['IP'] );
} else {
- $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
+ $svn = SpecialVersion::getSvnRevision( $IP );
if ( $svn ) {
$data['rev'] = $svn;
}
}
// 'case-insensitive' option is reserved for future
- $data['case'] = $GLOBALS['wgCapitalLinks'] ? 'first-letter' : 'case-sensitive';
-
- $data['lang'] = $GLOBALS['wgLanguageCode'];
+ $data['case'] = $config->get( 'CapitalLinks' ) ? 'first-letter' : 'case-sensitive';
+ $data['lang'] = $config->get( 'LanguageCode' );
$fallbacks = array();
foreach ( $wgContLang->getFallbackLanguages() as $code ) {
$data['readonly'] = '';
$data['readonlyreason'] = wfReadOnlyReason();
}
- if ( $GLOBALS['wgEnableWriteAPI'] ) {
+ if ( $config->get( 'EnableWriteAPI' ) ) {
$data['writeapi'] = '';
}
- $tz = $GLOBALS['wgLocaltimezone'];
- $offset = $GLOBALS['wgLocalTZoffset'];
+ $tz = $config->get( 'Localtimezone' );
+ $offset = $config->get( 'LocalTZoffset' );
if ( is_null( $tz ) ) {
$tz = 'UTC';
$offset = 0;
}
$data['timezone'] = $tz;
$data['timeoffset'] = intval( $offset );
- $data['articlepath'] = $GLOBALS['wgArticlePath'];
- $data['scriptpath'] = $GLOBALS['wgScriptPath'];
- $data['script'] = $GLOBALS['wgScript'];
- $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
- $data['server'] = $GLOBALS['wgServer'];
- $data['servername'] = $GLOBALS['wgServerName'];
+ $data['articlepath'] = $config->get( 'ArticlePath' );
+ $data['scriptpath'] = $config->get( 'ScriptPath' );
+ $data['script'] = $config->get( 'Script' );
+ $data['variantarticlepath'] = $config->get( 'VariantArticlePath' );
+ $data['server'] = $config->get( 'Server' );
+ $data['servername'] = $config->get( 'ServerName' );
$data['wikiid'] = wfWikiID();
$data['time'] = wfTimestamp( TS_ISO_8601, time() );
- if ( $GLOBALS['wgMiserMode'] ) {
+ if ( $config->get( 'MiserMode' ) ) {
$data['misermode'] = '';
}
$data['maxuploadsize'] = UploadBase::getMaxUploadSize();
- $data['thumblimits'] = $GLOBALS['wgThumbLimits'];
+ $data['thumblimits'] = $config->get( 'ThumbLimits' );
$this->getResult()->setIndexedTagName( $data['thumblimits'], 'limit' );
$data['imagelimits'] = array();
$this->getResult()->setIndexedTagName( $data['imagelimits'], 'limit' );
- foreach ( $GLOBALS['wgImageLimits'] as $k => $limit ) {
+ foreach ( $config->get( 'ImageLimits' ) as $k => $limit ) {
$data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
}
- if ( !empty( $GLOBALS['wgFavicon'] ) ) {
+ $favicon = $config->get( 'Favicon' );
+ if ( !empty( $favicon ) ) {
// wgFavicon can either be a relative or an absolute path
// make sure we always return an absolute path
- $data['favicon'] = wfExpandUrl( $GLOBALS['wgFavicon'], PROTO_RELATIVE );
+ $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
}
wfRunHooks( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
}
protected function appendNamespaceAliases( $property ) {
- global $wgNamespaceAliases, $wgContLang;
- $aliases = array_merge( $wgNamespaceAliases, $wgContLang->getNamespaceAliases() );
+ global $wgContLang;
+ $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ), $wgContLang->getNamespaceAliases() );
$namespaces = $wgContLang->getNamespaces();
$data = array();
foreach ( $aliases as $title => $ns ) {
}
protected function appendDbReplLagInfo( $property, $includeAll ) {
- global $wgShowHostnames;
$data = array();
$lb = wfGetLB();
+ $showHostnames = $this->getConfig()->get( 'ShowHostnames' );
if ( $includeAll ) {
- if ( !$wgShowHostnames ) {
+ if ( !$showHostnames ) {
$this->dieUsage(
'Cannot view all servers info unless $wgShowHostnames is true',
'includeAllDenied'
} else {
list( , $lag, $index ) = $lb->getMaxLag();
$data[] = array(
- 'host' => $wgShowHostnames
+ 'host' => $showHostnames
? $lb->getServerName( $index )
: '',
'lag' => intval( $lag )
}
protected function appendStatistics( $property ) {
- global $wgDisableCounters;
$data = array();
$data['pages'] = intval( SiteStats::pages() );
$data['articles'] = intval( SiteStats::articles() );
- if ( !$wgDisableCounters ) {
+ if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
$data['views'] = intval( SiteStats::views() );
}
$data['edits'] = intval( SiteStats::edits() );
}
protected function appendUserGroups( $property, $numberInGroup ) {
- global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups;
- global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+ $config = $this->getConfig();
$data = array();
$result = $this->getResult();
- foreach ( $wgGroupPermissions as $group => $permissions ) {
+ foreach ( $config->get( 'GroupPermissions' ) as $group => $permissions ) {
$arr = array(
'name' => $group,
'rights' => array_keys( $permissions, true ),
);
if ( $numberInGroup ) {
- global $wgAutopromote;
+ $autopromote = $config->get( 'Autopromote' );
if ( $group == 'user' ) {
$arr['number'] = SiteStats::users();
// '*' and autopromote groups have no size
- } elseif ( $group !== '*' && !isset( $wgAutopromote[$group] ) ) {
+ } elseif ( $group !== '*' && !isset( $autopromote[$group] ) ) {
$arr['number'] = SiteStats::numberInGroup( $group );
}
}
$groupArr = array(
- 'add' => $wgAddGroups,
- 'remove' => $wgRemoveGroups,
- 'add-self' => $wgGroupsAddToSelf,
- 'remove-self' => $wgGroupsRemoveFromSelf
+ 'add' => $config->get( 'AddGroups' ),
+ 'remove' => $config->get( 'RemoveGroups' ),
+ 'add-self' => $config->get( 'GroupsAddToSelf' ),
+ 'remove-self' => $config->get( 'GroupsRemoveFromSelf' )
);
foreach ( $groupArr as $type => $rights ) {
}
protected function appendFileExtensions( $property ) {
- global $wgFileExtensions;
-
$data = array();
- foreach ( array_unique( $wgFileExtensions ) as $ext ) {
+ foreach ( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) as $ext ) {
$data[] = array( 'ext' => $ext );
}
$this->getResult()->setIndexedTagName( $data, 'fe' );
}
protected function appendExtensions( $property ) {
- global $wgExtensionCredits;
$data = array();
- foreach ( $wgExtensionCredits as $type => $extensions ) {
+ foreach ( $this->getConfig()->get( 'ExtensionCredits' ) as $type => $extensions ) {
foreach ( $extensions as $ext ) {
$ret = array();
$ret['type'] = $type;
}
protected function appendRightsInfo( $property ) {
- global $wgRightsPage, $wgRightsUrl, $wgRightsText;
- $title = Title::newFromText( $wgRightsPage );
- $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $wgRightsUrl;
- $text = $wgRightsText;
+ $config = $this->getConfig();
+ $title = Title::newFromText( $config->get( 'RightsPage' ) );
+ $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $config->get( 'RightsUrl' );
+ $text = $config->get( 'RightsText' );
if ( !$text && $title ) {
$text = $title->getPrefixedText();
}
}
protected function appendRestrictions( $property ) {
- global $wgRestrictionTypes, $wgRestrictionLevels,
- $wgCascadingRestrictionLevels, $wgSemiprotectedRestrictionLevels;
-
+ $config = $this->getConfig();
$data = array(
- 'types' => $wgRestrictionTypes,
- 'levels' => $wgRestrictionLevels,
- 'cascadinglevels' => $wgCascadingRestrictionLevels,
- 'semiprotectedlevels' => $wgSemiprotectedRestrictionLevels,
+ 'types' => $config->get( 'RestrictionTypes' ),
+ 'levels' => $config->get( 'RestrictionLevels' ),
+ 'cascadinglevels' => $config->get( 'CascadingRestrictionLevels' ),
+ 'semiprotectedlevels' => $config->get( 'SemiprotectedRestrictionLevels' ),
);
$this->getResult()->setIndexedTagName( $data['types'], 'type' );
}
public function appendProtocols( $property ) {
- global $wgUrlProtocols;
// Make a copy of the global so we don't try to set the _element key of it - bug 45130
- $protocols = array_values( $wgUrlProtocols );
+ $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
$this->getResult()->setIndexedTagName( $protocols, 'p' );
return $this->getResult()->addValue( 'query', $property, $protocols );
}
public function appendSubscribedHooks( $property ) {
- global $wgHooks;
- $myWgHooks = $wgHooks;
+ $hooks = $this->getConfig()->get( 'Hooks' );
+ $myWgHooks = $hooks;
ksort( $myWgHooks );
$data = array();
- foreach ( $myWgHooks as $hook => $hooks ) {
+ foreach ( $myWgHooks as $name => $subscribers ) {
$arr = array(
- 'name' => $hook,
- 'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $hooks ),
+ 'name' => $name,
+ 'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
);
$this->getResult()->setIndexedTagName( $arr['subscribers'], 's' );
}
public function getParamDescription() {
- global $wgRCMaxAge;
$p = $this->getModulePrefix();
+ $RCMaxAge = $this->getConfig()->get( 'RCMaxAge' );
return array(
'limit' => 'The maximum number of contributions to return',
'show' => array(
"Show only items that meet thse criteria, e.g. non minor edits only: {$p}show=!minor",
"NOTE: If {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than",
- "\$wgRCMaxAge ($wgRCMaxAge) won't be shown",
+ "\$wgRCMaxAge ($RCMaxAge) won't be shown",
),
'tag' => 'Only list revisions tagged with this tag',
'toponly' => 'Only list changes which are the latest revision',
}
protected function getCurrentUserInfo() {
- global $wgHiddenPrefs, $wgRCMaxAge;
$user = $this->getUser();
$result = $this->getResult();
$vals = array();
$vals['ratelimits'] = $this->getRateLimits();
}
- if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $wgHiddenPrefs ) ) {
+ if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
$vals['realname'] = $user->getRealName();
}
}
protected function getRateLimits() {
- global $wgRateLimits;
$user = $this->getUser();
if ( !$user->isPingLimitable() ) {
return array(); // No limits
// Now get the actual limits
$retval = array();
- foreach ( $wgRateLimits as $action => $limits ) {
+ foreach ( $this->getConfig()->get( 'RateLimits' ) as $action => $limits ) {
foreach ( $categories as $cat ) {
if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
$retval[$action][$cat]['hits'] = intval( $limits[$cat][0] );
}
public function getResultProperties() {
- global $wgLogTypes;
-
return array(
'' => array(
'type' => array(
ApiBase::PROP_NULLABLE => true
),
'logtype' => array(
- ApiBase::PROP_TYPE => $wgLogTypes,
+ ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ),
ApiBase::PROP_NULLABLE => true
),
'logaction' => array(
* @since 1.21 int $flags replaced boolean $override
*/
public function addValue( $path, $name, $value, $flags = 0 ) {
- global $wgAPIMaxResultSize;
-
$data = &$this->mData;
if ( $this->mCheckingSize ) {
$newsize = $this->mSize + self::size( $value );
- if ( $newsize > $wgAPIMaxResultSize ) {
+ $maxResultSize = $this->getConfig()->get( 'APIMaxResultSize' );
+ if ( $newsize > $maxResultSize ) {
$this->setWarning(
"This result was truncated because it would otherwise be larger than the " .
- "limit of {$wgAPIMaxResultSize} bytes" );
+ "limit of {$maxResultSize} bytes" );
return false;
}
protected $mParams;
public function execute() {
- global $wgEnableAsyncUploads;
-
// Check whether upload is enabled
if ( !UploadBase::isEnabled() ) {
$this->dieUsageMsg( 'uploaddisabled' );
$this->mParams = $this->extractRequestParams();
$request = $this->getMain()->getRequest();
// Check if async mode is actually supported (jobs done in cli mode)
- $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
+ $this->mParams['async'] = ( $this->mParams['async'] && $this->getConfig()->get( 'EnableAsyncUploads' ) );
// Add the uploaded file to the params array
$this->mParams['file'] = $request->getFileName( 'file' );
$this->mParams['chunk'] = $request->getFileName( 'chunk' );
* Performs file verification, dies on error.
*/
protected function checkVerification( array $verification ) {
- global $wgFileExtensions;
-
// @todo Move them to ApiBase's message map
switch ( $verification['status'] ) {
// Recoverable errors
case UploadBase::FILETYPE_BADTYPE:
$extradata = array(
'filetype' => $verification['finalExt'],
- 'allowed' => array_values( array_unique( $wgFileExtensions ) )
+ 'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
);
$this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
* Checks if asynchronous copy uploads are enabled and throws an error if they are not.
*/
protected function checkAsyncDownloadEnabled() {
- global $wgAllowAsyncCopyUploads;
- if ( !$wgAllowAsyncCopyUploads ) {
+ if ( !$this->getConfig()->get( 'AllowAsyncCopyUploads' ) ) {
$this->dieUsage( 'Asynchronous copy uploads disabled', 'asynccopyuploaddisabled' );
}
}
"config-advanced-settings": "Configuração avançada",
"config-extensions": "Extensões",
"config-install-step-done": "feito",
+ "config-install-extensions": "Incluindo extensões",
"config-install-database": "Criando base de dados",
+ "config-install-schema": "Criando esquema",
+ "config-install-pg-commit": "Enviando alterações",
+ "config-install-user": "Criando usuário de banco de dados",
+ "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
"config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
"config-install-tables": "Criando tabelas",
"config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
unset( $legendItems['unpatrolled'] );
}
foreach ( $legendItems as $key => $item ) { # generate items of the legend
- $label = $item['title'];
+ $label = isset( $item['legend'] ) ? $item['legend'] : $item['title'];
$letter = $item['letter'];
$cssClass = isset( $item['class'] ) ? $item['class'] : $key;
$legend .= Html::element( 'dt',
array( 'class' => $cssClass ), $context->msg( $letter )->text()
+ ) . "\n" .
+ Html::rawElement( 'dd', array(),
+ $context->msg( $label )->parse()
) . "\n";
- if ( $key === 'newpage' ) {
- $legend .= Html::openElement( 'dd' );
- $legend .= $context->msg( $label )->escaped();
- $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
- $legend .= Html::closeElement( 'dd' ) . "\n";
- } else {
- $legend .= Html::element( 'dd', array(),
- $context->msg( $label )->text()
- ) . "\n";
- }
}
# (+-123)
$legend .= Html::rawElement( 'dt',
"listgrouprights-namespaceprotection-namespace": "النطاق",
"trackingcategories-name": "اسم الرسالة",
"trackingcategories-desc": "معايير إدراج تصنيف",
+ "trackingcategories-nodesc": "لا يتوفر وصف.",
"trackingcategories-disabled": "التصنيف غير مفعل",
"mailnologin": "لا يوجد عنوان للإرسال",
"mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
"watchnologin": "غير مسجل الدخول",
"addwatch": "إضافة إلى قائمة المراقبة",
"addedwatchtext": "أضيفت الصفحة \"[[:$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].\nالتغييرات القادمة على هذه الصفحة وصفحة نقاشها سيتم وضعها هناك.",
+ "addedwatchtext-short": "أضيفت صفحة \"$1\" إلى قائمة مراقبتك.",
"removewatch": "إزالة من قائمة المراقبة",
"removedwatchtext": "أزيلت الصفحة \"[[:$1]]\" من [[Special:Watchlist|قائمة مراقبتك]].",
+ "removedwatchtext-short": "أزيلت صفحة \"$1\" من قائمة مراقبتك.",
"watch": "راقب",
"watchthispage": "راقب هذه الصفحة",
"unwatch": "أوقف المراقبة",
"unwatchthispage": "أوقف المراقبة",
"notanarticle": "ليست صفحة محتوى",
"notvisiblerev": "المراجعة تم حذفها",
- "watchlist-details": "{{PLURAL:$1||صÙ\81ØØ© Ù\88اØدة|صÙ\81ØتاÙ\86|$1 صÙ\81Øات|$1 صÙ\81ØØ©}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c بدÙ\88Ù\86 عد صÙ\81Øات اÙ\84Ù\86Ù\82اش.",
+ "watchlist-details": "{{PLURAL:$1||صÙ\81ØØ© Ù\88اØدة|صÙ\81ØتاÙ\86|$1 صÙ\81Øات|$1 صÙ\81ØØ©}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c دÙ\88Ù\86 اعتبار صÙ\81Øات اÙ\84Ù\86Ù\82اش صÙ\81Øات Ù\85Ù\86Ù\81صÙ\84Ø©.",
"wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
"wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
"wlnote2": "فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.",
"enotif_lastvisited": "انظر $1 لكل التغييرات منذ زيارتك الأخيرة.",
"enotif_lastdiff": "انظر $1 لرؤية هذا التغيير.",
"enotif_anon_editor": "مستخدم مجهول $1",
- "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n{{canonicalurl: {{MediaWiki:Helppage}}}}",
+ "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n$HELPPAGE",
"created": "أنشئت",
"changed": "غيرت",
"deletepage": "حذف الصفحة",
"protect-locked-blocked": "لا يمكنك تغيير مستويات الحماية وأنت ممنوع.\nالإعدادات الحالية للصفحة '''$1''' هي:",
"protect-locked-dblock": "لا يمكن تغيير مستويات الحماية بسبب غلق قاعدة البيانات حاليا.\nالإعدادات الحالية للصفحة '''$1''' هي:",
"protect-locked-access": "لا يملك حسابك هذا صلاحية تغيير مستوى حماية الصفحة.\nالإعدادات الحالية للصفحة '''$1''' هي:",
- "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1|الصفحة|الصفحات}} التالية، والتي بها خيار حماية الصفحات المدمجة فعال.\nيمكنك تغيير مستوى حماية هذه الصفحة بدون التأثير على حماية الصفحات المدمجة الأخرى.",
+ "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1||الصفحة التالية|الصفحتين التاليتين|الصفحات التالية}}، والتي بها خيار حماية الصفحات المدمجة فعال.\nلن يؤثر تغيير مستوى حماية هذه الصفحة على حماية الصفحات المدمجة.",
"protect-default": "اسمح لكل المستخدمين",
"protect-fallback": "السماح فقط للمستخدمين ذوي الصلاحية \"$1\"",
"protect-level-autoconfirmed": "السماح فقط للمستخدمين المؤكدين تلقائيا",
"contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
"mycontris": "مساهماتي",
"contribsub2": "ل{{GENDER:$3|$1}} ($2)",
+ "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
"nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
"uctop": "حالي",
"month": "من شهر (وأقدم):",
"movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
"movearticle": "انقل الصفحة:",
"moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
+ "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة تصنيف. نرجو التنبه إلى أن ذلك سينقل الصفحة فقط و<em>لن</em> يعاد تصنيف أي صفحة في التصنيف السابق إلى التصنيف الجديد.",
"movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
"movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
"movenotallowedfile": "أنت لا تمتلك الصلاحية لنقل الملفات.",
"cant-move-user-page": "أنت لا تمتلك الصلاحية لنقل صفحات المستخدم الرئيسية.",
"cant-move-to-user-page": "أنت لا تمتلك الصلاحية لنقل صفحة إلى صفحة مستخدم (ماعدا إلى صفحة مستخدم فرعية).",
+ "cant-move-category-page": "أنت لا تمتلك صلاحية نقل صفحات التصانيف.",
+ "cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
"newtitle": "إلى العنوان الجديد:",
"move-watch": "راقب هذه الصفحة",
"movepagebtn": "انقل الصفحة",
"watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
"watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
"watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+ "watchlistedit-clear-title": "قائمة مراقبة ممسوحة",
+ "watchlistedit-clear-legend": "امسح قائمة المراقبة",
+ "watchlistedit-clear-explain": "ستحذف جميع الصفحات من قائمة مراقبتك",
"watchlistedit-clear-titles": "العناوين:",
+ "watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)",
+ "watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:",
+ "watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.",
+ "watchlisttools-clear": "امسح قائمة المراقبة",
"watchlisttools-view": "اعرض التغييرات المرتبطة",
"watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
"watchlisttools-raw": "عدل قائمة المراقبة الخام",
"nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।",
"login-userblocked": "এই ব্যবহারকারীকে বাধা দেওয়া হয়েছে। লগ-ইন সম্ভব নয়।",
"wrongpassword": "আপনি ভুল শব্দচাবি ব্যবহার করেছেন। অনুগ্রহ করে আবার চেষ্টা করুন।",
- "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়াকরে আবার চেষ্টা করুন।",
+ "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়া করে আবার চেষ্টা করুন।",
"passwordtooshort": "শব্দচাবি অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে।",
"password-name-match": "আপনার শব্দচাবি আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
"password-login-forbidden": "এই ব্যবহারকারীর নাম এবং শব্দচাবিটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
"passwordsent": "একটি নতুন শব্দচাবি \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
"blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে, তাই এই ঠিকানার অপব্যবহার করে শব্দচাবি ফেরত আনতে দেয়া যাবে না।",
"eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
- "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98নà§\8dà¦\9fার|$1 à¦\98নà§\8dà¦\9fার}} মধà§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার শবà§\8dদà¦\9aাবি বদলà§\87র তথà§\8dয পাঠানà§\8b হয়à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার রà§\8bধà§\87 পà§\8dরতি {{PLURAL:$1|à¦\98নà§\8dà¦\9fায়|$1 à¦\98ন্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
+ "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98ণà§\8dà¦\9fার|$1 à¦\98ণà§\8dà¦\9fার}} মধà§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার শবà§\8dদà¦\9aাবি বদলà§\87র তথà§\8dয পাঠানà§\8b হয়à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার রà§\8bধà§\87 পà§\8dরতি {{PLURAL:$1|à¦\98ণà§\8dà¦\9fায়|$1 à¦\98ণ্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
"mailerror": "ইমেইল পাঠাতে সমস্যা: $1",
"acct_creation_throttle_hit": "এই উইকির দর্শক আপনার IP থেকে বিগত সময়ে {{PLURAL:$1|1 টি অ্যাকাউন্ট|$1 গুলো অ্যাকাউন্ট}} তৈরি করেছেন, যা এই সময়ের জন্য সর্বোচ্চ অনুমোদনকৃত।\nফলে, এই IP থেকে দর্শক এই সময়ে নতুন অ্যাকাউন্ট তৈরি করতে পারবেন না।",
"emailauthenticated": "আপনার ইমেইল ঠিকানাটি $2 তারিখের $3 এ নিশ্চিত করা হয়েছে।",
"wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
"wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
"wlnote2": "$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।",
- "wlshowlast": "দà§\87à¦\96াà¦\93 সরà§\8dবশà§\87ষ $1 à¦\98ন্টা $2 দিন $3",
+ "wlshowlast": "দà§\87à¦\96াà¦\93 সরà§\8dবশà§\87ষ $1 à¦\98ণ্টা $2 দিন $3",
"watchlist-options": "নজর তালিকা পছন্দসমূহ",
"watching": "নজর রাখা হচ্ছে...",
"unwatching": "নজর তুলে নেওয়া হচ্ছে...",
"protect-otherreason-op": "অন্য কারণ",
"protect-dropdown": "*সুরক্ষার প্রচলিত কারণ\n** অতিরিক্ত ধ্বংসপ্রবণতা\n** অতিরিক্ত অর্থহীন বিষয়বস্তু প্রবেশ করানো\n** পাল্টা-গঠনমূলক সম্পাদনা যুদ্ধ\n** বেশি মাত্রায় প্রদর্শনকৃত পাতা",
"protect-edit-reasonlist": "সম্পাদনা সুরক্ষার কারণ",
- "protect-expiry-options": "1 ঘন্টা:1 hour,1 দিন:1 day,1 সপ্তাহ:1 week,2 সপ্তাহ:2 weeks,1 মাস:1 month,3 মাস:3 months,6 মাস:6 months,1 বছর:1 year,অসীম:infinite",
+ "protect-expiry-options": "১ ঘণ্টা:1 hour,১ দিন:1 day,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
"restriction-type": "অনুমতি:",
"restriction-level": "বাধার স্তর:",
"minimum-size": "ন্যূনতম আকার",
"ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক।",
"ipbsubmit": "এই ব্যবহারকারীকে বাধা দেয়া হোক",
"ipbother": "অন্য সময়:",
- "ipboptions": "২ à¦\98ন্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
+ "ipboptions": "২ à¦\98ণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
"ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
"ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
"ipb-disableusertalk": "এই ব্যবহারকারীকে বাধাদানকৃত অবস্থায় নিচের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
"years": "{{PLURAL:$1|$1 বছর}}",
"ago": "$1 আগে",
"just-now": "এখনই",
- "hours-ago": "$1 {{PLURAL:$1|à¦\98ন্টা}} পূর্বে",
+ "hours-ago": "$1 {{PLURAL:$1|à¦\98ণ্টা}} পূর্বে",
"minutes-ago": "$1 {{PLURAL:$1|মিনিট}} পূর্বে",
"seconds-ago": "$1 {{PLURAL:$1|সেকেন্ড}} পূর্বে",
"monday-at": "সোমবার, $1",
"exif-gpsstatus-v": "পরিমাপ একত্রীকরণ-ক্ষমতা",
"exif-gpsmeasuremode-2": "দ্বিমাত্রিক পরিমাপ",
"exif-gpsmeasuremode-3": "ত্রিমাত্রিক পরিমাপ",
- "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার পà§\8dরতি à¦\98ন্টা",
- "exif-gpsspeed-m": "মাà¦\87ল পà§\8dরতি à¦\98ন্টা",
+ "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার পà§\8dরতি à¦\98ণ্টা",
+ "exif-gpsspeed-m": "মাà¦\87ল পà§\8dরতি à¦\98ণ্টা",
"exif-gpsspeed-n": "নট",
"exif-gpsdestdistance-k": "কিলোমিটার",
"exif-gpsdestdistance-m": "ফাইল",
"api-error-verification-error": "সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।",
"duration-seconds": "$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}",
"duration-minutes": "$1 {{PLURAL:$1|মিনিট|মিনিট}}",
- "duration-hours": "$1 {{PLURAL:$1|à¦\98নà§\8dà¦\9fা|à¦\98ন্টা}}",
+ "duration-hours": "$1 {{PLURAL:$1|à¦\98ণ্টা}}",
"duration-days": "$1 {{PLURAL:$1|দিন|দিন}}",
"duration-weeks": "$1 {{PLURAL:$1|সপ্তাহ}}",
"duration-years": "$1 {{PLURAL:$1|বছর|বছর}}",
"vector-view-view": "Lenn",
"vector-view-viewsource": "Sellet ouzh tarzh an destenn",
"actions": "Oberoù",
+ "vector-more-actions": "Muioc'h",
"namespaces": "Esaouennoù anv",
"variants": "Adstummoù",
"navigation-heading": "Lañser merdeiñ",
"powersearch-togglelabel": "Activar:",
"powersearch-toggleall": "Tots",
"powersearch-togglenone": "Cap",
+ "powersearch-remember": "Recorda la selecció en cerques futures",
"search-external": "Cerca externa",
"searchdisabled": "La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.",
"search-error": "S'ha produït un error durant la recerca: $1",
"watchnologin": "No heu iniciat la sessió",
"addwatch": "Afegeix a llista de seguiment",
"addedwatchtext": "S'ha afegit la pàgina \"[[:$1]]\" a la vostra [[Special:Watchlist|llista de seguiment]].\nS'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corresponent discussió.",
+ "addedwatchtext-short": "S’ha afegit la pàgina «$1» a la vostra llista de seguiment.",
"removewatch": "Treu de la llista de seguiment",
"removedwatchtext": "S'ha tret la pàgina «[[:$1]]» de la vostra [[Special:Watchlist|llista de seguiment]].",
+ "removedwatchtext-short": "S’ha tret la pàgina «$1» de la vostra llista de seguiment.",
"watch": "Vigila",
"watchthispage": "Vigila aquesta pàgina",
"unwatch": "Desatén",
"generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
"pool-timeout": "Блоктоха еза хан тӀех йаьлла",
"pool-queuefull": "Дехаршан чоь юьззина ю",
- "pool-errorunknown": "Дойзаш доцу гlалат",
+ "pool-errorunknown": "Дойзаш доцу гӀалат",
"pool-servererror": "Пулан ларар тӀекхочучехь дац ($1).",
"aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
"aboutpage": "Project:Цуьнах лаьцна",
"nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
"nosuchspecialpage": "Иштта белхан агӀо яц",
"nospecialpagetext": "<strong>Иштта белхан агӀо яц.</strong>\n\nБелхан агӀонашан могӀам: [[Special:SpecialPages|{{int:specialpages}}]].",
- "error": "Гlалат",
- "databaseerror": "Гlалат хаамийн бухера",
+ "error": "ГӀалат",
+ "databaseerror": "ГӀалат хаамийн бухера",
"databaseerror-text": "Хаамийн базан гӀалат даьлла.\nИза хила мега программин гӀалат.",
"databaseerror-textcl": "Хаамийн базан гӀалат даьлла.",
"databaseerror-query": "Дехар: $1",
"missingarticle-rev": "(верси № $1)",
"missingarticle-diff": "(тейп тайпнара: $1, $2)",
"readonly_lag": "Хаамашан базина цхьана хан блоктоьхна, хаамашан базан сервераш нисялца.",
- "internalerror": "Чоьхьара гlалат",
- "internalerror_info": "Чоьхьара гlалат: $1",
+ "internalerror": "Чоьхьара гӀалат",
+ "internalerror_info": "Чоьхьара гӀалат: $1",
"filecopyerror": "Йиш яц копий ян «$1» оцунах «$2».",
"filerenameerror": "Файлан «$1» цӀе хийца «$2» йиш яц.",
"filedeleteerror": "ДӀаяккха цатарло файл «$1».",
"createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
"badretype": "Ахьа язъен ишарш цхьатера яц",
"userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
- "loginerror": "Гlалат ду декъашхо вовзарехь/йовзарехь",
+ "loginerror": "ГӀалат ду декъашхо вовзарехь/йовзарехь",
"createacct-error": "ДӀаяздар кхуллуш гӀалат ду",
"createaccounterror": "Декъашхочун дӀаяздар кхолла йиш яц: $1",
"nocookiesnew": "Декъашхочун дӀаяздар ду амма системин чохь вац/яц. Декъашхой чу гӀош {{SITENAME}} «cookies» лелош ю. Хьа «cookies» лелаян магийна дац дехар до и магийтина керлачу цӀарца а паролаца а системин чугӀо.",
"accmailtitle": "Пароль дlаяхьийтина.",
"accmailtext": "Пароль декъашхочуьна [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дlаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гlирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
"newarticle": "(Kерла)",
- "newarticletext": "Хьо веана хьажоригци хlокху агlон тlе, хlара агlо хlинца йоцаш ю.\nНагахь иза кхолла лаахь, хlотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гlон агlон чу]).\nНагахь гlалат даьлла нисвелляхь кхузе, атта тlе тlаlа йе '''юха йоккхуриг''' хьай гlирса тlяхь.",
+ "newarticletext": "Хьо веана хьажоригци хӀокху агӀон тӀе, хӀара агӀо хӀинца йоцаш ю.\nНагахь иза кхолла лаахь, хӀотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гӀон агӀон чу]).\nНагахь гӀалат даьлла цахууш кхечехь кхузе, атта тӀе тӀаӀа йе '''юха йоккхуриг''' хьай гӀирса тӀехь.",
"anontalkpagetext": "----''ХӀара дийцаре агӀо къайлаха декъашхочуьна ю, хӀинца дӀаяздар доцу, я лелош воцуш/йоцуш.\nЦундела иза вовзийта/йовзийта лелош ду терахьца IP-адрес.\nИза терахь долу меттиг хила мега кхечу декъашхойчух терра.\nНагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дӀаяздар кхоллар]] я [[Special:UserLogin|системин чугӀо]],",
"noarticletext": "Хlокх хан чохь кху агlонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цlе]] кхечу яззамашкахь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лахар кхечу тептаршкахь],\nйа '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} кхолла ишта цlе йолу агlо]'''</span>.",
"noarticletext-nopermission": "ХӀокх хан чохь кху агӀонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цӀе]] кхечу яззамашкахь,\nйа <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лаха оцуьнах терадерг кхечу тептаршкахь].</span>",
"recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
"recentchanges-label-plusminus": "The page size changed by this number of bytes",
"recentchanges-legend-heading": "'''Legend:'''",
- "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+ "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+ "recentchanges-legend-minor": "{{int:recentchanges-label-minor}}",
+ "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
+ "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
"recentchanges-legend-plusminus": "(<em>±123</em>)",
"rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
"rclistfrom": "Show new changes starting from $2, $3",
"tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
"tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
"tog-ccmeonemails": "Recibir copias de los mensajes que envíe a otros usuarios",
- "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
+ "tog-diffonly": "No mostrar el contenido de la página bajo las diferencias",
"tog-showhiddencats": "Mostrar las categorías ocultas",
"tog-norollbackdiff": "Omitir la diferencia después de revertir",
"tog-useeditwarning": "Avisarme cuando abandone una página de edición con cambios sin guardar",
"category_header": "Páginas en la categoría «$1»",
"subcategories": "Subcategorías",
"category-media-header": "Archivos multimedia en la categoría «$1»",
- "category-empty": "''La categoría no contiene ninguna página o archivo.''",
+ "category-empty": "<em>Esta categoría no contiene ninguna página o archivo.</em>",
"hidden-categories": "{{PLURAL:$1|Categoría oculta|Categorías ocultas}}",
"hidden-category-category": "Categorías ocultas",
"category-subcat-count": "{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}",
"ns-specialprotected": "No se pueden editar las páginas especiales.",
"titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
"filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
- "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
- "invalidtitle-unknownnamespace": "Título no válido con número de espacio de nombres desconocido $1 y el texto \"$2\"",
+ "invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido",
+ "invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido",
"exception-nologin": "No has iniciado sesión",
"exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
"exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
"createacct-emailrequired": "Dirección de correo electrónico",
"createacct-emailoptional": "Dirección de correo electrónico (opcional)",
"createacct-email-ph": "Escribe tu dirección de correo electrónico",
- "createacct-another-email-ph": "Introduzca la dirección de correo electrónico",
+ "createacct-another-email-ph": "Escribe la dirección de correo electrónico",
"createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
"createacct-realname": "Nombre real (opcional)",
"createaccountreason": "Motivo:",
"explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
"yourtext": "Мәтініңіз",
"storedversion": "Сақталған нұсқасы",
- "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Unicode белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
- "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b беÑ\82Ñ\82Ñ\96Ò£ еÑ\80Ñ\82еÑ\80ек Ñ\82үзеÑ\82Ñ\83Ñ\96н өңдеп жаÑ\82Ñ\8bÑ\80Ñ\81Ñ\8bз.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз оÑ\81Ñ\8b Ñ\82үзеÑ\82Ñ\83ден кейінгі барлық өзгерістер жоғалады.",
+ "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Юникод белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
+ "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b беÑ\82Ñ\82Ñ\96Ò£ бұÑ\80Ñ\8bÒ£Ò\93Ñ\8b нұÑ\81Ò\9bаÑ\81Ñ\8bн өңдеÑ\83деÑ\81Ñ\96з.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз оÑ\81Ñ\8b нұÑ\81Ò\9bадан кейінгі барлық өзгерістер жоғалады.",
"yourdiff": "Айырмашылықтар",
- "copyrightwarning": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.\nЕгер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
- "copyrightwarning2": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестерді басқа үлескерлер өңдеуге, өзгертуге, не аластауға мүмкін.\nЕгер жазуыңыздың еркін өңделуін қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз (көбірек ақпарат үшін $1 қужатын қараңыз).\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
- "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: СаÒ\9bÑ\82амаÒ\9bÑ\88Ñ\8b болÒ\93ан мÓ\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ көлемÑ\96 {{PLURAL:$1|килобайÑ\82|$1 килобайÑ\82}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
- "readonlywarning": "'''ЕСКЕТУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін қолдану үшін мәтінді қойып алып және қойып, мәтін файлына сақтауңызға болады.''' \nӘкімшінің құлыптау себебі келесідей: $1",
- "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+ "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
+ "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!",
+ "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: СаÒ\9bÑ\82амаÒ\9bÑ\88Ñ\8b болÒ\93ан мÓ\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ көлемÑ\96 {{PLURAL:$1|бÑ\96Ñ\80 килобайÑ\82|$1 килобайÑ\82}} ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
+ "readonlywarning": "<strong>ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.</strong>\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алыпуңызға болады. \n\nАдминстратор оны құлыптау себебін келесідей түсіндіреді: $1",
+ "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде соңғы журнал жазбасы көрсетілген:",
"semiprotectedpagewarning": "<strong>Ескерту:</strong> Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
- "cascadeprotectedwarning": "<strong>Ескерту:</strong> Бұл бет қорғалған, енді тек әкімші құқықтары бар қатысушылар ғана бұны өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
- "titleprotectedwarning": "'''Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+ "cascadeprotectedwarning": "<strong>Ескерту:</strong> Бұл бет қорғалған, сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
+ "titleprotectedwarning": "</strong>Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
"templatesused": "Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
"templatesusedpreview": "Беттің қарап шығуында қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
"templatesusedsection": "Бұл бөлімде қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
"template-protected": "(қорғалған)",
"template-semiprotected": "(жартылай қорғалған)",
"hiddencategories": "Бұл бет {{PLURAL:$1|1 жасырын санаттың|$1 жасырын санаттың}} мүшесі:",
- "nocreatetext": "{{SITENAME}} жобасында жаңа бет бастауы шектелген.\nКері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.",
- "nocreate-loggedin": "Жаңа бет бастауға рұқсатыңыз жоқ.",
+ "nocreatetext": "{{SITENAME}} жобасында жаңа беттерді бастау мүмкіндігі шектелген.\nКері қайта аласыз және бар бетті өңдей аласыз немесе [[Special:UserLogin|кіріңіз не тіркеліңіз]].",
+ "nocreate-loggedin": "Жаңа беттерді бастауға рұқсатыңыз жоқ.",
"sectioneditnotsupported-title": "Бөлімдерді өңдеу қолдамайды",
- "sectioneditnotsupported-text": "Бұл бетте бөлімдерді өңдеуді қолдамайды.",
+ "sectioneditnotsupported-text": "Бұл бетте бөлім өңдеуін қолдамайды.",
"permissionserrors": "Рұқсат қатесі",
- "permissionserrorstext": "Ð\91ұнÑ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз жоÒ\9b, келеÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} бойÑ\8bнÑ\88а:",
- "permissionserrorstext-withaction": "$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:",
- "recreate-moveddeleted-warn": "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+ "permissionserrorstext": "Ð\9aелеÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} бойÑ\8bнÑ\88а бұнÑ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз жоÒ\9b:",
+ "permissionserrorstext-withaction": "Келесі {{PLURAL:$1|себеп|себептер}} бойынша $2 дегенге рұқсатыңыз жоқ:",
+ "recreate-moveddeleted-warn": "<strong>Назар аударыңыз: Алдында жойылған бетті қайта бастамақшысыз.</strong>\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы ыңғайлылық үшін көрсетілген:",
"moveddeleted-notice": "Бұл бет жойылған.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
"log-fulllog": "Толық журналды қарау",
- "edit-hook-aborted": "Түзету ілмек арқылы болдырмады.\nҚосымша түсіндірмелер көрсетілмеген.",
- "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 жаңаÑ\80Ñ\82Ñ\83 мүмкÑ\96н емеÑ\81.\nÐ\9cүмкÑ\96н, бұл беÑ\82 жойÑ\8bлÒ\93ан.",
+ "edit-hook-aborted": "Өңдеме ілмек арқылы болдырмады.\nҚандай да бір түсіндірме берілмеген.",
+ "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 жаңаÑ\80Ñ\82Ñ\83 мүмкÑ\96н емеÑ\81.\nÐ\91ұл беÑ\82 жойÑ\8bлÒ\93ан болÑ\83 мүмкÑ\96н.",
"edit-conflict": "Өңдемелер қақтығысы.",
"edit-no-change": "Өңдемеңіз мәтінге өзгеріс жасамағандықтан еленілмеді.",
+ "postedit-confirmation-created": "Бетті бастадыңыз.",
+ "postedit-confirmation-restored": "Бетті қалпына келтірдіңіз.",
"postedit-confirmation-saved": "Өңдемеңіз сақталды.",
- "edit-already-exists": "Ð\96аңа беÑ\82 жаÑ\81ау мүмкін емес.\nОл әлдеқашан бар.",
- "defaultmessagetext": "Әдепкі мәтіні",
+ "edit-already-exists": "Ð\96аңа беÑ\82 баÑ\81Ñ\82ау мүмкін емес.\nОл әлдеқашан бар.",
+ "defaultmessagetext": "Әдепкі хабарлама мәтіні",
"invalid-content-data": "Жарамсыз дерек мазмұны",
- "content-not-allowed-here": "\"$1\" контенті [[$2]] бетінде рұқсат етілмейді.",
- "editwarning-warning": "Ð\91ұл беÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\81аңÑ\8bз қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
+ "content-not-allowed-here": "«$1» мазмұны [[$2]] бетінде рұқсат етілмейді.",
+ "editwarning-warning": "Ð\91ұл беÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\8bп кеÑ\82Ñ\81еңÑ\96з қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
"editpage-notsupportedcontentformat-title": "Контент форматы қолдамайды",
- "content-model-wikitext": "Уикимәтін",
+ "content-model-wikitext": "уикимәтін",
"content-model-text": "қалыпты мәтін",
"content-model-javascript": "JavaScript",
"content-model-css": "CSS",
- "expensive-parserfunction-warning": "'''Ескерту:''' Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.\n\nБұл $2 {{PLURAL:$2|call|calls}} шамасынан кем болуы жөн, осы арада {{PLURAL:$1|қазір $1 call|қазір $1 calls}}.",
+ "expensive-parserfunction-warning": "<strong>Ескерту:</strong> Бұл бет тым көп шығыс алатын құрылым талдатқыш жетелер шақыруынан тұрады.\n\nБұл $2 {{PLURAL:$2|шақыру|шақырулар}} шамасынан кем болуы керек, осы арада {{PLURAL:$1|қазір $1 шақыру|қазір $1 шақыру}}.",
"expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
- "post-expand-template-inclusion-warning": "Ескерту: Үлгі кірістіру өлшемі тым үлкен.\nКейбір үлгілер кірістірілмейді.",
+ "post-expand-template-inclusion-warning": "<strong>Ескерту:</strong> Үлгі кірістіру мөлшері тым үлкен.\nКейбір үлгілер кірістірілмейді.",
"post-expand-template-inclusion-category": "Үлгі кірістірілген беттер өлшемі асып кетті",
"post-expand-template-argument-warning": "<strong>Ескерту:</strong> Бұл бетте тым көп ұлғайтылған өлшемі болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
"post-expand-template-argument-category": "Үлгі дәлелдерін қалдырып кеткен беттер",
- "undo-success": "Бұл өңдеме жоққа шығарылуы мүмкін. Талабыңызды құптап алдын ала төмендегі салыстыруды тексеріп шығыңыз да, өңдемені жоққа шығаруын бітіру үшін төмендегі өзгерістерді сақтаңыз.",
+ "parser-template-loop-warning": "Үлгі тұйығы кездесті: [[$1]]",
+ "undo-success": "Бұл өңдемені жоққа шығарымақшысыз. Алдымен алдын-ала төмендегі салыстыруды тексеріп шығыңыз да бетті сақтаңыз.",
"undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
- "undo-norev": "Бұл өңдеме жоққа шығарылмайды, себебі бұл жоқ немесе жойылған.",
+ "undo-norev": "Ð\91ұл өңдеме жоÒ\9bÒ\9bа Ñ\88Ñ\8bÒ\93аÑ\80Ñ\8bлмайдÑ\8b, Ñ\81ебебÑ\96 бұл беÑ\82 жоÒ\9b немеÑ\81е жойÑ\8bлÒ\93ан.",
"undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
- "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін [[Project:Жоққа шығару|жоққа шығарды]]",
+ "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін жоққа шығарды",
"undo-summary-username-hidden": "$1 нұсқасын жасырылған қатысушы жоққа шығарды",
- "cantcreateaccounttitle": "Ð\96аңа Ñ\82іркелгі жасалмады",
+ "cantcreateaccounttitle": "Тіркелгі жасалмады",
"cantcreateaccount-text": "Бұл IP мекенжайдан (<strong>$1</strong>) жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: <em>$2</em>",
- "viewpagelogs": "Бұл бет үшін журнал оқиғаларын қарау",
- "nohistory": "Мында бұл беттінің түзету тарихы жоқ.",
- "currentrev": "Ең соңғы түзету",
- "currentrev-asof": "$1 кезіндегі нұсқасы",
- "revisionasof": "$1 кезіндегі түзету",
- "revision-info": "$1 кезіндегі $2 істеген түзету",
- "previousrevision": "← Ескі түзетулер",
- "nextrevision": "Жаңа түзетулер →",
- "currentrevisionlink": "Ағымдағы түзетулер",
- "cur": "ағым.",
- "next": "кел.",
- "last": "соң.",
+ "cantcreateaccount-range-text": "'''$1''' ауқымындағы IP мекенжайдан сіздің IP мекенжайыңыз да кіреді ('''$4''') жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: ''$2'",
+ "viewpagelogs": "Бұл беттің журнал оқиғаларын қарау",
+ "nohistory": "Мында бұл беттің өңделу тарихы жоқ.",
+ "currentrev": "Ең соңғы нұсқа",
+ "currentrev-asof": "$1 кезіндегі ең соңғы нұсқасы",
+ "revisionasof": "$1 кезіндегі нұсқасы",
+ "revision-info": "$1 кезіндегі $2 істеген нұсқа",
+ "previousrevision": "← Ескілеу нұсқасы",
+ "nextrevision": "Жаңалау нұсқасы →",
+ "currentrevisionlink": "Ең соңғы нұсқасы",
+ "cur": "ағым",
+ "next": "келесі",
+ "last": "соңғы",
"page_first": "алғашқысына",
"page_last": "соңғысына",
- "histlegend": "Айырмасын бөлектеу: салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз, немесе төмендегі батырманы нұқыңыз.<br />\nШартты белгілер: (ағым.) = ағымдық нұсқамен айырмасы,\n(соң.) = алдыңғы нұсқамен айырмасы, ш = шағын өңдеме",
+ "histlegend": "Айырмасын таңдау: Салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз немесе төмендегі батырманы басыңыз.<br />\nШартты белгілер: <strong>({{int:cur}})</strong> = ең соңғы нұсқамен айырмасы,\n<strong>({{int:last}})</strong> = алдыңғы нұсқамен айырмасы, <strong>{{int:minoreditletter}}</strong> = шағын өңдеме",
"history-fieldset-title": "Тарихынан іздеу",
"history-show-deleted": "Жойылғанын ғана көрсету",
"histfirst": "Ең ескісіне",
"histlast": "Ең жаңасына",
"historysize": "({{PLURAL:$1|1 байт|$1 байт}})",
"historyempty": "(бос)",
- "history-feed-title": "Түзету тарихы",
- "history-feed-description": "Мына уикидегі бұл беттің түзету тарихы",
+ "history-feed-title": "Өңделу тарихы",
+ "history-feed-description": "Мына уикидегі бұл беттің өңделу тарихы",
"history-feed-item-nocomment": "$2 кезіндегі $1 деген",
- "history-feed-empty": "Сұратылған бет жоқ болды.\nОл мына уикиден жойылған, немесе атауы ауыстырылған.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
- "rev-deleted-comment": "(өңдеу түйіндемесі аласталды)",
- "rev-deleted-user": "(қатысушы аты аласталды)",
- "rev-deleted-event": "(әрекет журналы аласталды)",
- "rev-deleted-user-contribs": "[Қатысушы аты немесе IP-мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
- "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
- "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
- "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
- "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
+ "history-feed-empty": "Сұратылған бет жоқ.\nОл бұл уикиден жойылған немесе атауы өзгертілген.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
+ "rev-deleted-comment": "(өңдеу түйіндемесін аластады)",
+ "rev-deleted-user": "(қатысушы есімін аластады)",
+ "rev-deleted-event": "(әрекет журналын аластады)",
+ "rev-deleted-user-contribs": "[Қатысушы аты немесе IP мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
+ "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+ "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+ "rev-suppressed-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+ "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+ "rev-suppressed-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
+ "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
"rev-suppressed-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.",
- "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nегжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+ "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+ "rev-suppressed-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жасырылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+ "rev-deleted-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+ "rev-suppressed-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
"rev-delundel": "көрінісін өзгерту",
"rev-showdeleted": "көрсету",
- "revisiondelete": "ТүзеÑ\82Ñ\83леÑ\80дÑ\96 жою/жоюды болдырмау",
+ "revisiondelete": "Ð\9dÒ±Ñ\81Ò\9bалаÑ\80дÑ\8b жою/жоюды болдырмау",
"revdelete-nooldid-title": "Нысана түзету жарамсыз",
- "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,\nкелтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+ "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзету(лер)ін келтірілмепсіз,\nкелтірілген нұсқа жоқ немесе ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+ "revdelete-no-file": "Көрсетілген файл жоқ",
+ "revdelete-show-file-confirm": "$2 $3 кезіндегі «<nowiki>$1</nowiki>» файлының жойылған нұсқаларын көргіңіз келе ме?",
"revdelete-show-file-submit": "Иә",
+ "revdelete-selected-text": "[[:$2]] бетінің {{PLURAL:$1|таңдалған нұсқасы|таңдалған нұсқалары}} :",
+ "revdelete-selected-file": "[[:$2]] дегеннің {{PLURAL:$1|таңдалған файл нұсқасы|таңдалған файл нұсқалары}} :",
"logdelete-selected": "Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:",
"revdelete-legend": "Көрініс тиымдарын қою:",
"revdelete-hide-text": "Түзету мәтінін жасыр",
"importbadinterwiki": "인터위키 링크가 잘못되었습니다.",
"importsuccess": "가져오기 완료!",
"importnosources": "문서를 가져올 출처가 정의되지 않았고 문서 역사 올리기가 비활성화되었습니다.",
- "importnofile": "가져오기용 파일이 올려지지 않았습니다.",
+ "importnofile": "가져오기 파일이 올려지지 않았습니다.",
"importuploaderrorsize": "파일 올리기를 통한 가져오기에 실패했습니다.\n파일이 허용된 크기 제한보다 큽니다.",
"importuploaderrorpartial": "가져오기 파일을 올리는 데 실패하였습니다.\n파일이 부분적으로만 올려졌습니다.",
"importuploaderrortemp": "가져오기 파일을 올리는 데 실패했습니다.\n임시 폴더가 존재하지 않습니다.",
"wantedtemplates": "Gewënscht Schablounen",
"mostlinked": "Dacks verlinkt Säiten",
"mostlinkedcategories": "Dacks benotzt Kategorien",
- "mostlinkedtemplates": "Dacks benotzt Schablounen",
+ "mostlinkedtemplates": "Säiten déi am dacksten agebonn sinn",
"mostcategories": "Säite mat de meeschte Kategorien",
"mostimages": "Dacks benotzt Biller",
"mostinterwikis": "Säite mat de meeschten Interwikilinken",
"logdelete-text": "Verwijderde logboekregels zijn nog zichtbaar in de logboeken, maar delen van de inhoud zijn niet openbaar.",
"revdelete-text-others": "Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken via deze interface, tenzij er aanvullende beperkingen zijn ingesteld.",
"revdelete-confirm": "Bevestig dat u dit wilde doen, dat u de consequenties begrijpt en dat u dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].",
- "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, Burger Service Nummers, enzovoort.''",
+ "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, identificatienummer, enzovoort.''",
"revdelete-legend": "Zichtbaarheidsbeperkingen instellen",
"revdelete-hide-text": "Versietekst",
"revdelete-hide-image": "Bestandsinhoud verbergen",
"powersearch-togglelabel": "Selecteren:",
"powersearch-toggleall": "Alle",
"powersearch-togglenone": "Geen",
- "powersearch-remember": "Onthoud selectie voor toekomstige zoekopdrachten",
+ "powersearch-remember": "Selectie onthouden voor toekomstige zoekopdrachten",
"search-external": "Extern zoeken",
"searchdisabled": "Zoeken in {{SITENAME}} is niet mogelijk.\nU kunt gebruik maken van Google.\nDe gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.",
"search-error": "Er is een fout opgetreden tijdens het zoeken: $1",
"edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
"edit-conflict": "Conflito de edição.",
"edit-no-change": "A sua edição foi ignorada, uma vez que o texto não sofreu alterações.",
+ "postedit-confirmation-restored": "Esta página foi restaurada.",
"postedit-confirmation-saved": "Sua edição foi salva",
"edit-already-exists": "Não foi possível criar uma nova página.\nEla já existia.",
"defaultmessagetext": "Texto da mensagem padrão",
"parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
"language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
"node-count-exceeded-category": "Páginas em que o total de nós é excedido",
+ "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem de nós é ultrapassada.",
"node-count-exceeded-warning": "A página excedeu o total de nós",
"expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
+ "expansion-depth-exceeded-category-desc": "Esta é uma categoria para as páginas onde a profundidade de expansão é ultrapassada.",
"expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão",
"parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip",
"parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)",
"currentrev": "Revisão atual",
"currentrev-asof": "Edição atual tal como às $1",
"revisionasof": "Edição das $1",
- "revision-info": "Edição feita às $1 por $2",
+ "revision-info": "Revisão de $1 por {{GENDER:$6|$2}}$7",
"previousrevision": "← Edição anterior",
"nextrevision": "Versão posterior →",
"currentrevisionlink": "Revisão atual",
"powersearch-togglelabel": "Selecionar:",
"powersearch-toggleall": "Todos",
"powersearch-togglenone": "Nenhum",
+ "powersearch-remember": "Lembrar seleção para futuras pesquisas",
"search-external": "Pesquisa externa",
"searchdisabled": "A busca em {{SITENAME}} se encontra desativada.\nVocê poderá pesquisar através do Google enquanto isso.\nNote que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.",
"search-error": "Ocorreu um erro ao buscar por: $1",
"right-move": "Mover páginas",
"right-move-subpages": "Mover páginas com as suas subpáginas",
"right-move-rootuserpages": "Mover páginas raiz de usuários",
+ "right-move-categorypages": "Mover páginas de categorias",
"right-movefile": "Mover arquivos",
"right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
"right-upload": "Enviar arquivos",
"action-createpage": "criar páginas",
"action-createtalk": "criar páginas de discussão",
"action-createaccount": "criar esta conta de usuário",
+ "action-history": "Ver o histórico desta página",
"action-minoredit": "marcar esta edição como uma edição menor",
"action-move": "mover esta página",
"action-move-subpages": "mover esta página e suas subpáginas",
"action-move-rootuserpages": "mover páginas raiz de usuários",
+ "action-move-categorypages": "Mover páginas de categorias",
"action-movefile": "mover este arquivo",
"action-upload": "enviar este arquivo",
"action-reupload": "sobrescrever o arquivo existente",
"wantedtemplates": "Predefinições pedidas",
"mostlinked": "Páginas com mais afluentes",
"mostlinkedcategories": "Categorias com mais membros",
- "mostlinkedtemplates": "Predefinições com mais afluentes",
+ "mostlinkedtemplates": "Páginas com mais transclusões",
"mostcategories": "Páginas de conteúdo com mais categorias",
"mostimages": "Imagens com mais afluentes",
"mostinterwikis": "Páginas com mais interwikis",
"listgrouprights-removegroup-self": "Pode remover {{PLURAL:$2|grupo|grupos}} da própria conta: $1",
"listgrouprights-addgroup-self-all": "Pode adicionar todos os grupos à própria conta",
"listgrouprights-removegroup-self-all": "Pode remover todos os grupos da própria conta",
+ "listgrouprights-namespaceprotection-header": "Restrições de namespace",
+ "listgrouprights-namespaceprotection-namespace": "Namespace",
+ "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
"trackingcategories": "Monitorando categorias",
+ "trackingcategories-disabled": "A categoria está desabilitada",
"mailnologin": "Nenhum endereço de envio",
"mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
"emailuser": "Enviar-lhe um e-mail",
"watchnologin": "Não está autenticado",
"addwatch": "Adicionar às páginas vigiadas",
"addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nFuturas modificações em tal página e páginas de discussão relacionadas serão listadas lá.",
+ "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de páginas vigiadas.",
"removewatch": "Remover das páginas vigiadas",
"removedwatchtext": "A página \"[[:$1]]\" foi removida de sua [[Special:Watchlist|lista de páginas vigiadas]].",
+ "removedwatchtext-short": "A página \"$1\" foi removida de sua lista de páginas vigiadas.",
"watch": "Vigiar",
"watchthispage": "Vigiar esta página",
"unwatch": "Desinteressar-se",
"unwatchthispage": "Parar de vigiar esta página",
"notanarticle": "Não é uma página de conteúdo",
"notvisiblerev": "Edição eliminada",
- "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.",
+ "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
"wlheader-enotif": "A notificação por email encontra-se ativada.",
"wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
"wlnote2": "A seguir estão as mudanças nas últimas {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir de $2, $3.",
"contributions-title": "Contribuições {{GENDER:$1|do usuário|da usuária}} $1",
"mycontris": "Contribuições",
"contribsub2": "Para {{GENDER:$3|$1}} ($2)",
+ "contributions-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
"nocontribs": "Não foram encontradas mudanças com este critério.",
"uctop": "(atual)",
"month": "Mês (inclusive anteriores):",
"movenotallowedfile": "Você não possui permissão para mover arquivos.",
"cant-move-user-page": "Você não possui permissão de mover páginas principais de usuários.",
"cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
+ "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
+ "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
"newtitle": "Para novo título",
"move-watch": "Vigiar esta página",
"movepagebtn": "Mover página",
"newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
"newimages-legend": "Filtrar",
"newimages-label": "Nome de arquivo (ou parte dele):",
+ "newimages-showbots": "Mostrar uploads realizados por bots",
"noimages": "Nada para ver.",
"ilsubmit": "Pesquisar",
"bydate": "por data",
"watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
"watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
"watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+ "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
+ "watchlistedit-clear-titles": "Títulos:",
+ "watchlistedit-clear-submit": "Limpar a lista de páginas vigiadas (Esta ação é permanente!)",
+ "watchlistedit-clear-done": "Sua lista de páginas vigiadas foi limpa.",
+ "watchlistedit-clear-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+ "watchlistedit-too-many": "Há muitas páginas para exibir aqui.",
+ "watchlisttools-clear": "Limpar a lista de páginas vigiadas",
"watchlisttools-view": "Ver alterações relevantes",
"watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
"watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
"recentchanges-label-unpatrolled": "Tooltip for {{msg-mw|unpatrolledletter}}",
"recentchanges-label-plusminus": "Legend item for plus/minus.\n\nPreceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.",
"recentchanges-legend-heading": "Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]].\n{{Identical|Legend}}",
- "recentchanges-legend-newpage": "Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.",
+ "recentchanges-legend-newpage": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].",
+ "recentchanges-legend-minor": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].",
+ "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].",
+ "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].",
"recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
"rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
"rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
"wantedtemplates": "Formate dorite",
"mostlinked": "Cele mai căutate articole",
"mostlinkedcategories": "Cele mai căutate categorii",
- "mostlinkedtemplates": "Cele mai folosite formate",
+ "mostlinkedtemplates": "Cele mai transcluse pagini",
"mostcategories": "Articole cu cele mai multe categorii",
"mostimages": "Cele mai căutate imagini",
"mostinterwikis": "Pagini cu cele mai multe legături interwiki",
"august": "avgust-коловоз",
"september": "septembar-рујан",
"october": "oktobar-листопад",
- "november": "novembar",
+ "november": "студени-novembar",
"december": "decembar-просинац",
"january-gen": "januara-сијечња",
"february-gen": "februara-вељаче",
"august-gen": "augusta-коловоза",
"september-gen": "septembra-рујна",
"october-gen": "oktobra-листопада",
- "november-gen": "novembar",
+ "november-gen": "студенога-novembra",
"december-gen": "decembra-просинца",
"jan": "jan-сиј",
"feb": "feb-вељ",
"aug": "aug-кол",
"sep": "sep-руј",
"oct": "okt-лис",
- "nov": "nov",
+ "nov": "сту-nov",
"dec": "dec-про",
"january-date": "$1. januar",
"february-date": "$1. februar",
"mediawikipage": "Pogledaj stranicu s porukom",
"templatepage": "Pogledajte stranicu sa šablonom",
"viewhelppage": "Pogledajte stranicu za pomoć",
- "categorypage": "Pogledajte stranicu kategorije",
+ "categorypage": "Pogledaj stranicu kategorije",
"viewtalkpage": "Pogledajte raspravu",
"otherlanguages": "Drugi jezici / Други језици",
"redirectedfrom": "(Preusmjereno sa $1)",
"loginprompt": "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.",
"userlogin": "Prijavi se / Пријави се",
"userloginnocreate": "Prijavi se",
- "logout": "Odjavi se - Одјави се",
+ "logout": "Odjavi se / Одјави се",
"userlogout": "Odjavi se / Одјави се",
"notloggedin": "Niste prijavljeni",
"userlogin-noaccount": "Nemate račun?",
"previousrevision": "← Starija revizija",
"nextrevision": "Novija izmjena →",
"currentrevisionlink": "Trenutna verzija",
- "cur": "tren",
+ "cur": "tren - трен",
"next": "sljed - след",
"last": "preth - претх",
"page_first": "prva",
"difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
"difference-multipage": "(Razlika između stranica)",
"lineno": "Linija $1:",
- "compareselectedversions": "Uporedite označene verzije",
+ "compareselectedversions": "Uporedi označene verzije",
"showhideselectedversions": "Pokaži/sakrij odabrane verzije",
"editundo": "ukloni ovu izmjenu - уклони ову измену",
"diff-empty": "(nema razlike)",
"hide": "Sakrij",
"show": "prikaži / прикажи",
"minoreditletter": "m/м",
- "newpageletter": "N",
+ "newpageletter": "N/Н",
"boteditletter": "b",
"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
"rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
"deletepage": "Izbrišite stranicu",
"confirm": "Potvrdi / Потврди",
"excontent": "sadržaj je bio: '$1'",
- "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
+ "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
"exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
"delete-confirm": "Brisanje \"$1\"",
"delete-legend": "Obriši",
"rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
"sessionfailure-title": "Greška u sesiji",
"sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
- "protectlogpage": "Registar zaštite",
+ "protectlogpage": "Evidencija zaštite",
"protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
"protectedarticle": "\"[[$1]]\" zaštićeno",
"modifiedarticleprotection": "promijenjen nivo zaštite za \"[[$1]]\"",
"blocklist-nousertalk": "ne može uređivati vlastitu stranicu za razgovor",
"ipblocklist-empty": "Spisak blokiranja je prazan.",
"ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nisu blokirani.",
- "blocklink": "blokirajte",
+ "blocklink": "blokiraj",
"unblocklink": "Odblokiraj / Одблокирај",
"change-blocklink": "promijeni blokadu",
"contribslink": "doprinosi",
"blocklogpage": "Evidencija blokiranja",
"blocklog-showlog": "Ovaj korisnik je ranije blokiran. \nEvidencija blokiranja je prikazana ispod kao referenca:",
"blocklog-showsuppresslog": "Ovaj korisnik je ranije blokiran i sakriven. \nEvidencija sakrivanja je prikazana ispod kao referenca:",
- "blocklogentry": "blokiran [[$1]] s rokom: $2 $3",
+ "blocklogentry": "Blokiran \"[[$1]]\" sa vremenom isticanja od $2 $3",
"reblock-logentry": "promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3",
"blocklogtext": "Ovo je historija akcija blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene ovdje.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.",
"unblocklogentry": "Odblokiran / Одблокиран \"$1\"",
"movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
"movearticle": "Premjesti stranicu – Премјести страницу",
"moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
- "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
+ "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
"movenotallowed": "Nemate dopuštenje za premještanje stranica.",
"movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
"cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
"rcpatroldisabledtext": "Funkcija patroliranja nedavnih izmjena je trenutno isključena.",
"markedaspatrollederror": "Ne može se označiti kao patrolirano",
"markedaspatrollederrortext": "Morate naglasiti reviziju koju treba označiti kao patroliranu.",
- "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
+ "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene patroliranim.",
"markedaspatrollednotify": "Ova izmjena stranice $1 označena je kao patrolirana.",
"markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.",
"patrol-log-page": "Evidencija patroliranja",
"monthsall": "sve",
"confirmemail": "Potvrdite adresu e-pošte",
"confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
- "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž\nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
+ "confirmemail_text": "Ova wiki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. \nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
"confirmemail_pending": "Kod za potvrdu Vam je već poslan putem e-maila;\nako ste nedavno otvorili Vaš račun, trebali bi pričekati par minuta da poslana pošta stigne, prije nego što ponovno zahtijevate novi kod.",
"confirmemail_send": "Pošaljite kod za potvrdu",
"confirmemail_sent": "E-pošta za potvrđivanje poslata.",
"table_pager_limit_label": "Stavke po stranici:",
"table_pager_limit_submit": "Idi",
"table_pager_empty": "Bez rezultata",
- "autosumm-blank": "Uklanjanje sadržaja stranice",
+ "autosumm-blank": "Uklanjanje svog sadržaja stranice",
"autosumm-replace": "Zamjena stranice sa '$1'",
"autoredircomment": "Preusmjereno na [[$1]]",
"autosumm-new": "Napravljena stranica sa '$1'",
"tog-underline": "Подвлачење веза:",
"tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
"tog-hidepatrolled": "Сакриј патролиране измене у списку скорашњих измена",
- "tog-newpageshidepatrolled": "Сакриј прегледане странице са списка нових страница",
+ "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
"tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
"tog-usenewrc": "Промене у групи по страници у списку скорашњих измена и надгледаних страница",
"tog-numberheadings": "Аутоматски нумериши поднаслове",
"changeemail-submit": "Промени",
"changeemail-cancel": "Откажи",
"changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
- "resettokens": "Ресетује токене",
+ "resettokens": "Ресетовање токена",
"resettokens-no-tokens": "Нема токена за ресетовање.",
- "resettokens-legend": "Ресетује токене",
+ "resettokens-legend": "Ресетовање токена",
"resettokens-tokens": "Токени:",
"resettokens-token-label": "$1 (тренутна вредност: $2)",
"resettokens-watchlist-token": "Токен за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
"link_sample": "Наслов везе",
"link_tip": "Унутрашња веза",
"extlink_sample": "http://www.primer.com наслов везе",
- "extlink_tip": "Спољна веза (с предметком ''http://'')",
+ "extlink_tip": "Спољна веза (с предметком http://)",
"headline_sample": "Наслов",
"headline_tip": "Поднаслов",
"nowiki_sample": "Убаците необликован текст овде",
"tog-underline": "Podvlačenje veza:",
"tog-hideminor": "Sakrij manje izmene u spisku skorašnjih izmena",
"tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
- "tog-newpageshidepatrolled": "Sakrij pregledane stranice sa spiska novih stranica",
+ "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
"tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
"tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
"tog-numberheadings": "Automatski numeriši podnaslove",
"changeemail-submit": "Promeni",
"changeemail-cancel": "Otkaži",
"changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
- "resettokens": "Resetuje tokene",
+ "resettokens": "Resetovanje tokena",
"resettokens-no-tokens": "Nema tokena za resetovanje.",
- "resettokens-legend": "Resetuje tokene",
+ "resettokens-legend": "Resetovanje tokena",
"resettokens-tokens": "Tokeni:",
"resettokens-token-label": "$1 (trenutna vrednost: $2)",
"resettokens-watchlist-token": "Token za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
"link_sample": "Naslov veze",
"link_tip": "Unutrašnja veza",
"extlink_sample": "http://www.primer.com naslov veze",
- "extlink_tip": "Spoljna veza (s predmetkom ''http://'')",
+ "extlink_tip": "Spoljna veza (s predmetkom http://)",
"headline_sample": "Naslov",
"headline_tip": "Podnaslov",
"nowiki_sample": "Ubacite neoblikovan tekst ovde",
"wantedtemplates": "需要的模板",
"mostlinked": "最多链接页面",
"mostlinkedcategories": "最多链接分类",
- "mostlinkedtemplates": "最多链接模板",
+ "mostlinkedtemplates": "最多嵌入页面",
"mostcategories": "有最多分类的页面",
"mostimages": "最多链接文件",
"mostinterwikis": "有最多跨wiki的页面",
// set next check
if(nextExpire != Infinity){
- _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
+ _ttl_timeout = setTimeout(Math.min(_handleTTL, nextExpire - curtime, 0x7FFFFFFF));
}
// save changes
* @param {Mixed} value Value to set. This can be any value that is JSON
* compatible (Numbers, Strings, Objects etc.).
* @param {Object} [options] - possible options to use
- * @param {Number} [options.TTL] - optional TTL value
+ * @param {Number} [options.TTL] - optional TTL value, in milliseconds
* @return {Mixed} the used value
*/
set: function(key, value, options){
$this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
}
+ public static function provideAssert() {
+ $anon = new User();
+ $bot = new User();
+ $bot->setName( 'Bot' );
+ $bot->addToDatabase();
+ $bot->addGroup( 'bot' );
+ $user = new User();
+ $user->setName( 'User' );
+ $user->addToDatabase();
+ return array(
+ array( $anon, 'user', 'assertuserfailed' ),
+ array( $user, 'user', false ),
+ array( $user, 'bot', 'assertbotfailed' ),
+ array( $bot, 'user', false ),
+ array( $bot, 'bot', false ),
+ );
+ }
+
+ /**
+ * Tests the assert={user|bot} functionality
+ *
+ * @covers ApiMain::checkAsserts
+ * @dataProvider provideAssert
+ * @param User $user
+ * @param string $assert
+ * @param string|bool $error false if no error expected
+ */
+ public function testAssert( $user, $assert, $error ) {
+ try {
+ $this->doApiRequest( array(
+ 'action' => 'query',
+ 'assert' => $assert,
+ ), null, null, $user );
+ $this->assertFalse( $error ); // That no error was expected
+ } catch ( UsageException $e ) {
+ $this->assertEquals( $e->getCodeString(), $error );
+ }
+ }
+
}